Files
cmasa/app/Controller/Report/NotaController.php
T

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']) ? '&nbsp;' : 'Catatan : <i>'.$ainfo['Catatan'].'</i>.';
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp">&nbsp;</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']) ? '&nbsp;' : 'Catatan : <i>'.$ainfo['No_Faktur'].'</i>.';
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp">&nbsp;</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">&nbsp;</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">&nbsp;</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%">&nbsp;</td><td width="35%" class="">&nbsp;</td></tr>';
$kop .= '<tr><td>Tanggal Opname</td><td class="ttkdua">'.$ainfo['Tgl_Opname2'].'</td><td>&nbsp;</td><td class="">&nbsp;</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']) ? '&nbsp;' : 'Catatan : <i>'.$ainfo['Catatan'].'</i>.';
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp">&nbsp;</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']) ? '&nbsp;' : 'Catatan : <i>'.$ainfo['Catatan'].'</i>.';
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp">&nbsp;</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):"");
}
}