bank, laporan bank, budgeting badge
This commit is contained in:
@@ -18,7 +18,7 @@ $periodLabel=function($period)use($monthNames){$parts=explode('-',(string)$perio
|
||||
<?php if($active_tab==='list'):?>
|
||||
<section class="budget-card">
|
||||
<div class="budget-card-head"><div><h5>Daftar Budget</h5><p>Setiap kebutuhan dibuat sebagai jadwal tersendiri. Beberapa jadwal boleh menggunakan akun yang sama dan semuanya dijumlahkan.</p></div><?php if($can_export):?><div class="btn-group"><button type="button" class="btn btn-outline-danger budget-pdf" data-title="Daftar Budget" data-url="<?=base_url('budgets/export_list/pdf?'.http_build_query(array('list_account_id'=>$list_account_id)))?>"><i class="bi bi-file-earmark-pdf me-1"></i>PDF</button><a class="btn btn-outline-success" href="<?=base_url('budgets/export_list/excel?'.http_build_query(array('list_account_id'=>$list_account_id)))?>"><i class="bi bi-file-earmark-excel me-1"></i>Excel</a></div><?php endif?></div>
|
||||
<form class="budget-filter" method="get"><input type="hidden" name="tab" value="list"><div><label class="form-label">Filter Akun</label><select class="form-select" name="list_account_id"><option value="">Semua akun</option><?php foreach($accounts as$a):?><option value="<?=$a->id?>" <?=$list_account_id==$a->id?'selected':''?>><?=html_escape($a->kode_akun.' - '.$a->nama_akun)?></option><?php endforeach?></select></div><button class="btn btn-outline-primary"><i class="bi bi-funnel me-1"></i>Tampilkan</button><?php if($list_account_id):?><a href="<?=base_url('budgets?tab=list')?>" class="btn btn-light">Reset</a><?php endif?></form>
|
||||
<form class="budget-filter" method="get"><input type="hidden" name="tab" value="list"><div><label class="form-label">Filter Akun</label><select class="form-select" name="list_account_id"><option value="">Semua akun</option><?php foreach($accounts as$a):?><option value="<?=$a->id?>" <?=$list_account_id==$a->id?'selected':''?>><?=html_escape($a->kode_akun.' - '.$a->nama_akun)?></option><?php endforeach?></select></div><button class="btn btn-outline-primary"><i class="bi bi-funnel me-1"></i>Tampilkan</button><?php if($list_account_id):?><a href="<?=base_url('budgets?tab=list')?>" class="btn btn-light">Reset</a><?php endif?><div class="budget-filter-total"><span>Total Budget</span><strong>Rp <?=number_format($list_total_budget,2,',','.')?></strong></div></form>
|
||||
<div class="table-responsive"><table class="table align-middle mb-0"><thead><tr><th>Budget / Akun</th><th>Pola</th><th>Mulai / Bulan</th><th class="text-end">Nominal Budget</th><th>Pengingat</th><th>Keterangan</th><th>Diperbarui</th><th>Aksi</th></tr></thead><tbody>
|
||||
<?php foreach($entries as$entry):?><tr>
|
||||
<td><strong><?=html_escape($entry->title)?></strong><small class="d-block text-muted"><?=html_escape($entry->kode_akun.' - '.$entry->nama_akun.' · '.($accountTypes[$entry->tipe]??ucfirst($entry->tipe)))?></small></td>
|
||||
@@ -34,7 +34,7 @@ $periodLabel=function($period)use($monthNames){$parts=explode('-',(string)$perio
|
||||
<?php else:?>
|
||||
<section class="budget-card">
|
||||
<div class="budget-card-head"><div><h5>Budget Per Akun</h5><p>Hanya akun yang mempunyai budget yang ditampilkan. Budget berulang dihitung otomatis untuk setiap bulan dalam rentang.</p></div><?php if($can_export):?><div class="btn-group"><button type="button" class="btn btn-outline-danger budget-pdf" data-title="Budget Per Akun" data-url="<?=base_url('budgets/export_accounts/pdf?'.http_build_query($filters))?>"><i class="bi bi-file-earmark-pdf me-1"></i>PDF</button><a class="btn btn-outline-success" href="<?=base_url('budgets/export_accounts/excel?'.http_build_query($filters))?>"><i class="bi bi-file-earmark-excel me-1"></i>Excel</a></div><?php endif?></div>
|
||||
<form class="budget-filter budget-period-filter" method="get"><input type="hidden" name="tab" value="accounts"><div><label class="form-label">Dari Bulan</label><input type="month" class="form-control" name="from" value="<?=html_escape($filters['from'])?>" required></div><div><label class="form-label">Sampai Bulan</label><input type="month" class="form-control" name="to" value="<?=html_escape($filters['to'])?>" required></div><div><label class="form-label">Akun</label><select class="form-select" name="account_id"><option value="">Semua akun yang memiliki budget</option><?php foreach($budget_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><button class="btn btn-primary"><i class="bi bi-search me-1"></i>Tampilkan</button></form>
|
||||
<form class="budget-filter budget-period-filter" method="get"><input type="hidden" name="tab" value="accounts"><div class="budget-month-field"><label class="form-label">Dari Bulan</label><input type="month" class="form-control" name="from" value="<?=html_escape($filters['from'])?>" required></div><div class="budget-month-field"><label class="form-label">Sampai Bulan</label><input type="month" class="form-control" name="to" value="<?=html_escape($filters['to'])?>" required></div><div class="budget-account-field"><label class="form-label">Akun</label><select class="form-select" name="account_id"><option value="">Semua akun yang memiliki budget</option><?php foreach($budget_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><button class="btn btn-primary"><i class="bi bi-search me-1"></i>Tampilkan</button><div class="budget-filter-total"><span>Total Budget</span><strong>Rp <?=number_format($account_total_budget,2,',','.')?></strong></div></form>
|
||||
<div class="table-responsive"><table class="table align-middle mb-0"><thead><tr><th>Akun</th><th class="text-end">Akumulasi Budget</th><th class="text-end">Realisasi</th><th class="text-end">Komitmen PO</th><th class="text-end">Total Pemakaian</th><th class="text-end">Sisa</th><th class="text-end">%</th><th>Kondisi</th></tr></thead><tbody>
|
||||
<?php foreach($report_rows as$row):?><tr><td><strong><?=html_escape($row['kode_akun'].' - '.$row['nama_akun'])?></strong><small class="d-block text-muted"><?=html_escape($accountTypes[$row['tipe']]??ucfirst($row['tipe']))?></small></td><?php foreach(array('budget','actual','commitment','usage','remaining')as$key):?><td class="text-end <?=$key==='budget'?'fw-semibold':''?>">Rp <?=number_format($row[$key],2,',','.')?></td><?php endforeach?><td class="text-end"><?=number_format($row['percentage'],2,',','.')?>%</td><td><span class="badge bg-<?=$row['indicator']==='over'?'danger':($row['indicator']==='warning'?'warning text-dark':'success')?>"><?=$row['indicator']==='over'?'Melebihi':($row['indicator']==='warning'?'Mendekati Batas':'Aman')?></span></td></tr><?php endforeach?>
|
||||
<?php if(!$report_rows):?><tr><td colspan="8" class="empty-state"><i class="bi bi-bar-chart"></i><strong>Belum ada budget pada periode ini</strong><span>Buat budget berulang atau budget khusus bulan terlebih dahulu.</span></td></tr><?php endif?>
|
||||
@@ -53,9 +53,9 @@ $periodLabel=function($period)use($monthNames){$parts=explode('-',(string)$perio
|
||||
</div><div class="modal-footer"><button type="button" class="btn btn-light" data-bs-dismiss="modal">Batal</button><button class="btn btn-primary" id="saveBudget"><i class="bi bi-check2-circle me-1"></i>Simpan Budget</button></div></form></div></div>
|
||||
<div class="modal fade" id="budgetPdfModal" tabindex="-1"><div class="modal-dialog modal-xl modal-dialog-centered"><div class="modal-content budget-pdf-content"><div class="modal-header"><h5 class="modal-title">Pratinjau PDF Budget</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body p-0"><iframe title="Pratinjau PDF Budget"></iframe></div></div></div></div>
|
||||
<style>
|
||||
.budget-page{--budget-blue:#176bff}.budget-hero{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:18px}.budget-hero small{font-size:.7rem;letter-spacing:.15em;color:#758199}.budget-hero h4{margin:2px 0 3px}.budget-hero p,.budget-card-head p{margin:0;color:#69758a}.budget-section-nav{display:grid;grid-template-columns:repeat(2,minmax(180px,1fr));gap:8px;padding:8px;margin-bottom:16px;background:#fff;border:1px solid #e4e9f1;border-radius:14px}.budget-section-nav a{display:flex;align-items:center;justify-content:center;gap:9px;min-height:48px;padding:10px 14px;border-radius:9px;color:#526079;text-decoration:none;font-weight:600}.budget-section-nav a:hover{background:#f3f7ff;color:var(--budget-blue)}.budget-section-nav a.active{background:var(--budget-blue);color:#fff;box-shadow:0 5px 14px rgba(23,107,255,.2)}.budget-section-nav b{min-width:22px;padding:2px 6px;border-radius:20px;background:rgba(255,255,255,.22);font-size:.72rem;text-align:center}.budget-section-nav a:not(.active) b{background:#eef2f8}.budget-card{overflow:hidden;background:#fff;border:1px solid #e4e9f1;border-radius:14px;box-shadow:0 6px 22px rgba(22,34,55,.05)}.budget-card-head{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:17px 18px;border-bottom:1px solid #e8ecf2}.budget-card-head h5{margin:0 0 3px}.budget-filter{display:flex;align-items:end;gap:10px;padding:14px 18px;background:#fafbfd;border-bottom:1px solid #e8ecf2}.budget-filter>div{min-width:min(360px,100%)}.budget-period-filter{display:grid;grid-template-columns:180px 180px minmax(240px,1fr) auto}.budget-card .table th{padding:12px 14px;background:#f6f8fb;color:#59657a;font-size:.72rem;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap}.budget-card .table td{padding:13px 14px}.empty-state{text-align:center!important;padding:54px 20px!important;color:#768196}.empty-state i,.empty-state strong,.empty-state span{display:block}.empty-state i{margin-bottom:8px;font-size:1.8rem}.empty-state strong{color:#344054}.budget-type-options{display:grid;gap:8px}.budget-type-options label{display:flex;gap:10px;padding:12px;border:1px solid #dfe5ee;border-radius:10px;cursor:pointer}.budget-type-options label:has(input:checked){border-color:var(--budget-blue);background:#f2f7ff}.budget-type-options input{margin-top:3px}.budget-type-options span,.budget-type-options small{display:block}.budget-type-options small{margin-top:2px;color:#6f7b8f;font-weight:400}@media(max-width:767.98px){.budget-hero{align-items:flex-start}.budget-section-nav{display:flex;overflow:auto}.budget-section-nav a{flex:1;white-space:nowrap}.budget-filter,.budget-period-filter{display:grid;grid-template-columns:1fr}.budget-filter>div{min-width:0}.budget-card-head{align-items:flex-start}.budget-card .table td,.budget-card .table th{white-space:nowrap}.modal-dialog{margin:.5rem}}
|
||||
.budget-page{--budget-blue:#176bff}.budget-hero{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:18px}.budget-hero small{font-size:.7rem;letter-spacing:.15em;color:#758199}.budget-hero h4{margin:2px 0 3px}.budget-hero p,.budget-card-head p{margin:0;color:#69758a}.budget-section-nav{display:grid;grid-template-columns:repeat(2,minmax(180px,1fr));gap:8px;padding:8px;margin-bottom:16px;background:#fff;border:1px solid #e4e9f1;border-radius:14px}.budget-section-nav a{display:flex;align-items:center;justify-content:center;gap:9px;min-height:48px;padding:10px 14px;border-radius:9px;color:#526079;text-decoration:none;font-weight:600}.budget-section-nav a:hover{background:#f3f7ff;color:var(--budget-blue)}.budget-section-nav a.active{background:var(--budget-blue);color:#fff;box-shadow:0 5px 14px rgba(23,107,255,.2)}.budget-section-nav b{min-width:22px;padding:2px 6px;border-radius:20px;background:rgba(255,255,255,.22);font-size:.72rem;text-align:center}.budget-section-nav a:not(.active) b{background:#eef2f8}.budget-card{overflow:hidden;background:#fff;border:1px solid #e4e9f1;border-radius:14px;box-shadow:0 6px 22px rgba(22,34,55,.05)}.budget-card-head{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:17px 18px;border-bottom:1px solid #e8ecf2}.budget-card-head h5{margin:0 0 3px}.budget-filter{display:flex;align-items:end;gap:10px;padding:14px 18px;background:#fafbfd;border-bottom:1px solid #e8ecf2;flex-wrap:wrap}.budget-filter:not(.budget-period-filter)>div:not(.budget-filter-total){min-width:min(360px,100%)}.budget-period-filter .budget-month-field{flex:0 0 180px;min-width:180px}.budget-period-filter .budget-account-field{flex:0 1 320px;min-width:240px;max-width:360px}.budget-card .table th{padding:12px 14px;background:#f6f8fb;color:#59657a;font-size:.72rem;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap}.budget-card .table td{padding:13px 14px}.empty-state{text-align:center!important;padding:54px 20px!important;color:#768196}.empty-state i,.empty-state strong,.empty-state span{display:block}.empty-state i{margin-bottom:8px;font-size:1.8rem}.empty-state strong{color:#344054}.budget-type-options{display:grid;gap:8px}.budget-type-options label{display:flex;gap:10px;padding:12px;border:1px solid #dfe5ee;border-radius:10px;cursor:pointer}.budget-type-options label:has(input:checked){border-color:var(--budget-blue);background:#f2f7ff}.budget-type-options input{margin-top:3px}.budget-type-options span,.budget-type-options small{display:block}.budget-type-options small{margin-top:2px;color:#6f7b8f;font-weight:400}@media(max-width:767.98px){.budget-hero{align-items:flex-start}.budget-section-nav{display:flex;overflow:auto}.budget-section-nav a{flex:1;white-space:nowrap}.budget-filter,.budget-period-filter{display:grid;grid-template-columns:1fr}.budget-filter>div,.budget-period-filter .budget-month-field,.budget-period-filter .budget-account-field{width:100%;min-width:0;max-width:none}.budget-card-head{align-items:flex-start}.budget-card .table td,.budget-card .table th{white-space:nowrap}.modal-dialog{margin:.5rem}}
|
||||
.budget-reminder-alert{display:flex;align-items:flex-start;gap:12px;margin-bottom:16px;padding:14px 16px;border:1px solid #ffd89a;border-radius:13px;background:#fff8e8;color:#6c4a09}.reminder-icon{display:grid;place-items:center;width:38px;height:38px;flex:0 0 38px;border-radius:10px;background:#ffedc4;color:#e48300;font-size:1.1rem}.reminder-items{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}.reminder-items span{padding:4px 9px;border-radius:20px;background:#fff;border:1px solid #f2d79c;font-size:.78rem}.reminder-items span.overdue{border-color:#f2b8b8;background:#fff0f0;color:#b42318}.budget-reminder-option{padding:13px 14px;border:1px solid #dfe5ee;border-radius:10px;background:#fafbfd}
|
||||
.budget-pdf-content{height:min(90vh,900px)}.budget-pdf-content .modal-body{min-height:0}.budget-pdf-content iframe{width:100%;height:100%;border:0}.budget-card-head .btn-group{flex:0 0 auto}@media(max-width:575.98px){.budget-card-head{flex-direction:column}.budget-card-head .btn-group{width:100%}.budget-card-head .btn-group>*{flex:1}}
|
||||
.budget-filter-total{display:flex;align-items:center;justify-content:flex-end;gap:12px;min-width:0;margin-left:auto;align-self:center;white-space:nowrap}.budget-filter-total span{color:#69758a;font-size:.78rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.budget-filter-total strong{color:#172b4d;font-size:1.05rem}.budget-pdf-content{height:min(90vh,900px)}.budget-pdf-content .modal-body{min-height:0}.budget-pdf-content iframe{width:100%;height:100%;border:0}.budget-card-head .btn-group{flex:0 0 auto}@media(max-width:575.98px){.budget-card-head{flex-direction:column}.budget-card-head .btn-group{width:100%}.budget-card-head .btn-group>*{flex:1}.budget-filter-total{width:100%;margin-left:0;justify-content:space-between}}
|
||||
</style>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded',function(){
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
<script>
|
||||
(function($){
|
||||
var form=document.getElementById('bankAccountForm');if(!form)return;
|
||||
$('#companyBanks .settings-card-head p').eq(0).text('Pilih sendiri rekening aktif yang boleh ditampilkan pada PDF Invoice.');
|
||||
$('#companyBanks .settings-card-head p').eq(1).text('Seluruh rekening tetap tersimpan dan tetap muncul pada laporan, termasuk yang nonaktif.');
|
||||
$(form).find('input[name="is_primary"]').closest('.col-5').after('<div class="col-12"><label class="form-check mb-0"><input class="form-check-input" type="checkbox" name="show_on_invoice" value="1" checked><span class="form-check-label">Tampilkan rekening ini pada PDF Invoice</span></label><small class="d-block text-muted mt-1">Tidak memengaruhi pencatatan maupun Laporan Profesional.</small></div>');
|
||||
$('[data-bs-target="#companyBanks"]').html('<i class="bi bi-bank"></i> Akun Bank Perusahaan');
|
||||
var glAccounts=<?=json_encode(array_map(function($a){return array('id'=>$a->id,'text'=>$a->kode_akun.' - '.$a->nama_akun);},$bank_gl_accounts),JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)?>;
|
||||
var coaOptions='<option value="">Pilih akun COA</option>'+glAccounts.map(function(a){return '<option value="'+a.id+'">'+$('<div>').text(a.text).html()+'</option>';}).join('');
|
||||
@@ -38,11 +41,12 @@
|
||||
function accountTypeChanged(){var deposit=form.elements.account_type.value==='deposit';$(form).find('.maturity-field').toggleClass('d-none',!deposit);form.elements.maturity_date.required=deposit;if(!deposit)form.elements.maturity_date.value='';}
|
||||
$(form.elements.account_type).on('change',accountTypeChanged);accountTypeChanged();
|
||||
$('#cancelBankEdit').on('click',function(){$(form.elements.gl_account_id).val('').trigger('change');accountTypeChanged();});
|
||||
$('.edit-bank').on('click',function(){var r=$(this).data('row');form.elements.product_name.value=r.product_name||'';form.elements.account_type.value=r.account_type||'savings';form.elements.interest_rate.value=r.interest_rate||0;form.elements.opened_at.value=r.opened_at||'';form.elements.maturity_date.value=r.maturity_date||'';form.elements.gl_account_id.value=r.gl_account_id||'';$(form.elements.gl_account_id).trigger('change');accountTypeChanged();});
|
||||
$('.edit-bank').on('click',function(){var r=$(this).data('row');form.elements.product_name.value=r.product_name||'';form.elements.account_type.value=r.account_type||'savings';form.elements.interest_rate.value=r.interest_rate||0;form.elements.opened_at.value=r.opened_at||'';form.elements.maturity_date.value=r.maturity_date||'';form.elements.gl_account_id.value=r.gl_account_id||'';form.elements.show_on_invoice.checked=Number(r.show_on_invoice)===1;$(form.elements.gl_account_id).trigger('change');accountTypeChanged();});
|
||||
|
||||
var table=$('#companyBanks table').first(),head=table.find('thead tr');head.html('<th>Bank / Rekening</th><th>Produk</th><th>Mata Uang</th><th>Akun COA</th><th>Status</th><th>Aksi</th>');
|
||||
table.find('tbody tr').each(function(){var tr=$(this),button=tr.find('.edit-bank');if(!button.length){tr.children('td').attr('colspan',6);return;}var r=button.data('row'),cells=tr.children('td'),product=$('<td>').html('<b>'+(r.account_type==='deposit'?'Deposito':'Tabungan')+'</b><small>'+$('<div>').text(r.product_name||'-').html()+' · buka '+(r.opened_at||'-')+(r.maturity_date?' · jatuh tempo '+r.maturity_date:'')+(Number(r.interest_rate)>0?' · bunga '+Number(r.interest_rate).toLocaleString('id-ID')+'%':'')+'</small>'),coa=$('<td>').html(r.kode_akun?'<b>'+$('<div>').text(r.kode_akun).html()+'</b><small>'+$('<div>').text(r.nama_akun||'').html()+'</small>':'<span class="text-warning">Belum terhubung</span>');cells.eq(0).after(product);cells.eq(1).after(coa);tr.data('bankRow',r);});
|
||||
var filters=$('<div class="row g-2 mb-3 bank-report-filter"><div class="col-md-3"><input class="form-control" id="bankFilterName" placeholder="Cari nama bank"></div><div class="col-md-2"><select class="form-select" id="bankFilterType"><option value="">Semua jenis</option><option value="savings">Tabungan</option><option value="deposit">Deposito</option></select></div><div class="col-md-2"><select class="form-select" id="bankFilterStatus"><option value="">Semua status</option><option value="1">Aktif</option><option value="0">Nonaktif</option></select></div><div class="col-md-2"><input type="date" class="form-control" id="bankFilterFrom" title="Jatuh tempo dari"></div><div class="col-md-2"><input type="date" class="form-control" id="bankFilterTo" title="Jatuh tempo sampai"></div><div class="col-md-1"><a class="btn btn-success w-100" id="bankExport" href="<?=base_url('companies/bank_export')?>" title="Export CSV"><i class="bi bi-file-earmark-spreadsheet"></i></a></div></div>');table.before(filters);
|
||||
table.find('tbody tr').each(function(){var tr=$(this),r=tr.data('bankRow');if(!r)return;tr.children('td').eq(4).append(Number(r.show_on_invoice)===1?'<span class="badge text-bg-info ms-1">Tampil di Invoice</span>':'<span class="badge text-bg-light ms-1">Tidak di Invoice</span>');});
|
||||
function filterBanks(){var name=$('#bankFilterName').val().toLowerCase(),type=$('#bankFilterType').val(),status=$('#bankFilterStatus').val(),from=$('#bankFilterFrom').val(),to=$('#bankFilterTo').val();table.find('tbody tr').each(function(){var tr=$(this),r=tr.data('bankRow');if(!r)return;var match=(!name||String(r.bank_name||'').toLowerCase().includes(name))&&(!type||r.account_type===type)&&(status===''||String(Number(r.is_active))===status)&&(!from||(r.maturity_date&&r.maturity_date>=from))&&(!to||(r.maturity_date&&r.maturity_date<=to));tr.toggle(match);});$('#bankExport').attr('href','<?=base_url('companies/bank_export')?>?'+$.param({bank:$('#bankFilterName').val(),type:type,status:status,maturity_from:from,maturity_to:to}));}
|
||||
$('.bank-report-filter').on('input change','input,select',filterBanks);
|
||||
if(location.hash==='#companyBanks'){var trigger=document.querySelector('[data-bs-target="#companyBanks"]');if(trigger)bootstrap.Tab.getOrCreateInstance(trigger).show();}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user