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

6 lines
8.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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>