Files
2026-09-15 10:38:43 +07:00

23 lines
5.8 KiB
PHP

<?php $inventory_title='Ringkasan Persediaan';$inventory_subtitle='Pekerjaan gudang, nilai stok, dan pengecualian yang perlu ditangani.';$this->load->view('inventory_professional/_module_nav',get_defined_vars());?>
<div class="row g-3 inventory-metrics">
<?php foreach(array(
array('Barang Aktif',$summary->active_items,'bi-box-seam','primary'),array('Perlu Diaktifkan',$summary->pending_items,'bi-hourglass-split','warning'),
array('Nilai Persediaan','Rp '.number_format($summary->inventory_value,2,',','.'),'bi-cash-stack','success'),array('Perlu Reorder',$summary->reorder_items,'bi-exclamation-triangle','danger'),
array('Dokumen Terbuka',$summary->open_documents,'bi-file-earmark-text','info'),array('Reservasi Aktif',$summary->open_reservations,'bi-bookmark-check','secondary')
)as$m):?><div class="col-6 col-xl-2"><div class="metric-card"><span class="metric-icon text-<?=$m[3]?>"><i class="bi <?=$m[2]?>"></i></span><strong><?=$m[1]?></strong><small><?=$m[0]?></small></div></div><?php endforeach?>
</div>
<div class="row g-3 mt-1">
<div class="col-xl-6"><section class="inventory-card h-100"><div class="inventory-card-head"><div><h5>Pekerjaan Gudang</h5><p>Barang yang sudah diterima tetapi belum siap digunakan atau dijual.</p></div><a href="<?=base_url('items/draft_items')?>" class="btn btn-sm btn-outline-primary">Buka Barang Pending</a></div>
<?php if(!$action_items):?><div class="inventory-empty"><i class="bi bi-check-circle"></i><strong>Tidak ada barang pending</strong><span>Semua penerimaan sudah ditangani.</span></div><?php else:?><div class="inventory-list"><?php foreach($action_items as$i):?><a href="<?=base_url('items/draft_items?focus='.$i->id)?>"><span class="item-avatar"><i class="bi bi-box"></i></span><span class="flex-grow-1"><strong><?=html_escape($i->kode_detail.' - '.$i->nama_barang)?></strong><small><?=number_format($i->ready_barcodes,0,',','.')?> siap dari <?=number_format($i->pending_barcodes,0,',','.')?> barcode pending</small></span><i class="bi bi-chevron-right"></i></a><?php endforeach?></div><?php endif?>
</section></div>
<div class="col-xl-6"><section class="inventory-card h-100" id="scanner"><div class="inventory-card-head"><div><h5>Scan Barcode / Serial</h5><p>Lihat posisi, status, saldo, dan riwayat unit.</p></div></div><div class="p-3"><div class="input-group input-group-lg"><span class="input-group-text"><i class="bi bi-upc-scan"></i></span><input id="scanCode" class="form-control" placeholder="Scan atau ketik kode"><button id="scanButton" class="btn btn-primary">Periksa</button></div><div id="scanResult" class="scan-result mt-3"><div class="inventory-empty py-4"><i class="bi bi-qr-code-scan"></i><span>Hasil scan tampil di sini.</span></div></div></div></section></div>
</div>
<section class="inventory-card mt-3"><div class="inventory-card-head"><div><h5>Dokumen Mutasi Terbaru</h5><p>Jejak dokumen stok dari seluruh gudang.</p></div><a href="<?=base_url('inventoryprofessional/operations')?>" class="btn btn-sm btn-outline-primary">Lihat Semua</a></div><div class="table-responsive"><table class="table align-middle mb-0"><thead><tr><th>Dokumen</th><th>Jenis</th><th>Tanggal</th><th>Lokasi</th><th>Status</th><th>Pembuat</th></tr></thead><tbody><?php foreach($documents as$d):?><tr><td><a href="<?=base_url('inventoryprofessional/operations?focus='.$d->id)?>" class="fw-semibold"><?=html_escape($d->document_no)?></a></td><td><?=html_escape(ucwords(str_replace('_',' ',$d->document_type)))?></td><td><?=date('d/m/Y',strtotime($d->document_date))?></td><td><?=html_escape(($d->from_warehouse?:'-').' → '.($d->to_warehouse?:'-'))?></td><td><span class="status-chip status-<?=$d->status?>"><?=html_escape(strtoupper($d->status))?></span></td><td><?=html_escape($d->creator_name?:'-')?></td></tr><?php endforeach?></tbody></table></div></section>
<script>
$(function(){
function esc(v){return $('<div>').text(v==null?'-':v).html()}
$('#scanButton').on('click',function(){var code=$('#scanCode').val().trim();if(!code)return AppAlert.toast('Barcode atau serial wajib diisi.','warning');var b=$(this).prop('disabled',true);$('#scanResult').html('<div class="inventory-loading"><span class="spinner-border spinner-border-sm"></span> Memeriksa barcode…</div>');$.ajax({url:'<?=base_url('inventoryprofessional/scan')?>',data:{code:code},dataType:'json'}).done(function(r){if(!r||!r.status||!r.item){var invalidMessage=r&&r.message?r.message:'Respons scan tidak lengkap.';AppAlert.toast(invalidMessage,'error');$('#scanResult').html('<div class="alert alert-danger mb-0">'+esc(invalidMessage)+'</div>');return;}var x=r.item,available=Math.max(0,Number(x.qty_sisa||0)-Number(x.reserved_qty||0)-Number(x.return_reserved_qty||0));var history=(Array.isArray(x.history)?x.history:[]).map(function(h){return '<li><strong>'+esc(h.movement_type)+'</strong><span>'+esc(h.notes)+' · '+esc(h.created_at)+'</span></li>'}).join('');$('#scanResult').html('<div class="scan-product"><span class="status-chip status-'+esc(x.status)+'">'+esc(x.status)+'</span><h5>'+esc((x.kode_detail||'')+' - '+(x.nama_barang||''))+'</h5><div class="scan-grid"><span>Barcode<strong>'+esc(x.barcode)+'</strong></span><span>Serial<strong>'+esc(x.serial_number)+'</strong></span><span>Gudang / Rak<strong>'+esc(x.warehouse_name)+' / '+esc(x.bin_code)+'</strong></span><span>Qty Tersedia<strong>'+available.toLocaleString('id-ID')+' '+esc(x.unit)+'</strong></span><span>Batch<strong>'+esc(x.batch_no)+'</strong></span></div><ul class="scan-history">'+(history||'<li>Belum ada riwayat perpindahan.</li>')+'</ul></div>')}).fail(function(xhr){var message=xhr.responseJSON&&xhr.responseJSON.message?xhr.responseJSON.message:'Barcode atau serial tidak ditemukan.';AppAlert.toast(message,'error');$('#scanResult').html('<div class="alert alert-danger mb-0">'+esc(message)+'</div>')}).always(function(){b.prop('disabled',false)})});
$('#scanCode').on('keydown',function(e){if(e.key==='Enter')$('#scanButton').click()});
});
</script>