190 lines
10 KiB
PHP
190 lines
10 KiB
PHP
<?php
|
|
|
|
/*******************************************************************
|
|
|
|
App. Name : INVENTORY AND SALES SYSTEMS
|
|
Module : /apps/php/repo/stok_mutasi.php
|
|
Desc. : PHP - Laporan Mutasi Stok Barang
|
|
Created By : Siau Pheng ([email protected]).
|
|
Created Date : July 16th, 2011.
|
|
Last Modified : October 2nd, 2025.
|
|
|
|
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
|
|
|
|
*******************************************************************/
|
|
|
|
require_once(__DIR__."/../../../../../vendor/autoload.php");
|
|
require_once(__DIR__."/../func.iss.php");
|
|
|
|
use siaupheng\fonia3\DB\MySQL;
|
|
use siaupheng\fonia3\Web\Param;
|
|
use siaupheng\fonia3\Web\Table;
|
|
use siaupheng\fonia3\Web\Form;
|
|
use siaupheng\fonia3\Data\SimpleXLS;
|
|
|
|
$db = $db ?? new MySQL();
|
|
$ajson = [];
|
|
$data = Param::Get("data");
|
|
$id_cab = Param::Get("CabID", 0);
|
|
|
|
if (in_array($data, ["print","export"])) {
|
|
$id_inv = Param::Get("InvID", 0);
|
|
$tgl_from = Param::Get("Tgl_From");
|
|
$tgl_to = Param::Get("Tgl_To");
|
|
|
|
$nama_produk = "";
|
|
if ($id_inv > 0) {
|
|
$db->Query("SELECT Nama_Produk Nama FROM inv_produk WHERE InvID='".$id_inv."' LIMIT 1");
|
|
if ($db->Next()) $nama_produk = $db->Row("Nama");
|
|
}
|
|
|
|
// generate report header
|
|
$tglheader = $tgl_from;
|
|
if ($tgl_from!==$tgl_to) $tglheader .= " S/D ".$tgl_to;
|
|
$tgl_from = tgl_sql2str($tgl_from);
|
|
$tgl_to = tgl_sql2str($tgl_to);
|
|
|
|
// query ukuran normal produk & stok awal
|
|
$kali = 0; $sat_stok = ""; $sat_norm = "";
|
|
$db->Query("SELECT * FROM vi_inv_produk2 WHERE InvID='".$id_inv."' LIMIT 1");
|
|
if ($db->Next()) {
|
|
$kali = $db->Row("Qty", 0);
|
|
$sat_stok = $db->Row("Satuan_Stok");
|
|
$sat_norm = $db->Row("Satuan_Normal");
|
|
}
|
|
$stok = 0;
|
|
$tsql = ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
|
|
$db->Query("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<'".$tgl_from."' AND InvID='".$id_inv."'".$tsql);
|
|
if ($db->Next()) $stok = $db->RowFloat("Stok", 0);
|
|
|
|
// query data laporan
|
|
$db->Query("SELECT DATE_FORMAT(D.Tgl_Ref,'%d-%m-%Y') Tgl_Ref2,D.No_Ref,SUM(IF((D.Stok<0 OR D.NotaID=5 OR D.NotaID=6) AND D.NotaID<>3,-D.Stok,0)) Keluar,SUM(IF((D.Stok>0 OR D.NotaID=3) AND (D.NotaID<>5 AND D.NotaID<>6),D.Stok,0)) Masuk, IF(ISNULL(S.Nama_Sup),IF(D.NotaID=6,Q.Nama,''),CONCAT(S.Nama_Sup,IF(B.Data_Beli=1,'',' <i>(Retur)</i>'))) Nama FROM (SELECT No_Ref,Tgl_Ref,NotaID,SUM(Stok) Stok FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tgl_from."' AND '".$tgl_to."') AND InvID=".$id_inv." AND Stok<>0".$tsql." GROUP BY No_Ref) D LEFT JOIN inv_beli B ON (B.No_Beli=D.No_Ref) LEFT JOIN inv_jual J ON (J.No_Jual=D.No_Ref) LEFT JOIN inv_opname O ON (O.No_Opname=D.No_Ref) LEFT JOIN para_supplier S ON (S.SupID=B.SupID) LEFT JOIN app_operator Q ON (Q.UserID=J.UserID) LEFT JOIN inv_nota N ON (D.NotaID=N.NotaID) GROUP BY D.No_Ref ORDER BY D.Tgl_Ref,N.Urut,D.No_Ref");
|
|
}
|
|
|
|
if ( $data == "print" ) {
|
|
Report_Header("MUTASI STOK BARANG", "Periode : ".$tglheader);
|
|
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
|
|
|
|
$pre->add_field("Tanggal",20,"C");
|
|
$pre->add_field("No. Nota",20,"L");
|
|
$pre->add_field("Nama Supplier / Kasir",150,"L");
|
|
$pre->add_field("Masuk",80,"R","rupiah");
|
|
$pre->add_field("Keluar",50,"R","rupiah");
|
|
$pre->add_field("Stok",50,"R","rupiah");
|
|
|
|
$pre->add_span(array("Nama Barang : ".$nama_produk,6,"L,B"));
|
|
|
|
$tot_m = 0; $tot_k = 0;
|
|
$pre->add_span(array("Stok Awal",3,"R"),array("",1,"R"),array("",1,"R"),array(format_stok($stok,$kali,$sat_norm,$sat_stok),1,"R"));
|
|
while ($db->Next()) {
|
|
//if ($db->RowFloat("Stok", 0) == 0) continue;
|
|
$msk = $db->Row("Masuk");
|
|
$klr = $db->Row("Keluar");
|
|
$stok += $msk - $klr;
|
|
$tot_m += $msk;
|
|
$tot_k += $klr;
|
|
$pre->add_value($db->Row("Tgl_Ref2"), $db->Row("No_Ref"), $db->Row("Nama"), (($msk<>0)?format_stok($msk,$kali,$sat_norm,$sat_stok):""), (($klr<>0)?format_stok($klr,$kali,$sat_norm,$sat_stok):""), format_stok($stok,$kali,$sat_norm,$sat_stok));
|
|
}
|
|
$pre->add_span(array("Stok Akhir",3,"R"),array(format_stok($tot_m,$kali,$sat_norm,$sat_stok),1,"R"),array(format_stok($tot_k,$kali,$sat_norm,$sat_stok),1,"R"),array(format_stok($stok,$kali,$sat_norm,$sat_stok),1,"R"));
|
|
$pre->add_stamp(1, true);
|
|
$pre->show();
|
|
|
|
} else if ( $data == "export" ) {
|
|
$xls = new SimpleXLS([
|
|
'title'=>"Data Mutasi Stok Barang",
|
|
'desc'=>"Export Data Mutasi Stok Barang"
|
|
]);
|
|
|
|
$xls->add_header($_SESSION['__WEB_APP']['REG_NAME']);
|
|
$xls->add_header("DATA MUTASI STOK BARANG");
|
|
$xls->add_header("Periode : ".$tglheader);
|
|
|
|
$xls->add_field("Tanggal",15,"C");
|
|
$xls->add_field("No. Nota",20,"L");
|
|
$xls->add_field("Nama Supplier / Kasir",50,"L");
|
|
$xls->add_field("Masuk",20,"R");
|
|
$xls->add_field("Keluar",20,"R");
|
|
$xls->add_field("Stok",20,"R");
|
|
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
|
|
|
|
$xls->add_span(array("Nama Barang : ".$nama_produk,6,"L,B"));
|
|
|
|
$tot_m = 0; $tot_k = 0;
|
|
$xls->add_span(array("Stok Awal",3,"R"),array("",1,"R"),array("",1,"R"),array(format_stok($stok,$kali,$sat_norm,$sat_stok),1,"R"));
|
|
while ($db->Next()) {
|
|
//if ($db->RowFloat("Stok", 0) == 0) continue;
|
|
$msk = $db->Row("Masuk");
|
|
$klr = $db->Row("Keluar");
|
|
$stok += $msk - $klr;
|
|
$tot_m += $msk;
|
|
$tot_k += $klr;
|
|
$xls->add_value($db->Row("Tgl_Ref2"), $db->Row("No_Ref"), $db->Row("Nama"), (($msk<>0)?format_stok($msk,$kali,$sat_norm,$sat_stok):""), (($klr<>0)?format_stok($klr,$kali,$sat_norm,$sat_stok):""), format_stok($stok,$kali,$sat_norm,$sat_stok));
|
|
}
|
|
$xls->add_span(array("Stok Akhir",3,"R"),array(format_stok($tot_m,$kali,$sat_norm,$sat_stok),1,"R"),array(format_stok($tot_k,$kali,$sat_norm,$sat_stok),1,"R"),array(format_stok($stok,$kali,$sat_norm,$sat_stok),1,"R"));
|
|
$xls->add_stamp(1, true);
|
|
$xls->send("Data Stok Akhir Barang ".str_replace("S/D","-",$tglheader).".xlsx");
|
|
unset($xls);
|
|
|
|
} else if ($data == "auto-produk") {
|
|
$tcari = Param::Get("Auto_Query");
|
|
$ajson['autodata'] = [];
|
|
$bcode = 0; $arec = [];
|
|
// Cari by SKU
|
|
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
|
|
if ($db->Next()) {
|
|
$bcode = 1;
|
|
$arec = $db->AllRow();
|
|
}
|
|
// Cari by Barcode
|
|
if ($bcode == 0) {
|
|
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
|
|
if ($db->Next()) {
|
|
$bcode = 1;
|
|
$arec = $db->AllRow();
|
|
}
|
|
}
|
|
if ($bcode == 1) {
|
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
|
|
} else {
|
|
$db->Query("SELECT P.*,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/K.Qty,2)) Sisa_Stok,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND InvID IN (SELECT InvID FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) ORDER BY InvID) K LEFT JOIN (SELECT * FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) P ON (K.InvID=P.InvID) LEFT JOIN vi_inv_stok X ON (X.CabID='".$id_cab."' AND K.InvID=X.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) ORDER BY P.Nama_Produk,K.Qty DESC LIMIT 50");
|
|
while ($db->Next()) {
|
|
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Produk"), 'html'=>'<span class="text-primary">'.$db->Row("Kode_SKU").'</span> '.$db->Row("Nama_Produk")." ".$db->Row("Nama_Satuan").' - Rp. '.rupiah($db->Row("Harga_Jual")).' <span class="text-danger">('.$db->Row("Sisa_Stok").')</span>', 'data'=>$db->Row("Data2"), 'bc'=>0];
|
|
}
|
|
}
|
|
|
|
} else if ( $data == "brow-produk" ) {
|
|
$tcari = trim(Param::Get("Cari_Produk"));
|
|
$tsql = ($tcari=="") ? "" : " AND P.Barcode_Nama LIKE '%".$tcari."%'";
|
|
$obj = new Table($db);
|
|
$obj->set_table("vi_inv_produk P", "P.*", "P.Harga_Jual>0 AND P.Aktif=1".$tsql);
|
|
$obj->add_field("InvID", "ID", "hid");
|
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
|
$obj->add_field("Kode_Barcode", "Kode Barcode", "c");
|
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
|
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
|
|
$obj->add_field("Nama_Produk", "Produk", "hid");
|
|
$obj->add_field("Nama_Satuan", "Satuan", "hid");
|
|
$obj->set_field_order("Kode_SKU", "A");
|
|
$obj->add_row_btn("save", "Pilih", "RepoStokMutasiJS.produk_select");
|
|
$obj->set_func_navi("RepoStokMutasiJS.data_query('brow-produk')");
|
|
$ajson[] = $obj->db_table("divBrowProduk");
|
|
|
|
} else if ( $data == "default") {
|
|
$form = new Form($db);
|
|
$tbrg = $form->textauto("_", "Nama_Produk", null, true, true, "Nama Barang");
|
|
$tcab = $form->option_db("_", "CabID", $id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
|
$ttgl1 = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
|
$ttgl2 = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
|
|
|
echo '
|
|
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Nama_Produk">Nama Barang</label><div class="col"><div class="input-group">'.$tbrg.'<button class="btn btn-info shadow-none" type="button" id="butBrow"><i class="bi-search"></i></button></div></div></div>
|
|
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="CabID">Nama Cabang</label><div class="col">'.$tcab.'</div></div>
|
|
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Tgl_From">Mulai Tanggal</label><div class="col-sm-8 col-lg-5">'.$ttgl1.'</div></div>
|
|
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Tgl_To">Sampai Tanggal</label><div class="col-sm-8 col-lg-5">'.$ttgl2.'</div></div>
|
|
<input type="hidden" id="InvID" value="0" />';
|
|
|
|
}
|
|
|
|
send_json($ajson);
|
|
?>
|