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_opname = Param::Get("No_Opname", ""); $this->is_baru = str_contains($this->no_opname, "OPNA") === 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_opname); $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("Harga_Jual", "Harga_Beli", true); $sql->add_param_unix(); $sql->add_param_userid(); $sql->add_where("ID"); $sql->add_where("No_Ref", $this->no_opname); if ( $this->mode_detail === "insert" ) { $sql->InsertDB(); } else if ( $this->mode_detail === "update" ) { $sql->UpdateDB(); } else if ( $this->mode_detail === "delete" ) { $sql->DeleteDB(); } } $tsql = ''; $asql = [$this->no_opname]; $qtabel = "inv_detail"; if (in_array($this->mode, ["add","edit"])) { if ($this->mode === "add") { $tsql = " AND Unix=?"; array_push($asql, $this->app->user()->unix()); } $qtabel = "tmp_inv_detail"; } $obj = new Table($this->app); $obj->set_table("(SELECT *,(Qty*Harga_Beli) Total 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", "", $asql); $obj->set_footer("SUM(D.Total) Total"); $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", "Jumlah", "r", "rupiah", "rupiah"); $obj->set_field_order("ID", "D"); if (in_array($this->mode, ["add","edit"])) { $obj->add_row_btn("clipboard", "Ubah", "OpnameJS.detail_ubah"); $obj->add_row_btn("trash", "Hapus", "OpnameJS.detail_hapus", "Unix", $this->app->user()->unix()); $obj->set_func_btn("OpnameJS.detail_tambah", ' Barang'); $obj->set_func_btn("OpnameJS.produk_brow", ' Browse'); } $ajson[] = $obj->json_table("divDetailTabel"); $this->app->json($ajson); } public function brow_tx() { $tcari = Param::Get("Cari_TX"); $tsql = ''; $asql = []; if (!empty($tcari)) { $tsql .= " WHERE CONCAT(No_Opname,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y')) LIKE ?"; array_push($asql, '%' . $tcari . '%'); } $obj = new Table($this->app); $obj->set_table("(SELECT * FROM inv_opname".$tsql.") O LEFT JOIN para_cabang C ON (C.CabID=O.CabID)", "O.*,C.Kode_Cab", "", $asql); $obj->add_field("No_Opname", "No. Trans", "c"); $obj->add_field("Tgl_Opname", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); $obj->add_field("Kode_Cab", "Cabang", "c"); $obj->add_field("Total_Opname", "Total", "r", "rupiah2"); $obj->add_field("Catatan", "Catatan", "awr"); $obj->set_field_order("No_Opname", "D"); $obj->set_func_select("OpnameJS.tx_select"); $this->app->json([ $obj->db_table("divBrowTX") ]); } public function brow_produk() { $tcari = Param::Get("Cari_Produk"); $tsql = ''; $asql = []; if (!empty($tcari)) { $tsql .= " AND Barcode_Nama LIKE ?"; array_push($asql, '%' . $tcari . '%'); } array_push($asql, $this->id_cab); $obj = new Table($this->app); $obj->set_table("(SELECT * FROM inv_produk_join WHERE Aktif=1".$tsql." GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", "P.*,IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)) Sisa_Stok", "", $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->add_field("Sisa_Stok", "Stok", "r", "rupiah2"); $obj->set_field_order("Kode_SKU", "A"); $obj->set_func_select("OpnameJS.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 // Satuan : Varian : Harga_Pokok : Satuan : Stok if ($bcode === 0) { $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(FORMAT(P.Harga_Pokok,2) USING UTF8),':',P.Satuan_Kemasan,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?) GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$tcari, $tcari, $this->id_cab]); if ($_row) { $bcode = 1; $arec = $_row->getData(); } } if ($bcode === 1) { $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1]; } else { $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(FORMAT(P.Harga_Pokok,2) USING UTF8),':',P.Satuan_Kemasan,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_cab]); while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'].' ('.(string) $row['Sisa_Stok'].')', 'data'=>$row['Data2'], 'bc'=>0]; } } $this->app->json($ajson); } public function form_master() { $ajson = [ 'error'=>"", 'html'=>"" ]; $atabel = []; if ($this->mode === "add") { $atabel = $this->Data_Opname("", true); } else if ($this->mode === "edit") { $this->inv->Detail_Copy($this->no_opname, true); $atabel = $this->Data_Opname($this->no_opname); } else if ($this->mode === "save") { $no_lama = $this->no_opname; if ($this->is_baru) { $this->no_opname = $this->inv->Nomor_Baru("O", Param::Get("Tgl_Opname"), true); } $this->inv->Detail_Save($this->no_opname, 1, $this->id_cab, Param::Get("Tgl_Opname"), $this->is_baru, $no_lama); $tot_opname = $this->db->fetchField("SELECT SUM(Qty*Harga_Beli) Opname FROM inv_detail WHERE No_Ref=?", [$this->no_opname]) ?? 0; $sql = new SQL($this->app); $sql->set_table("inv_opname"); $sql->add_param_date("Tgl_Opname"); $sql->add_param("CabID"); $sql->add_param("Total_Opname", $tot_opname); $sql->add_param("Catatan"); $sql->add_param_stamp(); $sql->add_param_userid(); $sql->add_where("No_Opname", $this->no_opname); $sql->UpdateDB(); // PROSES POSTING GL $ainfo = $this->db->fetchRow("SELECT * FROM inv_opname WHERE No_Opname=?", [$this->no_opname]); if (count($ainfo) > 0) { $ajurnal = [ 'Kode_Jurnal' => $ainfo['No_Opname'], 'TipeID' => 12, 'CabID' => $ainfo['CabID'], 'Tanggal' => tgl_sql2str($ainfo['Tgl_Opname']), 'Kode_Ref' => $ainfo['No_Opname'], 'Catatan' => "Opname Stok / Penyesuaian : ".$ainfo['No_Opname']." - ".tgl_sql2str($ainfo['Tgl_Opname']) ]; $_dkD = ($ainfo['Total_Opname'] > 0) ? "K" : "D"; $_dkK = ($ainfo['Total_Opname'] < 0) ? "K" : "D"; $adetail = [ [ 'Kode_Rek' => $this->app_gel['HPP'], 'DK' => $_dkD, 'Jumlah' => $ainfo['Total_Opname'] ], [ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => $_dkK, 'Jumlah' => $ainfo['Total_Opname'] ] ]; $this->gel->Jurnal_Post($ajurnal, $adetail); } $atabel = $this->Data_Opname($this->no_opname); $this->mode = "view"; } else if ($this->mode === "cancel") { $this->inv->Detail_Cancel($this->no_opname); $atabel = $this->Data_Opname(); } else { $atabel = $this->Data_Opname($this->no_opname); } $enable = in_array($this->mode, ["add","edit"]) ? true : false; $form = new Form($this->app); $tnota = $form->textbox("_", "No_Opname", $atabel['No_Opname'], !$enable, true, "text", "nomor transaksi"); $ttglnota = $form->datebox("_", "Tgl_Opname", $atabel['Tgl_Opname'], $enable, true); $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]); $tcatat = $form->textbox("_", "Catatan", $atabel['Catatan'], $enable, true, "text", "catatan"); $ajson['html'] = '