Files
be-accone/application/controllers/mockup/nonpersediaanapproved/Nonpersediaanapproved.php

716 lines
28 KiB
PHP

<?php
class Nonpersediaanapproved extends MY_Controller
{
var $db;
public function index()
{
echo "COA API";
// $cek = $this->db->query("select database() as current_db")->result();
// print_r($cek);
}
public function __construct()
{
parent::__construct();
}
public function search()
{
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$search = '%' . $prm['search'] . '%';
$startDate = $prm['startDate'];
$endDate = $prm['endDate'];
$status = $prm['status'];
$page = $prm['page'];
$user = $this->sys_user;
$regionalID = $user['S_RegionalID'];
$branchCode = $user['M_BranchCode'];
$loginType = $user['M_UserLocationFlag'];
$userID = $user['M_UserID'];
$approveLevelID = $user['M_UserM_ApproveLevelID'];
$flag = $prm['flag'];
$sqlBranch = '';
if ($loginType == 'B' || $loginType == 'RB') {
$sqlBranch = "AND PurchaseRequestM_BranchCode = '{$branchCode}'";
}
$sqlStatus = '';
if ($status != 'All') {
$sqlStatus = "AND PurchaseRequestStatus = '{$status}'";
}
$number_limit = 20;
$number_offset = 0;
if ($prm['page'] > 0) {
$number_offset = ($prm['page'] - 1) * $number_limit;
}
if ($approveLevelID == '1') {
if ($flag == 'G') {
$sqlStockRequest = " AND (PurchaseRequestVerifiedBy = 0 OR PurchaseRequestVerifiedBy IS NULL) ";
}
} else if ($approveLevelID == '2') {
if ($flag == 'G') {
$sqlStockRequest = " AND PurchaseRequestApprovedBy IS NULL";
}
}
$sql = "SELECT m_approve_level.* FROM m_user
JOIN m_approve_level
ON M_UserM_ApproveLevelID = M_ApproveLevelID
WHERE M_UserID = ?;";
$qry = $this->db->query($sql, [$userID]);
if (!$qry) {
$this->sys_error_db("Error cek approval level");
exit;
}
$approvalLevel = $qry->result_array();
if (count($approvalLevel) == 0) {
$result = array(
'total' => 0,
'records' => []
);
$this->sys_ok($result);
exit;
}
$totalStart = $approvalLevel[0]['M_ApproveLevelStartTotal'];
$totalEnd = $approvalLevel[0]['M_ApproveLevelEndTotal'];
$sql = "SELECT
COUNT(PurchaseRequestID) total
FROM purchase_request
JOIN s_regional
ON PurchaseRequestS_RegionalID = S_RegionalID
AND S_RegionalIsActive = 'Y'
JOIN item_category
ON PurchaseRequestItemCategoryID = ItemCategoryID
AND ItemCategoryIsActive = 'Y'
JOIN m_user b
ON PurchaseRequestRequestedBy = b.M_UserID
AND b.M_UserIsActive = 'Y'
AND S_RegionalIsActive = 'Y'
LEFT JOIN m_user a
ON PurchaseRequestApprovedBy = a.M_UserID
AND a.M_UserIsActive = 'Y'
LEFT JOIN
m_branch
ON PurchaseRequestM_BranchCode = M_BranchCode
WHERE PurchaseRequestIsActive = 'Y' AND PurchaseRequestItemCategoryID <> 1
AND (PurchaseRequestNumber LIKE ? OR PurchaseRequestRefNumber LIKE ? OR PurchaseRequestRequestedBy LIKE ?)
AND (PurchaseRequestDate BETWEEN ? AND ?) AND PurchaseRequestS_RegionalID = ?
$sqlBranch
$sqlStatus
$sqlStockRequest
-- AND PurchaseRequestTotal BETWEEN $totalStart AND $totalEnd
";
$qry = $this->db->query($sql, [$search, $search, $search, $startDate, $endDate, $regionalID]);
if (!$qry) {
$this->sys_error_db("Error searching");
exit;
}
$total = $qry->row_array()['total'];
$tot_page = ceil($total / $number_limit);
$params = [$search, $search, $search, $startDate, $endDate, $regionalID];
$params[] = $number_limit;
$params[] = $number_offset;
$sql = "SELECT
PurchaseRequestID prID,
DATE_FORMAT(PurchaseRequestDate, '%d-%m-%Y') prDate,
PurchaseRequestNumber prNumber,
PurchaseRequestRefNumber prRefNumber,
PurchaseRequestNote prNote,
PurchaseRequestTotal prTotal,
PurchaseRequestItemCategoryID prItemType,
ItemCategoryName prItemTypeName,
PurchaseRequestStatus prStatus,
IFNULL(PurchaseRequestVerifiedBy, 0) AS PurchaseRequestVerifiedBy,
PurchaseRequestVerifiedDate,
DATE_FORMAT(PurchaseRequestApprovedDate, '%d-%m-%Y %H:%i') prApprovedDate,
a.M_userUserName prApprovedBy,
b.M_UserID prRequestedByID,
b.M_userUserName prRequestedBy,
b.M_UserM_BranchID prRequestedByFromBranch,
S_RegionalName prRegionalName,
M_BranchName prBranchName,
IFNULL(`fn_getitemnamebyprid`(PurchaseRequestID), '') prItemName
FROM purchase_request
JOIN s_regional
ON PurchaseRequestS_RegionalID = S_RegionalID
AND S_RegionalIsActive = 'Y'
JOIN item_category
ON PurchaseRequestItemCategoryID = ItemCategoryID
AND ItemCategoryIsActive = 'Y'
JOIN m_user b
ON PurchaseRequestRequestedBy = b.M_UserID
AND b.M_UserIsActive = 'Y'
LEFT JOIN m_user a
ON PurchaseRequestApprovedBy = a.M_UserID
AND a.M_UserIsActive = 'Y'
LEFT JOIN
m_branch
ON PurchaseRequestM_BranchCode = M_BranchCode
WHERE PurchaseRequestIsActive = 'Y' AND PurchaseRequestItemCategoryID <> 1
AND (PurchaseRequestNumber LIKE ? OR PurchaseRequestRefNumber LIKE ? OR PurchaseRequestRequestedBy LIKE ?)
AND (PurchaseRequestDate BETWEEN ? AND ?) AND PurchaseRequestS_RegionalID = ?
$sqlBranch
$sqlStatus
$sqlStockRequest
-- AND PurchaseRequestTotal BETWEEN $totalStart AND $totalEnd --PurchaseRequestTotal masih selalu 0, belum disimpan
LIMIT ? OFFSET ?
";
$qry = $this->db->query($sql, $params);
if (!$qry) {
$this->sys_error_db("Error searching");
exit;
}
// echo $this->db->last_query();
// exit;
$data = $qry->result_array();
$result = array(
'total' => $tot_page,
'records' => $data,
// "qry" => $this->db->last_query()
);
$this->sys_ok($result);
}
function getlevel()
{
try {
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
}
$payload = $this->sys_input;
$user = $this->sys_user;
$regionalID = $user['S_RegionalID'];
$branchCode = $user['M_BranchCode'];
$loginType = $user['M_UserLocationFlag'];
$userID = $user['M_UserID'];
$sql = "SELECT m_approve_level.* FROM m_user
JOIN m_approve_level
ON M_UserM_ApproveLevelID = M_ApproveLevelID
WHERE M_UserID = ?";
$qry = $this->db->query($sql, [$userID]);
if (!$qry) {
$this->sys_error_db("Error cek approval level");
exit;
}
$approvalLevel = $qry->result_array();
if (count($approvalLevel) == 0) {
$result = array(
'total' => 0,
'records' => []
);
$this->sys_ok($result);
exit;
} else {
$result = array(
"total" => 1,
"records" => $approvalLevel,
"sql" => $this->db->last_query()
);
$this->sys_ok($result);
}
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
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 getDetail()
{
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$id = $prm['id'];
$sql = "SELECT
PurchaseRequestDetailID prDetailID,
PurchaseRequestDetailPurchaseRequestID prDetailPrID,
PurchaseRequestDetailM_ItemID prDetailItemID,
M_ItemDesc prDetailItemName,
M_ItemCode prDetailItemCode,
PurchaseRequestDetailQty prDetailItemQty,
PurchaseRequestDetailPrice prDetailItemPrice
FROM purchase_request_detail
JOIN m_item
ON PurchaseRequestDetailM_ItemID = M_ItemID
WHERE PurchaseRequestDetailPurchaseRequestID = ?
AND PurchaseRequestDetailIsActive = 'Y';";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->sys_error_db("Error get detail");
exit;
}
$data = $qry->result_array();
$this->sys_ok($data);
}
function approve()
{
$this->db->trans_begin();
// $this->db->trans_rollback();
// $this->db->trans_commit();
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$detail = $prm['detail'];
$user = $this->sys_user;
$userid = $user["M_UserID"];
$pr = $prm['pr'];
$total = $prm['total'];
$type = $prm['type'];
// get user level approval
$sqlevel = "SELECT M_UserM_ApproveLevelID FROM m_user WHERE M_UserIsActive = 'Y' AND M_UserID = ?";
$qulevel = $this->db->query($sqlevel, [$userid]);
if (!$qulevel) {
$this->sys_error_db("[Error] get approval level user");
exit;
}
$userlevel = $qulevel->row_array()['M_UserM_ApproveLevelID'];
$datas_log = array();
$sql = "SELECT * FROM purchase_request WHERE PurchaseRequestID = ? AND PurchaseRequestIsActive = 'Y'";
$query = $this->db->query($sql, [$pr['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, [$pr['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;
if ($type == 'A') {
// verifikasi jika manager
if ($userlevel == '1') {
$sql = "UPDATE purchase_request SET
PurchaseRequestVerifiedBy = ?,
PurchaseRequestVerifiedDate = NOW()
WHERE PurchaseRequestID = ?
AND PurchaseRequestStatus = 'Pending'";
$qry = $this->db->query($sql, [$userid, $pr['prID']]);
if (!$qry) {
$this->sys_error_db("Error verifikasi manager");
$this->db->trans_rollback();
exit;
}
$messages = "Purchase Request dengan kode " . $header['PurchaseRequestNumber'] . " telah diverifikasi";
$this->insert_act_log("PRNP", "Verified", $messages, $pr['prID'], $this->safeJsonEncode($datas_log), $userid);
}
if ($userlevel == '2') {
// -- PurchaseRequestTotal = ?,
$sql = "UPDATE purchase_request
SET
PurchaseRequestStatus = ?,
PurchaseRequestApprovedDate = NOW(),
PurchaseRequestApprovedBy = ?
WHERE PurchaseRequestID = ?
AND PurchaseRequestStatus = 'Pending'";
$qry = $this->db->query($sql, ['Approved', $userid, $pr['prID']]);
if (!$qry) {
$this->sys_error_db("Error Approve");
$this->db->trans_rollback();
exit;
}
$sql = "UPDATE purchase_request_detail
SET PurchaseRequestDetailStatus = ?
WHERE PurchaseRequestDetailPurchaseRequestID = ?
AND PurchaseRequestDetailStatus = 'Pending'";
$qry = $this->db->query($sql, ['Approved', $pr['prID']]);
if (!$qry) {
$this->sys_error_db("Error update detail");
$this->db->trans_rollback();
exit;
}
$messages = "Purchase Request dengan kode " . $header['PurchaseRequestNumber'] . " telah di approved";
$this->insert_act_log("PRNP", "Approved", $messages, $pr['prID'], $this->safeJsonEncode($datas_log), $userid);
}
} else if ($type == 'R') {
$sql = "UPDATE purchase_request
SET
PurchaseRequestStatus = ?,
PurchaseRequestApprovedDate = NOW(),
PurchaseRequestApprovedBy = ?
WHERE PurchaseRequestID = ?
AND PurchaseRequestStatus = 'Pending'";
$qry = $this->db->query($sql, ['Rejected', $userid, $pr['prID']]);
if (!$qry) {
$this->sys_error_db("Error Approve");
$this->db->trans_rollback();
exit;
}
$sql = "UPDATE purchase_request_detail
SET PurchaseRequestDetailStatus = ?
WHERE PurchaseRequestDetailPurchaseRequestID = ?
AND PurchaseRequestDetailStatus = 'Pending'";
$qry = $this->db->query($sql, ['Rejected', $pr['prID']]);
if (!$qry) {
$this->sys_error_db("Error update detail");
$this->db->trans_rollback();
exit;
}
$messages = "Purchase Request dengan kode " . $header['PurchaseRequestNumber'] . " telah di reject";
$this->insert_act_log("PRNP", "Rejected", $messages, $pr['prID'], $this->safeJsonEncode($datas_log), $userid);
} else if ($type == 'U') {
// un approve kacab/reg
if ($userlevel == '2') {
// -- PurchaseRequestTotal = ?,
$sql = "UPDATE purchase_request
SET
PurchaseRequestStatus = ?,
PurchaseRequestApprovedDate = NULL,
PurchaseRequestApprovedBy = NULL
WHERE PurchaseRequestID = ?
AND PurchaseRequestStatus = 'Approved'";
$qry = $this->db->query($sql, ['Pending', $pr['prID']]);
if (!$qry) {
$this->sys_error_db("Error Approve");
$this->db->trans_rollback();
exit;
}
$sql = "UPDATE purchase_request_detail
SET PurchaseRequestDetailStatus = ?
WHERE PurchaseRequestDetailPurchaseRequestID = ?
AND PurchaseRequestDetailStatus = 'Approved'";
$qry = $this->db->query($sql, ['Pending', $pr['prID']]);
if (!$qry) {
$this->sys_error_db("Error update detail");
$this->db->trans_rollback();
exit;
}
$messages = "Purchase Request dengan kode " . $header['PurchaseRequestNumber'] . " telah di unapproved";
$this->insert_act_log("PRNP", "Unapproved", $messages, $pr['prID'], $this->safeJsonEncode($datas_log), $userid);
}
}
// update notification
$this->readNotif($type, $userlevel, $userid, $pr['prID']);
$this->db->trans_commit();
$this->sys_ok('Berhasil');
}
// read notification
function readNotif($type, $userlevel, $userId, $refID)
{
$this->db->trans_begin();
// cari user penerima notifikasi
if ($type == "U") {
$sql_get = "SELECT PurchaseRequestID,
M_UserID,
M_UserUsername,
NotificationID,
NotificationDetailID,
NotificationDetailStatus,
NotificationDetailM_UserID,
NotificationDetailM_ApproveLevelID
FROM notification
JOIN purchase_request ON NotificationRefID = PurchaseRequestID
AND PurchaseRequestIsActive = 'Y'
JOIN notification_detail ON NotificationID = NotificationDetailNotificationID
JOIN m_user ON NotificationUserID = M_UserID
WHERE PurchaseRequestID = ?
AND NotificationDetailStatus = 'read'";
$qry = $this->db->query($sql_get, [$refID]);
if (!$qry) {
$this->sys_error_db("select user notification error", $this->db);
exit;
}
$rowsuser = $qry->result_array();
} else {
$sql_get = "SELECT PurchaseRequestID,
M_UserID,
M_UserUsername,
NotificationID,
NotificationDetailID,
NotificationDetailStatus,
NotificationDetailM_UserID,
NotificationDetailM_ApproveLevelID
FROM notification
JOIN purchase_request ON NotificationRefID = PurchaseRequestID
AND PurchaseRequestIsActive = 'Y'
JOIN notification_detail ON NotificationID = NotificationDetailNotificationID
JOIN m_user ON NotificationUserID = M_UserID
WHERE PurchaseRequestID = ?
AND NotificationDetailStatus = 'unread'";
$qry = $this->db->query($sql_get, [$refID]);
if (!$qry) {
$this->sys_error_db("select user notification error", $this->db);
exit;
}
$rowsuser = $qry->result_array();
}
foreach ($rowsuser as $user) {
if ($type == "A") {
if ($userlevel === '1') {
// verifikasi manager
$sql = "UPDATE notification_detail SET
NotificationDetailStatus = 'read',
NotificationDetailLastUpdated = NOW(),
NotificationDetailUserID = ?
WHERE NotificationDetailNotificationID = ?
AND NotificationDetailM_ApproveLevelID = ?";
$qry = $this->db->query($sql, [$userId, $user["NotificationID"], $user["NotificationDetailM_ApproveLevelID"]]);
if (!$qry) {
$this->sys_error_db("update notification error", $this->db);
exit;
}
} else if ($userlevel === '2') {
// approve kepala cabang / regional
$sql = "UPDATE notification_detail SET
NotificationDetailStatus = 'read',
NotificationDetailLastUpdated = NOW(),
NotificationDetailUserID = ?
WHERE NotificationDetailNotificationID = ?
AND NotificationDetailM_ApproveLevelID = ?";
$qry = $this->db->query($sql, [$userId, $user["NotificationID"], $user["NotificationDetailM_ApproveLevelID"]]);
if (!$qry) {
$this->sys_error_db("update notification error", $this->db);
exit;
}
}
} else if ($type == "R") {
$sql = "UPDATE notification_detail SET
NotificationDetailStatus = 'read',
NotificationDetailLastUpdated = NOW(),
NotificationDetailUserID = ?
WHERE NotificationDetailNotificationID = ?";
$qry = $this->db->query($sql, [$userId, $user["NotificationID"]]);
if (!$qry) {
$this->sys_error_db("update notification error", $this->db);
exit;
}
} else if ($type == "U") {
if ($userlevel === '2') {
$sql = "UPDATE notification_detail SET
NotificationDetailStatus = 'unread',
NotificationDetailLastUpdated = NOW(),
NotificationDetailUserID = ?
WHERE NotificationDetailNotificationID = ?
AND NotificationDetailM_ApproveLevelID = ?";
$qry = $this->db->query($sql, [$userId, $user["NotificationID"], $user["NotificationDetailM_ApproveLevelID"]]);
if (!$qry) {
$this->sys_error_db("update notification error", $this->db);
exit;
}
}
}
}
$this->db->trans_commit();
}
function updateqty()
{
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$this->db->trans_begin();
$userId = $this->sys_user["M_UserID"];
$prm = $this->sys_input;
$arrItems = $prm["arrItems"];
if (count($arrItems) > 0) {
foreach ($arrItems as $key => $value) {
$sql = "UPDATE purchase_request_detail SET
PurchaseRequestDetailQty = ?,
PurchaseRequestDetailLastUpdated = NOW(),
PurchaseRequestDetailLastUpdatedUserID = ?
WHERE PurchaseRequestDetailID = ?";
$qry = $this->db->query($sql, [
$value['prDetailItemQty'],
$userId,
$value['prDetailID']
]);
if (!$qry) {
$this->db->trans_rollback();
$this->sys_error_db("Failed update qty", $this->db);
exit;
}
}
}
$this->db->trans_commit();
$this->sys_ok("Berhasil update qty");
}
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;
}
}