bank, laporan bank, budgeting badge

This commit is contained in:
Wian Drs
2026-09-17 00:51:53 +07:00
parent e4d6245a3d
commit 2a77402c60
11 changed files with 82 additions and 16 deletions
@@ -1,16 +1,16 @@
<?php
$reportNames=array('trial_balance'=>'Neraca Saldo','general_ledger'=>'Buku Besar','profit_loss'=>'Laporan Laba Rugi','balance_sheet'=>'Laporan Neraca','cash_flow'=>'Laporan Arus Kas','changes_equity'=>'Perubahan Ekuitas','journal_register'=>'Register Jurnal','account_detail'=>'Detail Transaksi Akun','actual_budget'=>'Aktual vs Budget','sales_summary'=>'Rekap Penjualan','sales_by_customer'=>'Penjualan per Customer','sales_by_item'=>'Penjualan per Barang','sales_by_barcode'=>'Penjualan per Barcode','running_invoices'=>'Invoice Berjalan Belum Final','sales_returns'=>'Retur Penjualan','revenue_recognition'=>'Pendapatan Diakui vs Ditangguhkan','unbilled_deliveries'=>'Surat Jalan Belum Ditagihkan','receivable_reconciliation'=>'Rekonsiliasi Piutang','purchase_returns'=>'Laporan Retur Pembelian','supplier_refunds'=>'Laporan Refund Supplier','outstanding_supplier_refunds'=>'Outstanding Refund Supplier','supplier_debit_notes'=>'Laporan Debit Note Supplier');
$reportNames=array('trial_balance'=>'Neraca Saldo','general_ledger'=>'Buku Besar','profit_loss'=>'Laporan Laba Rugi','balance_sheet'=>'Laporan Neraca','cash_flow'=>'Laporan Arus Kas','bank_account_balances'=>'Rekening Bank & Saldo','changes_equity'=>'Perubahan Ekuitas','journal_register'=>'Register Jurnal','account_detail'=>'Detail Transaksi Akun','actual_budget'=>'Aktual vs Budget','sales_summary'=>'Rekap Penjualan','sales_by_customer'=>'Penjualan per Customer','sales_by_item'=>'Penjualan per Barang','sales_by_barcode'=>'Penjualan per Barcode','running_invoices'=>'Invoice Berjalan Belum Final','sales_returns'=>'Retur Penjualan','revenue_recognition'=>'Pendapatan Diakui vs Ditangguhkan','unbilled_deliveries'=>'Surat Jalan Belum Ditagihkan','receivable_reconciliation'=>'Rekonsiliasi Piutang','purchase_returns'=>'Laporan Retur Pembelian','supplier_refunds'=>'Laporan Refund Supplier','outstanding_supplier_refunds'=>'Outstanding Refund Supplier','supplier_debit_notes'=>'Laporan Debit Note Supplier');
$money=function($value){return number_format((float)$value,2,',','.');};
$accountCode=function($value){return preg_replace('/(?:[\.,]0+)$/','',(string)$value);};
?>
<div class="container-fluid py-3 professional-report-page">
<div class="d-flex flex-wrap justify-content-between align-items-start gap-2">
<div><h4><?=html_escape(isset($reportNames[$report])?$reportNames[$report]:'Laporan Profesional')?></h4><small><?=html_escape($company->name)?> · <?=$report==='balance_sheet'?'posisi per '.$filters['to']:'periode '.$filters['from'].' s.d. '.$filters['to']?></small></div>
<div><h4><?=html_escape(isset($reportNames[$report])?$reportNames[$report]:'Laporan Profesional')?></h4><small><?=html_escape($company->name)?> · <?=in_array($report,array('balance_sheet','bank_account_balances'),true)?'posisi per '.$filters['to']:'periode '.$filters['from'].' s.d. '.$filters['to']?></small></div>
<div><a class="btn btn-success" href="<?=base_url('professionalreports/export/'.$report.'?'.http_build_query($filters))?>">Export Excel/CSV</a> <button class="btn btn-outline-dark" onclick="print()">PDF/Print</button></div>
</div>
<form class="card card-body my-3"><div class="row g-2">
<div class="col-md-3"><label class="form-label">Tipe Laporan</label><select class="form-select" name="report"><?php foreach($reportNames as$k=>$v):?><option value="<?=$k?>" <?=$report===$k?'selected':''?>><?=$v?></option><?php endforeach?></select></div>
<div class="col-md-2"><label class="form-label">Dari tanggal</label><input class="form-control" type="date" name="from" value="<?=$filters['from']?>"></div>
<?php if(!in_array($report,array('balance_sheet','bank_account_balances'),true)):?><div class="col-md-2"><label class="form-label">Dari tanggal</label><input class="form-control" type="date" name="from" value="<?=$filters['from']?>"></div><?php else:?><input type="hidden" name="from" value="1900-01-01"><?php endif?>
<div class="col-md-2"><label class="form-label">Sampai tanggal</label><input class="form-control" type="date" name="to" value="<?=$filters['to']?>"></div>
<div class="col-md-3"><label class="form-label">Akun</label><select class="form-select" name="account_id"><option value="">Semua akun</option><?php foreach($accounts as$a):?><option value="<?=$a->id?>" <?=$filters['account_id']==$a->id?'selected':''?>><?=html_escape($a->kode_akun.' '.$a->nama_akun)?></option><?php endforeach?></select></div>
<div class="col-md-2 d-flex align-items-end"><button class="btn btn-primary w-100">Tampilkan</button></div>
@@ -40,6 +40,15 @@ $accountCode=function($value){return preg_replace('/(?:[\.,]0+)$/','',(string)$v
<?php endforeach?>
</div>
<div class="card"><div class="card-header"><b>Detail Transaksi Pembentuk Arus Kas</b><small class="d-block text-muted">Saldo berjalan mencakup seluruh akun kas/bank yang dipilih.</small></div><div class="table-responsive"><table class="table table-sm align-middle mb-0"><thead><tr><th>Tanggal</th><th>Referensi</th><th>Keterangan</th><th>Akun</th><th>Aktivitas</th><th class="text-end">Kas Masuk</th><th class="text-end">Kas Keluar</th><th class="text-end">Saldo</th></tr></thead><tbody><?php foreach($rows as$r):?><tr><td><?=html_escape($r['tanggal'])?></td><td><a href="<?=base_url('jurnal?focus='.$r['journal_id'])?>"><?=html_escape($r['no_ref']?:'#'.$r['journal_id'])?></a></td><td><?=html_escape($r['keterangan'])?></td><td><?=html_escape($r['akun'])?></td><td><?=html_escape($r['aktivitas'])?></td><td class="text-end text-success"><?=$money($r['kas_masuk'])?></td><td class="text-end text-danger"><?=$money($r['kas_keluar'])?></td><td class="text-end fw-semibold"><?=$money($r['saldo_berjalan'])?></td></tr><?php endforeach?><?php if(!$rows):?><tr><td colspan="8" class="text-center text-muted py-4">Tidak ada transaksi kas pada periode ini.</td></tr><?php endif?></tbody><tfoot><tr><th colspan="5">Total Mutasi</th><th class="text-end"><?=$money($report_summary['cash_in']??0)?></th><th class="text-end"><?=$money($report_summary['cash_out']??0)?></th><th class="text-end"><?=$money($report_summary['closing_balance']??0)?></th></tr></tfoot></table></div></div>
<?php elseif($report==='bank_account_balances'):
$mapped=0;$unmapped=0;$uniqueBalances=array();foreach($rows as$r){if(empty($r['gl_account_id']))$unmapped++;else{$mapped++;$uniqueBalances[(int)$r['gl_account_id']]=(float)$r['closing_balance'];}}$totalBankBalance=array_sum($uniqueBalances);
?>
<div class="row g-2 mb-3">
<div class="col-md-4"><div class="card h-100"><div class="card-body"><small class="text-muted">Seluruh Rekening</small><strong class="d-block mt-1"><?=count($rows)?></strong><span class="small text-muted">Aktif maupun nonaktif</span></div></div></div>
<div class="col-md-4"><div class="card h-100"><div class="card-body"><small class="text-muted">Terhubung ke COA</small><strong class="d-block mt-1 text-success"><?=$mapped?></strong><span class="small text-muted"><?=$unmapped?> rekening belum terhubung</span></div></div></div>
<div class="col-md-4"><div class="card h-100"><div class="card-body"><small class="text-muted">Total Saldo COA Unik</small><strong class="d-block mt-1"><?=html_escape($company->base_currency?:'IDR')?> <?=$money($totalBankBalance)?></strong><span class="small text-muted">Tidak menggandakan COA yang dipakai bersama</span></div></div></div>
</div>
<div class="card"><div class="card-header"><b>Daftar Rekening dan Saldo Buku Besar</b><small class="d-block text-muted">Saldo berasal dari jurnal posted/reversed sampai <?=html_escape($filters['to'])?> dalam mata uang dasar perusahaan. Seluruh rekening tetap ditampilkan; pilihan PDF Invoice hanya bersifat informasi.</small></div><div class="table-responsive"><table class="table table-sm align-middle mb-0"><thead><tr><th>Bank / Rekening</th><th>Produk</th><th>Mata Uang</th><th>Akun COA</th><th>Status</th><th>PDF Invoice</th><th class="text-end">Saldo Akhir COA</th></tr></thead><tbody><?php foreach($rows as$r):?><tr><td><b><?=html_escape($r['bank_name'])?></b><small class="d-block text-muted"><?=html_escape($r['account_number'].' · a.n. '.$r['account_holder'])?></small></td><td><?=html_escape($r['account_type_label'])?><small class="d-block text-muted"><?=html_escape($r['product_name']?:'-')?></small></td><td><?=html_escape($r['currency'])?></td><td><?php if(!empty($r['gl_account_id'])):?><b><?=html_escape($accountCode($r['kode_akun']))?></b><small class="d-block text-muted"><?=html_escape($r['nama_akun'])?></small><?php if((int)$r['linked_account_count']>1):?><span class="badge bg-warning text-dark mt-1"><?=html_escape($r['mapping_status'])?></span><?php endif?><?php else:?><span class="text-warning">Belum terhubung</span><?php endif?></td><td><span class="badge <?=$r['is_active']?'bg-success':'bg-secondary'?>"><?=html_escape($r['account_status'])?></span><?=$r['is_primary']?'<span class="badge bg-primary ms-1">Utama</span>':''?></td><td><span class="badge <?=$r['show_on_invoice']?'bg-info text-dark':'bg-light text-dark'?>"><?=html_escape($r['invoice_status'])?></span></td><td class="text-end fw-bold"><?=html_escape($company->base_currency?:'IDR')?> <?=$money($r['closing_balance'])?></td></tr><?php endforeach?><?php if(!$rows):?><tr><td colspan="7" class="text-center text-muted py-4">Belum ada rekening perusahaan.</td></tr><?php endif?></tbody></table></div></div>
<?php elseif($report==='general_ledger'): ?>
<div class="card mb-3"><div class="card-header"><b>Ringkasan Saldo per Akun</b><small class="d-block text-muted">Saldo awal berasal dari seluruh jurnal sebelum periode, bukan dari pagination tampilan.</small></div><div class="table-responsive"><table class="table table-sm mb-0"><thead><tr><th>Akun</th><th class="text-end">Saldo Awal</th><th class="text-end">Total Debit</th><th class="text-end">Total Kredit</th><th class="text-end">Saldo Akhir</th></tr></thead><tbody><?php foreach($report_summary as$r):?><tr><td><?=html_escape($accountCode($r['kode_akun']).' - '.$r['nama_akun'])?></td><td class="text-end"><?=$money($r['saldo_awal'])?></td><td class="text-end"><?=$money($r['total_debit'])?></td><td class="text-end"><?=$money($r['total_kredit'])?></td><td class="text-end fw-bold"><?=$money($r['saldo_akhir'])?></td></tr><?php endforeach?><?php if(!$report_summary):?><tr><td colspan="5" class="text-center text-muted py-4">Tidak ada saldo atau mutasi akun.</td></tr><?php endif?></tbody></table></div></div>
<div class="card"><div class="card-header"><b>Rincian Buku Besar</b></div><div class="table-responsive"><table class="table table-sm align-middle mb-0"><thead><tr><th>Akun</th><th>Tanggal</th><th>Referensi</th><th>Keterangan</th><th class="text-end">Debit</th><th class="text-end">Kredit</th><th class="text-end">Saldo Berjalan</th></tr></thead><tbody><?php foreach($rows as$r):?><tr><td><?=html_escape($accountCode($r['kode_akun']).' - '.$r['nama_akun'])?></td><td><?=html_escape($r['tanggal'])?></td><td><a href="<?=base_url('jurnal?focus='.$r['journal_id'])?>"><?=html_escape($r['no_ref'])?></a></td><td><?=html_escape($r['keterangan'])?></td><td class="text-end"><?=$money($r['debit'])?></td><td class="text-end"><?=$money($r['kredit'])?></td><td class="text-end fw-semibold"><?=$money($r['saldo_berjalan'])?></td></tr><?php endforeach?><?php if(!$rows):?><tr><td colspan="7" class="text-center text-muted py-4">Tidak ada transaksi pada periode ini.</td></tr><?php endif?></tbody></table></div></div>