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
+331
View File
@@ -0,0 +1,331 @@
<?php
/*******************************************************************
PHP Class : /Controller/Promo/BelidiscController
Description : Promo Beli & Diskon
Created By : Siau Pheng ([email protected]).
Created Date : September 28th, 2014.
Last Modified : October 29th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Promo;
use App\Utils\Invesa;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class BelidiscController {
private int $id_cab;
private string $mode;
private string $mode_detail;
private int $id_grup;
private int $id_inv;
private int $id_satuan;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->id_cab = Param::Int("CabID", 0);
$this->mode = Param::Get("mode", "");
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_grup = Param::Int("Grup_PromoID", 0);
$this->id_inv = Param::Int("InvID", 0);
$this->id_satuan = Param::Int("SatuanID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("inv_promo");
$sql->add_param("Grup_PromoID");
$sql->add_param("InvID");
$sql->add_param("SatuanID");
$sql->add_param("Jual_Grup", Param::Get("List_CB_VarianID", "0"));
$sql->add_param_userid();
$sql->add_where("PromoID");
if ( $this->mode_detail === "insert" ) {
$sql->add_param("Tipe_Promo", 5);
$sql->InsertDB();
} else if ( $this->mode_detail === "update" ) {
$sql->UpdateDB();
} else if ( $this->mode_detail === "delete" ) {
$sql->DeleteDB();
}
}
$tsql = 'Tipe_Promo=? AND Grup_PromoID=?'; $asql = [5, $this->id_grup];
$obj = new Table($this->app);
$obj->set_table("(SELECT * FROM inv_promo WHERE ".$tsql.") D LEFT JOIN inv_produk P ON (D.InvID=P.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=D.SatuanID)", "D.*,P.Nama_Produk,Nama_Varian(IF(ISNULL(D.Jual_Grup) OR D.Jual_Grup='','0',D.Jual_Grup)) Nama_Varian,S.Nama_Satuan", "", $asql);
$obj->add_field("PromoID", "ID", "hid");
$obj->add_field("InvID", "InvID", "hid");
$obj->add_field("SatuanID", "SatuanID", "hid");
$obj->add_field("Jual_Grup", "Varian", "hid");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Nama_Satuan", "Satuan", "l");
$obj->add_field("Nama_Varian", "Varian", "awr");
if (in_array($this->mode, ["add","edit"])) {
$obj->add_row_btn("clipboard", "Ubah", "PromoBeliDiscJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "PromoBeliDiscJS.detail_hapus", "Grup_PromoID", $this->id_grup);
$obj->set_func_btn("PromoBeliDiscJS.detail_tambah", '<i class="bi-plus me-1"></i> Barang');
$obj->set_func_btn("PromoBeliDiscJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
}
$ajson[] = $obj->json_table("divDetailTabel");
$this->app->json($ajson);
}
public function brow_promo() {
$tcari = Param::Get("Cari_Promo");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql .= "Promo_Nama LIKE ?";
array_push($asql, '%' . $tcari . '%');
}
$obj = new Table($this->app);
$obj->set_table("inv_promo_grup", "*", $tsql, $asql);
$obj->add_field("Grup_PromoID", "ID", "hid");
$obj->add_field("Promo_Nama", "Nama Promo", "awr");
$obj->add_field("Tgl_Mulai", "Tgl. Mulai", "c", "sqltgl", "", "val-tgl");
$obj->add_field("Tgl_Akhir", "Tgl. Akhir", "c", "sqltgl", "", "val-tgl");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_func_select("PromoBeliDiscJS.promo_select");
$this->app->json([ $obj->db_table("divBrowPromo") ]);
}
public function brow_produk() {
$tcari = Param::Get("Cari_Produk");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql .= " AND Nama_Produk LIKE ?";
$asql[] = '%' . $tcari . '%';
}
$obj = new Table($this->app);
$obj->set_table("inv_produk", "*", $tsql, $asql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("NormalID", "ID", "hid");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->set_func_select("PromoBeliDiscJS.produk_select");
$this->app->json([ $obj->db_table("divBrowProduk") ]);
}
public function auto_produk() {
$tcari = Param::Get("Auto_Query", "");
$ajson['autodata'] = [];
// Cari by Nama_Produk
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Produk,P.NormalID Data2 FROM inv_produk P WHERE P.Nama_Produk LIKE ? ORDER BY P.Nama_Produk LIMIT 50", ['%'.$tcari.'%']);
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>$row['Nama_Produk'], 'data'=>$row['Data2'], 'bc'=>0];
}
$this->app->json($ajson);
}
public function form_master() {
$ajson = [ 'error'=>"", 'html'=>"" ];
$atabel = [];
if ($this->mode === "add") {
$atabel = $this->Data_Promo(true);
} else if ($this->mode === "save") {
$sql = new SQL($this->app);
$sql->set_table("inv_promo_grup");
$sql->add_param("CabID", $this->id_cab);
$sql->add_param("Grup_MemberID");
$sql->add_param("Qty_Kali");
$sql->add_param("Tipe_Promo");
$sql->add_param("Promo_Nama");
$sql->add_param("Promo_Minggu");
$sql->add_param("Promo_Disc");
$sql->add_param_date("Tgl_Mulai");
$sql->add_param_date("Tgl_Akhir");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("Grup_PromoID");
if ($this->id_grup === 0) {
$sql->add_param("Pilih_Qty", 3);
$sql->InsertDB();
} else {
$sql->UpdateDB();
$this->db->runQuery("UPDATE inv_promo_grup a, inv_promo b SET b.CabID=a.CabID,b.Grup_MemberID=a.Grup_MemberID,b.Pilih_Qty=a.Pilih_Qty,b.Qty_Kali=a.Qty_Kali,b.Tipe_Promo=a.Tipe_Promo,b.Promo_Disc=a.Promo_Disc,b.Tgl_Mulai=a.Tgl_Mulai,b.Tgl_Akhir=a.Tgl_Akhir,b.Aktif=a.Aktif WHERE a.Grup_PromoID=a.Grup_PromoID");
}
$this->mode = "view";
} else if ($this->mode === "cancel") {
$this->db->runQuery("DELETE FROM inv_promo WHERE Tipe_Promo=5 AND Grup_PromoID=0");
$atabel = $this->Data_Promo();
} else {
$atabel = $this->Data_Promo();
}
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
$form = new Form($this->app);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]);
$tgrup_mem = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], $enable, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
$tqty = $form->textbox("_", "Qty_Kali", $atabel['Qty_Kali'], $enable, true, "double");
$tnama = $form->textbox("_", "Promo_Nama", $atabel['Promo_Nama'], $enable, true, "text", "nama promo");
$tminggu = $form->textbox("_", "Promo_Minggu", $atabel['Promo_Minggu'], $enable, true, "text", "hari promo");
$tdisc = $form->textbox("_", "Promo_Disc", $atabel['Promo_Disc'], $enable, true, "double");
$ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], $enable, true);
$ttglakhir = $form->datebox("_", "Tgl_Akhir", $atabel['Tgl_Akhir'], $enable, true);
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Promo">Nama Promo</label>
<div class="col"><div class="input-group">'.$tnama.'<button id="butBrow" class="btn btn-info" type="button"><i class="bi-shop-window"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="CabID">Nama Cabang</label>
<div class="col-sm-8 col-lg-4">'.$tcab.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Minggu">Hari Promo</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tminggu.Invesa::Form_Info("Kode Hari dalam Angka. Contoh : 1 = Senin, 2 = Selasa, ... 0 = Minggu.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Grup_MemberID">Grup Member</label>
<div class="col-sm-8 col-lg-4">'.$tgrup_mem.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Mulai">Tanggal Mulai</label>
<div class="col-sm-8 col-lg-3">'.$ttglmulai.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-8 col-lg-4">'.$taktif.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Akhir">Tanggal Akhir</label>
<div class="col-sm-8 col-lg-3">'.$ttglakhir.'</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Qty_Kali">Jumlah Kelipatan</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tqty.Invesa::Form_Info("Jumlah Kelipatan Penjualan untuk mendapatkan promo. Contoh : Beli 2 PCS, item Ke-2 Disc 50%, Berarti = 2 PCS.").'</div></div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Disc">Persen Diskon</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tdisc.Invesa::Form_Info("Nilai Diskon Satuan Barang berdasarkan kriteria. Contoh : 50%, Berarti = 0.50.").'</div></div>
</div>
<input type="hidden" id="Tipe_Promo" value="'.$atabel['Tipe_Promo'].'" >
<input type="hidden" id="Grup_PromoID" value="'.$atabel['Grup_PromoID'].'" >
<input type="hidden" id="mode" value="'.$this->mode.'" >';
$this->app->json($ajson);
}
public function form_produk() {
$id = (int) Param::Get("PromoID", 0);
$atabel = [ 'PromoID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'Kode_Varian'=>Param::Get("Kode_Varian", "0"), 'Nama_Produk'=>"" ];
if ($this->id_inv > 0) {
$_row = $this->db->fetchRow("SELECT Nama_Produk FROM inv_produk WHERE InvID=?", [$this->id_inv]);
if ($_row) $atabel = array_merge($atabel, $_row->getData());
}
$form = new Form($this->app);
$tnama = $form->textauto("_", "Nama_Produk", ['value'=>$this->id_inv,'text'=>$atabel['Nama_Produk']], true, true, "nama barang");
$tsat = $form->option("_", "SatuanID", $atabel['SatuanID'], true, false, [0=>""]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Produk">Nama Barang</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="SatuanID">Satuan Barang</label>
<div class="col">'.$tsat.'</div>
</div>
<div id="divBrowVarian"></div>
<input type="hidden" id="PromoID" value="'.$atabel['PromoID'].'" >
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'" >
<input type="hidden" id="Kode_Varian" value="'.$atabel['Kode_Varian'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function form_varian() {
$kode_varian = Param::Get("Kode_Varian", "0"); $avarian = explode(",", $kode_varian);
$obj = new Table($this->app);
$obj->set_table("(SELECT VarianID FROM inv_produk_varian WHERE InvID=? AND SatuanID=?) K LEFT JOIN para_varian V ON (K.VarianID=V.VarianID)", "K.VarianID,IFNULL(V.Nama_Varian,'Tanpa Varian') Nama_Varian,IF(K.VarianID IN (?),'Y','N') Cek", "", [$avarian, $this->id_inv, $this->id_satuan]);
$obj->add_field("VarianID", "ID", "hid");
$obj->add_field("Nama_Varian", "Nama Varian", "awr");
$obj->add_row_checkbox("VarianID", "Cek");
$obj->set_field_order("Nama_Varian", "A");
$this->app->json([ $obj->json_table("divBrowVarian") ]);
}
public function proses_delete() {
$this->db->runQuery("DELETE FROM inv_promo_grup WHERE Grup_PromoID=?", [$this->id_grup]);
$this->db->runQuery("DELETE FROM inv_promo WHERE Grup_PromoID=?", [$this->id_grup]);
$this->app->json([ 'status' => true ]);
}
public function option_satuan() {
$aoption = ['type' => "option", 'id' => "SatuanID", 'value' => $this->id_satuan, 'avalue' => []];
$asatuan = $this->db->fetchAll("SELECT P.SatuanID,S.Nama_Satuan FROM (SELECT SatuanID,Qty FROM inv_produk_kemasan WHERE InvID=?) P LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID) ORDER BY P.Qty DESC", [$this->id_inv]);
foreach ($asatuan as $satuan) {
$aoption['avalue'][] = ['value'=>$satuan['SatuanID'], 'html'=>$satuan['Nama_Satuan']];
}
$this->app->json([ $aoption ]);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-table me-2"></i>Promo Penjualan Beli & Diskon</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-info mb-1 ms-2" id="butUbah" type="button"><i class="bi-clipboard me-2"></i>Ubah</button>
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>'
]);
}
private function Data_Promo(bool $is_new=false): array {
$aparam = [
'Grup_PromoID' => $this->id_grup,
'CabID' => $this->id_cab,
'Grup_MemberID' => 0,
'Tipe_Promo' => 5,
'Qty_Kali' => 0,
'Promo_Nama' => "",
'Promo_Minggu' => "",
'Promo_Disc' => 0,
'Tgl_Mulai' => tgl_ymd(),
'Tgl_Akhir' => tgl_sql2str(tgl_operasi(tgl_dmy(), 0, 1, 0)),
'Aktif' => 1,
];
if ($is_new) {
$aparam['Grup_PromoID'] = 0;
} else {
if ($this->id_grup > 0) {
$row = $this->db->fetchRow("SELECT * FROM inv_promo_grup WHERE Tipe_Promo IN (5) AND Grup_PromoID=?", [$this->id_grup]);
if ($row) $aparam = array_merge($aparam, $row->getData());
} else {
$row = $this->db->fetchRow("SELECT * FROM inv_promo_grup WHERE Tipe_Promo IN (5) ORDER BY Grup_PromoID DESC", []);
if ($row) $aparam = array_merge($aparam, $row->getData());
}
}
return $aparam;
}
}