app = $app; $this->db = $app->db(); $this->id_server = (int) $app->session()->get('WEB_APP')['SERVER_ID']; $this->id_cab = (int) $app->session()->get('APP_INV')['CABANGID']; $this->kd_pos = $app->session()->get('APP_INV')['KD_POS']; } public function Nomor_POS(string $kd_pos = "", string $tgl = "", bool $save = false): string { if (empty($kd_pos)) $kd_pos = $this->kd_pos; if (empty($tgl)) { $tno = $kd_pos . date("y") . abjad(date("n")); } else { $tmp = explode("-", $tgl); $tno = $kd_pos . substr($tmp[2],2,2) . abjad((int) $tmp[1]); } $tno .= (string) $this->id_server; $ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Jual,5)) Nomor FROM inv_jual WHERE No_Jual LIKE ?", [$tno.'%']) ?? 0; $tno .= isi_nol(++$ino, 5); if ($save === true) $this->db->runQuery("INSERT INTO inv_jual SET No_Jual=?", [$tno]); return $tno; } public function Nomor_Baru(string $tipe = "B", string $tgl = "", bool $save = false): string { $atipe = ['O'=>["No_Opname","inv_opname"],'M'=>["No_Mutasi","inv_mutasi"],'B'=>["No_Beli","inv_beli"],'R'=>["No_Beli","inv_beli"],'Z'=>["No_Jual","inv_jual"]]; if (empty($tgl)) { $tno = $tipe . date("y") . abjad(date("n")); } else { $tmp = explode("-", $tgl); $tno = $tipe . substr($tmp[2],2,2) . abjad((int) $tmp[1]); } $tno .= (string) $this->id_server; $ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(".$atipe[$tipe][0].",4)) Nomor FROM ".$atipe[$tipe][1]." WHERE ".$atipe[$tipe][0]." LIKE ?", [$tno.'%']) ?? 0; $tno .= isi_nol(++$ino, 4); if ($save === true) $this->db->runQuery("INSERT INTO ".$atipe[$tipe][1]." SET ".$atipe[$tipe][0]."=?", [$tno]); return $tno; } public function Detail_Copy(string $no_ref = "", bool $unix = false, bool $mutasi = false): void { if (empty($no_ref)) return; $this->Detail_Cancel($no_ref); $tsql = ($mutasi === false) ? "" : " AND Qty>0"; $this->db->runQuery("INSERT INTO tmp_inv_detail (No_Ref,ID,NotaID,CabID,GudangID,Tgl_Ref,InvID,SatuanID,VarianID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Point,Promo,Unix,UserID) SELECT No_Ref,ID,NotaID,CabID,GudangID,Tgl_Ref,InvID,SatuanID,VarianID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Point,Promo,'".(($unix)?$this->app->user()->unix():0)."',UserID FROM inv_detail WHERE No_Ref='".$no_ref."'".$tsql); } public function Detail_Save(string $no_ref = "", int $nota = 0, int $cab = 0, string $tgl = "", bool $baru = false, string $no_lama = "", int $ppn = 0, bool $mutasi = false, int $cab2 = 0): void { if (empty($no_ref)) return; $this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$no_ref]); if ($baru) { $this->Detail_Cancel($no_ref); $this->db->runQuery("UPDATE tmp_inv_detail SET No_Ref=? WHERE No_Ref=? AND Unix=?", [$no_ref, $no_lama, $this->app->user()->unix()]); } //todo: hapus setelah tidak pakai gudang ! $agudang = [2=>1, 3=>4, 4=>2]; $gudang = $agudang[$cab] ?? 0; $gudang2 = $agudang[$cab2] ?? 0; // --> hapus sampai sini $this->db->runQuery("UPDATE tmp_inv_detail D,inv_produk_kemasan K SET D.Stok=(D.Qty*IFNULL(K.Qty,1)) WHERE D.InvID=K.InvID AND D.SatuanID=K.SatuanID AND D.No_Ref=?", [$no_ref]); if ($ppn === 0) { $this->db->runQuery("UPDATE tmp_inv_detail D,inv_produk P SET D.PPN=P.PPN WHERE D.InvID=P.InvID AND D.No_Ref=?", [$no_ref]); } else { $this->db->runQuery("UPDATE tmp_inv_detail SET PPN=? WHERE No_Ref=?", [$ppn, $no_ref]); } $qtgl = (empty($tgl)) ? "0000-00-00" : tgl_sql2str($tgl); $tsql = ($mutasi === true) ? " AND Qty>0" : ""; $this->db->runQuery("INSERT INTO inv_detail (No_Ref,NotaID,CabID,GudangID,Tgl_Ref,InvID,SatuanID,VarianID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Point,Promo,PPN,UserID) SELECT No_Ref,?,?,?,?,InvID,SatuanID,VarianID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Point,Promo,PPN,UserID FROM tmp_inv_detail WHERE No_Ref=?".$tsql, [$nota, $cab, $gudang, $qtgl, $no_ref]); if ($mutasi === true) $this->db->runQuery("INSERT INTO inv_detail (No_Ref,NotaID,CabID,GudangID,Tgl_Ref,InvID,SatuanID,VarianID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Point,Promo,PPN,UserID) SELECT No_Ref,?,?,?,?,InvID,SatuanID,VarianID,-Qty,-Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Point,Promo,PPN,UserID FROM tmp_inv_detail WHERE No_Ref=?".$tsql, [$nota, $cab2, $gudang2, $qtgl, $no_ref]); $this->Detail_Cancel($no_ref); } public function Detail_Cancel(string $no_ref = ""): void { if (empty($no_ref)) return; $this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=?", [$no_ref]); } public function Produk_Update(string $no_ref = "", int $sup = 0): void { if (empty($no_ref) && $sup === 0) return; $aitem = $this->db->fetchAll("SELECT *,CEIL((Harga_Beli-(Total_Diskon/Qty))/(Stok/Qty)) HPP FROM inv_detail WHERE No_Ref=?", [$no_ref]); foreach ($aitem as $item) { if ((float) $item['Harga_Beli'] > 0) $this->db->runQuery("UPDATE inv_produk SET Harga_Beli=?,Harga_Pokok=Harga_Beli+Harga_Tambah WHERE InvID=?", [$item['HPP'], $item['InvID']]); $this->db->runQuery("INSERT IGNORE INTO inv_produk_sup SET InvID=?,SupID=?", [$item['InvID'], $sup]); } } public function Produk_Join(int $id_inv = 0): void { $tsql = ''; $asql = []; if (empty($id_inv)) { $this->db->runQuery("TRUNCATE inv_produk_join"); } else { $this->db->delete("inv_produk_join", "InvID=?", [$id_inv]); $tsql = " WHERE P.InvID=?"; array_push($asql, $id_inv); } $this->db->runQuery("INSERT INTO inv_produk_join SELECT NULL,P.Grup_InvID,P.InvID,K.SatuanID,IFNULL(V.VarianID,0),H.Grup_MemberID,P.StokID,K.Qty,P.Nama_Produk,CONCAT(P.Nama_Produk,IF(VP.Nama_Varian IS NULL,'',CONCAT(' ',UCASE(VP.Nama_Varian)))),CONCAT(P.Nama_Produk,IF(VP.Nama_Varian IS NULL,'',CONCAT(' ',UCASE(VP.Nama_Varian))),' ',UCASE(SK.Nama_Satuan)),CONCAT(IFNULL(V.Kode_SKU,''),' ',IFNULL(V.Kode_Barcode,''),' ',P.Nama_Produk,' ',UCASE(IFNULL(VP.Nama_Varian,''))),IFNULL(V.Kode_SKU,''),IFNULL(V.Kode_Barcode,''),SP.Nama_Satuan,SK.Nama_Satuan,ROUND(P.Harga_Pokok*K.Qty,2),IFNULL(H.Harga_Jual,0),P.PPN,P.Aktif FROM inv_produk P INNER JOIN inv_produk_kemasan K ON (P.InvID=K.InvID) INNER JOIN inv_produk_varian V ON (K.InvID=V.InvID AND K.SatuanID=V.SatuanID) LEFT JOIN inv_produk_harga H ON (K.InvID=H.InvID AND K.SatuanID=H.SatuanID) LEFT JOIN para_satuan SP ON (P.StokID=SP.SatuanID) LEFT JOIN para_satuan SK ON (K.SatuanID=SK.SatuanID) LEFT JOIN para_varian VP ON (V.VarianID=VP.VarianID)".$tsql, $asql); } /************************* TRANSAKSI PENDING *************************/ public function Pending_Edit(string $nomor = ""): void { $this->db->runQuery("UPDATE tmp_inv_detail SET Unix=? WHERE No_Ref=?", [$this->app->user()->unix(), $nomor]); } public function Pending_Save(string $no_lama = "", string $no_baru = ""): void { $this->db->runQuery("UPDATE tmp_inv_detail SET No_Ref=? WHERE No_Ref=? AND Unix=?", [$no_baru, $no_lama, $this->app->user()->unix()]); } public function Pending_Delete(string $nomor = ""): void { $this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=?", [$nomor]); } /************************* POINT MEMBER *************************/ public function Point_Baru(string $tipe = "T", string $tgl = ""): string { if (empty($tgl)) { $tno = $tipe . date("y") . abjad(date("n")); } else { $tmp = explode("-", $tgl); $tno = $tipe . substr($tmp[2],2,2) . abjad((int) $tmp[1]); } $tno .= (string) $this->id_server; $ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_TX,4)) Nomor FROM inv_point_tx WHERE No_TX LIKE ?", [$tno.'%']) ?? 0; $tno .= isi_nol(++$ino, 4); return $tno; } public function Point_Hitung(string $no_nota="", string $tgl_nota="", int $grup_member=0, int $id_kartu=0, int $id_tipe=1): int { if (empty($no_nota)) return 0; $tgl_nota = empty($tgl_nota) ? tgl_ymd() : tgl_sql2str($tgl_nota); // cek tidak perkenankan hitung point utk grup tertentu //if (in_array($grup_member, array(6))) return 0; $apoint = []; if ($id_kartu > 0) { $apoint = $this->db->fetchAll("SELECT * FROM inv_point WHERE Aktif=1 AND CabID IN (?) AND Grup_MemberID IN (?) AND Tgl_Mulai<=? AND KartuID=? AND Point_TipeID=? ORDER BY Nilai_Jual DESC", [[0,$this->id_cab], [0,$grup_member], $tgl_nota, $id_kartu, $id_tipe]); } if (count($apoint) === 0) { $apoint = $this->db->fetchAll("SELECT * FROM inv_point WHERE Aktif=1 AND CabID IN (?) AND Grup_MemberID IN (?) AND Tgl_Mulai<=? AND KartuID=? AND Point_TipeID=? ORDER BY Nilai_Jual DESC", [[0,$this->id_cab], [0,$grup_member], $tgl_nota, 0, $id_tipe]); } if (count($apoint) === 0) return 0; $tot_point = 0; foreach ($apoint as $point) { $isproc = false; $tsql = ""; if (!empty($point['Grup_Barang'])) { $tsql = "SELECT SUM((-D.Qty*D.Harga_Jual)+D.Total_Diskon) Total FROM (SELECT * FROM inv_detail WHERE No_Ref='".$no_nota."' ORDER BY InvID) D LEFT JOIN (SELECT InvID,Grup_InvID FROM inv_produk WHERE Grup_InvID IN (".$point['Grup_Barang'].")) P ON (P.InvID=D.InvID) WHERE P.Grup_InvID IN (".$point['Grup_Barang'].")"; $isproc = true; } else if (!empty($point['Kode_Barang'])) { $tsql = "SELECT SUM((-D.Qty*D.Harga_Jual)+D.Total_Diskon) Total FROM (SELECT * FROM inv_detail WHERE No_Ref='".$no_nota."' AND InvID IN (".$point['Kode_Barang'].")) D"; $isproc = true; } if ($isproc == false) continue; $tot_jual = (float) $this->db->fetchField($tsql) ?? 0; $pone = 0; if ($tot_jual !== 0) { $tot_jual = abs($tot_jual); $pone = ($tot_jual > 0) ? 1 : -1; } if ($tot_jual < (float) $point['Nilai_Jual'] || $tot_jual === 0) continue; $tot_point += (floor($tot_jual / (float) $point['Nilai_Jual']) * $pone); } return $tot_point; } /************************* PROMO *************************/ function Promo_Hapus(string $no_nota="", string $tgl_nota="", int $grup_member=0): void { if (empty($no_nota)) return; $tgl_nota = (empty($tgl_nota)) ? tgl_ymd() : tgl_sql2str($tgl_nota); $arow = $this->db->fetchAll("SELECT * FROM inv_detail WHERE No_Ref=? AND Promo IN (1,2,3)", [$no_nota]); foreach ($arow as $row) { $this->db->runQuery("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses-".abs($row['Qty'] ?? 0)." WHERE Promo_InvID=? AND Promo_SatuanID=? AND CabID IN (?) AND Grup_MemberID=? AND Tipe_Promo=? AND Tgl_Mulai<=? AND Tgl_Akhir>=?", [$row['InvID'], $row['SatuanID'], [0,$this->id_cab], $grup_member, $row['Promo'], $tgl_nota, $tgl_nota]); } } public function Promo_Barang(string $no_nota="", string $tgl_nota="", int $grup_member=0): void { if (empty($no_nota)) return; $tgl_nota = (empty($tgl_nota)) ? tgl_ymd() : tgl_sql2str($tgl_nota); $apromo = $this->db->fetchAll("SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND Promo IN (1,2)", [$no_nota, $this->app->user()->unix()]); foreach ($apromo as $promo) { $this->db->runQuery("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses-'".abs($promo['Qty'])."' WHERE Promo_InvID=? AND Promo_SatuanID=? AND CabID IN (?) AND Grup_MemberID=? AND Tipe_Promo=? AND Tgl_Mulai<=? AND Tgl_Akhir>=?", [$promo['InvID'], $promo['SatuanID'], [0,$this->id_cab], $grup_member, $promo['Promo'], $tgl_nota, $tgl_nota]); if ($promo['Promo'] === 1) $this->db->runQuery("UPDATE tmp_inv_detail SET Disk_Rupiah=0,Total_Diskon=0,Promo=0 WHERE No_Ref=? AND Unix=? AND ID=?", [$no_nota, $this->app->user()->unix(), $promo['ID']]); if ($promo['Promo'] === 2) $this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND ID=?", [$no_nota, $this->app->user()->unix(), $promo['ID']]); } $apromo = $this->db->fetchAll("SELECT *,(Jumlah_Promo-Jumlah_Proses) Jumlah_Sisa FROM inv_promo WHERE Aktif=1 AND CabID IN (?) AND Grup_MemberID=? AND Tipe_Promo IN (1,2) AND (Jumlah_Promo-Jumlah_Proses)>0 AND Tgl_Mulai<=? AND Tgl_Akhir>=? AND CONCAT(InvID,':',SatuanID) IN (SELECT CONCAT(InvID,':',SatuanID) FROM tmp_inv_detail WHERE No_Ref=? AND Unix=?)", [[0,$this->id_cab], $grup_member, $tgl_nota, $tgl_nota, $no_nota, $this->app->user()->unix()]); if (count($apromo) === 0) return; foreach ($apromo as $promo) { if ($promo['Tipe_Promo'] === 1) {//1 potongan diskon $adetail = $this->db->fetchRow("SELECT COUNT(*) Item,SUM(-Qty) Qty,ID FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND InvID=? AND SatuanID=? ORDER BY ID", [$no_nota, $this->app->user()->unix(), $promo['InvID'], $promo['SatuanID']]) ?? ['Item'=>0, 'Qty'=>0, 'ID'=>0]; $aitem = $this->db->fetchRow("SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND InvID=? AND SatuanID=? AND ID=?", [$no_nota, $this->app->user()->unix(), $promo['InvID'], $promo['SatuanID'], $adetail['ID']]); $bpromo = false; if ($promo['Pilih_Qty'] === 1 && $promo['Qty_Min'] <= $adetail['Qty']) {//minimum & masuk limit $bpromo = true; $qty_promo = ($adetail['Qty'] <= $promo['Jumlah_Sisa']) ? $adetail['Qty'] : $promo['Jumlah_Sisa']; } else if ($promo['Pilih_Qty'] === 2 && $promo['Qty_Kali'] <= $adetail['Qty']) {//kelipatan $bpromo = true; $qty_promo = floor($adetail['Qty'] / $promo['Qty_Kali']) * $promo['Qty_Kali']; $qty_promo = ($qty_promo <= $promo['Jumlah_Sisa']) ? $qty_promo : $promo['Jumlah_Sisa']; } if ($bpromo == true) { if ($adetail['Item']>1) {//hapus duplikasi $this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND InvID=? AND SatuanID=? AND ID<>?", [$no_nota, $this->app->user()->unix(), $promo['InvID'], $promo['SatuanID'], $adetail['ID']]); } $istok = $aitem['Stok'] / $aitem['Qty']; if ($qty_promo === $adetail['Qty']) { $aitem['Qty'] = $qty_promo * -1; $aitem['Stok'] = $qty_promo * $istok * -1; $aitem['Disk_Rupiah'] = $promo['Promo_Disc']; $aitem['Total_Diskon'] = $qty_promo * $promo['Promo_Disc']; $aitem['Promo'] = 1; $this->db->update("tmp_inv_detail", $aitem, "No_Ref=? AND Unix=? AND ID=?", [$aitem['No_Ref'], $aitem['Unix'], $aitem['ID']]); } else { $adisc = $aitem; $aitem['Qty'] = ($adetail['Qty']-$qty_promo) * -1; $aitem['Stok'] = ($adetail['Qty']-$qty_promo) * $istok * -1; $this->db->update("tmp_inv_detail", $aitem, "No_Ref=? AND Unix=? AND ID=?", [$aitem['No_Ref'], $aitem['Unix'], $aitem['ID']]); $adisc['Qty'] = $qty_promo * -1; $adisc['Stok'] = $qty_promo * $istok * -1; $adisc['Disk_Rupiah'] = $promo['Promo_Disc']; $adisc['Total_Diskon'] = $qty_promo * $promo['Promo_Disc']; $adisc['Promo'] = 1; unset($adisc['ID']); $this->db->insert("tmp_inv_detail", $adisc); } $this->db->runQuery("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses+".($qty_promo ?? 0)." WHERE PromoID=?", [$promo['PromoID']]); } } else {//2 promo barang $adetail = $this->db->fetchRow("SELECT COUNT(*) Item,SUM(-Qty) Qty,ID FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND InvID=? AND SatuanID=? ORDER BY ID", [$no_nota, $this->app->user()->unix(), $promo['InvID'], $promo['SatuanID']]) ?? ['Item'=>0, 'Qty'=>0, 'ID'=>0]; $adisc = $this->db->fetchRow("SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND InvID=? AND SatuanID=? AND ID=?", [$no_nota, $this->app->user()->unix(), $promo['InvID'], $promo['SatuanID'], $adetail['ID']]); $bpromo = false; if ($promo['Pilih_Qty'] === 1 && $promo['Qty_Min'] <= $adetail['Qty']) {//minimum & masuk limit $bpromo = true; $qty_promo = ($promo['Promo_Qty'] <= $promo['Jumlah_Sisa']) ? $promo['Promo_Qty'] : $promo['Jumlah_Sisa']; } else if ($promo['Pilih_Qty'] === 2 && $promo['Qty_Kali'] <= $adetail['Qty']) {//kelipatan $bpromo = true; $qty_promo = floor($adetail['Qty'] / $promo['Qty_Kali']) * $promo['Promo_Qty']; $qty_promo = ($qty_promo <= $promo['Jumlah_Sisa']) ? $qty_promo : $promo['Jumlah_Sisa']; } if ($bpromo === true && $qty_promo > 0) { $_row = $this->db->fetchRow("SELECT H.Harga_Jual,P.* FROM inv_produk_harga H LEFT JOIN (SELECT P.InvID,P.SatuanID,P.Qty,P.Harga_Pokok FROM vi_inv_produk P WHERE P.InvID=? AND P.SatuanID=?) P ON (P.InvID=H.InvID AND P.SatuanID=H.SatuanID) WHERE H.InvID=? AND H.SatuanID=? AND H.Grup_MemberID=?", [$promo['Promo_InvID'], $promo['Promo_SatuanID'], $promo['Promo_InvID'], $promo['Promo_SatuanID'], $grup_member]); $adisc['InvID'] = $promo['Promo_InvID']; $adisc['SatuanID'] = $promo['Promo_SatuanID']; $adisc['VarianID'] = 0; $adisc['Qty'] = $qty_promo * -1; $adisc['Stok'] = $qty_promo * ($_row['Qty'] ?? 1) * -1; $adisc['Harga_Beli'] = ($_row['Harga_Pokok'] ?? 0); $adisc['Harga_Jual'] = ($_row['Harga_Jual'] ?? 0); $adisc['Disk_Rupiah'] = $adisc['Harga_Jual']; $adisc['Total_Diskon'] = $qty_promo * $adisc['Harga_Jual']; $adisc['Promo'] = 2; unset($adisc['ID']); $this->db->insert("tmp_inv_detail", $adisc); $this->db->runQuery("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses+".($qty_promo ?? 0)." WHERE PromoID=?", [$promo['PromoID']]); } } } } public function Promo_Total(string $no_nota="", string $tgl_nota="", int $grup_member=0): float { if (empty($no_nota)) return 0; $tgl_nota = (empty($tgl_nota)) ? tgl_ymd() : tgl_sql2str($tgl_nota); $apromo = $this->db->fetchAll("SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND Promo IN (3,4)", [$no_nota, $this->app->user()->unix()]); foreach ($apromo as $promo) { $this->db->runQuery("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses-'".abs($promo['Qty'] ?? 0)."' WHERE Promo_InvID=? AND Promo_SatuanID=? AND CabID IN (?) AND Grup_MemberID=? AND Tipe_Promo=? AND Tgl_Mulai<=? AND Tgl_Akhir>=?", [$promo['InvID'], $promo['SatuanID'], [0,$this->id_cab], $grup_member, $promo['Promo'], $tgl_nota, $tgl_nota]); if ($promo['Promo'] === 3) $this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND ID=?", [$no_nota, $this->app->user()->unix(), $promo['ID']]); } $apromo = $this->db->fetchAll("SELECT *,(Jumlah_Promo-Jumlah_Proses) Jumlah_Sisa FROM inv_promo WHERE Aktif=1 AND CabID IN (?) AND Grup_MemberID=? AND Tipe_Promo IN (3,4) AND Tgl_Mulai<=? AND Tgl_Akhir>=? ORDER BY Jual_Min DESC", [[0,$this->id_cab], $grup_member, $tgl_nota, $tgl_nota]); if (count($apromo) === 0) return 0; $tot_potong = 0; foreach ($apromo as $promo) { $tot_jual = (float) $this->db->fetchField("SELECT SUM((-D.Qty*D.Harga_Jual)+D.Total_Diskon) Total FROM tmp_inv_detail D LEFT JOIN (SELECT P.InvID,P.Grup_InvID FROM inv_produk P WHERE P.Grup_InvID IN (?)) P ON (P.InvID=D.InvID) WHERE D.No_Ref=? AND D.Unix=? AND P.Grup_InvID IN (?)", [$promo['Jual_Grup'], $no_nota, $this->app->user()->unix(), $promo['Jual_Grup']]) ?? 0; if ($tot_jual < $promo['Jual_Min']) continue; if ($promo['Tipe_Promo'] === 4) {//4 potongan diskon $tot_potong += $promo['Promo_Jual']; } else {//3 promo barang $qty_promo = ($promo['Promo_Qty'] <= $promo['Jumlah_Sisa']) ? $promo['Promo_Qty'] : $promo['Jumlah_Sisa']; if ($qty_promo === 0) continue; $adisc = $this->db->fetchRow("SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND Unix=?", [$no_nota, $this->app->user()->unix()]); $_row = $this->db->fetchRow("SELECT H.Harga_Jual,P.* FROM inv_produk_harga H LEFT JOIN (SELECT P.InvID,P.SatuanID,P.Qty,P.Harga_Pokok FROM vi_inv_produk P WHERE P.InvID=? AND P.SatuanID=?) P ON (P.InvID=H.InvID AND P.SatuanID=H.SatuanID) WHERE H.InvID=? AND H.SatuanID=? AND H.Grup_MemberID=?", [$promo['Promo_InvID'], $promo['Promo_SatuanID'], $promo['Promo_InvID'], $promo['Promo_SatuanID'], $grup_member]); $adisc['InvID'] = $promo['Promo_InvID']; $adisc['SatuanID'] = $promo['Promo_SatuanID']; $adisc['VarianID'] = 0; $adisc['Qty'] = $qty_promo * -1; $adisc['Stok'] = $qty_promo * ($_row['Qty'] ?? 0) * -1; $adisc['Harga_Beli'] = ($_row['Harga_Pokok'] ?? 0); $adisc['Harga_Jual'] = ($_row['Harga_Jual'] ?? 0); $adisc['Disk_Rupiah'] = $adisc['Harga_Jual']; $adisc['Total_Diskon'] = $qty_promo * $adisc['Harga_Jual']; $adisc['Promo'] = 3; unset($adisc['ID']); $this->db->insert("tmp_inv_detail", $adisc); $this->db->runQuery("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses+".($qty_promo ?? 0)." WHERE PromoID=?", [$promo['PromoID']]); } break;//todo: pastikan jika beda group barang di pisahkan!! } return $tot_potong; } public function Promo_Hitung(string $no_nota="", string $tgl_nota="", int $grup_member=0): float { if (empty($no_nota)) return 0; $tgl_nota = (empty($tgl_nota)) ? tgl_ymd() : tgl_sql2str($tgl_nota); $tot_promo = 0; $apromo = $this->db->fetchAll("SELECT *,(Jumlah_Promo-Jumlah_Proses) Jumlah_Sisa FROM inv_promo WHERE Aktif=1 AND CabID IN (?) AND Grup_MemberID=? AND Tipe_Promo=1 AND (Jumlah_Promo-Jumlah_Proses)>0 AND Tgl_Mulai<=? AND Tgl_Akhir>=? AND CONCAT(InvID,':',SatuanID) IN (SELECT CONCAT(InvID,':',SatuanID) FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND Promo NOT IN (2,3))", [[0,$this->id_cab], $grup_member, $tgl_nota, $tgl_nota, $no_nota, $this->app->user()->unix()]); if (count($apromo) > 0) { foreach ($apromo as $promo) { $adetail = $this->db->fetchRow("SELECT COUNT(*) Item,SUM(-Qty) Qty,ID FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND InvID=? AND SatuanID=? ORDER BY ID", [$no_nota, $this->app->user()->unix(), $promo['InvID'], $promo['SatuanID']]) ?? ['Item'=>0, 'Qty'=>0, 'ID'=>0]; $bpromo = false; if ($promo['Pilih_Qty'] === 1 && $promo['Qty_Min'] <= $adetail['Qty']) {//minimum & masuk limit $bpromo = true; $qty_promo = ($adetail['Qty'] <= $promo['Jumlah_Sisa']) ? $adetail['Qty'] : $promo['Jumlah_Sisa']; } else if ($promo['Pilih_Qty'] === 2 && $promo['Qty_Kali'] <= $adetail['Qty']) {//kelipatan $bpromo = true; $qty_promo = floor($adetail['Qty'] / $promo['Qty_Kali']) * $promo['Qty_Kali']; $qty_promo = ($qty_promo <= $promo['Jumlah_Sisa']) ? $qty_promo : $promo['Jumlah_Sisa']; } $tot_promo += ($bpromo === true) ? ($qty_promo * $promo['Promo_Disc']) : 0; } } $apromo = $this->db->fetchAll("SELECT *,(Jumlah_Promo-Jumlah_Proses) Jumlah_Sisa FROM inv_promo WHERE Aktif=1 AND CabID IN (?) AND Grup_MemberID=? AND Tipe_Promo=4 AND Tgl_Mulai<=? AND Tgl_Akhir>=? ORDER BY Jual_Min DESC", [[0,$this->id_cab], $grup_member, $tgl_nota, $tgl_nota]); if (count($apromo) > 0) { foreach ($apromo as $promo) { $tot_jual = (float) $this->db->fetchField("SELECT SUM((-D.Qty*D.Harga_Jual)+D.Total_Diskon) Total FROM tmp_inv_detail D LEFT JOIN (SELECT P.InvID,P.Grup_InvID FROM inv_produk P WHERE P.Grup_InvID IN (?)) P ON (P.InvID=D.InvID) WHERE D.No_Ref=? AND D.Unix=? AND P.Grup_InvID IN (?)", [$promo['Jual_Grup'], $no_nota, $this->app->user()->unix(), $promo['Jual_Grup']]) ?? 0; if ($tot_jual < $promo['Jual_Min']) continue; $tot_promo += $promo['Promo_Jual']; break; } } return $tot_promo; } }