Perubahan barcode dan inventory
This commit is contained in:
@@ -16,9 +16,10 @@
|
||||
<tr>
|
||||
<th>No</th>
|
||||
<th>Tanggal</th>
|
||||
<th>Kode</th>
|
||||
<th>Nama</th>
|
||||
<th style="min-width: 80px;">Kode</th>
|
||||
<th style="min-width: 80px;">Nama</th>
|
||||
<th>Lokasi Asset</th>
|
||||
<th style="max-width: 150px;">Keterangan</th>
|
||||
<th>Nilai</th>
|
||||
<th>Masa</th>
|
||||
<th>Susut/Bulan</th>
|
||||
@@ -56,9 +57,10 @@
|
||||
<input type="text" id="nama_asset" class="form-control">
|
||||
|
||||
<label class="mt-2">Keterangan</label>
|
||||
<input type="text" id="keterangan" class="form-control">
|
||||
<textarea rows="3" id="keterangan" class="form-control"></textarea>
|
||||
<!-- <input type="text" id="keterangan" class="form-control"> -->
|
||||
|
||||
<label class="mt-2">Harga Per Unit</label>
|
||||
<label class="mt-2">Harga</label>
|
||||
<input type="text" id="harga" class="form-control format-rupiah">
|
||||
|
||||
<label class="mt-2">Tanggal</label>
|
||||
@@ -99,7 +101,8 @@
|
||||
<select id="edit_lokasi_asset" class="form-control"></select>
|
||||
|
||||
<label class="mt-2">Keterangan</label>
|
||||
<input type="text" id="edit_keterangan" class="form-control">
|
||||
<!-- <input type="text" id="edit_keterangan" class="form-control"> -->
|
||||
<textarea rows="3" id="edit_keterangan" class="form-control"></textarea>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-primary" id="btnUpdate">Update</button>
|
||||
@@ -146,7 +149,7 @@
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input type="hidden" id="s_item_id">
|
||||
<input type="hidden" id="s_harga">
|
||||
<!-- <input type="hidden" id="s_harga"> -->
|
||||
|
||||
<label class="mt-2">Akun Asset (Debit)</label>
|
||||
<select id="s_account_asset" class="form-control"></select>
|
||||
@@ -155,14 +158,33 @@
|
||||
<select id="s_lokasi_asset" class="form-control"></select>
|
||||
|
||||
<label>Pilih Barang</label>
|
||||
<select id="s_item" class="form-control"></select>
|
||||
<select id="s_item" class="form-control select-search"></select>
|
||||
|
||||
<label class="mt-2">Stok Tersedia</label>
|
||||
<input type="text" id="s_stok" class="form-control" readonly>
|
||||
<div class="mb-2 d-none" id="wrap_barcode_select">
|
||||
<label for="barcode_select" class="form-label">Barcode / QR ID</label>
|
||||
<select id="barcode_select" class="form-control select-search"></select>
|
||||
</div>
|
||||
|
||||
<div id="stokSisaQty"></div>
|
||||
|
||||
<label class="mt-2">Harga Barang</label>
|
||||
<input type="text" id="s_harga" class="form-control format-rupiah" disabled>
|
||||
|
||||
<div class="mb-0 d-none" id="wrap_qty">
|
||||
<label class="mt-2">Qty</label>
|
||||
<input type="number" id="s_qty" placeholder="1" class="form-control">
|
||||
|
||||
<label class="mt-2">Total Harga</label>
|
||||
<input type="text" id="s_total_harga" class="form-control format-rupiah" disabled>
|
||||
</div>
|
||||
|
||||
<label class="mt-2">Tanggal</label>
|
||||
<input type="date" id="s_tanggal" class="form-control">
|
||||
|
||||
<label class="mt-2">Keterangan</label>
|
||||
<textarea rows="3" id="s_keterangan" class="form-control"></textarea>
|
||||
<!-- <input type="text" id="s_keterangan" class="form-control"> -->
|
||||
|
||||
<hr>
|
||||
|
||||
<label>Masa Manfaat (bulan)</label>
|
||||
@@ -224,6 +246,10 @@ function formatRupiah(angka){
|
||||
return angka.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
|
||||
}
|
||||
|
||||
function parseNumber(val){
|
||||
return parseInt((val || '').toString().replace(/\D/g,'')) || 0;
|
||||
}
|
||||
|
||||
function setSelectValue(selector, value){
|
||||
setTimeout(()=>{
|
||||
$(selector).val(value).trigger('change');
|
||||
@@ -269,7 +295,7 @@ function loadItems(){
|
||||
$.get("<?= base_url('asset/get_items'); ?>",res=>{
|
||||
let opt='<option value="">-- PILIH BARANG --</option>';
|
||||
res.forEach(i=>{
|
||||
opt += `<option value="${i.id}" data-harga="${i.harga_beli}" data-stok="${i.stok}" data-nama="${i.nama_barang}">
|
||||
opt += `<option value="${i.id}" data-id="${i.id}" data-harga="${i.harga_beli}" data-stok="${i.stok}" data-nama="${i.nama_barang}" data-type="${i.tracking_type}">
|
||||
${i.kode_detail} - ${i.nama_barang} - ( Stok: ${i.stok})
|
||||
</option>`;
|
||||
});
|
||||
@@ -282,20 +308,81 @@ function hitungSusut(){
|
||||
let harga = parseInt($('#harga').val().replace(/\D/g,'')) || 0;
|
||||
let residu = parseInt($('#residu').val().replace(/\D/g,'')) || 0;
|
||||
let masa = parseInt($('#masa').val()) || 1;
|
||||
|
||||
let maxResidu = harga / 100 * 80;
|
||||
|
||||
if (residu > maxResidu) {
|
||||
residu = maxResidu;
|
||||
$('#residu').val(maxResidu).trigger('input');
|
||||
}
|
||||
|
||||
let susut = (harga - residu) / masa;
|
||||
$('#susut').val(formatRupiah(Math.round(susut)));
|
||||
susut = Math.max(0, susut);
|
||||
$('#susut').val(susut);
|
||||
}
|
||||
|
||||
// ================= LOAD BARCODE ITEMS =================
|
||||
// function loadItemBarcodes(item_id){
|
||||
// return $.get("<?= base_url('items/get_list_barcode_id/'); ?>" + item_id, function(res){
|
||||
// if(res && res.length){
|
||||
// let opt = '<option value="">Pilih Item</option>';
|
||||
// res.forEach(i=>{
|
||||
// opt += `<option value="${i.barcode_id}">
|
||||
// ${i.nama_barang} - ${i.barcode} - ${i.serial_number}
|
||||
// </option>`;
|
||||
// });
|
||||
// $('#barcode_select').html(opt);
|
||||
// $('#wrap_barcode_select').removeClass('d-none');
|
||||
// } else {
|
||||
// $('#wrap_barcode_select').addClass('d-none');
|
||||
// }
|
||||
// }, 'json');
|
||||
// }
|
||||
|
||||
function loadItemBarcodes(item_id, selectedBarcode = null){
|
||||
return $.get("<?= base_url('items/get_list_barcode_id/'); ?>" + item_id, function(res){
|
||||
if(res && res.length){
|
||||
let opt = '<option value="">Pilih Barcode</option>';
|
||||
res.forEach(i=>{
|
||||
opt += `
|
||||
<option value="${i.barcode_id}" data-qty_sisa="${i.qty_sisa}">
|
||||
${i.nama_barang} - ${i.barcode} - ${i.serial_number}
|
||||
</option>
|
||||
`;
|
||||
});
|
||||
$('#barcode_select').html(opt);
|
||||
if(selectedBarcode){
|
||||
$('#barcode_select').val(selectedBarcode);
|
||||
}
|
||||
$('#wrap_barcode_select').removeClass('d-none');
|
||||
|
||||
// setMode('item');
|
||||
}else{
|
||||
$('#wrap_barcode_select').addClass('d-none');
|
||||
// setMode('manual');
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
|
||||
$('#masa, #residu, #harga').on('keyup change',hitungSusut);
|
||||
|
||||
// ================= HITUNG SUSUT STOCK =================
|
||||
$('#s_masa, #s_residu').on('keyup change',function(){
|
||||
let harga = parseInt($('#s_harga').val()) || 0;
|
||||
let residu = parseInt($('#s_residu').val().replace(/\D/g,'')) || 0;
|
||||
function hitungSusutStock(){
|
||||
let trackingType = ($('#s_item option:selected').data('type') || '').toString().trim().toUpperCase();
|
||||
let hargaDasar = trackingType === 'QTY' ? parseNumber($('#s_total_harga').val()) : parseNumber($('#s_harga').val());
|
||||
let residu = parseNumber($('#s_residu').val());
|
||||
let masa = parseInt($('#s_masa').val()) || 1;
|
||||
let susut = (harga - residu) / masa;
|
||||
$('#s_susut').val(formatRupiah(Math.round(susut)));
|
||||
});
|
||||
let maxResidu = hargaDasar / 100 * 80;
|
||||
|
||||
if (residu > maxResidu) {
|
||||
residu = maxResidu;
|
||||
$('#s_residu').val(maxResidu).trigger('input');
|
||||
}
|
||||
let susut = (hargaDasar - residu) / masa;
|
||||
susut = Math.max(0, susut);
|
||||
$('#s_susut').val(susut);
|
||||
}
|
||||
$('#s_masa, #s_residu').on('keyup change', hitungSusutStock);
|
||||
|
||||
// ================= TAMBAH ASSET MANUAL =================
|
||||
$('.btn-add-asset').click(function(){
|
||||
@@ -303,26 +390,77 @@ $('.btn-add-asset').click(function(){
|
||||
$('#modalTitleAsset').text('Tambah Asset');
|
||||
$('#modalAsset input[type="text"], #modalAsset input[type="date"], #modalAsset input[type="number"], #modalAsset select').val('');
|
||||
$('#id_asset').val('');
|
||||
$('#stokSisaQty').html('');
|
||||
loadKas(); loadAsset(); loadLokasiAsset();
|
||||
$('#modalAsset').modal('show');
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// ================= DETAIL & HISTORY =================
|
||||
$(document).on('click','.btn-detail',function(){
|
||||
let id = $(this).data('id');
|
||||
|
||||
$.get("<?= base_url('asset/detail/'); ?>"+id, function(asset){
|
||||
$('#detailContent').html(`
|
||||
<table class="table table-borderless">
|
||||
<tr><td><strong>Kode Asset</strong></td><td>: <strong>${asset.kode_asset || '-'}</strong></td></tr>
|
||||
<tr><td><strong>Nama Asset</strong></td><td>: <strong>${asset.nama_asset}</strong></td></tr>
|
||||
<tr><td><strong>Lokasi</strong></td><td>: <strong>${asset.nama_lokasi || '-'}</strong></td></tr>
|
||||
<tr><td><strong>Harga/Unit</strong></td><td>: <strong>Rp ${formatRupiah(asset.harga_per_unit)}</strong></td></tr>
|
||||
<tr><td><strong>Nilai Buku</strong></td><td>: <strong>Rp ${formatRupiah(asset.nilai_buku)}</strong></td></tr>
|
||||
<tr><td><strong>Masa Manfaat</strong></td><td>: <strong>${asset.masa_manfaat} bulan</strong></td></tr>
|
||||
<tr><td><strong>Sumber</strong></td><td>: <strong>${asset.sumber}</strong></td></tr>
|
||||
<tr><td><strong>Keterangan</strong></td><td>: <strong>${asset.keterangan || '-'}</strong></td></tr>
|
||||
</table>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6">
|
||||
<table class="table table-borderless table-sm">
|
||||
<tr>
|
||||
<td width="45%"><strong>Kode Asset</strong></td>
|
||||
<td>: <strong>${asset.kode_asset || '-'}</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Nama Asset</strong></td>
|
||||
<td>: <strong>${asset.nama_asset}</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Lokasi</strong></td>
|
||||
<td>: <strong>${asset.nama_lokasi || '-'}</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Harga/Unit</strong></td>
|
||||
<td>: <strong>Rp ${formatRupiah(asset.harga_per_unit)}</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Qty</strong></td>
|
||||
<td>: <strong>${asset.qty}</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Nilai Perolehan</strong></td>
|
||||
<td>: <strong>Rp ${formatRupiah(asset.nilai_perolehan)}</strong></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<table class="table table-borderless table-sm">
|
||||
<tr>
|
||||
<td width="45%"><strong>Akumulasi Penyusutan</strong></td>
|
||||
<td>: <strong>Rp ${formatRupiah(asset.akumulasi_penyusutan || 0)}</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Nilai Buku</strong></td>
|
||||
<td>: <strong>Rp ${formatRupiah(asset.nilai_buku)}</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Masa Manfaat</strong></td>
|
||||
<td>: <strong>${asset.masa_manfaat} bulan</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Sumber</strong></td>
|
||||
<td>: <strong>${asset.sumber}</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Keterangan</strong></td>
|
||||
<td>: <strong>${asset.keterangan || '-'}</strong></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
`);
|
||||
|
||||
// Load history
|
||||
@@ -336,7 +474,7 @@ $(document).on('click','.btn-detail',function(){
|
||||
h.tipe=='penambahan' ? 'bg-info' :
|
||||
h.tipe=='pengurangan' ? 'bg-warning' : 'bg-secondary';
|
||||
rows += `<tr>
|
||||
<td>${h.created_at}</td>
|
||||
<td>${h.tanggal_dibuat}</td>
|
||||
<td><span class="badge ${badgeClass}">${h.tipe}</span></td>
|
||||
<td>Rp ${formatRupiah(h.nilai || 0)}</td>
|
||||
<td>${h.keterangan}</td>
|
||||
@@ -465,35 +603,157 @@ $('#btnSave').click(function(){
|
||||
});
|
||||
|
||||
// ================= FROM STOCK =================
|
||||
$('.btn-from-stock').click(function(){
|
||||
function resetStockForm(){
|
||||
$('#modalAssetStock input[type="text"], #modalAssetStock input[type="date"], #modalAssetStock input[type="number"], #modalAssetStock select').val('');
|
||||
$('#s_item_id, #s_harga').val('');
|
||||
$('#s_item_id, #s_harga, #s_total_harga, #s_susut, #s_keterangan').val('');
|
||||
$('#s_qty').val(1);
|
||||
$('#stokSisaQty').html('');
|
||||
$('#wrap_qty').addClass('d-none');
|
||||
$('#wrap_barcode_select').removeClass('d-none');
|
||||
$('#barcode_select').html('<option value="">Loading...</option>');
|
||||
}
|
||||
|
||||
$('.btn-from-stock').click(function(){
|
||||
resetStockForm();
|
||||
loadItems();
|
||||
loadAsset();
|
||||
loadLokasiAsset();
|
||||
$('#modalAssetStock').modal('show');
|
||||
});
|
||||
|
||||
// ================= PILIH ITEM STOCK =================
|
||||
$(document).on('change','#s_item',function(){
|
||||
|
||||
$('#barcode_select').on('change', function(){
|
||||
let selectedItem = $('#s_item option:selected');
|
||||
let type = (selectedItem.data('type') || '').toString().trim().toUpperCase();
|
||||
let selected = $(this).find(':selected');
|
||||
let harga = selected.data('harga') || 0;
|
||||
let stok = selected.data('stok') || 0;
|
||||
$('#s_item_id').val($(this).val());
|
||||
let qty_sisa = parseFloat(selected.data('qty_sisa')) || 0;
|
||||
|
||||
if($(this).val()){
|
||||
$('#stokSisaQty').html('<h6 class="text-success ml-4">Stok : ' + qty_sisa + '</h6><hr>');
|
||||
}else{
|
||||
$('#stokSisaQty').html('');
|
||||
}
|
||||
|
||||
// perlakuan qty setelah barcode dipilih, berdasarkan tracking_type
|
||||
if(type === 'UNIT'){
|
||||
$('#stokSisaQty').html('');
|
||||
$('#wrap_qty').addClass('d-none');
|
||||
$('#s_qty').removeAttr('max').val(1);
|
||||
$('#s_total_harga').val(parseNumber($('#s_harga').val()));
|
||||
hitungSusutStock();
|
||||
}else{
|
||||
$('#wrap_qty').removeClass('d-none');
|
||||
$('#s_qty').attr('min', 1).attr('max', qty_sisa > 0 ? qty_sisa : 1).val('');
|
||||
$('#s_total_harga').val('');
|
||||
}
|
||||
});
|
||||
|
||||
$('#s_item').on('change', function(){
|
||||
let selected = $(this).find(':selected');
|
||||
let item_id = selected.data('id');
|
||||
let type = selected.data('type');
|
||||
let harga = parseInt(selected.data('harga')) || 0;
|
||||
let stok = parseFloat(selected.data('stok')) || 0;
|
||||
|
||||
$('#s_item_id').val(item_id || '');
|
||||
$('#s_harga').val(harga);
|
||||
$('#s_stok').val(stok);
|
||||
$('#s_total_harga').val(harga);
|
||||
$('#stokSisaQty').html('');
|
||||
$('#s_qty').val(1).removeAttr('max');
|
||||
|
||||
$('#wrap_qty').addClass('d-none');
|
||||
$('#wrap_barcode_select').addClass('d-none');
|
||||
$('#barcode_select').html('<option value="">Pilih Barcode</option>');
|
||||
|
||||
if(!item_id){
|
||||
return;
|
||||
}
|
||||
|
||||
let normalizedType = (type || '').toString().trim().toUpperCase();
|
||||
// barcode tetap harus muncul untuk ITEM maupun QTY
|
||||
loadItemBarcodes(item_id, null).done(function(res){
|
||||
if(res && res.length){
|
||||
$('#wrap_barcode_select').removeClass('d-none');
|
||||
}else{
|
||||
$('#wrap_barcode_select').addClass('d-none');
|
||||
$('#barcode_select').html('<option value="">Barcode tidak tersedia</option>');
|
||||
}
|
||||
|
||||
// sebelum pilih barcode: qty & total belum ditentukan
|
||||
$('#wrap_qty').addClass('d-none');
|
||||
$('#s_qty').removeAttr('max').val('');
|
||||
$('#s_total_harga').val('');
|
||||
}).fail(function(){
|
||||
$('#wrap_barcode_select').addClass('d-none');
|
||||
$('#barcode_select').html('<option value="">Gagal load barcode</option>');
|
||||
$('#wrap_qty').addClass('d-none');
|
||||
$('#s_qty').removeAttr('max').val('');
|
||||
$('#s_total_harga').val('');
|
||||
});
|
||||
});
|
||||
|
||||
$('#s_qty').on('keyup change',function(){
|
||||
let selectedItem = $('#s_item option:selected');
|
||||
let type = (selectedItem.data('type') || '').toString().trim().toUpperCase();
|
||||
let qtyRaw = $('#s_qty').val();
|
||||
let qty = parseInt(qtyRaw);
|
||||
let harga = parseNumber($('#s_harga').val());
|
||||
let max = parseFloat($('#s_qty').attr('max')) || 0;
|
||||
|
||||
if(type === 'UNIT'){
|
||||
$('#wrap_qty').addClass('d-none');
|
||||
$('#s_qty').val(1);
|
||||
$('#s_total_harga').val(harga);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!qtyRaw || isNaN(qty) || qty < 1){
|
||||
$('#s_total_harga').val('');
|
||||
return;
|
||||
}
|
||||
|
||||
if(max > 0 && qty > max){
|
||||
qty = max;
|
||||
Swal.fire('Warning','Stok tidak cukup! Max: ' + max,'warning');
|
||||
}
|
||||
|
||||
let total = harga * qty;
|
||||
$('#s_qty').val(qty);
|
||||
$('#s_total_harga').val(total);
|
||||
hitungSusutStock();
|
||||
});
|
||||
|
||||
// ================= SAVE FROM STOCK =================
|
||||
$('#btnSaveStock').click(function(){
|
||||
let btn = $(this);
|
||||
let trackingType = ($('#s_item option:selected').data('type') || '').toString().trim().toUpperCase();
|
||||
let maxQty = parseFloat($('#s_qty').attr('max')) || 0;
|
||||
let qtyRaw = $('#s_qty').val();
|
||||
let qty = parseInt(qtyRaw);
|
||||
|
||||
if(trackingType === 'UNIT'){
|
||||
qty = 1;
|
||||
}else{
|
||||
if(!qtyRaw || isNaN(qty) || qty < 1){
|
||||
Swal.fire('Error','Qty wajib diisi untuk item tracking QTY','error');
|
||||
return;
|
||||
}
|
||||
if(maxQty > 0 && qty > maxQty){
|
||||
Swal.fire('Error','Qty melebihi stok tersedia','error');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
let data = {
|
||||
item_id: $('#s_item').val(),
|
||||
s_tanggal: $('#s_tanggal').val(),
|
||||
s_masa: $('#s_masa').val(),
|
||||
s_residu: $('#s_residu').val(),
|
||||
s_lokasi_asset: $('#s_lokasi_asset').val(),
|
||||
account_asset: $('#s_account_asset').val()
|
||||
account_asset: $('#s_account_asset').val(),
|
||||
s_keterangan: $('#s_keterangan').val(),
|
||||
barcode_id: $('#barcode_select').val(),
|
||||
qty: qty
|
||||
};
|
||||
|
||||
// Validasi
|
||||
@@ -502,6 +762,15 @@ $('#btnSaveStock').click(function(){
|
||||
return;
|
||||
}
|
||||
|
||||
if(!data.barcode_id){
|
||||
Swal.fire('Error','Barcode wajib dipilih','error');
|
||||
return;
|
||||
}
|
||||
|
||||
if(trackingType === 'UNIT'){
|
||||
data.qty = 1;
|
||||
}
|
||||
|
||||
btn.prop('disabled', true).html('Menyimpan...');
|
||||
|
||||
$.post("<?= base_url('asset/save_from_stock'); ?>",data,function(res){
|
||||
@@ -523,5 +792,6 @@ $('#btnSaveStock').click(function(){
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
@@ -122,10 +122,12 @@
|
||||
</div>
|
||||
|
||||
<div class="mb-2 d-none" id="wrap_barcode_select">
|
||||
<label for="barcode_select" class="form-label">Barcode ID</label>
|
||||
<label for="barcode_select" class="form-label">Barcode / QR ID</label>
|
||||
<select id="barcode_select" class="form-control select-search"></select>
|
||||
</div>
|
||||
|
||||
<div id="stokSisaQty"></div>
|
||||
|
||||
<div class="mb-2" id="wrap_qty_item">
|
||||
<label for="qty" class="form-label">Qty</label>
|
||||
<input type="number" id="qty" class="form-control" min="0">
|
||||
@@ -232,6 +234,7 @@ $(function(){
|
||||
$('#wrap_item_select').addClass('d-none');
|
||||
$('#wrap_nama_item').removeClass('d-none');
|
||||
$('#wrap_qty_item').removeClass('d-none');
|
||||
$('#wrap_barcode_select').addClass('d-none');
|
||||
|
||||
$('#warehouse_id').html('<option value="">Pilih Gudang</option>');
|
||||
$('#item_select').html('<option value="">Pilih Item</option>');
|
||||
@@ -241,10 +244,12 @@ $(function(){
|
||||
$('#qty').val('');
|
||||
$('#harga').val('');
|
||||
$('#keterangan').val('');
|
||||
$('#barcode_select').val('');
|
||||
|
||||
$('#is_cicilan').prop('checked', false);
|
||||
$('#wrap_cicilan').addClass('d-none');
|
||||
$('#tenor').val('');
|
||||
$('#stokSisaQty').html('');
|
||||
|
||||
setMode('manual');
|
||||
}
|
||||
@@ -359,33 +364,91 @@ $(function(){
|
||||
return;
|
||||
}
|
||||
|
||||
loadItemBarcodes(item_id);
|
||||
// loadItemBarcodes(item_id);
|
||||
loadItemBarcodes(
|
||||
item_id,
|
||||
isEditing ? editData.barcode_id : null
|
||||
);
|
||||
});
|
||||
|
||||
$('#barcode_select').on('change', function(){
|
||||
|
||||
let barcode_id = $(this).val();
|
||||
|
||||
let selected = $(this).find(':selected');
|
||||
let qty_sisa = parseFloat(selected.data('qty_sisa')) || 0;
|
||||
|
||||
// console.log("QTY : " + qty_sisa);
|
||||
if (qty_sisa > 1 ) {
|
||||
$('#stokSisaQty').html('<h6 class="text-success ml-4">Stok : ' + qty_sisa + '</h6><hr>');
|
||||
$('#qty').val('');
|
||||
$('#wrap_qty_item').removeClass('d-none');
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// $(document).on('keyup','#qty',function(){
|
||||
// hitungTotal();
|
||||
// });
|
||||
|
||||
// function hitungTotal(){
|
||||
// let qty_sisa = 1000;
|
||||
// $('#stokSisaQty').html('<h6 class="text-success ml-4">Stok : ' + qty_sisa + '</h6><hr>');
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// ================= LOAD BARCODE ITEMS =================
|
||||
function loadItemBarcodes(item_id){
|
||||
// function loadItemBarcodes(item_id){
|
||||
// return $.get("<?= base_url('items/get_list_barcode_id/'); ?>" + item_id, function(res){
|
||||
// if(res && res.length){
|
||||
// let opt = '<option value="">Pilih Item</option>';
|
||||
// res.forEach(i=>{
|
||||
// opt += `<option value="${i.barcode_id}">
|
||||
// ${i.nama_barang} - ${i.barcode} - ${i.serial_number}
|
||||
// </option>`;
|
||||
// });
|
||||
// $('#barcode_select').html(opt);
|
||||
// $('#wrap_barcode_select').removeClass('d-none');
|
||||
|
||||
// // set QTY jadi 1
|
||||
// let qty = Number($('#qty').val());
|
||||
// $('#qty').val(qty + 1);
|
||||
|
||||
// setMode('item');
|
||||
// } else {
|
||||
// $('#wrap_barcode_select').addClass('d-none');
|
||||
// // $('#wrap_barcode_select').removeClass('d-none');
|
||||
// setMode('manual');
|
||||
// }
|
||||
// }, 'json');
|
||||
// }
|
||||
|
||||
function loadItemBarcodes(item_id, selectedBarcode = null){
|
||||
return $.get("<?= base_url('items/get_list_barcode_id/'); ?>" + item_id, function(res){
|
||||
if(res && res.length){
|
||||
let opt = '<option value="">Pilih Item</option>';
|
||||
let opt = '<option value="">Pilih Barcode</option>';
|
||||
res.forEach(i=>{
|
||||
opt += `<option value="${i.barcode_id}">
|
||||
${i.nama_barang} - ${i.barcode} - ${i.serial_number}
|
||||
</option>`;
|
||||
opt += `
|
||||
<option value="${i.barcode_id}" data-qty_sisa="${i.qty_sisa}">
|
||||
${i.nama_barang} - ${i.barcode} - ${i.serial_number}
|
||||
</option>
|
||||
`;
|
||||
});
|
||||
$('#barcode_select').html(opt);
|
||||
if(selectedBarcode){
|
||||
$('#barcode_select').val(selectedBarcode);
|
||||
}
|
||||
$('#wrap_barcode_select').removeClass('d-none');
|
||||
|
||||
// set QTY jadi 1
|
||||
let qty = Number($('#qty').val());
|
||||
$('#qty').val(qty + 1);
|
||||
|
||||
if(!isEditing){
|
||||
$('#qty').val(1);
|
||||
}
|
||||
setMode('item');
|
||||
} else {
|
||||
}else{
|
||||
$('#wrap_barcode_select').addClass('d-none');
|
||||
// $('#wrap_barcode_select').removeClass('d-none');
|
||||
setMode('manual');
|
||||
}
|
||||
}, 'json');
|
||||
},'json');
|
||||
}
|
||||
|
||||
// ================= AUTO HARGA =================
|
||||
@@ -398,8 +461,8 @@ $(function(){
|
||||
// ================= STOK CHECK =================
|
||||
$('#qty').on('input', function(){
|
||||
let qty = parseFloat($(this).val()) || 0;
|
||||
let selected = $('#item_select option:selected');
|
||||
let stok = selected.length ? parseFloat(selected.data('stok')) || 0 : 0;
|
||||
let selected = $('#barcode_select option:selected');
|
||||
let stok = selected.length ? parseFloat(selected.data('qty_sisa')) || 0 : 0;
|
||||
|
||||
if(stok > 0 && qty > stok){
|
||||
Swal.fire('Warning','Stok tidak cukup! Max: ' + stok,'warning');
|
||||
@@ -527,25 +590,7 @@ $(function(){
|
||||
let btnAction = '';
|
||||
if(v.status == 'draft'){
|
||||
|
||||
let btnEditTable = '';
|
||||
if(v.is_cicilan == 0) {
|
||||
btnEditTable = `
|
||||
<button class="btn btn-sm btn-secondary btn-editItem"
|
||||
data-id="${v.id}"
|
||||
data-tanggal_input="${v.tanggal}"
|
||||
data-account="${v.account_id}"
|
||||
data-item="${v.nama_item}"
|
||||
data-qty="${v.qty}"
|
||||
data-harga="${v.harga}"
|
||||
data-warehouse="${v.warehouse_id || ''}"
|
||||
data-item_id="${v.items_id || ''}"
|
||||
data-keterangan="${v.keterangan || ''}"
|
||||
data-is_cicilan="${v.is_cicilan || 0}">
|
||||
Edit
|
||||
</button>`;
|
||||
}
|
||||
btnAction = `
|
||||
${btnEditTable}
|
||||
<button class="btn btn-sm btn-danger btn-delete" data-id="${v.id}">
|
||||
Hapus
|
||||
</button>
|
||||
@@ -614,53 +659,6 @@ $(function(){
|
||||
modal.show();
|
||||
});
|
||||
|
||||
// ================= EDIT =================
|
||||
$(document).on('click','.btn-editItem', function(){
|
||||
action = "edit";
|
||||
edit_id = $(this).data('id');
|
||||
isEditing = true;
|
||||
editData = $(this).data();
|
||||
|
||||
$('#modalTitle').text('Edit Item');
|
||||
resetForm();
|
||||
|
||||
// Set basic fields first
|
||||
$('#account_id').val(editData.account).trigger('change');
|
||||
|
||||
// Wait for account change to complete, then set other fields
|
||||
setTimeout(() => {
|
||||
if(editData.warehouse){
|
||||
$('#warehouse_id').val(editData.warehouse).trigger('change');
|
||||
|
||||
// gak ada checkbox cicilan
|
||||
$('#is_cicilan_group').addClass('d-none');
|
||||
|
||||
// Wait for warehouse items to load
|
||||
setTimeout(() => {
|
||||
$('#item_select').val(editData.item_id).trigger('change');
|
||||
}, 500);
|
||||
} else {
|
||||
$('#nama_item').val(editData.item);
|
||||
}
|
||||
|
||||
|
||||
$('#qty').val(editData.qty);
|
||||
$('#harga').val(editData.harga);
|
||||
$('#tanggal_input').val(editData.tanggal_input);
|
||||
$('#keterangan').val(editData.keterangan);
|
||||
|
||||
}, 500);
|
||||
|
||||
// if(editData.is_cicilan == 1){
|
||||
// $('#qty').prop('disabled', true);
|
||||
// $('#harga').prop('disabled', true);
|
||||
// $('#is_cicilan').prop('disabled', true);
|
||||
// $('#tenor').prop('disabled', true);
|
||||
// }
|
||||
|
||||
modal.show();
|
||||
});
|
||||
|
||||
// ================= SAVE =================
|
||||
|
||||
// ================= SAVE - FIXED SESUAI STYLE ANDA =================
|
||||
@@ -693,6 +691,7 @@ $(function(){
|
||||
qty: parseFloat($('#qty').val()) || 0,
|
||||
harga: parseFloat($('#harga').val()) || 0,
|
||||
keterangan: $('#keterangan').val().trim(),
|
||||
barcode_id: $('#barcode_select').val() || 0,
|
||||
|
||||
is_cicilan: $('#is_cicilan').is(':checked') ? 1 : 0,
|
||||
tenor: parseInt($('#tenor').val()) || 0,
|
||||
@@ -757,7 +756,7 @@ $(function(){
|
||||
btn.prop('disabled', true).html('Menghapus...');
|
||||
|
||||
$.get({
|
||||
url: "<?= base_url('invoices/delete_item/'); ?>" + id,
|
||||
url: "<?= base_url('invoices/delete_item/'); ?>" + id + "/" + `<?= $no_invoice ?>`,
|
||||
dataType: 'json' // ✅ FIXED
|
||||
})
|
||||
.done(function(res){
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
<!-- MODAL -->
|
||||
<div class="modal fade" id="modalItem">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-dialog modal-dialog-centered modal-xl">
|
||||
<div class="modal-content">
|
||||
|
||||
<div class="modal-header bg-warning text-white">
|
||||
@@ -45,44 +45,146 @@
|
||||
|
||||
<input type="hidden" id="id">
|
||||
|
||||
<div id="group_tanggal">
|
||||
<label>Tanggal Pembelian</label>
|
||||
<input type="date" id="tanggal_beli" class="form-control">
|
||||
</div>
|
||||
|
||||
<div id="group_kode">
|
||||
<label class="mt-2">Kode Barang</label>
|
||||
<select id="kode_barang" class="form-control select-search"></select>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div id="group_tanggal">
|
||||
<label>Tanggal Pembelian</label>
|
||||
<input type="date" id="tanggal_beli" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div id="group_kode">
|
||||
<label class="mt-2">Kode Barang</label>
|
||||
<select id="kode_barang" class="form-control select-search"></select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label>Nama Barang</label>
|
||||
<input type="text" id="nama_barang" class="form-control">
|
||||
|
||||
<div id="group_qty">
|
||||
<label class="mt-2">Jumlah Barang</label>
|
||||
<input type="number" id="qty" class="form-control">
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
<div id="group_qty">
|
||||
<label class="mt-2">Jumlah Barang</label>
|
||||
<input type="number" id="qty" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<div id="group_tracking_qty">
|
||||
<label class="mt-2">Jml / (Roll, Box, Dus)</label>
|
||||
<input type="number" id="tracking_qty" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="mt-2">Harga Beli</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Rp</span>
|
||||
<input type="text" id="harga_beli" class="form-control format-rupiah">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="mt-2">Harga Jual</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Rp</span>
|
||||
<input type="text" id="harga_jual" class="form-control format-rupiah">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="group_tracking_qty">
|
||||
<label class="mt-2">Jumlah Per (Roll, Box, Dus)</label>
|
||||
<input type="number" id="tracking_qty" class="form-control">
|
||||
</div>
|
||||
|
||||
<label class="mt-2">Harga Beli</label>
|
||||
<input type="text" id="harga_beli" class="form-control format-rupiah">
|
||||
|
||||
<label class="mt-2">Harga Jual</label>
|
||||
<input type="text" id="harga_jual" class="form-control format-rupiah">
|
||||
|
||||
<div id="group_warehouse">
|
||||
<label class="mt-2">Gudang</label>
|
||||
<select id="warehouse_id" class="form-control"></select>
|
||||
</div>
|
||||
|
||||
<div id="group_account">
|
||||
<!-- <div class="row">
|
||||
<label class="mt-2">Akun Kas</label>
|
||||
<select id="account_kas" class="form-control"></select>
|
||||
<div class="col-md-7">
|
||||
<div id="group_account">
|
||||
<select id="account_kas" class="form-control"></select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-5">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Rp</span>
|
||||
<input type="text" id="account[]" class="form-control format-rupiah">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn btn-warning btn-sm mt-4">Tambah Account</button> -->
|
||||
|
||||
<hr>
|
||||
<label class="font-weight-bold">
|
||||
Pembayaran
|
||||
</label>
|
||||
<div id="accountContainer">
|
||||
<div class="row account-row mb-2">
|
||||
<div class="col-md-6">
|
||||
<select
|
||||
name="account_kas[]"
|
||||
class="form-control account_kas">
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Rp</span>
|
||||
<input
|
||||
type="text"
|
||||
name="nominal[]"
|
||||
class="form-control nominal format-rupiah">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-sm btn-danger btn-remove-account w-100"
|
||||
disabled>
|
||||
Hapus
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<button
|
||||
type="button"
|
||||
id="btnTambahAccount"
|
||||
class="btn btn-warning btn-sm">
|
||||
+ Tambah Account
|
||||
</button>
|
||||
</div>
|
||||
<div class="mt-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<!-- total qty * harga beli -->
|
||||
<h5>
|
||||
Total :
|
||||
<span id="totalHppBarang">
|
||||
Rp 0
|
||||
</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<!-- total accounting -->
|
||||
<h5>
|
||||
Total :
|
||||
<span id="totalAccount">
|
||||
Rp 0
|
||||
</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<!-- balance accounting + total hpp barang -->
|
||||
<h5>
|
||||
Total :
|
||||
<span id="totalAll">
|
||||
Rp 0
|
||||
</span>
|
||||
</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
@@ -94,59 +196,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- MODAL BARANAG KELUAR -->
|
||||
<div class="modal fade" id="modalKeluar">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
|
||||
<div class="modal-header bg-danger text-white">
|
||||
<h5>Barang Keluar</h5>
|
||||
</div>
|
||||
|
||||
<div class="modal-body">
|
||||
|
||||
<div id="group_account_biaya">
|
||||
<label class="mt-2">Akun Biaya</label>
|
||||
<select id="account_biaya" class="form-control"></select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label>Tanggal</label>
|
||||
<input type="date" id="tanggal_keluar" class="form-control">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="mt-2">Gudang</label>
|
||||
<select id="warehouse_id_keluar" class="form-control"></select>
|
||||
</div>
|
||||
|
||||
<div class="d-none" id="group_barang_keluar">
|
||||
<label class="mt-2">Barang</label>
|
||||
<select id="barang_id" class="form-control select-search"></select>
|
||||
</div>
|
||||
|
||||
<div class="d-none" id="group_qty_keluar">
|
||||
<label class="mt-2">Jumlah Barang</label>
|
||||
<input type="number" id="qty_keluar" class="form-control">
|
||||
</div>
|
||||
|
||||
<div class="mb-2 d-none" id="group_keterangan">
|
||||
<label for="keterangan" class="form-label">Keterangan</label>
|
||||
<textarea class="form-control" id="keterangan_keluar" rows="3"></textarea>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-danger" id="btnKeluar">Keluarkan</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- MODAL DETAIL -->
|
||||
<div class="modal fade" id="modalDetail">
|
||||
<div class="modal-dialog modal-lg">
|
||||
@@ -163,46 +212,13 @@
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="modal fade" id="modalAdjust">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
|
||||
<div class="modal-header bg-warning">
|
||||
<h5>Penyesuaian Stok</h5>
|
||||
</div>
|
||||
|
||||
<div class="modal-body">
|
||||
|
||||
<input type="hidden" id="adjust_item_id">
|
||||
|
||||
<label>Qty Adjustment</label>
|
||||
<input type="number" id="adjust_qty" class="form-control">
|
||||
<small>Gunakan minus (-) jika mengurangi</small>
|
||||
|
||||
<label class="mt-2">Gudang</label>
|
||||
<select id="adjust_warehouse" class="form-control"></select>
|
||||
|
||||
<label class="mt-2">Keterangan</label>
|
||||
<input type="text" id="adjust_ket" class="form-control">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-warning" id="btnAdjust">Simpan</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
$(function(){
|
||||
|
||||
let action = 'add';
|
||||
let selectedItemId = null;
|
||||
let accountOption = '';
|
||||
|
||||
// ================= DATATABLE =================
|
||||
let table = $('#tableItems').DataTable({
|
||||
@@ -215,24 +231,26 @@ let table = $('#tableItems').DataTable({
|
||||
});
|
||||
|
||||
// ================= LOAD AKUN KAS =================
|
||||
// function loadKas(){
|
||||
// $.get("<?= base_url('items/get_accounts'); ?>",res=>{
|
||||
// let opt='<option value="">-- PILIH KAS --</option>';
|
||||
// res.forEach(a=>{
|
||||
// opt += `<option value="${a.id}">${a.nama_akun}</option>`;
|
||||
// });
|
||||
// $('#account_kas').html(opt);
|
||||
// },'json');
|
||||
// }
|
||||
function loadKas(){
|
||||
$.get("<?= base_url('items/get_accounts'); ?>",res=>{
|
||||
let opt='<option value="">-- PILIH KAS --</option>';
|
||||
res.forEach(a=>{
|
||||
opt += `<option value="${a.id}">${a.nama_akun}</option>`;
|
||||
$.get("<?= base_url('items/get_accounts'); ?>",function(res){
|
||||
accountOption = '<option value="">-- PILIH KAS --</option>';
|
||||
res.forEach(function(a){
|
||||
accountOption += `
|
||||
<option value="${a.id}">
|
||||
${a.nama_akun}
|
||||
</option>
|
||||
`;
|
||||
});
|
||||
$('#account_kas').html(opt);
|
||||
},'json');
|
||||
}
|
||||
|
||||
// ================= LOAD AKUN KAS =================
|
||||
function loadKasOut(){
|
||||
$.get("<?= base_url('items/get_accounts_biaya'); ?>",res=>{
|
||||
let opt='<option value="">-- PILIH KAS --</option>';
|
||||
res.forEach(a=>{
|
||||
opt += `<option value="${a.id}">${a.nama_akun}</option>`;
|
||||
});
|
||||
$('#account_biaya').html(opt);
|
||||
$('.account_kas').html(accountOption);
|
||||
},'json');
|
||||
}
|
||||
|
||||
@@ -246,26 +264,6 @@ function loadGudang(){
|
||||
$('#warehouse_id, #adjust_warehouse').html(opt);
|
||||
},'json');
|
||||
}
|
||||
// ================= LOAD GUDANG =================
|
||||
function loadGudangList(){
|
||||
$.get("<?= base_url('warehouses/list'); ?>",res=>{
|
||||
let opt='<option value="">-- PILIH GUDANG --</option>';
|
||||
res.forEach(w=>{
|
||||
opt += `<option value="${w.id}">${w.nama}</option>`;
|
||||
});
|
||||
$('#warehouse_id_keluar').html(opt);
|
||||
},'json');
|
||||
}
|
||||
|
||||
// function loadKode(){
|
||||
// $.get("<?= base_url('kodebarang/list'); ?>",res=>{
|
||||
// let opt='<option value="">-- PILIH KODE --</option>';
|
||||
// res.forEach(a=>{
|
||||
// opt += `<option value="${a.id}" data-type="${a.tracking_type}">${a.kode_barang} - ${a.nama}</option>`;
|
||||
// });
|
||||
// $('#kode_barang').html(opt);
|
||||
// },'json');
|
||||
// }
|
||||
|
||||
function loadKode() {
|
||||
$.get("<?= base_url('kodebarang/list'); ?>", function(res) {
|
||||
@@ -285,6 +283,40 @@ function loadKode() {
|
||||
}, 'json');
|
||||
}
|
||||
|
||||
function addAccountRow(){
|
||||
let html = `
|
||||
<div class="row account-row mb-2">
|
||||
<div class="col-md-6">
|
||||
<select
|
||||
name="account_kas[]"
|
||||
class="form-control account_kas">
|
||||
${accountOption}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">
|
||||
Rp
|
||||
</span>
|
||||
<input
|
||||
type="text"
|
||||
name="nominal[]"
|
||||
class="form-control nominal format-rupiah">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-sm btn-danger btn-remove-account w-100">
|
||||
Hapus
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
$('#accountContainer').append(html);
|
||||
hitungTotal();
|
||||
}
|
||||
|
||||
$(document).on('change', '#kode_barang', function () {
|
||||
|
||||
let type = $(this).find(':selected').data('type');
|
||||
@@ -298,6 +330,39 @@ $(document).on('change', '#kode_barang', function () {
|
||||
|
||||
});
|
||||
|
||||
$('#btnTambahAccount').click(function(){
|
||||
addAccountRow();
|
||||
});
|
||||
|
||||
$(document).on('click','.btn-remove-account',function(){
|
||||
$(this).closest('.account-row').remove();
|
||||
hitungTotal();
|
||||
});
|
||||
|
||||
// function hitungTotal(){
|
||||
// let total = 0;
|
||||
// $('.nominal').each(function(){
|
||||
// let angka = $(this)
|
||||
// .val()
|
||||
// .replace(/\./g,'')
|
||||
// .replace(/,/g,'');
|
||||
// total += Number(angka || 0);
|
||||
// });
|
||||
// $('#totalAccount').text(formatRupiah(total.toString()));
|
||||
// }
|
||||
|
||||
$(document).on('keyup','.nominal',function(){
|
||||
hitungTotal();
|
||||
});
|
||||
|
||||
$(document).on('keyup','#harga_beli',function(){
|
||||
hitungTotal();
|
||||
});
|
||||
|
||||
$(document).on('keyup change','#qty',function(){
|
||||
hitungTotal();
|
||||
});
|
||||
|
||||
// ================= RESET FORM =================
|
||||
function resetForm(){
|
||||
$('#id').val('');
|
||||
@@ -308,6 +373,42 @@ function resetForm(){
|
||||
$('#tanggal_beli').val('');
|
||||
$('#tracking_qty').val('');
|
||||
$('#group_tracking_qty').hide();
|
||||
$('#accountContainer').html(`
|
||||
<div class="row account-row mb-2">
|
||||
<div class="col-md-6">
|
||||
<select
|
||||
name="account_kas[]"
|
||||
class="form-control account_kas">
|
||||
${accountOption}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Rp</span>
|
||||
<input
|
||||
type="text"
|
||||
name="nominal[]"
|
||||
class="form-control nominal format-rupiah">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<button
|
||||
class="btn btn-sm btn-danger btn-remove-account w-100"
|
||||
disabled>
|
||||
Hapus
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
`);
|
||||
$('#totalAccount').text('Rp 0');
|
||||
$('#totalHppBarang').text('Rp 0');
|
||||
|
||||
$('#totalAll')
|
||||
.text('Balance')
|
||||
.removeClass('text-danger')
|
||||
.addClass('text-success');
|
||||
|
||||
$('#btnSimpan').prop('disabled',true);
|
||||
}
|
||||
|
||||
// ================= INIT LOAD =================
|
||||
@@ -362,6 +463,40 @@ $('#btnSimpan').click(function(){
|
||||
|
||||
let btn = $(this);
|
||||
|
||||
let qtys = parseFloat($('#qty').val()) || 0;
|
||||
|
||||
let totalHpp = qtys * rupiahToNumber($('#harga_beli').val());
|
||||
|
||||
let totalAccount = 0;
|
||||
|
||||
$('.nominal').each(function(){
|
||||
|
||||
totalAccount += rupiahToNumber($(this).val());
|
||||
|
||||
});
|
||||
|
||||
if(totalHpp != totalAccount){
|
||||
|
||||
Swal.fire({
|
||||
icon:'warning',
|
||||
title:'Belum Balance',
|
||||
text:'Total pembayaran harus sama dengan Total Harga Beli.'
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
let account = [];
|
||||
$('.account-row').each(function(){
|
||||
account.push({
|
||||
account_id: $(this).find('.account_kas').val(),
|
||||
nominal: $(this)
|
||||
.find('.nominal')
|
||||
.val()
|
||||
});
|
||||
});
|
||||
// data.accounts = account;
|
||||
|
||||
let data = {
|
||||
id: $('#id').val(),
|
||||
kode_id: $('#kode_barang').val(),
|
||||
@@ -370,7 +505,8 @@ $('#btnSimpan').click(function(){
|
||||
harga_beli: $('#harga_beli').val(),
|
||||
harga_jual: $('#harga_jual').val(),
|
||||
warehouse_id: $('#warehouse_id').val(),
|
||||
account_kas: $('#account_kas').val(),
|
||||
// account_kas: $('#account_kas').val(),
|
||||
account_kas: account,
|
||||
tanggal_beli: $('#tanggal_beli').val(),
|
||||
tracking_qty: $('#tracking_qty').val(),
|
||||
status: `draft`
|
||||
@@ -423,122 +559,6 @@ $('#btnSimpan').click(function(){
|
||||
|
||||
});
|
||||
|
||||
// =====================================================
|
||||
// ================= START URUSAN KELUAR ===============
|
||||
// =====================================================
|
||||
|
||||
// ================= RESET FORM KELUAR =================
|
||||
function resetFormKeluar(){
|
||||
$('#tanggal_keluar').val('');
|
||||
$('#qty_keluar').val('');
|
||||
$('#keterangan_keluar').val('');
|
||||
}
|
||||
|
||||
loadKasOut();
|
||||
loadGudangList();
|
||||
// ================= BARANG KELUAR ================= account_biaya warehouse_id barang_id
|
||||
$('.btn-out').click(function(){
|
||||
// action='add';
|
||||
resetFormKeluar();
|
||||
|
||||
$('#warehouse_id').closest('div').show();
|
||||
$('#account_biaya').closest('div').show();
|
||||
$('#modalKeluar').modal('show');
|
||||
|
||||
loadGudangList();
|
||||
loadKasOut();
|
||||
});
|
||||
|
||||
$('#warehouse_id_keluar').on('change', function(){
|
||||
let warehouse_id = $(this).val();
|
||||
|
||||
// $('#wrap_item_select').addClass('d-none');
|
||||
$('#barang_id').html('<option value="">Loading...</option>');
|
||||
|
||||
loadItems(warehouse_id);
|
||||
});
|
||||
|
||||
// ================= ITEMS =================
|
||||
function loadItems(warehouse_id){
|
||||
return $.get("<?= base_url('items/get_items_by_wh_id/'); ?>" + warehouse_id, function(res){
|
||||
if(res && res.length){
|
||||
let opt = '<option value="">-- PILIH BARANG --</option>';
|
||||
res.forEach(i=>{
|
||||
opt += `<option value="${i.id}">
|
||||
${i.kode_detail} - ${i.nama_barang} (Stok: ${i.stok})
|
||||
</option>`;
|
||||
});
|
||||
$('#barang_id').html(opt);
|
||||
$('#group_barang_keluar').removeClass('d-none');
|
||||
$('#group_qty_keluar').removeClass('d-none');
|
||||
$('#group_keterangan').removeClass('d-none');
|
||||
} else {
|
||||
$('#barang_id').html(opt);
|
||||
}
|
||||
}, 'json');
|
||||
}
|
||||
|
||||
// ================= SAVE =================
|
||||
$('#btnKeluar').click(function(){
|
||||
|
||||
let btn = $(this);
|
||||
|
||||
let data = {
|
||||
account_biaya: $('#account_biaya').val(),
|
||||
tanggal_keluar: $('#tanggal_keluar').val(),
|
||||
warehouse_id_keluar: $('#warehouse_id_keluar').val(),
|
||||
barang_id: $('#barang_id').val(),
|
||||
qty_keluar: $('#qty_keluar').val(),
|
||||
keterangan_keluar: $('#keterangan_keluar').val()
|
||||
};
|
||||
|
||||
let url = "<?= base_url('items/keluarkan'); ?>";
|
||||
|
||||
// 🔥 loading state
|
||||
btn.prop('disabled', true).html('Menyimpan...');
|
||||
|
||||
$.post(url, data, function(res){
|
||||
|
||||
if(res.status){
|
||||
|
||||
$('#modalItem').modal('hide');
|
||||
table.ajax.reload(null,false);
|
||||
|
||||
Swal.fire({
|
||||
icon: 'success',
|
||||
title: 'Berhasil',
|
||||
text: res.message || 'Data berhasil disimpan',
|
||||
timer: 1500,
|
||||
showConfirmButton: false
|
||||
});
|
||||
|
||||
}else{
|
||||
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Gagal',
|
||||
text: res.message || 'Terjadi kesalahan'
|
||||
});
|
||||
}
|
||||
|
||||
},'json')
|
||||
.fail(function(){
|
||||
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Error',
|
||||
text: 'Koneksi ke server gagal'
|
||||
});
|
||||
|
||||
})
|
||||
.always(function(){
|
||||
btn.prop('disabled', false).html('Keluarkan');
|
||||
});
|
||||
|
||||
});
|
||||
// =====================================================
|
||||
// ================= END URUSAN KELUAR ===============
|
||||
// =====================================================
|
||||
|
||||
// ================= PRINT BARCODE =================
|
||||
$(document).on('click', '.btn-print', function () {
|
||||
@@ -787,78 +807,75 @@ $(document).on('click','.btn-detail',function(){
|
||||
|
||||
});
|
||||
|
||||
// ================= OPEN ADJUST =================
|
||||
$(document).on('click','.btn-adjust',function(){
|
||||
function rupiahToNumber(value){
|
||||
|
||||
let id = $(this).data('id');
|
||||
if(!value) return 0;
|
||||
|
||||
if(!id){
|
||||
alert('Pilih item dari tabel (gunakan tombol Adjust di baris)');
|
||||
return;
|
||||
}
|
||||
return parseInt(
|
||||
value.toString()
|
||||
.replace(/[^\d]/g,'')
|
||||
) || 0;
|
||||
|
||||
selectedItemId = id;
|
||||
$('#adjust_item_id').val(id);
|
||||
$('#adjust_qty').val('');
|
||||
$('#adjust_ket').val('');
|
||||
}
|
||||
|
||||
$('#modalAdjust').modal('show');
|
||||
});
|
||||
function hitungTotal(){
|
||||
|
||||
// ================= SAVE ADJUST =================
|
||||
$('#btnAdjust').click(function(){
|
||||
// ==========================
|
||||
// HPP BARANG
|
||||
// ==========================
|
||||
|
||||
let btn = $(this);
|
||||
let qty = parseFloat($('#qty').val()) || 0;
|
||||
let hargaBeli = rupiahToNumber($('#harga_beli').val());
|
||||
|
||||
let data = {
|
||||
item_id: $('#adjust_item_id').val(),
|
||||
qty: $('#adjust_qty').val(),
|
||||
warehouse_id: $('#adjust_warehouse').val(),
|
||||
keterangan: $('#adjust_ket').val()
|
||||
};
|
||||
let totalHpp = qty * hargaBeli;
|
||||
|
||||
// 🔥 loading state
|
||||
btn.prop('disabled', true).html('Menyimpan...');
|
||||
|
||||
$.post("<?= base_url('items/adjust'); ?>", data, function(res){
|
||||
// ==========================
|
||||
// ACCOUNTING
|
||||
// ==========================
|
||||
|
||||
if(res.status){
|
||||
let totalAccount = 0;
|
||||
|
||||
$('#modalAdjust').modal('hide');
|
||||
table.ajax.reload(null,false);
|
||||
$('.nominal').each(function(){
|
||||
|
||||
Swal.fire({
|
||||
icon: 'success',
|
||||
title: 'Berhasil',
|
||||
text: res.message || 'Stok berhasil disesuaikan',
|
||||
timer: 1500,
|
||||
showConfirmButton: false
|
||||
});
|
||||
totalAccount += rupiahToNumber($(this).val());
|
||||
|
||||
}else{
|
||||
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Gagal',
|
||||
text: res.message || 'Gagal melakukan penyesuaian'
|
||||
});
|
||||
}
|
||||
|
||||
},'json')
|
||||
.fail(function(){
|
||||
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Error',
|
||||
text: 'Koneksi ke server gagal'
|
||||
});
|
||||
|
||||
})
|
||||
.always(function(){
|
||||
btn.prop('disabled', false).html('Simpan');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
// ==========================
|
||||
// BALANCE
|
||||
// ==========================
|
||||
|
||||
let balance = totalAccount - totalHpp;
|
||||
|
||||
|
||||
$('#totalHppBarang').text(formatRupiah(totalHpp.toString()));
|
||||
$('#totalAccount').text(formatRupiah(totalAccount.toString()));
|
||||
|
||||
if(balance == 0){
|
||||
|
||||
$('#totalAll')
|
||||
.removeClass('text-danger')
|
||||
.addClass('text-success')
|
||||
.text('Balance');
|
||||
|
||||
$('#btnSimpan').prop('disabled',false);
|
||||
|
||||
}else{
|
||||
|
||||
let prefix = balance > 0 ? '+' : '-';
|
||||
|
||||
$('#totalAll')
|
||||
.removeClass('text-success')
|
||||
.addClass('text-danger')
|
||||
.text(prefix + ' ' + formatRupiah(Math.abs(balance).toString()));
|
||||
|
||||
$('#btnSimpan').prop('disabled',true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,406 @@
|
||||
<style>
|
||||
body {
|
||||
background: #f5f7fb;
|
||||
}
|
||||
|
||||
/* ===========================
|
||||
CARD
|
||||
=========================== */
|
||||
.main-card,
|
||||
.scanner-card,
|
||||
.table-card {
|
||||
border: none;
|
||||
border-radius: 18px;
|
||||
overflow: hidden;
|
||||
/*box-shadow: 0 8px 25px rgba(0, 0, 0, .08);*/
|
||||
}
|
||||
|
||||
/* ===========================
|
||||
HEADER
|
||||
=========================== */
|
||||
.header-gradient {
|
||||
background: linear-gradient(135deg, #f59e0b, #d97706);
|
||||
color: #fff;
|
||||
padding: 22px 28px;
|
||||
}
|
||||
|
||||
.info-box {
|
||||
background: rgba(255,255,255,.18);
|
||||
border-radius: 12px;
|
||||
padding: 12px 16px;
|
||||
}
|
||||
|
||||
.progress {
|
||||
height: 8px;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
/* ===========================
|
||||
SCANNER
|
||||
=========================== */
|
||||
.barcode-avatar {
|
||||
width: 110px;
|
||||
height: 110px;
|
||||
margin: auto;
|
||||
border-radius: 50%;
|
||||
background: #fff7e6;
|
||||
color: #f59e0b;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 45px;
|
||||
}
|
||||
|
||||
.barcode-code {
|
||||
font-size: 22px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
.form-control-lg {
|
||||
height: 60px;
|
||||
font-size: 22px;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
border-color: #f59e0b;
|
||||
box-shadow: 0 0 0 .2rem rgba(245, 158, 11, .2);
|
||||
}
|
||||
|
||||
.scan-note {
|
||||
color: #6c757d;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.camera-btn {
|
||||
height: 55px;
|
||||
border-radius: 12px;
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
/* ===========================
|
||||
TABLE
|
||||
=========================== */
|
||||
.table thead th {
|
||||
background: #d97706;
|
||||
color: #fff;
|
||||
border: none;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.table tbody td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.table tbody tr:hover {
|
||||
background: #fffaf0;
|
||||
}
|
||||
|
||||
/* ===========================
|
||||
BADGE
|
||||
=========================== */
|
||||
.badge-success-soft {
|
||||
display: inline-block;
|
||||
padding: 6px 14px;
|
||||
border-radius: 30px;
|
||||
background: #d1fae5;
|
||||
color: #065f46;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.badge-danger-soft {
|
||||
display: inline-block;
|
||||
padding: 6px 14px;
|
||||
border-radius: 30px;
|
||||
background: #fee2e2;
|
||||
color: #991b1b;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.badge-warning-soft {
|
||||
display: inline-block;
|
||||
padding: 6px 14px;
|
||||
border-radius: 30px;
|
||||
background: #fef3c7;
|
||||
color: #92400e;
|
||||
font-weight: 600;
|
||||
}
|
||||
#reader{
|
||||
width:100%;
|
||||
min-height:280px;
|
||||
border-radius:12px;
|
||||
overflow:hidden;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="container mt-4">
|
||||
<div class="card main-card">
|
||||
<!-- HEADER -->
|
||||
<div class="header-gradient">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-md-8">
|
||||
<h3 class="mb-1">
|
||||
<i class="fa fa-barcode"></i>
|
||||
Riwayat Perpindahan Barang
|
||||
</h3>
|
||||
<div class="small">
|
||||
Silahkan scan / input QR id Barang
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 text-right">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- BODY -->
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<!-- LEFT -->
|
||||
<div class="col-lg-4 mb-4">
|
||||
<div class="card scanner-card">
|
||||
<div class="card-body">
|
||||
<div class="barcode-avatar">
|
||||
<i class="bi bi-qr-code-scan"></i>
|
||||
</div>
|
||||
<div class="text-center mt-3">
|
||||
<div class="scan-note mt-2">
|
||||
Scan QR ID
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
|
||||
<center>
|
||||
<div id="scannerArea">
|
||||
|
||||
<input
|
||||
type="text"
|
||||
id="serial_number"
|
||||
class="form-control form-control-lg text-center"
|
||||
placeholder="Scan / Input QR ID"
|
||||
autocomplete="off"
|
||||
autofocus>
|
||||
|
||||
<small class="scan-note">
|
||||
Scanner akan otomatis memanggil riwayat.
|
||||
</small>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-warning btn-block camera-btn mt-4"
|
||||
id="btnCamera">
|
||||
|
||||
<i class="fa fa-camera mr-2"></i>
|
||||
Scan dengan Kamera
|
||||
|
||||
</button>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="cameraArea" style="display:none;">
|
||||
|
||||
<div id="reader"></div>
|
||||
|
||||
<small class="scan-note d-block mt-2">
|
||||
Arahkan QR Code ke kamera.
|
||||
</small>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-secondary btn-block mt-3"
|
||||
id="btnCloseCamera">
|
||||
|
||||
Tutup Kamera
|
||||
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</center>
|
||||
<input type="hidden" id="barcode_id">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- RIGHT -->
|
||||
<div class="col-lg-8">
|
||||
<div class="card table-card">
|
||||
<div class="card-header bg-white">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h5 class="mb-0">
|
||||
Riwayat Perpindahan Barang
|
||||
</h5>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body border-bottom" id="itemInfo">
|
||||
Belum ada data
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
|
||||
<table class="table table-hover mb-0" id="tableBarcode">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="60">No</th>
|
||||
<th>Date</th>
|
||||
<th>Type</th>
|
||||
<th>From</th>
|
||||
<th>To</th>
|
||||
<th>NOtes</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
$("#serial_number").keypress(function(e){
|
||||
if(e.which==13){
|
||||
searchHistory();
|
||||
}
|
||||
});
|
||||
function searchHistory(){
|
||||
let barcode=$("#serial_number").val().trim();
|
||||
if(barcode=="") return;
|
||||
$.ajax({
|
||||
url: `<?= base_url("items/scan_history"); ?>`,
|
||||
type:"POST",
|
||||
dataType:"json",
|
||||
data:{
|
||||
barcode:barcode
|
||||
},
|
||||
beforeSend:function(){
|
||||
$("#serial_number").prop("disabled",true);
|
||||
},
|
||||
success:function(r){
|
||||
$("#serial_number")
|
||||
.prop("disabled",false)
|
||||
.val("")
|
||||
.focus();
|
||||
if(!r.status){
|
||||
Swal.fire({
|
||||
icon:"error",
|
||||
text:r.message
|
||||
});
|
||||
return;
|
||||
}
|
||||
renderItem(r.item);
|
||||
renderHistory(r.history);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function renderItem(item){
|
||||
let html='';
|
||||
|
||||
html+='<div class="row">';
|
||||
|
||||
html+=' <div class="col-md-6">';
|
||||
|
||||
html+=' <h4 class="mb-3"><b>'+item.nama_barang+'</b></h4>';
|
||||
|
||||
html+=' <div class="row mb-2">';
|
||||
html+=' <div class="col-4 font-weight-bold">Kode</div>';
|
||||
html+=' <div class="col-1">:</div>';
|
||||
html+=' <div class="col-7">'+item.kode_detail+'</div>';
|
||||
html+=' </div>';
|
||||
|
||||
html+=' <div class="row mb-2">';
|
||||
html+=' <div class="col-4 font-weight-bold">Barcode</div>';
|
||||
html+=' <div class="col-1">:</div>';
|
||||
html+=' <div class="col-7">'+item.barcode+'</div>';
|
||||
html+=' </div>';
|
||||
|
||||
html+=' </div>';
|
||||
|
||||
html+=' <div class="col-md-6">';
|
||||
|
||||
html+=' <div class="row mb-2">';
|
||||
html+=' <div class="col-4 font-weight-bold">Serial Number</div>';
|
||||
html+=' <div class="col-1">:</div>';
|
||||
html+=' <div class="col-7">'+(item.serial_number ? item.serial_number : '-')+'</div>';
|
||||
html+=' </div>';
|
||||
|
||||
html+=' <div class="row mb-2">';
|
||||
html+=' <div class="col-4 font-weight-bold">Status</div>';
|
||||
html+=' <div class="col-1">:</div>';
|
||||
html+=' <div class="col-7">'+item.status+'</div>';
|
||||
html+=' </div>';
|
||||
|
||||
html+=' <div class="row mb-2">';
|
||||
html+=' <div class="col-4 font-weight-bold">Qty</div>';
|
||||
html+=' <div class="col-1">:</div>';
|
||||
html+=' <div class="col-7">'+item.qty_sisa+' / '+item.qty_awal+'</div>';
|
||||
html+=' </div>';
|
||||
|
||||
html+=' </div>';
|
||||
|
||||
html+='</div>';
|
||||
|
||||
$("#itemInfo").html(html);
|
||||
}
|
||||
|
||||
function renderHistory(list){
|
||||
let html='';
|
||||
$.each(list,function(i,v){
|
||||
html+="<tr>";
|
||||
html+="<td>"+(i+1)+"</td>";
|
||||
html+="<td>"+v.created_at+"</td>";
|
||||
html+="<td>"+v.movement_type+"</td>";
|
||||
html+="<td>"+(v.from_warehouse??v.from_type)+"</td>";
|
||||
html+="<td>"+(v.to_warehouse??v.to_type)+"</td>";
|
||||
html+="<td>"+v.notes+"</td>";
|
||||
html+="</tr>";
|
||||
});
|
||||
$("#tableBarcode tbody").html(html);
|
||||
}
|
||||
|
||||
|
||||
let html5QrCode=null;
|
||||
$("#btnCamera").click(function(){
|
||||
$("#scannerArea").hide();
|
||||
$("#cameraArea").show();
|
||||
html5QrCode=new Html5Qrcode("reader");
|
||||
html5QrCode.start(
|
||||
{
|
||||
facingMode:"environment"
|
||||
},
|
||||
{
|
||||
fps:10,
|
||||
qrbox:220
|
||||
},
|
||||
function(decodedText){
|
||||
html5QrCode.stop().then(function(){
|
||||
$("#cameraArea").hide();
|
||||
$("#scannerArea").show();
|
||||
$("#serial_number")
|
||||
.val(decodedText);
|
||||
saveSerial();
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
$("#btnCloseCamera").click(function(){
|
||||
if(html5QrCode){
|
||||
html5QrCode.stop().then(function(){
|
||||
$("#cameraArea").hide();
|
||||
$("#scannerArea").show();
|
||||
$("#serial_number").focus();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
+306
-123
@@ -108,12 +108,12 @@
|
||||
type="text"
|
||||
id="serial_number"
|
||||
class="form-control form-control-lg text-center"
|
||||
placeholder="Scan QR Barang"
|
||||
placeholder="Scan Barcode / Serial Number / Nama Barang"
|
||||
autocomplete="off"
|
||||
autofocus>
|
||||
|
||||
<small class="scan-note">
|
||||
Scanner akan otomatis menyimpan.
|
||||
Scan atau ketik Barcode / Serial Number / Nama Barang, lalu Enter.
|
||||
</small><br>
|
||||
|
||||
<button
|
||||
@@ -147,7 +147,9 @@
|
||||
|
||||
</div>
|
||||
</center>
|
||||
<div id="tableBarcode"></div>
|
||||
<div style="max-height: 200px; overflow: auto;">
|
||||
<div class="mt-2" id="tableBarcode"></div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id="group_account_biaya">
|
||||
@@ -246,29 +248,53 @@
|
||||
// URUSAN BARCODE INPUT DAN CAMSCANNER
|
||||
let daftarBarang = [];
|
||||
let isSaving = false;
|
||||
let searchTimer = null;
|
||||
|
||||
$(document).ready(function () {
|
||||
$("#serial_number").focus();
|
||||
$("#serial_number").keypress(function(e){
|
||||
|
||||
$("#serial_number").on("keypress", function(e){
|
||||
if(e.which==13){
|
||||
e.preventDefault();
|
||||
if(searchTimer){
|
||||
clearTimeout(searchTimer);
|
||||
}
|
||||
if(!isSaving){
|
||||
getBarcodeId();
|
||||
getBarcodeId(true);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$("#serial_number").on("input", function(){
|
||||
let keyword = ($(this).val() || "").trim();
|
||||
|
||||
if(searchTimer){
|
||||
clearTimeout(searchTimer);
|
||||
}
|
||||
|
||||
if(keyword === ""){
|
||||
daftarBarang = [];
|
||||
renderTable();
|
||||
return;
|
||||
}
|
||||
|
||||
searchTimer = setTimeout(function(){
|
||||
if(!isSaving){
|
||||
getBarcodeId(false);
|
||||
}
|
||||
}, 300);
|
||||
});
|
||||
});
|
||||
|
||||
function getBarcodeId(){
|
||||
function getBarcodeId(isScanner = false){
|
||||
let barcode = ($("#serial_number").val() || "").trim();
|
||||
if(barcode==""){
|
||||
return;
|
||||
}
|
||||
|
||||
$.post(
|
||||
"<?=base_url('items/get_barcode_item');?>",
|
||||
{
|
||||
barcode:barcode
|
||||
},
|
||||
{ barcode: barcode },
|
||||
function(r){
|
||||
if(!r.status){
|
||||
Swal.fire({
|
||||
@@ -279,99 +305,174 @@ function getBarcodeId(){
|
||||
$("#serial_number").val("").focus();
|
||||
return;
|
||||
}
|
||||
let exist = daftarBarang.find(function(v){
|
||||
return v.barcode_id == r.data.barcode_id;
|
||||
});
|
||||
|
||||
if(exist){
|
||||
let rows = Array.isArray(r.data) ? r.data : [];
|
||||
if(rows.length === 0){
|
||||
Swal.fire({
|
||||
icon: "warning",
|
||||
title: "Barcode sudah discan",
|
||||
timer: 1000,
|
||||
showConfirmButton: false
|
||||
icon:"warning",
|
||||
title:"Data kosong",
|
||||
text:"Tidak ada barang yang cocok."
|
||||
});
|
||||
|
||||
$("#serial_number").val("").focus();
|
||||
return;
|
||||
}
|
||||
|
||||
daftarBarang.push(r.data);
|
||||
daftarBarang = rows;
|
||||
renderTable();
|
||||
$("#serial_number").val("").focus();
|
||||
|
||||
if(isScanner){
|
||||
$("#serial_number").val("").focus();
|
||||
}
|
||||
},
|
||||
"json"
|
||||
);
|
||||
}
|
||||
|
||||
function renderTable(){
|
||||
function renderTable() {
|
||||
|
||||
let html='';
|
||||
let html = '';
|
||||
|
||||
html+='<div class="table-responsive">';
|
||||
html+='<table class="table table-bordered table-hover table-sm mb-0">';
|
||||
html+='<thead>';
|
||||
html+='<tr>';
|
||||
html+='<th width="50">No</th>';
|
||||
html+='<th width="180">Barcode</th>';
|
||||
html+='<th width="150">Kode Barang</th>';
|
||||
html+='<th>Nama Barang</th>';
|
||||
html+='<th width="180">Serial Number</th>';
|
||||
html+='<th width="80" class="text-center">Action</th>';
|
||||
html+='</tr>';
|
||||
html+='</thead>';
|
||||
html+='<tbody>';
|
||||
html += '<div class="table-responsive">';
|
||||
html += '<table class="table table-bordered table-hover table-sm mb-0">';
|
||||
html += '<thead>';
|
||||
html += '<tr>';
|
||||
html += '<th width="50">No</th>';
|
||||
html += '<th width="180">Barcode</th>';
|
||||
html += '<th width="120">Kode Barang</th>';
|
||||
html += '<th>Nama Barang</th>';
|
||||
html += '<th width="180">Serial Number</th>';
|
||||
html += '<th width="70" class="text-center">Pilih</th>';
|
||||
html += '</tr>';
|
||||
html += '</thead>';
|
||||
html += '<tbody>';
|
||||
|
||||
if(daftarBarang.length==0){
|
||||
if (daftarBarang.length == 0) {
|
||||
|
||||
html+='<tr>';
|
||||
html+='<td colspan="6" class="text-center text-muted py-4">';
|
||||
html+='Belum ada barcode yang discan.';
|
||||
html+='</td>';
|
||||
html+='</tr>';
|
||||
html += `
|
||||
<tr>
|
||||
<td colspan="6" class="text-center text-muted py-4">
|
||||
Belum ada barang yang discan.
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
|
||||
}else{
|
||||
} else {
|
||||
|
||||
$.each(daftarBarang,function(i,v){
|
||||
$.each(daftarBarang, function (i, v) {
|
||||
|
||||
html+='<tr>';
|
||||
html+='<td>'+(i+1)+'</td>';
|
||||
html+='<td><strong>'+v.barcode+'</strong></td>';
|
||||
html+='<td>'+v.kode_detail+'</td>';
|
||||
html+='<td>'+v.nama_barang+'</td>';
|
||||
html+='<td>'+(v.serial_number?v.serial_number:'-')+'</td>';
|
||||
html+='<td class="text-center">';
|
||||
html+='<button class="btn btn-sm btn-outline-danger btnRemove" data-id="'+v.barcode_id+'">';
|
||||
html+='<i class="bi bi-trash"></i>';
|
||||
html+='</button>';
|
||||
html+='</td>';
|
||||
html+='</tr>';
|
||||
html += `
|
||||
<tr>
|
||||
<td>${i + 1}</td>
|
||||
<td><strong>${v.barcode}</strong></td>
|
||||
<td>${v.kode_detail}</td>
|
||||
<td>${v.nama_barang}</td>
|
||||
<td>${v.serial_number ? v.serial_number : '-'}</td>
|
||||
|
||||
<td class="text-center align-middle">
|
||||
<div class="form-check d-flex justify-content-center mb-0">
|
||||
<input
|
||||
class="form-check-input pilihBarang"
|
||||
type="checkbox"
|
||||
value="${v.barcode_id}"
|
||||
data-barcode="${v.barcode}">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
html+='</tbody>';
|
||||
html+='</table>';
|
||||
html+='</div>';
|
||||
html += '</tbody>';
|
||||
html += '</table>';
|
||||
html += '</div>';
|
||||
|
||||
$("#tableBarcode").html(html);
|
||||
$('#tableBarcode').html(html);
|
||||
|
||||
if (daftarBarang.length === 1) {
|
||||
$(".pilihBarang").prop("checked", false);
|
||||
$(".pilihBarang").first().prop("checked", true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$(document).on("click",".btnRemove",function(){
|
||||
// function renderTable(){
|
||||
|
||||
let id=$(this).data("id");
|
||||
// let html='';
|
||||
|
||||
daftarBarang=daftarBarang.filter(function(v){
|
||||
return v.barcode_id!=id;
|
||||
});
|
||||
// html+='<div class="table-responsive">';
|
||||
// html+='<table class="table table-bordered table-hover table-sm mb-0">';
|
||||
// html+='<thead>';
|
||||
// html+='<tr>';
|
||||
// html+='<th width="50">No</th>';
|
||||
// html+='<th width="180">Barcode</th>';
|
||||
// html+='<th width="150">Kode Barang</th>';
|
||||
// html+='<th>Nama Barang</th>';
|
||||
// html+='<th width="180">Serial Number</th>';
|
||||
// html+='<th width="80" class="text-center">Action</th>';
|
||||
// html+='</tr>';
|
||||
// html+='</thead>';
|
||||
// html+='<tbody>';
|
||||
|
||||
renderTable();
|
||||
// if(daftarBarang.length==0){
|
||||
|
||||
$("#serial_number").focus();
|
||||
// html+='<tr>';
|
||||
// html+='<td colspan="6" class="text-center text-muted py-4">';
|
||||
// html+='Belum ada barcode yang discan.';
|
||||
// html+='</td>';
|
||||
// html+='</tr>';
|
||||
|
||||
// }else{
|
||||
|
||||
// $.each(daftarBarang,function(i,v){
|
||||
|
||||
// html+='<tr>';
|
||||
// html+='<td>'+(i+1)+'</td>';
|
||||
// html+='<td><strong>'+v.barcode+'</strong></td>';
|
||||
// html+='<td>'+v.kode_detail+'</td>';
|
||||
// html+='<td>'+v.nama_barang+'</td>';
|
||||
// html+='<td>'+(v.serial_number?v.serial_number:'-')+'</td>';
|
||||
// html+='<td class="text-center">';
|
||||
// html+='<button class="btn btn-sm btn-outline-danger btnRemove" data-id="'+v.barcode_id+'">';
|
||||
// html+='<i class="bi bi-trash"></i>';
|
||||
// html+='</button>';
|
||||
// html+='</td>';
|
||||
// html+='</tr>';
|
||||
|
||||
// });
|
||||
|
||||
// }
|
||||
|
||||
// html+='</tbody>';
|
||||
// html+='</table>';
|
||||
// html+='</div>';
|
||||
|
||||
// $("#tableBarcode").html(html);
|
||||
|
||||
// }
|
||||
|
||||
|
||||
$(document).on("change", ".pilihBarang", function(){
|
||||
if($(this).is(":checked")){
|
||||
$(".pilihBarang").not(this).prop("checked", false);
|
||||
}
|
||||
});
|
||||
|
||||
function getSelectedBarcodeRows(){
|
||||
let selectedIds = $(".pilihBarang:checked").map(function(){
|
||||
return String($(this).val());
|
||||
}).get();
|
||||
|
||||
if(selectedIds.length === 0){
|
||||
return [];
|
||||
}
|
||||
|
||||
return daftarBarang.filter(function(v){
|
||||
return selectedIds.indexOf(String(v.barcode_id)) !== -1;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
let html5QrCode=null;
|
||||
|
||||
@@ -400,7 +501,7 @@ $("#btnCamera").click(function(){
|
||||
$("#serial_number")
|
||||
.val(decodedText);
|
||||
|
||||
saveSerial();
|
||||
getBarcodeId();
|
||||
|
||||
});
|
||||
|
||||
@@ -625,8 +726,9 @@ $('#btnSimpan').click(function(){
|
||||
// ================= RESET FORM KELUAR =================
|
||||
function resetFormKeluar(){
|
||||
$('#tanggal_keluar').val('');
|
||||
$('#qty_keluar').val('');
|
||||
$('#keterangan_keluar').val('');
|
||||
daftarBarang = [];
|
||||
renderTable();
|
||||
}
|
||||
|
||||
loadKasOut();
|
||||
@@ -683,28 +785,41 @@ function loadItems(warehouse_id){
|
||||
$('#btnKeluar').click(function(){
|
||||
|
||||
let btn = $(this);
|
||||
let selectedRows = getSelectedBarcodeRows();
|
||||
|
||||
if(selectedRows.length !== 1){
|
||||
Swal.fire({
|
||||
icon: 'warning',
|
||||
title: 'Pilih 1 barang',
|
||||
text: 'Pengeluaran hanya boleh 1 barcode item per proses.'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
let selected = selectedRows[0];
|
||||
|
||||
let data = {
|
||||
account_biaya: $('#account_biaya').val(),
|
||||
tanggal_keluar: $('#tanggal_keluar').val(),
|
||||
warehouse_id_keluar: $('#warehouse_id_keluar').val(),
|
||||
barang_id: $('#barang_id').val(),
|
||||
qty_keluar: $('#qty_keluar').val(),
|
||||
keterangan_keluar: $('#keterangan_keluar').val()
|
||||
account_biaya: $('#account_biaya').val(),
|
||||
tanggal_keluar: $('#tanggal_keluar').val(),
|
||||
keterangan_keluar: $('#keterangan_keluar').val(),
|
||||
selected_barcode: selected.barcode_id
|
||||
};
|
||||
|
||||
let url = "<?= base_url('items/keluarkan'); ?>";
|
||||
|
||||
// 🔥 loading state
|
||||
btn.prop('disabled', true).html('Menyimpan...');
|
||||
|
||||
$.post(url, data, function(res){
|
||||
|
||||
if(res.status){
|
||||
|
||||
$('#modalItem').modal('hide');
|
||||
$('#modalKeluar').modal('hide');
|
||||
table.ajax.reload(null,false);
|
||||
|
||||
daftarBarang = [];
|
||||
renderTable();
|
||||
$("#serial_number").val("");
|
||||
|
||||
Swal.fire({
|
||||
icon: 'success',
|
||||
title: 'Berhasil',
|
||||
@@ -741,68 +856,68 @@ $('#btnKeluar').click(function(){
|
||||
// ================= END URUSAN KELUAR ===============
|
||||
// =====================================================
|
||||
|
||||
// ================= DELETE =================
|
||||
$(document).on('click','.btn-delete',function(){
|
||||
// // ================= DELETE =================
|
||||
// $(document).on('click','.btn-delete',function(){
|
||||
|
||||
let id = $(this).data('id');
|
||||
let btn = $(this);
|
||||
// let id = $(this).data('id');
|
||||
// let btn = $(this);
|
||||
|
||||
Swal.fire({
|
||||
title: 'Hapus data?',
|
||||
text: "Data tidak bisa dikembalikan!",
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#d33',
|
||||
cancelButtonColor: '#3085d6',
|
||||
confirmButtonText: 'Ya, hapus!',
|
||||
cancelButtonText: 'Batal'
|
||||
}).then((result) => {
|
||||
// Swal.fire({
|
||||
// title: 'Hapus data?',
|
||||
// text: "Data tidak bisa dikembalikan!",
|
||||
// icon: 'warning',
|
||||
// showCancelButton: true,
|
||||
// confirmButtonColor: '#d33',
|
||||
// cancelButtonColor: '#3085d6',
|
||||
// confirmButtonText: 'Ya, hapus!',
|
||||
// cancelButtonText: 'Batal'
|
||||
// }).then((result) => {
|
||||
|
||||
if(result.isConfirmed){
|
||||
// if(result.isConfirmed){
|
||||
|
||||
btn.prop('disabled', true).html('Menghapus...');
|
||||
// btn.prop('disabled', true).html('Menghapus...');
|
||||
|
||||
$.get("<?= base_url('items/delete/'); ?>"+id,function(res){
|
||||
// $.get("<?= base_url('items/delete/'); ?>"+id,function(res){
|
||||
|
||||
if(res.status){
|
||||
// if(res.status){
|
||||
|
||||
table.ajax.reload(null,false);
|
||||
// table.ajax.reload(null,false);
|
||||
|
||||
Swal.fire({
|
||||
icon: 'success',
|
||||
title: 'Berhasil',
|
||||
text: res.message || 'Data berhasil dihapus',
|
||||
timer: 1500,
|
||||
showConfirmButton: false
|
||||
});
|
||||
// Swal.fire({
|
||||
// icon: 'success',
|
||||
// title: 'Berhasil',
|
||||
// text: res.message || 'Data berhasil dihapus',
|
||||
// timer: 1500,
|
||||
// showConfirmButton: false
|
||||
// });
|
||||
|
||||
}else{
|
||||
// }else{
|
||||
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Gagal',
|
||||
text: res.message || 'Gagal menghapus data'
|
||||
});
|
||||
}
|
||||
// Swal.fire({
|
||||
// icon: 'error',
|
||||
// title: 'Gagal',
|
||||
// text: res.message || 'Gagal menghapus data'
|
||||
// });
|
||||
// }
|
||||
|
||||
},'json')
|
||||
.fail(function(){
|
||||
// },'json')
|
||||
// .fail(function(){
|
||||
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Error',
|
||||
text: 'Koneksi ke server gagal'
|
||||
});
|
||||
// Swal.fire({
|
||||
// icon: 'error',
|
||||
// title: 'Error',
|
||||
// text: 'Koneksi ke server gagal'
|
||||
// });
|
||||
|
||||
})
|
||||
.always(function(){
|
||||
btn.prop('disabled', false).html('Hapus');
|
||||
});
|
||||
// })
|
||||
// .always(function(){
|
||||
// btn.prop('disabled', false).html('Hapus');
|
||||
// });
|
||||
|
||||
}
|
||||
});
|
||||
// }
|
||||
// });
|
||||
|
||||
});
|
||||
// });
|
||||
|
||||
// ================= DETAIL =================
|
||||
$(document).on('click','.btn-detail',function(){
|
||||
@@ -920,5 +1035,73 @@ $('#btnAdjust').click(function(){
|
||||
|
||||
});
|
||||
|
||||
// ================= PRINT BARCODE =================
|
||||
$(document).on('click', '.btn-print', function () {
|
||||
|
||||
let id = $(this).data('id');
|
||||
|
||||
Swal.fire({
|
||||
title: 'Cetak Barcode',
|
||||
html: `
|
||||
<div class="text-left">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="print_column" class="font-weight-bold">
|
||||
Jumlah Kolom
|
||||
</label>
|
||||
<select id="print_column" class="form-control">
|
||||
<option value="1">1 Kolom</option>
|
||||
<option value="2">2 Kolom</option>
|
||||
<option value="3" selected>3 Kolom (Rekomendasi)</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-0">
|
||||
<label for="duplicat" class="font-weight-bold">
|
||||
Jumlah Cetak per Barcode
|
||||
</label>
|
||||
<select id="duplicat" class="form-control">
|
||||
<option value="1" selected>1 Label</option>
|
||||
<option value="2">2 Label</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
`,
|
||||
icon: 'question',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: 'Cetak',
|
||||
cancelButtonText: 'Batal',
|
||||
confirmButtonColor: '#f0ad4e',
|
||||
preConfirm: () => {
|
||||
|
||||
let column = $('#print_column').val();
|
||||
let duplicat = $('#duplicat').val();
|
||||
|
||||
return {
|
||||
column: column,
|
||||
duplicat: duplicat
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}).then((result) => {
|
||||
|
||||
if (!result.isConfirmed) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.open(
|
||||
"<?= base_url('items/print_barcode/'); ?>" +
|
||||
id +
|
||||
"?column=" + result.value.column +
|
||||
"&duplicat=" + result.value.duplicat,
|
||||
"_blank"
|
||||
);
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
@@ -16,6 +16,9 @@
|
||||
<th>Kode</th>
|
||||
<th>Nama</th>
|
||||
<th>Limit Stok</th>
|
||||
<th>Tracking Type</th>
|
||||
<th>Need Serial</th>
|
||||
<th>Unit</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -49,6 +52,25 @@
|
||||
<label>Limit Stok</label>
|
||||
<input type="number" id="limit_stock" class="form-control">
|
||||
|
||||
<label class="mt-2">Tracking Type</label>
|
||||
<select id="tracking_type" class="form-control">
|
||||
<option value="UNIT">UNIT</option>
|
||||
<option value="QTY">QTY</option>
|
||||
</select>
|
||||
|
||||
<label class="mt-2">Need Serial Number</label>
|
||||
<select id="need_serial_number" class="form-control">
|
||||
<option value="false">Tidak</option>
|
||||
<option value="true">Ya</option>
|
||||
</select>
|
||||
|
||||
<label class="mt-2">Unit</label>
|
||||
<select id="unit" class="form-control">
|
||||
<option value="PCS">PCS</option>
|
||||
<option value="Meter">Meter</option>
|
||||
<option value="Lembar">Lembar</option>
|
||||
</select>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
@@ -77,6 +99,9 @@ $(function(){
|
||||
$('#kode').val('');
|
||||
$('#nama').val('');
|
||||
$('#limit_stock').val('');
|
||||
$('#tracking_type').val('UNIT');
|
||||
$('#need_serial_number').val('false');
|
||||
$('#unit').val('PCS');
|
||||
}
|
||||
|
||||
// ADD
|
||||
@@ -96,6 +121,9 @@ $(function(){
|
||||
$('#kode').val(res.kode_barang);
|
||||
$('#nama').val(res.nama);
|
||||
$('#limit_stock').val(res.limit_stock);
|
||||
$('#tracking_type').val((res.tracking_type || 'UNIT').toUpperCase());
|
||||
$('#need_serial_number').val((res.need_serial_number || 'false').toLowerCase());
|
||||
$('#unit').val(res.unit || 'PCS');
|
||||
|
||||
action = 'edit';
|
||||
$('#modalKodebarang').modal('show');
|
||||
@@ -110,11 +138,19 @@ $(function(){
|
||||
id: $('#id').val(),
|
||||
kode: $('#kode').val(),
|
||||
nama: $('#nama').val(),
|
||||
limit_stock: $('#limit_stock').val()
|
||||
limit_stock: $('#limit_stock').val(),
|
||||
tracking_type: $('#tracking_type').val(),
|
||||
need_serial_number: $('#need_serial_number').val(),
|
||||
unit: $('#unit').val()
|
||||
};
|
||||
|
||||
if(!data.kode || !data.nama || !data.limit_stock){
|
||||
Swal.fire('Warning','Nama gudang wajib diisi','warning');
|
||||
if(!data.kode || !data.nama){
|
||||
Swal.fire('Warning','Kode dan nama barang wajib diisi','warning');
|
||||
return;
|
||||
}
|
||||
|
||||
if(data.limit_stock === '' || parseInt(data.limit_stock) < 0){
|
||||
Swal.fire('Warning','Limit stok wajib diisi dan tidak boleh negatif','warning');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -141,7 +177,7 @@ $(function(){
|
||||
let id = $(this).data('id');
|
||||
|
||||
Swal.fire({
|
||||
title:'Hapus gudang?',
|
||||
title:'Hapus kode barang?',
|
||||
text:'Pastikan tidak dipakai item',
|
||||
icon:'warning',
|
||||
showCancelButton:true
|
||||
|
||||
@@ -3,23 +3,48 @@
|
||||
<div class="card-body">
|
||||
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<h4 class="mb-0 fw-bold">Neraca Saldo</h4>
|
||||
<button type="button" class="btn btn-danger w-30" id="generate_pdf">
|
||||
<h4 class="mb-0 fw-bold">Laporan Keuangan</h4>
|
||||
|
||||
<button type="button" class="btn btn-danger" id="generate_pdf">
|
||||
Generate PDF
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Tanggal Awal</label>
|
||||
<input type="date" id="tanggal_awal" class="form-control"
|
||||
value="<?= date('Y-m-01'); ?>">
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Tanggal Akhir</label>
|
||||
<input type="date" id="tanggal_akhir" class="form-control"
|
||||
value="<?= date('Y-m-t'); ?>">
|
||||
</div>
|
||||
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<button class="btn btn-primary w-100" id="btnFilter">
|
||||
Tampilkan
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm table-striped table-hover align-middle">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th style="width: 120px;">Kode</th>
|
||||
<th width="120">Kode</th>
|
||||
<th>Akun</th>
|
||||
<th class="text-end">Debit</th>
|
||||
<th class="text-end">Kredit</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody id="tb"></tbody>
|
||||
|
||||
<tfoot class="table-light">
|
||||
<tr class="fw-bold">
|
||||
<th colspan="2" class="text-end">Total</th>
|
||||
@@ -27,6 +52,7 @@
|
||||
<th class="text-end text-danger" id="tk"></th>
|
||||
</tr>
|
||||
</tfoot>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -35,56 +61,71 @@
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
$(function () {
|
||||
|
||||
$.get("<?= base_url('neracasaldo/get_data'); ?>", function(res){
|
||||
loadData();
|
||||
|
||||
let html = '';
|
||||
let td = 0, tk = 0;
|
||||
$('#btnFilter').click(function () {
|
||||
loadData();
|
||||
});
|
||||
|
||||
res.forEach(r=>{
|
||||
function loadData() {
|
||||
|
||||
let debit = parseFloat(r.saldo_debit) || 0;
|
||||
let kredit = parseFloat(r.saldo_kredit) || 0;
|
||||
$.get("<?= base_url('neracasaldo/get_data'); ?>", {
|
||||
|
||||
td += debit;
|
||||
tk += kredit;
|
||||
tanggal_awal: $('#tanggal_awal').val(),
|
||||
tanggal_akhir: $('#tanggal_akhir').val()
|
||||
|
||||
html += `
|
||||
<tr>
|
||||
<td class="fw-semibold text-muted">${r.kode_akun}</td>
|
||||
<td>${r.nama_akun}</td>
|
||||
<td class="text-end">${debit.toLocaleString()}</td>
|
||||
<td class="text-end">${kredit.toLocaleString()}</td>
|
||||
</tr>`;
|
||||
});
|
||||
}, function (res) {
|
||||
|
||||
$('#tb').html(html);
|
||||
$('#td').text(td.toLocaleString());
|
||||
$('#tk').text(tk.toLocaleString());
|
||||
let html = '';
|
||||
let td = 0;
|
||||
let tk = 0;
|
||||
|
||||
}, 'json');
|
||||
res.forEach(r => {
|
||||
|
||||
let debit = parseFloat(r.debit) || 0;
|
||||
let kredit = parseFloat(r.kredit) || 0;
|
||||
|
||||
//GENERATE PDF
|
||||
$('#generate_pdf').on('click', function(){
|
||||
td += debit;
|
||||
tk += kredit;
|
||||
|
||||
let btn = $(this);
|
||||
html += `
|
||||
<tr>
|
||||
<td class="fw-semibold text-muted">${r.kode_akun}</td>
|
||||
<td>${r.nama_akun}</td>
|
||||
<td class="text-end">${debit.toLocaleString()}</td>
|
||||
<td class="text-end">${kredit.toLocaleString()}</td>
|
||||
</tr>
|
||||
`;
|
||||
});
|
||||
|
||||
btn.prop('disabled', true)
|
||||
.html('Generate PDF...');
|
||||
$('#tb').html(html);
|
||||
$('#td').text(td.toLocaleString());
|
||||
$('#tk').text(tk.toLocaleString());
|
||||
|
||||
window.open(
|
||||
|
||||
"<?= base_url('generateneracasaldo/generatepdf'); ?>",
|
||||
'_blank'
|
||||
);
|
||||
}, 'json');
|
||||
|
||||
setTimeout(function(){
|
||||
btn.prop('disabled', false)
|
||||
.html('Generate PDF');
|
||||
},1000);
|
||||
}
|
||||
|
||||
$('#generate_pdf').click(function () {
|
||||
|
||||
let btn = $(this);
|
||||
|
||||
btn.prop('disabled', true).text('Generate PDF...');
|
||||
|
||||
window.open(
|
||||
"<?= base_url('generateneracasaldo/generatepdf'); ?>" +
|
||||
"?tanggal_awal=" + $('#tanggal_awal').val() +
|
||||
"&tanggal_akhir=" + $('#tanggal_akhir').val(),
|
||||
"_blank"
|
||||
);
|
||||
|
||||
setTimeout(function () {
|
||||
btn.prop('disabled', false).text('Generate PDF');
|
||||
}, 1000);
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -84,15 +84,15 @@
|
||||
<i class="bi bi-graph-up"></i> Laporan
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item <?= ($active_menu == 'neraca_saldo') ? 'active' : '' ?>" href="<?= base_url('neracasaldo'); ?>">
|
||||
<i class="bi bi-clipboard-data me-2"></i> Neraca Saldo</a>
|
||||
</li>
|
||||
<li><a class="dropdown-item <?= ($active_menu == 'laba_rugi') ? 'active' : '' ?>" href="<?= base_url('labarugi'); ?>">
|
||||
<i class="bi bi-graph-up-arrow me-2"></i> Laba Rugi</a>
|
||||
</li>
|
||||
<li><a class="dropdown-item <?= ($active_menu == 'neraca') ? 'active' : '' ?>" href="<?= base_url('neraca'); ?>">
|
||||
<i class="bi bi-bar-chart-line me-2"></i> Neraca</a>
|
||||
</li>
|
||||
<li><a class="dropdown-item <?= ($active_menu == 'neraca_saldo') ? 'active' : '' ?>" href="<?= base_url('neracasaldo'); ?>">
|
||||
<i class="bi bi-clipboard-data me-2"></i> Laporan Harian</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -180,6 +180,12 @@
|
||||
<i class="bi bi-box me-2"></i> Daftar Barang
|
||||
</a>
|
||||
</li><hr class="dropdown-divider">
|
||||
<li>
|
||||
<a class="dropdown-item <?= ($active_menu == 'item_historys') ? 'active' : '' ?>"
|
||||
href="<?= base_url('items/item_barcodes_history'); ?>">
|
||||
<i class="bi bi-clock me-2"></i> History Barang
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item <?= ($active_menu == 'kode_barang') ? 'active' : '' ?>"
|
||||
href="<?= base_url('kodebarang'); ?>">
|
||||
|
||||
Reference in New Issue
Block a user