6 lines
8.5 KiB
PHP
6 lines
8.5 KiB
PHP
<?php $csrf=$this->security->get_csrf_token_name();$hash=$this->security->get_csrf_hash();$p=$permissions;?>
|
||
<section class="container-fluid py-3"><div class="d-flex justify-content-between align-items-start mb-3"><div><small class="text-muted">DOKUMEN PRA-PENJUALAN</small><h3>Penawaran & Sales Order</h3><p class="text-muted">Dokumen komersial multi-item. Belum mengurangi stok dan belum membuat jurnal.</p></div><?php if($p['create']):?><button class="btn btn-primary" id="newSalesDocument">+ Dokumen Baru</button><?php endif?></div><div class="card"><div class="table-responsive"><table class="table align-middle mb-0"><thead><tr><th>Dokumen</th><th>Customer</th><th>Jenis</th><th>Tanggal</th><th class="text-end">Total</th><th>Status</th><th>Aksi</th></tr></thead><tbody><?php foreach($rows as$r):?><tr><td><b><?=html_escape($r->document_no)?></b></td><td><?=html_escape($r->nama)?></td><td><?=$r->document_type==='quotation'?'Penawaran':'Sales Order'?></td><td><?=$r->document_date?></td><td class="text-end">Rp <?=number_format($r->total,2,',','.')?></td><td><?=html_escape(ucwords($r->status))?></td><td><button class="btn btn-sm btn-outline-primary doc-detail" data-id="<?=$r->id?>">Detail</button><?php if($r->status==='draft'&&$p['create']):?><button class="btn btn-sm btn-primary doc-action" data-url="<?=base_url('salesdocuments/workflow/'.$r->id.'/sent')?>">Kirim</button><?php endif?><?php if($r->status==='sent'&&$p['approve']):?><button class="btn btn-sm btn-success doc-action" data-url="<?=base_url('salesdocuments/workflow/'.$r->id.'/accepted')?>">Terima</button><button class="btn btn-sm btn-outline-danger doc-action" data-url="<?=base_url('salesdocuments/workflow/'.$r->id.'/rejected')?>">Tolak</button><?php endif?><?php if($r->document_type==='quotation'&&$r->status==='accepted'&&$p['create']):?><button class="btn btn-sm btn-success doc-action" data-url="<?=base_url('salesdocuments/convert/'.$r->id)?>">Jadikan Sales Order</button><?php endif?><?php if($r->document_type==='sales_order'&&$r->status==='accepted'&&$p['create']):?><a class="btn btn-sm btn-warning" href="<?=base_url('sales?source_order='.$r->id)?>">Proses Pengiriman/Invoice</a><?php endif?></td></tr><?php endforeach?></tbody></table></div></div></section>
|
||
<div class="modal fade" id="docFormModal" tabindex="-1" data-bs-backdrop="static"><div class="modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable"><div class="modal-content"><form id="docForm"><div class="modal-header"><h5>Dokumen Penjualan Baru</h5><button class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body"><input type="hidden" name="<?=$csrf?>" value="<?=$hash?>"><div class="row g-3"><div class="col-md-3"><label>Jenis</label><select name="document_type" class="form-select"><option value="quotation">Penawaran</option><option value="sales_order">Sales Order</option></select></div><div class="col-md-4"><label>Customer</label><select name="customer_id" id="docCustomer" class="form-select" required></select></div><div class="col-md-2"><label>Tanggal</label><input type="date" name="document_date" value="<?=date('Y-m-d')?>" class="form-control"></div><div class="col-md-3"><label>Berlaku sampai</label><input type="date" name="valid_until" class="form-control"></div></div><hr><div class="row g-2"><div class="col-md-4"><select id="docItem" class="form-select"></select></div><div class="col-md-2"><input id="docQty" class="form-control" placeholder="Qty" inputmode="decimal"></div><div class="col-md-2"><input id="docPrice" class="form-control" placeholder="Harga" inputmode="decimal"></div><div class="col-md-2"><input id="docTax" class="form-control" placeholder="Pajak %" inputmode="decimal"></div><div class="col-md-2"><button type="button" id="docAdd" class="btn btn-outline-primary w-100">Tambah</button></div></div><div class="table-responsive mt-3"><table class="table" id="docCart"><thead><tr><th>Barang</th><th>Spesifikasi</th><th>Qty</th><th>Harga</th><th>Diskon</th><th>Pajak</th><th>Total</th><th></th></tr></thead><tbody></tbody></table></div><div class="text-end fs-5">Total: <b id="docTotal">Rp 0,00</b></div><label>Catatan</label><textarea name="notes" class="form-control"></textarea></div><div class="modal-footer"><button type="button" class="btn btn-light" data-bs-dismiss="modal">Batal</button><button class="btn btn-primary">Simpan Draft</button></div></form></div></div></div>
|
||
<div class="modal fade" id="docDetailModal"><div class="modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable"><div class="modal-content"><div class="modal-header"><h5>Detail Dokumen</h5><button class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body" id="docDetail"></div></div></div></div>
|
||
<script>(function($){var base=<?=json_encode(base_url())?>,csrf=<?=json_encode($csrf)?>,hash=<?=json_encode($hash)?>,cart=[],item=null;function e(v){return $('<div>').text(v||'').html()}function n(v){v=String(v||'').replace(/\./g,'').replace(',','.');return Number(v)||0}function m(v){return'Rp '+new Intl.NumberFormat('id-ID',{minimumFractionDigits:2}).format(v||0)}function load(){return Promise.all([$.getJSON(base+'sales/lookup_customers',{q:''}).then(function(r){$('#docCustomer').html(r.rows.map(function(x){return'<option value="'+x.id+'">'+e(x.nama)+'</option>'}).join(''))}),$.getJSON(base+'sales/lookup_items',{q:''}).then(function(r){$('#docItem').html('<option value="">Pilih barang</option>'+r.rows.map(function(x){return'<option data-x="'+encodeURIComponent(JSON.stringify(x))+'" value="'+x.id+'">'+e(x.kode_barang+' - '+x.nama_barang)+'</option>'}).join(''))})])}$('#newSalesDocument').on('click',function(){cart=[];load().then(function(){draw();bootstrap.Modal.getOrCreateInstance(document.getElementById('docFormModal')).show()})});$('#docItem').on('change',function(){item=this.selectedOptions[0].dataset.x?JSON.parse(decodeURIComponent(this.selectedOptions[0].dataset.x)):null;if(item)$('#docPrice').val(new Intl.NumberFormat('id-ID').format(item.harga_jual))});$('#docAdd').on('click',function(){if(!item||n($('#docQty').val())<=0)return;cart.push({item_id:item.id,name:item.kode_barang+' - '+item.nama_barang,qty:n($('#docQty').val()),unit_price:n($('#docPrice').val()),tax_rate:n($('#docTax').val()),discount_amount:0,specification:''});draw()});function draw(){var total=0;$('#docCart tbody').html(cart.map(function(x,i){var t=(x.qty*x.unit_price-x.discount_amount)*(1+x.tax_rate/100);total+=t;return'<tr data-i="'+i+'"><td>'+e(x.name)+'</td><td><input class="form-control form-control-sm spec" value="'+e(x.specification)+'"></td><td>'+x.qty+'</td><td>'+m(x.unit_price)+'</td><td><input class="form-control form-control-sm discount" value="'+x.discount_amount+'"></td><td>'+x.tax_rate+'%</td><td>'+m(t)+'</td><td><button type="button" class="btn btn-sm btn-outline-danger del">×</button></td></tr>'}).join(''));$('#docTotal').text(m(total))}$(document).on('input','.spec,.discount',function(){var tr=$(this).closest('tr'),x=cart[tr.data('i')];x.specification=tr.find('.spec').val();x.discount_amount=n(tr.find('.discount').val());draw()});$(document).on('click','.del',function(){cart.splice($(this).closest('tr').data('i'),1);draw()});$('#docForm').on('submit',function(ev){ev.preventDefault();var f=new FormData(this);f.append('rows',JSON.stringify(cart));$.ajax({url:base+'salesdocuments/save',type:'POST',data:f,processData:false,contentType:false,dataType:'json'}).done(function(r){if(r.status)location.reload();else Swal.fire({toast:true,position:'top-end',icon:'error',title:r.message,showConfirmButton:false,timer:3000})})});$(document).on('click','.doc-action',function(){var u=$(this).data('url');Swal.fire({title:'Lanjutkan proses dokumen?',icon:'question',showCancelButton:true}).then(function(r){if(r.isConfirmed){var d={};d[csrf]=hash;$.post(u,d,function(x){if(x.status)location.reload();else Swal.fire('Gagal',x.message,'error')},'json')}})});$(document).on('click','.doc-detail',function(){$.getJSON(base+'salesdocuments/detail/'+$(this).data('id')).done(function(r){var d=r.document;$('#docDetail').html('<h5>'+e(d.document_no)+'</h5><p>'+e(d.customer_name)+' · '+e(d.document_type)+' · '+e(d.status)+'</p><div class="table-responsive"><table class="table"><thead><tr><th>Barang</th><th>Spesifikasi</th><th>Qty</th><th>Harga</th><th>Total</th></tr></thead><tbody>'+r.lines.map(function(x){return'<tr><td>'+e((x.kode_barang||'')+' - '+(x.nama_barang||x.description))+'</td><td>'+e(x.specification||'-')+'</td><td>'+x.qty+'</td><td>'+m(x.unit_price)+'</td><td>'+m(x.line_total)+'</td></tr>'}).join('')+'</tbody></table></div>');bootstrap.Modal.getOrCreateInstance(document.getElementById('docDetailModal')).show()})})})(jQuery);</script>
|