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

305 lines
15 KiB
PHP

<?php
/*******************************************************************
PHP Class : /Controller/Gel/TerimaController
Description : Jurnal Penerimaan Kas / Bank
Created By : Siau Pheng ([email protected]).
Created Date : May 22th, 2010.
Last Modified : September 9th, 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 TerimaController {
private array $web_app;
private array $app_gel;
private int $id_cab;
private string $mode;
private string $mode_detail;
private string $kode_jurnal;
private string $kode_rek;
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->kode_jurnal = Param::Get("Kode_Jurnal", "");
$this->kode_rek = Param::Get("Kode_Rek", "");
$this->gel = new Gel($app);
}
public function table_detail() {
if (in_array($this->mode_detail, ["insert","update","delete"])) {
$jumlah = (float) Param::Get("Jumlah", 0) * -1;
$sql = new SQL($this->app);
$sql->set_table("tmp_gel_jurnal_detail");
$sql->add_param("Kode_Rek");
$sql->add_param("DK", "K");
$sql->add_param("Jumlah", $jumlah);
$sql->add_param_unix();
$sql->add_param_userid();
$sql->add_where("Kode_Jurnal");
$sql->add_where("ID");
if ($this->mode_detail === "insert") {
$sql->add_param("Kode_Jurnal");
$sql->InsertDB();
} else if ($this->mode_detail === "update") {
$sql->UpdateDB();
} else if ($this->mode_detail === "delete") {
$sql->DeleteDB();
}
}
$tsql = ''; $asql = [$this->kode_jurnal, "K"]; $qtabel = "gel_jurnal_detail";
if (in_array($this->mode, ["add","edit"])) {
if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); }
$qtabel = "tmp_gel_jurnal_detail";
}
$obj = new Table($this->app);
$obj->set_table("(SELECT * FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql.") D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek)", "D.*,-D.Jumlah Jumlah2,A.Nama_Rek", "", $asql);
$obj->set_footer("SUM(-Jumlah) Jumlah2, COUNT(*) Kode_Rek");
$obj->add_field("ID", "ID", "hid");
$obj->add_field("Kode_Rek", "Kode", "c", "", "records");
$obj->add_field("Nama_Rek", "Rekening Kredit", "awr");
$obj->add_field("Jumlah2", "Jumlah", "r", "kurung", "kurung");
$obj->set_field_order("Kode_Rek", "A");
if (in_array($this->mode, ["add","edit"])) {
$obj->add_row_btn("clipboard", "Ubah", "GELTerimaJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "GELTerimaJS.detail_hapus", "Unix", $this->app->user()->unix());
$obj->set_func_btn("GELTerimaJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Rekening');
$obj->set_func_btn("GELTerimaJS.rek_brow", '<i class="bi-table me-1"></i> Browse');
}
$nitems = (int) $this->db->fetchField("SELECT COUNT(*) FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql, $asql) ?? 0;
$this->app->json([ $obj->json_table("divDetailTabel"), ['type'=>"form", 'id'=>"Total_Item", 'value'=>$nitems] ]);
}
public function brow_tx() {
$tcari = Param::Get("Cari_TX");
$tsql = 'TipeID=2'; $asql = [];
if (!empty($tcari)) {
$tsql .= " AND CONCAT(Kode_Jurnal,DATE_FORMAT(Tanggal,'%d-%m-%Y'),Kode_Ref,Catatan) LIKE ?";
$asql[] = '%' . $tcari . '%';
}
$obj = new Table($this->app);
$obj->set_table("gel_jurnal", "*", $tsql, $asql);
$obj->add_field("Kode_Jurnal", "Kode Jurnal", "c");
$obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl");
$obj->add_field("Kode_Ref", "Kode Ref.", "l");
$obj->add_field("Catatan", "Deskripsi", "awr");
$obj->set_field_order("Kode_Jurnal", "D");
$obj->set_func_select("GELTerimaJS.tx_select");
$this->app->json([ $obj->db_table("divBrowTX") ]);
}
public function brow_rek() {
$tcari = Param::Get("Cari_Rek");
$tsql = 'Aktif=1 AND Mode="D"'; $asql = [];
if (!empty($tcari)) {
$tsql .= " AND CONCAT(Kode_Rek,Nama_Rek) LIKE ?";
$asql[] = '%' . $tcari . '%';
}
$obj = new Table($this->app);
$obj->set_table("gel_acc", "*", $tsql, $asql);
$obj->add_field("Kode_Rek", "Kode", "c");
$obj->add_field("Nama_Rek", "Nama Rekening", "awr");
$obj->add_field("Level", "Level", "c");
$obj->set_field_order("Kode_Rek", "A");
$obj->set_func_select("GELTerimaJS.rek_select");
$this->app->json([ $obj->db_table("divBrowRek") ]);
}
public function auto_rek() {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$stat = $this->db->runQuery("SELECT Kode_Rek,Nama_Rek,CONCAT(Kode_Rek,' - ',Nama_Rek) Nama_Lengkap FROM gel_acc WHERE Aktif=1 AND Mode='D' AND CONCAT(Kode_Rek,Nama_Rek) LIKE ? ORDER BY Kode_Rek LIMIT 50", ['%'.$tcari.'%']);
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
$ajson['autodata'][] = ['value'=>$row['Kode_Rek'], 'text'=>$row['Nama_Rek'], 'html'=>'<span class="text-primary">'.$row['Kode_Rek'].'</span> '.$row['Nama_Rek'], 'data'=>"", 'bc'=>0];
}
$this->app->json($ajson);
}
public function form_master() {
$ajson = [ 'error'=>"", 'html'=>"" ];
$atabel = [ 'Kode_Jurnal'=>"", 'CabID'=>$this->id_cab, 'Kode_Ref'=>"", 'Tanggal'=>tgl_ymd(), 'Kode_Kas'=>"", 'Catatan'=>"" ];
if ($this->mode === "add") {
$atabel['Kode_Jurnal'] = "GT-BARU#".(string) $this->web_app['SERVER_ID']. $this->app->user()->id(3);
$atabel['Tanggal'] = tgl_ymd();
$atabel['Kode_Kas'] = $this->app_gel['KAS_TUNAI'];
$this->kode_jurnal = "";
} else if ($this->mode === "edit") {
$this->gel->Detail_Copy($this->kode_jurnal);
} else if ($this->mode === "save") {
$no_lama = $this->kode_jurnal;
$tgl_jurn = Param::Get("Tanggal");
$b_baru = str_contains($no_lama, "BARU");
if ($b_baru) $this->kode_jurnal = $this->gel->Jurnal_Baru($this->id_cab, $tgl_jurn, true);
$kode_kas = Param::Get("Kode_Kas");
$this->db->runQuery("DELETE FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal='".$no_lama."' AND LEFT(Kode_Rek,1)='1' AND DK='D'");
$ntot_kas = $this->db->fetchField("SELECT SUM(-Jumlah) FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal='".$no_lama."' AND Unix='".$this->app->user()->unix()."'") ?? 0;
$this->db->insert("tmp_gel_jurnal_detail", [ 'Kode_Jurnal'=>$no_lama, 'Kode_Rek'=>$kode_kas, 'DK'=>'D', 'Jumlah'=>$ntot_kas,'Unix'=>$this->app->user()->unix(), 'UserID'=>$this->app->user()->id() ]);
$this->gel->Detail_Save($this->kode_jurnal, 2, $this->id_cab, $tgl_jurn, $b_baru, $no_lama);
$this->gel->Jurnal_Save($this->kode_jurnal, 2, $this->id_cab, $tgl_jurn, Param::Get("Kode_Ref"), Param::Get("Catatan"));
$atabel['Tanggal'] = $tgl_jurn;
$this->mode = "view";
} else if ($this->mode === "cancel") {
$this->gel->Detail_Cancel($this->kode_jurnal);
$this->mode = "view";
$this->kode_jurnal = "";
}
if (!empty($this->kode_jurnal) && $this->mode !== "cancel") {
$row = $this->db->fetchRow("SELECT * FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."' AND TipeID=2");
if ($row) {
$atabel = $row;
$atabel['Kode_Kas'] = $this->db->fetchField("SELECT Kode_Rek FROM gel_jurnal_detail WHERE Kode_Jurnal='".$atabel['Kode_Jurnal']."' AND DK='D' LIMIT 1") ?? '';
} else {
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
}
}
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
$form = new Form($this->app);
$tkode = $form->textbox("_", "Kode_Jurnal", $atabel['Kode_Jurnal'], !$enable, false, "text", "kode jurnal");
$tref = $form->textbox("_", "Kode_Ref", $atabel['Kode_Ref'], $enable, false, "text", "kode referensi");
$ttgl = $form->datebox("_", "Tanggal", $atabel['Tanggal'], $enable, false);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID");
$tkas = $form->option_db("_", "Kode_Kas", $atabel['Kode_Kas'], $enable, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek");
$tcatat = $form->textbox("_", "Catatan", stripslashes($atabel['Catatan']), $enable, false, "text", "catatan jurnal");
$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="Kode_Jurnal">Kode Jurnal</label>
<div class="col-sm-7 col-lg-7"><div class="input-group">'.$tkode.'<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="Tanggal">Tanggal Jurnal</label>
<div class="col-sm-7 col-lg-5">'.$ttgl.'</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="Kode_Ref">Kode Ref.</label>
<div class="col">'.$tref.'</div>
</div>
</div>
</div>
<div class="row mb-1">
<label class="col-sm-3 col-lg-2 col-form-label" for="Catatan" style="width:12.5%;">Deskripsi</label>
<div class="col">'.$tcatat.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-3 col-lg-2 col-form-label" for="Kode_Kas" style="width:12.5%;">Rekening Debit</label>
<div class="col-sm-7 col-lg-6">'.$tkas.'</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="Total_Item" value="0" >
<input type="hidden" id="mode" value="'.$this->mode.'" >';
$this->app->json($ajson);
}
public function form_rek() {
$id = (int) Param::Get("ID", 0);
$atabel = [ 'ID'=>$id, 'Kode_Rek'=>$this->kode_rek, 'Nama_Rek'=>"", 'Jumlah'=>0 ];
if ($id > 0) {
$atabel = $this->db->fetchRow("SELECT * FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal=? AND ID=?", [$this->kode_jurnal, $id]);
}
if (!empty($atabel['Kode_Rek'])) {
$atabel['Nama_Rek'] = $this->db->fetchField("SELECT Nama_Rek FROM gel_acc WHERE Kode_Rek=?", [$atabel['Kode_Rek']]) ?? '';
}
$form = new Form($this->app);
$tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], false, false, "text");
$tnama = $form->textauto("_", "Nama_Rek", ['value'=>$atabel['Kode_Rek'],'text'=>$atabel['Nama_Rek']], true, true, "ketik kode / nama rekening");
$tjumlah = $form->textbox("_", "Jumlah", abs($atabel['Jumlah']), true, true, "double");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Kode Rekening</label>
<div class="col-sm-4 col-lg-3">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Rek">Nama Rekening</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Jumlah">Jumlah (Rp.)</label>
<div class="col-sm-4 col-lg-5">'.$tjumlah.'</div>
</div>
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
$this->app->json($ajson);
}
public function proses_hapus() {
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."'");
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal='".$this->kode_jurnal."'");
$this->app->json([ 'status' => true ]);
}
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>Jurnal Penerimaan Kas / Bank</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-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-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">&nbsp;</div>
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>'
]);
}
}