42 lines
8.6 KiB
PHP
42 lines
8.6 KiB
PHP
<?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');
|
|
$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><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>
|
|
<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>
|
|
</div></form>
|
|
<?php if($report==='balance_sheet'):
|
|
$assets=array();$liabilities=array();$equities=array();$totalAssets=0;$totalLiabilities=0;$totalEquity=0;
|
|
foreach($rows as$r){if($r['tipe']==='asset'){$assets[]=$r;$totalAssets+=(float)$r['amount'];}elseif($r['tipe']==='liability'){$liabilities[]=$r;$totalLiabilities+=(float)$r['amount'];}elseif($r['tipe']==='equity'){$equities[]=$r;$totalEquity+=(float)$r['amount'];}}
|
|
$revenue=0;$expense=0;foreach($profit_loss_rows as$r){if($r['tipe']==='revenue')$revenue+=(float)$r['amount'];elseif($r['tipe']==='expense')$expense+=(float)$r['amount'];}$netProfit=$revenue-$expense;$totalPasiva=$totalLiabilities+$totalEquity+$netProfit;$difference=$totalAssets-$totalPasiva;$balanced=abs($difference)<0.01;
|
|
?>
|
|
<div class="alert <?=$balanced?'alert-success':'alert-danger'?> d-flex justify-content-between align-items-center"><b><?=$balanced?'NERACA BALANCE':'NERACA TIDAK BALANCE'?></b><span>Selisih: Rp <?=$money($difference)?></span></div>
|
|
<div class="row g-3 report-paired-cards">
|
|
<div class="col-lg-6"><div class="card h-100"><div class="card-header bg-primary text-white"><b>AKTIVA</b></div><div class="card-body p-0"><table class="table mb-0"><tbody><?php foreach($assets as$r):?><tr><td><?=html_escape($accountCode($r['kode_akun']).' · '.$r['nama_akun'])?></td><td class="text-end"><?=$money($r['amount'])?></td></tr><?php endforeach?></tbody><tfoot><tr class="table-primary"><th>TOTAL AKTIVA</th><th class="text-end">Rp <?=$money($totalAssets)?></th></tr></tfoot></table></div></div></div>
|
|
<div class="col-lg-6"><div class="card h-100"><div class="card-header bg-dark text-white"><b>PASIVA</b></div><div class="card-body p-0"><table class="table mb-0"><tbody><tr class="table-light"><th colspan="2">Liabilitas</th></tr><?php foreach($liabilities as$r):?><tr><td><?=html_escape($accountCode($r['kode_akun']).' · '.$r['nama_akun'])?></td><td class="text-end"><?=$money($r['amount'])?></td></tr><?php endforeach?><tr class="table-light"><th colspan="2">Ekuitas</th></tr><?php foreach($equities as$r):?><tr><td><?=html_escape($accountCode($r['kode_akun']).' · '.$r['nama_akun'])?></td><td class="text-end"><?=$money($r['amount'])?></td></tr><?php endforeach?><tr class="table-warning"><th>Laba Bersih Berjalan</th><th class="text-end">Rp <?=$money($netProfit)?></th></tr></tbody><tfoot><tr class="table-dark"><th>TOTAL PASIVA</th><th class="text-end">Rp <?=$money($totalPasiva)?></th></tr></tfoot></table></div></div></div>
|
|
</div>
|
|
<?php elseif($report==='profit_loss'):
|
|
$revenues=array();$expenses=array();$totalRevenue=0;$totalExpense=0;foreach($rows as$r){if($r['tipe']==='revenue'){$revenues[]=$r;$totalRevenue+=(float)$r['amount'];}elseif($r['tipe']==='expense'){$expenses[]=$r;$totalExpense+=(float)$r['amount'];}}$netProfit=$totalRevenue-$totalExpense;
|
|
?>
|
|
<div class="row g-3 report-paired-cards">
|
|
<div class="col-lg-6"><div class="card h-100"><div class="card-header bg-success text-white"><b>PENDAPATAN</b></div><div class="card-body p-0"><table class="table mb-0"><tbody><?php foreach($revenues as$r):?><tr><td><?=html_escape($accountCode($r['kode_akun']).' · '.$r['nama_akun'])?></td><td class="text-end"><?=$money($r['amount'])?></td></tr><?php endforeach?></tbody><tfoot><tr class="table-success"><th>TOTAL PENDAPATAN</th><th class="text-end">Rp <?=$money($totalRevenue)?></th></tr></tfoot></table></div></div></div>
|
|
<div class="col-lg-6"><div class="card h-100"><div class="card-header bg-danger text-white"><b>BEBAN</b></div><div class="card-body p-0"><table class="table mb-0"><tbody><?php foreach($expenses as$r):?><tr><td><?=html_escape($accountCode($r['kode_akun']).' · '.$r['nama_akun'])?></td><td class="text-end"><?=$money($r['amount'])?></td></tr><?php endforeach?></tbody><tfoot><tr class="table-danger"><th>TOTAL BEBAN</th><th class="text-end">Rp <?=$money($totalExpense)?></th></tr></tfoot></table></div></div></div>
|
|
</div>
|
|
<div class="card mt-3"><div class="card-body d-flex justify-content-between align-items-center"><h5 class="mb-0"><?=$netProfit>=0?'LABA BERSIH':'RUGI BERSIH'?></h5><h4 class="mb-0 <?=$netProfit>=0?'text-success':'text-danger'?>">Rp <?=$money(abs($netProfit))?></h4></div></div>
|
|
<?php else: ?>
|
|
<?php $visibleColumns=$rows?array_values(array_filter(array_keys($rows[0]),function($key){return$key!=='record_id';})):array();$documentTypes=array('return_no'=>'purchase_return','refund_no'=>'supplier_refund','debit_note_no'=>'supplier_debit_note'); ?>
|
|
<div class="card"><div class="table-responsive"><table class="table table-sm mb-0"><thead><?php if($rows):?><tr><?php foreach($visibleColumns as$h):?><th><?=html_escape(ucwords(str_replace('_',' ',$h)))?></th><?php endforeach?></tr><?php endif?></thead><tbody><?php foreach($rows as$r):?><tr><?php foreach($visibleColumns as$k):$v=$r[$k];?><td class="<?=is_numeric($v)&&!preg_match('/(^id$|_id$|kode_akun$)/',$k)?'text-end':''?>"><?php if($k==='journal_id'&&$v):?><a href="<?=base_url('jurnal/detail/'.$v)?>">#<?=$v?></a><?php elseif(isset($documentTypes[$k])&&!empty($r['record_id'])):?><a href="<?=base_url('purchases/returns?action=history&focus_type='.$documentTypes[$k].'&focus='.$r['record_id'])?>"><?=html_escape($v)?></a><?php elseif($k==='kode_akun'):?><?=html_escape($accountCode($v))?><?php elseif(is_numeric($v)&&!preg_match('/(^id$|_id$|kode_akun$)/',$k)):?><?=$money($v)?><?php else:?><?=html_escape($v===null?'-':$v)?><?php endif?></td><?php endforeach?></tr><?php endforeach?></tbody></table></div></div>
|
|
<?php endif; ?>
|
|
<div class="mt-3"><b>Subledger:</b> <a href="<?=base_url('receivables')?>">Aging Piutang</a> · <a href="<?=base_url('payables')?>">Aging Hutang</a> · <a href="<?=base_url('inventoryprofessional')?>">Persediaan</a> · <a href="<?=base_url('fixedassets')?>">Aset</a> · <a href="<?=base_url('hrpayroll')?>">Payroll</a> · <a href="<?=base_url('purchases/returns')?>">Retur & Refund</a></div>
|
|
</div>
|