update di penjualan invoice
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||
|
||||
$section = isset($sales_section) ? (string) $sales_section : '';
|
||||
$counts = isset($sales_summary) && is_array($sales_summary) ? $sales_summary : array();
|
||||
$count = static function ($key) use ($counts) {
|
||||
return max(0, (int) ($counts[$key] ?? 0));
|
||||
};
|
||||
$links = array(
|
||||
array('key'=>'summary', 'url'=>'sales', 'icon'=>'bi-speedometer2', 'label'=>'Ringkasan', 'badge'=>0),
|
||||
array('key'=>'invoice', 'url'=>'invoices', 'icon'=>'bi-receipt', 'label'=>'Invoice', 'badge'=>$count('draft')),
|
||||
array('key'=>'delivery','url'=>'sales/deliveries', 'icon'=>'bi-truck', 'label'=>'Surat Jalan', 'badge'=>$count('delivery')),
|
||||
array('key'=>'receivable','url'=>'receivables', 'icon'=>'bi-cash-coin', 'label'=>'Piutang', 'badge'=>$count('open_invoice')),
|
||||
array('key'=>'return', 'url'=>'sales/returns', 'icon'=>'bi-arrow-counterclockwise','label'=>'Retur', 'badge'=>$count('return')),
|
||||
array('key'=>'customer','url'=>'customers', 'icon'=>'bi-people', 'label'=>'Customer', 'badge'=>0),
|
||||
);
|
||||
?>
|
||||
<nav class="sales-section-nav" aria-label="Bagian Penjualan">
|
||||
<?php foreach ($links as $link): ?>
|
||||
<a class="<?= $section === $link['key'] ? 'active' : '' ?>" href="<?= base_url($link['url']) ?>">
|
||||
<i class="bi <?= html_escape($link['icon']) ?>"></i>
|
||||
<span><?= html_escape($link['label']) ?></span>
|
||||
<?php if ($link['badge'] > 0): ?><b><?= number_format($link['badge'], 0, ',', '.') ?></b><?php endif; ?>
|
||||
</a>
|
||||
<?php endforeach; ?>
|
||||
</nav>
|
||||
@@ -11,7 +11,7 @@ function saleStatus($v){$m=array('draft'=>'Draft','submitted'=>'Menunggu Approva
|
||||
<style>.sales-page[data-section="summary"] #salesDelivery,.sales-page[data-section="delivery"] .sales-metrics,.sales-page[data-section="delivery"] #salesReturn,.sales-page[data-section="return"] .sales-metrics,.sales-page[data-section="return"] #salesDelivery{display:none!important}</style>
|
||||
<section class="sales-page" data-section="<?=html_escape($section)?>">
|
||||
<header class="sales-hero"><div><span>SIKLUS PENJUALAN</span><h2><?=html_escape($pageTitle)?></h2><p><?=html_escape($pageIntro)?></p></div><?php if($section==='return'&&$p['create']):?><a class="btn btn-primary" href="<?=base_url('sales/deliveries')?>"><i class="bi bi-arrow-counterclockwise"></i> Ajukan dari Surat Jalan</a><?php elseif($section==='delivery'):?><a class="btn btn-outline-primary" href="<?=base_url('invoices')?>"><i class="bi bi-receipt"></i> Lihat Invoice</a><?php elseif($p['create']):?><a class="btn btn-primary" href="<?=base_url('invoices/create')?>"><i class="bi bi-plus-lg"></i> Buat Invoice</a><?php endif?></header>
|
||||
<nav class="sales-section-nav" aria-label="Bagian Penjualan"><a class="<?=$section==='summary'?'active':''?>" href="<?=base_url('sales')?>"><i class="bi bi-speedometer2"></i><span>Ringkasan</span></a><a href="<?=base_url('invoices')?>"><i class="bi bi-receipt"></i><span>Invoice</span><?php if($summary['draft']):?><b><?=$summary['draft']?></b><?php endif?></a><a class="<?=$section==='delivery'?'active':''?>" href="<?=base_url('sales/deliveries')?>"><i class="bi bi-truck"></i><span>Surat Jalan</span><?php if($summary['delivery']):?><b><?=$summary['delivery']?></b><?php endif?></a><a href="<?=base_url('receivables')?>"><i class="bi bi-cash-coin"></i><span>Piutang</span><?php if($summary['open_invoice']):?><b><?=$summary['open_invoice']?></b><?php endif?></a><a class="<?=$section==='return'?'active':''?>" href="<?=base_url('sales/returns')?>"><i class="bi bi-arrow-counterclockwise"></i><span>Retur</span><?php if($summary['return']):?><b><?=$summary['return']?></b><?php endif?></a><a href="<?=base_url('customers')?>"><i class="bi bi-people"></i><span>Customer</span></a></nav>
|
||||
<?php $this->load->view('sales/_section_nav',array('sales_section'=>$section,'sales_summary'=>$summary)); ?>
|
||||
<div class="sales-metrics"><article><small>Penjualan bulan ini</small><strong><?=saleMoney($summary['month_sales'])?></strong></article><article><small>Invoice belum lunas</small><strong><?=$summary['open_invoice']?></strong><span><?=$summary['overdue']?> jatuh tempo</span></article><article><small>Draft / approval</small><strong><?=$summary['draft']?></strong><span><a href="<?=base_url('invoices')?>">Buka daftar invoice</a></span></article><article><small>Operasional</small><strong><?=$summary['delivery']+$summary['return']?></strong><span><?=$summary['delivery']?> pengiriman · <?=$summary['return']?> retur</span></article></div>
|
||||
<div class="row g-3">
|
||||
<div class="col-12" id="salesDelivery"><div class="card"><div class="card-header"><div><b>Pengiriman / Surat Jalan</b><small>Posting Surat Jalan adalah satu-satunya proses pengurangan stok fisik.</small></div><a class="btn btn-sm btn-outline-primary" href="<?=base_url('invoices')?>">Lihat Invoice</a></div><div class="table-responsive"><table class="table align-middle mb-0"><thead><tr><th>Surat Jalan</th><th>Customer / Invoice</th><th>Tanggal</th><th>Gudang</th><th>Status</th><th>Aksi</th></tr></thead><tbody><?php foreach($deliveries as$d):?><tr><td><b><?=html_escape($d->delivery_no)?></b></td><td><?=html_escape($d->customer_name)?><small><?=html_escape($d->no_invoice?:'-')?></small></td><td><?=html_escape($d->delivery_date)?></td><td><?=html_escape($d->warehouse_name?:'-')?></td><td><span class="status status-<?=html_escape($d->status)?>"><?=saleStatus($d->status)?></span></td><td class="actions"><button class="btn btn-sm btn-outline-primary detail-delivery" data-id="<?=$d->id?>">Detail</button><?php if($p['export']):?><button class="btn btn-sm btn-outline-danger pdf-open" data-url="<?=base_url('sales/delivery_pdf/'.$d->id)?>">PDF</button><?php endif?><?php if($d->status==='draft'&&$p['post']):?><button class="btn btn-sm btn-success sale-action" data-url="<?=base_url('sales/post_delivery/'.$d->id)?>" data-confirm="Posting Surat Jalan dan keluarkan stok?">Post Pengiriman</button><?php endif?><?php if(in_array($d->status,array('posted','partially_returned'),true)&&$p['create']):?><button class="btn btn-sm btn-warning new-return" data-id="<?=$d->id?>">Ajukan Retur</button><?php endif?></td></tr><?php endforeach?><?php if(!$deliveries):?><tr><td colspan="6" class="empty">Belum ada dokumen pengiriman.</td></tr><?php endif?></tbody></table></div></div></div>
|
||||
|
||||
@@ -1 +1,62 @@
|
||||
<!doctype html><html><head><meta charset="utf-8"><style>@page{margin:35px}body{font-family:DejaVu Sans,sans-serif;font-size:11px;color:#20242c}.head{width:100%;margin-bottom:24px}.right{text-align:right}.box{border:1px solid #d8dee8;border-radius:8px;padding:14px}.grid{width:100%;border-collapse:collapse;margin-top:15px}.grid th,.grid td{border:1px solid #d8dee8;padding:8px}.grid th{background:#eef2f6}.total{font-size:18px;text-align:right;margin-top:16px}</style></head><body><table class="head"><tr><td><h2><?=html_escape($pdf_company->name??'Perusahaan')?></h2></td><td class="right"><h2>BUKTI PENERIMAAN</h2><b><?=html_escape($payment->payment_no)?></b></td></tr></table><div class="box"><b>Diterima dari:</b> <?=html_escape($payment->customer_name)?><br><b>Tanggal:</b> <?=$payment->tanggal?><br><b>Referensi:</b> <?=html_escape($payment->reference_no?:'-')?><br><b>Catatan:</b> <?=html_escape($payment->notes?:'-')?></div><h3>Alokasi Invoice</h3><table class="grid"><thead><tr><th>Invoice</th><th class="right">Nilai</th></tr></thead><tbody><?php foreach($allocations as$a):?><tr><td><?=html_escape($a->no_invoice)?></td><td class="right">Rp <?=number_format($a->amount,2,',','.')?></td></tr><?php endforeach?></tbody></table><h3>Sumber Kas/Bank</h3><table class="grid"><thead><tr><th>Akun</th><th class="right">Nilai</th></tr></thead><tbody><?php foreach($sources as$s):?><tr><td><?=html_escape($s->kode_akun.' - '.$s->nama_akun)?></td><td class="right">Rp <?=number_format($s->amount,2,',','.')?></td></tr><?php endforeach?></tbody></table><div class="total"><b>Total diterima: Rp <?=number_format($payment->jumlah,2,',','.')?></b></div></body></html>
|
||||
<?php
|
||||
$company=$pdf_company;
|
||||
$currencyCode=isset($pdf_currency->code)?$pdf_currency->code:($company->base_currency??'IDR');
|
||||
$currencySymbol=isset($pdf_currency->symbol)&&trim((string)$pdf_currency->symbol)!==''?$pdf_currency->symbol:'Rp';
|
||||
$allocatedTotal=0;foreach($allocations as$allocation)$allocatedTotal+=(float)$allocation->amount;
|
||||
$sourceTotal=0;foreach($sources as$source)$sourceTotal+=(float)$source->amount;
|
||||
$advance=max(0,round((float)$payment->jumlah-$allocatedTotal,2));
|
||||
function receiptMoney($value){return number_format((float)$value,2,',','.');}
|
||||
function receiptDate($value){
|
||||
if(!$value)return'-';$time=strtotime($value);if(!$time)return$value;
|
||||
$months=array(1=>'Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember');
|
||||
return date('j',$time).' '.$months[(int)date('n',$time)].' '.date('Y',$time);
|
||||
}
|
||||
function receiptWords($number){
|
||||
$number=abs((int)$number);$base=array('','satu','dua','tiga','empat','lima','enam','tujuh','delapan','sembilan','sepuluh','sebelas');
|
||||
if($number<12)return$base[$number];
|
||||
if($number<20)return receiptWords($number-10).' belas';
|
||||
if($number<100)return trim(receiptWords(intdiv($number,10)).' puluh '.receiptWords($number%10));
|
||||
if($number<200)return trim('seratus '.receiptWords($number-100));
|
||||
if($number<1000)return trim(receiptWords(intdiv($number,100)).' ratus '.receiptWords($number%100));
|
||||
if($number<2000)return trim('seribu '.receiptWords($number-1000));
|
||||
if($number<1000000)return trim(receiptWords(intdiv($number,1000)).' ribu '.receiptWords($number%1000));
|
||||
if($number<1000000000)return trim(receiptWords(intdiv($number,1000000)).' juta '.receiptWords($number%1000000));
|
||||
if($number<1000000000000)return trim(receiptWords(intdiv($number,1000000000)).' miliar '.receiptWords($number%1000000000));
|
||||
return trim(receiptWords(intdiv($number,1000000000000)).' triliun '.receiptWords($number%1000000000000));
|
||||
}
|
||||
$amountWords=ucfirst(receiptWords((int)floor((float)$payment->jumlah))).' rupiah';
|
||||
?>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Bukti Penerimaan <?=html_escape($payment->payment_no)?></title>
|
||||
<style>
|
||||
@page{margin:25px 30px 35px}body{font-family:DejaVu Sans,sans-serif;font-size:9px;color:#172033;line-height:1.45;margin:0}.header{width:100%;border-collapse:collapse;margin-bottom:16px}.header td{vertical-align:top}.brand{width:62%}.logo{float:left;width:58px;height:58px;object-fit:contain;margin-right:10px}.company-name{font-size:14px;font-weight:700;color:#172b4d;margin-bottom:2px}.company-legal{font-size:8px;color:#667085;margin-bottom:3px}.company-contact{font-size:8px;color:#475467;line-height:1.4}.document{text-align:right}.document-title{font-size:18px;font-weight:700;color:#172b4d;letter-spacing:.03em}.document-number{font-size:10px;font-weight:700;margin-top:3px}.status{display:inline-block;background:#e8f7ef;color:#087443;border:1px solid #a9dfc4;padding:3px 9px;margin-top:7px;font-size:7.5px;font-weight:700;letter-spacing:.08em}.accent{height:3px;background:#f47b20;margin-bottom:15px}.amount-panel{width:100%;border-collapse:collapse;background:#172b4d;color:#fff;margin-bottom:14px}.amount-panel td{padding:12px 14px}.amount-label{font-size:7.5px;letter-spacing:.12em;color:#d7e0ef}.amount-value{text-align:right;font-size:17px;font-weight:700}.info{width:100%;border-collapse:collapse;margin-bottom:15px}.info td{width:50%;vertical-align:top;border:1px solid #d9e0ea;padding:10px 11px}.info td+td{border-left:0}.eyebrow{font-size:7px;color:#667085;font-weight:700;letter-spacing:.1em;text-transform:uppercase;margin-bottom:4px}.customer{font-size:11px;font-weight:700;color:#172b4d;margin-bottom:3px}.meta{width:100%;border-collapse:collapse}.meta td{border:0!important;padding:1px 0!important;font-size:8.5px}.meta .label{width:42%;color:#667085}.meta .value{text-align:right;font-weight:600}.section{margin-top:14px}.section-title{font-size:10px;font-weight:700;color:#172b4d;margin:0 0 6px}.section-subtitle{font-size:7.5px;color:#667085;font-weight:400}.grid{width:100%;border-collapse:collapse}.grid th{background:#f1f4f8;color:#344054;font-size:7px;letter-spacing:.06em;text-transform:uppercase;text-align:left}.grid th,.grid td{border:1px solid #d9e0ea;padding:6px 7px}.grid .number{width:24px;text-align:center}.right{text-align:right!important}.center{text-align:center!important}.strong{font-weight:700;color:#172b4d}.empty{text-align:center;color:#667085;padding:12px!important}.summary{width:46%;margin:8px 0 0 auto;border-collapse:collapse}.summary td{padding:3px 2px}.summary td:last-child{text-align:right}.summary .grand td{border-top:1px solid #98a2b3;padding-top:6px;font-size:10px;font-weight:700;color:#172b4d}.words{border-left:3px solid #f47b20;background:#fff8f1;padding:8px 10px;margin-top:13px;color:#344054}.words-label{font-size:7px;color:#a14b0b;letter-spacing:.08em;font-weight:700;text-transform:uppercase}.notes{margin-top:10px;padding:8px 10px;border:1px solid #d9e0ea;background:#fafbfc}.signatures{width:100%;border-collapse:collapse;margin-top:27px;text-align:center}.signatures td{width:50%;height:72px;vertical-align:top;color:#475467}.signature-name{font-weight:700;color:#172b4d;border-top:1px solid #98a2b3;padding-top:4px;margin:42px auto 0;width:70%}.legal-note{font-size:7.5px;color:#667085;text-align:center;border-top:1px solid #e4e7ec;padding-top:7px;margin-top:12px}.footer{position:fixed;left:0;right:0;bottom:-22px;font-size:7px;color:#98a2b3}.footer-right{float:right}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table class="header"><tr><td class="brand">
|
||||
<?php if(!empty($pdf_logo_data)):?><img class="logo" src="<?=$pdf_logo_data?>" alt="Logo"><?php endif?>
|
||||
<div class="company-name"><?=html_escape($company->name??'Perusahaan')?></div>
|
||||
<?php if(!empty($company->legal_name)&&$company->legal_name!==$company->name):?><div class="company-legal"><?=html_escape($company->legal_name)?></div><?php endif?>
|
||||
<div class="company-contact"><?=nl2br(html_escape($company->address?:'-'))?><br>Telp: <?=html_escape($company->phone?:'-')?><?php if(!empty($company->email)):?> | <?=html_escape($company->email)?><?php endif?></div>
|
||||
</td><td class="document"><div class="document-title">BUKTI PENERIMAAN</div><div class="document-number"><?=html_escape($payment->payment_no)?></div><span class="status">PEMBAYARAN TERCATAT</span></td></tr></table>
|
||||
<div class="accent"></div>
|
||||
|
||||
<table class="amount-panel"><tr><td><div class="amount-label">TOTAL DANA DITERIMA</div><div><?=html_escape($currencyCode)?> • <?=receiptDate($payment->tanggal)?></div></td><td class="amount-value"><?=html_escape($currencySymbol)?> <?=receiptMoney($payment->jumlah)?></td></tr></table>
|
||||
|
||||
<table class="info"><tr><td><div class="eyebrow">Diterima dari</div><div class="customer"><?=html_escape($payment->customer_name)?></div><div><?=nl2br(html_escape($payment->customer_address?:'-'))?></div><?php if(!empty($payment->customer_phone)||!empty($payment->customer_email)):?><div style="margin-top:3px;color:#667085"><?=html_escape($payment->customer_phone?:'-')?><?php if(!empty($payment->customer_email)):?> • <?=html_escape($payment->customer_email)?><?php endif?></div><?php endif?></td><td><div class="eyebrow">Informasi penerimaan</div><table class="meta"><tr><td class="label">Tanggal</td><td class="value"><?=receiptDate($payment->tanggal)?></td></tr><tr><td class="label">Referensi</td><td class="value"><?=html_escape($payment->reference_no?:'-')?></td></tr><tr><td class="label">Metode</td><td class="value"><?=html_escape($payment->metode==='multi_account'?'Multi Akun':ucwords(str_replace('_',' ',$payment->metode?:'Pembayaran'))) ?></td></tr><tr><td class="label">Status</td><td class="value">TERCATAT</td></tr></table></td></tr></table>
|
||||
|
||||
<div class="section"><div class="section-title">Alokasi Pembayaran <span class="section-subtitle">— rincian tagihan yang dilunasi</span></div><table class="grid"><thead><tr><th class="number">No.</th><th>Nomor Invoice</th><th>Tanggal Invoice</th><th>Jatuh Tempo</th><th class="right">Nilai Dialokasikan</th></tr></thead><tbody><?php foreach($allocations as$i=>$allocation):?><tr><td class="number"><?=$i+1?></td><td class="strong"><?=html_escape($allocation->no_invoice)?></td><td><?=receiptDate($allocation->invoice_date)?></td><td><?=receiptDate($allocation->jatuh_tempo)?></td><td class="right strong"><?=html_escape($currencySymbol)?> <?=receiptMoney($allocation->amount)?></td></tr><?php endforeach?><?php if(!$allocations):?><tr><td colspan="5" class="empty">Pembayaran belum dialokasikan ke invoice tertentu.</td></tr><?php endif?></tbody></table><?php if($advance>.001):?><table class="summary"><tr><td>Alokasi invoice</td><td><?=receiptMoney($allocatedTotal)?></td></tr><tr><td>Uang muka customer</td><td><?=receiptMoney($advance)?></td></tr><tr class="grand"><td>Total diterima</td><td><?=html_escape($currencySymbol)?> <?=receiptMoney($payment->jumlah)?></td></tr></table><?php endif?></div>
|
||||
|
||||
<div class="section"><div class="section-title">Sumber Penerimaan <span class="section-subtitle">— akun tujuan pencatatan dana</span></div><table class="grid"><thead><tr><th class="number">No.</th><th>Kode Akun</th><th>Nama Akun Kas/Bank</th><th class="right">Nominal</th></tr></thead><tbody><?php foreach($sources as$i=>$source):?><tr><td class="number"><?=$i+1?></td><td><?=html_escape($source->kode_akun)?></td><td class="strong"><?=html_escape($source->nama_akun)?></td><td class="right strong"><?=html_escape($currencySymbol)?> <?=receiptMoney($source->amount)?></td></tr><?php endforeach?><?php if(!$sources):?><tr><td colspan="4" class="empty">Sumber penerimaan tidak tersedia.</td></tr><?php endif?></tbody><tfoot><tr><td colspan="3" class="right strong">TOTAL PENERIMAAN</td><td class="right strong"><?=html_escape($currencySymbol)?> <?=receiptMoney($sourceTotal)?></td></tr></tfoot></table></div>
|
||||
|
||||
<div class="words"><div class="words-label">Terbilang</div><b><?=html_escape($amountWords)?></b></div>
|
||||
<div class="notes"><div class="eyebrow">Catatan pembayaran</div><?=nl2br(html_escape($payment->notes?:'Tidak ada catatan tambahan.'))?></div>
|
||||
|
||||
<table class="signatures"><tr><td>Dicatat oleh<div class="signature-name"><?=html_escape($payment->creator_name?:'-')?></div><div>Finance / Administrasi</div></td><td>Pihak Pembayar<div class="signature-name"><?=html_escape($payment->customer_name)?></div><div>Customer</div></td></tr></table>
|
||||
<div class="legal-note">Dokumen ini merupakan bukti penerimaan pembayaran yang tercatat pada sistem <?=html_escape($company->name??'perusahaan')?> dengan nomor referensi unik <?=html_escape($payment->payment_no)?>.</div>
|
||||
<div class="footer"><span>Dicetak <?=date('d-m-Y H:i')?> • <?=html_escape($payment->payment_no)?></span><span class="footer-right"><?=html_escape($company->company_code??'')?></span></div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user