549 lines
34 KiB
PHP
549 lines
34 KiB
PHP
<?php
|
|
|
|
/*******************************************************************
|
|
|
|
PHP Class : /Controller/Report/NotaController
|
|
Description : Cetak Struk / Nota POS
|
|
Created By : Siau Pheng ([email protected]).
|
|
Created Date : April 12th, 2011.
|
|
Last Modified : November 2nd, 2026.
|
|
|
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
|
|
|
*******************************************************************/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Controller\Report;
|
|
|
|
use App\Utils\Invesa;
|
|
use App\Utils\PPOBClient;
|
|
use flight\Engine;
|
|
use flight\database\SimplePdo;
|
|
use flight\Session;
|
|
use Webapp\Printer\PrintPOS;
|
|
use Webapp\Web\Param;
|
|
|
|
class NotaController {
|
|
|
|
private array $web_app;
|
|
private array $app_inv;
|
|
private string $no_cetak;
|
|
private int $op_cash;
|
|
private bool $is_thermal;
|
|
protected Engine $app;
|
|
protected SimplePdo $db;
|
|
|
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
|
$this->app = $app;
|
|
$this->db = $db;
|
|
$this->web_app = (array) $session->get('WEB_APP');
|
|
$this->app_inv = (array) $session->get('APP_INV');
|
|
$this->no_cetak = Param::Get("Nomor_Cetak", "");
|
|
$this->op_cash = Param::Int("Open_Cash", 0);
|
|
$this->is_thermal = Invesa::Printer_Thermal(Param::Get("Printer", ""));
|
|
}
|
|
|
|
public function pos(): void {
|
|
if (empty($this->no_cetak)) return;
|
|
|
|
$ncetak = 1; $is_orig = ($this->op_cash > 0) ? true : false; $apromo = [];
|
|
$ainfo = $this->db->fetchRow("SELECT J.*,UCASE(O.Nama) Nama_User,UCASE(LEFT(B.Nama_Kartu,23)) Kode_Kartu2,UCASE(J.Nama_Kartu) Nama_Kartu2,RIGHT(J.No_Kartu,4) No_Kartu2 FROM (SELECT *,DATE_FORMAT(Tgl_Jual,'%d-%m-%Y') Tgl_Jual2,DATE_FORMAT(DateStamp,'%H:%i:%s') Jam_Jual,(Total_Bayar-Total_Kartu) Total_Tunai,(Total_Bayar-Total_Jual+Total_Diskon+Total_Potong) Total_Sisa FROM inv_jual WHERE No_Jual=?) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) LEFT JOIN para_rek_pos B ON (J.KartuID=B.KartuID)", [$this->no_cetak]);
|
|
if ($ainfo) $ainfo = $ainfo->getData();
|
|
if ($ainfo['KartuID'] > 0) $ncetak++;
|
|
|
|
$is_member = !in_array($ainfo['MemberID'], [0,36,103,90,146]);
|
|
if ($is_member) {
|
|
$_member = $this->db->fetchRow("SELECT IM,Kode_Member,Nama_Member FROM para_member WHERE MemberID=?", [$ainfo['MemberID']]);
|
|
$_member = ($_member) ? $_member->getData() : ['IM'=>0, 'Kode_Member'=>"", 'Nama_Member'=>""];
|
|
$ainfo = array_merge($ainfo, $_member);
|
|
}
|
|
|
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Kode_SKU,P.Nama_Produk_Varian,P.Nama_Lengkap,P.Nama_Satuan FROM (SELECT No_Ref,ID,InvID,SatuanID,VarianID,Harga_Jual,Disk_Rupiah,SUM(-Qty) Qty,SUM(-Qty*Harga_Jual) Jual,SUM(-Qty*Disk_Rupiah) Diskon,Total_Diskon,Promo FROM inv_detail WHERE No_Ref=? AND Qty<>0 GROUP BY InvID,SatuanID,VarianID,Harga_Jual,Promo) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
|
if (count($aitem) === 0) return;
|
|
|
|
$pre = new PrintPOS($this->app);
|
|
if ($this->is_thermal) {
|
|
$pre->set_fontsize(2);
|
|
$pre->set_header_logo("logo-nota.png");
|
|
} else {
|
|
$pre->add_header($this->web_app['REG_NAME'], $this->web_app['REG_CITY']);
|
|
}
|
|
|
|
if ($this->app_inv['PRINT_OPENCD'] === 1 && $this->op_cash === 1) $pre->set_opendrawer();
|
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
|
if (!empty($this->app_inv['TITLE_BEGIN'])) {
|
|
$_ahead = explode("[br]", stripslashes($this->app_inv['TITLE_BEGIN']));
|
|
foreach ($_ahead as $val) $pre->addc($val);
|
|
}
|
|
|
|
if ($is_member) {
|
|
$pre->add([$ainfo['No_Jual'],14], [$ainfo['Nama_User'],26,"R"]);
|
|
$pre->add([$ainfo['Kode_Member'] ?? "00000000",28], [$ainfo['Tgl_Jual2'],12,"R"]);
|
|
$pre->add([$ainfo['Nama_Member'],30], [$ainfo['Jam_Jual'],10,"R"]);
|
|
} else {
|
|
$pre->add([$ainfo['No_Jual'],20], [$ainfo['Tgl_Jual2'],20,"R"]);
|
|
$pre->add([$ainfo['Nama_User'],20], [$ainfo['Jam_Jual'],20,"R"]);
|
|
}
|
|
$pre->add_line();
|
|
|
|
$items = 0; $qty = 0;
|
|
foreach ($aitem as $item) {
|
|
if ($item['Qty'] === 0) continue;
|
|
if ($item['Promo'] > 1) {
|
|
$apromo[] = rupiah($item['Qty'])." ".$item['Nama_Satuan']." ".$item['Nama_Produk_Varian'];
|
|
continue;
|
|
}
|
|
if ($is_member) {
|
|
$pre->add($item['Nama_Produk_Varian']);
|
|
$pre->add([rupiah($item['Qty']),8,"R"], [" ".$item['Nama_Satuan'],7], [" @",2], [rupiah($item['Harga_Jual']),10,"R"], [rupiah($item['Jual']),13,"R"]);
|
|
} else {
|
|
$pre->add($item['Nama_Lengkap']);
|
|
$pre->add([$item['Kode_SKU'],8], [rupiah($item['Qty']),8,"R"], [" @",2], [rupiah($item['Harga_Jual']),9,"R"], [rupiah($item['Jual']),13,"R"]);
|
|
}
|
|
if ($item['Disk_Rupiah'] > 0) {
|
|
if ($item['Promo'] === 1) {
|
|
$pre->add([" DISKON PROMO",27], [rupiah($item['Total_Diskon']*-1),13,"R"]);
|
|
} else {
|
|
if ($is_member) {
|
|
$pre->add([rupiah($item['Qty']),8,"R"], [" ".$item['Nama_Satuan'],7], [" @",2], [rupiah($item['Disk_Rupiah']*-1),10,"R"], [" DISC",5], [rupiah($item['Diskon']*-1),8,"R"]);
|
|
} else {
|
|
$pre->add([" DISC",8], [rupiah($item['Qty']),8,"R"], [" @",2], [rupiah($item['Disk_Rupiah']*-1),9,"R"], [rupiah($item['Diskon']*-1),13,"R"]);
|
|
}
|
|
}
|
|
}
|
|
$qty += (int) $item['Qty'];
|
|
$items++;
|
|
}
|
|
|
|
$pre->add_line();
|
|
if ($ainfo['POS'] === 1) {
|
|
$pre->add([(string) $items."I/".(string) $qty."Q",14], ["JUMLAH Rp.",13,"R"], [rupiah($ainfo['Total_Jual']-$ainfo['Total_Diskon']),13,"R"]);
|
|
if ($ainfo['Total_Tunai'] > 0) $pre->add(["TUNAI Rp.",27,"R"], [rupiah($ainfo['Total_Tunai']),13,"R"]);
|
|
if ($ainfo['Total_Kartu'] > 0) $pre->add(["NON TUNAI Rp.",27,"R"], [rupiah($ainfo['Total_Kartu']),13,"R"]);
|
|
} else {
|
|
$pre->add($pre->set_align((string) $items."I/".(string) $qty."Q",14,"L") . $pre->set_align("JUMLAH",9,"R") ."_BOLD_ Rp.". $pre->set_align(rupiah($ainfo['Total_Jual']-$ainfo['Total_Diskon']),13,"R") ."_NORM_", "X");
|
|
}
|
|
if ($ainfo['Total_Potong'] > 0) {
|
|
$pre->add([" ",14], ["PROMO Rp.",13,"R"], [rupiah($ainfo['Total_Potong']),13,"R"]);
|
|
$apromo[] = "Potongan Promo Rp. ".rupiah($ainfo['Total_Potong']);
|
|
}
|
|
|
|
if ($ainfo['POS'] === 1) {
|
|
if ($ainfo['KartuID'] === 0) {
|
|
$pre->add(["KEMBALI Rp.",27,"R"], [rupiah($ainfo['Total_Sisa']),13,"R"]);
|
|
} else {
|
|
$pre->add_empty();
|
|
$pre->add("* ".$ainfo['Kode_Kartu2']." - ".($ainfo['No_Kartu2'] ?? "XXXX"));
|
|
if (!empty($ainfo['Nama_Kartu2'])) $pre->add(" ".$ainfo['Nama_Kartu2']);
|
|
}
|
|
}
|
|
|
|
// CETAK POINT
|
|
if ($is_member) {
|
|
$apoint = $this->db->fetchAll("SELECT P.*,T.Nilai_Point,IF(S.Sisa_Point-T.Nilai_Point<0,0,S.Sisa_Point) Sisa_Point FROM inv_point_tipe P LEFT JOIN (SELECT * FROM inv_point_tx WHERE No_TX=?) T ON (P.Point_TipeID=T.Point_TipeID) LEFT JOIN (SELECT Point_TipeID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE MemberID=? GROUP BY Point_TipeID ORDER BY Point_TipeID) S ON (S.Point_TipeID=P.Point_TipeID) WHERE P.Aktif=1 ORDER BY P.Point_TipeID", [$ainfo['No_Jual'], $ainfo['MemberID']]);
|
|
if (count($apoint) > 0) $pre->add_line();
|
|
$is_2line = false;
|
|
foreach ($apoint as $point) {
|
|
if ($point['Point_TipeID'] === 1 && $ainfo['IM'] === 0) continue;
|
|
if ($point['Point_TipeID'] > 1 && $ainfo['IM'] === 0 && empty($ainfo['Kode_Member'])) continue;
|
|
if ($is_2line === true) $pre->add_empty();
|
|
if ($point['Nilai_Point'] > 0) $pre->addc(str_replace('[POINT]', rupiah($point['Nilai_Point']), $point['Txt_Struk2']));
|
|
if ($point['Sisa_Point'] > 0) $pre->addc(str_replace('[TOT_POINT]', rupiah($point['Sisa_Point']), $point['Txt_Struk1']));
|
|
$is_2line = true;
|
|
}
|
|
}
|
|
|
|
if (count($apromo) > 0) {
|
|
$pre->add_line();
|
|
$pre->add("HADIAH PROMO :");
|
|
foreach ($apromo as $promo) $pre->add($promo);
|
|
}
|
|
$pre->add_empty();
|
|
if (!empty($this->app_inv['TITLE_END'])) {
|
|
$_afoo = explode("[br]", stripslashes($this->app_inv['TITLE_END']));
|
|
foreach($_afoo as $val) $pre->addc($val);
|
|
}
|
|
if ($is_orig === false) $pre->addc("-- SALINAN / COPY --");
|
|
$pre->add_stamp(1, false);
|
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
|
$pre->show($ncetak);
|
|
}
|
|
|
|
public function beli(): void {
|
|
if (empty($this->no_cetak)) return;
|
|
|
|
$ainfo = $this->db->fetchRow("SELECT B.*,DATE_FORMAT(B.Tgl_Beli,'%d-%m-%Y') Tgl_Beli2,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y') Tgl_Faktur2,S.Kode_Sup,S.Nama_Sup,S.Alamat_Sup,B.Total_Beli-B.Total_Diskon Jumlah FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_cetak]);
|
|
$ainfo['Alamat_Sup'] = str_replace("\n", "<br>", $ainfo['Alamat_Sup']);
|
|
|
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(Total_Diskon) Total_Diskon,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
|
if (count($aitem) === 0) return;
|
|
|
|
// menampilkan judul dibagian atas laporan
|
|
$kop = '<div class="notaTitle"><div>'.$this->web_app['REG_NAME'].'</div>FAKTUR PEMBELIAN</div>';
|
|
$kop .= '<table class="notaHeader"><tbody>';
|
|
$kop .= '<tr><td width="15%">Nomor Transaksi</td><td width="35%" class="ttkdua">'.$ainfo['No_Beli'].'</td><td width="15%">Tanggal Transaksi</td><td width="35%" class="ttkdua">'.$ainfo['Tgl_Beli2'].'</td></tr>';
|
|
$kop .= '<tr><td>Nomor Faktur</td><td class="ttkdua">'.$ainfo['No_Faktur'].'</td><td>Tanggal Faktur</td><td class="ttkdua">'.$ainfo['Tgl_Faktur2'].'</td></tr>';
|
|
$kop .= '<tr><td>Nama Supplier</td><td class="ttkdua" colspan="3">'.$ainfo['Nama_Sup'].(($ainfo['Kode_Sup'])?" [".$ainfo['Kode_Sup']."]":"").'</td></tr>';
|
|
$kop .= '<tr><td>Alamat Supplier</td><td class="ttkdua" colspan="3">'.$ainfo['Alamat_Sup'].'</td></tr>';
|
|
$kop .= '</tbody></table>';
|
|
|
|
$header = '<table class="notaTable"><thead><tr><th style="width:1cm">No.</th><th>Nama Barang</th><th style="width:2.2cm">Qty</th><th>Satuan</th><th>Harga @</th><th>Jumlah</th></tr></thead><tbody>';
|
|
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td><td class="r">%s</td><td class="r">%s</td></tr>';
|
|
$_sline = '<tr><td class="r b" colspan="4">%s</td><td class="r b" colspan="2">%s</td></tr>';
|
|
|
|
$body = $kop.$header; $no_urut = 1;
|
|
foreach ($aitem as $item) {
|
|
$body .= sprintf($_line, $no_urut++, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Beli']), rupiah2($item['Jumlah']));
|
|
}
|
|
$body .= sprintf($_sline, "Sub. Total Rp.", rupiah2($ainfo['Total_Beli']));
|
|
$body .= sprintf($_sline, "Diskon Rp.", rupiah2($ainfo['Total_Diskon']));
|
|
$body .= sprintf($_sline, "Total Rp.", rupiah2($ainfo['Jumlah']));
|
|
|
|
$t_catat = empty($ainfo['Catatan']) ? ' ' : 'Catatan : <i>'.$ainfo['Catatan'].'</i>.';
|
|
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
|
|
|
echo '<div>' . $body . '</div>';
|
|
}
|
|
|
|
public function beli_retur(): void {
|
|
if (empty($this->no_cetak)) return;
|
|
|
|
$ainfo = $this->db->fetchRow("SELECT B.*,DATE_FORMAT(B.Tgl_Beli,'%d-%m-%Y') Tgl_Beli2,S.Kode_Sup,S.Nama_Sup,S.Alamat_Sup,-B.Total_Beli Jumlah FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_cetak]);
|
|
$ainfo['Alamat_Sup'] = str_replace("\n", "<br>", $ainfo['Alamat_Sup']);
|
|
|
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk,P.Nama_Satuan_Varian FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(-Qty) Qty,SUM(-Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk", [$this->no_cetak]);
|
|
if (count($aitem) === 0) return;
|
|
|
|
// menampilkan judul dibagian atas laporan
|
|
$kop = '<div class="notaTitle"><div>'.$this->web_app['REG_NAME'].'</div>RETUR PEMBELIAN</div>';
|
|
$kop .= '<table class="notaHeader"><tbody>';
|
|
$kop .= '<tr><td width="15%">Nomor Transaksi</td><td width="35%" class="ttkdua">'.$ainfo['No_Beli'].'</td><td width="15%">Tanggal Transaksi</td><td width="35%" class="ttkdua">'.$ainfo['Tgl_Beli2'].'</td></tr>';
|
|
$kop .= '<tr><td>Nama Supplier</td><td class="ttkdua" colspan="3">'.$ainfo['Nama_Sup'].(($ainfo['Kode_Sup'])?" [".$ainfo['Kode_Sup']."]":"").'</td></tr>';
|
|
$kop .= '<tr><td>Alamat Supplier</td><td class="ttkdua" colspan="3">'.$ainfo['Alamat_Sup'].'</td></tr>';
|
|
$kop .= '</tbody></table>';
|
|
|
|
$header = '<table class="notaTable"><thead><tr><th style="width:1cm">No.</th><th>Nama Barang</th><th style="width:2.2cm">Qty</th><th>Satuan</th><th>Harga @</th><th>Jumlah</th></tr></thead><tbody>';
|
|
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td><td class="r">%s</td><td class="r">%s</td></tr>';
|
|
$_sline = '<tr><td class="r b" colspan="4">%s</td><td class="r b" colspan="2">%s</td></tr>';
|
|
|
|
$body = $kop.$header; $no_urut = 1;
|
|
foreach ($aitem as $item) {
|
|
$body .= sprintf($_line, $no_urut++, $item['Nama_Produk'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Beli']), rupiah2($item['Jumlah']));
|
|
}
|
|
$body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Jumlah']));
|
|
|
|
$t_catat = empty($ainfo['No_Faktur']) ? ' ' : 'Catatan : <i>'.$ainfo['No_Faktur'].'</i>.';
|
|
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
|
|
|
echo '<div>' . $body . '</div>';
|
|
}
|
|
|
|
public function jual(): void {
|
|
if (empty($this->no_cetak)) return;
|
|
|
|
$ainfo = $this->db->fetchRow("SELECT J.*,DATE_FORMAT(J.Tgl_Jual,'%d-%m-%Y') Tgl_Jual2,B.Kode_Member,B.Nama_Member,B.Alamat_Member,J.Total_Jual-J.Total_Diskon Jumlah FROM inv_jual J LEFT JOIN para_member B ON (J.MemberID=B.MemberID) WHERE J.No_Jual=?", [$this->no_cetak]);
|
|
$ainfo['Alamat_Member'] = str_replace("\n", "<br>", $ainfo['Alamat_Member']);
|
|
|
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Jual,Disk_Rupiah,SUM(-Qty) Qty,SUM(-Qty*Harga_Jual)-SUM(Total_Diskon) Jumlah FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Jual,Disk_Rupiah) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
|
if (count($aitem) === 0) return;
|
|
|
|
// menampilkan judul dibagian atas laporan
|
|
$kop = '<table class="notaHeader"><tbody>';
|
|
$kop .= '<tr><td width="50%" class="fw-bold fs-6">'.$this->web_app['REG_NAME'].'</td><td width="50%">Kepada Yth.,</td></tr>';
|
|
$kop .= '<tr><td>'.$this->web_app['REG_CITY'].'</td><td><span class="fw-bold fs-6">'.$ainfo['Nama_Member'].'</span>'.(($ainfo['Kode_Member'])?" [".$ainfo['Kode_Member']."]":"").'</td></tr>';
|
|
$kop .= '<tr><td>'.$this->web_app['REG_PHONE'].'</td><td>'.$ainfo['Alamat_Member'].'</td></tr>';
|
|
$kop .= '<tr><td>No. Faktur : '.$ainfo['No_Jual'].'</td><td>Tanggal : '.$ainfo['Tgl_Jual2'].'</td></tr>';
|
|
$kop .= '</tbody></table>';
|
|
|
|
$header = '<table class="notaTable"><thead><tr><th style="width:5ch">No.</th><th>Nama Barang</th><th colspan="2" style="width:3cm">Banyaknya</th><th style="width:2cm">Harga @</th><th style="width:2cm">Diskon @</th><th style="width:3cm">Jumlah</th></tr></thead><tbody>';
|
|
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r nbr">%s</td><td class="nbl">%s</td><td class="r">%s</td><td class="r">%s</td><td class="r">%s</td></tr>';
|
|
$_sline = '<tr><td class="r b" colspan="5">%s</td><td class="r b">%s</td><td class="r b">%s</td></tr>';
|
|
$_empt = '<tr><td colspan="7"> </td></tr>';
|
|
|
|
$body = $kop.$header; $no_urut = 0;
|
|
foreach ($aitem as $item) {
|
|
$body .= sprintf($_line, ++$no_urut, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Jual']), rupiah2($item['Disk_Rupiah']), rupiah2($item['Jumlah']));
|
|
}
|
|
if ($no_urut < 8) {
|
|
$body .= str_repeat($_empt, 8-$no_urut);
|
|
}
|
|
$body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Total_Diskon']), rupiah2($ainfo['Jumlah']));
|
|
|
|
$body .= '</tbody></table><table class="notaFooter"><tr><td>Penerima,</td><td>Hormat Kami,</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
|
|
|
echo '<div>' . $body . '</div>';
|
|
}
|
|
|
|
function opname(): void {
|
|
if (empty($this->no_cetak)) return;
|
|
|
|
$ainfo = $this->db->fetchRow("SELECT *,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y') Tgl_Opname2 FROM inv_opname WHERE No_Opname=?", [$this->no_cetak]);
|
|
$ainfo['Catatan'] = str_replace("\n", "<br>", $ainfo['Catatan']);
|
|
|
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,SUM(Qty) Qty FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
|
if (count($aitem) === 0) return;
|
|
|
|
// menampilkan judul dibagian atas laporan
|
|
$kop = '<div class="notaTitle"><div>'.$this->web_app['REG_NAME'].'</div>STOK OPNAME</div>';
|
|
$kop .= '<table class="notaHeader"><tbody>';
|
|
$kop .= '<tr><td width="15%">No. Opname</td><td width="35%" class="ttkdua">'.$ainfo['No_Opname'].'</td><td width="15%"> </td><td width="35%" class=""> </td></tr>';
|
|
$kop .= '<tr><td>Tanggal Opname</td><td class="ttkdua">'.$ainfo['Tgl_Opname2'].'</td><td> </td><td class=""> </td></tr>';
|
|
$kop .= '</tbody></table>';
|
|
|
|
$header = '<table class="garis"><thead><tr><th style="width:1cm">No.</th><th>Nama Barang</th><th style="width:2.2cm">Qty</th><th>Satuan</th></tr></thead><tbody>';
|
|
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td></tr>';
|
|
|
|
$body = $kop.$header; $no_urut = 1;
|
|
foreach ($aitem as $item) {
|
|
$body .= sprintf($_line, $no_urut++, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan']);
|
|
}
|
|
|
|
$t_catat = empty($ainfo['Catatan']) ? ' ' : 'Catatan : <i>'.$ainfo['Catatan'].'</i>.';
|
|
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
|
|
|
echo '<div>' . $body . '</div>';
|
|
}
|
|
|
|
function mutasi(): void {
|
|
if (empty($this->no_cetak)) return;
|
|
|
|
$ainfo = $this->db->fetchRow("SELECT M.*,C1.Nama_Cab Cabang1,C2.Nama_Cab Cabang2 FROM (SELECT * FROM inv_mutasi WHERE No_Mutasi=?) M LEFT JOIN para_cabang C1 ON (C1.CabID=M.Dari_CabID) LEFT JOIN para_cabang C2 ON (C2.CabID=M.Ke_CabID)", [$this->no_cetak]);
|
|
$ainfo['Catatan'] = str_replace("\n", "<br>", $ainfo['Catatan']);
|
|
|
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? AND Qty>0 GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
|
if (count($aitem) === 0) return;
|
|
|
|
// menampilkan judul dibagian atas laporan
|
|
$kop = '<div class="notaTitle"><div>'.$this->web_app['REG_NAME'].'</div>MUTASI STOK</div>';
|
|
$kop .= '<table class="notaHeader"><tbody>';
|
|
$kop .= '<tr><td width="15%">No. Mutasi</td><td width="35%" class="ttkdua">'.$ainfo['No_Mutasi'].'</td><td width="15%">Dari Cabang</td><td width="35%" class="ttkdua">'.$ainfo['Cabang1'].'</td></tr>';
|
|
$kop .= '<tr><td>Tanggal Mutasi</td><td class="ttkdua">'.tgl_sql2str($ainfo['Tgl_Mutasi']).'</td><td>Ke Cabang</td><td class="ttkdua">'.$ainfo['Cabang2'].'</td></tr>';
|
|
$kop .= '</tbody></table>';
|
|
|
|
$header = '<table class="garis"><thead><tr><th style="width:1cm">No.</th><th>Nama Barang</th><th style="width:2.2cm">Qty</th><th>Satuan</th><th>Harga @</th><th>Jumlah</th></tr></thead><tbody>';
|
|
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td><td class="r">%s</td><td class="r">%s</td></tr>';
|
|
$_sline = '<tr><td class="r b" colspan="4">%s</td><td class="r b" colspan="2">%s</td></tr>';
|
|
|
|
$body = $kop.$header; $no_urut = 1;
|
|
foreach ($aitem as $item) {
|
|
$body .= sprintf($_line, $no_urut++, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Beli']), rupiah2($item['Jumlah']));
|
|
}
|
|
$body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Total_Mutasi']));
|
|
|
|
$t_catat = empty($ainfo['Catatan']) ? ' ' : 'Catatan : <i>'.$ainfo['Catatan'].'</i>.';
|
|
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
|
|
|
echo '<div>' . $body . '</div>';
|
|
}
|
|
|
|
public function mutasi_pos() {
|
|
if (empty($this->no_cetak)) return;
|
|
|
|
$ainfo = $this->db->fetchRow("SELECT M.*,C1.Nama_Cab Cabang1,C2.Nama_Cab Cabang2 FROM (SELECT * FROM inv_mutasi WHERE No_Mutasi=?) M LEFT JOIN para_cabang C1 ON (C1.CabID=M.Dari_CabID) LEFT JOIN para_cabang C2 ON (C2.CabID=M.Ke_CabID)", [$this->no_cetak]);
|
|
$ainfo['Catatan'] = str_replace("\n", "<br>", $ainfo['Catatan']);
|
|
|
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? AND Qty>0 GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
|
if (count($aitem) === 0) return;
|
|
|
|
$pre = new PrintPOS($this->app);
|
|
if ($this->is_thermal) {
|
|
$pre->set_fontsize(2);
|
|
$pre->set_header_logo("logo-nota.png");
|
|
} else {
|
|
$pre->add_header($this->web_app['REG_NAME'], $this->web_app['REG_CITY']);
|
|
}
|
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
|
$pre->add([$ainfo['No_Mutasi'],20,"L"], [tgl_sql2str($ainfo['Tgl_Mutasi']),20,"R"]);
|
|
$pre->add(["Dari Cabang : ",14,"L"], [$ainfo['Cabang1'],36,"L"]);
|
|
$pre->add(["Ke Cabang : ",14,"L"], [$ainfo['Cabang2'],36,"L"]);
|
|
$pre->add_line("-");
|
|
|
|
foreach ($aitem as $item) {
|
|
$pre->add([$item['Nama_Produk_Varian'],29,"L"], [rupiah2($item['Qty']),7,"R"], [$item['Nama_Satuan'],4,"L"]);
|
|
}
|
|
|
|
$pre->add_line("-");
|
|
$pre->add_stamp(1, false);
|
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
|
$pre->show();
|
|
}
|
|
|
|
public function tukarpoint_pos() {
|
|
if (empty($this->no_cetak)) return;
|
|
|
|
$ainfo = $this->db->fetchRow("SELECT T.*,DATE_FORMAT(T.Tgl_TX,'%d-%m-%Y') Tgl_TX2,DATE_FORMAT(T.DateStamp,'%H:%i:%s') Jam_TX,UCASE(O.Nama) Nama_User,M.Kode_Member,M.Nama_Member,M.IM,B.Nama_Barang,UPPER(P.Nama_Tipe) Nama_Tipe FROM (SELECT * FROM inv_point_tx WHERE No_TX=?) T LEFT JOIN app_operator O ON (T.UserID=O.UserID) LEFT JOIN para_member M ON (M.MemberID=T.MemberID) LEFT JOIN inv_point_barang B ON (T.InvPID=B.InvPID) LEFT JOIN inv_point_tipe P ON (P.Point_TipeID=T.Point_TipeID)", [$this->no_cetak]);
|
|
|
|
$pre = new PrintPOS($this->app);
|
|
if ($this->is_thermal) {
|
|
$pre->set_fontsize(2);
|
|
$pre->set_header_logo("logo-nota.png");
|
|
} else {
|
|
$pre->add_header($this->web_app['REG_NAME'], $this->web_app['REG_CITY']);
|
|
}
|
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
|
if (!empty($this->app_inv['TITLE_BEGIN'])) {
|
|
$_ahead = explode("[br]", stripslashes($this->app_inv['TITLE_BEGIN']));
|
|
foreach ($_ahead as $val) $pre->addc($val);
|
|
}
|
|
|
|
$pre->add([$ainfo['No_TX'],20,"L"], [$ainfo['Tgl_TX2'],20,"R"]);
|
|
$pre->add([$ainfo['Nama_User'],20,"L"], [$ainfo['Jam_TX'],20,"R"]);
|
|
$pre->add_line("-");
|
|
|
|
$pre->add("Kode Member : ".$ainfo['Kode_Member']);
|
|
$pre->add("Nama Member : ".$ainfo['Nama_Member']);
|
|
$pre->add_empty();
|
|
$pre->addc("PENUKARAN POINT MEMBER ".$ainfo['Nama_Tipe']);
|
|
$pre->add(rupiah($ainfo['Qty'])." ".$ainfo['Nama_Barang']." @ ".rupiah($ainfo['Point']*-1));
|
|
$pre->add("Sejumlah ".rupiah($ainfo['Nilai_Point']*-1)." Point");
|
|
|
|
$apoint = $this->db->fetchAll("SELECT P.*,S.Sisa_Point FROM inv_point_tipe P LEFT JOIN (SELECT Point_TipeID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE MemberID=? GROUP BY Point_TipeID ORDER BY Point_TipeID) S ON (S.Point_TipeID=P.Point_TipeID) WHERE P.Aktif=1 ORDER BY P.Point_TipeID", [$ainfo['MemberID']]);
|
|
if (count($apoint) > 0) $pre->add_line();
|
|
foreach ($apoint as $point) {
|
|
if ($point['Point_TipeID'] === 1 && $ainfo['IM'] === 0) continue;
|
|
if ($point['Point_TipeID'] > 1 && $ainfo['IM'] === 0 && empty($ainfo['Kode_Member'])) continue;
|
|
$pre->addc(str_replace('[TOT_POINT]', rupiah($point['Sisa_Point']), $point['Txt_Struk1']));
|
|
}
|
|
|
|
$pre->add_empty();
|
|
if (!empty($this->app_inv['TITLE_END'])) {
|
|
$_afoo = explode("[br]", stripslashes($this->app_inv['TITLE_END']));
|
|
foreach($_afoo as $val) $pre->addc($val);
|
|
}
|
|
$pre->add_stamp(1, false);
|
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
|
$pre->show();
|
|
}
|
|
|
|
public function gaji(): void {
|
|
$list_id = Param::Get("List_CB_ID", "0");
|
|
if (empty($this->no_cetak) && $list_id === "0") return;
|
|
$abulan = bulan_array();
|
|
|
|
$pre = new PrintPOS($this->app);
|
|
if ($this->is_thermal) {
|
|
$pre->set_fontsize(2);
|
|
$pre->set_header_logo("logo-nota.png");
|
|
} else {
|
|
$pre->add_header($this->web_app['REG_NAME'], $this->web_app['REG_CITY']);
|
|
}
|
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
|
|
|
$_info = $this->db->fetchRow("SELECT DATE_FORMAT(Tgl_Gaji,'%d-%m-%Y') Tgl_Gaji,Tgl_Gaji Tgl_Gaji2,Minggu,Bulan,Tahun,Kode_Jurnal,Catatan Catatan1,UserID FROM gel_gaji WHERE No_Gaji=?", [$this->no_cetak]);
|
|
$ainfo = ($_info) ? $_info->getData() : [];
|
|
if ($ainfo['UserID']) {
|
|
$ainfo['Nama_OP'] = $this->db->fetchField("SELECT CONCAT(LPAD(UserID,3,'0'),'/',Nama) FROM app_operator WHERE UserID=?", [$ainfo['UserID']]) ?? '';
|
|
}
|
|
$aitem = $this->db->fetchAll("SELECT D.*,K.Nama_Karya,P.Sisa_Pinjam FROM (SELECT * FROM gel_gaji_detail WHERE No_Gaji=? AND ID IN (?)) D LEFT JOIN para_karyawan K ON (K.KaryaID=D.KaryaID) LEFT JOIN (SELECT KaryaID,SUM(Total_Pinjam-Total_Bayar) Sisa_Pinjam FROM gel_karyawan WHERE Tgl_Trans<=? GROUP BY KaryaID) P ON (P.KaryaID=D.KaryaID)", [$this->no_cetak, explode(',', $list_id), $ainfo['Tgl_Gaji2']]);
|
|
if (count($aitem) === 0) return;
|
|
|
|
foreach ($aitem as $item) {
|
|
$ainfo = array_merge($ainfo, $item->getData());
|
|
$acatat = [];
|
|
if (!empty($ainfo['Catatan1'])) {
|
|
$acatat = str_split(ucfirst(trim($ainfo['Catatan1'])), 40);
|
|
}
|
|
if (!empty($ainfo['Catatan'])) {
|
|
$acatat = array_merge($acatat, str_split(ucfirst(trim($ainfo['Catatan'])), 40));
|
|
}
|
|
|
|
$txt_qty_hari = ($ainfo['Qty_Harian'] === round($ainfo['Qty_Harian'])) ? rupiah($ainfo['Qty_Harian']) : rupiah($ainfo['Qty_Harian'],1);
|
|
$pre->add(["SLIP GAJI",20,"L"], [$ainfo['Tgl_Gaji'],20,"R"]);
|
|
$pre->add("Minggu ".$ainfo['Minggu']." / Bulan ".$abulan[$ainfo['Bulan']]." ".$ainfo['Tahun']);
|
|
$pre->add_empty();
|
|
$pre->add("Nama Karyawan : ".$ainfo['Nama_Karya']);
|
|
if ($ainfo['Sisa_Pinjam'] !== 0 ) $pre->add([($ainfo['Sisa_Pinjam']>0?"Sisa Pinjaman ":"Saldo Tabungan")." : Rp.",20], [rupiah(abs($ainfo['Sisa_Pinjam'])),20,"R"]);
|
|
$pre->add("Hari Kerja : ".$txt_qty_hari." Hari");
|
|
$pre->add(["Gaji Mingguan : Rp.",20], [rupiah($ainfo['Total_Gaji']),20,"R"]);
|
|
if ($ainfo['Total_Lembur'] > 0) $pre->add(["Lembur Harian : Rp.",20], [rupiah($ainfo['Total_Lembur']),20,"R"]);
|
|
if ($ainfo['Total_BonusM'] > 0) $pre->add(["Bonus Mingguan : Rp.",20], [rupiah($ainfo['Total_BonusM']),20,"R"]);
|
|
if ($ainfo['Total_BonusB'] > 0) $pre->add(["Bonus Bulanan : Rp.",20], [rupiah($ainfo['Total_BonusB']),20,"R"]);
|
|
if ($ainfo['Total_Potong'] > 0) $pre->add(["Potongan : Rp.",20], [rupiah($ainfo['Total_Potong']*-1),20,"R"]);
|
|
$pre->add_line("-");
|
|
$pre->add(["GAJI BERSIH : RP.",20], [rupiah($ainfo['Total_Semua']),20,"R"]);
|
|
$pre->add_line("=");
|
|
$pre->add([date("YmdHis")."=",15], [$ainfo['Nama_OP'],25,"R"]);
|
|
if (count($acatat) > 0) {
|
|
$pre->add_empty(1);
|
|
$pre->add("INFORMASI :");
|
|
foreach ($acatat as $val) $pre->add($val);
|
|
}
|
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
|
$pre->add_sheet();
|
|
}
|
|
$pre->show();
|
|
}
|
|
|
|
public function ppob(): void {
|
|
if (empty($this->no_cetak)) return;
|
|
|
|
$ncetak = 1; $is_orig = ($this->op_cash > 0) ? true : false;
|
|
$is_token = 0;
|
|
$ainfo = $this->db->fetchRow("SELECT P.*,UCASE(O.Nama) Nama_User,UCASE(LEFT(B.Nama_Kartu,23)) Kode_Kartu2,UCASE(P.Nama_Kartu) Nama_Kartu2,RIGHT(P.No_Kartu,4) No_Kartu2,U.Nama_Produk,U.KateID FROM (SELECT *,DATE_FORMAT(Tgl_TX,'%d-%m-%Y') Tgl_TX2,DATE_FORMAT(DateStamp,'%H:%i:%s') Jam_Jual,(Total_Bayar-Harga_Jual) Total_Sisa FROM ppob_tx WHERE No_TX=?) P LEFT JOIN app_operator O ON (P.UserID=O.UserID) LEFT JOIN para_rek_pos B ON (P.KartuID=B.KartuID) LEFT JOIN ppob_produk U ON (P.ProdukID=U.ProdukID)", [$this->no_cetak]);
|
|
if ((int) $ainfo['KartuID'] > 0) $ncetak++;
|
|
if ((int) $ainfo['KateID'] === 5) $is_token = 1;
|
|
|
|
$pre = new PrintPOS($this->app);
|
|
if ($this->is_thermal) {
|
|
$pre->set_fontsize(2);
|
|
$pre->set_header_logo("logo-nota.png");
|
|
} else {
|
|
$pre->add_header($this->web_app['REG_NAME'], $this->web_app['REG_CITY']);
|
|
}
|
|
if ($this->app_inv['PRINT_OPENCD'] === 1 && $this->op_cash === 1) $pre->set_opendrawer();
|
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
|
if (!empty($this->app_inv['TITLE_BEGIN'])) {
|
|
$_ahead = explode("[br]", stripslashes($this->app_inv['TITLE_BEGIN']));
|
|
foreach ($_ahead as $val) $pre->addc($val);
|
|
}
|
|
|
|
$pre->add([$ainfo['No_TX'],20], [$ainfo['Tgl_TX2'],20,"R"]);
|
|
$pre->add([$ainfo['Nama_User'],20], [$ainfo['Jam_Jual'],20,"R"]);
|
|
$pre->add_line("-");
|
|
$pre->add(["Nomor Tujuan",14], [": ".$ainfo['Tujuan'],27,"L"]);
|
|
$pre->add(["Isi Ulang",14], [": ".$ainfo['Nama_Produk'],27,"L"]);
|
|
if ($is_token === 1) {
|
|
$atoken = PPOBClient::SN_PLN($ainfo['SN']);
|
|
$pre->add(["Nama Pelanggan",14], [": ".$atoken['Nama'],27,"L"]);
|
|
$pre->add(["Tarif / Daya",14], [": ".$atoken['Daya'],27,"L"]);
|
|
$pre->add(["Nilai Token",14], [": ".$atoken['Kwh'],27,"L"]);
|
|
$pre->add(["Kode Token",14], [": ",27,"L"]);
|
|
$pre->add("_SBOLD_".$atoken['Token']."_NORM_", "X");
|
|
}
|
|
$pre->add_line("-");
|
|
$pre->add(["JUMLAH Rp.",25,"R"], [rupiah($ainfo['Harga_Jual']),15,"R"]);
|
|
if ((float) $ainfo['Total_Tunai'] > 0) $pre->add(["TUNAI Rp.",25,"R"], [rupiah($ainfo['Total_Tunai']),15,"R"]);
|
|
if ((float) $ainfo['Total_Kartu'] > 0) $pre->add(["NON TUNAI Rp.",25,"R"], [rupiah($ainfo['Total_Kartu']),15,"R"]);
|
|
|
|
if ((int) $ainfo['KartuID'] === 0) {
|
|
$pre->add(["KEMBALI Rp.",25,"R"], [rupiah($ainfo['Total_Sisa']),15,"R"]);
|
|
} else {
|
|
$pre->add_empty();
|
|
$pre->add("* ".$ainfo['Kode_Kartu2']." - ".($ainfo['No_Kartu2'] ?: "XXXX"));
|
|
if (!empty($ainfo['Nama_Kartu2'])) $pre->add(" ".$ainfo['Nama_Kartu2']);
|
|
}
|
|
|
|
$pre->add_empty();
|
|
if (!empty($this->app_inv['TITLE_END'])) {
|
|
$_afoo = explode("[br]", stripslashes($this->app_inv['TITLE_END']));
|
|
foreach($_afoo as $val) $pre->addc($val);
|
|
}
|
|
if ($is_orig === false) $pre->addc("-- SALINAN / COPY --");
|
|
$pre->add_stamp(1, false);
|
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
|
$pre->show($ncetak);
|
|
}
|
|
|
|
public function open_cash(): void {
|
|
$pre = new PrintPOS($this->app);
|
|
if ($this->app_inv['PRINT_OPENCD'] === 1) $pre->set_opendrawer();
|
|
$pre->show();
|
|
}
|
|
|
|
private function Report_Stamp(int $ctk_ke=1, bool $bnama=false): string {
|
|
return $this->web_app['APP_NAME']."v".$this->web_app['APP_VER'].date("\@ymd.His")."-".$this->app->user()->id(3).(($bnama==true)?"/".strtoupper($this->app->user()->username()):"").(($ctk_ke>0)?"#".isi_nol($ctk_ke,2):"");
|
|
}
|
|
|
|
}
|