Files
be-accone/application/controllers/mockup/purchase/receivesuratjalan/ReceiveSuratJalan_old.php

2149 lines
89 KiB
PHP

<?php
class ReceiveSuratJalan extends MY_Controller
{
var $db;
public function index()
{
echo "Receive Surat Jalan API";
}
public function __construct()
{
parent::__construct();
}
public function LookupEkspedisi()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$type = $para['isInternal'];
$name = "%";
if ($para['expdName'] != "") {
$name = $para['expdName'] . "%";
}
$sqlexp = "SELECT
ExpeditionID,
ExpeditionName,
ExpeditionIsInternal
FROM expedition
WHERE ExpeditionIsActive = 'Y'
AND ExpeditionIsInternal = ?
AND ExpeditionName LIKE ?";
$qryexp = $this->db->query($sqlexp, [$type, $name]);
if (!$qryexp) {
$this->sys_error_db("error get listing expedition");
exit;
}
$result = array(
"records" => $qryexp->result_array(),
"total" => sizeof($qryexp->result_array())
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function LookupEkspedisiStaff()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$expID = $para['expID'];
$name = "%";
if ($para['staffName'] != "") {
$name = $para['staffName'] . "%";
}
$sqlexp = "SELECT
ExpeditionStaffID,
ExpeditionStaffName,
ExpeditionStaffMobile
FROM expeditionstaff
WHERE ExpeditionStaffIsActive = 'Y'
AND ExpeditionStaffExpeditionID = ?
AND ExpeditionStaffName LIKE ?";
$qryexp = $this->db->query($sqlexp, [$expID, $name]);
if (!$qryexp) {
$this->sys_error_db("error get listing expedition staff");
exit;
}
$result = array(
"records" => $qryexp->result_array(),
"total" => sizeof($qryexp->result_array())
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function SaveReciveSJ()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$mustFields = ['suratJalanID', 'goodTransferID', 'warehouseID'];
$missFields = [];
foreach ($mustFields as $field) {
if (empty($para[$field])) {
$missFields[] = $field;
}
}
if (!empty($missFields)) {
$this->sys_error("Missing fields: " . implode(", ", $missFields));
exit;
}
$this->db->trans_begin();
// query update surat jalan
$sqlSJ = "UPDATE suratjalan
SET SuratJalanStatus = 'Completed',
SuratJalanReceivedDate = NOW(),
SuratJalanReceivedUserID = ?,
SuratJalanReceivedNote = ?,
SuratJalanReceivedWarehouseID = ?,
SuratJalanLastUpdated = NOW(),
SuratJalanUserID = ?
WHERE SuratJalanID = ?";
$qrySJ = $this->db->query($sqlSJ, [
$userId,
$para['notereceive'],
$para['warehouseID'],
$userId,
$para['suratJalanID']
]);
if (!$qrySJ) {
$this->db->trans_rollback();
$this->sys_error_db("error update surat jalan", $this->db);
exit;
}
// query untuk penerimaan qty
if (count($para['detailsj']) > 0) {
foreach ($para['detailsj'] as $k => $v) {
$sqldetail = "UPDATE suratjalan_detail SET
SuratJalanDetailQtyReceived = ?,
SuratJalanDetailLastUpdated = NOW(),
SuratJalanDetailUserID = ?
WHERE SuratJalanDetailID = ?";
$qrydetail = $this->db->query($sqldetail, [
intval($v['SuratJalanDetailQtyReceived']),
$userId,
$v['SuratJalanDetailID']
]);
if (!$qrydetail) {
$this->db->trans_rollback();
$this->sys_error_db("error update surat jalan detail", $this->db);
exit;
}
}
}
// query update transfer request
$sqlTransfer = "UPDATE t_goods_transfer
SET T_GoodsTransferStatus = 'Completed',
T_GoodsTransferLastUpdated = NOW(),
T_GoodsTransferM_UserID = ?
WHERE T_GoodsTransferID = ?";
$qryTransfer = $this->db->query($sqlTransfer, [
$userId,
$para['goodTransferID']
]);
if (!$qryTransfer) {
$this->db->trans_rollback();
$this->sys_error_db("error update transfer barang", $this->db);
}
// query untuk mendapatakan data suratjalan detail
$sqlDetail = "SELECT SuratJalanDetailID,
SuratJalanDetailSuratJalanID,
SuratJalanDetailPurchaseRequestFlagID,
SuratJalanDetailM_ItemID,
SuratJalanDetailQtyReceived,
S_RegionalID,
M_BranchID,
M_BranchCode,
M_BranchName,
SuratJalanDetailT_GoodsTransferDetailID,
WarehouseID,
stock.*
FROM suratjalan_detail
JOIN suratjalan ON SuratJalanDetailSuratJalanID = SuratJalanID
AND SuratJalanIsActive = 'Y'
JOIN t_goods_transfer ON SuratJalanT_GoodsTransferID = T_GoodsTransferID
AND T_GoodsTransferIsActive = 'Y'
JOIN m_branch ON T_GoodsTransferToM_BranchCode = M_BranchCode
AND M_BranchIsActive = 'Y'
JOIN s_regional ON M_BranchS_RegionalID = S_RegionalID
AND S_RegionalIsActive = 'Y'
JOIN m_item ON M_ItemID = SuratJalanDetailM_ItemID
AND M_ItemIsActive = 'Y'
JOIN stock ON StockItemID = M_ItemID
JOIN warehouse ON StockWarehouseID = WarehouseID
AND WarehouseIsTransit = 'Y'
AND WarehouseIsActive = 'Y'
WHERE SuratJalanDetailIsActive = 'Y'
AND SuratJalanDetailSuratJalanID = ?";
$qry_flag = $this->db->query($sqlDetail, [$para['suratJalanID']]);
if (!$qry_flag) {
$this->db->trans_rollback();
$this->sys_error_db("select surat jalan detail error", $this->db);
exit;
}
$rowsDetailSJ = $qry_flag->result_array();
// print_r($rowsDetailSJ);
foreach ($rowsDetailSJ as $k => $v) {
// update stock warehouse transit
$updsto = "UPDATE stock
SET StockQty = 0
WHERE StockID = ?
AND StockWarehouseID = ?";
$qrysto = $this->db->query($updsto, [
$v['StockID'],
$v['WarehouseID']
]);
if (!$qrysto) {
$this->db->trans_rollback();
$this->sys_error_db("update stock qty");
exit;
}
// insert into stocklog
$slog = "INSERT INTO stocklog (
StockLogWarehouseID,
StockLogDateTime,
StockLogItemID,
StockLogItemUnitID,
StockLogStockNumber,
StockLogBatchNo,
StockLogED,
StockLogReffID,
StockLogStatus,
StockLogQty,
StockLogUserID
) VALUES (?,NOW(),?,?,?,?,?,?,?,?,?)";
$qlog = $this->db->query($slog, [
$v['WarehouseID'],
$v['StockItemID'],
$v['StockItemUnitID'],
$v['StockStockNumber'],
$v['StockBatchNo'],
$v['StockED'],
$v['SuratJalanDetailT_GoodsTransferDetailID'],
"TTW",
$v['SuratJalanDetailQtyReceived'],
$userId,
]);
if (!$qlog) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert stocklog");
exit;
}
// Query untuk mendapatkan data purchase request flag
$sql_select = "SELECT
PurchaseRequestFlagID,
PurchaseRequestFlagQtyRest,
PurchaseRequestFlagPurchaseRequestDetailID
FROM purchase_request_flag
WHERE PurchaseRequestFlagID = ?";
$qry_select = $this->db->query($sql_select, [$v["SuratJalanDetailPurchaseRequestFlagID"]]);
if (!$qry_select) {
$this->db->trans_rollback();
$this->sys_error_db("select purchase flag error", $this->db);
exit;
}
$rows_flag = $qry_select->result_array();
// print_r($rows_flag);
// exit;
foreach ($rows_flag as $flag) {
$purchaseRequestFlagQtyRest = intval($flag['PurchaseRequestFlagQtyRest']);
$suratJalanDetailQtyReceived = intval($v['SuratJalanDetailQtyReceived']);
// Validasi sebelum update
if ($suratJalanDetailQtyReceived > $purchaseRequestFlagQtyRest) {
$this->db->trans_rollback();
$this->sys_error_db("Qty received melebihi qty rest", $this->db);
exit;
}
$newQtyRest = $purchaseRequestFlagQtyRest - $suratJalanDetailQtyReceived;
// Update purchase request flag
$sql = "UPDATE purchase_request_flag SET
PurchaseRequestFlagQtyProses = 0,
PurchaseRequestFlagQtyRest = ?,
PurchaseRequestFlagUserID = ?,
PurchaseRequestFlagLastUpdated = NOW()
WHERE PurchaseRequestFlagID = ?";
$qry = $this->db->query($sql, [
$newQtyRest,
$userId,
$flag['PurchaseRequestFlagID']
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("update flag error", $this->db);
exit;
}
// cari PRID untuk update purchase request
$sqlpr_detail = "SELECT PurchaseRequestDetailID,
PurchaseRequestDetailPurchaseRequestID,
PurchaseRequestDetailStatus,
PurchaseRequestDetailQty
FROM purchase_request_detail
WHERE PurchaseRequestDetailID = ?
AND PurchaseRequestDetailIsActive = 'Y'";
$qrypr_detail = $this->db->query($sqlpr_detail, $flag['PurchaseRequestFlagPurchaseRequestDetailID']);
if (!$qrypr_detail) {
$this->db->trans_rollback();
$this->sys_error_db("select purchase_request_detail error", $this->db);
exit;
}
$row_detail = $qrypr_detail->row_array();
// Menentukan status berdasarkan kondisi
$purchaseRequestStatus = 'Partial'; // Default status
if (intval($flag['PurchaseRequestFlagQtyRest']) == 0) {
$purchaseRequestStatus = 'Completed';
} elseif (intval($flag['PurchaseRequestFlagQtyRest']) < intval($row_detail["PurchaseRequestDetailQty"])) {
$purchaseRequestStatus = 'Partial';
}
// Update status purchase request hanya sekali dengan status yang sudah ditentukan
$sqlpr = "UPDATE purchase_request SET
PurchaseRequestStatus = ?,
PurchaseRequestUserID = ?,
PurchaseRequestLastUpdated = NOW()
WHERE PurchaseRequestID = ?";
$qrypr = $this->db->query($sqlpr, [
$purchaseRequestStatus,
$userId,
$row_detail["PurchaseRequestDetailPurchaseRequestID"]
]);
if (!$qrypr) {
$this->db->trans_rollback();
$this->sys_error_db("update purchase_request error", $this->db);
exit;
}
}
}
$sql_json = "SELECT suratjalan.*, '' as details
FROM suratjalan
WHERE SuratJalanIsActive = 'Y'
AND SuratJalanID = ?";
$qry_json = $this->db->query($sql_json, [$para['suratJalanID']]);
if (!$qry_json) {
$this->db->trans_rollback();
$this->sys_error_db("select json sj error");
exit;
}
$row_json = $qry_json->row_array();
$descActivity = "Simpan qty receive surat jalan No {$row_json['SuratJalanNumber']}, status {$row_json['SuratJalanStatus']}";
$sql_json_detail = "SELECT suratjalan_detail.*
FROM suratjalan_detail
WHERE SuratJalanDetailIsActive = 'Y'
AND SuratJalanDetailSuratJalanID = ?";
$qry_json_detail = $this->db->query($sql_json_detail, [$para['suratJalanID']]);
if ($qry_json_detail) {
$row_json["details"] = $qry_json_detail->result_array();
} else {
$this->sys_error_db("select detail sj error", $this->db);
exit;
}
$data_json = $row_json;
$this->insertUserActivty(
$para['suratJalanID'],
'COMPLETED',
$userId,
$descActivity,
json_encode($data_json)
);
$this->db->trans_commit();
$newUpdate = "SELECT * FROM suratjalan WHERE SuratJalanID = {$para['suratJalanID']} AND SuratJalanIsActive = 'Y'";
$records = $this->db->query($newUpdate, [])->result_array();
$result = array("records" => $records, "msg" => "success update surat jalan");
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function ConfirmSuratJalan()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$mustFields = ['suratJalanID', 'goodTransferID', 'warehouseID'];
$missFields = [];
foreach ($mustFields as $field) {
if (empty($para[$field])) {
$missFields[] = $field;
}
}
if (!empty($missFields)) {
$this->sys_error("Missing fields: " . implode(", ", $missFields));
exit;
}
$this->db->trans_begin();
$sqlDetail = "SELECT suratjalan.*, DATE_FORMAT(SuratJalanDate, '%d-%m-%Y') formatedDate,
CASE
WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
WarehouseID
FROM suratjalan
JOIN warehouse
ON SuratJalanReceivedWarehouseID = WarehouseID
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y'
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y'
WHERE SuratJalanID = ?";
$qry_flag = $this->db->query($sqlDetail, [$para['suratJalanID']]);
if (!$qry_flag) {
$this->db->trans_rollback();
$this->sys_error_db("select surat jalan detail error", $this->db);
exit;
}
$dataSJ = $qry_flag->row_array();
if ($dataSJ['SuratJalanReceivedConfirmed'] == 'Y') {
$this->db->trans_rollback();
$this->sys_error("Surat jalan {$dataSJ['SuratJalanNumber']} sudah pernah dikonfirmasi");
exit;
}
$sql = "SELECT suratjalan_detail.*, stock.*
FROM suratjalan_detail
JOIN m_item ON M_ItemID = SuratJalanDetailM_ItemID
AND M_ItemIsActive = 'Y'
JOIN stock ON StockItemID = M_ItemID
WHERE SuratJalanDetailSuratJalanID = ? AND SuratJalanDetailIsActive='Y'";
$qry = $this->db->query($sql, [$para['suratJalanID']]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("get sj detail ", $this->db);;
exit;
}
$detailSJ = $qry->result_array();
$descActivity = "Konfirmasi Penerimaan Surat Jalan {$dataSJ['SuratJalanNumber']} Tanggal {$dataSJ['formatedDate']} Di {$dataSJ['WarehouseName']}.";
foreach ($detailSJ as $k => $v) {
$sql = "INSERT INTO stock (
StockWarehouseAlmariID,
StockWarehouseRackID,
StockWarehouseID,
StockStockNumber,
StockBatchNo,
StockItemID,
StockItemUnitID,
StockED,
StockItemPrice,
StockQty,
StockLastUpdated,
StockUserID
) VALUES (
0, 0, ?, fn_numbering('SN'), ?, ?, ?, ?, ?, ?, NOW(), ?
)
ON DUPLICATE KEY UPDATE
StockQty = StockQty + VALUES(StockQty),
StockLastUpdated = NOW(),
StockUserID = VALUES(StockUserID);";
$qry = $this->db->query($sql, array(
$dataSJ['WarehouseID'],
$v['StockBatchNo'],
$v['SuratJalanDetailM_ItemID'],
$v['SuratJalanDetailItemUnitID'],
$v['StockED'],
$v['StockItemPrice'],
$v['SuratJalanDetailQtyReceived'],
$userId
));
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert update or insert stock");
exit;
}
$sql = "SELECT * FROM stock
WHERE StockWarehouseID = ?
AND StockWarehouseAlmariID = 0
AND StockWarehouseRackID = 0
AND StockBatchNo = ?
AND StockItemID = ?
AND StockItemUnitID = ?
AND StockED = ?
";
$qry = $this->db->query($sql, array(
$dataSJ['WarehouseID'],
$v['StockBatchNo'],
$v['SuratJalanDetailM_ItemID'],
$v['SuratJalanDetailItemUnitID'],
$v['StockED']
));
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Error get stock stock");
exit;
}
$stock = $qry->row_array();
// insert stockcard
$sqlcard = "INSERT INTO stockcard (
StockCardWarehouseID,
StockCardDatetime,
StockCardItemID,
StockCardItemUnitID,
StockCardBatchNo,
StockCardED,
StockCardReffID,
StockCardStatus,
StockCardBefore,
StockCardIn,
StockCardOut,
StockCardAfter,
StockCardUserID
) VALUES (?, NOW(), ?, ?, ?, ?, ?, 'SJ', ?, 0, ?, ?, ?)";
$qrycard = $this->db->query($sqlcard, array(
$dataSJ["WarehouseID"],
$v["SuratJalanDetailM_ItemID"],
$v["SuratJalanDetailItemUnitID"],
$v['StockBatchNo'],
$v['StockED'],
$stock["StockID"],
(intval($stock['StockQty']) - intval($v['SuratJalanDetailQtyReceived'])) < 0 ? 0 : (intval($stock['StockQty']) - intval($v['SuratJalanDetailQtyReceived'])),
intval($v['SuratJalanDetailQtyReceived']),
intval($stock['StockQty']),
$userId
));
if (!$qrycard) {
$this->db->trans_rollback();
$this->sys_error_db("Error insert stock card", $this->db);
exit;
}
// insert into stocklog
$slog = "INSERT INTO stocklog (
StockLogWarehouseID,
StockLogDateTime,
StockLogItemID,
StockLogItemUnitID,
StockLogStockNumber,
StockLogBatchNo,
StockLogED,
StockLogReffID,
StockLogStatus,
StockLogQty,
StockLogUserID
) VALUES (?,NOW(),?,?,?,?,?,?,?,?,?)";
$qlog = $this->db->query($slog, [
$dataSJ['WarehouseID'],
$v['SuratJalanDetailM_ItemID'],
$v['SuratJalanDetailItemUnitID'],
$stock['StockStockNumber'],
$v['StockBatchNo'],
$v['StockED'],
$stock['StockID'],
"RSJ",
$v['SuratJalanDetailQtyReceived'],
$userId,
]);
if (!$qlog) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] insert stocklog");
exit;
}
}
// generate jurnal
$this->GenerateJurnal($para['suratJalanID']);
$this->insertUserActivty(
$para['suratJalanID'],
'CONFIRM',
$userId,
$descActivity,
''
);
$this->db->trans_commit();
$newUpdate = "SELECT * FROM suratjalan WHERE SuratJalanID = {$para['suratJalanID']} AND SuratJalanIsActive = 'Y'";
$records = $this->db->query($newUpdate, [])->result_array();
$result = array("records" => $records, "msg" => "success update surat jalan");
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
// public function ConfirmSuratJalan_backup()
// {
// try {
// if (!$this->isLogin) {
// $this->sys_error("invalid token");
// exit;
// }
// $para = $this->sys_input;
// $userId = $this->sys_user["M_UserID"];
// $mustFields = ['suratJalanID', 'goodTransferID', 'warehouseID'];
// $missFields = [];
// foreach ($mustFields as $field) {
// if (empty($para[$field])) {
// $missFields[] = $field;
// }
// }
// if (!empty($missFields)) {
// $this->sys_error("Missing fields: " . implode(", ", $missFields));
// exit;
// }
// $this->db->trans_begin();
// // query update transfer request
// $sqlTransfer = "UPDATE t_goods_transfer
// SET T_GoodsTransferStatus = 'Completed',
// T_GoodsTransferLastUpdated = NOW(),
// T_GoodsTransferM_UserID = ?
// WHERE T_GoodsTransferID = ?";
// $qryTransfer = $this->db->query($sqlTransfer, [
// $userId,
// $para['goodTransferID']
// ]);
// if (!$qryTransfer) {
// $this->db->trans_rollback();
// $this->sys_error_db("error update transfer barang", $this->db);
// }
// // query untuk mendapatakan data suratjalan detail
// $sqlDetail = "SELECT SuratJalanDetailID,
// SuratJalanDetailSuratJalanID,
// SuratJalanDetailPurchaseRequestFlagID,
// SuratJalanDetailM_ItemID,
// SuratJalanDetailQtyReceived,
// S_RegionalID,
// M_BranchID,
// M_BranchCode,
// M_BranchName,
// SuratJalanDetailT_GoodsTransferDetailID,
// WarehouseID,
// stock.*
// FROM suratjalan_detail
// JOIN suratjalan ON SuratJalanDetailSuratJalanID = SuratJalanID
// AND SuratJalanIsActive = 'Y'
// JOIN t_goods_transfer ON SuratJalanT_GoodsTransferID = T_GoodsTransferID
// AND T_GoodsTransferIsActive = 'Y'
// JOIN m_branch ON T_GoodsTransferToM_BranchCode = M_BranchCode
// AND M_BranchIsActive = 'Y'
// JOIN s_regional ON M_BranchS_RegionalID = S_RegionalID
// AND S_RegionalIsActive = 'Y'
// JOIN m_item ON M_ItemID = SuratJalanDetailM_ItemID
// AND M_ItemIsActive = 'Y'
// JOIN stock ON StockItemID = M_ItemID
// JOIN warehouse ON StockWarehouseID = WarehouseID
// AND WarehouseIsTransit = 'Y'
// AND WarehouseIsActive = 'Y'
// WHERE SuratJalanDetailIsActive = 'Y'
// AND SuratJalanDetailSuratJalanID = ?";
// $qry_flag = $this->db->query($sqlDetail, [$para['suratJalanID']]);
// if (!$qry_flag) {
// $this->db->trans_rollback();
// $this->sys_error_db("select surat jalan detail error", $this->db);
// exit;
// }
// $rowsDetailSJ = $qry_flag->result_array();
// // print_r($rowsDetailSJ);
// foreach ($rowsDetailSJ as $k => $v) {
// // update stock warehouse transit
// $updsto = "UPDATE stock
// SET StockQty = 0
// WHERE StockID = ?
// AND StockWarehouseID = ?";
// $qrysto = $this->db->query($updsto, [
// $v['StockID'],
// $v['WarehouseID']
// ]);
// if (!$qrysto) {
// $this->db->trans_rollback();
// $this->sys_error_db("update stock qty");
// exit;
// }
// $sql = "INSERT INTO stock (
// StockWarehouseAlmariID,
// StockWarehouseRackID,
// StockWarehouseID,
// StockStockNumber,
// StockBatchNo,
// StockItemID,
// StockItemUnitID,
// StockED,
// StockItemPrice,
// StockQty,
// StockLastUpdated,
// StockUserID
// ) VALUES (
// 0, 0, ?, fn_numbering('SN'), ?, ?, ?, ?, ?, ?, NOW(), ?
// )
// ON DUPLICATE KEY UPDATE
// StockItemPrice = VALUES(StockItemPrice),
// StockQty = StockQty + VALUES(StockQty),
// StockLastUpdated = NOW(),
// StockUserID = VALUES(StockUserID);";
// $qry = $this->db->query($sql, array(
// $dataRo['WarehouseID'],
// $item['ReceiveOrderPoDetailBatchNo'],
// $item['ReceiveOrderPoItemID'],
// $item['ReceiveOrderPoItemUnitID'],
// $item['ReceiveOrderPoDetailEd'],
// $item['ReceiveOrderPoDetailPrice'],
// $item['ReceiveOrderPoDetailQty'],
// $userId
// ));
// if (!$qry) {
// $this->db->trans_rollback();
// $this->sys_error_db("Error insert update or insert stock");
// exit;
// }
// // insert stockcard
// $sqlcard = "INSERT INTO stockcard (
// StockCardWarehouseID,
// StockCardDatetime,
// StockCardItemID,
// StockCardItemUnitID,
// StockCardBatchNo,
// StockCardED,
// StockCardReffID,
// StockCardStatus,
// StockCardBefore,
// StockCardIn,
// StockCardOut,
// StockCardAfter,
// StockCardUserID
// ) VALUES (?, NOW(), ?, ?, ?, ?, ?, 'SJ', ?, 0, ?, ?, ?)";
// $qrycard = $this->db->query($sqlcard, array(
// $v["WarehouseID"],
// $v["StockItemID"],
// $v["StockItemUnitID"],
// $v["StockBatchNo"],
// $v["StockED"],
// $v["StockID"],
// (intval($v['StockQty']) - intval($v['SuratJalanDetailQtyReceived'])) < 0 ? 0 : (intval($v['StockQty']) - intval($v['SuratJalanDetailQtyReceived'])),
// intval($v['SuratJalanDetailQtyReceived']),
// intval($v['StockQty']),
// $userId
// ));
// if (!$qrycard) {
// $this->db->trans_rollback();
// $this->sys_error_db("Error insert stock card", $this->db);
// exit;
// }
// // insert into stocklog
// $slog = "INSERT INTO stocklog (
// StockLogWarehouseID,
// StockLogDateTime,
// StockLogItemID,
// StockLogItemUnitID,
// StockLogStockNumber,
// StockLogBatchNo,
// StockLogED,
// StockLogReffID,
// StockLogStatus,
// StockLogQty,
// StockLogUserID
// ) VALUES (?,NOW(),?,?,?,?,?,?,?,?,?)";
// $qlog = $this->db->query($slog, [
// $v['WarehouseID'],
// $v['StockItemID'],
// $v['StockItemUnitID'],
// $v['StockStockNumber'],
// $v['StockBatchNo'],
// $v['StockED'],
// $v['SuratJalanDetailT_GoodsTransferDetailID'],
// "TTW",
// $v['SuratJalanDetailQtyReceived'],
// $userId,
// ]);
// if (!$qlog) {
// $this->db->trans_rollback();
// $this->sys_error_db("[Error] insert stocklog");
// exit;
// }
// // Query untuk mendapatkan data purchase request flag
// $sql_select = "SELECT
// PurchaseRequestFlagID,
// PurchaseRequestFlagQtyRest,
// PurchaseRequestFlagPurchaseRequestDetailID
// FROM purchase_request_flag
// WHERE PurchaseRequestFlagID = ?";
// $qry_select = $this->db->query($sql_select, [$v["SuratJalanDetailPurchaseRequestFlagID"]]);
// if (!$qry_select) {
// $this->db->trans_rollback();
// $this->sys_error_db("select purchase flag error", $this->db);
// exit;
// }
// $rows_flag = $qry_select->result_array();
// // print_r($rows_flag);
// // exit;
// foreach ($rows_flag as $flag) {
// $purchaseRequestFlagQtyRest = intval($flag['PurchaseRequestFlagQtyRest']);
// $suratJalanDetailQtyReceived = intval($v['SuratJalanDetailQtyReceived']);
// // Validasi sebelum update
// if ($suratJalanDetailQtyReceived > $purchaseRequestFlagQtyRest) {
// $this->db->trans_rollback();
// $this->sys_error_db("Qty received melebihi qty rest", $this->db);
// exit;
// }
// $newQtyRest = $purchaseRequestFlagQtyRest - $suratJalanDetailQtyReceived;
// // Update purchase request flag
// $sql = "UPDATE purchase_request_flag SET
// PurchaseRequestFlagQtyProses = 0,
// PurchaseRequestFlagQtyRest = ?,
// PurchaseRequestFlagUserID = ?,
// PurchaseRequestFlagLastUpdated = NOW()
// WHERE PurchaseRequestFlagID = ?";
// $qry = $this->db->query($sql, [
// $newQtyRest,
// $userId,
// $flag['PurchaseRequestFlagID']
// ]);
// if (!$qry) {
// $this->db->trans_rollback();
// $this->sys_error_db("update flag error", $this->db);
// exit;
// }
// // cari PRID untuk update purchase request
// $sqlpr_detail = "SELECT PurchaseRequestDetailID,
// PurchaseRequestDetailPurchaseRequestID,
// PurchaseRequestDetailStatus,
// PurchaseRequestDetailQty
// FROM purchase_request_detail
// WHERE PurchaseRequestDetailID = ?
// AND PurchaseRequestDetailIsActive = 'Y'";
// $qrypr_detail = $this->db->query($sqlpr_detail, $flag['PurchaseRequestFlagPurchaseRequestDetailID']);
// if (!$qrypr_detail) {
// $this->db->trans_rollback();
// $this->sys_error_db("select purchase_request_detail error", $this->db);
// exit;
// }
// $row_detail = $qrypr_detail->row_array();
// // Menentukan status berdasarkan kondisi
// $purchaseRequestStatus = 'Partial'; // Default status
// if (intval($flag['PurchaseRequestFlagQtyRest']) == 0) {
// $purchaseRequestStatus = 'Completed';
// } elseif (intval($flag['PurchaseRequestFlagQtyRest']) < intval($row_detail["PurchaseRequestDetailQty"])) {
// $purchaseRequestStatus = 'Partial';
// }
// // Update status purchase request hanya sekali dengan status yang sudah ditentukan
// $sqlpr = "UPDATE purchase_request SET
// PurchaseRequestStatus = ?,
// PurchaseRequestUserID = ?,
// PurchaseRequestLastUpdated = NOW()
// WHERE PurchaseRequestID = ?";
// $qrypr = $this->db->query($sqlpr, [
// $purchaseRequestStatus,
// $userId,
// $row_detail["PurchaseRequestDetailPurchaseRequestID"]
// ]);
// if (!$qrypr) {
// $this->db->trans_rollback();
// $this->sys_error_db("update purchase_request error", $this->db);
// exit;
// }
// }
// }
// // generate jurnal
// $this->GenerateJurnal($para['suratJalanID']);
// $this->db->trans_commit();
// $newUpdate = "SELECT * FROM suratjalan WHERE SuratJalanID = {$para['suratJalanID']} AND SuratJalanIsActive = 'Y'";
// $records = $this->db->query($newUpdate, [])->result_array();
// $result = array("records" => $records, "msg" => "success update surat jalan");
// $this->sys_ok($result);
// } catch (Exception $exc) {
// $message = $exc->getMessage();
// $this->sys_error($message);
// }
// }
public function GenerateJurnal($suratJalanID)
{
try {
$para = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$this->db->trans_begin();
$sqlData = "SELECT SuratJalanID,
SuratJalanNumber,
SuratJalanReceivedDate,
SuratJalanReceivedUserID,
SuratJalanReceivedNote,
SUM(StockItemPrice) AS StockItemPrice,
StockQty,
SUM(SuratJalanDetailQty) AS SuratJalanDetailQty,
SUM(SuratJalanDetailQtyReceived) AS SuratJalanDetailQtyReceived,
SUM(StockItemPrice * SuratJalanDetailQty) AS totalAmountQty,
SUM(StockItemPrice * SuratJalanDetailQtyReceived) AS totalAmountQtyReceive,
M_BranchS_RegionalID,
M_BranchID,
M_BranchCode,
M_BranchName,
M_BranchCompanyID,
M_BranchCompanyName,
CONCAT('Auto Jurnal Terima Barang Tanggal ', DATE_FORMAT(SuratJalanReceivedDate, '%d-%m-%Y')) xdescription,
CONCAT('Auto Jurnal Terima Barang Tanggal ', DATE_FORMAT(SuratJalanReceivedDate, '%d-%m-%Y'), ' Regional ',S_RegionalName) titleregional,
CONCAT('Auto Jurnal Terima Barang Tanggal ', DATE_FORMAT(SuratJalanReceivedDate, '%d-%m-%Y'), ' Cabang ',M_BranchName, ' ' ,M_BranchCode) titlebranch,
'' as detailjurnalreg,
'' as detailjurnalbran
FROM suratjalan
JOIN suratjalan_detail ON SuratJalanDetailSuratJalanID = SuratJalanID
AND SuratJalanDetailIsActive = 'Y'
JOIN t_goods_transfer ON SuratJalanT_GoodsTransferID = T_GoodsTransferID
AND T_GoodsTransferIsActive = 'Y'
JOIN warehouse ON SuratJalanReceivedWarehouseID = WarehouseID
AND WarehouseIsActive = 'Y'
JOIN m_branch ON T_GoodsTransferToM_BranchCode = M_BranchCode
AND M_BranchIsActive = 'Y'
JOIN s_regional ON M_BranchS_RegionalID = S_RegionalID
AND S_RegionalIsActive = 'Y'
JOIN m_item ON M_ItemID = SuratJalanDetailM_ItemID
AND M_ItemIsActive = 'Y'
JOIN stock ON StockItemID = M_ItemID
LEFT JOIN m_branch_companydetail ON M_BranchCompanyDetailM_BranchCode = M_BranchCode
AND M_BranchCompanyDetailIsActive = 'Y'
LEFT JOIN m_branch_company ON M_BranchCompanyID = M_BranchCompanyDetailM_BranchCompanyID
AND M_BranchCompanyIsActive = 'Y'
WHERE SuratJalanIsActive = 'Y'
AND SuratJalanID = ?
GROUP BY SuratJalanID";
$qryData = $this->db->query($sqlData, [$suratJalanID]);
if ($qryData) {
$data = $qryData->result_array()[0];
} else {
$this->db->trans_rollback();
$this->sys_error_db('select data jurnal error', $this->db);
exit;
}
if ($data) {
// print_r($data);
// exit;
$periodeID = 0;
$branchID = $data["M_BranchID"];
$branchCode = $data["M_BranchCode"];
$branchCompanyID = $data["M_BranchCompanyID"];
$date = date('Y-m-d');
$description = $data["xdescription"];
$regionalID = $data["M_BranchS_RegionalID"];
$titleregional = $data["titleregional"];
$titlebranch = $data["titlebranch"];
$sjno = $data["SuratJalanNumber"];
$qtyReceive = intval($data["SuratJalanDetailQtyReceived"]);
$qty = intval($data["SuratJalanDetailQty"]);
$totalAmountQtyReceive = intval($data["totalAmountQtyReceive"]);
$totalAmountQty = intval($data["totalAmountQty"]);
$qtyDifference = $qty - $qtyReceive;
$sqlperiode = "SELECT periodeID FROM periode WHERE '{$date}' BETWEEN periodeStartDate AND periodeEndDate";
$periodeID = $this->db->query($sqlperiode)->row()->periodeID;
$sqltype = "SELECT JurnalTypeID FROM jurnal_type WHERE JurnalTypeIsActive = 'Y' AND JurnalTypeCode = 'AUTOSENDGOODR'";
$typeID = $this->db->query($sqltype)->row()->JurnalTypeID;
// cek apakah ada selisih
if ($qtyDifference != 0) {
// ambil data map coa under investigasi
$sqlCoaInvestigasi = "SELECT coaID, coaDescription FROM coa
WHERE coaAccountNo = '1150700002' AND coaIsActive = 'Y'";
$qryCoaInvestigasi = $this->db->query($sqlCoaInvestigasi);
if (!$qryCoaInvestigasi) {
$this->sys_error("Mapping STOCK / UNDER INVESTIGASI tidak ditemukan", $this->db);
exit;
}
$underInvestigasiID = $qryCoaInvestigasi->row()->coaID;
$underInvestigasiDesc = $qryCoaInvestigasi->row()->coaDescription;
$sqlOffBran = "SELECT Map_RkCabang_Rk_TypeID,
Map_RkCabang_SRegionalID,
Map_RkCabang_BranchCode,
Map_RkCabang_CoaID,
Map_RkCabang_CoaAccountNo,
Map_RkCabang_CoaDescription
FROM map_rk_cabang
JOIN rk_type ON Map_RkCabang_Rk_TypeID = Rk_TypeID AND Rk_TypeIsActive ='Y'
AND Rk_TypeCode = 'STOK'
LEFT JOIN m_branch ON Map_RkCabang_BranchCode = M_BranchCode
WHERE Map_RkCabang_IsActive = 'Y'
AND Map_RkCabang_SRegionalID = ?
AND (Map_RkCabang_BranchCode = '' OR Map_RkCabang_BranchCode IS NULL)";
$qryOffBran = $this->db->query($sqlOffBran, [
$regionalID
]);
if (!$qryOffBran) {
$this->db->trans_rollback();
$this->sys_error_db("select data regional error", $this->db);
exit;
}
$dataBran = $qryOffBran->row();
// ambil data item sesuai surat jalan
$sqlItem = "SELECT M_ItemID,
M_ItemCode,
M_ItemDesc,
SuratJalanDetailQty,
SuratJalanDetailQtyReceived,
StockItemPrice,
MapNatSub_PersediaanCoaID as coaID,
MapNatSub_PersediaanCoaDescription as coaDescription
FROM suratjalan_detail
JOIN suratjalan ON SuratJalanDetailSuratJalanID = SuratJalanID
AND SuratJalanIsActive = 'Y'
JOIN stock ON StockItemID = SuratJalanDetailM_ItemID
AND SuratJalanDetailIsActive = 'Y'
JOIN warehouse ON SuratJalanReceivedWarehouseID = WarehouseID
AND WarehouseIsActive = 'Y'
JOIN m_item ON M_ItemID = SuratJalanDetailM_ItemID
AND M_ItemIsActive = 'Y'
JOIN map_nat_subgroup ON M_ItemNat_SubGroupID = MapNatSub_NatSubGroupID
AND MapNatSub_IsActive = 'Y'
WHERE SuratJalanDetailIsActive = 'Y'
AND SuratJalanDetailSuratJalanID = ?
AND WarehouseS_RegionalID = ?";
$qryItem = $this->db->query($sqlItem, [$suratJalanID, $regionalID]);
if (!$qryItem) {
$this->db->trans_rollback();
$this->sys_error_db("select item error", $this->db);
exit;
}
$rowsItem = $qryItem->result_array();
// Inisialisasi variabel untuk menyimpan total selisih
$totalAmountStockD = 0;
$totalDiffAmountD = 0;
// Array untuk menyimpan jurnal
$detailjurnaldiff = [];
// Kelompokkan item berdasarkan coaID untuk persediaan
$coaGroups = [];
foreach ($rowsItem as $item) {
$coaID = $item["coaID"];
if (!isset($coaGroups[$coaID])) {
$coaGroups[$coaID] = [
'coaID' => $coaID,
'coaDescription' => $item["coaDescription"],
'totalAmount' => 0
];
}
// Hitung total amount dari item yang diterima
$itemQtyReceived = $item["SuratJalanDetailQtyReceived"];
$itemPrice = $item["StockItemPrice"];
$itemReceivedAmount = $itemQtyReceived * $itemPrice;
$coaGroups[$coaID]['totalAmount'] += $itemReceivedAmount;
}
// Buat jurnal untuk setiap CoA persediaan yang berbeda
foreach ($coaGroups as $coaGroup) {
$detailjurnaldiff[] = [
'coaID' => $coaGroup['coaID'],
'xdescription' => $coaGroup['coaDescription'],
'debit' => $coaGroup['totalAmount'],
'credit' => 0,
'sjnoValue' => $sjno
];
// Tambahkan ke total untuk persediaan
$totalAmountStockD += $coaGroup['totalAmount'];
}
// Jurnal untuk Rek. Cabang (credit)
$detailjurnaldiff[] = [
'coaID' => $dataBran->Map_RkCabang_CoaID,
'xdescription' => $dataBran->Map_RkCabang_CoaDescription,
'debit' => 0,
'credit' => 0,
'sjnoValue' => $sjno
];
// Index untuk Rek. Cabang dalam array detailjurnaldiff
$rekCabangIndex = count($detailjurnaldiff) - 1;
// Iterasi untuk setiap item untuk menghitung selisih
foreach ($rowsItem as $key => $value) {
$itemCode = $value["M_ItemCode"];
$itemDesc = $value["M_ItemDesc"];
$itemQty = $value["SuratJalanDetailQty"];
$itemQtyReceived = $value["SuratJalanDetailQtyReceived"];
$itemPrice = $value["StockItemPrice"];
// Hitung selisih qty
$qtyDifference = $itemQty - $itemQtyReceived;
// Hitung nilai selisih berdasarkan harga
$itemDiffAmount = $qtyDifference * $itemPrice;
// Tambahkan ke total selisih
$totalDiffAmountD += $itemDiffAmount;
// Jika ada selisih, tambahkan ke jurnal under investigasi
if ($qtyDifference != 0) {
$detailjurnaldiff[] = [
'coaID' => $underInvestigasiID,
'xdescription' => $underInvestigasiDesc,
'debit' => $itemDiffAmount,
'credit' => 0,
'sjnoValue' => "Item Code " . $itemCode . " - " . $itemDesc
];
}
}
// Update total credit pada jurnal Rek. Cabang
$detailjurnaldiff[$rekCabangIndex]['credit'] = $totalAmountStockD + $totalDiffAmountD;
$this->saveJurnalDiff(
$branchID,
$date,
$description,
$periodeID,
$regionalID,
$titlebranch,
$typeID,
$detailjurnaldiff,
$branchCompanyID
);
} else {
// penerima kantor regional
$sqlCoaReg = "SELECT coaID, coaDescription FROM coa
WHERE coaAccountNo = '1150700001' AND coaIsActive = 'Y'";
$qryCoaReg = $this->db->query($sqlCoaReg);
if (!$qryCoaReg) {
$this->sys_error("Mapping COA tidak ditemukan", $this->db);
exit;
}
$stockDescID = $qryCoaReg->row()->coaID;
$stockDesc = $qryCoaReg->row()->coaDescription;
$sqlOffReg = "SELECT Map_RkCabang_Rk_TypeID,
Map_RkCabang_SRegionalID,
Map_RkCabang_BranchCode,
Map_RkCabang_CoaID,
Map_RkCabang_CoaAccountNo,
Map_RkCabang_CoaDescription
FROM map_rk_cabang
JOIN rk_type ON Map_RkCabang_Rk_TypeID = Rk_TypeID AND Rk_TypeIsActive ='Y'
AND Rk_TypeCode = 'STOK'
JOIN m_branch ON Map_RkCabang_BranchCode = M_BranchCode
WHERE Map_RkCabang_IsActive = 'Y'
AND Map_RkCabang_SRegionalID = ?
AND M_BranchCode = ?";
$qryOffReg = $this->db->query($sqlOffReg, [
$regionalID,
$branchCode
]);
if (!$qryOffReg) {
$this->db->trans_rollback();
$this->sys_error_db("select data regional error", $this->db);
exit;
}
$dataReg = $qryOffReg->row();
$detailjurnalreg = [
[
'coaID' => $dataReg->Map_RkCabang_CoaID,
'xdescription' => $dataReg->Map_RkCabang_CoaDescription,
'debit' => $totalAmountQtyReceive,
'credit' => 0
],
[
'coaID' => $stockDescID,
'xdescription' => $stockDesc,
'debit' => 0,
'credit' => $totalAmountQty
]
];
// print_r($detailjurnalreg);
// exit;
$this->saveJurnalReg(
$date,
$description,
$periodeID,
$regionalID,
$titleregional,
$typeID,
$detailjurnalreg,
$sjno,
$branchCompanyID
);
// end penerima kantor regional
// penerima kantor cabang
$sqlCoaBran = "SELECT
MapNatSub_PersediaanCoaID as coaID,
MapNatSub_PersediaanCoaDescription as coaDescription
FROM suratjalan_detail
JOIN suratjalan ON SuratJalanDetailSuratJalanID = SuratJalanID
AND SuratJalanIsActive = 'Y'
JOIN stock ON StockItemID = SuratJalanDetailM_ItemID
AND SuratJalanDetailIsActive = 'Y'
JOIN warehouse ON SuratJalanReceivedWarehouseID = WarehouseID
AND WarehouseIsActive = 'Y'
JOIN m_item ON M_ItemID = SuratJalanDetailM_ItemID
AND M_ItemIsActive = 'Y'
JOIN map_nat_subgroup ON M_ItemNat_SubGroupID = MapNatSub_NatSubGroupID
AND MapNatSub_IsActive = 'Y'
WHERE SuratJalanDetailIsActive = 'Y'
AND SuratJalanDetailSuratJalanID = ?
AND WarehouseS_RegionalID = ?";
$qryCoaBran = $this->db->query($sqlCoaBran, [
$suratJalanID,
$regionalID
]);
if (!$qryCoaBran) {
$this->sys_error("Mapping PERSEDIAAN tidak ditemukan", $this->db);
exit;
}
$persediaanID = $qryCoaBran->row()->coaID;
$persediaanDesc = $qryCoaBran->row()->coaDescription;
$sqlOffBran = "SELECT Map_RkCabang_Rk_TypeID,
Map_RkCabang_SRegionalID,
Map_RkCabang_BranchCode,
Map_RkCabang_CoaID,
Map_RkCabang_CoaAccountNo,
Map_RkCabang_CoaDescription
FROM map_rk_cabang
JOIN rk_type ON Map_RkCabang_Rk_TypeID = Rk_TypeID AND Rk_TypeIsActive ='Y'
AND Rk_TypeCode = 'STOK'
LEFT JOIN m_branch ON Map_RkCabang_BranchCode = M_BranchCode
WHERE Map_RkCabang_IsActive = 'Y'
AND Map_RkCabang_SRegionalID = ?
AND (Map_RkCabang_BranchCode = '' OR Map_RkCabang_BranchCode IS NULL)";
$qryOffBran = $this->db->query($sqlOffBran, [
$regionalID
]);
if (!$qryOffBran) {
$this->db->trans_rollback();
$this->sys_error_db("select data regional error", $this->db);
exit;
}
$dataBran = $qryOffBran->row();
$detailjurnalbran = [
[
'coaID' => $persediaanID,
'xdescription' => $persediaanDesc,
'debit' => $totalAmountQty,
'credit' => 0
],
[
'coaID' => $dataBran->Map_RkCabang_CoaID,
'xdescription' => $dataBran->Map_RkCabang_CoaDescription,
'debit' => 0,
'credit' => $totalAmountQty
]
];
$this->saveJurnalBran(
$branchID,
$date,
$description,
$periodeID,
$regionalID,
$titlebranch,
$typeID,
$detailjurnalbran,
$sjno,
$branchCompanyID
);
// end penerima kantor cabang
}
}
$this->db->trans_commit();
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveJurnalReg(
$date,
$description,
$periodeID,
$regionalID,
$titleregional,
$typeID,
$detailjurnalreg,
$sjno,
$branchCompanyID
) {
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$this->db->trans_begin();
$userid = $this->sys_user['M_UserID'];
// $sql_branch = "SELECT
// M_BranchID,
// M_BranchCode,
// M_BranchName
// FROM m_branch
// WHERE M_BranchIsActive = 'Y'
// AND M_BranchID = ?";
// $qry_branch = $this->db->query($sql_branch, array($branchID));
// if ($qry_branch) {
// $branchcodex = $qry_branch->row()->M_BranchCode;
// } else {
// $this->db->trans_rollback();
// $this->sys_error_db("select branch error", $this->db);
// exit;
// }
$sql = "INSERT INTO jurnal(
jurnalM_BranchCompanyID,
JurnalS_RegionalID,
jurnalM_BranchCode,
jurnalperiodeID,
jurnalNo,
jurnalTitle,
jurnalDescription,
jurnalDate,
jurnalJurnalTypeID,
jurnalIsActive,
jurnalCreated,
jurnalM_UserID
) VALUES(?,?,?,?,`fn_numbering`('J'),?,?,?,?,'Y',NOW(),?)";
$qry = $this->db->query($sql, array(
$branchCompanyID,
$regionalID,
'',
$periodeID,
$titleregional,
$description,
$date,
$typeID,
$userid
));
$last_qry = $this->db->last_query();
if (!$qry) {
$this->db->trans_rollback();
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error, $this->db);
exit;
}
$last_id = $this->db->insert_id();
foreach ($detailjurnalreg as $key => $value) {
$sql_detail = "INSERT INTO jurnal_tx(
jurnalTxJurnalID,
jurnalTxCoaID,
jurnalTxDescription,
jurnalTxDebit,
jurnalTxCredit,
jurnalTxIsActive,
jurnalTxCreated,
jurnalTxM_UserID) VALUES(?,?,?,?,?,'Y',NOW(),?)";
$qry_detail = $this->db->query($sql_detail, array(
$last_id,
$value["coaID"],
$value["xdescription"],
$value["debit"],
$value["credit"],
$userid
));
$last_qry = $this->db->last_query();
if (!$qry_detail) {
$this->db->trans_rollback();
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error, $this->db);
exit;
}
$tx_id = $this->db->insert_id();
$sql = "INSERT INTO jurnal_addon
(jurnalAddOnJurnalID,
jurnalAddOnJurnalTxID,
jurnalAddOnCode,
jurnalAddOnValue,
jurnalAddOnCreated,
jurnalAddOnCreatedUserID,
jurnalAddOnLastUpdatedUserID,
jurnalAddOnLastUpdated)
VALUES
(?,
?,
'SENDGOODRDST',
?,
now(),
?,
?,
now())";
$qry = $this->db->query($sql, array(
$last_id,
$tx_id,
$sjno,
$userid,
$userid
));
$last_qry = $this->db->last_query();
if (!$qry) {
$this->db->trans_rollback();
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error, $this->db);
exit;
}
}
$this->db->trans_commit();
// $result = array("total" => 1);
// $this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveJurnalBran(
$branchID,
$date,
$description,
$periodeID,
$regionalID,
$titlebranch,
$typeID,
$detailjurnalbran,
$sjno,
$branchCompanyID
) {
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$this->db->trans_begin();
$userid = $this->sys_user['M_UserID'];
$sql_branch = "SELECT
M_BranchID,
M_BranchCode,
M_BranchName
FROM m_branch
WHERE M_BranchIsActive = 'Y'
AND M_BranchID = ?";
$qry_branch = $this->db->query($sql_branch, array($branchID));
if ($qry_branch) {
$branchcodex = $qry_branch->row()->M_BranchCode;
} else {
$this->db->trans_rollback();
$this->sys_error_db("select branch error", $this->db);
exit;
}
$sql = "INSERT INTO jurnal(
jurnalM_BranchCompanyID,
JurnalS_RegionalID,
jurnalM_BranchCode,
jurnalperiodeID,
jurnalNo,
jurnalTitle,
jurnalDescription,
jurnalDate,
jurnalJurnalTypeID,
jurnalIsActive,
jurnalCreated,
jurnalM_UserID
) VALUES(?,?,?,?,`fn_numbering`('J'),?,?,?,?,'Y',NOW(),?)";
$qry = $this->db->query($sql, array(
$branchCompanyID,
$regionalID,
$branchcodex,
$periodeID,
$titlebranch,
$description,
$date,
$typeID,
$userid
));
$last_qry = $this->db->last_query();
if (!$qry) {
$this->db->trans_rollback();
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error, $this->db);
exit;
}
$last_id = $this->db->insert_id();
foreach ($detailjurnalbran as $key => $value) {
$sql_detail = "INSERT INTO jurnal_tx(
jurnalTxJurnalID,
jurnalTxCoaID,
jurnalTxDescription,
jurnalTxDebit,
jurnalTxCredit,
jurnalTxIsActive,
jurnalTxCreated,
jurnalTxM_UserID) VALUES(?,?,?,?,?,'Y',NOW(),?)";
$qry_detail = $this->db->query($sql_detail, array(
$last_id,
$value["coaID"],
$value["xdescription"],
$value["debit"],
$value["credit"],
$userid
));
$last_qry = $this->db->last_query();
if (!$qry_detail) {
$this->db->trans_rollback();
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error, $this->db);
exit;
}
$tx_id = $this->db->insert_id();
$sql = "INSERT INTO jurnal_addon
(jurnalAddOnJurnalID,
jurnalAddOnJurnalTxID,
jurnalAddOnCode,
jurnalAddOnValue,
jurnalAddOnCreated,
jurnalAddOnCreatedUserID,
jurnalAddOnLastUpdatedUserID,
jurnalAddOnLastUpdated)
VALUES
(?,
?,
'SENDGOODRDST',
?,
now(),
?,
?,
now())";
$qry = $this->db->query($sql, array(
$last_id,
$tx_id,
$sjno,
$userid,
$userid
));
$last_qry = $this->db->last_query();
if (!$qry) {
$this->db->trans_rollback();
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error, $this->db);
exit;
}
}
$this->db->trans_commit();
// $result = array("total" => 1);
// $this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveJurnalDiff(
$branchID,
$date,
$description,
$periodeID,
$regionalID,
$titlebranch,
$typeID,
$detailjurnaldiff,
$branchCompanyID
) {
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$this->db->trans_begin();
$userid = $this->sys_user['M_UserID'];
$sql_branch = "SELECT
M_BranchID,
M_BranchCode,
M_BranchName
FROM m_branch
WHERE M_BranchIsActive = 'Y'
AND M_BranchID = ?";
$qry_branch = $this->db->query($sql_branch, array($branchID));
if ($qry_branch) {
$branchcodex = $qry_branch->row()->M_BranchCode;
} else {
$this->db->trans_rollback();
$this->sys_error_db("select branch error", $this->db);
exit;
}
$sql = "INSERT INTO jurnal(
jurnalM_BranchCompanyID,
JurnalS_RegionalID,
jurnalM_BranchCode,
jurnalperiodeID,
jurnalNo,
jurnalTitle,
jurnalDescription,
jurnalDate,
jurnalJurnalTypeID,
jurnalIsActive,
jurnalCreated,
jurnalM_UserID
) VALUES(?,?,?,?,`fn_numbering`('J'),?,?,?,?,'Y',NOW(),?)";
$qry = $this->db->query($sql, array(
$branchCompanyID,
$regionalID,
$branchcodex,
$periodeID,
$titlebranch,
$description,
$date,
$typeID,
$userid
));
$last_qry = $this->db->last_query();
if (!$qry) {
$this->db->trans_rollback();
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error, $this->db);
exit;
}
$last_id = $this->db->insert_id();
foreach ($detailjurnaldiff as $key => $value) {
$sql_detail = "INSERT INTO jurnal_tx(
jurnalTxJurnalID,
jurnalTxCoaID,
jurnalTxDescription,
jurnalTxDebit,
jurnalTxCredit,
jurnalTxIsActive,
jurnalTxCreated,
jurnalTxM_UserID) VALUES(?,?,?,?,?,'Y',NOW(),?)";
$qry_detail = $this->db->query($sql_detail, array(
$last_id,
$value["coaID"],
$value["xdescription"],
$value["debit"],
$value["credit"],
$userid
));
$last_qry = $this->db->last_query();
if (!$qry_detail) {
$this->db->trans_rollback();
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error, $this->db);
exit;
}
$tx_id = $this->db->insert_id();
$sql = "INSERT INTO jurnal_addon
(jurnalAddOnJurnalID,
jurnalAddOnJurnalTxID,
jurnalAddOnCode,
jurnalAddOnValue,
jurnalAddOnCreated,
jurnalAddOnCreatedUserID,
jurnalAddOnLastUpdatedUserID,
jurnalAddOnLastUpdated)
VALUES
(?,
?,
'SENDGOODRDST',
?,
now(),
?,
?,
now())";
$qry = $this->db->query($sql, array(
$last_id,
$tx_id,
$value["sjnoValue"],
$userid,
$userid
));
$last_qry = $this->db->last_query();
if (!$qry) {
$this->db->trans_rollback();
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error, $this->db);
exit;
}
}
$this->db->trans_commit();
// $result = array("total" => 1);
// $this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function GetTFDataDetail()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$sjID = $para['SuratJalanID'];
$currpage = $para['currpagedetail'];
$page = 0;
$limit = 5;
if ($currpage > 0) {
$page = ($currpage - 1) * $limit;
}
$sqltot = "SELECT COUNT(*) as total
FROM suratjalan_detail
JOIN m_item ON M_ItemID = SuratJalanDetailM_ItemID
AND M_ItemIsActive = 'Y'
LEFT JOIN itemunit ON ItemUnitID = SuratJalanDetailItemUnitID
AND ItemUnitIsActive = 'Y'
WHERE SuratJalanDetailIsActive = 'Y'
AND SuratJalanDetailSuratJalanID = ?";
$qrytot = $this->db->query($sqltot, [$sjID]);
$totalcount = 0;
$totalpage = 0;
if ($qrytot) {
$totalcount = $qrytot->result_array()[0]['total'];
$totalpage = ceil($totalcount / $limit);
} else {
$this->sys_error_db("count surat jalan error", $this->db);
exit;
}
$sqlSJD = "SELECT
SuratJalanDetailID,
SuratJalanDetailM_ItemID,
SuratJalanDetailQty,
SuratJalanDetailQtyReceived,
SuratJalanDetailItemUnitID,
M_ItemCode,
M_ItemDesc,
ItemUnitCode,
ItemUnitName
FROM suratjalan_detail
JOIN m_item ON M_ItemID = SuratJalanDetailM_ItemID
AND M_ItemIsActive = 'Y'
LEFT JOIN itemunit ON ItemUnitID = SuratJalanDetailItemUnitID
AND ItemUnitIsActive = 'Y'
WHERE SuratJalanDetailIsActive = 'Y'
AND SuratJalanDetailSuratJalanID = ?
LIMIT ? OFFSET ?";
$qrySJD = $this->db->query($sqlSJD, [$sjID, $limit, $page]);
if (!$qrySJD) {
$this->sys_error_db("error get detail surat jaalan");
exit;
}
$rows = $qrySJD->result_array();
$result = array(
"totalPage" => $totalpage,
"total" => $totalcount,
"records" => $rows,
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function ListingSuratJalan()
{
try {
if (!$this->isLogin) {
$this->sys_error("invalid token");
exit;
}
$para = $this->sys_input;
$stardate = $para['startdate'];
$enddate = $para['enddate'];
$branchcode = $para['branchcode'];
$status = $para['status'];
$keyword = $para['search'];
$currpage = $para['currpage'];
$page = 0;
$limit = 10;
if ($currpage > 0) {
$page = ($currpage - 1) * $limit;
}
$keyw = "%";
if ($keyword != "") {
$keyw = $keyword . "%";
}
$sqtot = "SELECT COUNT(*) as total
FROM suratjalan
JOIN t_goods_transfer ON T_GoodsTransferID = SuratJalanT_GoodsTransferID
AND T_GoodsTransferIsActive = 'Y'
JOIN m_branch ON M_BranchCode = T_GoodsTransferToM_BranchCode
AND M_BranchIsActive = 'Y'
LEFT JOIN expeditionstaff ON ExpeditionStaffID = SuratJalanEkspedisiStaffID
AND ExpeditionStaffIsActive = 'Y'
LEFT JOIN expedition ON ExpeditionID = SuratJalanEkspedisiID
AND ExpeditionIsActive = 'Y'
LEFT JOIN m_user ON M_UserID = SuratJalanReceivedUserID
AND M_UserIsActive = 'Y'
LEFT JOIN m_staff ON M_UserM_StaffID = M_StaffID
AND M_StaffIsActive = 'Y'
WHERE SuratJalanIsActive = 'Y'
AND SuratJalanDate >= DATE(?)
AND SuratJalanDate <= DATE(?)
AND (? = 'ALL' OR T_GoodsTransferToM_BranchCode = ? )
AND (? = 'All' OR SuratJalanStatus = ? )
AND SuratJalanNumber LIKE ?";
$qryto = $this->db->query($sqtot, [
$stardate,
$enddate,
$branchcode,
$branchcode,
$status,
$status,
$keyw
]);
$totalcount = 0;
$totalpage = 0;
if ($qryto) {
$totalcount = $qryto->result_array()[0]['total'];
$totalpage = ceil($totalcount / $limit);
} else {
$this->sys_error_db("count surat jalan error", $this->db);
exit;
}
$sqlSJ = "SELECT
SuratJalanID,
SuratJalanNumber,
SuratJalanDate,
SuratJalanNote,
M_BranchCode,
M_BranchName,
SuratJalanEkspedisiID,
ExpeditionID,
ExpeditionName,
ExpeditionIsInternal,
SuratJalanEkspedisiStaffID,
SuratJalanEkspedisiStaffContact,
ExpeditionStaffID,
ExpeditionStaffName,
ExpeditionStaffMobile,
SuratJalanStatus,
SuratJalanT_GoodsTransferID,
DATE_FORMAT(IF(SuratJalanReceivedDate = '0000-00-00 00:00:00' OR SuratJalanReceivedDate IS NULL, NULL, SuratJalanReceivedDate), '%d-%m-%Y') as SuratJalanReceivedDate,
SuratJalanReceivedNote,
SuratJalanReceivedWarehouseID,
SuratJalanReceivedConfirmed,
SuratJalanReceivedConfirmedDate,
SuratJalanReceivedConfirmedUserID,
M_StaffName
FROM suratjalan
JOIN t_goods_transfer ON T_GoodsTransferID = SuratJalanT_GoodsTransferID
AND T_GoodsTransferIsActive = 'Y'
JOIN m_branch ON M_BranchCode = T_GoodsTransferToM_BranchCode
AND M_BranchIsActive = 'Y'
LEFT JOIN expeditionstaff ON ExpeditionStaffID = SuratJalanEkspedisiStaffID
AND ExpeditionStaffIsActive = 'Y'
LEFT JOIN expedition ON ExpeditionID = SuratJalanEkspedisiID
AND ExpeditionIsActive = 'Y'
LEFT JOIN m_user ON M_UserID = SuratJalanReceivedUserID
AND M_UserIsActive = 'Y'
LEFT JOIN m_staff ON M_UserM_StaffID = M_StaffID
AND M_StaffIsActive = 'Y'
WHERE SuratJalanIsActive = 'Y'
AND SuratJalanDate >= DATE(?)
AND SuratJalanDate <= DATE(?)
AND (? = 'ALL' OR T_GoodsTransferToM_BranchCode = ? )
AND (? = 'ALL' OR SuratJalanStatus = ? )
AND SuratJalanNumber LIKE ?
ORDER BY SuratJalanID DESC
LIMIT ? OFFSET ?";
$qrySJ = $this->db->query($sqlSJ, [
$stardate,
$enddate,
$branchcode,
$branchcode,
$status,
$status,
$keyw,
$limit,
$page
]);
if (!$qrySJ) {
$this->sys_error_db("error get listing data surat jalan", $this->db);
exit;
}
$list = $qrySJ->result_array();
$result = array(
"totalPage" => $totalpage,
"total" => $totalcount,
"records" => $list
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function ListingBranch()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$regID = $prm["S_RegionalID"];
$sql = "SELECT M_BranchID, M_BranchCode, M_BranchName
FROM m_branch
WHERE M_BranchIsActive = 'Y'
AND M_BranchS_RegionalID = ?";
$qry = $this->db->query($sql, [$regID]);
if (!$qry) {
$this->sys_error_db("Failed to get Branches from RegionalID: {$regID}", $this->db);
exit;
}
$rst = $qry->result_array();
$this->sys_ok(["records" => $rst]);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function getWarehouse()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$payload = $this->sys_input;
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$regionalId = $this->sys_user["S_RegionalID"];
$sqlWhere = "";
if ($user['M_UserLocationFlag'] == "R") {
$sqlWhere = "AND WarehouseType = 'R'";
}
if ($user['M_UserLocationFlag'] == "RB" || $user['M_UserLocationFlag'] == "B") {
$sqlWhere = "AND WarehouseType = 'B' AND WarehouseM_BranchID = {$user['M_BranchID']}";
}
$sql = "SELECT
WarehouseID,
WarehouseCode,
CASE
WHEN WarehouseType = 'B' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', M_BranchName)
WHEN WarehouseType = 'R' THEN CONCAT(WarehouseCode,' ', WarehouseName, ' - ', S_RegionalName)
ELSE ''
END WarehouseName,
WarehouseType,
WarehouseIsDefault,
WarehouseS_RegionalID,
WarehouseM_BranchID,
S_RegionalID,
S_RegionalName
FROM warehouse
JOIN s_regional ON WarehouseS_RegionalID = S_RegionalID AND S_RegionalIsActive = 'Y'
LEFT JOIN m_branch ON WarehouseM_BranchID = M_BranchID AND M_BranchIsActive = 'Y'
where WarehouseS_RegionalID = ?
AND WarehouseIsActive = 'Y'
AND WarehouseIsTransit = 'N'
$sqlWhere
ORDER BY WarehouseName ASC ";
$qry = $this->db->query($sql, [$regionalId]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("select warehouse", $this->db);;
exit;
}
$rows = $qry->result_array();
$result = array(
"records" => $rows,
"sql" => $this->db->last_query()
);
$this->sys_ok($rows);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function insertUserActivty($id, $type, $userID, $desc = '', $data = '')
{
// Query untuk menyisipkan log ke dalam tabel purchase_order_log
$sql = "INSERT INTO user_activity (
UserActivityCode,
UserActivityStatus,
UserActivityDescription,
UserActivityRefID,
UserActivityData,
UserActivityUserID,
UserActivityCreated
) VALUES (
?, ?, ?, ?, ?, ?, NOW()
)";
// Eksekusi query dengan parameter yang diberikan
$exec = $this->db->query($sql, [
'RSJ',
$type,
$desc,
$id,
$data,
$userID
]);
// Jika query gagal, lempar error
if (!$exec) {
$this->sys_error_db("Error inserting user activity", $this->db);
$this->db->trans_rollback();
exit;
}
}
}