Files
accounting_dev_v2/application/views/suppliers/index.php
T
2026-09-11 16:03:00 +07:00

13 lines
9.3 KiB
PHP

<?php $admin=$this->session->userdata('role')==='Admin';$canCreate=$admin||check_permission('purchases','can_create');$canUpdate=$admin||check_permission('purchases','can_update');$active=count(array_filter($rows,function($r){return(int)$r->is_active===1;}));?>
<div class="container-fluid py-3">
<div class="d-flex justify-content-between align-items-start gap-3 mb-3"><div><h4 class="mb-1">Master Supplier</h4><p class="text-muted mb-0">Identitas, pajak, kontak, termin, dan rekening supplier.</p></div><?php if($canCreate):?><button class="btn btn-primary" id="newSupplier"><i class="bi bi-plus-lg me-1"></i>Tambah Supplier</button><?php endif?></div>
<?php if($this->session->flashdata('success')):?><div class="alert alert-success"><?=html_escape($this->session->flashdata('success'))?></div><?php endif?>
<div class="row g-3 mb-3"><div class="col-6 col-md-3"><div class="card"><div class="card-body"><small class="text-muted">Total Supplier</small><h3 class="mb-0"><?=count($rows)?></h3></div></div></div><div class="col-6 col-md-3"><div class="card"><div class="card-body"><small class="text-muted">Supplier Aktif</small><h3 class="mb-0 text-success"><?=$active?></h3></div></div></div></div>
<div class="card"><div class="card-header bg-body d-flex justify-content-between align-items-center"><b>Daftar Supplier</b><select class="form-select form-select-sm w-auto" id="statusFilter"><option value="">Semua status</option><option>Aktif</option><option>Nonaktif</option></select></div><div class="table-responsive"><table class="table align-middle mb-0 responsive-detail-table"><thead><tr><th>Kode</th><th>Supplier</th><th>Kontak</th><th>Termin</th><th>Rekening</th><th>Status</th><th class="text-end">Aksi</th></tr></thead><tbody>
<?php foreach($rows as$r):$j=html_escape(json_encode($r,JSON_HEX_APOS|JSON_HEX_QUOT));?><tr data-status="<?=$r->is_active?'Aktif':'Nonaktif'?>"><td data-label="Kode"><b><?=html_escape($r->supplier_code)?></b></td><td data-label="Supplier"><b><?=html_escape($r->name)?></b><small class="d-block text-muted"><?=html_escape($r->tax_number?:'Tanpa NPWP')?></small></td><td data-label="Kontak"><?=html_escape($r->contact_person?:'-')?><small class="d-block text-muted"><?=html_escape($r->phone?:'-')?></small></td><td data-label="Termin"><?=(int)$r->payment_term_days?> hari</td><td data-label="Rekening"><?=html_escape($r->bank_name?:'-')?><small class="d-block text-muted"><?=html_escape($r->bank_account_no?:'-')?></small></td><td data-label="Status"><span class="badge bg-<?=$r->is_active?'success':'secondary'?>"><?=$r->is_active?'Aktif':'Nonaktif'?></span></td><td data-label="Aksi" class="text-end text-nowrap"><button class="btn btn-sm btn-outline-info detail-supplier" data-row="<?=$j?>"><i class="bi bi-eye"></i> Detail</button><?php if($canUpdate):?> <button class="btn btn-sm btn-outline-primary edit-supplier" data-row="<?=$j?>"><i class="bi bi-pencil"></i> Edit</button> <form method="post" class="d-inline status-form" action="<?=base_url('suppliers/update_status/'.$r->id)?>"><input type="hidden" name="<?=$this->security->get_csrf_token_name()?>" value="<?=$this->security->get_csrf_hash()?>"><button class="btn btn-sm btn-outline-<?=$r->is_active?'warning':'success'?>"><?=$r->is_active?'Nonaktifkan':'Aktifkan'?></button></form><?php endif?></td></tr><?php endforeach?>
</tbody></table></div></div>
</div>
<div class="modal fade" id="supplierFormModal" tabindex="-1"><div class="modal-dialog modal-dialog-centered modal-lg"><div class="modal-content"><form method="post" id="supplierForm"><div class="modal-header"><h5 class="modal-title">Tambah Supplier</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body"><input type="hidden" name="<?=$this->security->get_csrf_token_name()?>" value="<?=$this->security->get_csrf_hash()?>"><div class="row g-3"><div class="col-md-4"><label class="form-label">Kode Supplier *</label><input class="form-control text-uppercase" name="supplier_code" maxlength="40" required></div><div class="col-md-8"><label class="form-label">Nama Supplier/Toko *</label><input class="form-control" name="name" maxlength="150" required></div><div class="col-md-6"><label class="form-label">NPWP/Nomor Pajak</label><input class="form-control" name="tax_number"></div><div class="col-md-6"><label class="form-label">Termin Pembayaran</label><div class="input-group"><input class="form-control" type="number" name="payment_term_days" min="0" value="30"><span class="input-group-text">hari</span></div></div><div class="col-12"><label class="form-label">Alamat</label><textarea class="form-control" name="address" rows="2"></textarea></div><div class="col-md-4"><label class="form-label">Nama Kontak</label><input class="form-control" name="contact_person"></div><div class="col-md-4"><label class="form-label">Telepon/WhatsApp</label><input class="form-control" name="phone" inputmode="tel"></div><div class="col-md-4"><label class="form-label">Email</label><input class="form-control" type="email" name="email"></div><div class="col-12"><hr><h6>Rekening Pembayaran</h6></div><div class="col-md-4"><label class="form-label">Nama Bank</label><input class="form-control" name="bank_name"></div><div class="col-md-4"><label class="form-label">Nomor Rekening</label><input class="form-control" name="bank_account_no"></div><div class="col-md-4"><label class="form-label">Nama Pemilik</label><input class="form-control" name="bank_account_name"></div><div class="col-12 opening"><hr><h6>Saldo Awal Hutang</h6><div class="alert alert-warning small">Khusus migrasi awal. Setelah tersimpan, koreksi harus melalui transaksi accounting/reversal.</div></div><div class="col-md-6 opening"><label class="form-label">Saldo Awal</label><input class="form-control format-rupiah" name="opening_balance" value="0"></div><div class="col-md-6 opening"><label class="form-label">Tanggal Saldo Awal</label><input class="form-control" type="date" name="opening_balance_date"></div><div class="col-12"><div class="form-check form-switch"><input class="form-check-input" type="checkbox" name="is_active" value="1" id="supplierActive" checked><label class="form-check-label" for="supplierActive">Aktif dan dapat dipilih pada transaksi baru</label></div></div></div></div><div class="modal-footer"><button type="button" class="btn btn-light" data-bs-dismiss="modal">Batal</button><button class="btn btn-primary">Simpan Supplier</button></div></form></div></div></div>
<div class="modal fade" id="supplierDetailModal" tabindex="-1"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="modal-header"><h5 class="modal-title">Detail Supplier</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body" id="supplierDetail"></div></div></div></div>
<script>document.addEventListener('DOMContentLoaded',function(){const f=document.getElementById('supplierForm'),fm=bootstrap.Modal.getOrCreateInstance(document.getElementById('supplierFormModal')),esc=v=>$('<div>').text(v||'-').html();function open(s){f.reset();f.action=s?'<?=base_url('suppliers/update/')?>'+s.id:'<?=base_url('suppliers/save')?>';f.querySelector('.modal-title').textContent=s?'Edit Supplier':'Tambah Supplier';f.querySelectorAll('.opening').forEach(x=>x.classList.toggle('d-none',!!s));if(s)Object.keys(s).forEach(k=>{let x=f.elements[k];if(!x)return;x.type==='checkbox'?x.checked=Number(s[k])===1:x.value=s[k]??'';});else f.elements.is_active.checked=true;fm.show()}document.getElementById('newSupplier')?.addEventListener('click',()=>open());document.querySelectorAll('.edit-supplier').forEach(b=>b.onclick=()=>open(JSON.parse(b.dataset.row)));document.querySelectorAll('.detail-supplier').forEach(b=>b.onclick=()=>{let s=JSON.parse(b.dataset.row);document.getElementById('supplierDetail').innerHTML='<h5>'+esc(s.supplier_code+' - '+s.name)+'</h5><span class="badge bg-'+(Number(s.is_active)?'success':'secondary')+'">'+(Number(s.is_active)?'Aktif':'Nonaktif')+'</span><hr><dl class="row mb-0"><dt class="col-5">NPWP/Pajak</dt><dd class="col-7">'+esc(s.tax_number)+'</dd><dt class="col-5">Alamat</dt><dd class="col-7">'+esc(s.address)+'</dd><dt class="col-5">Kontak</dt><dd class="col-7">'+esc(s.contact_person)+'<br>'+esc(s.phone)+'<br>'+esc(s.email)+'</dd><dt class="col-5">Termin</dt><dd class="col-7">'+Number(s.payment_term_days||0)+' hari</dd><dt class="col-5">Rekening</dt><dd class="col-7">'+esc(s.bank_name)+'<br>'+esc(s.bank_account_no)+'<br>a.n. '+esc(s.bank_account_name)+'</dd><dt class="col-5">Saldo awal</dt><dd class="col-7">Rp '+Number(s.opening_balance||0).toLocaleString('id-ID',{minimumFractionDigits:2})+'</dd></dl>';bootstrap.Modal.getOrCreateInstance(document.getElementById('supplierDetailModal')).show()});document.querySelectorAll('.status-form').forEach(x=>x.onsubmit=function(e){e.preventDefault();let on=this.querySelector('button').textContent.trim()==='Aktifkan';Swal.fire({icon:'question',title:on?'Aktifkan supplier?':'Nonaktifkan supplier?',text:on?'Supplier dapat dipilih kembali pada transaksi baru.':'Histori tetap aman, tetapi supplier tidak dapat dipilih pada transaksi baru.',showCancelButton:true,confirmButtonText:on?'Ya, aktifkan':'Ya, nonaktifkan',cancelButtonText:'Batal'}).then(r=>{if(r.isConfirmed)this.submit()})});document.getElementById('statusFilter').onchange=function(){document.querySelectorAll('tbody tr[data-status]').forEach(r=>r.classList.toggle('d-none',this.value&&r.dataset.status!==this.value))}});</script>