first commit

This commit is contained in:
2026-10-29 13:34:31 +07:00
commit 45e4595c57
255 changed files with 35457 additions and 0 deletions
@@ -0,0 +1,280 @@
<?php
/*******************************************************************
PHP Class : /Controller/Report/Dana/PosController
Description : Laporan Penerimaan Dana POS / Kasir
Created By : Siau Pheng ([email protected]).
Created Date : September 8th, 2012.
Last Modified : October 9th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Report\Dana;
use flight\Engine;
use flight\database\SimplePdo;
use flight\Session;
use Webapp\Data\Xlsx;
use Webapp\Printer\PrintHTML;
use Webapp\Printer\PrintPOS;
use Webapp\Web\Form;
use Webapp\Web\Param;
class PosController {
private array $app_inv;
private string $reg_name;
private int $id_cab;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db, Session $session) {
$this->app = $app;
$this->db = $db;
$this->app_inv = (array) $session->get('APP_INV');
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
}
private function prepare(bool $is_pos = false) {
$apre = [
'tipe' => Param::Get("Tipe", "R"), // R or D
'id_kasir' => Param::Int("KasirID", 0),
'tgl_from' => Param::Get("Tgl_From"),
'tgl_to' => Param::Get("Tgl_To"),
];
// generate report header
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
if ($this->id_cab > 0) {
$tsql .= " AND CabID=?";
array_push($asql, $this->id_cab);
}
if ($apre['id_kasir'] > 0) {
$tsql .= " AND UserID=?";
array_push($asql, $apre['id_kasir']);
}
if ($is_pos === true) {
$apre['kasir'] = $this->db->fetchRow("SELECT * FROM app_operator WHERE UserID=?", [$apre['id_kasir']]);
$apre['query'] = $this->db->runQuery("SELECT J.KartuID,IF(J.KartuID=0,'Cash / Uang Tunai',K.Nama_Kartu) Kartu,SUM(IF(J.Kode='J',J.Total_Jual,0)) Total_Jual,SUM(IF(J.Kode='P',J.Total_Jual,0)) Total_Pulsa,SUM(J.Total_Diskon) Total_Diskon,SUM(J.Total_Potong) Total_Potong,SUM(J.Total_Cash) Total_Cash,SUM(J.Total_Kartu) Total_Kartu FROM ((SELECT 'J' Kode,KartuID,SUM(Total_Jual) Total_Jual,SUM(Total_Jual-Total_Kartu-Total_Diskon-Total_Potong) Total_Cash,SUM(Total_Kartu) Total_Kartu,SUM(Total_Diskon) Total_Diskon,SUM(Total_Potong) Total_Potong FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY KartuID ORDER BY KartuID) UNION ALL (SELECT 'P' Kode,KartuID,SUM(Harga_Jual) Total_Jual,SUM(Harga_Jual-Total_Kartu) Total_Cash,SUM(Total_Kartu) Total_Kartu,0 Total_Diskon,0 Total_Potong FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?) AND Status=4".$tsql." GROUP BY KartuID ORDER BY KartuID)) J LEFT JOIN para_rek_pos K ON (J.KartuID=K.KartuID) GROUP BY J.KartuID ORDER BY J.KartuID", array_merge($asql, $asql));
return $apre;
}
if ($apre['tipe'] === "R") {
$apre['query'] = $this->db->runQuery("SELECT O.UserID,O.Nama Nama_Kasir,SUM(IF(J.Kode='J',J.Total_Jual,0)) Total_Jual,SUM(IF(J.Kode='P',J.Total_Jual,0)) Total_Pulsa,SUM(IF(J.KartuID=0,J.Total_Jual-J.Total_Kartu-J.Total_Potong,0)) Total_Cash,SUM(J.Total_Kartu) Total_Kartu,SUM(J.Total_Potong) Total_Potong FROM ((SELECT 'J' Kode,UserID,KartuID,SUM(Total_Jual-Total_Diskon) Total_Jual,SUM(Total_Kartu) Total_Kartu,SUM(Total_Potong) Total_Potong FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY UserID,KartuID ORDER BY UserID,KartuID) UNION ALL (SELECT 'P' Kode,UserID,KartuID,SUM(Harga_Jual) Total_Jual,SUM(Total_Kartu) Total_Kartu,0 Total_Potong FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?) AND Status=4".$tsql." GROUP BY UserID,KartuID ORDER BY UserID,KartuID)) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) GROUP BY J.UserID", array_merge($asql, $asql));
} else {
$apre['query'] = $this->db->runQuery("SELECT J.*,O.Nama Nama_Kasir FROM (SELECT *,Total_Jual-Total_Diskon Total_Jual2,Total_Jual-Total_Kartu-Total_Diskon-Total_Potong Total_Cash FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN app_operator O ON (J.UserID=O.UserID) ORDER BY J.No_Jual", $asql);
}
return $apre;
}
public function pos() {
$apre = $this->prepare(true);
$tot_jual = 0; $tot_pulsa = 0; $tot_diskon = 0; $tot_potong = 0; $tot_dana = 0; $adana = [["Cash / Uang Tunai",0]];
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
$adana[0][1] += $row['Total_Cash'];
if ($row['KartuID'] > 0) $adana[$row['KartuID']] = [$row['Kartu'], $row['Total_Kartu']];
$tot_jual += $row['Total_Jual'];
$tot_pulsa += $row['Total_Pulsa'];
$tot_diskon += $row['Total_Diskon'];
$tot_potong += $row['Total_Potong'];
}
$tot_dana = $tot_jual + $tot_pulsa - $tot_potong - $tot_diskon;
$pre = new PrintPOS($this->app);
$pre->set_fontsize(2);//thermal
$pre->set_header_logo("logo-nota.png");//thermal
if ($this->app_inv['PRINT_OPENCD'] === 1) $pre->set_opendrawer();
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
$pre->add_empty();
$pre->addc("REKAP PENERIMAAN KASIR / POS");
$pre->addc("Periode : ".$apre['periode']);
$pre->add_empty();
$pre->add("Username : ".$apre['kasir']['Username']);
$pre->add("Kasir : ".$apre['kasir']['Nama']);
$pre->add_empty();
$pre->add(["Jumlah Penjualan Rp.",24], [rupiah($tot_jual),16,"R"]);
$pre->add(["Jumlah Pulsa & PPOB Rp.",24], [rupiah($tot_pulsa),16,"R"]);
$pre->add(["Jumlah Diskon Rp.",24], [rupiah($tot_diskon),16,"R"]);
if ($tot_potong > 0) $pre->add(["Jumlah Promo Rp.",24], [rupiah($tot_potong),16,"R"]);
$pre->add_line("-");
if (count($adana) > 1) {
foreach ($adana as $_val) $pre->add([$_val[0],21,"L"], ["Rp.",3], [rupiah($_val[1]),16,"R"]);
$pre->add_line("-");
}
$pre->add(["TOTAL PENERIMAAN Rp.",24], [rupiah($tot_dana),16,"R"]);
$pre->add_line("=");
$pre->add_stamp(1, false);
$pre->add_empty($this->app_inv['PRINT_ROW']);
$pre->show();
}
public function print() {
$apre = $this->prepare();
$pre = new PrintHTML($this->app);
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN KASIR / POS", "Periode : ".$apre['periode']]);
if ($apre['tipe'] === "R") {
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Kasir",20,"L");
$pre->add_field("Penjualan",20,"R","rupiah");
$pre->add_field("Pulsa & PPOB",20,"R","rupiah");
$pre->add_field("Promo",20,"R","rupiah");
$pre->add_field("Tunai / Cash",20,"R","rupiah");
$pre->add_field("Non Tunai",20,"R","rupiah");
$pre->show_titles();
$pre->show_headers();
$tot_jual = 0; $tot_pulsa = 0; $tot_potong = 0; $tot_cash = 0; $tot_kartu = 0; $nomor = 0;
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
$tot_jual += $row['Total_Jual'];
$tot_pulsa += $row['Total_Pulsa'];
$tot_potong += $row['Total_Potong'];
$tot_cash += $row['Total_Cash'];
$tot_kartu += $row['Total_Kartu'];
$pre->add_row([ ++$nomor, $row['Nama_Kasir'], $row['Total_Jual'], $row['Total_Pulsa'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'] ]);
}
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_pulsa,1,"R,B","rupiah"],[$tot_potong,1,"R,B","rupiah"],[$tot_cash,1,"R,B","rupiah"],[$tot_kartu,1,"R,B","rupiah"] ]);
} else {
$pre->add_field("No. Nota",30,"C");
$pre->add_field("Tanggal",30,"C", "tgl_sql2str");
$pre->add_field("Penjualan",30,"R","rupiah");
$pre->add_field("Promo",30,"R","rupiah");
$pre->add_field("Tunai / Cash",30,"R","rupiah");
$pre->add_field("Non Tunai",30,"R","rupiah");
$pre->add_field("Kasir",20,"L");
$pre->show_titles();
$pre->show_headers();
$tot_jual = 0; $tot_cash = 0; $tot_kartu = 0; $tot_potong = 0;
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
$tot_jual += $row['Total_Jual'];
$tot_cash += $row['Total_Cash'];
$tot_kartu += $row['Total_Kartu'];
$tot_potong += $row['Total_Potong'];
$pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Total_Jual2'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'], $row['Nama_Kasir'] ]);
}
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_potong,1,"R,B","rupiah"],[$tot_cash,1,"R,B","rupiah"],[$tot_kartu,1,"R,B","rupiah"] ]);
}
$pre->add_stamp(1, true);
$pre->show();
}
public function excel() {
$apre = $this->prepare();
$xls = new Xlsx($this->app);
$xls->set_meta([
'title' => "Data Penerimaan POS / Kasir",
'desc' => "Export Data Penerimaan POS / Kasir"
]);
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN POS / KASIR", "Periode : ".$apre['periode'] ]);
if ($apre['tipe'] === "R") {
$xls->add_field("No.", 5, "@integer");
$xls->add_field("Nama Kasir", 20, "@text");
$xls->add_field("Penjualan", 15, "#,##0.00");
$xls->add_field("Pulsa & PPOB", 15, "#,##0.00");
$xls->add_field("Promo", 15, "#,##0.00");
$xls->add_field("Tunai", 15, "#,##0.00");
$xls->add_field("Non Tunai", 15, "#,##0.00");
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
$xls->show_titles();
$xls->show_headers();
$tot_jual = 0; $tot_pulsa = 0; $tot_potong = 0; $tot_cash = 0; $tot_kartu = 0; $nomor = 0;
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
$tot_jual += $row['Total_Jual'];
$tot_pulsa += $row['Total_Pulsa'];
$tot_potong += $row['Total_Potong'];
$tot_cash += $row['Total_Cash'];
$tot_kartu += $row['Total_Kartu'];
$xls->add_row([ ++$nomor, $row['Nama_Kasir'], $row['Total_Jual'], $row['Total_Pulsa'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'] ]);
}
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_jual, $tot_pulsa, $tot_potong, $tot_cash, $tot_kartu ]);
} else {
$xls->add_field("No. Nota", 12, "@text");
$xls->add_field("Tanggal", 12, "@date");
$xls->add_field("Penjualan", 15, "#,##0.00");
$xls->add_field("Promo", 15, "#,##0.00");
$xls->add_field("Tunai / Cash", 15, "#,##0.00");
$xls->add_field("Non Tunai", 15, "#,##0.00");
$xls->add_field("Kasir", 20, "@text");
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
$xls->show_titles();
$xls->show_headers();
$tot_jual = 0; $tot_cash = 0; $tot_kartu = 0; $tot_potong = 0;
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
$tot_jual += $row['Total_Jual'];
$tot_cash += $row['Total_Cash'];
$tot_kartu += $row['Total_Kartu'];
$tot_potong += $row['Total_Potong'];
$xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Total_Jual2'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'], $row['Nama_Kasir'] ]);
}
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_jual, $tot_potong, $tot_cash, $tot_kartu, "" ]);
}
$xls->add_stamp(1, true);
$xls->download("Data Penerimaan POS ".str_replace("s/d","-",$apre['periode']).".xlsx");
unset($xls);
}
public function index() {
if ($this->app->user()->is_level(1)) {
$this->id_cab = 0;
$id_kasir = 0;
$tsql1 = '';
$tsql2 = ' AND Level>="'.$this->app->user()->level().'"';
if ($this->app->user()->id() > 1) $tsql2 .= ' AND UserID>1';
} else {
$id_kasir = $this->app->user()->id();
$tsql1 = ' AND CabID="'.$this->id_cab.'"';
$tsql2 = ' AND UserID="'.$this->app->user()->id().'"';
}
$form = new Form($this->app);
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1".$tsql1." ORDER BY CabID", [0,"SEMUA CABANG"]);
$tkasir = $form->option_db("_", "KasirID", $id_kasir, true, false, "app_operator", ["UserID","Nama"], "Aktif=1".$tsql2." ORDER BY Username", [0,"SEMUA KASIR"]);
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
<div class="col">'.$ttipe.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="KasirID">Nama Kasir</label>
<div class="col">'.$tkasir.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_From">Dari Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tto.'</div>
</div>';
$this->app->json($ajson);
}
}