load->model('DynamicModel', 'dm'); if (!$this->session->userdata('logged_in')) { redirect('auth'); } } public function index() { if($this->session->userdata('role') != 'Admin'){ show_error('Akses ditolak', 403); } $data = ["active_menu" => "neraca"]; $this->load->view('partials/header', $data); $this->load->view('laporan/neraca'); $this->load->view('partials/footer'); } // ========================= // LABA BERJALAN (PAKAI TANGGAL JOURNAL) // ========================= private function get_laba_berjalan($tanggal_dari = null, $tanggal_sampai = null) { $this->db->select(' accounts.tipe, COALESCE(SUM(jd.debit),0) as debit, COALESCE(SUM(jd.kredit),0) as kredit '); $this->db->from('accounts'); $this->db->join('journal_details jd','jd.account_id = accounts.id','LEFT'); $this->db->join('journals j','j.id = jd.journal_id','LEFT'); $this->db->where_in('accounts.tipe',['revenue','expense']); // ================= FILTER TANGGAL if($tanggal_dari){ $this->db->where('(j.tanggal >= "'.$tanggal_dari.'" OR j.tanggal IS NULL)'); } if($tanggal_sampai){ $this->db->where('(j.tanggal <= "'.$tanggal_sampai.'" OR j.tanggal IS NULL)'); } $rows = $this->db->get()->result(); $revenue = 0; $expense = 0; foreach ($rows as $r) { if ($r->tipe == 'revenue') { $revenue += ($r->kredit - $r->debit); } else { $expense += ($r->debit - $r->kredit); } } return $revenue - $expense; } // ========================= // AMBIL DATA NERACA (DIPAKAI BERSAMA OLEH get_data() & generatepdf()) // ========================= private function get_neraca_data($tanggal_dari = null, $tanggal_sampai = null) { $this->db->select(' a.id, a.kode_akun, a.nama_akun, a.tipe, a.posisi, a.is_kontra, COALESCE(SUM(jd.debit),0) as debit, COALESCE(SUM(jd.kredit),0) as kredit '); $this->db->from('accounts a'); $this->db->join('journal_details jd','jd.account_id = a.id','LEFT'); $this->db->join('journals j','j.id = jd.journal_id','LEFT'); $this->db->where('a.kategori','neraca'); // ================= FILTER TANGGAL if($tanggal_dari){ $this->db->where('(j.tanggal >= "'.$tanggal_dari.'" OR j.tanggal IS NULL)'); } if($tanggal_sampai){ $this->db->where('(j.tanggal <= "'.$tanggal_sampai.'" OR j.tanggal IS NULL)'); } $this->db->group_by('a.id'); $this->db->order_by('a.kode_akun','ASC'); $rows = $this->db->get()->result(); $activa = []; $pasiva = []; $total_activa = 0; $total_pasiva = 0; // ================= LABA BERJALAN $laba = $this->get_laba_berjalan($tanggal_dari, $tanggal_sampai); foreach ($rows as $r) { // ================= SALDO NORMAL if ($r->posisi == 'debit') { $saldo = $r->debit - $r->kredit; } else { $saldo = $r->kredit - $r->debit; } // ================= KONTRA ACCOUNT if ($r->is_kontra == 1) { $saldo = -$saldo; } // ================= LABA BERJALAN if ($r->kode_akun == '302') { $saldo = $laba; } // ================= ACTIVA if ($r->tipe == 'asset') { $activa[] = [ 'kode' => $r->kode_akun, 'nama' => $r->nama_akun, 'saldo' => $saldo ]; $total_activa += $saldo; } // ================= PASIVA if (in_array($r->tipe, ['liability','equity'])) { $pasiva[] = [ 'kode' => $r->kode_akun, 'nama' => $r->nama_akun, 'saldo' => $saldo ]; $total_pasiva += $saldo; } } return [ 'activa' => $activa, 'pasiva' => $pasiva, 'total_activa' => $total_activa, 'total_pasiva' => $total_pasiva, 'laba' => $laba, 'selisih' => $total_activa - $total_pasiva ]; } // ========================= // GET DATA NERACA (JSON, untuk AJAX/datatable) // ========================= public function get_data() { $tanggal_dari = $this->input->get('tanggal_dari'); $tanggal_sampai = $this->input->get('tanggal_sampai'); $data = $this->get_neraca_data($tanggal_dari, $tanggal_sampai); echo json_encode($data); } // ========================= // PDF GENERATE — NERACA // ========================= public function generatepdf($start = null, $end = null) { if ($this->session->userdata('role') != 'Admin') { show_error('Akses ditolak', 403); } if (ob_get_length()) { ob_end_clean(); } // Normalisasi parameter URL (0000-00-00 dianggap kosong) $tanggal_dari = (!empty($start) && $start != '0000-00-00') ? $start : null; $tanggal_sampai = (!empty($end) && $end != '0000-00-00') ? $end : null; // ============================================================= // AMBIL DATA // ============================================================= $neraca = $this->get_neraca_data($tanggal_dari, $tanggal_sampai); // ============================================================= // DATA PERUSAHAAN // ============================================================= $company = $this->db->get('pengaturan')->row(); // ============================================================= // BUILD STRING PERIODE // ============================================================= $periodeStr = (!empty($tanggal_dari) && !empty($tanggal_sampai)) ? 'Per Tanggal : ' . date('d-m-Y', strtotime($tanggal_sampai)) . ' (Sejak ' . date('d-m-Y', strtotime($tanggal_dari)) . ')' : ((!empty($tanggal_sampai)) ? 'Per Tanggal : ' . date('d-m-Y', strtotime($tanggal_sampai)) : 'Per Tanggal : ' . date('d-m-Y')); // ============================================================= // LOAD LIBRARY PDF // ============================================================= require_once(APPPATH . 'third_party/fpdf/fpdf.php'); require_once(APPPATH . 'libraries/PDF_Neraca.php'); $pdf = new PDF ('P', 'mm', 'A4'); $pdf->SetMargins(10, 10, 10); $pdf->setHeaderData( $company->nama_perusahaan, $company->alamat_perusahaan, FCPATH . 'uploads/img/logo-ljn.png' ); $pdf->setInfoLaporan($periodeStr); $pdf->AddPage('P', 'A4'); $pdf->NeracaTable( $neraca['activa'], $neraca['pasiva'], $neraca['total_activa'], $neraca['total_pasiva'] ); $pdf->NeracaRingkasan($neraca['laba'], $neraca['selisih']); $pdf->Pembuat('Tito Ngudiana', 'Finance Department'); // ============================================================= // OUTPUT // ============================================================= $filename = 'Neraca_' . date('YmdHis') . '.pdf'; $pdf->Output('D', $filename); exit; } }