Files
cmasa/app/Controller/Table/ProdukController.php
T
2026-10-29 13:34:31 +07:00

836 lines
54 KiB
PHP

<?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>'
]);
}
}