first commit

This commit is contained in:
2026-10-29 13:34:31 +07:00
commit 45e4595c57
255 changed files with 35457 additions and 0 deletions
+374
View File
@@ -0,0 +1,374 @@
<?php
/*******************************************************************
PHP Class : /Utils/Inv
Description : Class khusus untuk Inventori
Created By : Siau Pheng ([email protected]).
Created Date : February 10th, 2012.
Last Modified : September 17th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Utils;
use flight\Engine;
use flight\database\SimplePdo;
final class Inv {
private int $id_server;
private int $id_cab;
private string $kd_pos;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app) {
$this->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;
}
}