Files
cmasa/app/Controller/Gel/HutangController.php
2026-10-29 13:34:31 +07:00

316 lines
16 KiB
PHP

<?php
/*******************************************************************
PHP Class : /Controller/Gel/HutangController
Description : Transaksi Pembayaran Hutang Supplier
Created By : Siau Pheng ([email protected]).
Created Date : March 7th, 2011.
Last Modified : September 10th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller\Gel;
use App\Utils\Gel;
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 HutangController {
private array $app_gel;
private string $mode;
private string $mode_detail;
private int $id_sup;
private string $no_beli;
private int $mode_tampil;
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->app_gel = (array) $session->get('APP_GEL');
$this->mode = Param::Get("mode", "");
$this->mode_detail = Param::Get("mode_detail", "");
$this->id_sup = Param::Int("SupID", 0);
$this->no_beli = Param::Get("No_Beli", "");
$this->mode_tampil = Param::Int("Mode_Tampil", 0);
$this->gel = new Gel($app);
}
public function table_nota() {
$tsql = 'SupID=?'; $asql = [$this->id_sup];
if ($this->mode_tampil === 0) {
$tsql .= " AND Lunas=0";
}
$obj = new Table($this->app);
$obj->set_table("(SELECT No_Beli,Tgl_Beli,Real_Diskon,Real_Beli,Real_Beli+Real_Diskon Sub_Total,IF(Data_Beli=1,'B','R') Tipe,CabID,Lunas FROM inv_beli WHERE ".$tsql.") B LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,C.Nama_Cab", "", $asql);
$obj->set_footer("SUM(B.Real_Beli) Real_Beli");
$obj->add_field("Tipe", "Tipe", "hid");
$obj->add_field("No_Beli", "No. Trans", "c");
$obj->add_field("Tgl_Beli", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
$obj->add_field("Nama_Cab", "Cabang", "l");
$obj->add_field("Sub_Total", "Sub. Total", "r", "rupiah", "rupiah");
$obj->add_field("Real_Diskon", "Diskon", "r", "rupiah");
$obj->add_field("Real_Beli", "TOTAL", "r", "rupiah", "rupiah");
if ($this->mode_tampil === 1) $obj->add_field("Lunas", "Lunas", "c", "checkbox");
$obj->set_field_order("No_Beli", "A");
$obj->add_row_btn("save", "Pilih", "GELHutangJS.nota_select");
$this->app->json([ $obj->json_table("divTXNota") ]);
}
public function table_bayar() {
$ajson = [];
$lunas = (int) Param::Get("Lunas", 0);
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$sql = new SQL($this->app);
$sql->set_table("inv_beli_lunas");
$sql->add_param("No_Beli");
$sql->add_param_date("Tgl_Bayar");
$sql->add_param("Total_Bayar");
$sql->add_param("Total_Potong");
$sql->add_param_userid();
$sql->add_where("ID");
$sql->add_where("No_Beli", $this->no_beli);
$tgl_bayar = Param::Get("Tgl_Bayar", "00-00-0000");
if ($this->mode_detail === "insert") {
$abeli = $this->db->fetchRow("SELECT CabID,SupID FROM inv_beli WHERE No_Beli=?", [$this->no_beli]) ?? ['CabID'=>0, 'SupID'=>0];
$sql->add_param("CabID", $abeli['CabID']);
$sql->add_param("SupID", $abeli['SupID']);
$sql->InsertDB();
$id_bayar = $sql->LastInsertID();
// PROSES POSTING GL
if (Param::Get("Tipe_Nota","B")==="B") {
$tcat = "Pembayaran Faktur : "; $ddk = "D"; $kdk = "K";
} else {
$tcat ="Retur Nota : "; $ddk = "K"; $kdk = "D";
}
$tot_bayar = (float) Param::Get("Total_Bayar", 0);
$tot_potong = (float) Param::Get("Total_Potong", 0);
$ajurnal = [
'Kode_Jurnal' => "",
'TipeID' => 10,
'CabID' => $abeli['CabID'],
'Tanggal' => $tgl_bayar,
'Kode_Ref' => $this->no_beli,
'Catatan' => $tcat . Param::Get("Nama_Sup", "")
];
$adetail = [
[ 'Kode_Rek' => $this->app_gel['HUT_USAHA'], 'DK' => $ddk, 'Jumlah' => $tot_bayar+$tot_potong, 'SupID' => $this->id_sup ],
[ 'Kode_Rek' => Param::Get("Kode_Rek", ""), 'DK' => $kdk, 'Jumlah' => $tot_bayar ]
];
if ($tot_potong > 0) array_push($adetail, [ 'Kode_Rek' => $this->app_gel['POT_BELI'], 'DK' => $kdk, 'Jumlah' => $tot_potong ]);
$gel_jur = $this->gel->Jurnal_Post($ajurnal, $adetail);
$this->db->update("inv_beli_lunas", ['Kode_Jurnal'=>$gel_jur], "No_Beli=? AND ID=?", [$this->no_beli, $id_bayar]);
} else if ($this->mode_detail === "delete") {
// PROSES POSTING GL
$gel_jur = $this->db->fetchField("SELECT Kode_Jurnal FROM inv_beli_lunas WHERE No_Beli=? AND ID=?", [$this->no_beli, Param::Get("ID", 0)]) ?? '';
if (!empty($gel_jur)) {
$this->db->delete("gel_jurnal", "Kode_Jurnal=?", [$gel_jur]);
$this->db->delete("gel_jurnal_detail", "Kode_Jurnal=?", [$gel_jur]);
}
$sql->DeleteDB();
}
$anota = $this->db->fetchRow("SELECT SUM(Total_Bayar) Bayar,SUM(Total_Potong) Potong FROM inv_beli_lunas WHERE No_Beli=?", [$this->no_beli]) ?? ['Bayar'=>0, 'Potong'=>0];
$this->db->runQuery("UPDATE inv_beli SET Total_Bayar=?,Total_Potong=?,Lunas=IF(Real_Beli-Total_Bayar-Total_Potong=0,1,0),Tgl_Lunas=IF(Lunas=1,'".tgl_sql2str($tgl_bayar)."','0000-00-00') WHERE No_Beli=?", [$anota['Bayar'], $anota['Potong'], $this->no_beli]);
$this->gel->Update_Lunas_Sup($this->id_sup);
$anota = $this->db->fetchRow("SELECT Lunas,Real_Beli-Total_Bayar-Total_Potong Total_Sisa FROM inv_beli WHERE No_Beli=?", [$this->no_beli]) ?? ['Lunas'=>0, 'Total_Sisa'=>0];
$lunas = $anota['Lunas'];
$ajson[] = ['type'=>"form", 'id'=>"Total_Sisa", 'value'=>$anota['Total_Sisa']];
$ajson[] = ['type'=>"form", 'id'=>"Lunas", 'value'=>$anota['Lunas']];
}
$obj = new Table($this->app);
$obj->set_table("inv_beli_lunas", "*", "No_Beli=?", [$this->no_beli]);
$obj->add_field("ID", "ID", "hid");
$obj->add_field("Tgl_Bayar", "Tgl. Bayar", "c", "sqltgl", "", "val-tgl");
$obj->add_field("Kode_Jurnal", "Kode Jurnal", "c");
$obj->add_field("Total_Bayar", "Jumlah Bayar", "r", "rupiah");
$obj->add_field("Total_Potong", "Pemotongan", "r", "rupiah");
$obj->set_field_order("Tgl_Bayar", "A");
if ($this->app->user()->is_level(0) && ($lunas===0 || ($lunas===1 && $this->mode_tampil===1))) {
$obj->add_row_btn("trash", "Hapus", "GELHutangJS.bayar_hapus", "No_Beli", $this->no_beli);
}
if ($lunas === 0) {
$obj->set_func_btn("GELHutangJS.bayar_show", '<i class="bi-wallet me-1"></i> Pembayaran');
}
$ajson[] = $obj->json_table("divDetailBayar");
$this->app->json($ajson);
}
public function brow_sup() {
$tcari = Param::Get("Cari_Sup");
$tsql = 'Lunas>0'; $asql = [];
if (!empty($tcari)) {
$tsql .= " AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE ?";
$asql[] = '%' . $tcari . '%';
}
$obj = new Table($this->app);
$obj->set_table("para_supplier", "*", $tsql, $asql);
$obj->add_field("SupID", "ID", "hid");
$obj->add_field("Kode_Sup", "Kode", "l");
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
$obj->add_field("Telp_Sup", "Telp", "l");
$obj->add_field("Alamat_Sup", "Alamat", "hid");
$obj->set_field_order("Kode_Sup", "A");
$obj->set_func_select("GELHutangJS.sup_select");
$this->app->json([ $obj->db_table("divBrowSup") ]);
}
public function auto_sup() {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$stat = $this->db->runQuery("SELECT * FROM para_supplier WHERE Lunas>0 AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE ? ORDER BY Kode_Sup LIMIT 50", ['%'.$tcari.'%']);
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
$ajson['autodata'][] = ['value'=>$row['SupID'], 'text'=>$row['Nama_Sup'], 'html'=>'<span class="text-primary">'.$row['Kode_Sup'].'</span> '.$row['Nama_Sup'], 'data'=>$row['Alamat_Sup'], 'bc'=>0];
}
$this->app->json($ajson);
}
public function form_master() {
$ajson = [ 'error'=>"", 'html'=>"" ];
$atabel = [ 'SupID'=>0, 'Nama_Sup'=>"", 'Alamat_Sup'=>"" ];
$form = new Form($this->app);
$tsup = $form->textauto("_", "Nama_Sup", ['value'=>$atabel['SupID'],'text'=>$atabel['Nama_Sup']], true, false, "ketik nama supplier");
$tsupal = $form->textbox("_", "Alamat_Sup", $atabel['Alamat_Sup'], false, false, "text");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Sup">Nama Supplier</label>
<div class="col"><div class="input-group">'.$tsup.'<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-4 col-lg-2 col-form-label">Alamat Supplier</label>
<div class="col">'.$tsupal.'</div>
</div>
<div class="row"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="SupID" value="0" >
<input type="hidden" id="Mode_Tampil" value="0" >';
$this->app->json($ajson);
}
public function form_nota() {
$tipe = Param::Get("Tipe_Nota", "B");
$atabel = [ 'No_Beli'=>$this->no_beli ];
if (!empty($this->no_beli)) {
$atabel = $this->db->fetchRow("SELECT *,Real_Beli+Real_Diskon Sub_Total,Real_Beli-Total_Bayar-Total_Potong Sisa_Bayar FROM inv_beli WHERE No_Beli=?", [$this->no_beli]);
}
$form = new Form($this->app);
$tnota = $form->textbox("_", "No_Beli", $atabel['No_Beli'], false, false, "text");
$tfaktur = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], false, false, "text");
$ttglnota = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], false, false);
$ttglfaktur = $form->datebox("_", "Tgl_Faktur", $atabel['Tgl_Faktur'], false, false);
$tsubtot = $form->textbox("_", "Real_Beli", $atabel['Sub_Total'], false, false, "double");
$tdiskon = $form->textbox("_", "Ral_Diskon", $atabel['Real_Diskon'], false, false, "double");
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Real_Beli'], false, false, "double");
$ajson['html'] = '
<div class="row mb-1">
<div class="col text-center fs-5 pb-1">Informasi Faktur / Retur</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">No. '.(($tipe=="B")?"Transaksi":"Retur").'</label>
<div class="col-sm-8 col-lg-4">'.$tnota.'</div>
<label class="col-sm-4 col-lg-2 col-form-label">Jumlah '.(($tipe=="B")?"Transaksi":"Retur").'</label>
<div class="col-sm-8 col-lg-4">'.$tsubtot.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">'.(($tipe=="B")?"No. Faktur":"Catatan").'</label>
<div class="col-sm-8 col-lg-4">'.$tfaktur.'</div>
<label class="col-sm-4 col-lg-2 col-form-label">Jumlah Diskon</label>
<div class="col-sm-8 col-lg-4">'.$tdiskon.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Tgl. '.(($tipe=="B")?"Transaksi":"Retur").'</label>
<div class="col-sm-8 col-lg-4">'.$ttglnota.'</div>
<label class="col-sm-4 col-lg-2 col-form-label">Total Faktur</label>
<div class="col-sm-8 col-lg-4">'.$tjumlah.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Tgl. Faktur</label>
<div class="col-sm-8 col-lg-4">'.$ttglfaktur.'</div>
</div>
<div class="row"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="Total_Sisa" value="'.$atabel['Sisa_Bayar'].'" >
<input type="hidden" id="Lunas" value="'.$atabel['Lunas'].'" >
<input type="hidden" id="Tipe_Nota" value="'.$tipe.'" >';
$this->app->json($ajson);
}
public function form_bayar() {
$form = new Form($this->app);
$ttglbyr = $form->datebox("_", "Tgl_Bayar", tgl_ymd(), true, false);
$trek = $form->option_db("_", "Kode_Rek", $this->app_gel['KAS_TUNAI'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek");
$ttotal = $form->textbox("_", "Temp_Total", Param::Get("Total_Sisa",0), false, false, "double");
$tbayar = $form->textbox("_", "Total_Bayar", Param::Get("Total_Sisa",0), true, false, "double");
$tpotong = $form->textbox("_", "Total_Potong", 0, true, false, "double");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="Tgl_Bayar">Tanggal Bayar</label>
<div class="col-sm-8 col-lg-6">'.$ttglbyr.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="Kode_Rek">Rekening Kredit</label>
<div class="col">'.$trek.'</div>
</div>
<div class="row"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">Jumlah Sisa</label>
<div class="col">'.$ttotal.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="Total_Bayar">Jumlah Bayar</label>
<div class="col">'.$tbayar.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="Total_Potong">Potongan</label>
<div class="col">'.$tpotong.'</div>
</div>';
$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-journal-bookmark me-2"></i>Transaksi Pembayaran Hutang Supplier</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-secondary mb-1 ms-2" id="butMode" type="button"><i class="bi-list me-2"></i>Normal</button>
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</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="divTXNota">&nbsp;</div>
<div id="divDetailNota" class="d-none">&nbsp;</div>
<div id="divDetailBayar" class="d-none">&nbsp;</div>
</div>
</div>
</div></div>
</div>'
]);
}
}