Files
accounting_dev_v2/application/controllers/Generatebuku.php
T
2026-09-15 10:38:43 +07:00

152 lines
6.2 KiB
PHP

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Generatebuku extends MY_Controller
{
public function __construct()
{
parent::__construct();
$this->load->model('DynamicModel', 'dm');
}
// ----------------------------------------------------------------
// PDF GENERATE — BUKU BESAR
// ----------------------------------------------------------------
public function generatepdf($account_id, $start, $end)
{
if (!is_master_admin_user() && $this->session->userdata('role') != 'Admin') {
show_error('Akses ditolak', 403);
}
$startDate = DateTime::createFromFormat('Y-m-d', (string) $start);
$endDate = DateTime::createFromFormat('Y-m-d', (string) $end);
if (!$startDate || $startDate->format('Y-m-d') !== $start
|| !$endDate || $endDate->format('Y-m-d') !== $end || $end < $start) {
show_error('Periode Buku Besar tidak valid.', 422);
}
if (ob_get_length()) {
ob_end_clean();
}
// =============================================================
// AMBIL INFO AKUN
// =============================================================
$akun = null;
if (!empty($account_id)) {
$akun = $this->db->get_where('accounts', ['id' => (int) $account_id, 'company_id'=>(int)$this->companycontext->id()])->row();
}
if (!$akun) show_error('Akun Buku Besar tidak ditemukan pada perusahaan aktif.', 404);
$openingRow=$this->db->select('COALESCE(SUM(d.debit),0) debit,COALESCE(SUM(d.kredit),0) kredit',false)->from('journal_details d')->join('journals j','j.id=d.journal_id')->where(array('j.company_id'=>(int)$this->companycontext->id(),'d.account_id'=>(int)$account_id))->where_in('j.status',array('posted','reversed'))->where('j.tanggal <',$start)->get()->row();
$saldoAwal=in_array($akun->tipe,array('asset','expense'),true)?(float)$openingRow->debit-(float)$openingRow->kredit:(float)$openingRow->kredit-(float)$openingRow->debit;
// =============================================================
// QUERY DATA
// =============================================================
$this->db->select('
journals.tanggal,
journals.no_ref,
journals.keterangan,
journal_details.debit,
journal_details.kredit,
accounts.tipe
');
$this->db->from('journal_details');
$this->db->join('journals', 'journals.id = journal_details.journal_id');
$this->db->join('accounts', 'accounts.id = journal_details.account_id');
$this->db->where_in('journals.status', array('posted', 'reversed'));
$this->db->where('journals.company_id', (int)$this->companycontext->id());
if (!empty($account_id)) {
$this->db->where('journal_details.account_id', (int) $account_id);
}
if (!empty($start) && !empty($end)) {
$this->db->where('journals.tanggal >=', $start);
$this->db->where('journals.tanggal <=', $end);
}
$this->db->group_start();
$this->db->where('journal_details.debit >', 0);
$this->db->or_where('journal_details.kredit >', 0);
$this->db->group_end();
$this->db->order_by('journals.tanggal', 'ASC')->order_by('journals.id','ASC')->order_by('journal_details.id','ASC');
$rows = $this->db->get()->result();
// =============================================================
// HITUNG SALDO BERJALAN
// =============================================================
$saldo = $saldoAwal;
$result = [];
foreach ($rows as $r) {
if (in_array($r->tipe, ['asset', 'expense'])) {
$saldo += ($r->debit - $r->kredit);
} else {
$saldo += ($r->kredit - $r->debit);
}
$result[] = [
'tanggal' => $r->tanggal,
'no_ref' => $r->no_ref,
'keterangan' => $r->keterangan,
'debit' => $r->debit,
'kredit' => $r->kredit,
'saldo' => $saldo,
];
}
$total_debit = array_sum(array_column($result, 'debit'));
$total_kredit = array_sum(array_column($result, 'kredit'));
// =============================================================
// DATA PERUSAHAAN
// =============================================================
$company = $this->db->get_where('companies',array('id'=>(int)$this->companycontext->id()))->row();
// =============================================================
// BUILD STRING INFO LAPORAN
// =============================================================
$namaAkun = $akun
? $akun->kode_akun . ' - ' . $akun->nama_akun
: 'Semua Akun';
$periodeStr = (!empty($start) && !empty($end))
? 'Periode : ' . date('d-m-Y', strtotime($start)) . ' s/d ' . date('d-m-Y', strtotime($end))
: 'Periode : Semua Tanggal';
// =============================================================
// LOAD LIBRARY PDF
// =============================================================
require_once(APPPATH . 'third_party/fpdf/fpdf.php');
require_once(APPPATH . 'libraries/PDF_BukuBesar.php');
$pdf = new PDF ('P', 'mm', 'A4');
$pdf->SetMargins(10, 10, 10);
$pdf->setHeaderData(
$company->name,
$company->address,
!empty($company->logo_path) ? FCPATH.$company->logo_path : ''
);
$pdf->setInfoLaporan($namaAkun, $periodeStr);
$pdf->AddPage('P', 'A4');
$pdf->BukuBesarTable($result);
$pdf->BukuBesarTotal($saldoAwal, $total_debit, $total_kredit, $saldo);
$pdf->Pembuat('Tito Ngudiana', 'Finance Department');
// =============================================================
// OUTPUT
// =============================================================
$filename = 'Buku_Besar_' . date('YmdHis') . '.pdf';
$pdf->Output('D', $filename);
exit;
}
}