582 lines
32 KiB
PHP
582 lines
32 KiB
PHP
<?php
|
|
|
|
/*******************************************************************
|
|
|
|
PHP Class : /Controller/Inv/BeliController
|
|
Description : Transaksi Pembelian
|
|
Created By : Siau Pheng ([email protected]).
|
|
Created Date : May 22th, 2010.
|
|
Last Modified : November 4th, 2026.
|
|
|
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
|
|
|
*******************************************************************/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Controller\Inv;
|
|
|
|
use App\Utils\Inv;
|
|
use App\Utils\Gel;
|
|
use App\Utils\Invesa;
|
|
use flight\Engine;
|
|
use flight\database\SimplePdo;
|
|
use flight\Session;
|
|
use Webapp\DB\SQL;
|
|
use Webapp\Web\Form;
|
|
use Webapp\Web\Param;
|
|
use Webapp\Web\Table;
|
|
|
|
class BeliController {
|
|
|
|
private array $web_app;
|
|
private array $app_gel;
|
|
private int $id_cab;
|
|
private string $mode;
|
|
private string $mode_detail;
|
|
private string $no_beli;
|
|
private bool $is_pend;
|
|
private int $id_inv;
|
|
private int $id_satuan;
|
|
private int $id_varian;
|
|
private Inv $inv;
|
|
private Gel $gel;
|
|
protected Engine $app;
|
|
protected SimplePdo $db;
|
|
|
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
|
$this->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_beli = Param::Get("No_Beli", "");
|
|
$this->is_pend = str_contains($this->no_beli, "BELI") === 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_beli);
|
|
$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("Disk_Rupiah");
|
|
$sql->add_param("Disk_Persen1");
|
|
$sql->add_param("Disk_Persen2");
|
|
$sql->add_param("Disk_Persen3");
|
|
$sql->add_param("Disk_Persen4");
|
|
$sql->add_param("Disk_Persen5");
|
|
$sql->add_param("Total_Diskon", "(Harga_Beli-((Harga_Beli-Disk_Rupiah)*((100.0-Disk_Persen1)/100)*((100.0-Disk_Persen2)/100)*((100.0-Disk_Persen3)/100)*((100.0-Disk_Persen4)/100)*((100.0-Disk_Persen5)/100)))*Qty", true);
|
|
$sql->add_param_unix();
|
|
$sql->add_param_userid();
|
|
$sql->add_where("ID");
|
|
$sql->add_where("No_Ref", $this->no_beli);
|
|
|
|
$_id = Param::Get("ID", 0);
|
|
if ( $this->mode_detail === "insert" ) {
|
|
$sql->InsertDB();
|
|
$_id = $sql->LastInsertID("ID");
|
|
} else if ( $this->mode_detail === "update" ) {
|
|
$sql->UpdateDB();
|
|
} else if ( $this->mode_detail === "delete" ) {
|
|
$sql->DeleteDB();
|
|
}
|
|
}
|
|
|
|
$tsql = ''; $asql = [$this->no_beli]; $qtabel = "inv_detail";
|
|
if ($this->is_pend) $qtabel = "tmp_inv_detail";
|
|
if (in_array($this->mode, ["add","edit"])) {
|
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); }
|
|
$qtabel = "tmp_inv_detail";
|
|
}
|
|
|
|
$obj = new Table($this->app);
|
|
$obj->set_table("(SELECT * 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,(D.Qty*D.Harga_Beli)-D.Total_Diskon Total", "", $asql);
|
|
$obj->set_footer("SUM((D.Qty*D.Harga_Beli)-D.Total_Diskon) Total,SUM(D.Total_Diskon) Total_Diskon");
|
|
$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_Diskon", "Diskon", "r", "rupiah", "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", "BeliJS.detail_ubah");
|
|
$obj->add_row_btn("trash", "Hapus", "BeliJS.detail_hapus", "Unix", $this->app->user()->unix());
|
|
$obj->set_func_btn("BeliJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Barang');
|
|
$obj->set_func_btn("BeliJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
|
|
}
|
|
$obj->set_func_btn("BeliJS.total_show", "Total");
|
|
$ajson[] = $obj->json_table("divDetailTabel");
|
|
|
|
if (in_array($this->mode, ["add","pending-edit"])) {
|
|
$ajual = $this->db->fetchRow("SELECT SUM((Qty*Harga_Beli)-Total_Diskon) Jumlah,SUM(Total_Diskon) Diskon FROM ".$qtabel." WHERE No_Ref=?".$tsql, $asql) ?? ['Jumlah'=>0, 'Diskon'=>0];
|
|
$ajson[] = ['type'=>"form", 'id'=>"Real_Beli", 'value'=>$ajual['Jumlah']];
|
|
$ajson[] = ['type'=>"form", 'id'=>"Real_Diskon", 'value'=>$ajual['Diskon']];
|
|
}
|
|
if (in_array($this->mode_detail, ["insert","update"])) {//WARNING: harga jual dibawah limit margin!!
|
|
$hbeli = (float) $this->db->fetchField("SELECT CEIL(Harga_Beli-(Total_Diskon/Qty)) Pokok FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_beli, $_id]) ?? 0;
|
|
$_row = $this->db->fetchRow("SELECT P.Nama_Produk,H.*,G.Margin FROM (SELECT * FROM inv_produk_harga WHERE InvID=? AND SatuanID=? AND Harga_Jual>0 ORDER BY Harga_Jual ASC LIMIT 1) H LEFT JOIN (SELECT * FROM inv_produk WHERE InvID=?) P ON (H.InvID=P.InvID) LEFT JOIN inv_produk_grup G ON (P.Grup_InvID=G.Grup_InvID)", [$this->id_inv, $this->id_satuan, $this->id_inv]);
|
|
if ($_row) {
|
|
if ((float) $_row['Margin'] > 0) $hbeli += ($hbeli*((float) $_row['Margin']/100));
|
|
if ($hbeli > (float) $_row['Harga_Jual']) $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>3000, 'value'=>"Produk \"".$_row['Nama_Produk']."\" Harga Beli telah melewati Margin Harga Jual!"];
|
|
}
|
|
}
|
|
$this->app->json($ajson);
|
|
}
|
|
|
|
public function brow_tx() {
|
|
$tcari = Param::Get("Cari_TX");
|
|
$tsql = ''; $asql = [];
|
|
if (!empty($tcari)) {
|
|
$tsql .= "CONCAT(B.No_Beli,B.No_Faktur,S.Nama_Sup,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y')) LIKE ?";
|
|
$asql[] = '%' . $tcari . '%';
|
|
}
|
|
|
|
$obj = new Table($this->app);
|
|
$obj->set_table("(SELECT *,Total_Beli-Total_Diskon Jumlah FROM inv_beli WHERE Data_Beli=1) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", $tsql, $asql);
|
|
$obj->add_field("No_Beli", "No. Trans", "c");
|
|
$obj->add_field("Tgl_Beli", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
|
$obj->add_field("Kode_Cab", "Cabang", "c");
|
|
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
|
|
$obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah2");
|
|
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2");
|
|
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah2");
|
|
$obj->set_field_order("Tgl_Beli", "D");
|
|
$obj->set_func_select("BeliJS.tx_select");
|
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
|
}
|
|
|
|
public function brow_pending() {
|
|
$obj = new Table($this->app);
|
|
$obj->set_table("(SELECT *,Total_Beli-Total_Diskon Jumlah FROM inv_beli_pend WHERE UserID=?) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", "", [$this->app->user()->id()]);
|
|
$obj->add_field("No_Beli", "No. Trans", "c");
|
|
$obj->add_field("Tgl_Beli", "Tgl. Pending", "c", "sqltgl", "", "val-tgl");
|
|
$obj->add_field("Kode_Cab", "Cabang", "c");
|
|
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
|
|
$obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah2");
|
|
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2");
|
|
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah2");
|
|
$obj->set_field_order("No_Beli", "D");
|
|
$obj->add_row_btn("save", "Pilih", "BeliJS.pending_select");
|
|
if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "BeliJS.pending_delete", "UserID", $this->app->user()->id());
|
|
$this->app->json([ $obj->db_table("divBrowPending") ]);
|
|
}
|
|
|
|
public function brow_produk() {
|
|
$tcari = Param::Get("Cari_Produk");
|
|
$tsql = ''; $asql = [1];
|
|
if (!empty($tcari)) {
|
|
$tsql .= " AND P.Barcode_Nama LIKE ?";
|
|
$asql[] = '%' . $tcari . '%';
|
|
}
|
|
if ((string) Param::Get("Filter_Browse", "") !== "all") {
|
|
$tsql .= " AND S.SupID=?";
|
|
array_push($asql, Param::Get("SupID"));
|
|
}
|
|
|
|
$obj = new Table($this->app);
|
|
$obj->set_table("vi_inv_produk P LEFT JOIN inv_produk_sup S ON (P.InvID=S.InvID)", "P.*", "P.Aktif=?".$tsql, $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->set_field_order("Kode_SKU", "A");
|
|
$obj->set_func_select("BeliJS.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
|
|
$_row = $this->db->fetchRow("SELECT V.InvID,P.Nama_Produk,CONCAT(V.SatuanID,':',V.VarianID,':',S.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk_varian WHERE Kode_SKU=? OR Kode_Barcode=? LIMIT 1) V LEFT JOIN inv_produk P ON (P.InvID=V.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=V.SatuanID) WHERE P.Aktif=1", [$tcari, $tcari]);
|
|
if ($_row) {
|
|
$bcode = 1;
|
|
$arec = $_row->getData();
|
|
}
|
|
|
|
if ($bcode === 1) {
|
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
|
|
} else {
|
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Produk,V.Kode_SKU,IFNULL(MV.Nama_Varian,'') Nama_Varian,MS.Nama_Satuan,CONCAT(V.SatuanID,':',V.VarianID,':',MS.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk WHERE Nama_Produk LIKE ? AND Aktif=1) P INNER JOIN inv_produk_varian V ON (V.InvID=P.InvID) LEFT JOIN para_satuan MS ON (MS.SatuanID=V.SatuanID) LEFT JOIN para_varian MV ON (MV.VarianID=V.VarianID) ORDER BY P.Nama_Produk,MS.Nama_Satuan LIMIT 50", ['%'.$tcari.'%']);
|
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Produk']." ".$row['Nama_Varian']." ".$row['Nama_Satuan'], 'data'=>$row['Data2'], 'bc'=>0];
|
|
}
|
|
}
|
|
$this->app->json($ajson);
|
|
}
|
|
|
|
public function form_master() {
|
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
|
$atabel = [];
|
|
|
|
if ($this->mode === "pending-edit") {
|
|
$this->inv->Pending_Edit($this->no_beli);
|
|
$atabel = $this->Data_Beli($this->no_beli);
|
|
$this->mode = "edit";
|
|
} else if ($this->mode === "pending-save") {
|
|
$b_baru = false;
|
|
if (str_ends_with($this->no_beli, "#00")) {
|
|
$b_baru = true;
|
|
$no_lama = $this->no_beli;
|
|
$this->no_beli = $this->Pending_Nomor();
|
|
$this->inv->Pending_Save($no_lama, $this->no_beli);
|
|
}
|
|
$apending = $this->db->fetchRow("SELECT SUM(Qty*Harga_Beli) Beli,SUM(Total_Diskon) Diskon FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? ['Beli'=>0, 'Diskon'=>0];
|
|
|
|
$sql = new SQL($this->app);
|
|
$sql->set_table("inv_beli_pend");
|
|
$sql->add_param("No_Beli", $this->no_beli);
|
|
$sql->add_param_date("Tgl_Beli");
|
|
$sql->add_param_date("Tgl_Faktur");
|
|
$sql->add_param("No_Faktur");
|
|
$sql->add_param("CabID");
|
|
$sql->add_param("SupID");
|
|
$sql->add_param("Total_Beli", $apending['Beli']);
|
|
$sql->add_param("Total_Diskon", $apending['Diskon']);
|
|
$sql->add_param("Real_Beli");
|
|
$sql->add_param("Real_Diskon");
|
|
$sql->add_param("PPN");
|
|
$sql->add_param_userid();
|
|
$sql->add_where("No_Beli", $this->no_beli);
|
|
if ($b_baru) $sql->InsertDB();
|
|
else $sql->UpdateDB();
|
|
$atabel = $this->Data_Beli();
|
|
} else if ($this->mode === "pending-delete") {
|
|
$this->inv->Pending_Delete($this->no_beli);
|
|
$this->db->delete("inv_beli_pend", "No_Beli=?", [$this->no_beli]);
|
|
$atabel = $this->Data_Beli();
|
|
} else if ($this->mode === "add") {
|
|
$atabel = $this->Data_Beli("", true);
|
|
} else if ($this->mode === "edit") {
|
|
$this->inv->Detail_Copy($this->no_beli, true);
|
|
$atabel = $this->Data_Beli($this->no_beli);
|
|
} else if ($this->mode === "save") {
|
|
$no_lama = $this->no_beli;
|
|
if ($this->is_pend) {
|
|
$this->no_beli = $this->inv->Nomor_Baru("B", Param::Get("Tgl_Beli"), true);
|
|
if (!str_ends_with($no_lama, "#00")) $this->db->delete("inv_beli_pend", "No_Beli=?", [$no_lama]);
|
|
}
|
|
$this->inv->Detail_Save($this->no_beli, 3, $this->id_cab, Param::Get("Tgl_Beli"), $this->is_pend, $no_lama, Param::Int("PPN", 0));
|
|
|
|
$abeli = $this->db->fetchRow("SELECT SUM(Qty*Harga_Beli) Beli, SUM(Total_Diskon) Diskon FROM inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? ['Beli'=>0, 'Diskon'=>0];
|
|
|
|
$sql = new SQL($this->app);
|
|
$sql->set_table("inv_beli");
|
|
$sql->add_param_date("Tgl_Beli");
|
|
$sql->add_param_date("Tgl_Faktur");
|
|
$sql->add_param("No_Faktur");
|
|
$sql->add_param("CabID");
|
|
$sql->add_param("SupID");
|
|
$sql->add_param("Total_Beli", $abeli['Beli']);
|
|
$sql->add_param("Total_Diskon", $abeli['Diskon']);
|
|
$sql->add_param("Real_Beli");
|
|
$sql->add_param("Real_Diskon");
|
|
$sql->add_param("PPN");
|
|
$sql->add_param("Data_Beli", 1);
|
|
$sql->add_param_stamp();
|
|
$sql->add_param_userid();
|
|
$sql->add_where("No_Beli", $this->no_beli);
|
|
$sql->UpdateDB();
|
|
|
|
$this->inv->Produk_Update($this->no_beli, Param::Int("SupID", 0));
|
|
$this->gel->Update_Lunas_Sup(Param::Int("SupID", 0));
|
|
|
|
// PROSES POSTING GL
|
|
$ainfo = $this->db->fetchRow("SELECT B.*,S.Nama_Sup,B.Real_Beli Tagihan FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_beli]);
|
|
if (count($ainfo) > 0) {
|
|
$ajurnal = [
|
|
'Kode_Jurnal' => $ainfo['No_Beli'],
|
|
'TipeID' => 5,
|
|
'CabID' => $ainfo['CabID'],
|
|
'Tanggal' => tgl_sql2str($ainfo['Tgl_Beli']),
|
|
'Kode_Ref' => $ainfo['No_Beli'],
|
|
'Catatan' => "Pembelian : ".$ainfo['No_Beli'].(($ainfo['No_Faktur']=="")?"":" (Faktur : ".$ainfo['No_Faktur'].") ")." / ".$ainfo['Nama_Sup']
|
|
];
|
|
$adetail = [
|
|
[
|
|
'Kode_Rek' => $this->app_gel['STOK'],
|
|
'DK' => "D",
|
|
'Jumlah' => $ainfo['Tagihan']
|
|
],
|
|
[
|
|
'Kode_Rek' => $this->app_gel['HUT_USAHA'],
|
|
'DK' => "K",
|
|
'Jumlah' => $ainfo['Tagihan'],
|
|
'SupID' => $ainfo['SupID']
|
|
]
|
|
];
|
|
$this->gel->Jurnal_Post($ajurnal, $adetail);
|
|
}
|
|
$atabel = $this->Data_Beli($this->no_beli);
|
|
$this->mode = "view";
|
|
|
|
} else if ($this->mode === "cancel") {
|
|
if (str_ends_with($this->no_beli, "#00") || !$this->is_pend) $this->inv->Detail_Cancel($this->no_beli);
|
|
$atabel = $this->Data_Beli();
|
|
} else {
|
|
$atabel = $this->Data_Beli($this->no_beli);
|
|
}
|
|
|
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
|
$form = new Form($this->app);
|
|
$tnota = $form->textbox("_", "No_Beli", $atabel['No_Beli'], !$enable, true, "text", "nomor transaksi");
|
|
$tfaktur = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], $enable, true, "text", "nomor faktur");
|
|
$ttglnota = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], $enable, true);
|
|
$ttglfaktur = $form->datebox("_", "Tgl_Faktur", $atabel['Tgl_Faktur'], $enable, true);
|
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]);
|
|
$tsup = $form->option_db("_", "SupID", $atabel['SupID'], $enable, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0," "]);
|
|
$tppn = '<button class="btn btn-secondary" type="button" disabled="">'.Invesa::PPN_Array()[$atabel['PPN']].'</button>';
|
|
if ($enable) {
|
|
$tppn = $form->option("_", "PPN", $atabel['PPN'], true, false, Invesa::PPN_Array());
|
|
$tppn = str_replace("option-tags", "", $tppn);
|
|
}
|
|
$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_Beli">Nomor Transaksi</label>
|
|
<div class="col"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button"><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_Beli">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="Tgl_Faktur">Tanggal Faktur</label>
|
|
<div class="col-sm-7 col-lg-5">'.$ttglfaktur.'</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="CabID">Nama Cabang</label>
|
|
<div class="col">'.$tcab.'</div>
|
|
</div>
|
|
<div class="row mb-1">
|
|
<label class="col-sm-5 col-lg-3 col-form-label" for="SupID">Nama Supplier</label>
|
|
<div class="col">'.$tsup.'</div>
|
|
</div>
|
|
<div class="row mb-1">
|
|
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Faktur">Nomor Faktur</label>
|
|
<div class="col"><div class="input-group">'.$tfaktur.$tppn.'</div></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
|
<input type="hidden" id="Total_Beli" value="'.$atabel['Total_Beli'].'" >
|
|
<input type="hidden" id="Real_Beli" value="'.$atabel['Real_Beli'].'" >
|
|
<input type="hidden" id="Real_Diskon" value="'.$atabel['Real_Diskon'].'" >
|
|
<input type="hidden" id="Lunas" value="'.$atabel['Lunas'].'" >
|
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
|
$this->app->json($ajson);
|
|
}
|
|
|
|
public function form_produk() {
|
|
$id = (int) Param::Get("ID", 0);
|
|
$atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Nama_Produk'=>"", 'Nama_Satuan'=>"", 'Qty'=>0, 'Harga_Beli'=>0, 'Disk_Rupiah'=>0, 'Disk_Persen1'=>0, 'Disk_Persen2'=>0, 'Disk_Persen3'=>0, 'Disk_Persen4'=>0, 'Disk_Persen5'=>0 ];
|
|
if ($id > 0) {
|
|
$_row = $this->db->fetchRow("SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_beli, $id]);
|
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
|
}
|
|
if ((int) $atabel['InvID'] > 0 && (int) $atabel['SatuanID'] > 0) {
|
|
$_row = $this->db->fetchRow("SELECT Nama_Produk,Nama_Satuan FROM vi_inv_produk WHERE InvID=? AND SatuanID=? AND VarianID=?", [$atabel['InvID'], $atabel['SatuanID'], $atabel['VarianID']]);
|
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
|
}
|
|
|
|
$form = new Form($this->app);
|
|
$tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Produk']], true, true, "ketik nama produk");
|
|
$tvar = $form->option("_", "VarianID", $atabel['VarianID'], true, false, [$atabel['VarianID']=>"Tanpa Varian"]);
|
|
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double");
|
|
$tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "double");
|
|
$tdisrp = $form->textbox("_", "Disk_Rupiah", $atabel['Disk_Rupiah'], true, true, "double");
|
|
$tdis1 = $form->textbox("_", "Disk_Persen1", $atabel['Disk_Persen1'], true, true, "double");
|
|
$tdis2 = $form->textbox("_", "Disk_Persen2", $atabel['Disk_Persen2'], true, true, "double");
|
|
$tdis3 = $form->textbox("_", "Disk_Persen3", $atabel['Disk_Persen3'], true, true, "double");
|
|
$tdis4 = $form->textbox("_", "Disk_Persen4", $atabel['Disk_Persen4'], true, true, "double");
|
|
$tdis5 = $form->textbox("_", "Disk_Persen5", $atabel['Disk_Persen5'], true, true, "double");
|
|
$ttot_dis = $form->textbox("_", "Total_Diskon", 0, false, false, "double");
|
|
$ttot = $form->textbox("_", "Jumlah", 0, false, false, "double");
|
|
$tsat = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], false, false, "text");
|
|
$ajson['html'] = '
|
|
<div class="row mb-1">
|
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Produk">Nama Barang</label>
|
|
<div class="col">'.$tnama.'</div>
|
|
</div>
|
|
<div class="row mb-1">
|
|
<label class="col-sm-4 col-lg-2 col-form-label" for="VarianID">Nama Varian</label>
|
|
<div class="col">'.$tvar.'</div>
|
|
</div>
|
|
<div class="row mb-1">
|
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Qty">Qty</label>
|
|
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tqty.$tsat.'</div></div>
|
|
</div>
|
|
<div class="row mb-1">
|
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Beli">Harga (@)</label>
|
|
<div class="col-sm-4 col-lg-5">'.$tbeli.'</div>
|
|
</div>
|
|
<hr class="my-1">
|
|
<div class="row mb-1">
|
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Disk_Rupiah">Diskon Rupiah</label>
|
|
<div class="col-sm-4 col-lg-5">'.$tdisrp.'</div>
|
|
</div>
|
|
<div class="row mb-1">
|
|
<label class="col-sm-4 col-lg-2 col-form-label">Diskon Persen</label>
|
|
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">1</span>'.$tdis1.'<span class="input-group-text">%</span></div></div>
|
|
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">3</span>'.$tdis3.'<span class="input-group-text">%</span></div></div>
|
|
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">5</span>'.$tdis5.'<span class="input-group-text">%</span></div></div>
|
|
</div>
|
|
<div class="row mb-1">
|
|
<label class="col-sm-4 col-lg-2 col-form-label"> </label>
|
|
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">2</span>'.$tdis2.'<span class="input-group-text">%</span></div></div>
|
|
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">4</span>'.$tdis4.'<span class="input-group-text">%</span></div></div>
|
|
<div class="col-sm-4 col-lg-3">'.Invesa::Form_Info("Silakan masukkan -10 pada Diskon 5, jika ada PPN.").'</div>
|
|
</div>
|
|
<hr class="my-1">
|
|
<div class="row mb-1">
|
|
<label class="col-sm-4 col-lg-2 col-form-label">Diskon</label>
|
|
<div class="col-sm-4 col-lg-5">'.$ttot_dis.'</div>
|
|
</div>
|
|
<div class="row mb-1">
|
|
<label class="col-sm-4 col-lg-2 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="mode_detail" value="'.$this->mode_detail.'" >';
|
|
$this->app->json($ajson);
|
|
}
|
|
|
|
public function form_total() {
|
|
$form = new Form($this->app);
|
|
$tdisk = $form->textbox("_", "popTotal_Diskon", 0, true, false, "double");
|
|
$tbeli = $form->textbox("_", "popTotal_Beli", 0, true, false, "double");
|
|
$ajson['html'] = '
|
|
<div class="row mb-1">
|
|
<label class="col-sm-6 col-lg-5 col-form-label" for="popTotal_Diskon">Total Diskon (Koreksi +/-)</label>
|
|
<div class="col">'.$tdisk.'</div>
|
|
</div>
|
|
<div class="row mb-1">
|
|
<label class="col-sm-6 col-lg-5 col-form-label" for="popTotal_Beli">Total Faktur / Hutang</label>
|
|
<div class="col">'.$tbeli.'</div>
|
|
</div>
|
|
';
|
|
$this->app->json($ajson);
|
|
}
|
|
|
|
public function proses_delete() {
|
|
if ($this->is_pend === false) {
|
|
$this->db->runQuery("DELETE FROM inv_beli WHERE No_Beli=?", [$this->no_beli]);
|
|
$this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_beli]);
|
|
// PROSES POSTING GL
|
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_beli]);
|
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_beli]);
|
|
} else {
|
|
$this->db->runQuery("DELETE FROM inv_beli_pend WHERE No_Beli=?", [$this->no_beli]);
|
|
$this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_beli]);
|
|
}
|
|
$this->app->json([ 'status' => true ]);
|
|
}
|
|
|
|
public function option_varian() {
|
|
$aoption = ['type' => "option", 'id' => "VarianID", 'value' => $this->id_varian, 'avalue' => [['value'=>0, 'html'=>"Tanpa Varian"]]];
|
|
$avarian = $this->db->fetchAll("SELECT * FROM para_varian WHERE VarianID IN (SELECT VarianID FROM inv_produk_varian WHERE InvID=? AND SatuanID=?) ORDER BY Nama_Varian", [$this->id_inv, $this->id_satuan]);
|
|
foreach ($avarian as $varian) {
|
|
$aoption['avalue'][] = ['value'=>$varian['VarianID'], 'html'=>$varian['Nama_Varian']];
|
|
}
|
|
$this->app->json([ $aoption ]);
|
|
}
|
|
|
|
public function item_detail() {
|
|
$ajson['data'] = [];
|
|
$_row = $this->db->fetchRow("SELECT * FROM inv_detail D WHERE Qty>0 AND InvID=? ORDER BY Tgl_Ref DESC", [$this->id_inv]);
|
|
if ($_row) $ajson['data'] = $_row->getData();
|
|
|
|
if ($this->id_satuan !== (int) $ajson['data']['SatuanID']) {
|
|
$_bagi = (float) $this->db->fetchField("SELECT A.Qty/B.Qty Bagi FROM (SELECT InvID,Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=? LIMIT 1) A LEFT JOIN (SELECT InvID,Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=? LIMIT 1) B ON (A.InvID=B.InvID)", [$this->id_inv, $this->id_satuan, $this->id_inv, $this->id_satuan]) ?? 1;
|
|
(float) $ajson['data']['Harga_Beli'] /= $_bagi;
|
|
(float) $ajson['data']['Disk_Rupiah'] /= $_bagi;
|
|
}
|
|
$this->app->json($ajson);
|
|
}
|
|
|
|
public function index() {
|
|
$this->app->json(['html' => '
|
|
<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 Pembelian</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-info mb-1 ms-2" id="butPendingBrow" type="button"><i class="bi-cloud me-2"></i>Pending</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-warning mb-1 ms-2" id="butPendingSimpan" type="button"><i class="bi-cloud-upload me-2"></i>Simpan Pending</button>
|
|
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save 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"> </div>
|
|
<div id="divDetailTabel"> </div>
|
|
</div>
|
|
</div>
|
|
</div></div>
|
|
</div>'
|
|
]);
|
|
}
|
|
|
|
private function Data_Beli(string $nomor="", bool $baru=false): array {
|
|
$aparam = [ 'No_Beli'=>$nomor, 'PPN'=>1, 'Lunas'=>0 ];
|
|
if (empty($nomor)) {
|
|
if ($baru) $aparam['No_Beli'] = "BELI".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00";
|
|
$aparam['Tgl_Beli'] = tgl_ymd();
|
|
$aparam['Tgl_Faktur'] = tgl_ymd();
|
|
$aparam['No_Faktur'] = "";
|
|
$aparam['SupID'] = 0;
|
|
$aparam['CabID'] = $this->id_cab;
|
|
$aparam['Total_Beli'] = 0;
|
|
$aparam['Real_Beli'] = 0;
|
|
$aparam['Real_Diskon'] = 0;
|
|
} else {
|
|
$tabel_beli = (str_contains($nomor, "BELI") === false) ? "inv_beli" : "inv_beli_pend";
|
|
$row = $this->db->fetchRow("SELECT * FROM ".$tabel_beli." WHERE No_Beli=?", [$nomor]);
|
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
|
}
|
|
return $aparam;
|
|
}
|
|
|
|
private function Pending_Nomor(): string {
|
|
$tno = "BELI".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#";
|
|
$ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Beli,2)) FROM inv_beli_pend WHERE No_Beli LIKE ?", [$tno.'%']) ?? 0;
|
|
$tno .= isi_nol(++$ino, 2);
|
|
return $tno;
|
|
}
|
|
}
|