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; } $totalStart = $approvalLevel[0]['M_ApproveLevelStartTotal']; $totalEnd = $approvalLevel[0]['M_ApproveLevelEndTotal']; $query = "SELECT prd.*, mu.M_UserFullName as M_RequesterFullName FROM purchase_request_direct as prd JOIN m_user as mu ON prd.PurchaseRequestCreatedUserID = mu.M_UserID WHERE PurchaseRequestDirectStatus != 'Draft' AND PurchaseRequestDirectIsActive = 'Y' AND PurchaseRequestDirectTotalEstimation BETWEEN $totalStart AND $totalEnd AND PurchaseRequestDirectID IN ( SELECT PurchaseRequestDirectDetailPurchaseRequestDirectID FROM purchase_direct_attachment JOIN purchase_request_direct_detail ON PurchaseDirectAttachmentPurchaseRequestDirectDetailID = PurchaseRequestDirectDetailID AND PurchaseRequestDirectDetailIsActive = 'Y' WHERE PurchaseDirectAttachmentIsActive = 'Y' ) AND PurchaseRequestDirectNumber LIKE '%" . $payload["search"] . "%'"; $queryCount = "SELECT count(*) as total FROM purchase_request_direct as prd JOIN m_user as mu ON prd.PurchaseRequestCreatedUserID = mu.M_UserID WHERE PurchaseRequestDirectStatus != 'Draft' AND PurchaseRequestDirectIsActive = 'Y' AND PurchaseRequestDirectTotalEstimation BETWEEN $totalStart AND $totalEnd AND PurchaseRequestDirectID IN ( SELECT PurchaseRequestDirectDetailPurchaseRequestDirectID FROM purchase_direct_attachment JOIN purchase_request_direct_detail ON PurchaseDirectAttachmentPurchaseRequestDirectDetailID = PurchaseRequestDirectDetailID AND PurchaseRequestDirectDetailIsActive = 'Y' WHERE PurchaseDirectAttachmentIsActive = 'Y' ) AND PurchaseRequestDirectNumber LIKE '%" . $payload["search"] . "%'"; if ((isset($payload["startDate"]) && isset($payload["endDate"])) && (trim($payload["startDate"]) !== "" && trim($payload["endDate"]) !== "")) { $query .= " AND (PurchaseRequestDirectDate BETWEEN '{$payload["startDate"]} 00:00:00' AND '{$payload["endDate"]} 23:59:59' OR PurchaseRequestDirectDateUse BETWEEN '{$payload["startDate"]} 00:00:00' AND '{$payload["endDate"]} 23:59:59')"; $queryCount .= " AND (PurchaseRequestDirectDate BETWEEN '{$payload["startDate"]} 00:00:00' AND '{$payload["endDate"]} 23:59:59' OR PurchaseRequestDirectDateUse BETWEEN '{$payload["startDate"]} 00:00:00' AND '{$payload["endDate"]} 23:59:59')"; } if ($payload["status"]) { $query .= " AND PurchaseRequestDirectStatus = {$payload["status"]}"; $queryCount .= " AND PurchaseRequestDirectStatus = {$payload["status"]}"; } $exec = $this->db->query($queryCount, []); $numberLimit = 20; $numberOffset = 0; if ($payload["currentPage"] > 0) { $numberOffset = ($payload["currentPage"] - 1) * $numberLimit; } $totalCount = 0; $totalPage = 0; if ($exec) { $totalCount = $exec->result_array()[0]["total"]; $totalPage = ceil($totalCount / $numberLimit); } else { $this->db->trans_rollback(); $this->sys_error_db("select purchase request", $this->db); exit; } $query = $query . " ORDER BY PurchaseRequestDirectNumber DESC LIMIT {$numberLimit} OFFSET {$numberOffset}"; $exec = $this->db->query($query, []); if ($exec) { $rows = $exec->result_array(); } else { $this->db->trans_rollback(); $this->sys_error_db("select purchase request", $this->db); exit; } $result = array( "total" => $totalPage, "totalFilter" => $totalCount, "records" => $rows, "sql" => $this->db->last_query() ); $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; $queryCount = "SELECT count(*) as total FROM purchase_request_direct_detail WHERE PurchaseRequestDirectDetailIsActive = 'Y' AND PurchaseRequestDirectDetailPurchaseRequestDirectID = {$payload['PRID']}"; $exec = $this->db->query($queryCount, []); $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; } $query = "SELECT *, ROW_NUMBER() OVER(ORDER BY PurchaseRequestDirectDetailID) RowNumber, '' as isAttachemnt, '' as dataAttachment FROM purchase_request_direct_detail WHERE PurchaseRequestDirectDetailIsActive = 'Y' AND PurchaseRequestDirectDetailPurchaseRequestDirectID = {$payload['PRID']} ORDER BY PurchaseRequestDirectDetailStatus ASC, PurchaseRequestDirectDetailID ASC"; $exec = $this->db->query($query, []); if ($exec) { $rows = $exec->result_array(); } else { $this->db->trans_rollback(); $this->sys_error_db("select purchase request detail", $this->db); exit; } foreach ($rows as $key => $value) { $sql = "SELECT PurchaseDirectAttachmentID, PurchaseDirectAttachmentPurchaseRequestDirectDetailID, PurchaseDirectAttachmentName FROM purchase_direct_attachment WHERE PurchaseDirectAttachmentIsActive = 'Y' AND PurchaseDirectAttachmentPurchaseRequestDirectDetailID = ?"; $qry = $this->db->query($sql, [$value['PurchaseRequestDirectDetailID']]); if (!$qry) { $this->db->trans_rollback(); $this->sys_error_db("select purchase_direct_attachment", $this->db); exit; } // echo $this->db->last_query(); // exit; $rowsdata = $qry->result_array(); if (count($rowsdata) > 0) { $rows[$key]['isAttachemnt'] = true; $rows[$key]['dataAttachment'] = $rowsdata; } else { $rows[$key]['isAttachemnt'] = false; $rows[$key]['dataAttachment'] = []; } } $result = array( "totalFilter" => $totalCount, "records" => $rows, "sql" => $this->db->last_query() ); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } 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 deleteDetail() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); } $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $sqlDetail = "UPDATE purchase_request_direct_detail SET PurchaseRequestDirectDetailIsActive = 'N', PurchaseRequestDirectDetailDeleted = NOW(), PurchaseRequestDirectDetailDeletedUserID = {$userId} WHERE PurchaseRequestDirectDetailStatus = 'Pending' AND PurchaseRequestDirectDetailID = {$payload['PRDID']} AND PurchaseRequestDirectDetailIsActive = 'Y'"; $exec = $this->db->query($sqlDetail, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("reject request error", $this->db); exit; } else { $sqlTotalPrice = "SELECT SUM(PurchaseRequestDirectDetailTotalEstimationPrice) AS Total FROM purchase_request_direct_detail WHERE PurchaseRequestDirectDetailPurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectDetailIsActive = 'Y'"; $exec = $this->db->query($sqlTotalPrice, []); $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; } $sql = "UPDATE purchase_request_direct SET PurchaseRequestDirectTotalEstimation = {$total}, PurchaseRequestLastUpdated = NOW(), PurchaseRequestLastUpdatedUserID = {$userId} WHERE PurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectIsActive = 'Y'"; $exec = $this->db->query($sql, []); $this->db->trans_commit(); $result = array("total" => 1, "records" => array("xPRDID" => $payload['PRDID'])); $this->sys_ok($result); } } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function approveRequest() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); } $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $sqlDetail = "UPDATE purchase_request_direct_detail SET PurchaseRequestDirectDetailStatus = 'Ordered', PurchaseRequestDirectDetailLastUpdated = NOW(), PurchaseRequestDirectDetailLastUpdatedUserID = {$userId} WHERE PurchaseRequestDirectDetailStatus = 'Pending' AND PurchaseRequestDirectDetailPurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectDetailIsActive = 'Y'"; $exec = $this->db->query($sqlDetail, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("approve request error", $this->db); exit; } $total = 0; $query = "SELECT SUM(IF(PurchaseRequestDirectDetailTotalRealitationPrice IS NULL, PurchaseRequestDirectDetailTotalEstimationPrice,PurchaseRequestDirectDetailTotalRealitationPrice)) as total FROM purchase_request_direct_detail WHERE PurchaseRequestDirectDetailIsActive = 'Y' AND PurchaseRequestDirectDetailPurchaseRequestDirectID = {$payload['PRID']}"; $exec = $this->db->query($query); if ($exec) { $total = $exec->row()->total; } else { $this->db->trans_rollback(); $this->sys_error_db("select purchase_request_direct_detail", $this->db); exit; } $sql = "UPDATE purchase_request_direct SET PurchaseRequestDirectNote = '{$payload['PRNote']}', PurchaseRequestDirectStatus = 'Approved', PurchaseRequestDirectApprovedDate = NOW(), PurchaseRequestDirectApprovedBy = {$userId}, PurchaseRequestDirectTotalRealitation = {$total}, PurchaseRequestLastUpdated = NOW(), PurchaseRequestLastUpdatedUserID = {$userId} WHERE PurchaseRequestDirectStatus = 'Pending' AND PurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectIsActive = 'Y'"; $exec = $this->db->query($sql, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("approve request error", $this->db); exit; } $rowQuery = "SELECT prd.*, mu.M_UserFullName AS M_RequesterFullName FROM purchase_request_direct AS prd INNER JOIN m_user AS mu ON prd.PurchaseRequestCreatedUserID = mu.M_UserID WHERE PurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectIsActive = 'Y'"; $exec = $this->db->query($rowQuery, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("approve request error", $this->db); exit; } $datas_log = array(); $sql = "SELECT * FROM purchase_request_direct WHERE PurchaseRequestDirectID = ? AND PurchaseRequestDirectIsActive = 'Y'"; $query = $this->db->query($sql, [$payload['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_direct_detail JOIN itemunit ON PurchaseRequestDirectDetailItemUnitID = ItemUnitID WHERE PurchaseRequestDirectDetailPurchaseRequestDirectID = ? AND PurchaseRequestDirectDetailIsActive = 'Y'"; $query = $this->db->query($sql, [$payload['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; $rowQuery = "SELECT prd.*, mu.M_UserFullName AS M_RequesterFullName FROM purchase_request_direct AS prd INNER JOIN m_user AS mu ON prd.PurchaseRequestCreatedUserID = mu.M_UserID WHERE PurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectIsActive = 'Y'"; $exec = $this->db->query($rowQuery, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("approve request error", $this->db); exit; } $messages = "Purchase Request Direct dengan kode " . $header['PurchaseRequestDirectNumber'] . " telah di approved"; $this->insert_act_log("PRD", "Approved", $messages, $payload['PRID'], $this->safeJsonEncode($datas_log), $userId); $this->db->trans_commit(); $result = array("total" => 1, "records" => $exec->result_array()); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function approveRequestNota() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); } $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $sql = "UPDATE purchase_request_direct SET PurchaseRequestDirectNotaStatus = 'Approved', PurchaseRequestDirectNotaApprovedDate = NOW(), PurchaseRequestDirectNotaApprovedBy = {$userId}, PurchaseRequestLastUpdated = NOW(), PurchaseRequestLastUpdatedUserID = {$userId} WHERE PurchaseRequestDirectNotaStatus = 'Pending' AND PurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectIsActive = 'Y'"; $exec = $this->db->query($sql, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("approve request error", $this->db); exit; } $rowQuery = "SELECT prd.*, mu.M_UserFullName AS M_RequesterFullName FROM purchase_request_direct AS prd INNER JOIN m_user AS mu ON prd.PurchaseRequestCreatedUserID = mu.M_UserID WHERE PurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectIsActive = 'Y'"; $exec = $this->db->query($rowQuery, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("approve request error", $this->db); exit; } $datas_log = array(); $sql = "SELECT * FROM purchase_request_direct WHERE PurchaseRequestDirectID = ? AND PurchaseRequestDirectIsActive = 'Y'"; $query = $this->db->query($sql, [$payload['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_direct_detail JOIN itemunit ON PurchaseRequestDirectDetailItemUnitID = ItemUnitID WHERE PurchaseRequestDirectDetailPurchaseRequestDirectID = ? AND PurchaseRequestDirectDetailIsActive = 'Y'"; $query = $this->db->query($sql, [$payload['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; $rowQuery = "SELECT prd.*, mu.M_UserFullName AS M_RequesterFullName FROM purchase_request_direct AS prd INNER JOIN m_user AS mu ON prd.PurchaseRequestCreatedUserID = mu.M_UserID WHERE PurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectIsActive = 'Y'"; $exec = $this->db->query($rowQuery, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("approve request error", $this->db); exit; } $messages = "Purchase Request Direct Nota dengan kode " . $header['PurchaseRequestDirectNumber'] . " telah di approved"; $this->insert_act_log("PRD", "Approved", $messages, $payload['PRID'], $this->safeJsonEncode($datas_log), $userId); $this->db->trans_commit(); $result = array("total" => 1, "records" => $exec->result_array()); $this->sys_ok($result); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function rejectRequest() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); } $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; $sql = "UPDATE purchase_request_direct SET PurchaseRequestDirectStatus = 'Draft', PurchaseRequestDirectNotaStatus = 'Draft', PurchaseRequestLastUpdated = NOW(), PurchaseRequestLastUpdatedUserID = {$userId} WHERE PurchaseRequestDirectStatus = 'Pending' AND PurchaseRequestDirectID = {$payload["PRID"]} AND PurchaseRequestDirectIsActive = 'Y'"; $exec = $this->db->query($sql, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("reject request error", $this->db); exit; } $datas_log = array(); $sql = "SELECT * FROM purchase_request_direct WHERE PurchaseRequestDirectID = ? AND PurchaseRequestDirectIsActive = 'Y'"; $query = $this->db->query($sql, [$payload['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_direct_detail JOIN itemunit ON PurchaseRequestDirectDetailItemUnitID = ItemUnitID WHERE PurchaseRequestDirectDetailPurchaseRequestDirectID = ? AND PurchaseRequestDirectDetailIsActive = 'Y'"; $query = $this->db->query($sql, [$payload['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; $rowQuery = "SELECT prd.*, mu.M_UserFullName AS M_RequesterFullName FROM purchase_request_direct AS prd INNER JOIN m_user AS mu ON prd.PurchaseRequestCreatedUserID = mu.M_UserID WHERE PurchaseRequestDirectID = {$payload['PRID']} AND PurchaseRequestDirectIsActive = 'Y'"; $exec = $this->db->query($rowQuery, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("approve request error", $this->db); exit; } $messages = "Purchase Request Direct dengan kode " . $header['PurchaseRequestDirectNumber'] . " telah di reject"; $this->insert_act_log("PRD", "Reject", $messages, $payload['PRID'], $this->safeJsonEncode($datas_log), $userId); $this->db->trans_commit(); $result = array("total" => 1, "records" => array("xPRID" => $payload["PRID"])); $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"); } $payload = $this->sys_input; $userId = $this->sys_user["M_UserID"]; /* $price = 0; $sqlPrice = "SELECT PurchaseRequestDirectDetailEstimationPrice AS Price FROM purchase_request_direct_detail WHERE PurchaseRequestDirectDetailID = {$payload['PRDID']}"; $exec = $this->db->query($sqlPrice, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("update amount error", $this->db); exit; } else { $price = $exec->result_array()[0]["Price"]; } */ $PRDTotal = $payload['PRDAmount'] * $payload['PRDPrice']; $sqlDetail = "UPDATE purchase_request_direct_detail SET PurchaseRequestDirectDetailAmount = {$payload['PRDAmount']}, PurchaseRequestDirectDetailRealitationPrice = {$payload['PRDPrice']}, PurchaseRequestDirectDetailTotalRealitationPrice = {$PRDTotal}, PurchaseRequestDirectDetailLastUpdated = NOW(), PurchaseRequestDirectDetailLastUpdatedUserID = {$userId} WHERE PurchaseRequestDirectDetailID = {$payload['PRDID']} AND PurchaseRequestDirectDetailIsActive = 'Y'"; $exec = $this->db->query($sqlDetail, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("update amount error", $this->db); exit; } $total = 0; $query = "SELECT SUM(IF(PurchaseRequestDirectDetailTotalRealitationPrice IS NULL, PurchaseRequestDirectDetailTotalEstimationPrice,PurchaseRequestDirectDetailTotalRealitationPrice)) as total FROM purchase_request_direct_detail WHERE PurchaseRequestDirectDetailIsActive = 'Y' AND PurchaseRequestDirectDetailPurchaseRequestDirectID = {$payload['PRID']}"; $exec = $this->db->query($query); if ($exec) { $total = $exec->row()->total; } else { $this->db->trans_rollback(); $this->sys_error_db("select purchase_request_direct_detail", $this->db); exit; } $sql = "UPDATE purchase_request_direct SET PurchaseRequestDirectTotalRealitation = {$total}, PurchaseRequestLastUpdated = NOW(), PurchaseRequestLastUpdatedUserID = {$userId} WHERE PurchaseRequestDirectID = {$payload['PRID']}"; $exec = $this->db->query($sql, []); if (!$exec) { $this->db->trans_rollback(); $this->sys_error_db("purchase_request_direct request error", $this->db); exit; } $this->db->trans_commit(); $result = array("total" => 1, "records" => array("PRDID" => $payload['PRDID'])); $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 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; } } }