Files
2026-09-17 00:51:53 +07:00

55 lines
20 KiB
PHP

<?php $csrfName=$this->security->get_csrf_token_name();$csrfHash=$this->security->get_csrf_hash(); ?>
<link rel="stylesheet" href="<?=base_url('assets/css/company-settings.css').'?v='.filemtime(FCPATH.'assets/css/company-settings.css')?>">
<section class="company-settings-workspace">
<header class="company-settings-hero"><div><span>ADMINISTRASI PERUSAHAAN</span><h3 class="text-light">Company Setting</h3><p>Kelola identitas dokumen, rekening pembayaran, perusahaan, dan mata uang dari satu tempat.</p></div><div class="active-company-chip"><small>Perusahaan aktif</small><b><?=html_escape($active_company->company_code.' - '.$active_company->name)?></b></div></header>
<?php if($this->session->flashdata('success')):?><div class="alert alert-success"><?=html_escape($this->session->flashdata('success'))?></div><?php endif?>
<?php if($this->session->flashdata('error')):?><div class="alert alert-danger"><?=html_escape($this->session->flashdata('error'))?></div><?php endif?>
<nav class="company-settings-nav nav nav-pills" role="tablist"><button class="nav-link active" data-bs-toggle="pill" data-bs-target="#companyIdentity" type="button"><i class="bi bi-building"></i> Identitas Perusahaan</button><button class="nav-link" data-bs-toggle="pill" data-bs-target="#companyBanks" type="button"><i class="bi bi-bank"></i> Rekening Invoice</button><button class="nav-link" data-bs-toggle="pill" data-bs-target="#companyCurrencies" type="button"><i class="bi bi-currency-exchange"></i> Currency & Kurs</button><button class="nav-link" data-bs-toggle="pill" data-bs-target="#companyList" type="button"><i class="bi bi-buildings"></i> Multi-company</button></nav>
<div class="tab-content">
<div class="tab-pane fade show active" id="companyIdentity"><div class="settings-card"><div class="settings-card-head"><div><h5>Identitas pada Dokumen</h5><p>Informasi ini digunakan pada header PDF Invoice dan dokumen perusahaan.</p></div></div><form method="post" enctype="multipart/form-data" action="<?=base_url('companies/update')?>"><input type="hidden" name="<?=$csrfName?>" value="<?=$csrfHash?>"><div class="identity-grid"><div class="logo-field"><div class="company-logo-preview"><?php if(!empty($active_company->logo_path)&&is_file(FCPATH.$active_company->logo_path)):?><img src="<?=base_url($active_company->logo_path)?>" alt="Logo"><?php else:?><i class="bi bi-image"></i><span>Belum ada logo</span><?php endif?></div><label class="form-label">Logo Perusahaan</label><input class="form-control" type="file" name="logo" accept=".jpg,.jpeg,.png,.webp"><small>Maksimal 2 MB. Gunakan logo rasio mendekati persegi.</small></div><div><div class="row g-3"><div class="col-md-6"><label class="form-label">Nama Perusahaan</label><input class="form-control" name="name" value="<?=html_escape($active_company->name)?>" required></div><div class="col-md-6"><label class="form-label">Nama Legal</label><input class="form-control" name="legal_name" value="<?=html_escape($active_company->legal_name)?>"></div><div class="col-md-4"><label class="form-label">Telepon</label><input class="form-control" name="phone" value="<?=html_escape($active_company->phone??'')?>"></div><div class="col-md-4"><label class="form-label">Email</label><input class="form-control" type="email" name="email" value="<?=html_escape($active_company->email??'')?>"></div><div class="col-md-4"><label class="form-label">Mata Uang Dasar</label><select class="form-select" name="base_currency" required><?php foreach($active_currencies as$c):?><option value="<?=$c->code?>" <?=$active_company->base_currency===$c->code?'selected':''?>><?=html_escape($c->code.' - '.$c->name)?></option><?php endforeach?></select></div><div class="col-md-6"><label class="form-label">NPWP</label><input class="form-control" name="tax_number" value="<?=html_escape($active_company->tax_number)?>"></div><div class="col-12"><label class="form-label">Alamat Perusahaan</label><textarea class="form-control" name="address" rows="3"><?=html_escape($active_company->address)?></textarea></div></div><div class="text-end mt-3"><button class="btn btn-primary"><i class="bi bi-save"></i> Simpan Company Setting</button></div></div></div></form></div></div>
<div class="tab-pane fade" id="companyBanks"><div class="settings-split"><div class="settings-card"><div class="settings-card-head"><div><h5>Tambah / Edit Rekening</h5><p>Rekening aktif otomatis ditampilkan pada PDF Invoice.</p></div></div><form id="bankAccountForm" method="post" action="<?=base_url('companies/save_bank')?>"><input type="hidden" name="<?=$csrfName?>" value="<?=$csrfHash?>"><input type="hidden" name="id" value=""><div class="mb-3"><label class="form-label">Nama Bank / Dompet</label><input class="form-control" name="bank_name" placeholder="Contoh: Bank BRI" required></div><div class="mb-3"><label class="form-label">Nomor Rekening</label><input class="form-control" name="account_number" required></div><div class="mb-3"><label class="form-label">Atas Nama</label><input class="form-control" name="account_holder" required></div><div class="row g-3"><div class="col-7"><label class="form-label">Mata Uang</label><select class="form-select" name="currency"><?php foreach($active_currencies as$c):?><option value="<?=$c->code?>"><?=$c->code?></option><?php endforeach?></select></div><div class="col-5 d-flex align-items-end"><label class="form-check mb-2"><input class="form-check-input" type="checkbox" name="is_primary" value="1"><span class="form-check-label">Rekening utama</span></label></div></div><div class="d-flex gap-2 mt-3"><button class="btn btn-primary"><i class="bi bi-save"></i> Simpan Rekening</button><button class="btn btn-light d-none" id="cancelBankEdit" type="button">Batal Edit</button></div></form></div><div class="settings-card"><div class="settings-card-head"><div><h5>Daftar Rekening Perusahaan</h5><p>Rekening nonaktif disimpan dalam histori, tetapi tidak tampil di PDF.</p></div></div><div class="table-responsive"><table class="table align-middle"><thead><tr><th>Bank / Rekening</th><th>Mata Uang</th><th>Status</th><th>Aksi</th></tr></thead><tbody><?php foreach($bank_accounts as$b):?><tr><td><b><?=html_escape($b->bank_name)?></b><small><?=html_escape($b->account_number.' · a.n. '.$b->account_holder)?></small></td><td><?=html_escape($b->currency)?></td><td><span class="badge <?=$b->is_active?'text-bg-success':'text-bg-secondary'?>"><?=$b->is_active?'Aktif':'Nonaktif'?></span><?=$b->is_primary?'<span class="badge text-bg-primary ms-1">Utama</span>':''?></td><td><div class="d-flex gap-1"><button class="btn btn-sm btn-outline-primary edit-bank" type="button" data-row='<?=html_escape(json_encode($b,JSON_HEX_APOS|JSON_HEX_QUOT))?>'>Edit</button><form method="post" action="<?=base_url('companies/toggle_bank/'.$b->id)?>"><input type="hidden" name="<?=$csrfName?>" value="<?=$csrfHash?>"><button class="btn btn-sm btn-outline-secondary"><?=$b->is_active?'Nonaktifkan':'Aktifkan'?></button></form></div></td></tr><?php endforeach?><?php if(!$bank_accounts):?><tr><td colspan="4" class="text-center text-muted py-4">Belum ada rekening perusahaan.</td></tr><?php endif?></tbody></table></div></div></div></div>
<div class="tab-pane fade" id="companyCurrencies"><div class="settings-split"><div class="settings-card"><div class="settings-card-head"><div><h5>Master Mata Uang</h5><p>Atur kode, simbol, desimal, dan status mata uang.</p></div></div><form id="currencyForm" method="post" action="<?=base_url('companies/save_currency')?>"><input type="hidden" name="<?=$csrfName?>" value="<?=$csrfHash?>"><div class="row g-3"><div class="col-4"><label class="form-label">Kode</label><input class="form-control text-uppercase" name="code" maxlength="3" required></div><div class="col-8"><label class="form-label">Nama</label><input class="form-control" name="name" required></div><div class="col-6"><label class="form-label">Simbol</label><input class="form-control" name="symbol"></div><div class="col-6"><label class="form-label">Jumlah Desimal</label><input class="form-control" type="number" min="0" max="6" name="decimal_places" value="2"></div><div class="col-12"><label class="form-check"><input class="form-check-input" type="checkbox" name="is_active" value="1" checked><span class="form-check-label">Mata uang aktif</span></label></div></div><div class="d-flex gap-2 mt-3"><button class="btn btn-primary">Simpan Mata Uang</button><button class="btn btn-light d-none" id="cancelCurrencyEdit" type="button">Batal Edit</button></div></form><hr><div class="currency-list"><?php foreach($currencies as$c):?><button class="currency-row edit-currency" type="button" data-row='<?=html_escape(json_encode($c,JSON_HEX_APOS|JSON_HEX_QUOT))?>'><span><b><?=$c->code?></b> <?=html_escape($c->name)?></span><span><?=html_escape($c->symbol?:'-')?> · <?=$c->decimal_places?> desimal · <?=$c->is_active?'Aktif':'Nonaktif'?></span></button><?php endforeach?></div></div><div class="settings-card"><div class="settings-card-head"><div><h5>Kurs Harian</h5><p>Simpan kurs untuk transaksi multi-currency perusahaan aktif.</p></div></div><form method="post" action="<?=base_url('companies/rate')?>"><input type="hidden" name="<?=$csrfName?>" value="<?=$csrfHash?>"><div class="row g-3"><div class="col-md-5"><label class="form-label">Tanggal</label><input class="form-control" type="date" name="date" value="<?=date('Y-m-d')?>" required></div><div class="col-md-3"><label class="form-label">Dari</label><select class="form-select" name="from_currency"><?php foreach($active_currencies as$c):?><option><?=$c->code?></option><?php endforeach?></select></div><div class="col-md-4"><label class="form-label">Ke</label><select class="form-select" name="to_currency"><?php foreach($active_currencies as$c):?><option><?=$c->code?></option><?php endforeach?></select></div><div class="col-md-6"><label class="form-label">Nilai Kurs</label><input class="form-control" type="number" min="0" step=".00000001" name="rate" required></div><div class="col-md-6"><label class="form-label">Sumber</label><input class="form-control" name="source"></div></div><button class="btn btn-success mt-3">Simpan Kurs</button></form><div class="table-responsive mt-4"><table class="table table-sm"><thead><tr><th>Tanggal</th><th>Mata Uang</th><th>Kurs</th><th>Sumber</th></tr></thead><tbody><?php foreach($rates as$r):?><tr><td><?=$r->rate_date?></td><td><?=$r->from_currency?> / <?=$r->to_currency?></td><td><?=number_format($r->rate,8,',','.')?></td><td><?=html_escape($r->source?:'-')?></td></tr><?php endforeach?></tbody></table></div></div></div></div>
<div class="tab-pane fade" id="companyList"><div class="settings-split"><div class="settings-card"><div class="settings-card-head"><div><h5>Perusahaan yang Dapat Diakses</h5><p>Pilih untuk mengganti konteks data aktif.</p></div></div><div class="company-switch-list"><?php foreach($companies as$c):?><a class="company-switch <?=$c->id==$active_company->id?'active':''?>" href="<?=base_url('companies/switch_company/'.$c->id)?>"><span><b><?=html_escape($c->name)?></b><small><?=html_escape($c->company_code.' · '.$c->base_currency)?></small></span><i class="bi bi-chevron-right"></i></a><?php endforeach?></div></div><div class="settings-card"><div class="settings-card-head"><div><h5>Tambah Perusahaan</h5><p>Membuat tenant perusahaan baru tanpa mengubah perusahaan aktif.</p></div></div><form method="post" action="<?=base_url('companies/save')?>"><input type="hidden" name="<?=$csrfName?>" value="<?=$csrfHash?>"><div class="row g-3"><div class="col-4"><label class="form-label">Kode</label><input class="form-control" name="code" required></div><div class="col-8"><label class="form-label">Nama</label><input class="form-control" name="name" required></div><div class="col-8"><label class="form-label">Nama Legal</label><input class="form-control" name="legal_name"></div><div class="col-4"><label class="form-label">Mata Uang</label><select class="form-select" name="base_currency"><?php foreach($active_currencies as$c):?><option><?=$c->code?></option><?php endforeach?></select></div><div class="col-6"><label class="form-label">Telepon</label><input class="form-control" name="phone"></div><div class="col-6"><label class="form-label">Email</label><input class="form-control" type="email" name="email"></div><div class="col-12"><label class="form-label">NPWP</label><input class="form-control" name="tax_number"></div><div class="col-12"><label class="form-label">Alamat</label><textarea class="form-control" name="address" rows="2"></textarea></div></div><button class="btn btn-primary mt-3">Tambah Perusahaan</button></form></div></div></div>
</div>
</section>
<script>
(function($){
function resetBank(){var f=document.getElementById('bankAccountForm');f.reset();f.elements.id.value='';$('#cancelBankEdit').addClass('d-none');}
$('.edit-bank').on('click',function(){var r=$(this).data('row'),f=document.getElementById('bankAccountForm');f.elements.id.value=r.id;f.elements.bank_name.value=r.bank_name;f.elements.account_number.value=r.account_number;f.elements.account_holder.value=r.account_holder;f.elements.currency.value=r.currency;f.elements.is_primary.checked=Number(r.is_primary)===1;$('#cancelBankEdit').removeClass('d-none');f.scrollIntoView({behavior:'smooth',block:'center'});});$('#cancelBankEdit').on('click',resetBank);
function resetCurrency(){var f=document.getElementById('currencyForm');f.reset();f.elements.code.readOnly=false;$('#cancelCurrencyEdit').addClass('d-none');}
$('.edit-currency').on('click',function(){var r=$(this).data('row'),f=document.getElementById('currencyForm');f.elements.code.value=r.code;f.elements.code.readOnly=true;f.elements.name.value=r.name;f.elements.symbol.value=r.symbol||'';f.elements.decimal_places.value=r.decimal_places;f.elements.is_active.checked=Number(r.is_active)===1;$('#cancelCurrencyEdit').removeClass('d-none');f.scrollIntoView({behavior:'smooth',block:'center'});});$('#cancelCurrencyEdit').on('click',resetCurrency);
})(jQuery);
</script>
<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('');
$(form).find('.row.g-3').first().before(
'<div class="mb-3"><label class="form-label">Jenis Produk / Jasa Bank</label><input class="form-control" name="product_name" placeholder="Contoh: BritAma Bisnis atau Deposito Berjangka" required></div>'+
'<div class="row g-3 mb-3"><div class="col-md-6"><label class="form-label">Jenis Rekening</label><select class="form-select" name="account_type" required><option value="savings">Tabungan</option><option value="deposit">Deposito</option></select></div><div class="col-md-6"><label class="form-label">Bunga Bank (%)</label><input class="form-control" type="number" min="0" step="0.0001" name="interest_rate" value="0"></div><div class="col-md-6"><label class="form-label">Tanggal Pembukaan</label><input class="form-control" type="date" name="opened_at" required></div><div class="col-md-6 maturity-field d-none"><label class="form-label">Tanggal Jatuh Tempo</label><input class="form-control" type="date" name="maturity_date"></div><div class="col-12"><label class="form-label">Akun COA Terhubung</label><select class="form-select select-search" name="gl_account_id" required>'+coaOptions+'</select><small class="text-muted">Gunakan akun Aktiva kas/bank yang menampung transaksi rekening ini.</small></div></div>'
);
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.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();}
})(jQuery);
</script>