Query("SELECT MAX(InvID)+1 Nomor FROM inv_produk"); if ($db->Next()) $ino = (int)$db->Row("Nomor", 1); if ($autosave) $db->Query("INSERT INTO inv_produk (InvID) VALUES ('".$ino."')"); return $ino; } function Produk_Save($id_inv = 0, $id_grup = 0) { global $db; if ($id_inv == 0) return; $akemas = []; $db->Query("SELECT InvKemasanID FROM inv_produk_kemasan WHERE InvID='".$id_inv."' AND Kode_SKU=''"); while ($db->Next()) { $akemas[] = $db->Row("InvKemasanID"); } if (count($akemas) > 0) { foreach($akemas as $_key => $val) { $sku_baru = SKU_Baru($id_grup); $db->Query("UPDATE inv_produk_kemasan SET Kode_SKU='".$sku_baru."' WHERE InvKemasanID='".$val."' LIMIT 1"); } } } function Produk_Backup($id_inv = 0) { global $db; if ($id_inv == 0) return; $db->Query("INSERT IGNORE INTO inv_produk_backup (InvID,UserID,Produk,Kemasan,MD5Key) SELECT A.InvID,A.UserID,A.Produk,IFNULL(B.Kemasan,'[]'),UPPER(MD5(CONCAT(A.Produk,IFNULL(B.Kemasan,'[]')))) FROM (SELECT InvID,UserID,JSON_ARRAYAGG(JSON_OBJECT('InvID',InvID,'Grup_InvID',Grup_InvID,'MerekID',MerekID,'Nama_Produk',Nama_Produk,'StokID',StokID,'NormalID',NormalID,'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='".$id_inv."') A LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvKemasanID', InvKemasanID, 'InvID', InvID, 'SatuanID', SatuanID, 'Kode_SKU', Kode_SKU, 'Kode_Barcode', Kode_Barcode, 'Qty', Qty, 'Harga_Jual', Harga_Jual)) Kemasan FROM inv_produk_kemasan WHERE InvID='".$id_inv."') B ON (A.InvID=B.InvID)"); } function Produk_Restore($id_inv = 0, $md5_key = "") { global $db; if ($id_inv == 0) return; $_json_produk = []; $_json_kemasan = []; $_userid = 0; $tsql = ($md5_key == "") ? "ORDER BY Tanggal DESC" : "AND MD5Key='".$md5_key."'"; $db->Query("SELECT * FROM inv_produk_backup WHERE InvID='".$id_inv."' ".$tsql." LIMIT 1"); if ($db->Next()) { $_json_produk = json_decode($db->Row("Produk", "[]"), true); $_json_kemasan = json_decode($db->Row("Kemasan", "[]"), true); $_userid = $db->Row("UserID", 0); } if (isset($_json_produk[0]['InvID'])) { $db->Query("DELETE FROM inv_produk_kemasan WHERE InvID='".$id_inv."'"); foreach($_json_produk as $_key => $val) { $db->Query("REPLACE INTO inv_produk (InvID,Grup_InvID,MerekID,Nama_Produk,StokID,NormalID,Harga_Beli,Harga_Tambah,Harga_Pokok,Stok_Min,Stok_Max,Aktif,UserID) VALUES ('".$val['InvID']."','".$val['Grup_InvID']."','".$val['MerekID']."','".$val['Nama_Produk']."','".$val['StokID']."','".$val['NormalID']."','".$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) { $db->Query("REPLACE INTO inv_produk_kemasan (InvKemasanID,InvID,SatuanID,Kode_SKU,Kode_Barcode,Qty,Harga_Jual,UserID) VALUES ('".$val['InvKemasanID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['Kode_SKU']."','".$val['Kode_Barcode']."','".$val['Qty']."','".$val['Harga_Jual']."','".$_userid."') LIMIT 1"); } } } $db = $db ?? new MySQL(); $ajson = []; $data = Param::Get("data"); $mode = Param::Get("mode"); $mode_detail = Param::Get("mode_detail"); $id_inv = Param::Get("InvID", 0); $id_kemasan = Param::Get("InvKemasanID", 0); $md5_key = Param::Get("MD5Key", ""); $i_filt = Param::Get("Filter_Produk", 0); if ( $data == "detail-produk" ) { $atabel = ['InvID'=>0,'Grup_InvID'=>0,'StokID'=>$_SESSION['__APP_INV']['DEF_SATUANID'],'NormalID'=>$_SESSION['__APP_INV']['DEF_SATUANID'],'Aktif'=>1]; if ($id_inv > 0) { $db->Query("SELECT * FROM inv_produk WHERE InvID='".$id_inv."' LIMIT 1"); if ($db->Next()) $atabel = $db->AllRow(); Produk_Backup($id_inv); } else { $atabel['InvID'] = Produk_Baru(true); } $form = new Form($db); $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," "]); $tmerek = $form->option_db("_", "MerekID", $atabel['MerekID'], true, false, "para_merek", ["MerekID","Nama_Merek"], "Aktif=1 ORDER BY Nama_Merek", [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"); $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Ya",'0'=>"Tidak"]); $ajson['html'] = '
'.$tgrup.'
'.$taktif.'
'.$tmerek.'
'.$tnama.'
'.$tstok.Form_Info("Ukuran satuan terkecil produk.").'
'.$tnormal.Form_Info("Ukuran satuan yang dipergunakan dalam transaksi normal dan laporan.").'

'.$tbeli.'
Stok Minimum'.$tsmin.'
'.$ttambah.'
Stok Maximum'.$tsmax.'
'.$thpp.'
'; } else if ( $data == "save" ) { if ($mode == "cancel") { if (Param::Get("mode_before")=="add") { $db->Query("DELETE FROM inv_produk_kemasan WHERE InvID='".$id_inv."'"); $db->Query("DELETE FROM inv_produk WHERE InvID='".$id_inv."'"); } else { Produk_Restore($id_inv); } } else { $sql = new SQL($db); $sql->set_table("inv_produk"); $sql->add_param("Grup_InvID"); $sql->add_param("MerekID"); $sql->add_param("Nama_Produk"); $sql->add_param("StokID"); $sql->add_param("NormalID"); $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($mode, ["add","edit"])) { $sql->UpdateDB(); } else if ($mode=="del") { $sql->DeleteDB(); $db->Query("DELETE FROM inv_produk_kemasan WHERE InvID='".$id_inv."'"); } if ($mode <> "del") { Produk_Save($id_inv, Param::Get("Grup_InvID")); Produk_Backup($id_inv); } } $ajson['status'] = true; } else if ( $data == "tabel-produk" ) { $tcari = trim(Param::Get("Cari_Produk")); $tsql = ""; if ($tcari <> "") { $tsql = " AND Nama_Produk LIKE '%".$tcari."%'"; if (is_numeric($tcari)) { $tsql .= " OR InvID IN (SELECT InvID FROM inv_produk_kemasan WHERE CONCAT(Kode_SKU,Kode_Barcode) LIKE '%".$tcari."%')"; } } else { $tsql .= ($i_filt==0) ? "" : " AND Grup_InvID='".$i_filt."'"; } if (strlen($tsql)>0) $tsql = " WHERE".substr($tsql, 4); $obj = new Table($db); $obj->set_table("(SELECT * FROM inv_produk".$tsql.") P LEFT JOIN inv_produk_kemasan K ON (K.InvID=P.InvID) 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.Nama_Produk,IFNULL(S.Nama_Satuan,'') Nama_Kemasan,Round(P.Harga_Pokok*IFNULL(K.Qty,1),2) Harga_Pokok,IF(IFNULL(K.Harga_Jual,0)=0,0,(((K.Harga_Jual-(P.Harga_Pokok*IFNULL(K.Qty,1)))*100)/K.Harga_Jual)) Margin,IFNULL(K.Harga_Jual,0) Harga_Jual,IF(IFNULL(T.Stok,0)=0,0,T.Stok/IFNULL(K.Qty,1)) Stok,IF(K.Harga_Jual<(P.Harga_Pokok*IFNULL(K.Qty,1)) OR ISNULL(K.Harga_Jual),1,0) Rugi", ""); $obj->add_field("InvID", "No.", "c"); $obj->add_field("Nama_Produk", "Nama Barang", "awr"); $obj->add_field("Nama_Kemasan", "Kemasan", "l"); if (user_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", "Sisa 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 (user_level(2)) $obj->add_row_btn("arrow-counterclockwise", "Restore", "ProdukJS.produk_restore"); $obj->add_row_btn("trash", "Hapus", "ProdukJS.produk_hapus"); $obj->set_func_navi("ProdukJS.data_query('tabel-produk')"); $obj->set_func_btn("ProdukJS.produk_tambah", "+ Produk"); $ajson[] = $obj->db_table("divDetail"); } else if ( $data == "tabel-kemasan" ) { if (in_array($mode_detail, ["update","delete"])) { $sql = new SQL($db); $sql->set_table("inv_produk_kemasan"); $sql->add_param("SatuanID"); $sql->add_param("Kode_Barcode"); $sql->add_param("Qty"); $sql->add_param("Harga_Jual"); $sql->add_param_userid(); $sql->add_where("InvKemasanID", $id_kemasan); if ($mode_detail=="update") { if ($id_kemasan == 0) { $sql->add_param("InvID"); $sql->InsertDB(); } else { $sql->UpdateDB(); } } else if ($mode_detail=="delete") { $sql->DeleteDB(); } } $obj = new Table($db); $obj->set_query("SELECT K.*,S.Nama_Satuan,(K.Qty*P.Harga_Pokok) Harga_Modal,IF(K.Harga_Jual=0,0,K.Harga_Jual-(K.Qty*P.Harga_Pokok)) Margin_Rup, IF(K.Harga_Jual=0,0,((K.Harga_Jual-(K.Qty*P.Harga_Pokok))*100)/K.Harga_Jual) Margin_Per FROM (SELECT * FROM inv_produk_kemasan WHERE InvID='".$id_inv."') K LEFT JOIN (SELECT * FROM inv_produk WHERE InvID='".$id_inv."') P ON (K.InvID=P.InvID) LEFT JOIN para_satuan S ON (K.SatuanID=S.SatuanID)"); $obj->add_field("InvKemasanID", "ID", "hid"); $obj->add_field("Nama_Satuan", "Nama Kemasan", "l"); $obj->add_field("Kode_SKU", "SKU", "c"); $obj->add_field("Kode_Barcode", "Barcode", "l"); $obj->add_field("Qty", "Qty", "r", "rupiah"); $obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah"); if (user_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, "rred"); $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"); $ajson[] = $obj->json_table("divKemasan"); } else if ( $data == "detail-kemasan" ) { $arec = ['InvKemasanID'=>0,'SatuanID'=>0,'Qty'=>0,'Kode_SKU'=>"SKU_BARU"]; if ($id_kemasan > 0) { $db->Query("SELECT * FROM inv_produk_kemasan WHERE InvKemasanID='".$id_kemasan."' LIMIT 1"); if ($db->Next()) $arec = $db->AllRow(); } $form = new Form($db); $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", null, null, "ProdukJS.calc_Modal();"); $tsku = $form->textbox("_", "Kode_SKU", $arec['Kode_SKU'], false, false, "text"); $tbcode = $form->textbox("_", "Kode_Barcode", $arec['Kode_Barcode'], true, false, "text"); $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_Harga(1);"); $tpersen = $form->textbox("_", "Persen_Jual", $arec['Persen_Jual'], true, false, "double", "persen jual", null, null, "ProdukJS.calc_Harga(2);"); $ajson['html'] = '
'.$tsatuan.'
Kode SKU'.$tsku.'
'.$tqty.''.Param::Get("Nama_Satuan","Satuan").'
Kode Barcode'.$tbcode.'

'.$tharga.'
≈
'.$tpersen.'
%
'.$tmodal.'
'; } else if ( $data == "check-kemasan") { $ajson['ada'] = false; $db->Query("SELECT COUNT(*) Jumlah FROM inv_produk_kemasan WHERE InvID='".$id_inv."' AND SatuanID='".Param::Get("SatuanID")."'"); if ($db->Next() && $db->Row("Jumlah",0)>0) $ajson['ada'] = true; } else if ($data == "detail-filter") { $form = new Form($db); $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"]); echo '
Tampilan Berdasarkan :
'.$tfilter.'
'; } else if ( $data == "restore-detail" ) { $atabel = ['InvID'=>$id_inv]; if ($id_inv > 0) { $db->Query("SELECT * FROM inv_produk WHERE InvID='".$id_inv."' LIMIT 1"); if ($db->Next()) $atabel = $db->AllRow(); } $form = new Form($db); $tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], false, false, "text"); $ajson['html'] = '
'.$tnama.'
 
'; } else if ( $data == "restore-tabel" ) { $obj = new Table($db); $obj->set_table("inv_produk_backup", "Tanggal,MD5Key,UserID", "InvID='".$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"); $obj->set_func_navi("ProdukJS.data_query('restore-tabel')"); $ajson[] = $obj->db_table("divBrowBackup"); } else if ($data == "restore-proses") { Produk_Restore($id_inv, $md5_key); $ajson['status'] = true; } else if ( $data == "restore-form" ) { $atabel = ['InvID'=>$id_inv, 'Nama_Grup'=>"", 'Nama_Merek'=>"", 'Nama_Stok'=>"", 'Nama_Normal'=>""]; $akemasan = []; if ($md5_key <> "") { $db->Query("SELECT * FROM inv_produk_backup WHERE MD5Key='".$md5_key."' LIMIT 1"); if ($db->Next()) { $atabel = array_merge($atabel, json_decode($db->Row("Produk", "[]"), true)[0]); $akemasan = json_decode($db->Row("Kemasan", "[]"), true); } $db->Query("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID='".$atabel['Grup_InvID']."' LIMIT 1"); if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow()); $db->Query("SELECT Nama_Merek FROM para_merek WHERE MerekID='".$atabel['MerekID']."' LIMIT 1"); if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow()); $db->Query("SELECT Nama_Satuan Nama_Stok FROM para_satuan WHERE SatuanID='".$atabel['StokID']."' LIMIT 1"); if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow()); $db->Query("SELECT Nama_Satuan Nama_Normal FROM para_satuan WHERE SatuanID='".$atabel['NormalID']."' LIMIT 1"); if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow()); $atabel['Status_Aktif'] = ($atabel['Aktif']==1) ? "Aktif" : "Tidak Aktif"; } $tnama = ''; $tgrup = ''; $tmerek = ''; $tstok = ''; $tnormal = ''; $tbeli = ''; $ttambah = ''; $thpp = ''; $tsmin = ''; $tsmax = ''; $taktif = ''; $ajson['html'] = '

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

'; if (count($akemasan) == 0) { $ajson['html'] .= ''; } foreach($akemasan as $_key => $val) { $db->Query("SELECT * FROM para_satuan WHERE SatuanID='".$val['SatuanID']."' LIMIT 1"); if ($db->Next()) $val = array_merge($val, $db->AllRow()); $ajson['html'] .= sprintf('', $val['Nama_Satuan'], $val['Kode_SKU'], $val['Kode_Barcode'], rupiah($val['Qty']), rupiah($val['Harga_Jual'])); } $ajson['html'] .= '
'; } else if ( $data == "default") { echo '
Daftar Barang
 
'; } send_json($ajson); ?>