Files
2026-09-11 16:03:00 +07:00

24 lines
9.0 KiB
PHP

<?php $inventory_title='Gudang & Lokasi Rak';$inventory_subtitle='Kelola gudang, rak/bin, serta batch tanpa menghapus histori transaksi.';$this->load->view('inventory_professional/_module_nav',get_defined_vars());?>
<section class="inventory-card">
<div class="inventory-card-head"><div><h5>Master Lokasi Persediaan</h5><p>Data yang sudah digunakan dinonaktifkan, bukan dihapus.</p></div></div>
<ul class="nav nav-tabs px-3 pt-3" role="tablist"><li class="nav-item"><button class="nav-link active" data-bs-toggle="tab" data-bs-target="#warehousePane">Gudang</button></li><li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#binPane">Rak / Bin</button></li><li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#batchPane">Batch / Lot</button></li></ul>
<div class="tab-content">
<div class="tab-pane fade show active" id="warehousePane"><div class="inventory-card-head"><div><h5>Daftar Gudang</h5><p>Pusat penyimpanan fisik barang.</p></div><?php if($inventory_permissions['update']):?><button class="btn btn-sm btn-primary add-master" data-type="warehouse"><i class="bi bi-plus"></i> Gudang</button><?php endif?></div><div class="table-responsive"><table class="table inventory-table mb-0"><thead><tr><th>Kode</th><th>Nama</th><th>Alamat</th><th>Status</th><th>Aksi</th></tr></thead><tbody id="warehouseRows"></tbody></table></div></div>
<div class="tab-pane fade" id="binPane"><div class="inventory-card-head"><div><h5>Lokasi Rak / Bin</h5><p>Lokasi spesifik di dalam gudang.</p></div><?php if($inventory_permissions['update']):?><button class="btn btn-sm btn-primary add-master" data-type="bin"><i class="bi bi-plus"></i> Rak</button><?php endif?></div><div class="table-responsive"><table class="table inventory-table mb-0"><thead><tr><th>Gudang</th><th>Kode Rak</th><th>Nama</th><th>Status</th><th>Aksi</th></tr></thead><tbody id="binRows"></tbody></table></div></div>
<div class="tab-pane fade" id="batchPane"><div class="inventory-card-head"><div><h5>Batch / Lot</h5><p>Pelacakan tanggal produksi dan kedaluwarsa.</p></div><?php if($inventory_permissions['update']):?><button class="btn btn-sm btn-primary add-master" data-type="batch"><i class="bi bi-plus"></i> Batch</button><?php endif?></div><div class="table-responsive"><table class="table inventory-table mb-0"><thead><tr><th>Barang</th><th>Batch</th><th>Produksi</th><th>Kedaluwarsa</th><th>Supplier</th><th>Status</th><th>Aksi</th></tr></thead><tbody id="batchRows"></tbody></table></div></div>
</div>
</section>
<div class="modal fade inventory-modal" id="masterModal" tabindex="-1"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="modal-header"><div><small class="text-muted">MASTER PERSEDIAAN</small><h5 class="modal-title">Data Master</h5></div><button class="btn-close" data-bs-dismiss="modal"></button></div><form id="masterForm"><div class="modal-body" id="masterFields"></div><div class="modal-footer"><button type="button" class="btn btn-light" data-bs-dismiss="modal">Batal</button><button class="btn btn-primary">Simpan</button></div></form></div></div></div>
<script>
$(function(){
const canUpdate=<?=json_encode($inventory_permissions['update'])?>,csrf=()=>({[APP_CSRF.name]:APP_CSRF.value}),esc=v=>$('<div>').text(v==null?'-':v).html();let data={warehouses:[],bins:[],batches:[]},type='warehouse',editing=null;
function badge(v){return '<span class="status-chip '+(Number(v)?'status-approved':'status-rejected')+'">'+(Number(v)?'Aktif':'Nonaktif')+'</span>'}function button(t,x){return canUpdate?'<button class="btn btn-sm btn-outline-primary edit-master" data-type="'+t+'" data-id="'+x.id+'"><i class="bi bi-pencil"></i> Ubah</button>':'-'}
function load(){$.get('<?=base_url('inventoryprofessional/master_data')?>').done(r=>{data=r;$('#warehouseRows').html(r.warehouses.map(x=>'<tr><td><strong>'+esc(x.code)+'</strong></td><td>'+esc(x.nama)+'</td><td>'+esc(x.address)+'</td><td>'+badge(x.is_active)+'</td><td>'+button('warehouse',x)+'</td></tr>').join('')||empty(5));$('#binRows').html(r.bins.map(x=>'<tr><td>'+esc(x.warehouse_name)+'</td><td><strong>'+esc(x.code)+'</strong></td><td>'+esc(x.name)+'</td><td>'+badge(x.is_active)+'</td><td>'+button('bin',x)+'</td></tr>').join('')||empty(5));$('#batchRows').html(r.batches.map(x=>'<tr><td>'+esc(x.kode_detail+' - '+x.nama_barang)+'</td><td><strong>'+esc(x.batch_no)+'</strong></td><td>'+esc(x.manufactured_date)+'</td><td>'+esc(x.expiry_date)+'</td><td>'+esc(x.supplier_name)+'</td><td>'+badge(x.is_active)+'</td><td>'+button('batch',x)+'</td></tr>').join('')||empty(7))}).fail(fail)}function empty(n){return'<tr><td colspan="'+n+'" class="text-center text-muted py-4">Belum ada data.</td></tr>'}function fail(x){AppAlert.toast(x.responseJSON&&x.responseJSON.message||'Data tidak dapat diproses.','error')}
function warehouseOptions(selected){return'<option value="">-- Pilih Gudang --</option>'+data.warehouses.filter(x=>Number(x.is_active)||String(x.id)===String(selected)).map(x=>'<option value="'+x.id+'" '+(String(x.id)===String(selected)?'selected':'')+'>'+esc(x.code+' - '+x.nama)+'</option>').join('')}
function fields(t,x){x=x||{};if(t==='warehouse')return'<input type="hidden" id="masterId" value="'+(x.id||'')+'"><div class="mb-3"><label class="form-label">Kode Gudang</label><input id="warehouseCode" class="form-control" value="'+esc(x.code||'')+'" required></div><div class="mb-3"><label class="form-label">Nama Gudang</label><input id="warehouseName" class="form-control" value="'+esc(x.nama||'')+'" required></div><div class="mb-3"><label class="form-label">Alamat</label><textarea id="warehouseAddress" class="form-control">'+esc(x.address||'')+'</textarea></div>'+active(x);if(t==='bin')return'<input type="hidden" id="masterId" value="'+(x.id||'')+'"><div class="mb-3"><label class="form-label">Gudang</label><select id="binWarehouse" class="form-select" required>'+warehouseOptions(x.warehouse_id)+'</select></div><div class="mb-3"><label class="form-label">Kode Rak / Bin</label><input id="binCode" class="form-control" value="'+esc(x.code||'')+'" required></div><div class="mb-3"><label class="form-label">Nama Lokasi</label><input id="binName" class="form-control" value="'+esc(x.name||'')+'"></div>'+active(x);return'<input type="hidden" id="masterId" value="'+(x.id||'')+'"><div class="mb-3"><label class="form-label">Barang</label><select id="batchItem" class="form-select"></select></div><div class="mb-3"><label class="form-label">Nomor Batch / Lot</label><input id="batchNo" class="form-control" value="'+esc(x.batch_no||'')+'" required></div><div class="row g-3"><div class="col-6"><label class="form-label">Tanggal Produksi</label><input id="batchMfg" type="date" class="form-control" value="'+esc(x.manufactured_date||'')+'"></div><div class="col-6"><label class="form-label">Kedaluwarsa</label><input id="batchExpiry" type="date" class="form-control" value="'+esc(x.expiry_date||'')+'"></div></div>'+active(x)}function active(x){return'<div class="form-check form-switch mt-3"><input id="masterActive" class="form-check-input" type="checkbox" '+(x.id&&!Number(x.is_active)?'':'checked')+'><label class="form-check-label">Aktif dan dapat dipilih pada transaksi baru</label></div>'}
function open(t,x){type=t;editing=x||null;$('.modal-title').text((x?'Ubah ':'Tambah ')+(t==='warehouse'?'Gudang':t==='bin'?'Rak / Bin':'Batch / Lot'));$('#masterFields').html(fields(t,x));if(t==='batch'){$('#batchItem').select2({width:'100%',dropdownParent:$('#masterModal'),placeholder:'Cari barang',ajax:{url:'<?=base_url('inventoryprofessional/lookup_items')?>',dataType:'json',delay:250,data:p=>({q:p.term||''}),processResults:r=>({results:r.results})}});if(x&&x.item_id){let o=new Option(x.kode_detail+' - '+x.nama_barang,x.item_id,true,true);$('#batchItem').append(o).trigger('change')}}bootstrap.Modal.getOrCreateInstance('#masterModal').show()}
$('.add-master').on('click',function(){open($(this).data('type'))});$(document).on('click','.edit-master',function(){let t=$(this).data('type'),list=t==='warehouse'?data.warehouses:t==='bin'?data.bins:data.batches;open(t,list.find(x=>String(x.id)===String($(this).data('id'))))});
$('#masterForm').on('submit',function(e){e.preventDefault();let payload={id:$('#masterId').val(),is_active:$('#masterActive').is(':checked')?1:0},url='';if(type==='warehouse'){url='save_warehouse';Object.assign(payload,{code:$('#warehouseCode').val(),name:$('#warehouseName').val(),address:$('#warehouseAddress').val()})}else if(type==='bin'){url='save_bin';Object.assign(payload,{warehouse_id:$('#binWarehouse').val(),code:$('#binCode').val(),name:$('#binName').val()})}else{url='save_batch';Object.assign(payload,{item_id:$('#batchItem').val(),batch_no:$('#batchNo').val(),manufactured_date:$('#batchMfg').val(),expiry_date:$('#batchExpiry').val()})}let b=$(this).find('button[type=submit]').prop('disabled',true);$.post('<?=base_url('inventoryprofessional')?>/'+url,Object.assign(payload,csrf())).done(r=>{bootstrap.Modal.getInstance(document.getElementById('masterModal')).hide();AppAlert.toast(r.message,'success');load()}).fail(fail).always(()=>b.prop('disabled',false))});load();
});
</script>