app = $app; $this->db = $db; $this->web_app = (array) $session->get('WEB_APP'); $this->app_gel = (array) $session->get('APP_GEL'); $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); $this->mode = Param::Get("mode", ""); $this->mode_detail = Param::Get("mode_detail", ""); $this->no_beli = Param::Get("No_Beli", ""); $this->is_pend = str_contains($this->no_beli, "BELI") === true; $this->id_inv = Param::Int("InvID", 0); $this->id_satuan = Param::Int("SatuanID", 0); $this->id_varian = Param::Int("VarianID", 0); $this->inv = new Inv($app); $this->gel = new Gel($app); } public function table_detail() { if (in_array($this->mode_detail, ["insert","update","delete"])) { $iqty = Param::Float("Qty", 0); $sql = new SQL($this->app); $sql->set_table("tmp_inv_detail"); $sql->add_param("No_Ref", $this->no_beli); $sql->add_param("InvID"); $sql->add_param("SatuanID"); $sql->add_param("VarianID"); $sql->add_param("Qty", $iqty); $sql->add_param("Harga_Beli"); $sql->add_param("Disk_Rupiah"); $sql->add_param("Disk_Persen1"); $sql->add_param("Disk_Persen2"); $sql->add_param("Disk_Persen3"); $sql->add_param("Disk_Persen4"); $sql->add_param("Disk_Persen5"); $sql->add_param("Total_Diskon", "(Harga_Beli-((Harga_Beli-Disk_Rupiah)*((100.0-Disk_Persen1)/100)*((100.0-Disk_Persen2)/100)*((100.0-Disk_Persen3)/100)*((100.0-Disk_Persen4)/100)*((100.0-Disk_Persen5)/100)))*Qty", true); $sql->add_param_unix(); $sql->add_param_userid(); $sql->add_where("ID"); $sql->add_where("No_Ref", $this->no_beli); $_id = Param::Get("ID", 0); if ( $this->mode_detail === "insert" ) { $sql->InsertDB(); $_id = $sql->LastInsertID("ID"); } else if ( $this->mode_detail === "update" ) { $sql->UpdateDB(); } else if ( $this->mode_detail === "delete" ) { $sql->DeleteDB(); } } $tsql = ''; $asql = [$this->no_beli]; $qtabel = "inv_detail"; if ($this->is_pend) $qtabel = "tmp_inv_detail"; if (in_array($this->mode, ["add","edit"])) { if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); } $qtabel = "tmp_inv_detail"; } $obj = new Table($this->app); $obj->set_table("(SELECT * FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,P.Kode_SKU,P.Nama_Lengkap,(D.Qty*D.Harga_Beli)-D.Total_Diskon Total", "", $asql); $obj->set_footer("SUM((D.Qty*D.Harga_Beli)-D.Total_Diskon) Total,SUM(D.Total_Diskon) Total_Diskon"); $obj->add_field("ID", "No", "c"); $obj->add_field("InvID", "InvID", "hid"); $obj->add_field("SatuanID", "SatuanID", "hid"); $obj->add_field("VarianID", "VarianID", "hid"); $obj->add_field("Kode_SKU", "SKU", "c"); $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); $obj->add_field("Qty", "Qty", "r", "rupiah2"); $obj->add_field("Harga_Beli", "Harga @", "r", "rupiah"); $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah", "rupiah"); $obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah"); $obj->set_field_order("ID", "D"); if (in_array($this->mode, ["add","edit"])) { $obj->add_row_btn("clipboard", "Ubah", "BeliJS.detail_ubah"); $obj->add_row_btn("trash", "Hapus", "BeliJS.detail_hapus", "Unix", $this->app->user()->unix()); $obj->set_func_btn("BeliJS.detail_tambah", ' Barang'); $obj->set_func_btn("BeliJS.produk_brow", ' Browse'); } $obj->set_func_btn("BeliJS.total_show", "Total"); $ajson[] = $obj->json_table("divDetailTabel"); if (in_array($this->mode, ["add","pending-edit"])) { $ajual = $this->db->fetchRow("SELECT SUM((Qty*Harga_Beli)-Total_Diskon) Jumlah,SUM(Total_Diskon) Diskon FROM ".$qtabel." WHERE No_Ref=?".$tsql, $asql) ?? ['Jumlah'=>0, 'Diskon'=>0]; $ajson[] = ['type'=>"form", 'id'=>"Real_Beli", 'value'=>$ajual['Jumlah']]; $ajson[] = ['type'=>"form", 'id'=>"Real_Diskon", 'value'=>$ajual['Diskon']]; } if (in_array($this->mode_detail, ["insert","update"])) {//WARNING: harga jual dibawah limit margin!! $hbeli = (float) $this->db->fetchField("SELECT CEIL(Harga_Beli-(Total_Diskon/Qty)) Pokok FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_beli, $_id]) ?? 0; $_row = $this->db->fetchRow("SELECT P.Nama_Produk,H.*,G.Margin FROM (SELECT * FROM inv_produk_harga WHERE InvID=? AND SatuanID=? AND Harga_Jual>0 ORDER BY Harga_Jual ASC LIMIT 1) H LEFT JOIN (SELECT * FROM inv_produk WHERE InvID=?) P ON (H.InvID=P.InvID) LEFT JOIN inv_produk_grup G ON (P.Grup_InvID=G.Grup_InvID)", [$this->id_inv, $this->id_satuan, $this->id_inv]); if ($_row) { if ((float) $_row['Margin'] > 0) $hbeli += ($hbeli*((float) $_row['Margin']/100)); if ($hbeli > (float) $_row['Harga_Jual']) $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>3000, 'value'=>"Produk \"".$_row['Nama_Produk']."\" Harga Beli telah melewati Margin Harga Jual!"]; } } $this->app->json($ajson); } public function brow_tx() { $tcari = Param::Get("Cari_TX"); $tsql = ''; $asql = []; if (!empty($tcari)) { $tsql .= "CONCAT(B.No_Beli,B.No_Faktur,S.Nama_Sup,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y')) LIKE ?"; $asql[] = '%' . $tcari . '%'; } $obj = new Table($this->app); $obj->set_table("(SELECT *,Total_Beli-Total_Diskon Jumlah FROM inv_beli WHERE Data_Beli=1) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", $tsql, $asql); $obj->add_field("No_Beli", "No. Trans", "c"); $obj->add_field("Tgl_Beli", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); $obj->add_field("Kode_Cab", "Cabang", "c"); $obj->add_field("Nama_Sup", "Nama Supplier", "awr"); $obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah2"); $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2"); $obj->add_field("Jumlah", "Jumlah", "r", "rupiah2"); $obj->set_field_order("Tgl_Beli", "D"); $obj->set_func_select("BeliJS.tx_select"); $this->app->json([ $obj->db_table("divBrowTX") ]); } public function brow_pending() { $obj = new Table($this->app); $obj->set_table("(SELECT *,Total_Beli-Total_Diskon Jumlah FROM inv_beli_pend WHERE UserID=?) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", "", [$this->app->user()->id()]); $obj->add_field("No_Beli", "No. Trans", "c"); $obj->add_field("Tgl_Beli", "Tgl. Pending", "c", "sqltgl", "", "val-tgl"); $obj->add_field("Kode_Cab", "Cabang", "c"); $obj->add_field("Nama_Sup", "Nama Supplier", "awr"); $obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah2"); $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2"); $obj->add_field("Jumlah", "Jumlah", "r", "rupiah2"); $obj->set_field_order("No_Beli", "D"); $obj->add_row_btn("save", "Pilih", "BeliJS.pending_select"); if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "BeliJS.pending_delete", "UserID", $this->app->user()->id()); $this->app->json([ $obj->db_table("divBrowPending") ]); } public function brow_produk() { $tcari = Param::Get("Cari_Produk"); $tsql = ''; $asql = [1]; if (!empty($tcari)) { $tsql .= " AND P.Barcode_Nama LIKE ?"; $asql[] = '%' . $tcari . '%'; } if ((string) Param::Get("Filter_Browse", "") !== "all") { $tsql .= " AND S.SupID=?"; array_push($asql, Param::Get("SupID")); } $obj = new Table($this->app); $obj->set_table("vi_inv_produk P LEFT JOIN inv_produk_sup S ON (P.InvID=S.InvID)", "P.*", "P.Aktif=?".$tsql, $asql); $obj->add_field("InvID", "ID", "hid"); $obj->add_field("SatuanID", "ID", "hid"); $obj->add_field("VarianID", "ID", "hid"); $obj->add_field("Kode_SKU", "SKU", "c"); $obj->add_field("Kode_Barcode", "Barcode", "c"); $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); $obj->set_field_order("Kode_SKU", "A"); $obj->set_func_select("BeliJS.produk_select"); $this->app->json([ $obj->db_table("divBrowProduk") ]); } public function auto_produk() { $tcari = Param::Get("Auto_Query", ""); $ajson['autodata'] = []; $bcode = 0; $arec = []; // Cari by SKU + Barcode $_row = $this->db->fetchRow("SELECT V.InvID,P.Nama_Produk,CONCAT(V.SatuanID,':',V.VarianID,':',S.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk_varian WHERE Kode_SKU=? OR Kode_Barcode=? LIMIT 1) V LEFT JOIN inv_produk P ON (P.InvID=V.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=V.SatuanID) WHERE P.Aktif=1", [$tcari, $tcari]); if ($_row) { $bcode = 1; $arec = $_row->getData(); } if ($bcode === 1) { $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1]; } else { $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Produk,V.Kode_SKU,IFNULL(MV.Nama_Varian,'') Nama_Varian,MS.Nama_Satuan,CONCAT(V.SatuanID,':',V.VarianID,':',MS.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk WHERE Nama_Produk LIKE ? AND Aktif=1) P INNER JOIN inv_produk_varian V ON (V.InvID=P.InvID) LEFT JOIN para_satuan MS ON (MS.SatuanID=V.SatuanID) LEFT JOIN para_varian MV ON (MV.VarianID=V.VarianID) ORDER BY P.Nama_Produk,MS.Nama_Satuan LIMIT 50", ['%'.$tcari.'%']); while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Produk']." ".$row['Nama_Varian']." ".$row['Nama_Satuan'], 'data'=>$row['Data2'], 'bc'=>0]; } } $this->app->json($ajson); } public function form_master() { $ajson = [ 'error'=>"", 'html'=>"" ]; $atabel = []; if ($this->mode === "pending-edit") { $this->inv->Pending_Edit($this->no_beli); $atabel = $this->Data_Beli($this->no_beli); $this->mode = "edit"; } else if ($this->mode === "pending-save") { $b_baru = false; if (str_ends_with($this->no_beli, "#00")) { $b_baru = true; $no_lama = $this->no_beli; $this->no_beli = $this->Pending_Nomor(); $this->inv->Pending_Save($no_lama, $this->no_beli); } $apending = $this->db->fetchRow("SELECT SUM(Qty*Harga_Beli) Beli,SUM(Total_Diskon) Diskon FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? ['Beli'=>0, 'Diskon'=>0]; $sql = new SQL($this->app); $sql->set_table("inv_beli_pend"); $sql->add_param("No_Beli", $this->no_beli); $sql->add_param_date("Tgl_Beli"); $sql->add_param_date("Tgl_Faktur"); $sql->add_param("No_Faktur"); $sql->add_param("CabID"); $sql->add_param("SupID"); $sql->add_param("Total_Beli", $apending['Beli']); $sql->add_param("Total_Diskon", $apending['Diskon']); $sql->add_param("Real_Beli"); $sql->add_param("Real_Diskon"); $sql->add_param("PPN"); $sql->add_param_userid(); $sql->add_where("No_Beli", $this->no_beli); if ($b_baru) $sql->InsertDB(); else $sql->UpdateDB(); $atabel = $this->Data_Beli(); } else if ($this->mode === "pending-delete") { $this->inv->Pending_Delete($this->no_beli); $this->db->delete("inv_beli_pend", "No_Beli=?", [$this->no_beli]); $atabel = $this->Data_Beli(); } else if ($this->mode === "add") { $atabel = $this->Data_Beli("", true); } else if ($this->mode === "edit") { $this->inv->Detail_Copy($this->no_beli, true); $atabel = $this->Data_Beli($this->no_beli); } else if ($this->mode === "save") { $no_lama = $this->no_beli; if ($this->is_pend) { $this->no_beli = $this->inv->Nomor_Baru("B", Param::Get("Tgl_Beli"), true); if (!str_ends_with($no_lama, "#00")) $this->db->delete("inv_beli_pend", "No_Beli=?", [$no_lama]); } $this->inv->Detail_Save($this->no_beli, 3, $this->id_cab, Param::Get("Tgl_Beli"), $this->is_pend, $no_lama, Param::Int("PPN", 0)); $abeli = $this->db->fetchRow("SELECT SUM(Qty*Harga_Beli) Beli, SUM(Total_Diskon) Diskon FROM inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? ['Beli'=>0, 'Diskon'=>0]; $sql = new SQL($this->app); $sql->set_table("inv_beli"); $sql->add_param_date("Tgl_Beli"); $sql->add_param_date("Tgl_Faktur"); $sql->add_param("No_Faktur"); $sql->add_param("CabID"); $sql->add_param("SupID"); $sql->add_param("Total_Beli", $abeli['Beli']); $sql->add_param("Total_Diskon", $abeli['Diskon']); $sql->add_param("Real_Beli"); $sql->add_param("Real_Diskon"); $sql->add_param("PPN"); $sql->add_param("Data_Beli", 1); $sql->add_param_stamp(); $sql->add_param_userid(); $sql->add_where("No_Beli", $this->no_beli); $sql->UpdateDB(); $this->inv->Produk_Update($this->no_beli, Param::Int("SupID", 0)); $this->gel->Update_Lunas_Sup(Param::Int("SupID", 0)); // PROSES POSTING GL $ainfo = $this->db->fetchRow("SELECT B.*,S.Nama_Sup,B.Real_Beli Tagihan FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_beli]); if (count($ainfo) > 0) { $ajurnal = [ 'Kode_Jurnal' => $ainfo['No_Beli'], 'TipeID' => 5, 'CabID' => $ainfo['CabID'], 'Tanggal' => tgl_sql2str($ainfo['Tgl_Beli']), 'Kode_Ref' => $ainfo['No_Beli'], 'Catatan' => "Pembelian : ".$ainfo['No_Beli'].(($ainfo['No_Faktur']=="")?"":" (Faktur : ".$ainfo['No_Faktur'].") ")." / ".$ainfo['Nama_Sup'] ]; $adetail = [ [ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => "D", 'Jumlah' => $ainfo['Tagihan'] ], [ 'Kode_Rek' => $this->app_gel['HUT_USAHA'], 'DK' => "K", 'Jumlah' => $ainfo['Tagihan'], 'SupID' => $ainfo['SupID'] ] ]; $this->gel->Jurnal_Post($ajurnal, $adetail); } $atabel = $this->Data_Beli($this->no_beli); $this->mode = "view"; } else if ($this->mode === "cancel") { if (str_ends_with($this->no_beli, "#00") || !$this->is_pend) $this->inv->Detail_Cancel($this->no_beli); $atabel = $this->Data_Beli(); } else { $atabel = $this->Data_Beli($this->no_beli); } $enable = in_array($this->mode, ["add","edit"]) ? true : false; $form = new Form($this->app); $tnota = $form->textbox("_", "No_Beli", $atabel['No_Beli'], !$enable, true, "text", "nomor transaksi"); $tfaktur = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], $enable, true, "text", "nomor faktur"); $ttglnota = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], $enable, true); $ttglfaktur = $form->datebox("_", "Tgl_Faktur", $atabel['Tgl_Faktur'], $enable, true); $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]); $tsup = $form->option_db("_", "SupID", $atabel['SupID'], $enable, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0," "]); $tppn = ''; if ($enable) { $tppn = $form->option("_", "PPN", $atabel['PPN'], true, false, Invesa::PPN_Array()); $tppn = str_replace("option-tags", "", $tppn); } $ajson['html'] = '