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

330 lines
17 KiB
PHP

<?php
/*******************************************************************
PHP Class : /Controller/Gel/PiutangController
Description : Transaksi Penerimaan Piutang Buyer / Member
Created By : Siau Pheng ([email protected]).
Created Date : March 7th, 2011.
Last Modified : September 13th, 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 PiutangController {
private array $app_gel;
private string $mode;
private string $mode_detail;
private int $id_buyer;
private string $no_jual;
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_buyer = Param::Int("MemberID", 0);
$this->no_jual = Param::Get("No_Jual", "");
$this->mode_tampil = Param::Int("Mode_Tampil", 0);
$this->gel = new Gel($app);
}
public function table_nota() {
$tsql = 'FALSE'; $asql = [];
if ($this->id_buyer > 0) {
$tsql = 'MemberID=?';
$asql[] = $this->id_buyer;
if ($this->mode_tampil === 0) {
$tsql .= " AND Lunas=0";
}
}
$obj = new Table($this->app);
$obj->set_table("(SELECT No_Jual,Tgl_Jual,Total_Jual,Total_Diskon,Total_Jual-Total_Diskon Total,Total_Bayar+Total_Potong Bayar,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Sisa,IF(Data_Jual=1,'J','R') Tipe,CabID,Lunas FROM inv_jual WHERE ".$tsql.") J LEFT JOIN para_cabang C ON (C.CabID=J.CabID)", "J.*,C.Nama_Cab", "", $asql);
$obj->set_footer("SUM(J.Total) Total,SUM(J.Bayar) Bayar,SUM(J.Sisa) Sisa");
$obj->add_field("Tipe", "Tipe", "hid");
$obj->add_field("No_Jual", "No. Trans", "c");
$obj->add_field("Tgl_Jual", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
$obj->add_field("Nama_Cab", "Cabang", "l");
$obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah", "rupiah");
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah");
$obj->add_field("Total", "TOTAL", "r", "rupiah", "rupiah");
$obj->add_field("Bayar", "BAYAR", "r", "rupiah", "rupiah");
$obj->add_field("Sisa", "SISA", "r", "rupiah", "rupiah");
if ($this->mode_tampil === 1) $obj->add_field("Lunas", "Lunas", "c", "checkbox");
$obj->set_field_order("No_Jual", "A");
$obj->add_row_btn("save", "Pilih", "GELPiutangJS.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_jual_lunas");
$sql->add_param("No_Jual");
$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_Jual", $this->no_jual);
$tgl_bayar = Param::Get("Tgl_Bayar", "00-00-0000");
if ($this->mode_detail === "insert") {
$ajual = $this->db->fetchRow("SELECT CabID,MemberID FROM inv_jual WHERE No_Jual=?", [$this->no_jual]) ?? ['CabID'=>0, 'MemberID'=>0];
$sql->add_param("CabID", $ajual['CabID']);
$sql->add_param("MemberID", $ajual['MemberID']);
$sql->InsertDB();
$id_bayar = $sql->LastInsertID();
// PROSES POSTING GL
if (Param::Get("Tipe_Nota","J")==="J") {
$tcat = "Penerimaan Nota : "; $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' => 11,
'CabID' => $ajual['CabID'],
'Tanggal' => $tgl_bayar,
'Kode_Ref' => $this->no_jual,
'Catatan' => $tcat . Param::Get("Nama_Member", "")
];
$adetail = [
[ 'Kode_Rek' => Param::Get("Kode_Rek", ""), 'DK' => $ddk, 'Jumlah' => $tot_bayar ],
[ 'Kode_Rek' => $this->app_gel['PIU_USAHA'], 'DK' => $kdk, 'Jumlah' => $tot_bayar+$tot_potong, 'MemberID' => $this->id_buyer ]
];
if ($tot_potong > 0) array_push($adetail, [ 'Kode_Rek' => $this->app_gel['POT_JUAL'], 'DK' => $ddk, 'Jumlah' => $tot_potong ]);
$gel_jur = $this->gel->Jurnal_Post($ajurnal, $adetail);
$this->db->update("inv_jual_lunas", ['Kode_Jurnal'=>$gel_jur], "No_Jual=? AND ID=?", [$this->no_jual, $id_bayar]);
} else if ($this->mode_detail === "delete") {
// PROSES POSTING GL
$gel_jur = $this->db->fetchField("SELECT Kode_Jurnal FROM inv_jual_lunas WHERE No_Jual=? AND ID=?", [$this->no_jual, 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_jual_lunas WHERE No_Jual=?", [$this->no_jual]) ?? ['Bayar'=>0, 'Potong'=>0];
$this->db->runQuery("UPDATE inv_jual SET Total_Bayar=?,Total_Potong=?,Lunas=IF(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong=0,1,0),Tgl_Lunas=IF(Lunas=1,'".tgl_sql2str($tgl_bayar)."','0000-00-00') WHERE No_Jual=?", [$anota['Bayar'], $anota['Potong'], $this->no_jual]);
//UPDATE POINT UNTUK LUNAS +10 HARI
$this->db->runQuery("UPDATE inv_jual SET Point=IF(Tgl_Lunas<=(Tgl_Jual+INTERVAL 10 DAY),Point,0) WHERE No_Jual=?", [$this->no_jual]);
$this->gel->Update_Lunas_Buy($this->id_buyer);
$anota = $this->db->fetchRow("SELECT Lunas,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Total_Sisa FROM inv_jual WHERE No_Jual=?", [$this->no_jual]) ?? ['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_jual_lunas", "*", "No_Jual=?", [$this->no_jual]);
$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", "GELPiutangJS.bayar_hapus", "No_Jual", $this->no_jual);
}
if ($lunas === 0) {
$obj->set_func_btn("GELPiutangJS.bayar_show", '<i class="bi-wallet me-1"></i> Pembayaran');
}
$ajson[] = $obj->json_table("divDetailBayar");
$this->app->json($ajson);
}
public function brow_buyer() {
$tcari = Param::Get("Cari_Buyer");
$tsql = 'Lunas>0'; $asql = [];
if (!empty($tcari)) {
$tsql .= " AND CONCAT(Kode_Member,Nama_Member,Alamat_Member) LIKE ?";
$asql[] = '%' . $tcari . '%';
}
$obj = new Table($this->app);
$obj->set_table("para_member", "*", $tsql, $asql);
$obj->add_field("MemberID", "ID", "hid");
$obj->add_field("Kode_Member", "Kode", "l");
$obj->add_field("Nama_Member", "Nama Member", "awr");
$obj->add_field("Alamat_Member", "Alamat", "awr");
$obj->add_field("Kota_Member", "Kota", "awr");
$obj->set_field_order("Nama_Member", "A");
$obj->set_func_select("GELPiutangJS.buyer_select");
$this->app->json([ $obj->db_table("divBrowBuyer") ]);
}
public function auto_buyer() {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$stat = $this->db->runQuery("SELECT MemberID,Kode_Member,Nama_Member,CONCAT(Alamat_Member,_latin1', ',Kota_Member) Alamat_Kota FROM para_member WHERE Lunas>0 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Nama_Member'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>$row['Alamat_Kota'], 'bc'=>0];
}
$this->app->json($ajson);
}
public function form_master() {
$ajson = [ 'error'=>"", 'html'=>"" ];
$atabel = [ 'MemberID'=>0, 'Nama_Member'=>"", 'Alamat_Member'=>"" ];
$form = new Form($this->app);
$tmemb = $form->textauto("_", "Nama_Member", ['value'=>$atabel['MemberID'],'text'=>$atabel['Nama_Member']], true, false, "ketik nama member");
$tmembal = $form->textbox("_", "Alamat_Member", $atabel['Alamat_Member'], false, false, "text");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Member">Nama Member</label>
<div class="col"><div class="input-group">'.$tmemb.'<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 Member</label>
<div class="col">'.$tmembal.'</div>
</div>
<div class="row"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="MemberID" value="0" >
<input type="hidden" id="Mode_Tampil" value="0" >';
$this->app->json($ajson);
}
public function form_nota() {
$tipe = Param::Get("Tipe_Nota", "J");
$atabel = [ 'No_Jual'=>$this->no_jual, 'Nama_Operator'=>"" ];
if (!empty($this->no_jual)) {
$atabel = $this->db->fetchRow("SELECT *,Total_Jual-Total_Diskon Jumlah,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Sisa_Bayar FROM inv_jual WHERE No_Jual=?", [$this->no_jual]);
if ((int) $atabel['UserID'] > 0) {
$atabel['Nama_Operator'] = $this->db->fetchField("SELECT Nama FROM app_operator WHERE UserID=?", [$atabel['UserID']]) ?? '';
}
}
$form = new Form($this->app);
$tnota = $form->textbox("_", "No_Jual", $atabel['No_Jual'], false, false, "text");
$ttglnota = $form->datebox("_", "Tgl_Jual", $atabel['Tgl_Jual'], false, false);
$tsubtot = $form->textbox("_", "Total_Jual", $atabel['Total_Jual'], false, false, "double");
$tdiskon = $form->textbox("_", "Total_Diskon", $atabel['Total_Diskon'], false, false, "double");
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], false, false, "double");
$tbayar = $form->textbox("_", "V_Bayar", $atabel['Total_Bayar']+$atabel['Total_Potong'], false, false, "double");
$tsisa = $form->textbox("_", "V_Sisa", $atabel['Sisa_Bayar'], false, false, "double");
$toper = $form->textbox("_", "V_Ope", $atabel['Nama_Operator'], false, false, "text");
$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=="J")?"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=="J")?"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">Tgl. '.(($tipe=="J")?"Transaksi":"Retur").'</label>
<div class="col-sm-8 col-lg-4">'.$ttglnota.'</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">Nama Operator</label>
<div class="col-sm-8 col-lg-4">'.$toper.'</div>
<label class="col-sm-4 col-lg-2 col-form-label">Total '.(($tipe=="J")?"Nota":"Retur").'</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">Total Bayar / Potong</label>
<div class="col-sm-8 col-lg-4">'.$tbayar.'</div>
<label class="col-sm-4 col-lg-2 col-form-label">Sisa Piutang</label>
<div class="col-sm-8 col-lg-4">'.$tsisa.'</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 Debit</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 Penerimaan Piutang Member</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>'
]);
}
}