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')['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", 'Kemasan'); $obj->set_func_btn("ProdukJS.kemasan_copy", '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,'Tanpa Varian') 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," "]); $tstok = $form->option_db("_", "StokID", $atabel['StokID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0," "]); $tnormal = $form->option_db("_", "NormalID", $atabel['NormalID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0," "]); $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'] = '
'.$tgrup.'
'.$taktif.'
'.$tnama.'
'.$tstok.Invesa::Form_Info("Ukuran satuan terkecil produk.").'
'.$tnormal.Invesa::Form_Info("Ukuran satuan yang dipergunakan dalam transaksi normal dan laporan.").'

'.$tbeli.'
Status PPN  *'.$tppn.'
'.$ttambah.'
Stok Minimum'.$tsmin.'
'.$thpp.'
Stok Maximum'.$tsmax.'
'; $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'] = '
'.$tsup.'
'.$tginv.'
'.$tmem.'
'.$ttgl.'
'; $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'] = '
Tampilan Berdasarkan :
'.$tfilter.'
'; $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'] = '
'.$tnama.'
 
'; $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'] = '
'.$tsatuan.'
'.$tqty.''.Param::Get("Satuan_Stok","?").'
'; $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'] = '
'.$tsatuan.'
Kode SKU'.$tsku.'
'.$tvarian.'
Kode Barcode'.$tbcode.'
'; $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'] = '
'.$tsatuan.'
'.$tgrup.'
Harga Modal'.$tmodal.'
'.$tharga.'
≈
'.$tpersen.'
%
'; $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 = ''; $tgrup = ''; $tstok = ''; $tnormal = ''; $tbeli = ''; $ttambah = ''; $thpp = ''; $tsmin = ''; $tsmax = ''; $tppn = ''; $taktif = ''; $ajson['html'] = '

Nama Barang'.$tnama.'
Grup Barang'.$tgrup.'
Status Barang'.$taktif.'
Satuan Stok'.$tstok.'
Satuan Normal'.$tnormal.'
Harga Beli'.$tbeli.'
Status PPN *'.$tppn.'
+ Biaya'.$ttambah.'
Stok Minimum'.$tsmin.'
Harga Pokok'.$thpp.'
Stok Maximum'.$tsmax.'

'; if (count($akemasan) == 0) { $ajson['html'] .= ''; } 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('', $val['Nama_Satuan'], rupiah((float)$val['Qty'])." ".$atabel['Nama_Stok']); } $ajson['html'] .= '

'; if (count($avarian) == 0) { $ajson['html'] .= ''; } 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('', $val['Kode_SKU'], $val['Kode_Barcode'], $val['Nama_Satuan'], $val['Nama_Varian']); } $ajson['html'] .= '

'; if (count($aharga) == 0) { $ajson['html'] .= ''; } 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('', $val['Nama_Satuan'], $val['Nama_Grup'], rupiah((float)$val['Harga_Jual'])); } $ajson['html'] .= '
'; $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' => '
Daftar Barang
 
' ]); } }