db_onedev = $this->load->database("onedev", true); } public function add_notes($orderid){ $sql = " SELECT SupplierPaymentSupplierInvoiceID as note_order_id, SupplierPaymentID as note_id, SupplierPaymentDetailSupplierInvoiceDetailID as detail_id, SupplierPaymentDate as note_date, SupplierPaymentNumber as note_number, GROUP_CONCAT(DISTINCT coaDescription separator ' , ') as paymenttypes_name, SUM(SupplierPaymentDetailAmount) as note_amount, M_UserUsername as note_user, SupplierPaymentDetailIsActive as note_active, 'xxx' as tests, 'N' as show_detail, SupplierPaymentNote as keterangan, SupplierPaymentCoaID, coaID, coaDescription, SupplierPaymentIsConfirm FROM supplier_payment JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailIsActive = 'Y' JOIN coa ON SupplierPaymentCoaID = coaID LEFT JOIN m_user ON SupplierPaymentUserID = M_UserID WHERE SupplierPaymentSupplierInvoiceID = {$orderid} AND SupplierPaymentIsActive = 'Y' GROUP BY SupplierPaymentID"; $query = $this->db_onedev->query($sql); if ($query) { $rows = $query->result_array(); if($rows){ foreach($rows as $k => $v){ $rows[$k]['tests'] = $this->add_tests($v['note_id']); } } return $rows; } else { $this->sys_error_db("get notes", $this->db_onedev); exit; } } public function add_tagihans($orderid){ $sql = "SELECT SupplierInvoiceID as tagihan_id, PurchaseOrderNumber as tagihan_number, jurnalTxDescription as pasien, jurnalTxCredit as tagihan_total, IF(SupplierPaymentDetailID IS NULL , jurnalTxCredit, jurnalTxCredit - SUM(SupplierPaymentDetailAmount)) as tagihan_tagihan, 0 as tagihan_bayar, DATE_FORMAT(SupplierInvoiceDueDate,'%d-%m-%Y') as tagihan_duedate, SupplierInvoiceIsActive as tagihan_active, 'N' as show_detail, jurnalTxID SupplierInvoiceDetailID, PurchaseOrderID SupplierInvoiceDetailPurchaseOrderID FROM supplier_invoice JOIN purchase_order ON SupplierInvoicePurchaseOrderID = PurchaseOrderID JOIN jurnal_addon ON jurnalAddOnValue = SupplierInvoiceNumber JOIN jurnal_tx ON jurnalTxJurnalID = jurnalAddOnJurnalID AND jurnalTxCredit <> 0 AND jurnalTxCoaID <> 563 LEFT JOIN supplier_payment ON SupplierPaymentSupplierInvoiceID = SupplierInvoiceID AND SupplierInvoiceIsActive = 'Y' LEFT JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailSupplierInvoiceDetailID = jurnalTxID AND SupplierPaymentDetailIsActive = 'Y' WHERE SupplierInvoiceID = {$orderid} GROUP BY jurnalTxID "; $query = $this->db_onedev->query($sql); if ($query) { $rows = $query->result_array(); return $rows; } else { $this->sys_error_db("get notes", $this->db_onedev); exit; } } public function add_tests($orderid){ $sql = " SELECT SupplierPaymentSupplierInvoiceID as note_order_id, SupplierPaymentID as note_id, SupplierPaymentDate as note_date, SupplierPaymentNumber as note_number, GROUP_CONCAT(coaDescription separator ' , ') as paymenttypes_name, SUM(SupplierPaymentDetailAmount) as note_amount, M_UserUsername as note_user, SupplierPaymentDetailIsActive as note_active, PurchaseOrderNumber, SupplierInvoiceDetailTotal, SupplierPaymentDetailAmount FROM supplier_payment JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID LEFT JOIN supplier_invoice_detail ON SupplierPaymentDetailSupplierInvoiceDetailID = SupplierInvoiceDetailID LEFT JOIN purchase_order ON SupplierInvoiceDetailPurchaseOrderID = PurchaseOrderID JOIN coa ON SupplierPaymentCoaID = coaID LEFT JOIN m_user ON SupplierPaymentDetailUserID = M_UserID WHERE SupplierPaymentID = {$orderid} GROUP BY SupplierPaymentDetailID"; $query = $this->db_onedev->query($sql); if ($query) { $rows = $query->result_array(); if($rows){ } return $rows; } else { $this->sys_error_db("get notes", $this->db_onedev); exit; } } function searchsupplier(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $max_rst = 12; $tot_count =0; $q = [ 'search' => '%' ]; if ($prm['search'] != '') { $q['search'] = "%{$prm['search']}%"; } // QUERY TOTAL $sql = " SELECT count(*) as total FROM supplier WHERE SupplierName like ? AND SupplierIsActive = 'Y' ORDER BY SupplierName DESC "; $query = $this->db_onedev->query($sql,$q['search']); //echo $query; if ($query) { $tot_count = $query->result_array()[0]["total"]; } else { $this->sys_error_db("m_city count",$this->db_onedev); exit; } $sql = " SELECT * FROM supplier WHERE SupplierName like ? AND SupplierIsActive = 'Y' ORDER BY SupplierName DESC "; $query = $this->db_onedev->query($sql, array($q['search'])); if ($query) { $rows = $query->result_array(); //echo $this->db_onedev->last_query(); $result = array("total" => $tot_count, "records" => $rows, "total_display" => sizeof($rows)); $this->sys_ok($result); } else { $this->sys_error_db("m_city rows",$this->db_onedev); exit; } } function searchinvpayment(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $max_rst = 12; $tot_count =0; $q = [ 'search' => '%' ]; if ($prm['search'] != '') { $q['search'] = "%{$prm['search']}%"; } // QUERY TOTAL $sql = "SELECT count(*) as total FROM supplier_payment JOIN supplier_invoice ON SupplierPaymentSupplierInvoiceID = SupplierInvoiceID AND SupplierInvoiceSupplierID = {$prm['companyid']} WHERE SupplierPaymentNumber like ? AND SupplierPaymentIsActive = 'Y' AND SupplierPaymentIsConfirm = 'Y' ORDER BY SupplierPaymentID ASC "; $query = $this->db_onedev->query($sql,$q['search']); //echo $query; if ($query) { $tot_count = $query->result_array()[0]["total"]; } else { $this->sys_error_db("m_city count",$this->db_onedev); exit; } $sql = " SELECT *, CONCAT(SupplierPaymentNumber,' - ',coaDescription, ' Rp. ',SupplierPaymentAmount) PaymentName FROM supplier_payment JOIN supplier_invoice ON SupplierPaymentSupplierInvoiceID = SupplierInvoiceID AND SupplierInvoiceSupplierID = {$prm['companyid']} JOIN coa ON SupplierPaymentCoaID = coaID WHERE SupplierPaymentNumber like ? AND SupplierPaymentIsActive = 'Y' AND SupplierPaymentIsConfirm = 'Y' ORDER BY SupplierPaymentID ASC "; $query = $this->db_onedev->query($sql, array($q['search'])); if ($query) { $rows = $query->result_array(); //echo $this->db_onedev->last_query(); $result = array("total" => $tot_count, "records" => $rows, "total_display" => sizeof($rows)); $this->sys_ok($result); } else { $this->sys_error_db("m_city rows",$this->db_onedev); exit; } } public function search() { //# cek token valid if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $supplier = $prm["supplier"]; $search = $prm["search"]; $status = $prm["status"]; $startdate = $prm["startdate"]; $enddate = $prm["enddate"]; $regionalid = $this->sys_user['S_RegionalID']; $number_limit = 10; $number_offset = ($prm['current_page'] - 1) * $number_limit ; $where = "SupplierPaymentIsFailed = 'Y' AND (SupplierInvoiceNumber LIKE '%{$search}%' AND SupplierName LIKE '%{$supplier}%') AND PurchaseOrderS_RegionalID = {$regionalid} AND SupplierPaymentConfirmDate BETWEEN '{$startdate}' AND '{$enddate}'"; $sql = " SELECT count(*) as total FROM supplier_payment JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailIsActive = 'Y' JOIN supplier_invoice ON SupplierInvoiceID = SupplierPaymentSupplierInvoiceID LEFT JOIN supplier ON SupplierInvoiceSupplierID = SupplierID JOIN purchase_order ON PurchaseOrderID = SupplierInvoicePurchaseOrderID JOIN jurnal_addon ON jurnalAddOnValue = SupplierInvoiceNumber JOIN jurnal_tx ON jurnalTxJurnalID = jurnalAddOnJurnalID AND jurnalTxCredit <> 0 AND jurnalTxCoaID <> 563 WHERE $where "; // echo $sql; $query = $this->db_onedev->query($sql, $sql_param); $tot_count = 0; $tot_page = 0; if ($query) { $tot_count = $query->result_array()[0]["total"]; $tot_page = ceil($tot_count/$number_limit); } else { $this->sys_error_db("supplier_invoice count", $this->db_onedev); exit; } $sql = "SELECT SupplierInvoiceID, SupplierPaymentID, SupplierPaymentDetailSupplierInvoiceDetailID, DATE_FORMAT(SupplierInvoiceDraftPaymentDate,'%d-%m-%Y') as tanggalbayar, DATE_FORMAT(SupplierInvoiceDraftPaymentDate,'%d%m%Y') as tanggalbayartext, SupplierPaymentDate as note_date, SupplierPaymentNumber as note_number, GROUP_CONCAT(DISTINCT coaDescription separator ' , ') as paymenttypes_name, SUM(SupplierPaymentDetailAmount) as note_amount, n.M_UserUsername as note_user, SupplierPaymentDetailIsActive as note_active, 'xxx' as tests, 'N' as show_detail, SupplierPaymentNote as keterangan, SupplierPaymentCoaID, coaID, coaDescription, SupplierPaymentIsConfirm, SupplierPaymentApprovedUserID, SupplierPaymentApprovedDate, SupplierInvoiceNumber, SupplierName, SupplierPaymentNumber, CONCAT('Created by : ',n.M_UserUsername, ' ',DATE_FORMAT(SupplierPaymentCreated,'%d-%m-%Y %H:%i')) as d_created, CONCAT('Confirmed by : ',c.M_UserUsername, ' ',DATE_FORMAT(SupplierPaymentConfirmDate,'%d-%m-%Y %H:%i')) as d_confirm, CONCAT('Approved by : ',a.M_UserUsername, ' ',DATE_FORMAT(SupplierPaymentApprovedDate,'%d-%m-%Y %H:%i')) as d_approved FROM supplier_payment JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailIsActive = 'Y' JOIN supplier_invoice ON SupplierInvoiceID = SupplierPaymentSupplierInvoiceID LEFT JOIN supplier ON SupplierInvoiceSupplierID = SupplierID JOIN purchase_order ON PurchaseOrderID = SupplierInvoicePurchaseOrderID JOIN coa ON SupplierPaymentCoaID = coaID LEFT JOIN m_user n ON SupplierPaymentUserID = n.M_UserID LEFT JOIN m_user c ON SupplierPaymentConfirmUserID = c.M_UserID LEFT JOIN m_user a ON SupplierPaymentApprovedUserID = a.M_UserID WHERE $where GROUP BY SupplierPaymentID ORDER BY SupplierPaymentID DESC limit $number_limit offset $number_offset"; //echo $sql; $query = $this->db_onedev->query($sql, $sql_param); $rows = $query->result_array(); $result = array("total" => $tot_page, "records" => $rows, "sql"=> $this->db_onedev->last_query()); $this->sys_ok($result); exit; } function confirm_note() { //# cek token valid if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } //# ambil parameter input $xuserid = $this->sys_user['M_UserID']; $regionalid = $this->sys_user['S_RegionalID']; $branchid = $this->sys_user['M_BranchID']; $prm = $this->sys_input; $prmnota = $prm['nota']; $note = $prm['note']; $sql = "UPDATE supplier_payment SET SupplierPaymentIsFailed = 'Y', SupplierPaymentFailedUserID = {$xuserid}, SupplierPaymentFailedDate = now(), SupplierPaymentFailedNote = '{$note}' WHERE SupplierPaymentID = {$prmnota['SupplierPaymentID']}"; //echo $sql; $query = $this->db_onedev->query($sql); if (!$query) { $this->sys_error_db("supplier_payment delete"); exit; } $headerid = $prmnota['SupplierPaymentID']; $sql = "SELECT * FROM supplier_payment JOIN m_user ON M_UserID = SupplierPaymentFailedUserID WHERE SupplierPaymentID = ?"; $query = $this->db_onedev->query($sql, [$headerid]); $row = $query->row_array(); $sqlbill = "UPDATE supplier_invoice SET SupplierInvoiceIsLunas = 'N' WHERE SupplierInvoiceID = {$prmnota['SupplierInvoiceID']}"; $querybill = $this->db_onedev->query($sqlbill); $sql = "SELECT * FROM supplier_payment_detail WHERE SupplierPaymentDetailSupplierPaymentID = ?"; $query = $this->db_onedev->query($sql, [$headerid]); $rows = $query->row_array(); $data = array("header" => $row, "details" => $rows); $message = "Nomor Pembayaran Faktur: " . $row["SupplierPaymentNumber"] ." telah dibatalkan oleh " . $row["M_UserUsername"]; $this->insert_act_log("PF", "CONFIRM", $message, $headerid, $this->safeJsonEncode($data), $xuserid); $sqlData = "SELECT SupplierPaymentDetailID as id, SupplierPaymentID, SupplierPaymentNumber, $branchid M_BranchID, '' M_BranchCode, '' M_BranchName, M_BranchS_RegionalID, M_BranchCompanyID, M_BranchCompanyName, CONCAT('Jurnal Payment Invoice Failed Nomor : SupplierPaymentNumber', DATE_FORMAT(now(), '%d-%m-%Y')) xdescription, IFNULL(periodeID,0) periodeid, CONCAT('Jurnal Payment Invoice Failed Nomor : SupplierPaymentNumber', DATE_FORMAT(now(), '%d-%m-%Y'), ' regional ',S_RegionalName) title, 22 typeid, '' detailjurnal, coaID, coaAccountNo, coaDescription, 0 debit, SupplierPaymentDetailAmount credit FROM supplier_payment JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailIsActive = 'Y' JOIN s_regional ON S_RegionalID = $regionalid LEFT JOIN m_branch ON M_BranchS_RegionalID = S_RegionalID AND M_BranchID = {$branchid} LEFT JOIN m_branch_companydetail ON M_BranchCompanyDetailM_BranchCode = M_BranchCode AND M_BranchCompanyDetailIsActive = 'Y' LEFT JOIN m_branch_company ON M_BranchCompanyID = M_BranchCompanyDetailM_BranchCompanyID AND M_BranchCompanyIsActive = 'Y' JOIN coa ON coaID = SupplierPaymentCoaID LEFT JOIN periode ON date(now()) BETWEEN periodeStartDate AND periodeEndDate AND periodeIsActive = 'Y' JOIN jurnal_tx ON jurnalTxID = SupplierPaymentDetailSupplierInvoiceDetailID WHERE SupplierPaymentID = {$headerid} AND SupplierPaymentIsActive = 'Y' GROUP BY SupplierPaymentID"; $newData = $this->db_onedev->query($sqlData)->result_array(); // echo $this->db_onedev->last_query(); if ($newData) { foreach ($newData as $k => $v) { $periodeid = $v["periodeid"]; $branchcompanyid = $v["M_BranchCompanyID"]; $date = date('Y-m-d'); $description = $v["xdescription"]; $regionalid = $v["M_BranchS_RegionalID"]; $title = $v["title"]; $typeid = $v["typeid"]; $pvno = $v["SupplierPaymentNumber"]; $detailjurnal = $this->db_onedev->query("SELECT SupplierPaymentDetailID as id, coaID coaid, coaDescription xdescription, SupplierPaymentDetailAmount debit, 0 credit FROM supplier_payment JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailIsActive = 'Y' JOIN s_regional ON S_RegionalID = $regionalid LEFT JOIN m_branch ON M_BranchS_RegionalID = S_RegionalID AND M_BranchID = $branchid LEFT JOIN m_branch_companydetail ON M_BranchCompanyDetailM_BranchCode = M_BranchCode AND M_BranchCompanyDetailIsActive = 'Y' LEFT JOIN m_branch_company ON M_BranchCompanyID = M_BranchCompanyDetailM_BranchCompanyID AND M_BranchCompanyIsActive = 'Y' JOIN coa ON coaID = SupplierPaymentCoaID LEFT JOIN periode ON date(now()) BETWEEN periodeStartDate AND periodeEndDate AND periodeIsActive = 'Y' JOIN jurnal_tx ON jurnalTxID = SupplierPaymentDetailSupplierInvoiceDetailID WHERE SupplierPaymentID = {$headerid} AND SupplierPaymentIsActive = 'Y' UNION SELECT jurnalTxID as id, jurnalTxCoaID coaid, jurnalTxDescription xdescription, 0 debit, SupplierPaymentDetailAmount credit FROM supplier_payment JOIN supplier_payment_detail ON SupplierPaymentDetailSupplierPaymentID = SupplierPaymentID AND SupplierPaymentDetailIsActive = 'Y' JOIN s_regional ON S_RegionalID = $regionalid LEFT JOIN m_branch ON M_BranchS_RegionalID = S_RegionalID AND M_BranchID = $branchid LEFT JOIN m_branch_companydetail ON M_BranchCompanyDetailM_BranchCode = M_BranchCode AND M_BranchCompanyDetailIsActive = 'Y' LEFT JOIN m_branch_company ON M_BranchCompanyID = M_BranchCompanyDetailM_BranchCompanyID AND M_BranchCompanyIsActive = 'Y' LEFT JOIN periode ON date(now()) BETWEEN periodeStartDate AND periodeEndDate AND periodeIsActive = 'Y' JOIN jurnal_tx ON jurnalTxID = SupplierPaymentDetailSupplierInvoiceDetailID JOIN coa ON coaID = jurnalTxCoaID WHERE SupplierPaymentID = {$headerid} AND SupplierPaymentIsActive = 'Y' GROUP BY id")->result_array(); //echo $this->db->last_query(); $rows[$k]['detailjurnal'] = $detailjurnal; $this->savejurnal($branchid, $date, $description, $periodeid, $regionalid, $title, $typeid, $detailjurnal, $pvno, $branchcompanyid); } } $result = array( "total" => 1 , "records" => array('prm'=>$prm) ); $this->sys_ok($result); exit; } function savejurnal($branchid, $date, $description, $periodeid, $regionalid, $title, $typeid, $detailjurnal, $pvno, $branchcompanyid) { try { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $this->db_onedev->trans_begin(); $userid = $this->sys_user['M_UserID']; $sql_branch = "SELECT M_BranchID, M_BranchCode, M_BranchName FROM m_branch WHERE M_BranchIsActive = 'Y' AND M_BranchID = ?"; $qry_branch = $this->db_onedev->query($sql_branch, array($branchid)); if ($qry_branch) { $branchcodex = $qry_branch->row()->M_BranchCode; } else { $this->db_onedev->trans_rollback(); $this->sys_error_db("select branch error", $this->db); exit; } $sql = "INSERT INTO jurnal( jurnalM_BranchCompanyID, JurnalS_RegionalID, jurnalM_BranchCode, jurnalperiodeID, jurnalNo, jurnalTitle, jurnalDescription, jurnalDate, jurnalJurnalTypeID, jurnalIsActive, jurnalCreated, jurnalM_UserID ) VALUES(?,?,?,?,`fn_numbering`('J'),?,?,?,?,'Y',NOW(),?)"; $qry = $this->db_onedev->query($sql, array( $branchcompanyid, $regionalid, $branchcodex, $periodeid, $title, $description, $date, $typeid, $userid )); $last_qry = $this->db_onedev->last_query(); if (!$qry) { $this->db_onedev->trans_rollback(); $error = array( "message" => $this->db_onedev->error()["message"], "sql" => $last_qry ); $this->sys_error_db($error, $this->db); exit; } $last_id = $this->db_onedev->insert_id(); foreach ($detailjurnal as $key => $value) { $sql_detail = "INSERT INTO jurnal_tx( jurnalTxJurnalID, jurnalTxCoaID, jurnalTxDescription, jurnalTxDebit, jurnalTxCredit, jurnalTxIsActive, jurnalTxCreated, jurnalTxM_UserID) VALUES(?,?,?,?,?,'Y',NOW(),?)"; $qry_detail = $this->db_onedev->query($sql_detail, array( $last_id, $value["coaid"], $value["xdescription"], $value["debit"], $value["credit"], $userid )); $last_qry = $this->db_onedev->last_query(); if (!$qry_detail) { $this->db_onedev->trans_rollback(); $error = array( "message" => $this->db_onedev->error()["message"], "sql" => $last_qry ); $this->sys_error_db($error, $this->db); exit; } $tx_id = $this->db_onedev->insert_id(); $sql = "INSERT INTO jurnal_addon (jurnalAddOnJurnalID, jurnalAddOnJurnalTxID, jurnalAddOnCode, jurnalAddOnValue, jurnalAddOnCreated, jurnalAddOnCreatedUserID, jurnalAddOnLastUpdatedUserID, jurnalAddOnLastUpdated) VALUES (?, ?, 'JFA', ?, now(), ?, ?, now())"; $qry = $this->db_onedev->query($sql, array( $last_id, $tx_id, $pvno, $userid, $userid )); $last_qry = $this->db_onedev->last_query(); if (!$qry) { $this->db_onedev->trans_rollback(); $error = array( "message" => $this->db_onedev->error()["message"], "sql" => $last_qry ); $this->sys_error_db($error, $this->db); exit; } } $this->db_onedev->trans_commit(); // $result = array("total" => 1); // $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_onedev->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_onedev); exit; } } 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; } }