add more BE file from server

This commit is contained in:
2026-05-06 16:48:09 +07:00
parent 55c6ed9779
commit bf0cc4af84
54 changed files with 35583 additions and 0 deletions

View File

@@ -0,0 +1,694 @@
<?php
class Journalterimabarang extends MY_Controller
{
var $db;
public function index()
{
echo "API JURNAL PENERIMAAN BARANG";
}
public function __construct()
{
parent::__construct();
}
/* DIPAKAI FE */
public function getTipeJurnal()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$sql = "SELECT
*
FROM jurnal_type
WHERE JurnalTypeIsActive = 'Y'";
$qry = $this->db->query($sql, []);
if (!$qry) {
$this->sys_error_db("getTipeJurnal: ", $this->db);
exit;
}
$rst = $qry->result_array();
foreach ($rst as $key => $value) {
if ($value['JurnalTypeCode'] == 'GOODRECEIVE') {
$default = $value;
}
}
$this->sys_ok([
"default" => $default,
"records" => $rst
]);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function getPeriode()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$search = '%' . $prm['search'] . '%';
$sql = "SELECT
CONCAT(periodeYear, ' - ', periodeName) as displayPeriode,
CONCAT(DATE_FORMAT(periodeStartDate, '%d %M %Y'), ' - ', DATE_FORMAT(periodeEndDate, '%d %M %Y')) as periode,
periode.*
FROM periode
WHERE periodeIsActive = 'Y'
AND periodeIsClosed = 'N'
AND CONCAT(periodeYear, ' - ', periodeName) LIKE ?
LIMIT 70
";
$qry = $this->db->query($sql, [$search]);
if (!$qry) {
$this->sys_error_db("Error get periode", $this->db);
exit;
}
$data = $qry->result_array();
$this->sys_ok($data);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function getSupplier()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$search = '%%';
if (isset($prm['search'])) {
$search = trim($prm["search"]);
if ($search != "") {
$search = '%' . $search . '%';
} else {
$search = '%%';
}
}
$sql = "SELECT
CONCAT(SupplierCode, ' - ', SupplierName) as displaySupplier,
supplier.*
FROM supplier
WHERE SupplierIsActive = 'Y'
AND CONCAT(SupplierCode, ' - ', SupplierName) LIKE ?";
$qry = $this->db->query($sql, [$search]);
if (!$qry) {
$this->sys_error_db("select supplier", $this->db);
exit;
}
$rst = $qry->result_array();
$this->sys_ok($rst);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function getCoa()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$search = "";
if (isset($prm['search'])) {
$search = trim($prm["search"]);
if ($search != "") {
$search = '%' . $prm['search'] . '%';
} else {
$search = '%%';
}
}
$limit = 70; // dihapus jika perlu tampil semua
$sql = "SELECT
*
FROM coa
WHERE coaIsActive = 'Y'
-- AND coaIsInput = 'Y' -- TODO: uncomment setelah diinject
AND coaAccountNo != ''
AND (coaDescription LIKE ? OR coaSubDescription LIKE ? OR coaAccountNo LIKE ?)
ORDER BY coaAccountNo ASC
LIMIT ?";
$qry = $this->db->query($sql, [$search, $search, $search, $limit]);
if ($qry) {
$rows = $qry->result_array();
} else {
$this->db->trans_rollback();
$this->sys_error_db("select coa", $this->db);
exit;
}
$result = array(
"records" => $rows,
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function createJurnal()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
// Get Parameter
$userID = $this->sys_user["M_UserID"];
$prm = $this->sys_input;
$jurnalTypeID = $prm['jurnalType'] ?? 2; // Harusnya 2 : GOODRECEIVE
$details = $prm['details'];
// TODO: Dihapus jika sudah ada M_BranchCode di parameter
$sql = "SELECT M_BranchCode FROM m_branch WHERE M_BranchID = ?";
$qry = $this->db->query($sql, [$prm['M_BranchID']]);
if (!$qry) {
$this->sys_error_db("Failed to get branch code", $this->db);
exit;
}
$rst = $qry->row();
$branchCode = $rst->M_BranchCode;
$sql = "SELECT `fn_numbering`('J') as jurnalNo";
$qry = $this->db->query($sql, []);
if (!$qry) {
$this->sys_error_db("Failed to get jurnal number", $this->db);
exit;
}
$rst = $qry->row();
$jurnalNo = $rst->jurnalNo;
// Start Transaction
$this->db->trans_start();
$sqlHeader = "INSERT INTO jurnal
(jurnalM_BranchCompanyID, JurnalS_RegionalID, jurnalM_BranchCode,
jurnalperiodeID, jurnalNo, jurnalTitle,
jurnalDescription, jurnalDate, jurnalJurnalTypeID,
jurnalM_UserID, jurnalCreated)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())";
$this->db->query($sqlHeader, [
$prm['M_BranchCompanyID'],
$prm['S_RegionalID'],
$branchCode,
$prm['periodeID'],
$jurnalNo,
$prm['jurnalTitle'],
$prm['jurnalDescription'],
$prm['jurnalDate'],
$jurnalTypeID,
$userID
]);
$jurnalID = $this->db->insert_id();
foreach ($details as $detail) {
$this->createFormDetail($detail, $jurnalID); // Child Transaction
}
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
$this->sys_error_db('Failed to create jurnal: ', $this->db);
exit;
} else {
$this->sys_ok("Berhasil simpan jurnal");
}
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function deleteJurnal()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$jurnalID = $prm['jurnalID'];
$userID = $this->sys_user["M_UserID"];
$sql = "SELECT jurnalIsPosted FROM jurnal WHERE jurnalID = ?";
$isPosted = $this->db->query($sql, [$jurnalID])->row()->jurnalIsPosted ?? null;
if (!$isPosted) {
$this->sys_error_db("Failed to get jurnalIsPosted", $this->db);
exit;
}
if ($isPosted == 'Y') {
$this->sys_error("Jurnal sudah diposting, tidak bisa dihapus");
exit;
}
// Start Transaction
$this->db->trans_start();
// 1. Update jurnal where jurnalID = ?
$this->db->set('jurnalIsActive', 'N');
$this->db->set('jurnalLastUpdated', 'NOW()', FALSE);
$this->db->set('jurnalM_UserID', $userID);
$this->db->where('jurnalID', $jurnalID);
$this->db->update('jurnal');
// 2. Update jurnal_tx where jurnalTxJurnalID = ?
$this->db->set('jurnalTxIsActive', 'N');
$this->db->set('jurnalTxLastUpdated', 'NOW()', FALSE);
$this->db->set('jurnalTxM_UserID', $userID);
$this->db->where('jurnalTxJurnalID', $jurnalID);
$this->db->update('jurnal_tx');
// 3. Update jurnal_addon where jurnalAddOnJurnalID = ?
$this->db->set('jurnalAddOnIsActive', 'N');
$this->db->set('jurnalAddOnLastUpdated', 'NOW()', FALSE);
$this->db->set('jurnalAddOnLastUpdatedUserID', $userID);
$this->db->where('jurnalAddOnJurnalID', $jurnalID);
$this->db->update('jurnal_addon');
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
$this->sys_error_db('Failed to delete jurnal: ', $this->db);
exit;
} else {
$this->sys_ok("Berhasil hapus jurnal");
}
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
// TODO: Mungkin ini nanti bisa lebih efektif untuk addOns
public function loadEditDialog()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
// Get jurnal, jurnal_tx, and jurnal_addon by jurnalID
$sql = "SELECT jurnalID, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription,
DATE_FORMAT(jurnalDate, '%Y-%m-%d') as jurnalDate, jurnalIsPosted,
M_BranchCompanyName, S_RegionalName, M_BranchName,
M_BranchCompanyID, S_RegionalID, M_BranchID,
JurnalTypeID,
JurnalTypeCode,
JurnalTypeName,
JurnalTypeAccesRight
FROM jurnal
JOIN m_branch ON jurnalM_BranchCode = M_BranchCode AND M_BranchIsActive = 'Y'
JOIN s_regional ON JurnalS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y'
JOIN m_branch_company ON jurnalM_BranchCompanyID = M_BranchCompanyID AND M_BranchCompanyIsActive = 'Y'
JOIN jurnal_type ON jurnalJurnalTypeID = JurnalTypeID AND JurnalTypeIsActive = 'Y'
WHERE jurnalID = ? AND jurnalIsActive = 'Y'";
$qryj = $this->db->query($sql, [$prm['jurnalID']]);
if (!$qryj) {
$this->sys_error_db("Failed to get jurnal", $this->db);
exit;
}
$jurnal = $qryj->row_array();
if ($jurnal == null) {
$this->sys_error("JurnalID: " . $prm['jurnalID'] . " tidak ditemukan");
exit;
}
$result['jurnalHead'] = $jurnal;
// Get Selected Periode
$sql = "SELECT
CONCAT(periodeYear, ' - ', periodeName) as displayPeriode,
CONCAT(DATE_FORMAT(periodeStartDate, '%d %M %Y'), ' - ', DATE_FORMAT(periodeEndDate, '%d %M %Y')) as periode,
periode.*
FROM jurnal
JOIN periode ON jurnalperiodeID = periodeID AND periodeIsActive = 'Y' AND periodeIsClosed = 'N'
WHERE jurnalID = ? AND jurnalIsActive = 'Y'";
$periode = $this->db->query($sql, [$prm['jurnalID']])->row_array();
if (!$periode) {
$this->sys_error_db("Failed to get periode", $this->db);
exit;
}
$result['periode'] = $periode;
// Get suppliercode and grni/invoice code result object
$sql = "SELECT * FROM jurnal_addon WHERE jurnalAddOnJurnalID = ? AND jurnalAddOnIsActive = 'Y'";
$qryaddon = $this->db->query($sql, [$prm['jurnalID']]);
if (!$qryaddon) {
$this->sys_error_db("Failed to get jurnal_addon", $this->db);
exit;
}
$addon = $qryaddon->result_array();
foreach ($addon as $key => $value) {
$result['jurnalHead'][$value['jurnalAddOnCode']] = $value['jurnalAddOnValue'];
if ($value['jurnalAddOnCode'] == 'SUPCD') {
$supcd = $value['jurnalAddOnValue'];
}
}
// Get supplier
$sql = "SELECT
CONCAT(SupplierCode, ' - ', SupplierName) as displaySupplier,
supplier.*
FROM supplier WHERE SupplierCode = ? AND SupplierIsActive = 'Y'";
$qrysupplier = $this->db->query($sql, [$supcd]);
if (!$qrysupplier) {
$this->sys_error_db("Failed to get supplier", $this->db);
exit;
}
$supplier = $qrysupplier->row_array();
$result['supplier'] = $supplier;
$txsql = "SELECT jurnalTxID, jurnalTxCoaID as coaID, jurnalTxDescription as coaDescription,
jurnalTxDebit, jurnalTxCredit, coaAccountNo
FROM jurnal_tx
JOIN coa ON jurnalTxCoaID = coaID
WHERE jurnalTxJurnalID = ? AND jurnalTxIsActive = 'Y'";
$qrytx = $this->db->query($txsql, [$prm['jurnalID']]);
if (!$qrytx) {
$this->sys_error_db("Failed to get jurnal tx", $this->db);
exit;
}
$tx = $qrytx->result_array();
$result['details'] = $tx;
foreach ($result['details'] as $key => $value) {
if ($value['jurnalTxCredit'] > 0) {
$addonsql = "SELECT jurnalAddOnID, jurnalAddOnCode, jurnalAddOnValue FROM jurnal_addon WHERE jurnalAddOnJurnalTxID = ? AND jurnalAddOnIsActive = 'Y'";
$qryaddon = $this->db->query($addonsql, [$value['jurnalTxID']]);
if (!$qryaddon) {
$this->sys_error_db("Failed to get jurnal_addon", $this->db);
exit;
}
$addon = $qryaddon->result_array();
$result['details'][$key]['addOns'] = $addon;
}
}
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function updateJurnal()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userID = $this->sys_user["M_UserID"];
$jurnalID = $prm['jurnalID'];
$details = $prm['details'];
$sql = "SELECT jurnalIsPosted FROM jurnal WHERE jurnalID = ?";
$isPosted = $this->db->query($sql, [$jurnalID])->row()->jurnalIsPosted ?? null;
if (!$isPosted) {
$this->sys_error_db("Failed to get jurnalIsPosted", $this->db);
exit;
}
if ($isPosted == 'Y') {
$this->sys_error("Jurnal sudah diposting, tidak bisa diubah");
exit;
}
// Start Transaction
$this->db->trans_start();
// 1. Update jurnal
$sql = "UPDATE jurnal
SET jurnalDate = ?, jurnalperiodeID = ?,
jurnalTitle = ?, jurnalDescription = ?,
jurnalLastUpdated = NOW(), jurnalM_UserID = ?
WHERE jurnalID = ?";
$qry = $this->db->query($sql, [$prm['jurnalDate'], $prm['periodeID'], $prm['jurnalTitle'], $prm['jurnalDescription'], $userID, $jurnalID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Failed to update jurnal", $this->db);
exit;
}
// 2. Soft delete semua existing jurnal_tx and jurnal_addon where jurnalID = ?
$tx = "UPDATE jurnal_tx SET jurnalTxIsActive = 'N' WHERE jurnalTxJurnalID = ?";
$qrytx = $this->db->query($tx, [$jurnalID]);
if (!$qrytx) {
$this->db->trans_rollback();
$this->sys_error_db("Failed to update jurnal", $this->db);
exit;
}
$addon = "UPDATE jurnal_addon SET jurnalAddOnIsActive = 'N' WHERE jurnalAddOnJurnalID = ?";
$qryaddon = $this->db->query($addon, [$jurnalID]);
if (!$qryaddon) {
$this->db->trans_rollback();
$this->sys_error_db("Failed to update jurnal", $this->db);
exit;
}
// 3. Insert new jurnal_tx and jurnal_addon records
foreach ($details as $detail) {
$this->createFormDetail($detail, $jurnalID);
}
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
$this->sys_error_db('Failed to update jurnal: ', $this->db);
exit;
} else {
$this->sys_ok("Berhasil update jurnal");
}
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
//* --- bandingkan dulu baru hapus ---
public function updateJurnalV2()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userID = $this->sys_user["M_UserID"];
$jurnalID = $prm['jurnalID'];
$details = $prm['details'];
$sql = "SELECT jurnalIsPosted FROM jurnal WHERE jurnalID = ?";
$isPosted = $this->db->query($sql, [$jurnalID])->row()->jurnalIsPosted ?? null;
if (!$isPosted) {
$this->sys_error_db("Failed to get jurnalIsPosted", $this->db);
exit;
}
if ($isPosted == 'Y') {
$this->sys_error("Jurnal sudah diposting, tidak bisa diubah");
exit;
}
// Start Transaction
$this->db->trans_start();
// 1. Update jurnal
$sql = "UPDATE jurnal
SET jurnalDate = ?, jurnalperiodeID = ?,
jurnalTitle = ?, jurnalDescription = ?,
jurnalLastUpdated = NOW(), jurnalM_UserID = ?
WHERE jurnalID = ?";
$qry = $this->db->query($sql, [$prm['jurnalDate'], $prm['periodeID'], $prm['jurnalTitle'], $prm['jurnalDescription'], $userID, $jurnalID]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Failed to update jurnal", $this->db);
exit;
}
// 2. Ambil data existing jurnal_tx and jurnal_addon where jurnalID = ?
$tx = "SELECT * FROM jurnal_tx WHERE jurnalTxJurnalID = ? AND jurnalTxIsActive = 'Y'";
$oldTx = $this->db->query($tx, [$jurnalID])->result_array() ?? null;
if (!$oldTx) {
$this->sys_error_db("Failed to get jurnalTx", $this->db);
exit;
}
// 3. Bandingin data jurnalTx: coaAccountNo, jurnalTxDebit, jurnalTxCredit
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function diffJurnalTx()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$jurnalID = $prm['jurnalID'];
$details = $prm['details'];
$tx = "SELECT * FROM jurnal_tx WHERE jurnalTxJurnalID = ? AND jurnalTxIsActive = 'Y'";
$oldTx = $this->db->query($tx, [$jurnalID])->result_array() ?? null;
if (!$oldTx) {
$this->sys_error_db("Failed to get jurnalTx", $this->db);
exit;
}
var_dump($oldTx);
var_dump($details);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
/*
* --- HELPER FUNCTION --- *
*/
private function createFormDetail($prm, $jurnalID)
{
$userid = $this->sys_user["M_UserID"];
$coaID = $prm['coaID'];
$jurnalTxDescription = $prm['coaDescription'];
$jurnalTxDebit = $prm['jurnalTxDebit'];
$jurnalTxCredit = $prm['jurnalTxCredit'];
$addOns = $prm['addOns']; // array
// Validasi debit dan kredit
if ($jurnalTxCredit == 0 && $jurnalTxDebit > 0) {
$isDebit = true;
$isCredit = false;
} else if ($jurnalTxDebit == 0 && $jurnalTxCredit > 0) {
$isDebit = false;
$isCredit = true;
} else {
$isDebit = false;
$isCredit = false;
$this->sys_error("Debit atau Kredit harus diisi");
exit;
}
if ($isDebit && $isCredit) {
$this->sys_error("Debit dan Kredit tidak boleh diisi bersamaan");
exit;
}
// Jika kredit, maka masuk ke jurnal_tx dan jurnal_addon
else if ($isCredit && !$isDebit) {
$insertTx = "INSERT INTO jurnal_tx
(jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxCredit,
jurnalTxIsActive, jurnalTxCreated, jurnalTxLastUpdated, jurnalTxM_UserID)
VALUES (?, ?, ?, ?, 'Y', NOW(), NOW(), ?)";
$insertAddOn = "INSERT INTO jurnal_addon
(jurnalAddOnJurnalID, jurnalAddOnJurnalTxID,
jurnalAddOnCode,
jurnalAddOnValue,
jurnalAddOnIsActive, jurnalAddOnCreated,
jurnalAddOnCreatedUserID, jurnalAddOnLastUpdated, jurnalAddOnLastUpdatedUserID)
VALUES (?, ?, ?, ?, 'Y', NOW(), ?, NOW(), ?)";
// Ikut parents transaction agar rollbacknya bisa langsung semua
$insertTxCr = $this->db->query($insertTx, [$jurnalID, $coaID, $jurnalTxDescription, $jurnalTxCredit, $userid]);
if (!$insertTxCr) {
$this->db->trans_rollback();
$this->sys_error_db("Failed Insert JurnalTx Credit", $this->db);
exit;
}
$getTxId = $this->db->insert_id();
// Insert jurnalAddOn 1 kredit bisa ada 2-3 addOn
foreach ($addOns as $item) {
$addOnState = $this->db->query($insertAddOn, [$jurnalID, $getTxId, $item['jurnalAddOnCode'], $item['jurnalAddOnValue'], $userid, $userid]);
if (!$addOnState) {
$this->db->trans_rollback();
$this->sys_error_db("Failed Insert JurnalAddOn Credit", $this->db);
exit;
}
}
}
// Jika debit maka hanya masuk ke jurnal_tx
else if ($isDebit && !$isCredit) {
$sql = "INSERT INTO jurnal_tx
(jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit,
jurnalTxIsActive, jurnalTxCreated, jurnalTxLastUpdated, jurnalTxM_UserID)
VALUES (?, ?, ?, ?, 'Y', NOW(), NOW(), ?)";
$qry = $this->db->query($sql, [$jurnalID, $coaID, $jurnalTxDescription, $jurnalTxDebit, $userid]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Failed Insert JurnalTx Debit", $this->db);
exit;
}
} else {
$this->sys_error("Debit atau Kredit harus diisi");
exit;
}
}
public function getListFormDetail()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$jurnalID = $this->sys_input['jurnalID'];
$sql = "SELECT * FROM jurnal_tx
WHERE jurnalTxJurnalID = ?
AND jurnalTxIsActive = 'Y'";
$qry = $this->db->query($sql, [$jurnalID]);
if (!$qry) {
$this->sys_error_db("select jurnal_tx", $this->db);
exit;
}
$rst = $qry->result_array();
$this->sys_ok($rst);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
}