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,83 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Gel/GajiController
Description : Master Standar Gaji
Created By : Siau Pheng ([email protected]).
Created Date : September 17th, 2014.
Last Modified : September 4th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Gel;
use flight\Engine;
use flight\database\SimplePdo;
use flight\Session;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
class GajiController {
private string $mode_detail;
private int $id_reg;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db, Session $session) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_reg = Param::Int("REG_ID", $session->get('WEB_APP')['REG_ID']);
}
public function form_gaji() {
if ( $this->mode_detail == "save" ) {
$sql = new SQL($this->app);
$sql->set_table("gel_config");
$sql->add_param("LEMBUR");
$sql->add_param("BONUS1");
$sql->add_param("BONUS2");
$sql->add_where("REG_ID");
$sql->UpdateDB();
$this->mode_detail = "view";
}
$atabel = [ 'REG_ID'=>0, 'LEMBUR'=>0, 'BONUS1'=>0, 'BONUS2'=>0 ];
if ($this->id_reg > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM gel_config WHERE REG_ID=?", [$this->id_reg]);
}
$benable = ($this->mode_detail === "update") ? true : false;
$form = new Form($this->app);
$tlembur = $form->textbox("_", "LEMBUR", $atabel['LEMBUR'], $benable, false, "double", "nilai lembur harian");
$tbonus1 = $form->textbox("_", "BONUS1", $atabel['BONUS1'], $benable, false, "double", "nilai bonus mingguan");
$tbonus2 = $form->textbox("_", "BONUS2", $atabel['BONUS2'], $benable, false, "double", "nilai bonus bulanan");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-6 col-lg-5 col-form-label" for="LEMBUR">Lembur Harian</label>
<div class="col">'.$tlembur.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-5 col-form-label" for="BONUS1">Bonus Mingguan</label>
<div class="col">'.$tbonus1.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-5 col-form-label" for="BONUS2">Bonus Bulanan</label>
<div class="col">'.$tbonus2.'</div>
</div>
<input type="hidden" id="REG_ID" value="'.$atabel['REG_ID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '<div id="divMaster">&nbsp;</div>' ]);
}
}
+105
View File
@@ -0,0 +1,105 @@
<?php
/*******************************************************************
// PHP Class : /Controller/Table/Gel/GrupController
Description : Master Grup Rekening
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : September 4th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Gel;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class GrupController {
private string $mode_detail;
private int $id_grup;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_grup = Param::Int("Grup_RekID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("gel_acc_grup");
$sql->add_param("Nama_Grup");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("Grup_RekID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Rek");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'Nama_Grup LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("gel_acc_grup", "*", $tsql, $asql);
$obj->add_field("Grup_RekID", "ID", "hid");
$obj->add_field("Nama_Grup", "Nama Grup Rekening", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Grup", "A");
$obj->add_row_btn("clipboard", "Ubah", "RekGrupJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "RekGrupJS.detail_hapus");
$obj->set_func_btn("RekGrupJS.detail_tambah", "+ Grup Rekening");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_grup() {
$atabel = [ 'Grup_RekID'=>0, 'Nama_Grup'=>"", 'Aktif'=>1 ];
if ($this->id_grup > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM gel_acc_Grup WHERE Grup_RekID=?", [$this->id_grup]);
}
$form = new Form($this->app);
$tnama = $form->textbox("_", "Nama_Grup", $atabel['Nama_Grup'], true, true, "text", "nama grup rekening");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Grup">Nama Grup</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="Grup_RekID" value="'.$atabel['Grup_RekID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in"><div class="card"><div class="card-header custom-style">Daftar Grup Rekening</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Rek" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div></div>'
]);
}
}
@@ -0,0 +1,126 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Gel/KaryawanController
Description : Master Standar Gaji
Created By : Siau Pheng ([email protected]).
Created Date : September 17th, 2014.
Last Modified : September 4th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Gel;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class KaryawanController {
private string $mode_detail;
private int $id_karya;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_karya = Param::Int("KaryaID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("para_karyawan");
$sql->add_param("Nama_Karya");
$sql->add_param("Gaji_Harian");
$sql->add_param_date("Tgl_Masuk");
$sql->add_param_date("Tgl_Keluar");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("KaryaID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Karya");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'Nama_Karya LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("para_karyawan", "*", $tsql, $asql);
$obj->add_field("KaryaID", "ID", "hid");
$obj->add_field("Nama_Karya", "Nama Karyawan", "awr");
$obj->add_field("Gaji_Harian", "Gaji Harian", "r", "rupiah");
$obj->add_field("Tgl_Masuk", "Tgl. Masuk", "c", "sqltgl");
$obj->add_field("Tgl_Keluar", "Tgl. Keluar", "c", "sqltgl");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Karya", "A");
$obj->add_row_btn("clipboard", "Ubah", "KaryawanJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "KaryawanJS.detail_hapus");
$obj->set_func_btn("KaryawanJS.detail_tambah", "+ Karyawan");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_karya() {
$atabel = [ 'KaryaID'=>0, 'Nama_Karya'=>"", 'Gaji_Harian'=>0, 'Tgl_Masuk'=>tgl_ymd(), 'Tgl_Keluar'=>'0000-00-00', 'Aktif'=>1 ];
if ($this->id_karya > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM para_karyawan WHERE KaryaID=?", [$this->id_karya]);
}
$form = new Form($this->app);
$tnama = $form->textbox("_", "Nama_Karya", $atabel['Nama_Karya'], true, true, "text", "nama karyawan");
$tgaji = $form->textbox("_", "Gaji_Harian", $atabel['Gaji_Harian'], true, true, "double", "gaji harian");
$tmasuk = $form->datebox("_", "Tgl_Masuk", $atabel['Tgl_Masuk'], true, false);
$tkeluar = $form->datebox("_", "Tgl_Keluar", $atabel['Tgl_Keluar'], true, false);
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Karya">Nama Karyawan</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Gaji_Harian">Gaji Harian</label>
<div class="col-sm-6 col-lg-5">'.$tgaji.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Masuk">Tanggal Masuk</label>
<div class="col-sm-6 col-lg-5">'.$tmasuk.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Keluar">Tanggal Keluar</label>
<div class="col-sm-6 col-lg-5">'.$tkeluar.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="KaryaID" value="'.$atabel['KaryaID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in"><div class="card"><div class="card-header custom-style">Daftar Karyawan</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Karya" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div></div>'
]);
}
}
+210
View File
@@ -0,0 +1,210 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Gel/RekController
Description : Master Rekening
Created By : Siau Pheng ([email protected]).
Created Date : December 7th, 2010.
Last Modified : September 4th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Gel;
use App\Utils\Invesa;
use flight\Engine;
use flight\database\SimplePdo;
use flight\Session;
use Webapp\DB\SQL;
use Webapp\Printer\PrintHTML;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class RekController {
private string $reg_name;
private int $max_level;
private string $mode_detail;
private string $kode_rek;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db, Session $session) {
$this->app = $app;
$this->db = $db;
$this->reg_name = (string) $session->get('WEB_APP')['REG_NAME'];
$this->max_level = (int) $session->get('APP_GEL')['MAX_LEVEL'] ?? 5;
$this->mode_detail = Param::Get("mode_detail", "");
$this->kode_rek = Param::Get("Kode_Rek", "");
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("gel_acc");
$sql->add_param("Kode_Induk");
$sql->add_param("Nama_Rek");
$sql->add_param("Grup_RekID");
$sql->add_param("Level");
$sql->add_param("Mode");
$sql->add_param("Kas_Rek");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("Kode_Rek");
if ($this->mode_detail === "insert") {
$sql->add_param("Kode_Rek");
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Rek");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'CONCAT(A.Kode_Rek,A.Nama_Rek) LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("gel_acc A LEFT JOIN gel_acc_grup G ON (A.Grup_RekID=G.Grup_RekID)", "A.*,G.Nama_Grup", $tsql, $asql);
$obj->add_field("Kode_Rek", "Kode", "c");
$obj->add_field("Nama_Rek", "Nama Rekening", "awr");
$obj->add_field("Nama_Grup", "Grup", "l");
$obj->add_field("Level", "Level", "c");
$obj->add_field("Mode", "Mode", "c");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_row_color("Mode", "G", "rblue");
$obj->set_field_order("Kode_Rek", "A");
$obj->add_row_btn("clipboard", "Ubah", "RekJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "RekJS.detail_hapus");
$obj->set_func_btn("RekJS.detail_tambah", "+ Rekening");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_rek() {
$atabel = [ 'Kode_Rek'=>0, 'Nama_Rek'=>"", 'Kode_Induk'=>0, 'Grup_RekID'=>0, 'Level'=>1, 'Mode'=>"D", 'Kas_Rek'=>0, 'Aktif'=>1 ];
if (!empty($this->kode_rek)) {
$atabel = $this->db->fetchRow("SELECT * FROM gel_acc WHERE Kode_Rek=?", [$this->kode_rek]);
}
$form = new Form($this->app);
$tgrup = $form->option_db("_", "Grup_RekID", $atabel['Grup_RekID'], true, false, "gel_acc_grup", ["Grup_RekID","Nama_Grup"], "Aktif=1 ORDER BY Grup_RekID");
$tinduk = $form->option_db("_", "Kode_Induk", $atabel['Kode_Induk'], true, false, "gel_acc", ["Kode_Rek","Nama_Rek"], "Mode='G' AND Aktif=1 ORDER BY Kode_Rek", [0,"TOP LEVEL"]);
$tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], true, false, "text", "kode rekening");
$tnama = $form->textbox("_", "Nama_Rek", $atabel['Nama_Rek'], true, true, "text", "nama rekening");
$tlevel = $form->option("_", "Level", $atabel['Level'], true, false, $this->Level_Array());
$tmode = $form->radio("_", "Mode", $atabel['Mode'], true, true, ['G'=>"Grup",'D'=>"Detail"]);
$tkas_rek = $form->radio("_", "Kas_Rek", $atabel['Kas_Rek'], true, true, ['1'=>"Ya",'0'=>"Tidak"]);
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Grup_RekID">Grup Rekening</label>
<div class="col-sm-7 col-lg-4">'.$tgrup.'</div>
<label class="col-sm-5 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Kode_Rek">Kode Rekening</label>
<div class="col-sm-7 col-lg-4">'.$tkode.'</div>
<label class="col-sm-5 col-lg-2 col-form-label" for="Kas_Rek">Rekening Kas ?</label>
<div class="col d-flex gap-2">'.$tkas_rek.Invesa::Form_Info("Rekening untuk Transaksi Penerimaan / Pembayaran.").'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Kode_Induk">Rekening Induk</label>
<div class="col-sm-7 col-lg-10">'.$tinduk.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Nama_Rek">Nama Rekening</label>
<div class="col-sm-7 col-lg-10">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Level">Level Rekening</label>
<div class="col-sm-7 col-lg-4">'.$tlevel.'</div>
<label class="col-sm-5 col-lg-2 col-form-label" for="Mode">Mode Rekening</label>
<div class="col d-flex gap-2">'.$tmode.'</div>
</div>
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" />';
$this->app->json($ajson);
}
public function detail_print() {
$form = new Form($this->app);
$tgrup = $form->option_db("_", "Grup_RekID", 0, true, false, "gel_acc_grup", ["Grup_RekID","Nama_Grup"], "Aktif=1 ORDER BY Grup_RekID", [0, "SEMUA GRUP"]);
$tlevel = $form->option("_", "Level", $this->max_level, true, false, $this->Level_Array());
$ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_RekID">Grup Rekening</label>
<div class="col">'.$tgrup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Level">Level Rekening</label>
<div class="col col-form-label">'.$tlevel.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Cetak">Tanggal Cetak</label>
<div class="col-sm-4 col-lg-4">'.$ttgl.'</div>
</div>';
$this->app->json($ajson);
}
public function print_rek() {
$id_grup = Param::Get("Grup_RekID", 0);
$level = Param::Get("Level", 0);
$nama_grup = "";
if ($id_grup > 0) $nama_grup = $this->db->fetchField("SELECT Nama_Grup FROM gel_acc_grup WHERE Grup_RekID=?", [$id_grup]);
// generate report header
$tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak");
$tsql = ''; $asql = [];
if ($id_grup > 0) { $tsql .= " AND Grup_RekID=?"; $asql[] = $id_grup; }
if ($level > 0) { $tsql .= " AND Level<=?"; $asql[] = $level; }
$tsql = (strlen($tsql) > 0) ? ' WHERE '.substr($tsql, 4) : '';
// query data laporan
$stat = $this->db->runQuery("SELECT A.*,G.Nama_Grup FROM (SELECT * FROM gel_acc".$tsql.") A LEFT JOIN gel_acc_grup G ON (A.Grup_RekID=G.Grup_RekID) ORDER BY A.Kode_Rek ASC", $asql);
$pre = new PrintHTML($this->app);
$pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Rekening", $tglheader]);
$pre->add_field("No",10,"C");
$pre->add_field("Kode",20, "C");
$pre->add_field("Nama Rekening",80, "L");
$pre->add_field("Grup",50, "L");
$pre->add_field("Level",20, "C");
$pre->add_field("Mode",20, "C");
if ($id_grup > 0) $pre->add_sub_title("Grup Rekening : ".$nama_grup);
$pre->show_titles();
$pre->show_headers();
$nomor = 1; $strpad = "&nbsp;&nbsp;&nbsp;";
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
$pre->add_row([ $nomor++, $row['Kode_Rek'], str_repeat($strpad, (int) $row['Level']-1).$row['Nama_Rek'], $row['Nama_Grup'], $row['Level'], $row['Mode'] ]);
}
$pre->add_stamp(0, true);
$pre->show();
}
private function Level_Array($item = -1) {
$_alevel = []; for ($i=1; $i<=$this->max_level; $i++) $_alevel[$i] = "Level ".$i;
return ($item == -1) ? $_alevel : $_alevel[$item];
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in"><div class="card"><div class="card-header custom-style">Daftar Rekening</div><div class="card-body"><div class="row mb-1"><div class="col-10"><div class="input-group"><input class="form-control" id="Cari_Rek" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div><div class="col-2 btn-group"><button class="btn btn-info shadow-none" type="button" id="butPrint"><i class="bi-printer me-2"></i>Cetak</button></div></div><div id="divDetail">&nbsp;</div></div></div></div>'
]);
}
}
@@ -0,0 +1,215 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Member/MemberController
Description : Master Member
Created By : Siau Pheng ([email protected]).
Created Date : December 7th, 2010.
Last Modified : September 3rd, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Member;
use App\Utils\Invesa;
use flight\Engine;
use flight\database\SimplePdo;
use flight\Session;
use Webapp\DB\SQL;
use Webapp\Printer\PrintHTML;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class MemberController {
private string $reg_name;
private string $mode_detail;
private int $id_member;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db, Session $session) {
$this->app = $app;
$this->db = $db;
$this->reg_name = (string) $session->get('WEB_APP')['REG_NAME'];
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_member = (int) Param::Get("MemberID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("para_member");
$sql->add_param("Grup_MemberID");
$sql->add_param("Kode_Member");
$sql->add_param("Nama_Member");
$sql->add_param("Alamat_Member");
$sql->add_param("Kota_Member");
$sql->add_param("Telp_Member");
$sql->add_param("KTP_Member");
$sql->add_param_date("Tgl_Lahir");
$sql->add_param_date("Tgl_Daftar");
$sql->add_param("IM");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("MemberID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Member");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'CONCAT(Kode_Member,Nama_Member,Telp_Member) LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("para_member", "*", $tsql, $asql);
$obj->add_field("MemberID", "ID", "hid");
$obj->add_field("Kode_Member", "Kode / ID", "c");
$obj->add_field("Nama_Member", "Nama Member", "awr");
$obj->add_field("Alamat_Member", "Alamat", "awr");
$obj->add_field("Telp_Member", "No. Telp", "l");
$obj->add_field("IM", "Member", "c", "checkbox");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Member", "A");
$obj->add_row_btn("clipboard", "Ubah", "MemberJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "MemberJS.detail_hapus");
$obj->set_func_btn("MemberJS.detail_tambah", "+ Member");
$this->app->json([ $obj->db_table("divDetail") ]);
}
public function form_member() {
$atabel = Invesa::A_Member_Member();
if ($this->id_member > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM para_member WHERE MemberID=?", [$this->id_member]);
}
$form = new Form($this->app);
$tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup");
$tkode = $form->textbox("_", "Kode_Member", $atabel['Kode_Member'], true, false, "text", "kode member");
$tnama = $form->textbox("_", "Nama_Member", $atabel['Nama_Member'], true, true, "text", "nama member");
$talamat = $form->textarea("_", "Alamat_Member", $atabel['Alamat_Member'], true, true, 2);
$tkota = $form->textbox("_", "Kota_Member", $atabel['Kota_Member'], true, true, "text", "kota member");
$ttelp = $form->textbox("_", "Telp_Member", $atabel['Telp_Member'], true, true, "text", "telp member");
$tktp = $form->textbox("_", "KTP_Member", $atabel['KTP_Member'], true, true, "text", "ktp member");
$tlahir = $form->datebox("_", "Tgl_Lahir", $atabel['Tgl_Lahir'], true, true);
$tdaftar = $form->datebox("_", "Tgl_Daftar", $atabel['Tgl_Daftar'], true, true);
$tim = $form->checkbox("_", "IM", $atabel['IM'], true, true, [1,0]);
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, [1=>"Ya",0=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Grup_MemberID">Grup Member</label>
<div class="col-sm-7 col-lg-4">'.$tgrup.'</div>
<label class="col-sm-5 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-7 col-lg-4 d-flex gap-2">'.$taktif.'<div class="col-form-label ms-auto me-2">Member ?</div>'.$tim.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Kode_Member">Kode / ID Member</label>
<div class="col-sm-7 col-lg-4"><div class="input-group">'.$tkode.Invesa::Form_Info("Kode / ID Barcode Member (Scan dari Kartu Member). Contoh : 17000017.").'</div></div>
<label class="col-sm-5 col-lg-2 col-form-label" for="Tgl_Daftar">Tanggal Daftar</label>
<div class="col-sm-7 col-lg-4">'.$tdaftar.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="KTP_Member">No. KTP / SIM</label>
<div class="col-sm-7 col-lg-4">'.$tktp.'</div>
<label class="col-sm-5 col-lg-2 col-form-label" for="Tgl_Lahir">Tanggal Lahir</label>
<div class="col-sm-7 col-lg-4">'.$tlahir.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Nama_Member">Nama Member</label>
<div class="col-sm-7 col-lg-10">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Alamat_Member">Alamat Member</label>
<div class="col-sm-7 col-lg-10">'.$talamat.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Kota_Member">Kota Member</label>
<div class="col-sm-7 col-lg-4">'.$tkota.'</div>
<label class="col-sm-5 col-lg-2 col-form-label" for="Telp_Member">Telp. Member</label>
<div class="col-sm-7 col-lg-4">'.$ttelp.'</div>
</div>
<input type="hidden" id="MemberID" value="'.$atabel['MemberID'].'" />
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" />';
$this->app->json($ajson);
}
public function detail_print() {
$form = new Form($this->app);
$tgrup = $form->option_db("_", "Grup_MemberID", 0, true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP MEMBER"]);
$taktif = $form->radio("_", "Aktif", 9, true, true, [9=>"Semua",'1'=>"Ya",'0'=>"Tidak"]);
$ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_MemberID">Grup Member</label>
<div class="col">'.$tgrup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Cetak">Tanggal Cetak</label>
<div class="col-sm-4 col-lg-4">'.$ttgl.'</div>
</div>';
$this->app->json($ajson);
}
public function print_member() {
$id_grup = Param::Get("Grup_MemberID", 0);
$aktif = Param::Get("Aktif", 9);
$nama_grup = ""; $nama_aktif = ($aktif==0) ? "Tidak Aktif" : "Aktif";
if ($id_grup > 0) $nama_grup = $this->db->fetchField("SELECT Nama_Grup FROM para_member_grup WHERE Grup_MemberID=?", [$id_grup]);
// generate report header
$tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak");
$tsql = ''; $asql = [];
if ($id_grup > 0) { $tsql .= " AND Grup_MemberID=?"; $asql[] = $id_grup; }
if ($aktif < 9) { $tsql .= " AND Aktif=?"; $asql[] = $aktif; }
$tsql = (strlen($tsql) > 0) ? ' WHERE '.substr($tsql, 4) : '';
// query data laporan
$stat = $this->db->runQuery("SELECT * FROM para_member".$tsql." ORDER BY Nama_Member", $asql);
$pre = new PrintHTML($this->app);
$pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Member", $tglheader]);
$pre->add_field("No",10,"C");
$pre->add_field("Nama Member",80, "L");
$pre->add_field("Alamat",12, "L");
$pre->add_field("Kota",12, "L");
if ($id_grup > 0) $pre->add_sub_title("Grup Member : ".$nama_grup);
if ($aktif < 9) $pre->add_sub_title("Status Aktif : ".$nama_aktif);
$pre->show_titles();
$pre->show_headers();
$nomor = 1;
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
$pre->add_row([ $nomor++, $row['Nama_Member'], $row['Alamat_Member'], $row['Kota_Member'] ]);
}
$pre->add_stamp(0, true);
$pre->show();
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in"><div class="card"><div class="card-header custom-style">Daftar Member</div><div class="card-body"><div class="row mb-1"><div class="col-10"><div class="input-group"><input class="form-control" id="Cari_Member" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div><div class="col-2 btn-group"><button class="btn btn-info shadow-none" type="button" id="butPrint"><i class="bi-printer me-2"></i>Cetak</button></div></div><div id="divDetail">&nbsp;</div></div></div></div>'
]);
}
}
@@ -0,0 +1,115 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Member/MembergrupController
Description : Master Grup Member
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : September 3rd, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Member;
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 MembergrupController {
private string $mode_detail;
private int $id_grup;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_grup = (int) Param::Get("Grup_MemberID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("para_member_grup");
$sql->add_param("Kode_Grup");
$sql->add_param("Nama_Grup");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("Grup_MemberID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Member");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'CONCAT(Kode_Grup,Nama_Grup) LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("para_member_grup", "*", $tsql, $asql);
$obj->add_field("Grup_MemberID", "ID", "hid");
$obj->add_field("Kode_Grup", "Kode");
$obj->add_field("Nama_Grup", "Nama Grup Member", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Grup", "A");
$obj->add_row_btn("clipboard", "Ubah", "MemberGrupJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "MemberGrupJS.detail_hapus");
$obj->set_func_btn("MemberGrupJS.detail_tambah", "+ Grup Member");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_grup() {
$atabel = Invesa::A_Member_Grup();
if ($this->id_grup > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM para_member_grup WHERE Grup_MemberID=?", [$this->id_grup]);
}
$form = new Form($this->app);
$tkode = $form->textbox("_", "Kode_Grup", $atabel['Kode_Grup'], true, true, "text", "kode grup member");
$tnama = $form->textbox("_", "Nama_Grup", $atabel['Nama_Grup'], true, true, "text", "nama grup member");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Grup">Kode Grup Member</label>
<div class="col-sm-6 col-lg-5">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Grup">Nama Grup Member</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="Grup_MemberID" value="'.$atabel['Grup_MemberID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Grup Member</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Member" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
@@ -0,0 +1,135 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Member/PointbarangController
Description : Master Point Penukanan Barang
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : September 4th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Member;
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 PointbarangController {
private string $mode_detail;
private int $id_point;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_point = (int) Param::Get("InvPID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("inv_point_barang");
$sql->add_param("Point_TipeID");
$sql->add_param("Nama_Barang");
$sql->add_param("SatuanID");
$sql->add_param("Nilai_Barang");
$sql->add_param("Nilai_Point");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("InvPID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Barang");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'Nama_Barang LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("inv_point_barang B LEFT JOIN inv_point_tipe T ON (B.Point_TipeID=T.Point_TipeID)", "B.*,T.Nama_Tipe", $tsql, $asql);
$obj->add_field("InvPID", "ID", "hid");
$obj->add_field("Nama_Tipe", "Tipe Point", "awr");
$obj->add_field("Nama_Barang", "Nama Barang", "awr");
$obj->add_field("Nilai_Barang", "Nilai Barang", "r", "rupiah");
$obj->add_field("Nilai_Point", "Nilai Point", "r", "rupiah");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Barang", "A");
$obj->add_row_btn("clipboard", "Ubah", "PointBarangJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "PointBarangJS.detail_hapus");
$obj->set_func_btn("PointBarangJS.detail_tambah", "+ Barang");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_barang() {
$atabel = [ 'InvPID'=>0, 'Point_TipeID'=>0, 'Nama_Barang'=>"", 'SatuanID'=>0, 'Nilai_Barang'=>0, 'Nilai_Point'=>0, 'Aktif'=>1];
if ($this->id_point > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM inv_point_barang WHERE InvPID=?", [$this->id_point]);
}
$form = new Form($this->app);
$ttipe = $form->option_db("_", "Point_TipeID", $atabel['Point_TipeID'], true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "Aktif=1 ORDER BY Point_TipeID", [0,"&nbsp;"]);
$tnama = $form->textbox("_", "Nama_Barang", $atabel['Nama_Barang'], true, true, "text");
$tsatuan = $form->option_db("_", "SatuanID", $atabel['SatuanID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0,"&nbsp;"]);
$tnilai = $form->textbox("_", "Nilai_Barang", $atabel['Nilai_Barang'], true, false, "double");
$tpoint = $form->textbox("_", "Nilai_Point", $atabel['Nilai_Point'], true, false, "number");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Point_TipeID">Tipe Point</label>
<div class="col">'.$ttipe.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Barang">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-sm-6 col-lg-5">'.$tsatuan.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nilai_Barang">Nilai Barang</label>
<div class="col-sm-6 col-lg-5">'.$tnilai.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nilai_Point">Point Barang</label>
<div class="col-sm-6 col-lg-5">'.$tpoint.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="InvPID" value="'.$atabel['InvPID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Point Penukarang Barang</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Barang" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
@@ -0,0 +1,223 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Member/PointskemaController
Description : Master Skema Point Member
Created By : Siau Pheng ([email protected]).
Created Date : September 28th, 2014.
Last Modified : September 4th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Member;
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 PointskemaController {
private string $mode_detail;
private int $id_point;
private string $kode_barang;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_point = (int) Param::Get("PointID", 0);
$this->kode_barang = (string) Param::Get("Kode_Barang", "");
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("inv_point");
$sql->add_param("Point_TipeID");
$sql->add_param("KartuID");
$sql->add_param("CabID");
$sql->add_param("Grup_MemberID");
$sql->add_param("Nilai_Jual");
$sql->add_param("Grup_Barang");
$sql->add_param("Kode_Barang");
$sql->add_param_date("Tgl_Mulai");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("PointID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Skema");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'CONCAT_WS(G.Nama_Grup,T.Nama_Tipe) LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("inv_point P LEFT JOIN para_member_grup G ON (G.Grup_MemberID=P.Grup_MemberID) LEFT JOIN para_cabang C ON (P.CabID=C.CabID) LEFT JOIN para_rek_pos K ON (P.KartuID=K.KartuID) LEFT JOIN inv_point_tipe T ON (P.Point_TipeID=T.Point_TipeID)", "P.*,IF(P.KartuID=0,'SEMUA JENIS',K.Nama_Kartu) Nama_Kartu,IF(P.Grup_MemberID=0,'SEMUA GRUP',G.Nama_Grup) Nama_Grup,IF(P.CabID=0,'SEMUA CABANG',C.Nama_Cab) Nama_Cab,T.Nama_Tipe", $tsql, $asql);
$obj->add_field("PointID", "ID", "hid");
$obj->add_field("Nama_Tipe", "Tipe", "l");
$obj->add_field("Nama_Cab", "Cabang", "l");
$obj->add_field("Nama_Kartu", "Pembayaran", "l");
$obj->add_field("Nama_Grup", "Grup Member", "l");
$obj->add_field("Grup_Barang", "Grup Barang", "awr");
$obj->add_field("Nilai_Jual", "Nominal (Rp.)", "r", "rupiah");
$obj->add_field("Tgl_Mulai", "Tgl. Mulai", "c", "sqltgl", "", "val-tgl");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Tipe", "A");
$obj->add_row_btn("clipboard", "Ubah", "PointSkemaJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "PointSkemaJS.detail_hapus");
$obj->set_func_btn("PointSkemaJS.detail_tambah", "+ Skema Point");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function table_barang() {
$ainv = (empty($this->kode_barang)) ? [] : explode(",", $this->kode_barang);
if (in_array($this->mode_detail, ["insert","delete"])) {
$id_inv = Param::Get("InvID", 0);
if ($this->mode_detail === "insert") {
if (!in_array($id_inv, $ainv)) $ainv[] = $id_inv;
} else if ($this->mode_detail === "delete") {
if (($key = array_search($id_inv, $ainv)) !== false) unset($ainv[$key]);
}
}
$tsql = 'FALSE'; $asql = [];
if (count($ainv) > 0) {
$tsql = 'InvID IN (?)';
$asql[] = $ainv;
}
$obj = new Table($this->app);
$obj->set_table("inv_produk", "*,1 Hapus", $tsql, $asql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_row_btn("trash", "Hapus", "PointSkemaJS.barang_hapus");
$this->app->json([ $obj->json_table("divBarang"), ['type'=>"form", 'id'=>"Kode_Barang", 'value'=>implode(',', $ainv)] ]);
}
public function auto_produk() {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU & Barcode
$arec = $this->db->fetchRow("SELECT V.InvID,P.Nama_Produk FROM (SELECT * FROM inv_produk_varian WHERE Kode_SKU=? OR Kode_Barcode=? LIMIT 1) V LEFT JOIN inv_produk P ON (P.InvID=V.InvID) WHERE P.Aktif=1", [$tcari, $tcari]);
if (is_array($arec) && count($arec) > 0) $bcode = 1;
if ($bcode === 1) {
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>0, 'bc'=>1];
} else {
// Cari by Nama
$stat = $this->db->runQuery("SELECT InvID,Nama_Produk FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE ? ORDER BY 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'=>0, 'bc'=>0];
}
}
$this->app->json($ajson);
}
public function form_skema() {
$atabel = [ 'PointID'=>0,'CabID'=>0,'Grup_MemberID'=>0,'Point_TipeID'=>0,'KartuID'=>0,'Grup_Barang'=>"",'Kode_Barang'=>"",'Nilai_Jual'=>0,'Tgl_Mulai'=>tgl_ymd(),'Aktif'=>1 ];
if ($this->id_point > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM inv_point WHERE PointID=?", [$this->id_point]);
}
$form = new Form($this->app);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]);
$tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
$ttipe = $form->option_db("_", "Point_TipeID", $atabel['Point_TipeID'], true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "Aktif=1 ORDER BY Point_TipeID", [0,"&nbsp;"]);
$tkartu = $form->option_db("_", "KartuID", $atabel['KartuID'], true, false, "para_rek_pos", ["KartuID","Nama_Kartu"], "Aktif=1", [0,"SEMUA JENIS PEMBAYARAN"]);
$t_grup = $form->textbox("_", "Grup_Barang", $atabel['Grup_Barang'], false, false, "text");
$t_brg = $form->textbox("_", "Kode_Barang", $atabel['Kode_Barang'], false, false, "text");
$t_nilai = $form->textbox("_", "Nilai_Jual", $atabel['Nilai_Jual'], true, false, "double");
$ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], true, false);
$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="Point_TipeID">Tipe Point</label>
<div class="col">'.$ttipe.'</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="Grup_MemberID">Grup Member</label>
<div class="col-sm-8 col-lg-4">'.$tgrup.'</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">Grup Barang</label>
<div class="col"><div class="input-group">'.$t_grup.'<button id="butBrow1" class="btn btn-info" type="button"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Daftar Barang</label>
<div class="col"><div class="input-group">'.$t_brg.'<button id="butBrow2" class="btn btn-info" type="button"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nilai_Jual">Nominal Penjualan</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$t_nilai.Invesa::Form_Info("Jumlah Nominal Penjualan untuk Memperoleh Point (berlaku kelipatan). Contoh : Rp 100.000").'</div></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-4">'.$ttglmulai.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="KartuID">Jenis Pembayaran</label>
<div class="col-sm-8 col-lg-4">'.$tkartu.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="PointID" value="'.$atabel['PointID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function form_grup() {
$agrup = explode(",", Param::Get("Grup_Barang","0"));
$ajson['html'] = '<table class="table table-striped table-bordered table-hover" id="tabGrupList"><thead><tr><th>Nama Grup Barang</th><th>Aksi</th></tr></thead><tbody>';
$stat = $this->db->runQuery("SELECT * FROM inv_produk_grup ORDER BY Nama_Grup");
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
$checked = (in_array($row['Grup_InvID'], $agrup)) ? "checked" : "";
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="c"><input class="form-check-input" type="checkbox" value="%s" %s/></td></tr>', $row['Nama_Grup'], $row['Grup_InvID'], $checked);
}
$ajson['html'] .= '</tbody></table>';
$this->app->json($ajson);
}
public function form_barang() {
$form = new Form($this->app);
$tnama = $form->textauto("_", "Nama_Produk", [], true, true, "ketik nama produk");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Produk">Nama Barang</label>
<div class="col">'.$tnama.'</div>
</div>
<div id="divBarang">&nbsp;</div>
<input type="hidden" id="InvID" value="0" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Skema Point Member</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Skema" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
@@ -0,0 +1,120 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Member/PointtipeController
Description : Master Tipe Point Member
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : September 4th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Member;
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 PointtipeController {
private string $mode_detail;
private int $id_tipe;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_tipe = (int) Param::Get("Point_TipeID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("inv_point_tipe");
$sql->add_param("Nama_Tipe");
$sql->add_param("Txt_Struk1");
$sql->add_param("Txt_Struk2");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("Point_TipeID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Tipe");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'Nama_Tipe LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("inv_point_tipe", "*", $tsql, $asql);
$obj->add_field("Point_TipeID", "ID", "hid");
$obj->add_field("Nama_Tipe", "Tipe Point", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Tipe", "A");
$obj->add_row_btn("clipboard", "Ubah", "PointTipeJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "PointTipeJS.detail_hapus");
$obj->set_func_btn("PointTipeJS.detail_tambah", "+ Tipe Point");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_tipe() {
$atabel = [ 'Point_TipeID'=>0, 'Nama_Tipe'=>"", 'Txt_Struk1'=>"", 'Txt_Struk2'=>"", 'Aktif'=>1 ];
if ($this->id_tipe > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM inv_point_tipe WHERE Point_TipeID=?", [$this->id_tipe]);
}
$form = new Form($this->app);
$tnama = $form->textbox("_", "Nama_Tipe", $atabel['Nama_Tipe'], true, true, "text", "nama tipe point");
$tstruk1 = $form->textbox("_", "Txt_Struk1", $atabel['Txt_Struk1'], true, true, "text", "text struk utk dapat point baru");
$tstruk2 = $form->textbox("_", "Txt_Struk2", $atabel['Txt_Struk2'], true, true, "text", "text struk utk tampilan total point");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Tipe">Nama Tipe Point</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Txt_Struk2">Tulisan Point Baru</label>
<div class="col"><div class="input-group">'.$tstruk2.Invesa::Form_Info("Gunakan [TOT_POINT] untuk tampilan nilai.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Txt_Struk1">Tulisan Total Point</label>
<div class="col"><div class="input-group">'.$tstruk1.Invesa::Form_Info("Gunakan [POINT] untuk tampilan nilai.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="Point_TipeID" value="'.$atabel['Point_TipeID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Tipe Point Member</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Tipe" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
@@ -0,0 +1,93 @@
<?php
/*******************************************************************
// PHP Class : /Controller/Table/Ppob/KategoriController
Description : Master Kategori PPOB
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : September 1st, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Ppob;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class KategoriController {
private string $mode_detail;
private int $id_kate;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_kate = (int) Param::Get("KateID", 0);
}
public function table_detail() {
$tcari = Param::Get("Cari_Kate");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'N_Kate LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("ppob_kategori", "*", $tsql, $asql);
$obj->add_field("KateID", "ID", "hid");
$obj->add_field("K_Kate", "Kode", "l");
$obj->add_field("N_Kate", "Nama Kategori", "awr");
$obj->add_field("Status", "Status", "c", "checkbox");
$obj->set_field_order("K_Kate", "A");
$obj->add_row_btn("clipboard", "Detail", "PPOBKateJS.detail_ubah");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_kategori() {
$atabel = ['KateID'=>0, 'K_Kate'=>"", 'N_Kate'=>"", 'Status'=>1];
if ($this->id_kate > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM ppob_kategori WHERE KateID=?", [$this->id_kate]);
}
$form = new Form($this->app);
$tkode = $form->textbox("_", "K_Kate", $atabel['K_Kate'], false, false, "text");
$tnama = $form->textbox("_", "N_Kate", $atabel['N_Kate'], false, false, "text");
$tstatus = $form->radio("_", "Status", $atabel['Status'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="K_Kate">Kode Kategori</label>
<div class="col">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="N_Kate">Nama Kategori</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Status">Status ?</label>
<div class="col d-flex gap-2">'.$tstatus.'</div>
</div>
<input type="hidden" id="KateID" value="'.$atabel['KateID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Kategori PPOB</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Kate" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
@@ -0,0 +1,98 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Ppob/OperatorController
Description : Master Operator PPOB
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : September 1st, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Ppob;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class OperatorController {
private string $mode_detail;
private int $id_ope;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_ope = (int) Param::Get("OpeID", 0);
}
public function table_detail() {
$tcari = Param::Get("Cari_Ope");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'CONCAT(N_Ope,Prefix_Ope) LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("ppob_operator", "*", $tsql, $asql);
$obj->add_field("OpeID", "ID", "hid");
$obj->add_field("K_Ope", "Kode", "l");
$obj->add_field("N_Ope", "Nama Operator", "awr");
$obj->add_field("Status", "Status", "c", "checkbox");
$obj->set_field_order("K_Ope", "A");
$obj->add_row_btn("clipboard", "Detail", "PPOBOpeJS.detail_ubah");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_operator() {
$atabel = ['OpeID'=>0, 'K_Ope'=>"", 'N_Ope'=>"", 'Prefix_Ope'=>"", 'Status'=>1];
if ($this->id_ope > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM ppob_operator WHERE OpeID=?", [$this->id_ope]);
}
$form = new Form($this->app);
$tkode = $form->textbox("_", "K_Ope", $atabel['K_Ope'], false, false, "text");
$tnama = $form->textbox("_", "N_Ope", $atabel['N_Ope'], false, false, "text");
$tpref = $form->textbox("_", "Prefix_Ope", $atabel['Prefix_Ope'], false, false, "text");
$tstatus = $form->radio("_", "Status", $atabel['Status'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="K_Ope">Kode Operator</label>
<div class="col">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="N_Ope">Nama Operator</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Prefix_Ope">Prefix Operator</label>
<div class="col">'.$tpref.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Status">Status ?</label>
<div class="col d-flex gap-2">'.$tstatus.'</div>
</div>
<input type="hidden" id="OpeID" value="'.$atabel['OpeID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Operator PPOB</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Ope" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
@@ -0,0 +1,221 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/Ppob/ProdukController
Description : Master Produk PPOB
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : September 1st, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table\Ppob;
use flight\Engine;
use flight\Session;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Printer\PrintHTML;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
use App\Utils\Invesa;
use App\Utils\PPOBClient;
class ProdukController {
private string $reg_name;
private string $mode_detail;
private int $id_ope;
private int $id_kate;
private int $id_produk;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db, Session $session) {
$this->app = $app;
$this->db = $db;
$this->reg_name = (string) $session->get('WEB_APP')['REG_NAME'];
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_kate = (int) Param::Get("KateID", 0);
$this->id_ope = (int) Param::Get("OpeID", 0);
$this->id_produk = (int) Param::Get("ProdukID", 0);
}
public function table_produk() {
if ($this->mode_detail === "update") {
$sql = new SQL($this->app);
$sql->set_table("ppob_produk");
$sql->add_param("OpeID");
$sql->add_param("KateID");
$sql->add_param("Nama_Produk");
$sql->add_param("Harga_Pokok");
$sql->add_param("Harga_Jual");
$sql->add_param("Status");
$sql->add_param_userid();
$sql->add_where("ProdukID");
$sql->UpdateDB();
}
$tcari = Param::Get("Cari_Produk");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'Nama_Produk LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("ppob_produk", "*,((Harga_Jual-Harga_Pokok)/Harga_Pokok)*100 Margin", $tsql, $asql);
$obj->add_field("ProdukID", "ID", "hid");
$obj->add_field("Nama_Produk", "Nama Produk", "awr");
$obj->add_field("Harga_Pokok", "Harga Modal", "r", "rupiah");
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
$obj->add_field("Margin", "%", "r", "rupiah2");
$obj->add_field("Status", "Status", "c", "checkbox");
$obj->set_field_order("Nama_Produk", "A");
$obj->set_row_color("Harga_Jual", "0", "rdanger");
$obj->add_row_btn("clipboard", "Ubah", "PPOBProdukJS.produk_ubah");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_produk() {
$atabel = ['ProdukID'=>0, 'Kode'=>"", 'Nama_Produk'=>"", 'OpeID'=>0, 'Harga_Pokok'=>0, 'Harga_Jual'=>0, 'Status'=>1];
if ($this->id_produk > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM ppob_produk WHERE ProdukID=?", [$this->id_produk]);
}
$form = new Form($this->app);
$tkode = $form->textbox("_", "Kode", $atabel['Kode'], false, false, "text");
$tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, true, "text", "nama produk");
$tkate = $form->option_db("_", "KateID", $atabel['KateID'], true, false, "ppob_kategori", ["KateID","N_Kate"], "Status=1 ORDER BY N_Kate");
$tope = $form->option_db("_", "OpeID", $atabel['OpeID'], true, false, "ppob_operator", ["OpeID","N_Ope"], "Status=1 ORDER BY N_Ope");
$thpp = $form->textbox("_", "Harga_Pokok", $atabel['Harga_Pokok'], true, true, "double", "harga pokok");
$tjual = $form->textbox("_", "Harga_Jual", $atabel['Harga_Jual'], true, true, "double", "harga jual");
$tstatus = $form->radio("_", "Status", $atabel['Status'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="KateID">Nama Kategori</label>
<div class="col-sm-4 col-lg-5">'.$tkate.'</div>
<div class="col d-flex gap-2 justify-content-end"><label class="col-form-label me-2">Status ?</label>'.$tstatus.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="OpeID">Nama Operator</label>
<div class="col-sm-4 col-lg-5">'.$tope.'</div>
<div class="col-sm-4 col-lg-5"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Kode Produk</span>'.$tkode.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Produk">Nama Produk</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Pokok">Harga Pokok</label>
<div class="col-sm-4 col-lg-3">'.$thpp.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Jual">Harga Jual</label>
<div class="col-sm-4 col-lg-3">'.$tjual.'</div>
</div>
<input type="hidden" id="ProdukID" value="'.$atabel['ProdukID'].'" />
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" />';
$this->app->json($ajson);
}
public function detail_print() {
$form = new Form($this->app);
$tkate = $form->option_db("_", "KateID", 0, true, false, "ppob_kategori", ["KateID","N_Kate"], "Status=1 ORDER BY N_Kate", [0,"SEMUA KATEGORI"]);
$tope = $form->option_db("_", "OpeID", 0, true, false, "ppob_operator", ["OpeID","N_Ope"], "Status=1 ORDER BY N_Ope", [0,"SEMUA OPERATOR"]);
$ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="KateID">Nama Kategori</label>
<div class="col">'.$tkate.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="OpeID">Nama Operator</label>
<div class="col">'.$tope.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Cetak">Tanggal Cetak</label>
<div class="col-sm-4 col-lg-4">'.$ttgl.'</div>
</div>';
$this->app->json($ajson);
}
public function detail_update() {
$form = new Form($this->app);
$tkate = $form->option_db("_", "K_Kate", "", true, false, "ppob_kategori", ["K_Kate","N_Kate"], "Status=1 ORDER BY N_Kate", ["","SEMUA KATEGORI"]);
$tope = $form->option_db("_", "K_Ope", "", true, false, "ppob_operator", ["K_Ope","N_Ope"], "Status=1 ORDER BY N_Ope", ["","SEMUA OPERATOR"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="K_Kate">Nama Kategori</label>
<div class="col">'.$tkate.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="K_Ope">Nama Operator</label>
<div class="col">'.$tope.'</div>
</div>';
$this->app->json($ajson);
}
public function proses_update() {
// PROSES API TRIFONIA PULSA
$cppob = new PPOBClient($this->app);
$appob = $cppob->Produk(Param::Get("K_Kate"), Param::Get("K_Ope"));
if (count($appob) > 0 && (int) $appob['Status'] === 4) {
$ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>$appob['Message']];
} else {
$ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>$appob['Message']];
}
$this->app->json($ajson);
}
public function print_produk() {
$nama_kate = ""; $nama_ope = "";
if ($this->id_kate > 0) $nama_kate = $this->db->fetchField("SELECT N_Kate FROM ppob_kategori WHERE KateID=?", [$this->id_kate]);
if ($this->id_ope > 0) $nama_ope = $this->db->fetchField("SELECT N_Ope FROM ppob_operator WHERE OpeID=?", [$this->id_ope]);
// generate report header
$tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak");
$tsql = ''; $asql = [];
if ($this->id_kate > 0) { $tsql .= " AND KateID=?"; $asql[] = $this->id_kate; }
if ($this->id_ope > 0) { $tsql .= " AND OpeID=?"; $asql[] = $this->id_ope; }
$tsql = (strlen($tsql) > 0) ? ' WHERE '.substr($tsql, 4) : '';
// query data laporan
$stat = $this->db->runQuery("SELECT * FROM ppob_produk".$tsql." ORDER BY KateID,OpeID,ProdukID", $asql);
$pre = new PrintHTML($this->app);
$pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Produk PPOB", $tglheader]);
$pre->add_field("No",10,"C");
$pre->add_field("Nama Produk",80);
$pre->add_field("Harga Modal",12, "R", "rupiah");
$pre->add_field("Harga Jual",12, "R", "rupiah");
$pre->add_field("Margin",12, "R", "rupiah");
$pre->add_field("%",5, "R", "rupiah2");
if ($this->id_kate > 0) $pre->add_sub_title("Nama Kategori : ".$nama_kate);
if ($this->id_ope > 0) $pre->add_sub_title("Nama Operator : ".$nama_ope);
$pre->show_titles();
$pre->show_headers();
$nomor = 0;
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Harga_Pokok'], $row['Harga_Jual'], ((float) $row['Harga_Jual']-(float) $row['Harga_Pokok']), ((((float) $row['Harga_Jual']-(float) $row['Harga_Pokok'])*100)/(float) $row['Harga_Pokok']) ]);
}
$pre->add_stamp(0, true);
$pre->show();
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in"><div class="card"><div class="card-header custom-style">Daftar Produk PPOB</div><div class="card-body"><div class="row mb-1"><div class="col-9"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div><div class="col-3 btn-group"><button class="btn btn-info shadow-none" type="button" id="butPrint"><i class="bi-printer me-2"></i>Cetak</button><button class="btn btn-warning shadow-none" type="button" id="butUpdate"><i class="bi-download me-2"></i>Update Produk</button></div></div><div id="divDetail">&nbsp;</div></div></div></div>'
]);
}
}
+835
View File
@@ -0,0 +1,835 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/ProdukController
Description : Master Barang
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : September 10th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table;
use App\Utils\Invesa;
use App\Utils\Inv;
use flight\Engine;
use flight\Session;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
use Webapp\Printer\PrintHTML;
class ProdukController {
private string $reg_name;
private string $mode;
private string $mode_detail;
private int $id_inv;
private int $id_kemasan;
private int $id_varian;
private int $id_harga;
private string $md5_key;
private int $i_filter;
private int $id_eceran;
private int $def_satuan;
private Inv $inv;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db, Session $session) {
$this->app = $app;
$this->db = $db;
$this->reg_name = (string) $session->get('WEB_APP')['REG_NAME'];
$this->mode = Param::Get("mode", "");
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_inv = Param::Int("InvID", 0);
$this->id_kemasan = Param::Int("InvKemasanID", 0);
$this->id_varian = Param::Int("InvVarianID", 0);
$this->id_harga = Param::Int("InvHargaID", 0);
$this->md5_key = Param::Get("MD5Key", "");
$this->i_filter = Param::Int("Filter_Produk", 0);
$this->id_eceran = (int) $session->get('APP_INV')['ECERANID'] ?? 5;
$this->def_satuan = (int) $session->get('APP_INV')['DEF_SATUANID'] ?? 0;
$this->inv = new Inv($app);
}
public function brow_produk() {
$tcari = Param::Get("Cari_Produk2", "");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = " AND Barcode_Nama LIKE ?";
$asql[] = '%'. $tcari . '%';
}
$obj = new Table($this->app);
$obj->set_table("vi_inv_produk", "*", "Aktif=1".$tsql, $asql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Nama_Satuan", "Satuan", "l");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "ProdukJS.produk_select");
$this->app->json([ $obj->db_table("divBrowProduk") ]);
}
public function tabel_produk() {
$tcari = Param::Get("Cari_Produk", "");
$awhere = [];
if (empty($tcari)) {
if ($this->i_filter > 0) $awhere[] = "Grup_InvID='".(string)$this->i_filter."'";
} else {
$tsql = "Nama_Produk LIKE '%".$tcari."%'";
if (is_numeric($tcari)) {
$tsql .= " OR InvID IN (SELECT InvID FROM inv_produk_varian WHERE Kode_SKU LIKE '%".$tcari."%' OR Kode_Barcode LIKE '%".$tcari."%')";
}
$awhere[] = $tsql;
}
$tsql = (count($awhere) > 0) ? " WHERE ".implode(' AND ', $awhere) : '';
$obj = new Table($this->app);
$obj->set_table("(SELECT * FROM inv_produk".$tsql.") P LEFT JOIN inv_produk_kemasan K ON (K.InvID=P.InvID) LEFT JOIN inv_produk_harga H ON (K.InvID=H.InvID AND K.SatuanID=H.SatuanID AND H.Grup_MemberID='".(string)$this->id_eceran."') LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_stok GROUP BY InvID) T ON (T.InvID=P.InvID)", "P.InvID,P.Aktif,P.Nama_Produk,'' Nama_Grup,IFNULL(S.Nama_Satuan,'') Nama_Kemasan,Round(P.Harga_Pokok*IFNULL(K.Qty,1),2) Harga_Pokok,IF(IFNULL(H.Harga_Jual,0)=0,0,(((H.Harga_Jual-(P.Harga_Pokok*IFNULL(K.Qty,1)))*100)/H.Harga_Jual)) Margin,IFNULL(H.Harga_Jual,0) Harga_Jual,IF(IFNULL(T.Stok,0)=0,0,T.Stok/IFNULL(K.Qty,1)) Stok,IF((ISNULL(H.Harga_Jual) OR H.Harga_Jual<(P.Harga_Pokok*IFNULL(K.Qty,1))) AND P.Aktif=1,1,0) Rugi", "");
if ($this->app->user()->is_level(2)) $obj->set_table("(SELECT * FROM inv_produk".$tsql.") P LEFT JOIN inv_produk_kemasan K ON (K.InvID=P.InvID) LEFT JOIN inv_produk_harga H ON (K.InvID=H.InvID AND K.SatuanID=H.SatuanID) LEFT JOIN para_member_grup MG ON (H.Grup_MemberID=MG.Grup_MemberID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_stok GROUP BY InvID) T ON (T.InvID=P.InvID)", "P.InvID,P.Aktif,P.Nama_Produk,IFNULL(MG.Kode_Grup,'') Nama_Grup,IFNULL(S.Nama_Satuan,'') Nama_Kemasan,Round(P.Harga_Pokok*IFNULL(K.Qty,1),2) Harga_Pokok,IF(IFNULL(H.Harga_Jual,0)=0,0,(((H.Harga_Jual-(P.Harga_Pokok*IFNULL(K.Qty,1)))*100)/H.Harga_Jual)) Margin,IFNULL(H.Harga_Jual,0) Harga_Jual,IF(IFNULL(T.Stok,0)=0,0,T.Stok/IFNULL(K.Qty,1)) Stok,IF((ISNULL(H.Harga_Jual) OR H.Harga_Jual<(P.Harga_Pokok*IFNULL(K.Qty,1))) AND P.Aktif=1,1,0) Rugi", "");
$obj->add_field("InvID", "No.", "c");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
if ($this->app->user()->is_level(2)) $obj->add_field("Nama_Grup", "Grup Member", "l");
$obj->add_field("Nama_Kemasan", "Kemasan", "l");
if ($this->app->user()->is_level(2)) {
$obj->add_field("Harga_Pokok", "Harga Pokok", "r", "rupiah");
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
$obj->add_field("Margin", "%", "r", "rupiah2");
} else {
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
}
$obj->add_field("Stok", "Stok", "r", "rupiah2");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("InvID", "D");
$obj->set_row_color("Rugi", "1", "rdanger");
$obj->add_row_btn("clipboard", "Ubah", "ProdukJS.produk_ubah");
if ($this->app->user()->is_level(2)) $obj->add_row_btn("arrow-counterclockwise", "Restore", "ProdukJS.produk_restore");
$obj->add_row_btn("trash", "Hapus", "ProdukJS.produk_hapus");
$obj->set_func_btn("ProdukJS.produk_tambah", "+ Produk");
$this->app->json([ $obj->db_table("divDetail") ]);
}
public function tabel_kemasan() {
if (in_array($this->mode_detail, ["update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("inv_produk_kemasan");
$sql->add_param("SatuanID");
$sql->add_param("Qty");
$sql->add_param_userid();
$sql->add_where("InvKemasanID", $this->id_kemasan);
$sat_baru = (int) Param::Get("SatuanID", 0);
$sat_lama = (int) Param::Get("SatuanLamaID", 0);
if ($this->mode_detail === "update") {
if ($this->id_kemasan === 0) {
$sql->add_param("InvID");
$sql->InsertDB();
$this->db->runQuery("INSERT INTO inv_produk_varian (InvID,SatuanID,Kode_SKU,UserID) SELECT InvID,SatuanID,'SKU_BARU',UserID FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv]);
} else {
$sql->UpdateDB();
if ($sat_baru !== $sat_lama) {
$this->db->update('inv_produk_varian', ['SatuanID'=>$sat_baru], 'InvID=? AND SatuanID=?', [$this->id_inv,$sat_lama]);
$this->db->update('inv_produk_harga', ['SatuanID'=>$sat_baru], 'InvID=? AND SatuanID=?', [$this->id_inv,$sat_lama]);
}
}
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
$this->db->delete('inv_produk_varian', 'InvID=? AND SatuanID=?', [$this->id_inv, $sat_lama]);
$this->db->delete('inv_produk_harga', 'InvID=? AND SatuanID=?', [$this->id_inv, $sat_lama]);
}
}
$obj = new Table($this->app);
$obj->set_table("(SELECT * FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') K LEFT JOIN para_satuan S ON (K.SatuanID=S.SatuanID)", "K.*,S.Nama_Satuan,CONCAT(ROUND(K.Qty),' ','".Param::Get("Satuan_Stok","")."') Qty_Satuan", "");
$obj->add_field("InvKemasanID", "ID", "hid");
$obj->add_field("SatuanID", "ID2", "hid");
$obj->add_field("Nama_Satuan", "Kemasan", "l");
$obj->add_field("Qty_Satuan", "Qty", "r");
$obj->set_field_order("Qty", "D");
$obj->add_row_form("pencil-square", "Detail", "ProdukJS.kemasan_form");
$obj->add_row_btn("trash", "Hapus", "ProdukJS.kemasan_del");
$obj->set_func_btn("ProdukJS.kemasan_add", '<i class="bi-plus-lg me-2"></i>Kemasan');
$obj->set_func_btn("ProdukJS.kemasan_copy", '<i class="bi-copy me-2"></i>Salin Kemasan');
$this->app->json([ $obj->json_table("divKemasan") ]);
}
public function tabel_varian() {
if (in_array($this->mode_detail, ["update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("inv_produk_varian");
$sql->add_param("SatuanID");
$sql->add_param("VarianID");
$sql->add_param("Kode_Barcode");
$sql->add_param_userid();
$sql->add_where("InvVarianID", $this->id_varian);
if ($this->mode_detail === "update") {
if ($this->id_varian === 0) {
$sql->add_param("InvID");
$sql->add_param("Kode_SKU", "SKU_BARU");
$sql->InsertDB();
} else {
$sql->UpdateDB();
}
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$obj = new Table($this->app);
$obj->set_table("(SELECT * FROM inv_produk_varian WHERE InvID='".$this->id_inv."') V LEFT JOIN (SELECT SatuanID,MIN(VarianID) VarianID FROM inv_produk_varian WHERE invid='".$this->id_inv."' GROUP BY SatuanID) X ON (V.SatuanID=X.SatuanID AND V.VarianID=X.VarianID) LEFT JOIN para_varian N ON (V.VarianID=N.VarianID) LEFT JOIN para_satuan S ON (V.SatuanID=S.SatuanID)", "V.*,S.Nama_Satuan,IFNULL(N.Nama_Varian,'<i>Tanpa Varian</i>') Nama_Varian,IFNULL(X.SatuanID,0) Bisa_Del");
$obj->add_field("InvVarianID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Kode_Barcode", "Barcode", "l");
$obj->add_field("Nama_Satuan", "Kemasan", "l");
$obj->add_field("Nama_Varian", "Varian", "l");
$obj->set_field_order("Nama_Satuan", "A");
$obj->add_row_form("pencil-square", "Detail", "ProdukJS.varian_form");
$obj->add_row_btn("trash", "Hapus", "ProdukJS.varian_del", "Bisa_Del", "0");
$obj->set_func_btn("ProdukJS.varian_add", "+ Varian");
$this->app->json([ $obj->json_table("divVarian") ]);
}
public function tabel_harga() {
if (in_array($this->mode_detail, ["update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("inv_produk_harga");
$sql->add_param("SatuanID");
$sql->add_param("Grup_MemberID");
$sql->add_param("Harga_Jual");
$sql->add_param_userid();
$sql->add_where("InvHargaID", $this->id_harga);
if ($this->mode_detail === "update") {
if ($this->id_harga === 0) {
$sql->add_param("InvID");
$sql->InsertDB();
} else {
$sql->UpdateDB();
}
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$obj = new Table($this->app);
$obj->set_table("(SELECT * FROM inv_produk_harga WHERE InvID='".$this->id_inv."'".($this->app->user()->is_level(2)?"":" AND Grup_MemberID='".(string)$this->id_eceran."'").") H LEFT JOIN (SELECT * FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') K ON (H.InvID=K.InvID AND H.SatuanID=K.SatuanID) LEFT JOIN (SELECT * FROM inv_produk WHERE InvID='".$this->id_inv."') P ON (H.InvID=P.InvID) LEFT JOIN para_satuan S ON (H.SatuanID=S.SatuanID) LEFT JOIN para_member_grup G ON (H.Grup_MemberID=G.Grup_MemberID)", "H.*,S.Nama_Satuan,G.Nama_Grup,(K.Qty*P.Harga_Pokok) Harga_Modal,IF(H.Harga_Jual=0,0,H.Harga_Jual-(K.Qty*P.Harga_Pokok)) Margin_Rup, IF(H.Harga_Jual=0,0,((H.Harga_Jual-(K.Qty*P.Harga_Pokok))*100)/H.Harga_Jual) Margin_Per");
$obj->add_field("InvHargaID", "ID", "hid");
$obj->add_field("Nama_Satuan", "Kemasan", "l");
$obj->add_field("Nama_Grup", "Grup Member", "l");
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
if ($this->app->user()->is_level(2)) {
$obj->add_field("Harga_Modal", "Harga Modal", "r", "rupiah");
$obj->add_field("Margin_Rup", "Margin (Rp.)", "r", "rupiah");
$obj->add_field("Margin_Per", "Margin (%)", "r", "rupiah2");
}
$obj->set_row_color("Harga_Jual", "0", "rwarning");
$obj->set_field_order("Nama_Satuan", "A");
$obj->add_row_form("pencil-square", "Detail", "ProdukJS.harga_form");
$obj->add_row_btn("trash", "Hapus", "ProdukJS.harga_del");
$obj->set_func_btn("ProdukJS.harga_add", "+ Harga");
$this->app->json([ $obj->json_table("divHarga") ]);
}
public function tabel_restore() {
$obj = new Table($this->app);
$obj->set_table("inv_produk_backup", "Tanggal,MD5Key,UserID", "InvID='".$this->id_inv."'");
$obj->add_field("Tanggal", "Waktu Backup", "c nwr", "sqljam", "", "val-tgljam");
$obj->add_field("MD5Key", "Kode Backup", "l");
$obj->set_field_order("Tanggal", "A");
$obj->add_row_form("list", "Detail", "ProdukJS.produk_restore_form");
$obj->add_row_btn("arrow-counterclockwise", "Restore", "ProdukJS.produk_restore_select");
$this->app->json([ $obj->db_table("divBrowBackup") ]);
}
public function detail_produk() {
$atabel = ['InvID'=>0,'Nama_Produk'=>"",'Grup_InvID'=>0,'StokID'=>$this->def_satuan,'NormalID'=>$this->def_satuan,'Harga_Beli'=>0,'Harga_Tambah'=>0,'Harga_Pokok'=>0,'Stok_Min'=>0,'Stok_Max'=>0,'Aktif'=>1,'PPN'=>0];
if ($this->id_inv > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM inv_produk WHERE InvID=?", [$this->id_inv]);
$this->Produk_Backup();
} else {
$atabel['InvID'] = $this->Produk_Baru(true);
}
$form = new Form($this->app);
$tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, true, "text", "nama barang");
$tgrup = $form->option_db("_", "Grup_InvID", $atabel['Grup_InvID'], true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"&nbsp;"]);
$tstok = $form->option_db("_", "StokID", $atabel['StokID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0,"&nbsp;"]);
$tnormal = $form->option_db("_", "NormalID", $atabel['NormalID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0,"&nbsp;"]);
$tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "double", "harga beli", null, null, "ProdukJS.hitung_HPP");
$ttambah = $form->textbox("_", "Harga_Tambah", $atabel['Harga_Tambah'], true, true, "double", "tambahan biaya", null, null, "ProdukJS.hitung_HPP");
$thpp = $form->textbox("_", "Harga_Pokok", $atabel['Harga_Pokok'], true, true, "double", "harga pokok");
$tsmin = $form->textbox("_", "Stok_Min", $atabel['Stok_Min'], true, true, "double", "stok minimal");
$tsmax = $form->textbox("_", "Stok_Max", $atabel['Stok_Max'], true, true, "double", "stok maximal");
$tppn = $form->option("_", "PPN", $atabel['PPN'], true, true, Invesa::PPN_Array());
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Ya",'0'=>"Tidak"]);
$ajson['html'] = '
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="produk-tab" data-bs-toggle="tab" data-bs-target="#produk" type="button" role="tab" aria-controls="produk" aria-selected="true">Informasi Barang</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="kemasan-tab" data-bs-toggle="tab" data-bs-target="#kemasan" type="button" role="tab" aria-controls="kemasan" aria-selected="false">Kemasan</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="varian-tab" data-bs-toggle="tab" data-bs-target="#varian" type="button" role="tab" aria-controls="varian" aria-selected="false">Varian</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="harga-tab" data-bs-toggle="tab" data-bs-target="#harga" type="button" role="tab" aria-controls="harga" aria-selected="false">Harga Jual</button>
</li>
<li class="nav-item ms-auto">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">'.$atabel['Nama_Produk'].'</a>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="produk" role="tabpanel" aria-labelledby="produk-tab">
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Grup_InvID">Grup Barang</label>
<div class="col-sm-4 col-lg-5">'.$tgrup.'</div>
<div class="col d-flex gap-2 justify-content-end"><label class="col-form-label me-2">Barang Aktif ?</label>'.$taktif.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 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-2 col-form-label" for="StokID">Satuan Stok / Normal</label>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tstok.Invesa::Form_Info("Ukuran satuan terkecil produk.").'</div></div>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tnormal.Invesa::Form_Info("Ukuran satuan yang dipergunakan dalam transaksi normal dan laporan.").'</div></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="Harga_Beli">Harga Beli</label>
<div class="col-sm-4 col-lg-5">'.$tbeli.'</div>
<div class="col-sm-4 col-lg-5"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Status PPN <strong>&nbsp;*</strong></span>'.$tppn.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Tambah">+ Biaya</label>
<div class="col-sm-4 col-lg-5">'.$ttambah.'</div>
<div class="col-sm-4 col-lg-5"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Stok Minimum</span>'.$tsmin.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Pokok">Harga Pokok</label>
<div class="col-sm-4 col-lg-5">'.$thpp.'</div>
<div class="col-sm-4 col-lg-5"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Stok Maximum</span>'.$tsmax.'</div></div>
</div>
</div>
<div class="tab-pane fade" id="kemasan" role="tabpanel" aria-labelledby="kemasan-tab">
<div class="row"><div class="col" id="divKemasan"></div></div>
</div>
<div class="tab-pane fade" id="varian" role="tabpanel" aria-labelledby="varian-tab">
<div class="row"><div class="col" id="divVarian"></div></div>
</div>
<div class="tab-pane fade" id="harga" role="tabpanel" aria-labelledby="harga-tab">
<div class="row"><div class="col" id="divHarga"></div></div>
</div>
</div>
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'" />
<input type="hidden" id="mode" value="'.$this->mode.'" />';
$this->app->json($ajson);
}
public function detail_print() {
$form = new Form($this->app);
$tginv = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
$tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]);
$tmem = $form->option_db("_", "Grup_MemberID", $this->id_eceran, $this->app->user()->is_level(2), false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup");
$ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="SupID">Nama Supplier</label>
<div class="col">'.$tsup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_InvID">Grup Barang</label>
<div class="col">'.$tginv.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_MemberID">Grup Member</label>
<div class="col">'.$tmem.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Cetak">Tanggal Cetak</label>
<div class="col-sm-4 col-lg-4">'.$ttgl.'</div>
</div>';
$this->app->json($ajson);
}
public function detail_filter() {
$form = new Form($this->app);
$tfilter = $form->option_db("_", "Fi_Produk", Param::Get("Filter_Produk",0), true, true, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP BARANG"]);
$ajson['html'] = '
<div class="row mb-1"><div class="col text-center">Tampilan Berdasarkan :</div></div>
<div class="row mb-1"><div class="col">'.$tfilter.'</div></div>';
$this->app->json($ajson);
}
public function detail_restore() {
$atabel = ['InvID'=>$this->id_inv, 'Nama_Produk'=>""];
if ($this->id_inv > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM inv_produk WHERE InvID=?", [$this->id_inv]);
}
$form = new Form($this->app);
$tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], false, false, "text");
$ajson['html'] = '
<div class="row mb-1"><div class="col">'.$tnama.'</div></div>
<div id="divBrowBackup">&nbsp;</div>
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'">
</div></div>';
$this->app->json($ajson);
}
public function form_kemasan() {
$arec = ['InvKemasanID'=>0,'SatuanID'=>0,'Qty'=>0];
if ($this->id_kemasan > 0) {
$arec = $this->db->fetchRow("SELECT * FROM inv_produk_kemasan WHERE InvKemasanID=?", [$this->id_kemasan]);
}
$form = new Form($this->app);
$tsatuan = $form->option_db("_", "SatuanID", $arec['SatuanID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan");
$tqty = $form->textbox("_", "Qty", $arec['Qty'], true, true, "number", "qty");
$ajson['html'] = '
<div class="card"><div class="card-body">
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="SatuanID">Nama Kemasan</label>
<div class="col-sm-6 col-lg-4">'.$tsatuan.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="Qty">Qty / Kemasan</label>
<div class="col-sm-6 col-lg-4"><div class="input-group">'.$tqty.'<span class="input-group-text">'.Param::Get("Satuan_Stok","?").'</span></div></div>
<div class="col-sm-12 col-lg-6 text-end">
<button type="button" class="btn btn-warning shadow-none me-2" id="butBatalKemasan">Batal</button><button type="button" class="btn btn-success shadow-none" id="butSimpanKemasan">Simpan</button>
</div>
</div>
<input type="hidden" id="InvKemasanID" value="'.$arec['InvKemasanID'].'">
<input type="hidden" id="SatuanLamaID" value="'.$arec['SatuanID'].'">
</div></div>';
$this->app->json($ajson);
}
public function form_varian() {
$arec = ['InvVarianID'=>0,'SatuanID'=>0,'VarianID'=>0,'Kode_SKU'=>"SKU_BARU",'Kode_Barcode'=>""];
if ($this->id_varian > 0) {
$arec = $this->db->fetchRow("SELECT * FROM inv_produk_varian WHERE InvVarianID=?", [$this->id_varian]);
}
$form = new Form($this->app);
$tsatuan = $form->option_que("_", "SatuanID", $arec['SatuanID'], true, false, "SELECT SatuanID,Nama_Satuan FROM para_satuan WHERE Aktif=1 AND SatuanID IN (SELECT SatuanID FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') ORDER BY Nama_Satuan", ["SatuanID","Nama_Satuan"]);
$tvarian = $form->option_db("_", "VarianID", $arec['VarianID'], true, false, "para_varian", ["VarianID","Nama_Varian"], "Aktif=1 ORDER BY Nama_Varian", [0,"-- TANPA VARIAN --"]);
$tsku = $form->textbox("_", "Kode_SKU", $arec['Kode_SKU'], false, false, "text");
$tbcode = $form->textbox("_", "Kode_Barcode", $arec['Kode_Barcode'], true, true, "text");
$ajson['html'] = '
<div class="card"><div class="card-body">
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="SatuanID">Nama Kemasan</label>
<div class="col-sm-6 col-lg-4">'.$tsatuan.'</div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Kode SKU</span>'.$tsku.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="VarianID">Nama Varian</label>
<div class="col-sm-6 col-lg-4">'.$tvarian.'</div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Kode Barcode</span>'.$tbcode.'</div></div>
</div>
<div class="row mb-1">
<div class="col text-end">
<button type="button" class="btn btn-warning shadow-none me-2" id="butBatalVarian">Batal</button><button type="button" class="btn btn-success shadow-none" id="butSimpanVarian">Simpan</button>
</div>
</div>
<input type="hidden" id="InvVarianID" value="'.$arec['InvVarianID'].'">
<input type="hidden" id="SatuanLamaID" value="'.$arec['SatuanID'].'">
<input type="hidden" id="VarianLamaID" value="'.$arec['VarianID'].'">
<input type="hidden" id="Kode_BarcodeLama" value="'.$arec['Kode_Barcode'].'">
</div></div>';
$this->app->json($ajson);
}
public function form_harga() {
$arec = ['InvHargaID'=>0,'SatuanID'=>0,'Grup_MemberID'=>$this->id_eceran,'Harga_Modal'=>0,'Harga_Jual'=>0,'Persen_Jual'=>0];
if ($this->id_harga > 0) {
$arec = $this->db->fetchRow("SELECT * FROM inv_produk_harga WHERE InvHargaID=?", [$this->id_harga]);
}
$form = new Form($this->app);
$tsatuan = $form->option_que("_", "SatuanID", $arec['SatuanID'], true, false, "SELECT SatuanID,Nama_Satuan FROM para_satuan WHERE Aktif=1 AND SatuanID IN (SELECT SatuanID FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') ORDER BY Nama_Satuan", ["SatuanID","Nama_Satuan"], null, null, "ProdukJS.calc_Modal");
$tgrup = $form->option_db("_", "Grup_MemberID", $arec['Grup_MemberID'], $this->app->user()->is_level(2), false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup");
$tmodal = $form->textbox("_", "Harga_Modal", $arec['Harga_Modal'], false, false, "double");
$tharga = $form->textbox("_", "Harga_Jual", $arec['Harga_Jual'], true, false, "double", "harga jual", null, null, "ProdukJS.calc_Harga1");
$tpersen = $form->textbox("_", "Persen_Jual", $arec['Persen_Jual'], true, false, "double", "persen jual", null, null, "ProdukJS.calc_Harga2");
$ajson['html'] = '
<div class="card"><div class="card-body">
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="SatuanID">Nama Kemasan</label>
<div class="col-sm-6 col-lg-4">'.$tsatuan.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="Grup_MemberID">Grup Member</label>
<div class="col-sm-6 col-lg-4">'.$tgrup.'</div>
<div class="col-sm-12 col-lg-6"><div class="input-group'.($this->app->user()->is_level(2)?'':' d-none').'"><span class="input-group-text" style="min-width:30%;">Harga Modal</span>'.$tmodal.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="Harga_Jual">Harga Jual</label>
<div class="col-sm-6 col-lg-4">'.$tharga.'</div>
<div class="col-sm-6 col-lg-2"><div class="input-group'.($this->app->user()->is_level(2)?'':' d-none').'"><div class="input-group-text">&thickapprox;</div>'.$tpersen.'<div class="input-group-text">%</div></div></div>
<div class="col-sm-6 col-lg-4 text-end">
<button type="button" class="btn btn-warning shadow-none me-2" id="butBatalHarga">Batal</button><button type="button" class="btn btn-success shadow-none" id="butSimpanHarga">Simpan</button>
</div>
</div>
<input type="hidden" id="InvHargaID" value="'.$arec['InvHargaID'].'">
<input type="hidden" id="SatuanLamaID" value="'.$arec['SatuanID'].'">
<input type="hidden" id="GrupLamaID" value="'.$arec['Grup_MemberID'].'">
</div></div>';
$this->app->json($ajson);
}
public function form_restore() {
$atabel = ['InvID'=>$this->id_inv, 'Nama_Grup'=>"", 'Nama_Stok'=>"", 'Nama_Normal'=>""];
$akemasan = []; $avarian = []; $aharga = [];
if (!empty($this->md5_key)) {
$arow = $this->db->fetchRow("SELECT * FROM inv_produk_backup WHERE MD5Key=?", [$this->md5_key]);
$atabel = array_merge($atabel, json_decode($arow['Produk'] ?? '[]', true)[0]);
$akemasan = json_decode($arow['Kemasan'] ?? '[]', true);
$avarian = json_decode($arow['Varian'] ?? '[]', true);
$aharga = json_decode($arow['Harga'] ?? '[]', true);
$atabel['Nama_Grup'] = (empty($atabel['Grup_InvID'])) ? '' : $this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$atabel['Grup_InvID']]);
$atabel['Nama_Stok'] = (empty($atabel['StokID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$atabel['StokID']]);
$atabel['Nama_Normal'] = (empty($atabel['NormalID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$atabel['NormalID']]);
$atabel['PPN'] = Invesa::PPN_Array()[$atabel['PPN']];
$atabel['Status_Aktif'] = ($atabel['Aktif']==1) ? "Aktif" : "Tidak";
}
$tnama = '<input type="text" class="form-control" value="'.$atabel['Nama_Produk'].'" readonly="">';
$tgrup = '<input type="text" class="form-control" value="'.$atabel['Nama_Grup'].'" readonly="">';
$tstok = '<input type="text" class="form-control" value="'.$atabel['Nama_Stok'].'" readonly="">';
$tnormal = '<input type="text" class="form-control" value="'.$atabel['Nama_Normal'].'" readonly="">';
$tbeli = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Harga_Beli']).'" readonly="">';
$ttambah = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Harga_Tambah']).'" readonly="">';
$thpp = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Harga_Pokok']).'" readonly="">';
$tsmin = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Stok_Min']).'" readonly="">';
$tsmax = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Stok_Max']).'" readonly="">';
$tppn = '<input type="text" class="form-control" value="'.$atabel['PPN'].'" readonly="">';
$taktif = '<input type="text" class="form-control" value="'.$atabel['Status_Aktif'].'" readonly="">';
$ajson['html'] = '
<div class="card"><div class="card-body">
<div class="accordion" id="accorProduk">
<!-- start produk -->
<div class="accordion-item">
<h2 class="accordion-header" id="flush-one"><button class="accordion-button bg-info bg-gradient" style="--bs-bg-opacity: .5;" type="button" data-bs-toggle="collapse" data-bs-target="#flush-coll-one" aria-controls="flush-coll-one" aria-expanded="true">Informasi Barang</button></h2>
<div id="flush-coll-one" class="accordion-collapse collapse show" aria-labelledby="flush-head-one" data-bs-parent="#accorProduk">
<div class="accordion-body">
<div class="row mb-1">
<div class="col-sm-12 col-lg-12"><div class="input-group"><span class="input-group-text" style="width:160px;">Nama Barang</span>'.$tnama.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Grup Barang</span>'.$tgrup.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Status Barang</span>'.$taktif.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Satuan Stok</span>'.$tstok.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Satuan Normal</span>'.$tnormal.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Harga Beli</span>'.$tbeli.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Status PPN<strong>&nbsp;*</strong></span>'.$tppn.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">+ Biaya</span>'.$ttambah.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Stok Minimum</span>'.$tsmin.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Harga Pokok</span>'.$thpp.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Stok Maximum</span>'.$tsmax.'</div></div>
</div>
</div></div></div>
<!-- end produk -->
<!-- start kemasan -->
<div class="accordion-item">
<h2 class="accordion-header" id="flush-two"><button class="accordion-button bg-warning bg-gradient collapsed" style="--bs-bg-opacity: .5;" type="button" data-bs-toggle="collapse" data-bs-target="#flush-coll-two" aria-controls="flush-coll-two" aria-expanded="false">Kemasan</button></h2>
<div id="flush-coll-two" class="accordion-collapse collapse" aria-labelledby="flush-head-two" data-bs-parent="#accorProduk">
<div class="accordion-body">
<div class="row mb-1">
<div class="col">
<table class="table table-striped table-bordered table-hover dataTable no-footer dtr-inline">
<thead><tr><th>Kemasan</th><th>Qty</th></tr></thead>
<tbody>';
if (count($akemasan) == 0) {
$ajson['html'] .= '<tr><td class="c" colspan="2">belum ada data</td></tr>';
}
foreach($akemasan as $val) {
$val['Nama_Satuan'] = (empty($val['SatuanID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$val['SatuanID']]);
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="r">%s</td></tr>', $val['Nama_Satuan'], rupiah((float)$val['Qty'])." ".$atabel['Nama_Stok']);
}
$ajson['html'] .= '
</tbody>
</table>
</div>
</div>
</div></div></div>
<!-- end kemasan -->
<!-- start varian -->
<div class="accordion-item">
<h2 class="accordion-header" id="flush-tri"><button class="accordion-button bg-success bg-gradient collapsed" style="--bs-bg-opacity: .5;" type="button" data-bs-toggle="collapse" data-bs-target="#flush-coll-tri" aria-controls="flush-coll-tri" aria-expanded="false">Varian</button></h2>
<div id="flush-coll-tri" class="accordion-collapse collapse" aria-labelledby="flush-head-tri" data-bs-parent="#accorProduk">
<div class="accordion-body">
<div class="row mb-1">
<div class="col">
<table class="table table-striped table-bordered table-hover dataTable no-footer dtr-inline">
<thead><tr><th>SKU</th><th>Barcode</th><th>Kemasan</th><th>Varian</th></tr></thead>
<tbody>';
if (count($avarian) == 0) {
$ajson['html'] .= '<tr><td class="c" colspan="4">belum ada data</td></tr>';
}
foreach($avarian as $val) {
$val['Nama_Satuan'] = (empty($val['SatuanID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$val['SatuanID']]);
$val['Nama_Varian'] = (empty($val['VarianID'])) ? '' : $this->db->fetchField("SELECT Nama_Varian FROM para_varian WHERE VarianID=?", [$val['VarianID']]);
$ajson['html'] .= sprintf('<tr><td class="c">%s</td><td class="l">%s</td><td class="l">%s</td><td class="l">%s</td></tr>', $val['Kode_SKU'], $val['Kode_Barcode'], $val['Nama_Satuan'], $val['Nama_Varian']);
}
$ajson['html'] .= '
</tbody>
</table>
</div>
</div>
</div></div></div>
<!-- end varian -->
<!-- start harga -->
<div class="accordion-item">
<h2 class="accordion-header" id="flush-for"><button class="accordion-button bg-primary bg-gradient collapsed" style="--bs-bg-opacity: .5;" type="button" data-bs-toggle="collapse" data-bs-target="#flush-coll-for" aria-controls="flush-coll-for" aria-expanded="false">Harga Jual</button></h2>
<div id="flush-coll-for" class="accordion-collapse collapse" aria-labelledby="flush-head-for" data-bs-parent="#accorProduk">
<div class="accordion-body">
<div class="row mb-1">
<div class="col">
<table class="table table-striped table-bordered table-hover dataTable no-footer dtr-inline">
<thead><tr><th>Kemasan</th><th>Grup Member</th><th>Harga Jual</th></tr></thead>
<tbody>';
if (count($aharga) == 0) {
$ajson['html'] .= '<tr><td class="c" colspan="3">belum ada data</td></tr>';
}
foreach($aharga as $val) {
$val['Nama_Satuan'] = (empty($val['SatuanID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$val['SatuanID']]);
$val['Nama_Grup'] = (empty($val['Grup_MemberID'])) ? '' : $this->db->fetchField("SELECT Nama_Grup FROM para_member_grup WHERE Grup_MemberID=?", [$val['Grup_MemberID']]);
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="l">%s</td><td class="r">%s</td></tr>', $val['Nama_Satuan'], $val['Nama_Grup'], rupiah((float)$val['Harga_Jual']));
}
$ajson['html'] .= '
</tbody>
</table>
</div>
</div>
</div></div></div>
<!-- end harga -->
</div>
</div></div>';
$this->app->json($ajson);
}
public function proses_simpan() {
if ($this->mode === "cancel") {
if (Param::Get("mode_before", "") === "add") {
$this->db->delete("inv_produk_kemasan", "InvID=?", [$this->id_inv]);
$this->db->delete("inv_produk_varian", "InvID=?", [$this->id_inv]);
$this->db->delete("inv_produk_harga", "InvID=?", [$this->id_inv]);
$this->db->delete("inv_produk", "InvID=?", [$this->id_inv]);
} else {
$this->Produk_Restore();
}
} else {
$sql = new SQL($this->app);
$sql->set_table("inv_produk");
$sql->add_param("Grup_InvID");
$sql->add_param("Nama_Produk");
$sql->add_param("StokID");
$sql->add_param("NormalID");
$sql->add_param("PPN");
$sql->add_param("Harga_Beli");
$sql->add_param("Harga_Tambah");
$sql->add_param("Harga_Pokok", "Harga_Beli+Harga_Tambah", true);
$sql->add_param("Stok_Min");
$sql->add_param("Stok_Max");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("InvID");
if (in_array($this->mode, ["add","edit"])) {
$sql->UpdateDB();
} else if ($this->mode === "del") {
$sql->DeleteDB();
$this->db->delete("inv_produk_kemasan", "InvID=?", [$this->id_inv]);
$this->db->delete("inv_produk_varian", "InvID=?", [$this->id_inv]);
$this->db->delete("inv_produk_harga", "InvID=?", [$this->id_inv]);
}
if ($this->mode !== "del") {
$this->Produk_Save();
$this->Produk_Backup();
}
$this->inv->Produk_Join($this->id_inv);
}
$this->app->json([ 'status' => true ]);
}
public function proses_restore() {
$this->Produk_Restore();
$this->app->json([ 'status' => true ]);
}
public function proses_copy() {
$invBaru = Param::Get("InvBaruID", 0);
// Hapus kemasan dan harga sekarang
$this->db->runQuery("DELETE FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv]);
$this->db->runQuery("DELETE FROM inv_produk_varian WHERE InvID=?", [$this->id_inv]);
$this->db->runQuery("DELETE FROM inv_produk_harga WHERE InvID=?", [$this->id_inv]);
// Salin data baru kemasan dan harga
$this->db->runQuery("INSERT INTO inv_produk_kemasan (InvID,SatuanID,Qty,UserID) SELECT ?,SatuanID,Qty,UserID FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv, $invBaru]);
$this->db->runQuery("INSERT INTO inv_produk_varian (InvID,SatuanID,Kode_SKU,UserID) SELECT ?,SatuanID,'SKU_BARU',UserID FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv, $invBaru]);
$this->db->runQuery("INSERT INTO inv_produk_harga (InvID,SatuanID,Grup_MemberID,Harga_Jual,UserID) SELECT ?,SatuanID,Grup_MemberID,Harga_Jual,UserID FROM inv_produk_harga WHERE InvID=?", [$this->id_inv, $invBaru]);
$this->app->json([ 'status' => true ]);
}
public function check_kemasan() {
$ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=?", [$this->id_inv, Param::Get("SatuanID",0)]) > 0;
$this->app->json([ 'ada' => $ada ]);
}
public function check_varian() {
$ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM inv_produk_varian WHERE (InvID=? AND SatuanID=? AND VarianID=?) OR Kode_Barcode=?", [$this->id_inv, Param::Get("SatuanID",0), Param::Get("VarianID",0), Param::Get("Kode_Barcode","")]) > 0;
$this->app->json([ 'ada' => $ada ]);
}
public function check_harga() {
$ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM inv_produk_harga WHERE InvID=? AND SatuanID=? AND Grup_MemberID=?", [$this->id_inv, Param::Get("SatuanID",0), Param::Get("Grup_MemberID",0)]) > 0;
$this->app->json([ 'ada' => $ada ]);
}
public function check_modal() {
$qty = (int) $this->db->fetchField("SELECT Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=?", [$this->id_inv, Param::Get("SatuanID",0)]) ?? 0;
$this->app->json([ 'Qty' => $qty ]);
}
public function print_barang() {
$id_sup = Param::Get("SupID", 0);
$id_grup = Param::Get("Grup_InvID", 0);
$id_member = Param::Get("Grup_MemberID", 0);
$nama_sup = ""; $nama_grup = ""; $nama_member = "";
if ($id_sup > 0) $nama_sup = $this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') FROM para_supplier WHERE SupID=?", [$id_sup]);
if ($id_grup > 0) $nama_grup = $this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$id_grup]);
if ($id_member > 0) $nama_member = $this->db->fetchField("SELECT Nama_Grup FROM para_member_grup WHERE Grup_MemberID=?", [$id_member]);
// generate report header
$tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak");
$tsql = ''; $asql = [$id_member];
if ($id_sup > 0) { $tsql .= " AND S.SupID=?"; $asql[] = $id_sup; }
if ($id_grup > 0) { $tsql .= " AND P.Grup_InvID=?"; $asql[] = $id_grup; }
$tsql = (strlen($tsql) > 0) ? substr($tsql, 4) : 'TRUE';
// query data laporan
$stat = $this->db->runQuery("SELECT P.*,H.Harga_Jual FROM (SELECT * FROM inv_produk_harga WHERE Grup_MemberID=?) H LEFT JOIN vi_inv_produk P ON (H.InvID=P.InvID AND H.SatuanID=P.SatuanID) LEFT JOIN inv_produk_sup S ON (P.InvID=S.InvID) WHERE ".$tsql." GROUP BY P.InvID,P.SatuanID ORDER BY P.Nama_Produk, P.Qty DESC", $asql);
$pre = new PrintHTML($this->app);
$pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Barang", $tglheader]);
$pre->add_field("No",10,"C");
$pre->add_field("Nama Barang",80);
$pre->add_field("Kemasan",10);
if ($this->app->user()->is_level(2)) $pre->add_field("Modal",12, "R", "rupiah");
$pre->add_field("Harga ".ucfirst(strtolower($nama_member)),12, "R", "rupiah");
if ($this->app->user()->is_level(2)) {
$pre->add_field("Margin",12, "R", "rupiah");
$pre->add_field("%",5, "R", "rupiah2");
}
if ($id_sup > 0) $pre->add_sub_title("Nama Supplier : ".$nama_sup);
if ($id_grup > 0) $pre->add_sub_title("Grup Barang : ".$nama_grup);
$pre->show_titles();
$pre->show_headers();
$nomor = 0;
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
if ($this->app->user()->is_level(2)) {
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Harga_Pokok'], $row['Harga_Jual'], ((float) $row['Harga_Jual']-(float) $row['Harga_Pokok']), ((((float) $row['Harga_Jual']-(float) $row['Harga_Pokok'])*100)/(float) $row['Harga_Jual']) ]);
} else $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Harga_Jual'] ]);
}
$pre->add_stamp(0, true);
$pre->show();
}
private function Produk_Baru(bool $autosave = false): int {
$ino = $this->db->fetchField("SELECT MAX(InvID)+1 FROM inv_produk") ?? 1;
if ($autosave) $this->db->insert('inv_produk', ['InvID' => $ino]);
return $ino;
}
private function Produk_Save(): void {
if ($this->id_inv === 0) return;
$sku_last = $this->db->fetchField("SELECT MAX(MID(Kode_SKU,6,2)) FROM inv_produk_varian WHERE Kode_SKU LIKE ?", ['%'.(string) $this->id_inv.'%']) ?? 1;
$avarian = $this->db->fetchColumn("SELECT InvVarianID FROM inv_produk_varian WHERE InvID=? AND (Kode_SKU='' OR Kode_SKU LIKE '%BARU%')", [$this->id_inv]);
if (count($avarian) > 0) {
foreach ($avarian as $val) {
$this->db->runQuery("UPDATE inv_produk_varian SET Kode_SKU=? WHERE InvVarianID=?", [Invesa::genEAN8((string) $this->id_inv, $sku_last), $val]);
}
}
}
private function Produk_Backup(): void {
if ($this->id_inv === 0) return;
$this->db->runQuery("INSERT IGNORE INTO inv_produk_backup (InvID,UserID,Produk,Kemasan,Varian,Harga,MD5Key) SELECT A.InvID,A.UserID,A.Produk,IFNULL(B.Kemasan,'[]'),IFNULL(C.Varian,'[]'),IFNULL(D.Harga,'[]'),UPPER(MD5(CONCAT(A.Produk,IFNULL(B.Kemasan,'[]'),IFNULL(C.Varian,'[]'),IFNULL(D.Harga,'[]')))) FROM (SELECT InvID,UserID,JSON_ARRAYAGG(JSON_OBJECT('InvID',InvID,'Grup_InvID',Grup_InvID,'Nama_Produk',Nama_Produk,'StokID',StokID,'NormalID',NormalID,'PPN',PPN,'Harga_Beli',Harga_Beli,'Harga_Tambah',Harga_Tambah,'Harga_Pokok',Harga_Pokok,'Stok_Min',Stok_Min,'Stok_Max',Stok_Max,'Aktif',Aktif,'UserID',UserID)) Produk FROM inv_produk WHERE InvID='".$this->id_inv."') A LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvKemasanID',InvKemasanID,'InvID',InvID,'SatuanID',SatuanID,'Qty',Qty)) Kemasan FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') B ON (A.InvID=B.InvID) LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvVarianID',InvVarianID,'InvID',InvID,'SatuanID',SatuanID,'VarianID',VarianID,'Kode_SKU',Kode_SKU,'Kode_Barcode',Kode_Barcode)) Varian FROM inv_produk_varian WHERE InvID='".$this->id_inv."') C ON (A.InvID=C.InvID) LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvHargaID',InvHargaID,'InvID',InvID,'SatuanID',SatuanID,'Grup_MemberID',Grup_MemberID,'Harga_Jual',Harga_Jual)) Harga FROM inv_produk_harga WHERE InvID='".$this->id_inv."') D ON (A.InvID=D.InvID)");
}
private function Produk_Restore(): void {
if ($this->id_inv === 0) return;
$_json_produk = []; $_json_kemasan = []; $_json_varian = []; $_json_harga = []; $_userid = 0;
$asql = [$this->id_inv]; $tsql = '';
if (empty($this->md5_key)) {
$tsql = 'ORDER BY Tanggal DESC';
} else {
$tsql = 'AND MD5Key=?';
$asql[] = $this->md5_key;
}
$arow = $this->db->fetchRow("SELECT * FROM inv_produk_backup WHERE InvID=? ".$tsql, $asql);
$_json_produk = json_decode($arow['Produk'] ?? '[]', true);
$_json_kemasan = json_decode($arow['Kemasan'] ?? '[]', true);
$_json_varian = json_decode($arow['Varian'] ?? '[]', true);
$_json_harga = json_decode($arow['Harga'] ?? '[]', true);
$_userid = $arow['UserID'] ?? 0;
if (isset($_json_produk[0]['InvID'])) {
$this->db->runQuery("DELETE FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv]);
$this->db->runQuery("DELETE FROM inv_produk_varian WHERE InvID=?", [$this->id_inv]);
$this->db->runQuery("DELETE FROM inv_produk_harga WHERE InvID=?", [$this->id_inv]);
foreach($_json_produk as $_key => $val) {
$this->db->runQuery("REPLACE INTO inv_produk (InvID,Grup_InvID,Nama_Produk,StokID,NormalID,PPN,Harga_Beli,Harga_Tambah,Harga_Pokok,Stok_Min,Stok_Max,Aktif,UserID) VALUES ('".$val['InvID']."','".$val['Grup_InvID']."','".$val['Nama_Produk']."','".$val['StokID']."','".$val['NormalID']."','".$val['PPN']."','".$val['Harga_Beli']."','".$val['Harga_Tambah']."','".$val['Harga_Pokok']."','".$val['Stok_Min']."','".$val['Stok_Max']."','".$val['Aktif']."','".$_userid."') LIMIT 1");
}
foreach($_json_kemasan as $_key => $val) {
$this->db->runQuery("INSERT INTO inv_produk_kemasan (InvKemasanID,InvID,SatuanID,Qty,UserID) VALUES ('".$val['InvKemasanID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['Qty']."','".$_userid."') LIMIT 1");
}
foreach($_json_varian as $_key => $val) {
$this->db->runQuery("INSERT INTO inv_produk_varian (InvVarianID,InvID,SatuanID,VarianID,Kode_SKU,Kode_Barcode,UserID) VALUES ('".$val['InvVarianID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['VarianID']."','".$val['Kode_SKU']."','".$val['Kode_Barcode']."','".$_userid."') LIMIT 1");
}
foreach($_json_harga as $_key => $val) {
$this->db->runQuery("INSERT INTO inv_produk_harga (InvHargaID,InvID,SatuanID,Grup_MemberID,Harga_Jual,UserID) VALUES ('".$val['InvHargaID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['Grup_MemberID']."','".$val['Harga_Jual']."','".$_userid."') LIMIT 1");
}
}
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Barang</div><div class="card-body"><div class="row mb-1"><div class="col-9"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div><div class="col-3 btn-group"><button class="btn btn-info shadow-none" type="button" id="butPrint"><i class="bi-printer me-2"></i>Cetak</button><button class="btn btn-secondary shadow-none" type="button" id="butFilter"><i class="bi-filter me-2"></i>Filter</button></div><input type="hidden" id="Filter_Produk" value="0" /></div><div id="divDetail">&nbsp;</div></div></div></div>'
]);
}
}
@@ -0,0 +1,121 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/ProdukgrupController
Description : Master Grup Barang
Created By : Siau Pheng ([email protected]).
Created Date : February 8th, 2011.
Last Modified : August 31st, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class ProdukgrupController {
private string $mode_detail;
private int $id_grup;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_grup = (int) Param::Get("Grup_InvID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("inv_produk_grup");
$sql->add_param("Kode_Grup");
$sql->add_param("Nama_Grup");
$sql->add_param("Margin");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("Grup_InvID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Grup");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'CONCAT(Kode_Grup,Nama_Grup) LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("inv_produk_grup", "*", $tsql, $asql);
$obj->add_field("Grup_InvID", "ID", "hid");
$obj->add_field("Kode_Grup", "Kode Grup", "l");
$obj->add_field("Nama_Grup", "Nama Grup Barang", "awr");
$obj->add_field("Margin", "Margin (%)", "r");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Grup", "A");
$obj->add_row_btn("clipboard", "Ubah", "ProdukGrupJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "ProdukGrupJS.detail_hapus");
$obj->set_func_btn("ProdukGrupJS.detail_tambah", "+ Grup Produk");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_grup() {
$atabel = ['Grup_InvID'=>0, 'Kode_Grup'=>"", 'Nama_Grup'=>"", 'Margin'=>0, 'Aktif'=>1];
if ($this->id_grup > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM inv_produk_grup WHERE Grup_InvID=?", [$this->id_grup]);
}
$form = new Form($this->app);
$tkode = $form->textbox("_", "Kode_Grup", $atabel['Kode_Grup'], true, true, "text", "kode grup produk");
$tnama = $form->textbox("_", "Nama_Grup", $atabel['Nama_Grup'], true, true, "text", "nama grup produk");
$tmargin = $form->textbox("_", "Margin", $atabel['Margin'], true, true, "double", "margin minimum");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Grup">Kode Grup Barang</label>
<div class="col-sm-6 col-lg-5">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Grup">Nama Grup 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="Margin">Margin Minimal (%)</label>
<div class="col-sm-6 col-lg-5">'.$tmargin.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="Grup_InvID" value="'.$atabel['Grup_InvID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Grup Barang</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Grup" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
+121
View File
@@ -0,0 +1,121 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/RekposController
Description : Master Jenis Pembayaran POS
Created By : Siau Pheng ([email protected]).
Created Date : September 9th, 2014.
Last Modified : August 31st, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class RekposController {
private string $mode_detail;
private int $id_kartu;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_kartu = (int) Param::Get("KartuID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("para_rek_pos");
$sql->add_param("Kode_Kartu");
$sql->add_param("Nama_Kartu");
$sql->add_param("Kode_Rek");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("KartuID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Rekpos");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'CONCAT(Kode_Kartu,Nama_Kartu) LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("para_rek_pos", "*", $tsql, $asql);
$obj->add_field("KartuID", "ID", "hid");
$obj->add_field("Kode_Kartu", "Kode");
$obj->add_field("Nama_Kartu", "Nama Jenis Pembayaran", "awr");
$obj->add_field("Kode_Rek", "Rekening", "c");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Kartu", "A");
$obj->add_row_btn("clipboard", "Ubah", "RekPOSJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "RekPOSJS.detail_hapus");
$obj->set_func_btn("RekPOSJS.detail_tambah", "+ Jenis Pembayaran");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_rekpos() {
$atabel = ['KartuID'=>0, 'Kode_Kartu'=>"", 'Nama_Kartu'=>"", 'Kode_Rek'=>"", 'Aktif'=>1];
if ($this->id_kartu > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM para_rek_pos WHERE KartuID=?", [$this->id_kartu]);
}
$form = new Form($this->app);
$tkode = $form->textbox("_", "Kode_Kartu", $atabel['Kode_Kartu'], true, true, "text", "kode jenis pembayaran");
$tnama = $form->textbox("_", "Nama_Kartu", $atabel['Nama_Kartu'], true, true, "text", "nama jenis pembayaran");
$trek = $form->option_db("_", "Kode_Rek", $atabel['Kode_Rek'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kode_Induk='1100' AND Mode='D' AND Aktif=1 ORDER BY Nama_Lengkap", [0,"&nbsp;"]);
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Kartu">Kode Jenis Pembayaran</label>
<div class="col-sm-6 col-lg-5">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Kartu">Nama Jenis Pembayaran</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Rek">Nama Rekening</label>
<div class="col">'.$trek.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="KartuID" value="'.$atabel['KartuID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Jenis Pembayaran POS</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Rekpos" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
+114
View File
@@ -0,0 +1,114 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/SatuanController
Description : Master Satuan
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : August 31st, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class SatuanController {
private string $mode_detail;
private int $id_satuan;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_satuan = (int) Param::Get("SatuanID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("para_satuan");
$sql->add_param("Kode_Satuan");
$sql->add_param("Nama_Satuan");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("SatuanID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Satuan");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'CONCAT(Kode_Satuan,Nama_Satuan) LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("para_satuan", "*", $tsql, $asql);
$obj->add_field("SatuanID", "ID", "hid");
$obj->add_field("Kode_Satuan", "Kode");
$obj->add_field("Nama_Satuan", "Nama Satuan", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Satuan", "A");
$obj->add_row_btn("clipboard", "Ubah", "SatuanJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "SatuanJS.detail_hapus");
$obj->set_func_btn("SatuanJS.detail_tambah", "+ Satuan");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_satuan() {
$atabel = ['SatuanID'=>0, 'Kode_Satuan'=>"", 'Nama_Satuan'=>"", 'Aktif'=>1];
if ($this->id_satuan > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM para_satuan WHERE SatuanID=?", [$this->id_satuan]);
}
$form = new Form($this->app);
$tkode = $form->textbox("_", "Kode_Satuan", $atabel['Kode_Satuan'], true, true, "text", "kode satuan barang");
$tnama = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], true, true, "text", "nama satuan barang");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Satuan">Kode Satuan</label>
<div class="col-sm-6 col-lg-5">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Satuan">Nama Satuan</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="SatuanID" value="'.$atabel['SatuanID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Satuan Barang</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Satuan" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
+135
View File
@@ -0,0 +1,135 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/SupplierController
Description : Master Supplier
Created By : Siau Pheng ([email protected]).
Created Date : December 7th, 2010.
Last Modified : August 31st, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class SupplierController {
private string $mode_detail;
private int $id_sup;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_sup = (int) Param::Get("SupID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("para_supplier");
$sql->add_param("Kode_Sup");
$sql->add_param("Nama_Sup");
$sql->add_param("Alamat_Sup");
$sql->add_param("Telp_Sup");
$sql->add_param("No_NPWP");
$sql->add_param("No_NITKU");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("SupID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Sup");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("para_supplier", "*", $tsql, $asql);
$obj->add_field("SupID", "ID", "hid");
$obj->add_field("Kode_Sup", "Kode Supplier");
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
$obj->add_field("Telp_Sup", "No. Telp", "l");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Sup", "A");
$obj->add_row_btn("clipboard", "Ubah", "SupplierJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "SupplierJS.detail_hapus");
$obj->set_func_btn("SupplierJS.detail_tambah", "+ Supplier");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_supplier() {
$atabel = ['SupID'=>0, 'Kode_Sup'=>"", 'Nama_Sup'=>"", 'Alamat_Sup', 'Telp_Sup'=>"", 'No_NPWP'=>"", 'No_NITKU'=>"", 'Aktif'=>1];
if ($this->id_sup > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM para_supplier WHERE SupID=?", [$this->id_sup]);
}
$form = new Form($this->app);
$tkode = $form->textbox("_", "Kode_Sup", $atabel['Kode_Sup'], true, true, "text", "kode supplier");
$tnama = $form->textbox("_", "Nama_Sup", $atabel['Nama_Sup'], true, true, "text", "nama supplier");
$talamat = $form->textarea("_", "Alamat_Sup", $atabel['Alamat_Sup'], true, true, 3, "alamat supplier");
$ttelp = $form->textbox("_", "Telp_Sup", $atabel['Telp_Sup'], true, true, "text", "telp supplier");
$tnpwp = $form->textbox("NPWP Supplier", "No_NPWP", $atabel['No_NPWP'], true, true, "text", "0000000000000000", 16);
$tnitku = $form->textbox("NITKU Supplier", "No_NITKU", $atabel['No_NITKU'], true, true, "text", "000000", 6);
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Kode_Sup">Kode Supplier</label>
<div class="col-sm-7 col-lg-4">'.$tkode.'</div>
<label class="col-sm-5 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Nama_Sup">Nama Supplier</label>
<div class="col-sm-7 col-lg-10">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Alamat_Sup">Alamat Supplier</label>
<div class="col-sm-7 col-lg-10">'.$talamat.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="Telp_Sup">Telpon Supplier</label>
<div class="col-sm-7 col-lg-10">'.$ttelp.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-2 col-form-label" for="No_NPWP">NPWP Member</label>
<div class="col-sm-7 col-lg-4">'.$tnpwp.'</div>
<label class="col-sm-5 col-lg-2 col-form-label" for="No_NITKU">NITKU Member</label>
<div class="col-sm-7 col-lg-4">'.$tnitku.'</div>
</div>
<input type="hidden" id="SupID" value="'.$atabel['SupID'].'" />
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" />';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Supplier</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Sup" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}
+107
View File
@@ -0,0 +1,107 @@
<?php
/*******************************************************************
PHP Class : /Controller/Table/VarianController
Description : Master Varian
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : August 31st, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Table;
use flight\Engine;
use flight\database\SimplePdo;
use Webapp\DB\SQL;
use Webapp\Web\Form;
use Webapp\Web\Param;
use Webapp\Web\Table;
class VarianController {
private string $mode_detail;
private int $id_varian;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_varian = (int) Param::Get("VarianID", 0);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("para_varian");
$sql->add_param("Nama_Varian");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("VarianID");
if ($this->mode_detail === "insert") {
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tcari = Param::Get("Cari_Varian");
$tsql = ''; $asql = [];
if (!empty($tcari)) {
$tsql = 'Nama_Varian LIKE ?';
$asql[] = '%'. $tcari .'%';
}
$obj = new Table($this->app);
$obj->set_table("para_varian", "*", $tsql, $asql);
$obj->add_field("VarianID", "ID", "hid");
$obj->add_field("Nama_Varian", "Nama Varian", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Varian", "A");
$obj->add_row_btn("clipboard", "Ubah", "VarianJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "VarianJS.detail_hapus");
$obj->set_func_btn("VarianJS.detail_tambah", "+ Varian");
$this->app->json([ $obj->json_table("divDetail") ]);
}
public function form_varian() {
$atabel = ['VarianID'=>0, 'Nama_Varian'=>"", 'Aktif'=>1];
if ($this->id_varian > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM para_varian WHERE VarianID=?", [$this->id_varian]);
}
$form = new Form($this->app);
$tnama = $form->textbox("_", "Nama_Varian", $atabel['Nama_Varian'], true, true, "text", "nama varian barang");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Varian">Nama Varian</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col d-flex gap-2">'.$taktif.'</div>
</div>
<input type="hidden" id="VarianID" value="'.$atabel['VarianID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function index() {
$this->app->json(['html' => '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Varian Barang</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Varian" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>'
]);
}
}