Files
be-accone/application/controllers/mockup/purchase/requester/PurchaseRequestNonPersediaan.php

2361 lines
95 KiB
PHP

<?php
class PurchaseRequestNonPersediaan extends MY_Controller
{
var $db;
public function index()
{
echo "Purchase Request/Requester API";
}
public function __construct()
{
parent::__construct();
}
function search()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$payload = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$currentPage = isset($payload["currentPage"]) ? $payload["currentPage"] : 1;
$pageSize = isset($payload["pageSize"]) ? $payload["pageSize"] : 10;
$offset = ($currentPage - 1) * $pageSize;
$startDate = isset($payload["startDate"]) ? $payload["startDate"] : "";
$endDate = isset($payload["endDate"]) ? $payload["endDate"] : "";
$status = isset($payload["status"]) ? $payload["status"] : "";
$search = isset($payload["search"]) ? $payload["search"] : "";
$params = [];
$params[] = $startDate;
$params[] = $endDate;
$params[] = $status;
$params[] = $status;
$params[] = '%' . $search . '%';
$sql = "SELECT M_UserLocationS_RegionalID as S_RegionalID,
IFNULL(M_BranchCode, '') as M_BranchCode,
IFNULL(M_BranchName, '') as M_BranchName
FROM m_userlocation
LEFT JOIN m_branch ON M_BranchID = M_UserLocationM_BranchID
WHERE
M_UserLocationIsActive = 'Y' AND
M_UserLocationM_UserID = ?";
$exec = $this->db->query($sql, [$userId]);
if (!$exec) {
$this->sys_error_db("select user location", $this->db);
exit;
}
$rows = $exec->result_array();
$prRegional = $rows[0]["S_RegionalID"];
$prBranch = $rows[0]["M_BranchCode"];
$filterBranch = "";
if ($prBranch != "") {
$filterBranch = " AND PurchaseRequestM_BranchCode = ?";
$params[] = $prBranch;
}
$filterRegional = "";
if ($prBranch == "") {
$filterRegional = " AND PurchaseRequestS_RegionalID = ?";
$params[] = $prRegional;
}
$totalCount = 0;
$totalPage = 1;
$sql = "SELECT COUNT(*) as total
FROM purchase_request
JOIN s_regional ON S_RegionalID = PurchaseRequestS_RegionalID
WHERE
PurchaseRequestIsActive = 'Y' AND
PurchaseRequestItemCategoryID <> '1' AND
( PurchaseRequestDate BETWEEN ? AND ? ) AND
( PurchaseRequestStatus = ? OR ? = '' ) AND
( PurchaseRequestNumber LIKE ?)
$filterBranch
$filterRegional";
$exec = $this->db->query($sql, $params);
if ($exec) {
$totalCount = $exec->result_array()[0]["total"];
$totalPage = ceil($totalCount / $pageSize);
} else {
$this->sys_error_db("select purchase request", $this->db);
exit;
}
$params[] = $offset;
$params[] = $pageSize;
$sql = "SELECT DISTINCT PurchaseRequestID as prId,
PurchaseRequestNumber as prNumber,
PurchaseRequestDate as prDate,
PurchaseRequestStatus as prStatus,
requestedBy.M_UserUsername as prRequestedBy,
IF(PurchaseRequestApprovedBy IS NULL, '', approvedBy.M_UserUsername) as prApprovedBy,
PurchaseRequestS_RegionalID as prRegionalId,
S_RegionalName as prRegionalName,
PurchaseRequestM_BranchCode as prBranchCode,
M_BranchName as prBranchName,
PurchaseRequestNote as prNote,
PurchaseRequestStatus as prStatus,
IFNULL(S_RegionalID, '') as S_RegionalID,
IFNULL(S_RegionalName, '') as S_RegionalName,
IFNULL(M_BranchCode, '') as M_BranchCode,
IFNULL(M_BranchName, '') as M_BranchName,
item_category.ItemCategoryName as itemCategoryName,
item_category.ItemCategoryID as itemCategoryID,
IF(ah.AssetHandoverID IS NULL, 0, 1) AS hasHandover,
ah.AssetHandoverConfirmedBy as handoverConfirmedBy,
ah.AssetHandoverID AS handoverID,
ah.AssetHandoverDate AS handoverDate,
ah.AssetHandoverToUserID AS handoverToUserID
FROM purchase_request
JOIN s_regional ON S_RegionalID = PurchaseRequestS_RegionalID
JOIN item_category ON item_category.ItemCategoryID = PurchaseRequestItemCategoryID
JOIN m_user requestedBy ON requestedBy.M_UserID = PurchaseRequestRequestedBy
LEFT JOIN m_user approvedBy ON approvedBy.M_UserID = PurchaseRequestApprovedBy
LEFT JOIN m_branch ON M_BranchCode = PurchaseRequestM_BranchCode
LEFT JOIN asset_handover ah
ON ah.AssetHandoverPurchaseRequestID = PurchaseRequestID
AND ah.AssetHandoverIsActive = 'Y'
WHERE
PurchaseRequestIsActive = 'Y' AND
PurchaseRequestItemCategoryID <> '1' AND
( PurchaseRequestDate BETWEEN ? AND ? ) AND
( PurchaseRequestStatus = ? OR ? = '' ) AND
( PurchaseRequestNumber LIKE ? )
$filterBranch
$filterRegional
ORDER BY PurchaseRequestID DESC
LIMIT ?, ?";
$exec = $this->db->query($sql, $params);
if (!$exec) {
$this->sys_error_db("select purchase request", $this->db);
exit;
}
//echo $this->db->last_query();
//exit;
$rows = $exec->result_array();
$result = array(
"total" => $totalPage,
"totalFilter" => $totalCount,
"records" => $rows
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function searchDetail()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$payload = $this->sys_input;
// Menggunakan parameter query
$queryCount = "SELECT count(*) as total
FROM purchase_request_direct_detail
WHERE PurchaseRequestDirectDetailIsActive = 'Y'
AND PurchaseRequestDirectDetailPurchaseRequestDirectID = ?";
$exec = $this->db->query($queryCount, [$payload['PRID']]);
$totalCount = 0;
if ($exec) {
$totalCount = $exec->result_array()[0]["total"];
} else {
$this->db->trans_rollback();
$this->sys_error_db("select purchase request detail", $this->db);;
exit;
}
// Menggunakan parameter query
$query = "SELECT *,
ROW_NUMBER() OVER(ORDER BY PurchaseRequestDirectDetailID) RowNumber ,
'N' as isEditingPrice
FROM purchase_request_direct_detail
WHERE PurchaseRequestDirectDetailIsActive = 'Y'
AND PurchaseRequestDirectDetailPurchaseRequestDirectID = ?
ORDER BY PurchaseRequestDirectDetailStatus ASC,
PurchaseRequestDirectDetailID ASC";
$exec = $this->db->query($query, [$payload['PRID']]);
if ($exec) {
$rows = $exec->result_array();
} else {
$this->db->trans_rollback();
$this->sys_error_db("select purchase request detail", $this->db);
exit;
}
$result = array(
"totalFilter" => $totalCount,
"records" => $rows
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getBranch()
{
try {
$query = "SELECT DISTINCT
M_BranchCode,
M_BranchName
FROM m_branch
WHERE M_BranchIsActive = 'Y'
ORDER BY M_BranchName ASC";
$exec = $this->db->query($query, []);
if ($exec) {
$rows = $exec->result_array();
} else {
$this->db->trans_rollback();
$this->sys_error_db("select branch", $this->db);
exit;
}
$result = array(
"records" => $rows,
"sql" => $this->db->last_query()
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getItemCategory()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$query = "SELECT * FROM item_category WHERE ItemCategoryIsActive = 'Y' AND ItemCategoryID <> '1'";
$exec = $this->db->query($query, []);
if ($exec) {
$rows = $exec->result_array();
$rst = array(
"records" => $rows
);
$this->sys_ok($rst);
} else {
$this->sys_error_db("select item category", $this->db);
exit;
}
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getRegionalBranchByUser()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$userId = $this->sys_user["M_UserID"];
$query = "SELECT
IFNULL(M_BranchID, 0) as M_BranchID,
IFNULL(M_BranchCode, '') as M_BranchCode,
IFNULL(M_BranchName, '') as M_BranchName
FROM m_userlocation
LEFT JOIN m_branch ON M_UserLocationM_BranchID = M_BranchID
WHERE M_UserLocationM_UserID = ? AND
M_UserLocationIsActive = 'Y'
LIMIT 1";
$exec = $this->db->query($query, [$userId]);
if ($exec) {
$rows = $exec->result_array();
} else {
$this->sys_error_db("select branch", $this->db);
exit;
}
$rst = array();
$branchId = $rows[0]["M_BranchID"];
$branchCode = $rows[0]["M_BranchCode"];
$branchName = $rows[0]["M_BranchName"];
if (intval($branchId) > 0) {
$rst = array(
array(
"M_BranchCode" => $branchCode,
"M_BranchName" => $branchName
)
);
} else {
$query = "SELECT DISTINCT
M_BranchCode,
M_BranchName
FROM m_branch
JOIN m_userlocation ON M_BranchS_RegionalID = M_UserLocationS_RegionalID AND M_UserLocationM_UserID = ? AND M_UserLocationIsActive = 'Y'
WHERE M_BranchIsActive = 'Y'
ORDER BY M_BranchName ASC";
$exec = $this->db->query($query, [$userId]);
if ($exec) {
$rst = $exec->result_array();
} else {
$this->sys_error_db("select branch regional", $this->db);
exit;
}
}
$this->sys_ok($rst);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function deletePurchaseRequest()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
}
$this->db->trans_begin();
$payload = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$prId = isset($payload['PRID']) ? $payload['PRID'] : "";
$prNumber = isset($payload['PRNumber']) ? $payload['PRNumber'] : "";
if ($prId == "" || $prId == null) {
$this->sys_error("Invalid PR ID");
exit;
}
$datas_log = array();
$sql = "SELECT * FROM purchase_request WHERE PurchaseRequestID = ? AND PurchaseRequestIsActive = 'Y'";
$query = $this->db->query($sql, [$prId]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request select", $this->db);
exit;
}
$header = $query->row_array();
$datas_log['header'] = $header;
$sql = "SELECT *
FROM purchase_request_detail
JOIN m_item ON M_ItemID = PurchaseRequestDetailM_ItemID AND M_ItemIsActive = 'Y'
JOIN itemunit ON ItemUnitID = PurchaseRequestDetailItemUnitID AND ItemUnitIsActive = 'Y'
WHERE PurchaseRequestDetailPurchaseRequestID = ? AND PurchaseRequestDetailIsActive = 'Y'";
$query = $this->db->query($sql, [$prId]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request detail select", $this->db);
exit;
}
$details = $query->result_array();
$datas_log['details'] = $details;
$sql = "UPDATE purchase_request SET
PurchaseRequestDeleted = NOW(),
PurchaseRequestDeletedUserID = ?,
PurchaseRequestIsActive = 'N'
WHERE PurchaseRequestID = ?";
$deleteParams = [$userId, $prId];
$exec = $this->db->query($sql, $deleteParams);
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request delete error", $this->db);
exit;
}
$sql = "UPDATE purchase_request_detail
SET
PurchaseRequestDetailIsActive = 'N',
PurchaseRequestDetailDeleted = NOW(),
PurchaseRequestDetailDeletedUserID = ?
WHERE PurchaseRequestDetailPurchaseRequestID = ? AND
PurchaseRequestDetailIsActive = 'Y'";
$deleteParams = [$userId, $prId];
$exec = $this->db->query($sql, $deleteParams);
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request detail delete error", $this->db);
exit;
}
$messages = "Purchase Request dengan kode " . $prNumber . " sudah dihapus";
$this->insert_act_log("PRNP", "Delete", $messages, $prId, $this->safeJsonEncode($datas_log), $userId);
$this->db->trans_commit();
$result = array("total" => 1, "records" => array("xId" => 0));
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveDetail()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
}
$this->db->trans_begin();
$payload = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$PRDTotalPrice = intval($payload['PRDAmountRequest']) * intval($payload['PRDEstimationPrice']);
// Gunakan parameter untuk query existensi
$query = "SELECT COUNT(*) as exist
FROM purchase_request_direct_detail
WHERE PurchaseRequestDirectDetailIsActive = 'Y'
AND PurchaseRequestDirectDescription = ?
AND PurchaseRequestDirectDetailPurchaseRequestDirectID = ?";
$existParams = [$payload['PRDDescriptionDetail'], $payload['PRID']];
$exist = $this->db->query($query, $existParams);
if ($exist) {
$row = $exist->row()->exist;
} else {
$this->sys_error_db("exist error", $this->db);
exit;
}
if ($row == 0) {
// Gunakan parameter untuk query insert
$sql = "INSERT INTO purchase_request_direct_detail(
PurchaseRequestDirectDetailPurchaseRequestDirectID,
PurchaseRequestDirectDescription,
PurchaseRequestDirectDetailAmountRequest,
PurchaseRequestDirectDetailAmount,
PurchaseRequestDirectDetailEstimationPrice,
PurchaseRequestDirectDetailTotalEstimationPrice,
PurchaseRequestDirectDetailTotalRealitationPrice,
PurchaseRequestDirectDetailStatus,
PurchaseRequestDirectDetailIsActive,
PurchaseRequestDirectDetailCreated,
PurchaseRequestDirectDetailLastUpdated,
PurchaseRequestDirectDetailDeleted,
PurchaseRequestDirectDetailCreatedUserID,
PurchaseRequestDirectDetailLastUpdatedUserID,
PurchaseRequestDirectDetailDeletedUserID
) VALUES (?, ?, ?, NULL, ?, ?, NULL, 'Pending', 'Y', NOW(), NULL, NULL, ?, NULL, NULL)";
$insertParams = [
$payload['PRID'],
$payload['PRDDescriptionDetail'],
$payload['PRDAmountRequest'],
$payload['PRDEstimationPrice'],
$PRDTotalPrice,
$userId
];
$exec = $this->db->query($sql, $insertParams);
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("request insert error", $this->db);
exit;
} else {
// Gunakan parameter untuk query total harga
$sqlTotalPrice = "SELECT SUM(PurchaseRequestDirectDetailTotalEstimationPrice) AS Total
FROM purchase_request_direct_detail
WHERE PurchaseRequestDirectDetailPurchaseRequestDirectID = ?
AND PurchaseRequestDirectDetailIsActive = 'Y'";
$totalPriceParams = [$payload['PRID']];
$exec = $this->db->query($sqlTotalPrice, $totalPriceParams);
$total = 0;
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("order purchase request error", $this->db);
exit;
} else {
$total = $exec->result_array()[0]["Total"];
}
// Gunakan parameter untuk query update
$sql = "UPDATE purchase_request_direct SET
PurchaseRequestDirectTotalEstimation = ?,
PurchaseRequestLastUpdated = NOW(),
PurchaseRequestLastUpdatedUserID = ?
WHERE PurchaseRequestDirectID = ?
AND PurchaseRequestDirectIsActive = 'Y'";
$updateParams = [$total, $userId, $payload['PRID']];
$exec = $this->db->query($sql, $updateParams);
}
$this->db->trans_commit();
$result = array("total" => 1, "records" => array("xId" => 0));
$this->sys_ok($result);
} else {
$errors = array();
if ($row != 0) {
array_push($errors, array('msg' => 'Data sudah ada'));
}
$result = array("total" => -1, "errors" => $errors, "records" => array('status' => 'ERROR'));
$this->sys_ok($result);
}
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function updateDetail()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
}
$this->db->trans_begin();
$payload = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$PRDTotalPrice = intval($payload["PRDAmountRequest"]) * intval($payload["PRDEstimationPrice"]);
// Gunakan parameter untuk query update
$sql = "UPDATE purchase_request_direct_detail SET
PurchaseRequestDirectDescription = ?,
PurchaseRequestDirectDetailAmountRequest = ?,
PurchaseRequestDirectDetailEstimationPrice = ?,
PurchaseRequestDirectDetailTotalEstimationPrice = ?,
PurchaseRequestDirectDetailLastUpdated = NOW(),
PurchaseRequestDirectDetailLastUpdatedUserID = ?
WHERE PurchaseRequestDirectDetailID = ?";
$updateParams = [
$payload["PRDDescriptionDetail"],
$payload["PRDAmountRequest"],
$payload["PRDEstimationPrice"],
$PRDTotalPrice,
$userId,
$payload["PRDID"]
];
$exec = $this->db->query($sql, $updateParams);
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("request update error", $this->db);
exit;
} else {
// Gunakan parameter untuk query total harga
$sqlTotalPrice = "SELECT SUM(PurchaseRequestDirectDetailTotalEstimationPrice) AS Total
FROM purchase_request_direct_detail
WHERE PurchaseRequestDirectDetailPurchaseRequestDirectID = ?
AND PurchaseRequestDirectDetailIsActive = 'Y'";
$totalPriceParams = [$payload["PRID"]];
$exec = $this->db->query($sqlTotalPrice, $totalPriceParams);
$total = 0;
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("order purchase request error", $this->db);
exit;
} else {
$total = $exec->result_array()[0]["Total"];
}
// Gunakan parameter untuk query update total
$sql = "UPDATE purchase_request_direct SET
PurchaseRequestDirectTotalEstimation = ?,
PurchaseRequestLastUpdated = NOW(),
PurchaseRequestLastUpdatedUserID = ?
WHERE PurchaseRequestDirectID = ?
AND PurchaseRequestDirectIsActive = 'Y'";
$updateTotalParams = [$total, $userId, $payload["PRID"]];
$exec = $this->db->query($sql, $updateTotalParams);
}
$this->db->trans_commit();
$result = array("total" => 1, "records" => array("xId" => $payload["PRDID"]));
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function deleteDetail()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
}
$this->db->trans_begin();
$payload = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
// Gunakan parameter untuk query delete
$sql = "UPDATE purchase_request_direct_detail SET
PurchaseRequestDirectDetailDeleted = NOW(),
PurchaseRequestDirectDetailDeletedUserID = ?,
PurchaseRequestDirectDetailIsActive = 'N'
WHERE PurchaseRequestDirectDetailID = ?";
$deleteParams = [$userId, $payload["PRDID"]];
$exec = $this->db->query($sql, $deleteParams);
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("request delete error", $this->db);
exit;
} else {
// Gunakan parameter untuk query total harga
$sqlTotalPrice = "SELECT SUM(PurchaseRequestDirectDetailTotalEstimationPrice) AS Total
FROM purchase_request_direct_detail
WHERE PurchaseRequestDirectDetailPurchaseRequestDirectID = ?
AND PurchaseRequestDirectDetailIsActive = 'Y'";
$totalPriceParams = [$payload["PRID"]];
$exec = $this->db->query($sqlTotalPrice, $totalPriceParams);
$total = 0;
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("order purchase request error", $this->db);
exit;
} else {
$total = $exec->result_array()[0]["Total"] ?? 0;
}
// Gunakan parameter untuk query update total
$sql = "UPDATE purchase_request_direct SET
PurchaseRequestDirectTotalEstimation = ?,
PurchaseRequestLastUpdated = NOW(),
PurchaseRequestLastUpdatedUserID = ?
WHERE PurchaseRequestDirectID = ?
AND PurchaseRequestDirectIsActive = 'Y'";
$updateTotalParams = [$total, $userId, $payload["PRID"]];
$exec = $this->db->query($sql, $updateTotalParams);
}
$this->db->trans_commit();
$result = array("total" => 1, "records" => array("xId" => 0));
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function orderRequest()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
}
$this->db->trans_begin();
$payload = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
// Gunakan parameter untuk query update detail
$sqlDetail = "UPDATE purchase_request_direct_detail SET
PurchaseRequestDirectDetailLastUpdated = NOW(),
PurchaseRequestDirectDetailLastUpdatedUserID = ?
WHERE PurchaseRequestDirectDetailPurchaseRequestDirectID = ?
AND PurchaseRequestDirectDetailIsActive = 'Y'
AND PurchaseRequestDirectDetailStatus = 'Pending'";
$detailParams = [$userId, $payload["PRID"]];
$exec = $this->db->query($sqlDetail, $detailParams);
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("order purchase request error", $this->db);
exit;
}
// Gunakan parameter untuk query update status
$sql = "UPDATE purchase_request_direct SET
PurchaseRequestDirectStatus = 'Pending',
PurchaseRequestLastUpdated = NOW(),
PurchaseRequestLastUpdatedUserID = ?
WHERE PurchaseRequestDirectID = ?
AND PurchaseRequestDirectIsActive = 'Y'";
$updateParams = [$userId, $payload["PRID"]];
$exec = $this->db->query($sql, $updateParams);
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("order purchase request error", $this->db);
exit;
}
$this->db->trans_commit();
// Gunakan parameter untuk query select
$sql = "SELECT *,
ROW_NUMBER() OVER(ORDER BY PurchaseRequestDirectNumber) RowNumber
FROM purchase_request_direct
WHERE PurchaseRequestDirectIsActive = 'Y'
AND PurchaseRequestCreatedUserID = ?
AND PurchaseRequestDirectID = ?";
$selectParams = [$userId, $payload["PRID"]];
$exec = $this->db->query($sql, $selectParams);
$row = [];
if (!$exec) {
$this->db->trans_rollback();
$this->sys_error_db("order purchase request error", $this->db);
exit;
} else {
$row = $exec->result_array();
}
$result = array("total" => 1, "records" => $row);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getDivisionByUser()
{
try {
$userId = $this->sys_user["M_UserID"];
$rows = [];
$rows[] = array("DivisionID" => "", "DivisionCode" => "", "DivisionName" => "Semua Divisi");
$query = "SELECT DISTINCT
DivisionID,
DivisionCode,
DivisionName
FROM division
WHERE DivisionIsActive = 'Y'
ORDER BY DivisionName ASC";
$exec = $this->db->query($query);
if ($exec) {
$rst = $exec->result_array();
foreach ($rst as $key => $row) {
$rows[] = array("DivisionID" => $row["DivisionID"], "DivisionCode" => $row["DivisionCode"], "DivisionName" => $row["DivisionName"]);
}
} else {
$this->db->trans_rollback();
$this->sys_error_db("select division", $this->db);
exit;
}
$sql = "SELECT DISTINCT
DivisionID,
DivisionCode,
DivisionName
FROM division
JOIN m_userdivision ON M_UserDivisionDivisionID = DivisionID AND M_UserDivisionM_UserID = ?
WHERE DivisionIsActive = 'Y'
ORDER BY M_UserDivisionID DESC
LIMIT 1";
$exec = $this->db->query($sql, [$userId]);
if ($exec) {
$r_selected = $exec->result_array();
if (count($r_selected) > 0) {
$row = $r_selected[0];
} else {
$row = array("DivisionID" => "", "DivisionCode" => "", "DivisionName" => "Semua Divisi");
}
} else {
$this->sys_error_db("select division by user", $this->db);
exit;
}
$result = array(
"records" => $rows,
"selected" => $row
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getItemGroupSubGroup()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$division = isset($prm["division"]) ? $prm["division"] : "";
$rows = [];
$rows[] = array("Nat_GroupID" => "", "Nat_GroupCode" => "", "Nat_GroupName" => "Semua Grup", "subGroups" => [
array("Nat_SubGroupID" => "", "Nat_SubGroupCode" => "", "Nat_SubGroupName" => "Semua Sub Grup")
]);
$sql = "SELECT DISTINCT
Nat_GroupID,
Nat_GroupCode,
Nat_GroupName,
'' as subGroups
FROM nat_group
JOIN m_item ON M_ItemNat_GroupID = Nat_GroupID AND M_ItemIsActive = 'Y'
JOIN m_itemdivision ON M_ItemDivisionM_ItemID = M_ItemID AND M_ItemDivisionIsActive = 'Y' AND (M_ItemDivisionDivisionID = ? OR ? = '')
WHERE Nat_GroupIsActive = 'Y'
ORDER BY Nat_GroupID ASC";
$query = $this->db->query($sql, [$division, $division]);
if (!$query) {
$this->sys_error_db("item group list", $this->db);
exit;
}
$rst = $query->result_array();
foreach ($rst as $key => $row) {
$row["subGroups"] = array(
array("Nat_SubGroupID" => "", "Nat_SubGroupCode" => "", "Nat_SubGroupName" => "Semua Sub Grup")
);
if ($row["Nat_GroupID"] != "") {
$sqlSubGroup = "SELECT DISTINCT
Nat_SubGroupID,
Nat_SubGroupCode,
Nat_SubGroupName
FROM nat_subgroup
WHERE Nat_SubGroupIsActive = 'Y'
AND Nat_SubGroupNat_GroupID = ?
ORDER BY Nat_SubGroupID ASC";
$querySubGroup = $this->db->query($sqlSubGroup, [$row["Nat_GroupID"]]);
if (!$querySubGroup) {
$this->sys_error_db("item sub group list", $this->db);
exit;
}
$subGroups = $querySubGroup->result_array();
foreach ($subGroups as $keySubGroup => $subGroup) {
$row["subGroups"][] = $subGroup;
}
}
$rows[] = $row;
}
$result = array(
"records" => $rows
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getItems()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$user = $this->sys_user;
$prm = $this->sys_input;
$search = isset($prm["search"]) ? $prm["search"] : "";
$itemCategory = isset($prm["itemCategory"]) ? $prm["itemCategory"] : "";
$division = isset($prm["division"]) ? $prm["division"] : "";
$itemGroup = isset($prm["itemGroup"]) ? $prm["itemGroup"] : "";
$itemSubGroup = isset($prm["itemSubGroup"]) ? $prm["itemSubGroup"] : "";
$unitPurchase = isset($prm["unitPurchase"]) ? $prm["unitPurchase"] : "purchase";
$currentPage = isset($prm["currentPage"]) ? $prm["currentPage"] : 1;
$params = [];
// Menambahkan parameter untuk unitPurchase
$params[] = $unitPurchase;
$params[] = $unitPurchase;
$filterDivision = "";
if ($division != "") {
$filterDivision = "JOIN m_itemdivision ON M_ItemDivisionM_ItemID = M_ItemID AND M_ItemDivisionIsActive = 'Y' AND (M_ItemDivisionDivisionID = ? OR ? = '')";
$params[] = $division;
$params[] = $division;
}
$filterItemGroup = "";
if ($itemGroup != "") {
$filterItemGroup = "JOIN nat_group ON M_ItemNat_GroupID = Nat_GroupID AND Nat_GroupIsActive = 'Y' AND (Nat_GroupID = ? OR ? = '')";
$params[] = $itemGroup;
$params[] = $itemGroup;
}
$filterItemSubGroup = "";
if ($itemSubGroup != "") {
$filterItemSubGroup = "JOIN nat_subgroup ON M_ItemNat_SubGroupID = Nat_SubGroupID AND Nat_SubGroupIsActive = 'Y' AND (Nat_SubGroupID = ? OR ? = '')";
$params[] = $itemSubGroup;
$params[] = $itemSubGroup;
}
$filterCoaInventaris = "";
if ($itemCategory == "2") {
$filterCoaInventaris = "JOIN coa_map_inventaris ON CoaMapInventarisM_InventarisGolID = M_ItemM_InventarisGolID AND CoaMapInventarisIsActive = 'Y'";
}
$params[] = $itemCategory;
$params[] = $itemCategory;
$params[] = '%' . $search . '%';
$limit = 10;
$offset = ($currentPage - 1) * $limit;
$sql = "SELECT COUNT(*) as total FROM (
SELECT
DISTINCT M_ItemID
FROM m_item
JOIN itemunitmap ON ItemUnitMapM_ItemID = M_ItemID AND
((ItemUnitMapIsPurchase = 'Y' AND ? = 'purchase') OR
(ItemUnitMapIsBase = 'Y' AND ? = 'base')) AND
ItemUnitMapIsActive = 'Y'
JOIN itemunit ON ItemUnitID = ItemUnitMapItemUnitID AND
ItemUnitIsActive = 'Y'
$filterDivision
$filterItemGroup
$filterItemSubGroup
$filterCoaInventaris
WHERE M_ItemIsActive = 'Y' AND
( M_ItemItem_CategoryID = ? OR ? = '' )
AND M_ItemDesc LIKE ?
) as item";
$query = $this->db->query($sql, $params);
if (!$query) {
$this->sys_error_db("item list", $this->db);
exit;
}
$row = $query->row_array();
$total = ceil($row["total"] / $limit);
$params[] = $limit;
$params[] = $offset;
$sql = "SELECT
DISTINCT M_ItemID as itemId,
M_ItemCode as itemCode,
M_ItemDesc as itemDesc,
0 as qty,
0 as price,
ItemUnitID as unitId,
ItemUnitCode as unitCode,
ItemUnitName as unitName,
0 as detailId,
'draft' as status,
'N' as isEditingPrice,
0 as remaining_stock
FROM m_item
JOIN itemunitmap ON ItemUnitMapM_ItemID = M_ItemID
AND ((ItemUnitMapIsPurchase = 'Y' AND ? = 'purchase') OR
(ItemUnitMapIsBase = 'Y' AND ? = 'base'))
AND ItemUnitMapIsActive = 'Y'
JOIN itemunit ON ItemUnitID = ItemUnitMapItemUnitID
AND ItemUnitIsActive = 'Y'
$filterDivision
$filterItemGroup
$filterItemSubGroup
$filterCoaInventaris
WHERE M_ItemIsActive = 'Y'
AND ( M_ItemItem_CategoryID = ? OR ? = '' )
AND M_ItemDesc LIKE ?
ORDER BY M_ItemDesc ASC
LIMIT ? OFFSET ?";
// Parameter akhir yang digunakan untuk query
$searchParam = $params;
$query = $this->db->query($sql, $searchParam);
if (!$query) {
$this->sys_error_db("item list", $this->db);
//$this->sys_error($this->db->error());
exit;
}
//echo $this->db->last_query();
//exit;
$rows = $query->result_array();
if (count($rows) > 0) {
foreach ($rows as $key => $row) {
$rows[$key]["isSelected"] = $row["isSelected"] == "Y" ? true : false;
$sql = "SELECT SUM(StockQty) as stockQty
FROM stock s
JOIN warehouse w ON s.StockWarehouseID = w.WarehouseID
WHERE s.StockItemID = ?
AND s.StockItemUnitID = ?
AND w.WarehouseS_RegionalID = ?
AND w.WarehouseIsActive = 'Y'
AND (w.WarehouseIsTransit != 'Y' OR w.WarehouseIsTransit IS NULL)
AND w.WarehouseM_BranchID = ?
AND w.WarehouseIsDefault = 'Y'
GROUP BY s.StockItemUnitID";
$qry = $this->db->query($sql, [
$row['itemId'],
$row['unitId'],
$user['S_RegionalID'],
$user['M_BranchID']
]);
if (!$qry) {
$this->sys_error_db("Failed get stock", $this->db);
exit;
}
$rowsstock = $qry->row_array();
$rows[$key]["remaining_stock"] = $rowsstock["stockQty"];
}
}
$result = array(
"records" => $rows,
"total" => $total
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getUnit()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$search = isset($prm["search"]) ? $prm["search"] : "";
// Menggunakan parameter query untuk pencarian unit
$sql = "SELECT
ItemUnitID,
ItemUnitCode,
ItemUnitName,
ItemUnitCreated,
ItemUnitLastUpdated,
ItemUnitIsActive,
ItemUnitUserID
FROM itemunit
WHERE ItemUnitIsActive = 'Y'
AND ItemUnitName LIKE ?
ORDER BY ItemUnitName ASC";
$searchParam = ['%' . $search . '%'];
$query = $this->db->query($sql, $searchParam);
if (!$query) {
$this->sys_error_db("item unit list", $this->db);
exit;
}
$rows = $query->result_array();
$result = array(
"records" => $rows
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getSelectedItem()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$prId = isset($prm["prId"]) ? $prm["prId"] : "";
if ($prId == "") {
$this->sys_error("Invalid PR ID");
exit;
}
$sql = "SELECT PurchaseRequestDetailID as detailId,
PurchaseRequestDetailM_ItemID as itemId,
M_ItemCode as itemCode,
M_ItemDesc as itemDesc,
PurchaseRequestDetailItemUnitID as unitId,
ItemUnitCode as unitCode,
ItemUnitName as unitName,
PurchaseRequestDetailQty as qty,
PurchaseRequestDetailStatus as status,
PurchaseRequestDetailNote as note
FROM purchase_request_detail
JOIN m_item ON M_ItemID = PurchaseRequestDetailM_ItemID AND M_ItemIsActive = 'Y'
JOIN itemunit ON ItemUnitID = PurchaseRequestDetailItemUnitID AND ItemUnitIsActive = 'Y'
WHERE
PurchaseRequestDetailPurchaseRequestID = ? AND
PurchaseRequestDetailIsActive = 'Y'";
$query = $this->db->query($sql, [$prId]);
if (!$query) {
$this->sys_error_db("item list", $this->db);
exit;
}
$rows = $query->result_array();
$result = array(
"records" => $rows
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getUnitByItemId()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$itemId = isset($prm["itemId"]) ? $prm["itemId"] : "";
if ($itemId == "") {
$this->sys_error("Invalid Item ID");
exit;
}
$sql = "SELECT
DISTINCT ItemUnitID as unitId,
ItemUnitCode as unitCode,
ItemUnitName as unitName
FROM itemunitmap
JOIN itemunit ON ItemUnitID = ItemUnitMapItemUnitID AND ItemUnitIsActive = 'Y'
WHERE ItemUnitMapM_ItemID = ?
AND ItemUnitMapIsActive = 'Y'";
$query = $this->db->query($sql, [$itemId]);
if (!$query) {
$this->sys_error_db("item unit list", $this->db);
exit;
}
$rows = $query->result_array();
$result = array(
"records" => $rows
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function savePurchaseRequest()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$prm = $this->sys_input;
$prDateUse = isset($prm["PRDateUse"]) ? $prm["PRDateUse"] : "";
$prDateUse = date("Y-m-d", strtotime($prDateUse));
if ($prDateUse == "" || $prDateUse == null) {
$this->sys_error("Invalid PR Date Use");
exit;
}
$prRegional = isset($prm["PRRegional"]) ? $prm["PRRegional"] : "";
if ($prRegional == "" || $prRegional == null) {
$this->sys_error("Invalid PR Regional");
exit;
}
if ($user["M_BranchID"] != "0") {
$prBranch = isset($prm["PRBranch"]) ? $prm["PRBranch"] : "";
if ($prBranch == "" || $prBranch == null) {
$this->sys_error("Invalid PR Branch");
exit;
}
} else if ($user["M_BranchID"] == "0") {
$prBranch = $prm["PRBranch"];
}
$prItemCategory = isset($prm["PRItemCategory"]) ? $prm["PRItemCategory"] : "";
if ($prItemCategory == "" || $prItemCategory == null) {
$this->sys_error("Invalid PR Item Category");
exit;
}
$prDescription = isset($prm["PRDescription"]) ? $prm["PRDescription"] : "";
$items = isset($prm["items"]) ? $prm["items"] : [];
if (count($items) == 0) {
$this->sys_error("PR Items cannot be empty");
exit;
}
$this->db->trans_begin();
$areaid = $user['M_BranchID'];
$areatype = 'B';
if ($user['loginLevel'] == 'regional') {
$areaid = $user['S_RegionalID'];
$areatype = 'R';
}
$sqlnum = "SELECT `fn_penomoran`(?, ?, ?, ?, ?, ?) AS numpd;";
$quenum = $this->db->query($sqlnum, ['SR', 5, $areatype, $areaid, 'SM', 'Y']);
if (!$quenum) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] generate number doc", $this->db);
exit;
}
$numpd = $quenum->row_array()['numpd'];
$sql = "INSERT INTO purchase_request (
PurchaseRequestNumber,
PurchaseRequestDate,
PurchaseRequestS_RegionalID,
PurchaseRequestM_BranchCode,
PurchaseRequestNote,
PurchaseRequestItemCategoryID,
PurchaseRequestCreated,
PurchaseRequestUserID,
PurchaseRequestCreatedUserID,
PurchaseRequestRequestedBy)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
// VALUES (fn_numbering('PR'), ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$query = $this->db->query($sql, [
$numpd,
$prDateUse,
$prRegional,
$prBranch,
$prDescription,
$prItemCategory,
date("Y-m-d H:i:s"),
$userId,
$userId,
$userId
]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request", $this->db);
exit;
}
$prId = $this->db->insert_id();
foreach ($items as $key => $item) {
$item["total"] = floatval($item["price"]) * floatval($item["qty"]);
$sql = "INSERT INTO purchase_request_detail (
PurchaseRequestDetailPurchaseRequestID,
PurchaseRequestDetailM_ItemID,
PurchaseRequestDetailItemUnitID,
PurchaseRequestDetailQty,
PurchaseRequestDetailPrice,
PurchaseRequestDetailTotal,
PurchaseRequestDetailCreated,
PurchaseRequestDetailCreatedUserID,
PurchaseRequestDetailUserID)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
$query = $this->db->query($sql, [
$prId,
$item["itemId"],
$item["unitId"],
$item["qty"],
$item["price"],
$item["total"],
date("Y-m-d H:i:s"),
$userId,
$userId
]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request detail", $this->db);
exit;
}
}
$sql = "SELECT *
FROM purchase_request
JOIN m_user ON M_UserID = PurchaseRequestCreatedUserID
WHERE PurchaseRequestID = ?";
$query = $this->db->query($sql, [$prId]);
$row = $query->row_array();
$sql = "SELECT * FROM purchase_request_detail WHERE PurchaseRequestDetailPurchaseRequestID = ? AND PurchaseRequestDetailIsActive = 'Y'";
$query = $this->db->query($sql, [$prId]);
$rows = $query->result_array();
$data = array(
"header" => $row,
"details" => $rows
);
$message = "Nomor PR: " . $row["PurchaseRequestNumber"] . " berhasil dibuat oleh " . $row["M_UserUsername"];
$this->insert_act_log("PRNP", "NEW", $message, $prId, $this->safeJsonEncode($data), $userId);
/**
* insert log purchase request detail
*/
foreach ($rows as $row) {
$this->insertPurchaseRequestDetailLog($row, $userId);
}
$this->db->trans_commit();
$this->sys_ok("Purchase Request created successfully");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveAndDoPurchaseRequest()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$user = $this->sys_user;
$userId = $this->sys_user["M_UserID"];
$branchId = $user["M_BranchID"];
$regionalId = $user["S_RegionalID"];
$prm = $this->sys_input;
$prDateUse = isset($prm["PRDateUse"]) ? $prm["PRDateUse"] : "";
$prDateUse = date("Y-m-d", strtotime($prDateUse));
if ($prDateUse == "" || $prDateUse == null) {
$this->sys_error("Invalid PR Date Use");
exit;
}
$prRegional = isset($prm["PRRegional"]) ? $prm["PRRegional"] : "";
if ($prRegional == "" || $prRegional == null) {
$this->sys_error("Invalid PR Regional");
exit;
}
if ($user["M_BranchID"] != "0") {
$prBranch = isset($prm["PRBranch"]) ? $prm["PRBranch"] : "";
if ($prBranch == "" || $prBranch == null) {
$this->sys_error("Invalid PR Branch");
exit;
}
} else if ($user["M_BranchID"] == "0") {
$prBranch = $prm["PRBranch"];
}
$prItemCategory = isset($prm["PRItemCategory"]) ? $prm["PRItemCategory"] : "";
if ($prItemCategory == "" || $prItemCategory == null) {
$this->sys_error("Invalid PR Item Category");
exit;
}
$prDescription = isset($prm["PRDescription"]) ? $prm["PRDescription"] : "";
$items = isset($prm["items"]) ? $prm["items"] : [];
if (count($items) == 0) {
$this->sys_error("PR Items cannot be empty");
exit;
}
$this->db->trans_begin();
$areaid = $user['M_BranchID'];
$areatype = 'B';
if ($user['loginLevel'] == 'regional') {
$areaid = $user['S_RegionalID'];
$areatype = 'R';
}
$sqlnum = "SELECT `fn_penomoran`(?, ?, ?, ?, ?, ?) AS numpd;";
$quenum = $this->db->query($sqlnum, ['SR', 5, $areatype, $areaid, 'SM', 'Y']);
if (!$quenum) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] generate number doc", $this->db);
exit;
}
$numpd = $quenum->row_array()['numpd'];
$sql = "INSERT INTO purchase_request (
PurchaseRequestNumber,
PurchaseRequestDate,
PurchaseRequestS_RegionalID,
PurchaseRequestM_BranchCode,
PurchaseRequestNote,
PurchaseRequestItemCategoryID,
PurchaseRequestStatus,
PurchaseRequestCreated,
PurchaseRequestUserID,
PurchaseRequestCreatedUserID,
PurchaseRequestRequestedBy)
VALUES (?, ?, ?, ?, ?, ?, 'Pending', ?, ?, ?, ?)";
// VALUES (fn_numbering('PR'), ?, ?, ?, ?, ?, 'Pending', ?, ?, ?, ?)";
$query = $this->db->query($sql, [
$numpd,
$prDateUse,
$prRegional,
$prBranch,
$prDescription,
$prItemCategory,
date("Y-m-d H:i:s"),
$userId,
$userId,
$userId
]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request", $this->db);
exit;
}
$prId = $this->db->insert_id();
foreach ($items as $key => $item) {
$item["total"] = floatval($item["price"]) * floatval($item["qty"]);
$sql = "INSERT INTO purchase_request_detail (
PurchaseRequestDetailPurchaseRequestID,
PurchaseRequestDetailM_ItemID,
PurchaseRequestDetailItemUnitID,
PurchaseRequestDetailQty,
PurchaseRequestDetailPrice,
PurchaseRequestDetailTotal,
PurchaseRequestDetailStatus,
PurchaseRequestDetailCreated,
PurchaseRequestDetailCreatedUserID,
PurchaseRequestDetailUserID)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$query = $this->db->query($sql, [
$prId,
$item["itemId"],
$item["unitId"],
$item["qty"],
$item["price"],
$item["total"],
'Pending',
date("Y-m-d H:i:s"),
$userId,
$userId
]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request detail", $this->db);
exit;
}
}
$sql = "SELECT *
FROM purchase_request
JOIN m_user ON M_UserID = PurchaseRequestCreatedUserID
WHERE PurchaseRequestID = ?";
$query = $this->db->query($sql, [$prId]);
$row = $query->row_array();
$sql = "SELECT * FROM purchase_request_detail WHERE PurchaseRequestDetailPurchaseRequestID = ? AND PurchaseRequestDetailIsActive = 'Y'";
$query = $this->db->query($sql, [$prId]);
$rows = $query->result_array();
$data = array(
"header" => $row,
"details" => $rows
);
$message = "Nomor PR: " . $row["PurchaseRequestNumber"] . " berhasil dibuat dan diajukan langsung oleh " . $row["M_UserUsername"];
$this->insert_act_log("PRNP", "Pending", $message, $prId, $this->safeJsonEncode($data), $userId);
/**
* insert log purchase request detail
*/
foreach ($rows as $row) {
$this->insertPurchaseRequestDetailLog($row, $userId);
}
// notification
$this->saveNotification($userId, $prDateUse, $numpd, $prId, $branchId, $regionalId);
$this->db->trans_commit();
$this->sys_ok("Purchase Request created and submitted successfully");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
private function insertPurchaseRequestDetailLog(array $data, int $userId)
{
$sql = "INSERT INTO acc_one_log.purchase_request_detail_log (
PurchaseRequestDetailLogPurchaseRequestDetailID,
PurchaseRequestDetailLogPurchaseRequestID,
PurchaseRequestDetailLogType,
PurchaseRequestDetailLogOldQty,
PurchaseRequestDetailLogOldPrice,
PurchaseRequestDetailLogCreated,
PurchaseRequestDetailLogUserID
) VALUES (?,?,'CREATE',?,?,NOW(),?)";
$params = [
$data['PurchaseRequestDetailID'],
$data['PurchaseRequestDetailPurchaseRequestID'],
$data['PurchaseRequestDetailQty'] ?? null,
$data['PurchaseRequestDetailPrice'] ?? null,
$userId
];
if (!$this->db->query($sql, $params)) {
$this->sys_error_db("Gagal insert purchase_request_detail_log", $this->db);
$this->db->trans_rollback();
exit;
}
}
function insert_act_log($code, $status, $description, $refId, $data, $userId)
{
$sql = "INSERT INTO user_activity(
UserActivityCode,
UserActivityStatus,
UserActivityDescription,
UserActivityRefID,
UserActivityData,
UserActivityUserID,
UserActivityCreated)
VALUES (?,?,?,?,?,?,?)";
$query = $this->db->query($sql, [$code, $status, $description, $refId, $data, $userId, date("Y-m-d H:i:s")]);
if (!$query) {
$this->sys_error_db("user activity", $this->db);
exit;
}
}
function getDetailRequest()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$userId = $this->sys_user["M_UserID"];
$prm = $this->sys_input;
$requestId = isset($prm["requestId"]) ? $prm["requestId"] : "";
if ($requestId == "" || $requestId == null) {
$this->sys_error("Invalid Request ID");
exit;
}
$sql = "SELECT
PurchaseRequestDetailID as detailId,
PurchaseRequestDetailM_ItemID as itemId,
M_ItemCode as itemCode,
M_ItemDesc as itemDesc,
PurchaseRequestDetailItemUnitID as unitId,
ItemUnitCode as unitCode,
ItemUnitName as unitName,
PurchaseRequestDetailQty as qty,
PurchaseRequestDetailPrice as price,
PurchaseRequestDetailTotal as total,
PurchaseRequestDetailStatus as status,
'N' as isEditingPrice
FROM purchase_request_detail
JOIN m_item ON M_ItemID = PurchaseRequestDetailM_ItemID AND M_ItemIsActive = 'Y'
JOIN itemunit ON ItemUnitID = PurchaseRequestDetailItemUnitID AND ItemUnitIsActive = 'Y'
WHERE PurchaseRequestDetailPurchaseRequestID = ? AND PurchaseRequestDetailIsActive = 'Y'";
$query = $this->db->query($sql, [$requestId]);
if (!$query) {
$this->sys_error_db("purchase request detail", $this->db);
exit;
}
$rows = $query->result_array();
$result = array(
"records" => $rows
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getRiwayatItem()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$para = $this->sys_input;
$user = $this->sys_user;
$place = $user['M_BranchID'];
if ($user['M_BranchID'] == '0') {
$place = 'R';
}
$page = 0;
$limit = 10;
if ($para['page'] > 0) {
$page = ($para['page'] - 1) * $limit;
}
$sqlpast = "SELECT
PurchaseRequestDetailID,
PurchaseRequestDetailM_ItemID,
M_ItemDesc,
PurchaseRequestDetailItemUnitID,
ItemUnitName,
PurchaseRequestDetailQty,
PurchaseRequestStatus,
PurchaseRequestDetailCreated
FROM purchase_request_detail
JOIN purchase_request ON PurchaseRequestID = PurchaseRequestDetailPurchaseRequestID
JOIN m_item ON M_ItemID = PurchaseRequestDetailM_ItemID
JOIN itemunit ON ItemUnitID = PurchaseRequestDetailItemUnitID
JOIN m_user ON PurchaseRequestRequestedBy = M_UserID
AND M_UserIsActive = 'Y'
WHERE PurchaseRequestDetailM_ItemID = ?
AND PurchaseRequestDetailIsActive = 'Y'
AND (M_UserM_BranchID = ? OR 'R' = ?)
ORDER BY PurchaseRequestDetailCreated DESC";
$sqldata = $sqlpast . ' LIMIT ? OFFSET ?';
$quepast = $this->db->query($sqldata, [
$para['itemid'],
$place,
$place,
$limit,
$page
]);
if (!$quepast) {
$this->sys_error_db("[Error] get item history");
exit;
}
$sqltotal = "SELECT COUNT(*) AS total FROM ($sqlpast) as x ";
$quetotal = $this->db->query($sqltotal, [
$para['itemid'],
$place,
$place,
]);
if (!$quetotal) {
$this->sys_error_db("[Error] get total item history");
exit;
}
$result = array(
"records" => $quepast->result_array(),
"total" => $quetotal->row_array()['total']
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
private function safeJsonEncode($data)
{
// Coba encode data ke JSON
$jsonData = json_encode($data);
// Cek apakah terjadi error saat encode
if (json_last_error() !== JSON_ERROR_NONE) {
$errorMsg = json_last_error_msg();
error_log("JSON encode error: " . $errorMsg);
// Lakukan sanitasi dan perbaikan data
$fixedData = $this->fixJsonEncodeIssues($data, $errorMsg);
// Coba encode lagi setelah diperbaiki
$jsonData = json_encode($fixedData);
// Jika masih error, log dan kembalikan objek kosong
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("Failed to fix JSON encode issues: " . json_last_error_msg());
// Kembalikan objek kosong jika masih gagal
return '{}';
}
}
return $jsonData;
}
// Fungsi untuk memperbaiki masalah encoding JSON
private function fixJsonEncodeIssues($data, $errorMsg)
{
// Buat salinan data untuk dimodifikasi
$fixedData = $data;
// Tangani berbagai jenis error
if (strpos($errorMsg, 'Malformed UTF-8') !== false) {
// Perbaiki masalah karakter UTF-8
$fixedData = $this->fixUTF8Issues($fixedData);
} else if (strpos($errorMsg, 'Inf and NaN cannot be JSON encoded') !== false) {
// Perbaiki masalah nilai Infinity atau NaN
$fixedData = $this->fixInfNanIssues($fixedData);
} else {
// Konversi semua nilai numerik menjadi string untuk menghindari masalah presisi
$fixedData = $this->convertNumericValuesToStrings($fixedData);
// Perbaiki masalah referensi recursif
$fixedData = $this->fixRecursiveReferences($fixedData);
}
return $fixedData;
}
// Perbaiki masalah karakter UTF-8
private function fixUTF8Issues($data)
{
if (is_string($data)) {
return mb_convert_encoding($data, 'UTF-8', 'UTF-8');
} else if (is_array($data)) {
foreach ($data as $key => $value) {
$data[$key] = $this->fixUTF8Issues($value);
}
}
return $data;
}
// Perbaiki masalah nilai Infinity atau NaN
private function fixInfNanIssues($data)
{
if (is_array($data)) {
foreach ($data as $key => $value) {
if (is_float($value) && (is_nan($value) || is_infinite($value))) {
$data[$key] = (string)$value; // Konversi ke string
} else if (is_array($value)) {
$data[$key] = $this->fixInfNanIssues($value);
}
}
}
return $data;
}
// Perbaiki masalah referensi recursif
private function fixRecursiveReferences($data, $depth = 0)
{
// Batasi kedalaman rekursi untuk menghindari infinite loop
if ($depth > 50) {
return "[MAX_DEPTH_REACHED]";
}
if (is_array($data)) {
$result = [];
foreach ($data as $key => $value) {
if (is_array($value)) {
$result[$key] = $this->fixRecursiveReferences($value, $depth + 1);
} else {
$result[$key] = $value;
}
}
return $result;
}
return $data;
}
// Cari dan konversi numerik ke string secara rekursif
private function convertNumericValuesToStrings($data)
{
if (is_array($data)) {
foreach ($data as $key => $value) {
if (is_array($value)) {
$data[$key] = $this->convertNumericValuesToStrings($value);
} else if (is_numeric($value)) {
$data[$key] = (string)$value;
} else if (is_bool($value)) {
$data[$key] = $value ? "true" : "false";
}
}
}
return $data;
}
function updatePurchaseRequest()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$messages_log = [];
$datas_log = [];
$prm = $this->sys_input;
$userId = $this->sys_user["M_UserID"];
$user = $this->sys_user;
$user_name = $this->sys_user["M_UserUsername"];
$branchId = $user["M_BranchID"];
$regionalId = $user["S_RegionalID"];
$prId = isset($prm["PRID"]) ? $prm["PRID"] : "";
$prNumber = isset($prm["PRNumber"]) ? $prm["PRNumber"] : "";
$prDateUse = isset($prm["PRDateUse"]) ? $prm["PRDateUse"] : "";
$prDateUse = date("Y-m-d", strtotime($prDateUse));
if ($prDateUse == "" || $prDateUse == null) {
$this->sys_error("Invalid PR Date Use");
exit;
}
$prRegional = isset($prm["PRRegional"]) ? $prm["PRRegional"] : "";
if ($prRegional == "" || $prRegional == null) {
$this->sys_error("Invalid PR Regional");
exit;
}
if ($user["M_BranchID"] != "0") {
$prBranch = isset($prm["PRBranch"]) ? $prm["PRBranch"] : "";
if ($prBranch == "" || $prBranch == null) {
$this->sys_error("Invalid PR Branch");
exit;
}
} else if ($user["M_BranchID"] == "0") {
$prBranch = $prm["PRBranch"];
}
$prItemCategory = isset($prm["PRItemCategory"]) ? $prm["PRItemCategory"] : "";
if ($prItemCategory == "" || $prItemCategory == null) {
$this->sys_error("Invalid PR Item Category");
exit;
}
$prDescription = isset($prm["PRDescription"]) ? $prm["PRDescription"] : "";
$items = isset($prm["items"]) ? $prm["items"] : [];
if (count($items) == 0) {
$this->sys_error("PR Items cannot be empty");
exit;
}
$this->db->trans_begin();
$status = '';
$statusdetail = '';
$status_log = 'Update';
$prStatus = '';
if ($prm["act"] == "pending") {
$status = ", PurchaseRequestStatus = 'Pending'";
$statusdetail = ", PurchaseRequestDetailStatus = 'Pending'";
$status_log = 'Pending';
$prStatus = 'Pending';
}
$sql = "SELECT *, changeitemcategory.ItemCategoryName as changeitemcategoryname, olditemcategory.ItemCategoryName as olditemcategoryname
FROM purchase_request
JOIN item_category changeitemcategory ON changeitemcategory.ItemCategoryID = PurchaseRequestItemCategoryID AND changeitemcategory.ItemCategoryIsActive = 'Y'
JOIN item_category olditemcategory ON olditemcategory.ItemCategoryID = ? AND olditemcategory.ItemCategoryIsActive = 'Y'
WHERE PurchaseRequestID = ? AND PurchaseRequestIsActive = 'Y'";
$query = $this->db->query($sql, [$prItemCategory, $prId]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request", $this->db);
exit;
}
$row = $query->row_array();
$number = $row["PurchaseRequestNumber"];
$datas_log['header'] = $row;
if ($row["PurchaseRequestDate"] != $prDateUse) {
$messages_log[] = "Perubahan tanggal PR: " . $row["PurchaseRequestDate"] . " menjadi " . $prDateUse;
}
if ($row["PurchaseRequestNote"] != $prDescription) {
$messages_log[] = "Perubahan keterangan PR: " . $row["PurchaseRequestNote"] . " menjadi " . $prDescription;
}
if ($row["changeitemcategoryname"] != $row["olditemcategoryname"]) {
$messages_log[] = "Perubahan kategori item PR: " . $row["olditemcategoryname"] . " menjadi " . $row["changeitemcategoryname"];
}
if ($row["PurchaseRequestStatus"] != $prStatus && $prStatus != '') {
$messages_log[] = "Perubahan status PR: " . $row["PurchaseRequestStatus"] . " menjadi " . $prStatus;
}
$sql = "UPDATE purchase_request SET
PurchaseRequestDate = ?,
PurchaseRequestS_RegionalID = ?,
PurchaseRequestM_BranchCode = ?,
PurchaseRequestNote = ?,
PurchaseRequestItemCategoryID = ?,
PurchaseRequestLastUpdated = ?,
PurchaseRequestLastUpdatedUserID = ?
$status
WHERE PurchaseRequestID = ?";
$params = [
$prDateUse,
$prRegional,
$prBranch,
$prDescription,
$prItemCategory,
date("Y-m-d H:i:s"),
$userId,
$prId
];
$query = $this->db->query($sql, $params);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request update", $this->db);
exit;
}
$detail_ids = [];
$datas_log['new_details'] = [];
$datas_log['updated_details'] = [];
$datas_log['deleted_details'] = [];
foreach ($items as $key => $item) {
$item["total"] = floatval($item["price"]) * floatval($item["qty"]);
if ($item["detailId"] == "" || intval($item["detailId"]) == 0) {
$sql = "INSERT INTO purchase_request_detail (
PurchaseRequestDetailPurchaseRequestID,
PurchaseRequestDetailM_ItemID,
PurchaseRequestDetailItemUnitID,
PurchaseRequestDetailQty,
PurchaseRequestDetailPrice,
PurchaseRequestDetailTotal,
PurchaseRequestDetailCreated,
PurchaseRequestDetailCreatedUserID
$statusdetail
)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
$query = $this->db->query($sql, [
$prId,
$item["itemId"],
$item["unitId"],
$item["qty"],
$item["price"],
$item["total"],
date("Y-m-d H:i:s"),
$userId
]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request detail insert", $this->db);
exit;
}
$prId = $this->db->insert_id();
$detail_ids[] = $prId;
$messages_log[] = "Item : " . $item["itemCode"] . " " . $item["itemDesc"] . " " . $item["unitCode"] . " " . $item["unitName"] . " " . $item["qty"] . " " . $item["price"] . " " . $item["total"] . " berhasil ditambahkan";
$datas_log['new_details'][] = $this->convertNumericValuesToStrings($item);
} else {
$sql = "SELECT * ,
newitem.M_ItemCode as newitemcode,
olditem.M_ItemCode as olditemcode,
newitem.M_ItemDesc as newitemdesc,
olditem.M_ItemDesc as olditemdesc,
newitemunit.ItemUnitCode as newitemunitcode,
olditemunit.ItemUnitCode as olditemunitcode,
newitemunit.ItemUnitName as newitemunitname,
olditemunit.ItemUnitName as olditemunitname
FROM purchase_request_detail
JOIN m_item newitem ON newitem.M_ItemID = PurchaseRequestDetailM_ItemID AND newitem.M_ItemIsActive = 'Y'
JOIN itemunit newitemunit ON newitemunit.ItemUnitID = ? AND newitemunit.ItemUnitIsActive = 'Y'
JOIN m_item olditem ON olditem.M_ItemID = ? AND olditem.M_ItemIsActive = 'Y'
JOIN itemunit olditemunit ON olditemunit.ItemUnitID = PurchaseRequestDetailItemUnitID AND olditemunit.ItemUnitIsActive = 'Y'
WHERE PurchaseRequestDetailID = ? AND PurchaseRequestDetailIsActive = 'Y'";
$query = $this->db->query($sql, [$item["unitId"], $item["itemId"], $item["detailId"]]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request detail select", $this->db);
exit;
}
$row = $query->row_array();
if ($row["newitemcode"] != $row["olditemcode"] || $row["newitemdesc"] != $row["olditemdesc"]) {
$messages_log[] = "Perubahan item : (" . $row["olditemcode"] . ") " . $row["olditemdesc"] . " menjadi (" . $row["newitemcode"] . ") " . $row["newitemdesc"];
}
if ($row["newitemunitcode"] != $row["olditemunitcode"] || $row["newitemunitname"] != $row["olditemunitname"]) {
$messages_log[] = "Perubahan satuan : " . $row["olditemunitname"] . " menjadi " . $row["newitemunitname"] . " pada item : (" . $row["newitemcode"] . ") " . $row["newitemdesc"];
}
if ($row["PurchaseRequestDetailQty"] != $item["qty"]) {
$messages_log[] = "Perubahan kuantitas : " . $row["PurchaseRequestDetailQty"] . " menjadi " . $item["qty"] . " pada item : (" . $row["newitemcode"] . ") " . $row["newitemdesc"];
}
if ($row["PurchaseRequestDetailPrice"] != $item["price"]) {
$messages_log[] = "Perubahan harga : " . $row["PurchaseRequestDetailPrice"] . " menjadi " . $item["price"] . " pada item : (" . $row["newitemcode"] . ") " . $row["newitemdesc"];
}
$sql = "UPDATE purchase_request_detail
SET
PurchaseRequestDetailM_ItemID = ?,
PurchaseRequestDetailItemUnitID = ?,
PurchaseRequestDetailQty = ?,
PurchaseRequestDetailPrice = ?,
PurchaseRequestDetailTotal = ?,
PurchaseRequestDetailLastUpdated = ?,
PurchaseRequestDetailLastUpdatedUserID = ?
$statusdetail
WHERE PurchaseRequestDetailID = ?";
$query = $this->db->query($sql, [
$item["itemId"],
$item["unitId"],
$item["qty"],
$item["price"],
$item["total"],
date("Y-m-d H:i:s"),
$userId,
$item["detailId"]
]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request detail update", $this->db);
exit;
}
$detail_ids[] = $item["detailId"];
$datas_log['updated_details'][] = $this->convertNumericValuesToStrings($item);
}
}
$sql = "SELECT *
FROM purchase_request_detail
WHERE PurchaseRequestDetailPurchaseRequestID = ? AND
PurchaseRequestDetailIsActive = 'Y' AND
PurchaseRequestDetailID NOT IN (" . implode(",", $detail_ids) . ")";
$query = $this->db->query($sql, [$prId]);
$deleted_rows = $query->result_array();
foreach ($deleted_rows as $row) {
$sql = "UPDATE purchase_request_detail
SET
PurchaseRequestDetailIsActive = 'N',
PurchaseRequestDetailDeleted = ?,
PurchaseRequestDetailDeletedUserID = ?
WHERE PurchaseRequestDetailID = ?";
$query = $this->db->query($sql, [date("Y-m-d H:i:s"), $userId, $row["PurchaseRequestDetailID"]]);
if (!$query) {
$this->db->trans_rollback();
$this->sys_error_db("purchase request detail delete", $this->db);
exit;
}
$messages_log[] = "Item: (" . $row["M_ItemCode"] . ") " . $row["M_ItemDesc"] . " | " . $row["ItemUnitName"] . " sebanyak " . $row["PurchaseRequestDetailQty"] . " berhasil dihapus";
$datas_log['deleted_details'][] = $this->convertNumericValuesToStrings($row);
}
$this->db->trans_commit();
if (count($messages_log) > 0) {
$message = "Perubahan PR: " . $prNumber . "\n";
$message .= implode("\n", $messages_log);
} else {
$message = "PR: " . $prNumber . " tanpa perubahan";
}
$datas_log = $this->convertNumericValuesToStrings($datas_log);
$this->insert_act_log("PRNP", $status_log, $message, $prId, $this->safeJsonEncode($datas_log), $userId);
if ($prm["act"] == "pending") {
// notification
$this->saveNotification($userId, $prDateUse, $number, $prId, $branchId, $regionalId);
}
$sql = "SELECT *
FROM purchase_request_detail
WHERE PurchaseRequestDetailPurchaseRequestID = ? AND
PurchaseRequestDetailIsActive = 'Y'";
$query = $this->db->query($sql, [$prId]);
$rows = $query->result_array();
foreach ($rows as $key => $row) {
$this->updatePurchaseRequestDetailLog($row, $userId);
}
$this->sys_ok("Purchase Request updated successfully");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function confirmHandOver()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$this->db->trans_begin();
$prm = $this->sys_input;
$user = $this->sys_user;
# validasi pr milik user #
$pr = "SELECT PurchaseRequestUserID
FROM purchase_request
WHERE PurchaseRequestID = ?";
$qrypr = $this->db->query($pr, [$prm['purchaseRequestID']]);
if (!$qrypr) {
$this->sys_error_db("[Error] select pr user", $this->db);
exit;
}
$rowpr = $qrypr->row_array();
if (!$rowpr || $rowpr['PurchaseRequestUserID'] != $user['M_UserID']) {
$this->db->trans_rollback();
$this->sys_error("Anda tidak berhak mengkonfirmasi PR ini");
return;
}
# update confirm hand over #
$sql = "UPDATE asset_handover SET
AssetHandoverConfirmedAt = NOW(),
AssetHandoverConfirmedBy = ?,
AssetHandoverLastUpdated = NOW(),
AssetHandoverUserID = ?
WHERE AssetHandoverPurchaseRequestID = ?";
$qry = $this->db->query($sql, [
$user['M_UserID'],
$user['M_UserID'],
$prm['purchaseRequestID']
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("[Error] update confirm hand over", $this->db);
exit;
}
# update status purchase request #
// $sql_pr = "UPDATE purchase_request
// SET PurchaseRequestStatus = 'Closed',
// PurchaseRequestLastUpdated = NOW(),
// PurchaseRequestLastUpdatedUserID = ?
// WHERE PurchaseRequestID = ?";
// $qry_pr = $this->db->query($sql_pr, [$user['M_UserID'], $prm['purchaseRequestID']]);
// if (!$qry_pr) {
// $this->db->trans_rollback();
// $this->sys_error_db("[Error] update status purchase request", $this->db);
// exit;
// }
// $sql = "SELECT *
// FROM purchase_request
// JOIN m_user ON M_UserID = PurchaseRequestCreatedUserID
// WHERE PurchaseRequestID = ?";
// $query = $this->db->query($sql, [$prm['purchaseRequestID']]);
// $row = $query->row_array();
// $sql = "SELECT * FROM purchase_request_detail WHERE PurchaseRequestDetailPurchaseRequestID = ? AND PurchaseRequestDetailIsActive = 'Y'";
// $query = $this->db->query($sql, [$prm['purchaseRequestID']]);
// $rows = $query->result_array();
// $data = array(
// "header" => $row,
// "details" => $rows
// );
// $message = "Nomor PR: " . $row["PurchaseRequestNumber"] . " telah melakukan konfirmasi serah terima oleh " . $row["M_UserUsername"];
// $this->insert_act_log("PRNP", "CONFIRM", $message, $prm['purchaseRequestID'], $this->safeJsonEncode($data), $user['M_UserID']);
$this->db->trans_commit();
$this->sys_ok("Konfirmasi serah terima berhasil disimpan");
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
private function updatePurchaseRequestDetailLog(array $data, int $userId)
{
$sql = "UPDATE acc_one_log.purchase_request_detail_log SET
PurchaseRequestDetailLogType = 'CREATE',
PurchaseRequestDetailLogOldQty = ?,
PurchaseRequestDetailLogOldPrice = ?,
PurchaseRequestDetailLogCreated = NOW(),
PurchaseRequestDetailLogUserID = ?
WHERE PurchaseRequestDetailLogPurchaseRequestDetailID = ?
AND PurchaseRequestDetailLogPurchaseRequestID = ?";
$params = [
$data['PurchaseRequestDetailQty'] ?? null,
$data['PurchaseRequestDetailPrice'] ?? null,
$userId,
$data['PurchaseRequestDetailID'],
$data['PurchaseRequestDetailPurchaseRequestID'],
];
if (!$this->db->query($sql, $params)) {
$this->sys_error_db("Gagal update purchase_request_detail_log", $this->db);
$this->db->trans_rollback();
exit;
}
}
// notifications
function saveNotification($userId, $dateRequest, $number, $refID, $branchId, $regionalId)
{
try {
$this->db->trans_begin();
$xdate = date('d-m-Y');
$sql_user = "SELECT M_UserID, M_UserUsername
FROM m_user
WHERE M_UserIsActive = 'Y'
AND M_UserID = ?";
$qry_user = $this->db->query($sql_user, [$userId]);
if ($qry_user) {
$username = $qry_user->row_array();
} else {
$this->sys_error_db("select user error", $this->db);
exit;
}
$description = "Request <strong>PR NON PERSEDIAAN</strong> pada tanggal <strong>" . $xdate . "</strong> oleh <strong>" . $username['M_UserUsername'] . "</strong> dengan nomor <strong>" . $number . "</strong>";
$sql_menu = "SELECT S_MenuID,
S_MenuName,
S_MenuUrl,
S_MenuLevel
FROM s_menu
WHERE S_MenuID = 69";
$qry_menu = $this->db->query($sql_menu, []);
if ($qry_menu) {
$rowurl = $qry_menu->row_array();
} else {
$this->sys_error_db("select menu error", $this->db);
exit;
}
$url = $rowurl['S_MenuUrl'] . "?flag=N&status=Pending&startdate=" . $dateRequest . "&search=" . $number;
// cari user penerima notifikasi
if ($branchId != 0) {
// user cabang
$sql_receive_user = "SELECT * FROM m_user
JOIN m_branch ON M_UserM_BranchID = M_BranchID
AND M_BranchIsActive = 'Y'
AND M_BranchID = ?
WHERE M_UserIsActive = 'Y'
AND M_UserM_ApproveLevelID IN (1,2)";
$qry_receive_user = $this->db->query($sql_receive_user, [$branchId]);
if ($qry_receive_user) {
$rowsuser = $qry_receive_user->result_array();
} else {
$this->sys_error_db("select receive user error", $this->db);
exit;
}
} else if ($branchId == 0) {
// user regional
$sql_receive_user = "SELECT * FROM m_user
JOIN s_regional ON M_UserS_RegionalID = S_RegionalID
AND S_RegionalIsActive = 'Y'
AND S_RegionalID = ?
WHERE M_UserIsActive = 'Y'
AND M_UserM_BranchID = 0
AND M_UserM_ApproveLevelID IN (1,2)";
$qry_receive_user = $this->db->query($sql_receive_user, [$regionalId]);
if ($qry_receive_user) {
$rowsuser = $qry_receive_user->result_array();
} else {
$this->sys_error_db("select receive user error", $this->db);
exit;
}
}
$sql = "INSERT INTO notification(
NotificationRefID,
NotificationType,
NotificationDescription,
NotificationUrl,
NotificationUserID,
NotificationCreated) VALUES(?,?,?,?,?,NOW())";
$qry = $this->db->query($sql, [
$refID,
'Purchase Request (P)',
$description,
$url,
$userId
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("insert notification error", $this->db);
exit;
}
$lastid = $this->db->insert_id();
// insert ke detail notification
foreach ($rowsuser as $row) {
$sql_detail = "INSERT INTO notification_detail(
NotificationDetailNotificationID,
NotificationDetailM_UserID,
NotificationDetailM_ApproveLevelID,
NotificationDetailStatus,
NotificationDetailCreated,
NotificationDetailUserID) VALUES(?,?,?,?,NOW(),?)";
$qry_detail = $this->db->query($sql_detail, [
$lastid,
$row['M_UserID'], // user penerima notifikasi
$row['M_UserM_ApproveLevelID'],
'unread',
$userId
]);
if (!$qry_detail) {
$this->db->trans_rollback();
$this->sys_error_db("insert notification detail error", $this->db);
exit;
}
}
$this->db->trans_commit();
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
}