Files
ias/apps/php/ias/jual_retur.php
T
2026-01-22 15:30:17 +07:00

360 lines
18 KiB
PHP

<?php
/*******************************************************************
App. Name : Inventory Advanced Systems
Module : /apps/php/ias/jual_retur.php
Desc. : PHP - Transaksi Retur Penjualan
Created By : Siau Pheng ([email protected]).
Created Date : March 28th, 2011.
Last Modified : October 29th, 2023.
(c) 2011 - 2023, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func/ias.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
$db = (is_resource($db)) ? $db : new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode", "view");
$mode_detail = Param::Get("mode_detail");
$nomor = Param::Get("No_Jual", "");
if ( $data == "master" ) {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['No_Jual'=>$nomor];
if ($mode == "add") {
$atabel['No_Jual'] = "RJ-BARU-".$_SESSION['__WEB_APP']['SERVER_ID'].user_id(3);
$atabel['Tgl_Jual'] = tgl_ymd();
$atabel['GudangID'] = 1;
$atabel['OutletID'] = 0;
$nomor = "";
} else if ($mode == "edit") {
Detail_Copy($nomor);
} else if ($mode == "save") {
$no_lama = $nomor;
$b_baru = (strpos($no_lama,"BARU")===false) ? false : true;
if ($b_baru) $nomor = Nomor_Baru("R", Param::Get("Tgl_Jual"), true);
Detail_Save($nomor, Param::Get("Tgl_Jual"), Param::Get("GudangID"), $b_baru, $no_lama);
$anota = ['Retur_Jual'=>0];
$db->Query("SELECT SUM(-Qty*Harga_Jual) Retur_Jual FROM inv_detail WHERE No_Ref='".$nomor."'");
if ($db->Next()) $anota = $db->AllRow();
$sql = new SQL($db);
$sql->set_table("inv_jual");
//$sql->add_param("No_Jual", $nomor);
$sql->add_param_date("Tgl_Jual");
$sql->add_param("GudangID");
$sql->add_param("OutletID");
$sql->add_param("Total_Jual", $anota['Retur_Jual']);
$sql->add_param("Data_Jual", 0);
$sql->add_param("Catatan");
$sql->add_param_userid();
$sql->add_where("No_Jual", $nomor);
if ($b_baru) $sql->add_param_date("Tgl_Nota", Param::Get("Tgl_Jual"));
$sql->UpdateDB();
$mode = "view";//todo: print jika langsung cetak
} else if ($mode == "cancel") {
Detail_Cancel($nomor);
$mode = "view";
$nomor = ""; $atabel['No_Jual'] = "";
}
if ($nomor <> "" && $mode <> "cancel") {
$db->Query("SELECT * FROM inv_jual WHERE Data_Jual=0 AND No_Jual='".$nomor."'");
if (!$db->Next()) {
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
} else $atabel = array_merge($atabel, $db->AllRow());
if ($atabel['OutletID']>0) {
$db->Query("SELECT Nama_Alamat Nama_Outlet,Alamat_Kota Alamat_Outlet FROM vi_para_outlet WHERE OutletID='".$atabel['OutletID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
}
}
$enable = in_array($mode, ["add","edit"]) ? true : false;
$form = new Form($db);
$tnota = $form->textbox("_", "No_Jual", $atabel['No_Jual'], !$enable, true, "text", "nomor transaksi");
$ttglnota = $form->datebox("_", "Tgl_Jual", $atabel['Tgl_Jual'], $enable, true);
$tgud = $form->option_db("_", "GudangID", $atabel['GudangID'], $enable, true, "vi_para_gudang", ["GudangID","Nama_Gudang2"], "Aktif=1 ORDER BY Nama_Gudang", [0,"&nbsp;"]);
$toutl = $form->textauto("_", "Nama_Outlet", ['value'=>$atabel['OutletID'],'text'=>$atabel['Nama_Outlet']], $enable, true, "ketik nama outlet");
$toutlal = $form->textbox("_", "Alamat_Outlet", $atabel['Alamat_Outlet'], false, false, "text");
$tcatat = $form->textarea("_", "Catatan", $atabel['Catatan'], $enable, true, 1);
$ajson['html'] = '
<div class="row">
<div class="col-sm-12 col-lg-6">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Jual">Nomor Transaksi</label>
<div class="col"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button" onclick="JualReturJS.tx_brow();"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tgl_Jual">Tanggal Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$ttglnota.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="GudangID">Lokasi Gudang</label>
<div class="col">'.$tgud.'</div>
</div>
</div>
<div class="col-sm-12 col-lg-6">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Nama_Outlet">Nama Outlet</label>
<div class="col"><div class="input-group">'.$toutl.'<button class="btn '.($enable?'btn-info':'btn-secondary').'" type="button"'.($enable?'':' disabled').' onclick="JualReturJS.outlet_brow();"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label">Alamat Outlet</label>
<div class="col">'.$toutlal.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Catatan">Catatan</label>
<div class="col">'.$tcatat.'</div>
</div>
</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="OutletID" value="'.$atabel['OutletID'].'" >
<input type="hidden" id="Lunas" value="'.$atabel['Lunas'].'" >
<input type="hidden" id="mode" value="'.$mode.'" >
';
} else if ( $data == "delete" ) {
$db->Query("DELETE FROM inv_jual WHERE No_Jual='".$nomor."'");
$db->Query("DELETE FROM inv_detail WHERE No_Ref='".$nomor."'");
$ajson['status'] = true;
} else if ( $data == "tabel-detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$iqty = doubleval(Param::Get("Qty", 0)) * 1; $istok = $iqty;
$db->Query("SELECT Qty FROM inv_produk_kemasan WHERE InvID='".Param::Get("InvID")."' AND SatuanID='".Param::Get("SatuanID")."'");
if ($db->Next()) $istok = $db->Row("Qty", 1) * $iqty;
$sql = new SQL($db);
$sql->set_table("tmp_inv_detail");
$sql->add_param("No_Ref", $nomor);
$sql->add_param("InvID");
$sql->add_param("SatuanID");
$sql->add_param("RasaID");
$sql->add_param("Qty", $iqty);
$sql->add_param("Stok", $istok);
$sql->add_param("Harga_Jual");
$sql->add_param_unix();
$sql->add_param_userid();
$sql->add_where("ID");
$sql->add_where("No_Ref", $nomor);
if ( $mode_detail == "insert" ) {
$sql->add_param("Harga_Pokok");
$sql->add_param("NotaID", 6);
$sql->InsertDB();
} else if ( $mode_detail == "update" ) {
$sql->UpdateDB();
} else if ( $mode_detail == "delete" ) {
$sql->DeleteDB();
}
}
$qview = ""; $qtabel = "inv_detail";
if (in_array($mode, ["add","edit"])) {
if ($mode=="add") $qview = " AND Unix=".user_unix();
$qtabel = "tmp_inv_detail";
}
$obj = new Table($db);
$obj->set_query("SELECT D.*,P.Nama_Lengkap2 Nama_Produk,P.Nama_Satuan,R.Nama_Rasa,(D.Qty*D.Harga_Jual) Total FROM (SELECT * FROM ".$qtabel." WHERE No_Ref='".$nomor."'".$qview.") D LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID) LEFT JOIN para_rasa R ON (D.RasaID=R.RasaID)");
$obj->set_query_footer("SELECT COUNT(*) Harga_Jual,SUM(D.Qty*D.Harga_Jual) Total FROM (SELECT * FROM ".$qtabel." WHERE No_Ref='".$nomor."' ".$qview.") D");
$obj->add_field("ID", "ID", "c");
$obj->add_field("Nama_Produk", "Nama Produk", "awr");
$obj->add_field("Nama_Rasa", "Varian / Rasa", "l");
$obj->add_field("Qty", "Qty", "r", "rupiah2");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah", "items");
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah", "rupiah");
$obj->add_field("Total", "TOTAL", "r", "rupiah", "rupiah");
$obj->set_field_order("ID", "A");
if (in_array($mode, ["add","edit"])) {
$obj->add_row_btn("clipboard", "Ubah", "JualReturJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "JualReturJS.detail_hapus", "Unix", user_unix());
$obj->set_func_btn("JualReturJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Produk');
$obj->set_func_btn("JualReturJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
}
$obj->set_func_navi("JualReturJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
} else if ( $data == "brow-tx" ) {
$tcari = trim(Param::Get("Cari_TX"));
$tlimit = ($tcari=="") ? "" : " AND (No_Jual LIKE '%".$tcari."%' OR Catatan LIKE '%".$tcari."%' OR OutletID IN (SELECT OutletID FROM para_outlet WHERE Nama_Outlet LIKE '%".$tcari."%'))";
$obj = new Table($db);
$obj->set_table("(SELECT *,-Total_Jual Jumlah FROM inv_jual WHERE Data_Jual=0".$tlimit.") J LEFT JOIN vi_para_outlet O ON (J.OutletID=O.OutletID)", "J.*,O.Nama_Alamat", "");
$obj->add_field("No_Jual", "No. Trans", "c");
$obj->add_field("Tgl_Jual", "Tgl. Retur", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Nama_Alamat", "Nama Outlet", "awr");
$obj->add_field("Jumlah", "Total Retur", "r", "rupiah");
$obj->set_field_order("No_Jual", "D");
$obj->add_row_btn("save", "Pilih", "JualReturJS.tx_select");
$obj->set_func_navi("JualReturJS.data_query('brow-tx')");
$ajson[] = $obj->db_table("divBrowTX");
} else if ( $data == "brow-outlet" ) {
$tcari = trim(Param::Get("Cari_Outlet"));
$tsql = ($tcari=="") ? "" : " AND CONCAT(Nama_Outlet,Telp_Outlet,Nama_Outlet) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("vi_para_outlet", "*", "Aktif=1".$tsql);
$obj->add_field("OutletID", "ID", "hid");
$obj->add_field("Kode_Outlet", "Kode", "c");
$obj->add_field("Nama_Alamat", "Nama Outlet", "awr");
$obj->add_field("Alamat_Kota", "Alamat & Kota", "awr");
$obj->set_field_order("Nama_Outlet", "A");
$obj->add_row_btn("save", "Pilih", "JualReturJS.outlet_select");
$obj->set_func_navi("JualReturJS.data_query('brow-outlet')");
$ajson[] = $obj->db_table("divBrowOutlet");
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari=="") ? "" : " AND CONCAT(Kode_Produk,Nama_Lengkap) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM vi_inv_produk2 WHERE Aktif=1".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("SatuanID", "SatuanID", "hid");
$obj->add_field("Kode_Produk", "Kode", "c");
$obj->add_field("Nama_Lengkap2", "Nama Produk", "awr");
$obj->set_field_order("Nama_Lengkap", "A");
$obj->add_row_btn("save", "Pilih", "JualReturJS.produk_select");
$obj->set_func_navi("JualReturJS.data_query('brow-produk')");
$ajson[] = $obj->json_table("divBrowProduk");
} else if ( $data == "auto-outlet" ) {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
if (is_string($tcari) && strlen($tcari) < 64) {
$db->Query("SELECT * FROM vi_para_outlet WHERE Aktif=1 AND CONCAT(Nama_Outlet,Alamat_Outlet) LIKE '%".$tcari."%' ORDER BY Nama_Outlet LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("OutletID"), 'text'=>$db->Row("Nama_Alamat"), 'data'=>$db->Row("Alamat_Kota")];
}
}
} else if ( $data == "auto-produk" ) {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
if (is_string($tcari) && strlen($tcari) < 64) {
$db->Query("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.Nama_Satuan) Data2 FROM vi_inv_produk2 P WHERE Aktif=1 AND CONCAT(Nama_Lengkap) LIKE '%".$tcari."%' ORDER BY Nama_Lengkap LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Lengkap"), 'data'=>$db->Row("Data2")];
}
}
} else if ($data == "detail-produk") {
$id = Param::Get("ID", 0); $atabel = ['ID'=>$id, 'InvID'=>Param::Get("InvID",0), 'SatuanID'=>Param::Get("SatuanID",0)];
if ($id > 0) {
$db->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND ID='".$id."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
//$atabel['Qty'] *= -1;
}
if ($atabel['InvID']>0 && $atabel['SatuanID']>0) {
$db->Query("SELECT Nama_Lengkap2 Nama_Produk,Nama_Satuan FROM vi_inv_produk2 WHERE InvID='".$atabel['InvID']."' AND SatuanID='".$atabel['SatuanID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
}
$form = new Form($db);
$tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Produk']], true, false, "ketik nama produk");
$trasa = $form->option("_", "RasaID", $atabel['RasaID'], true, false, [$atabel['RasaID']=>$atabel['RasaID']]);
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, false, "double");
$ttot = $form->textbox("_", "Jumlah", 0, false, false, "double");
$tsat = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], false, false, "text");
$tharga = '<select class="form-select text-end" id="Harga_Jual" name="Harga_Jual" onchange="JualReturJS.Hitung_Detail();"><option value="'.$atabel['Harga_Jual'].'">'.rupiah($atabel['Harga_Jual']).'</option></select>';
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Produk">Nama Produk</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="RasaID">Varian / Rasa</label>
<div class="col">'.$trasa.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Qty">Qty</label>
<div class="col-sm-4 col-lg-5">'.$tqty.'</div>
<div class="col-sm-4 col-lg-4">'.$tsat.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Harga_Jual">Harga (@)</label>
<div class="col-sm-4 col-lg-5">'.$tharga.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Total</label>
<div class="col-sm-4 col-lg-5">'.$ttot.'</div>
</div>
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'" >
<input type="hidden" id="SatuanID" value="'.$atabel['SatuanID'].'" >
<input type="hidden" id="Harga_Pokok" value="'.$atabel['Harga_Pokok'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >
';
} else if ( $data == "option-rasa" ) {
$aoption = ['type' => "option", 'id' => "RasaID", 'value' => 0, 'avalue' => [['value'=>0,'html'=>""]]];
$db->Query("SELECT R.RasaID,R.Nama_Rasa FROM (SELECT * FROM inv_produk_varian WHERE InvID='".Param::Get("InvID",0)."') V LEFT JOIN para_rasa R ON (R.RasaID=V.RasaID) ORDER BY R.Nama_Rasa");
while ($db->Next()) {
$aoption['avalue'][] = ['value'=>$db->Row("RasaID"), 'html'=>$db->Row("Nama_Rasa")];
}
$ajson[] = $aoption;
} else if ( $data == "option-harga" ) {
$aoption = ['type' => "option", 'id' => "Harga_Jual", 'value' => 0, 'avalue' => []];
$id_grup = 0;
$db->Query("SELECT Grup_OutletID FROM para_outlet WHERE OutletID='".Param::Get("OutletID",0)."'");
if ($db->Next()) $id_grup = $db->Row("Grup_OutletID", 0);
//todo: check if use last sale price !!
//$db->Query("SELECT D.Harga_Jual FROM inv_detail D LEFT JOIN inv_jual J ON (D.No_Ref=J.No_Jual) WHERE J.OutletID='".Param::Get("OutletID",0)."' AND D.InvID='".Param::Get("InvID",0)."' AND D.SatuanID='".Param::Get("SatuanID",0)."' ORDER BY D.Tgl_Ref DESC LIMIT 1", 0));
$db->Query("SELECT Tanggal,Harga_Jual FROM inv_produk_harga WHERE InvID='".Param::Get("InvID",0)."' AND SatuanID='".Param::Get("SatuanID",0)."' AND Grup_OutletID='".$id_grup."' ORDER BY Tanggal DESC, Harga_Jual DESC");
while ($db->Next()) {
if ($db->RecordCount()==1) $aoption['value'] = $db->Row("Harga_Jual");
$aoption['avalue'][] = ['value'=>$db->Row("Harga_Jual"), 'html'=>rupiah($db->Row("Harga_Jual"))];
}
$ajson[] = $aoption;
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-database me-2"></i>Transaksi Retur Penjualan</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-info mb-1 ms-2" id="butUbah" type="button"><i class="bi-clipboard me-2"></i>Ubah</button>
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-floppy me-2"></i>Simpan</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>