db_onedev = $this->load->database("onedev", true); $this->db_log = $this->load->database("cpone_log", true); $this->load->helper(array('form', 'url')); // Increase PHP limits for large data processing ini_set('memory_limit', '256M'); ini_set('max_execution_time', '300'); ini_set('max_input_time', '300'); } function getInput() { $data = file_get_contents("php://input"); if ($data === '' || $data === false) { if (isset($this->input)) { $data = $this->input->raw_input_stream; } } // Log raw body for debugging $data_size = strlen((string)$data); error_log("RECEIVE RAW LEN=".$data_size." (".round($data_size/1024/1024, 2)."MB)"); error_log("RECEIVE RAW HEAD=".substr((string)$data, 0, 1000)); // Check if data size exceeds reasonable limits $max_size = 100 * 1024 * 1024; // 100MB if ($data_size > $max_size) { error_log("WARNING: Received data size exceeds limit: ".round($data_size/1024/1024, 2)."MB"); } $this->sys_input = json_decode($data, true); if ($this->sys_input === null) { error_log("json_decode error: ".json_last_error_msg()); } } function index() { // Use parsed input from MY_Controller core $prm = $this->sys_input; if (!is_array($prm)) { echo json_encode([ "status" => "ERR", "message" => "Body JSON invalid" ]); exit; } // Log incoming keys for debugging error_log("RECEIVE TOP KEYS=".implode(',', array_keys($prm))); // Accept three formats: // A) { md5: string, data: { order_id, lab_number, results } } // B) { md5: string, compressed: true, data: base64_compressed_string } // C) { order_id, lab_number, results } (fallback, no md5) $data = null; $md5 = null; if (isset($prm["compressed"]) && $prm["compressed"] === true && isset($prm["data"]) && isset($prm["md5"])) { // Handle compressed data $compressed_data = base64_decode($prm["data"]); if ($compressed_data === false) { echo json_encode([ "status" => "ERR", "message" => "Failed to decode base64 compressed data" ]); exit; } $decompressed_json = gzuncompress($compressed_data); if ($decompressed_json === false) { echo json_encode([ "status" => "ERR", "message" => "Failed to decompress data" ]); exit; } $data = json_decode($decompressed_json, true); if ($data === null) { echo json_encode([ "status" => "ERR", "message" => "Failed to decode decompressed JSON: " . json_last_error_msg() ]); exit; } $md5 = $prm["md5"]; //$this->insert_error('Receive_result:compressed', '', json_encode($data), "Received compressed data"); error_log("Received compressed data, decompressed size: " . strlen($decompressed_json) . " bytes"); } else if (isset($prm["data"]) && isset($prm["md5"])) { // Handle normal uncompressed data $data = $prm["data"]; $md5 = $prm["md5"]; } else if (isset($prm["order_id"]) && isset($prm["lab_number"]) && isset($prm["results"])) { // Handle direct format (fallback) $data = $prm; } else { echo json_encode([ "status" => "ERR", "message" => "Missing md5/data in payload" ]); exit; } $user_id = 555; $l_md5 = md5(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE)); if ($md5 !== null && $md5 != $l_md5) { echo json_encode([ "status" => "ERR", "message" => "MD5 mismatch", "recv_md5" => $md5, "calc_md5" => $l_md5 ]); exit(); } $order_id = $data["order_id"]; $lab_number = $data["lab_number"]; $results = $data["results"]; $critical_values = isset($data["critical_values"]) ? $data["critical_values"] : []; if($lab_number == null) { echo json_encode([ "status" => "ERR", "message" => "Lab number tidak ditemukan", ]); exit; }else{ $sql = "INSERT INTO log_receive_result( Log_ReceiveResultT_OrderHeaderID, Log_ReceiveResultT_OrderHeaderLabNumber, Log_ReceiveResultData, Log_ReceiveResultCreated ) VALUES (?, ?, ?, NOW())"; $query = $this->db_log->query($sql, [$order_id, $lab_number, json_encode($results)]); if (!$query) { echo json_encode([ "status" => "ERR", "message" => "Gagal menyimpan log", "query" => $this->db_log->last_query() ]); exit; } $log_id = $this->db_log->insert_id(); } $this->db_onedev->trans_begin(); if(count($results) > 0) { $arr_result = []; foreach($results as $result) { $temp_r = $result; $temp_r['N_OrderDetailID'] = $result['T_OrderDetailT_OrderDetailOldID']; unset($temp_r['T_OrderDetailT_OrderDetailOldID']); $temp_r['L_OrderDetailID'] = $result['T_OrderDetailID']; unset($temp_r['T_OrderDetailID']); unset($temp_r['T_OrderDetailT_OrderPromiseID']); unset($temp_r['T_OrderDetailDetailDeleted']); unset($temp_r['T_OrderDetailDetailDeletedUserID']); unset($temp_r['T_OrderDetailNat_InstrumentID']); unset($temp_r['T_OrderDetailT_OrderDetailOrderID']); $arr_result[] = $temp_r; } foreach($arr_result as $result) { $sql = "SELECT * FROM result_t_orderdetail WHERE N_OrderDetailID = ?"; $query = $this->db_onedev->query($sql, [$result['N_OrderDetailID']]); $check_exist = $query->result_array(); if(count($check_exist) > 0) { $query = $this->db_onedev->where('N_OrderDetailID', $result['N_OrderDetailID'])->update('result_t_orderdetail', $result); if(!$query) { $this->db_onedev->trans_rollback(); $this->insert_error('Receive_result:updatetemp', $this->db_onedev->last_query(), json_encode($result), "Gagal menyimpan data hasil pemeriksaan"); echo json_encode([ "status" => "ERR", "message" => "Gagal update data hasil pemeriksaan", "query" => $this->db_onedev->last_query() ]); exit; } }else{ $query = $this->db_onedev->insert('result_t_orderdetail', $result); if(!$query) { $this->db_onedev->trans_rollback(); $this->insert_error('Receive_result:inserttemp', $this->db_onedev->last_query(), json_encode($result), "Gagal menyimpan data hasil pemeriksaan"); echo json_encode([ "status" => "ERR", "message" => "Gagal menyimpan data hasil pemeriksaan", "query" => $this->db_onedev->last_query() ]); exit; } } $sql = "UPDATE t_orderdetail SET T_OrderDetailResult = ?, T_OrderDetailResultFlag = ?, T_OrderDetailNote = ?, T_OrderDetailNat_UnitID = ?, T_OrderDetailNat_UnitName = ?, T_OrderDetailVerification = ?, T_OrderDetailVerDate = ?, T_OrderDetailVerUserID = 555, T_OrderDetailLastUpdated = NOW(), T_OrderDetailNat_NormalValueID = ?, T_OrderDetailNormalValueNote = ?, T_OrderDetailNormalValueDescription = ?, T_OrderDetailMinValue = ?, T_OrderDetailMaxValue = ?, T_OrderDetailMinValueInclusive = ?, T_OrderDetailMaxValueInclusive = ?, T_OrderDetailNat_MethodeID = ?, T_OrderdetailNat_MethodeName = ?, T_OrderDetailFlagResult = ? WHERE T_OrderDetailID = ?"; $query = $this->db_onedev->query($sql, [ $result['T_OrderDetailResult'], $result['T_OrderDetailResultFlag'], $result['T_OrderDetailNote'], $result['T_OrderDetailNat_UnitID'], $result['T_OrderDetailNat_UnitName'], $result['T_OrderDetailVerification'], $result['T_OrderDetailVerDate'], $result['T_OrderDetailNat_NormalValueID'], $result['T_OrderDetailNormalValueNote'], $result['T_OrderDetailNormalValueDescription'], $result['T_OrderDetailMinValue'], $result['T_OrderDetailMaxValue'], $result['T_OrderDetailMinValueInclusive'], $result['T_OrderDetailMaxValueInclusive'], $result['T_OrderDetailNat_MethodeID'], $result['T_OrderdetailNat_MethodeName'], $result['T_OrderDetailFlagResult'], $result['N_OrderDetailID'] ]); if(!$query) { $this->db_onedev->trans_rollback(); $this->insert_error('Receive_result:updateorderdetail', $this->db_onedev->last_query(), json_encode($result), "Gagal update data order detail"); echo json_encode([ "status" => "ERR", "message" => "Gagal update data order detail - orderdetail".$result['T_OrderDetailT_TestName']." : ".$result['T_OrderDetailT_TestCode'], "query" => $this->db_onedev->last_query() ]); exit; } } if($log_id > 0) { $sql = "UPDATE log_receive_result SET Log_ReceiveResultStatus = 'D', Log_ReceiveResultUpdated = NOW() WHERE Log_ReceiveResultID = ?"; $query = $this->db_log->query($sql, [$log_id]); if(!$query) { $this->insert_error('Receive_result:updateorderdetail - log_receive_result ', $this->db_log->last_query(), json_encode($result), "Gagal update data order detail"); echo json_encode([ "status" => "ERR", "message" => "Gagal update data order detail - log_receive_result", "query" => $this->db_log->last_query() ]); exit; } } }else{ echo json_encode([ "status" => "ERR", "message" => "Tidak ada data hasil pemeriksaan", ]); exit; } if(count($critical_values) > 0){ foreach($critical_values as $critical_value){ $sql = "INSERT INTO critical_value( CriticalValueT_OrderHeaderID, CriticalValueT_OrderDetailID, CriticalValueDescription, CriticalValueCreated, CriticalValueIsReported, CriticalValueReportedM_UserID, CriticalValueReportedDate, CriticalValueReportedTo, CriticalValueIsAdvised, CriticalValueAdvisedDate, CriticalValueAdvisedBy, CriticalValueAdvisedNote, CriticalValueAdvicedM_UserID, CriticalValueIsActive ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; $query = $this->db_onedev->query($sql, [ $critical_value['CriticalValueT_OrderHeaderID'], $critical_value['CriticalValueT_OrderDetailID'], $critical_value['CriticalValueDescription'], $critical_value['CriticalValueCreated'], $critical_value['CriticalValueIsReported'], $critical_value['CriticalValueReportedM_UserID'], $critical_value['CriticalValueReportedDate'], $critical_value['CriticalValueReportedTo'], $critical_value['CriticalValueIsAdvised'], $critical_value['CriticalValueAdvisedDate'], $critical_value['CriticalValueAdvisedBy'], $critical_value['CriticalValueAdvisedNote'], $critical_value['CriticalValueAdvicedM_UserID'], $critical_value['CriticalValueIsActive'] ]); if(!$query) { $this->db_onedev->trans_rollback(); $this->insert_error('Receive_result:insertcriticalvalue - critical_value', $this->db_onedev->last_query(), json_encode($critical_value), "Gagal menyimpan data critical value"); echo json_encode([ "status" => "ERR", "message" => "Gagal menyimpan data critical value", "query" => $this->db_onedev->last_query() ]); exit; } } } $this->db_onedev->trans_commit(); echo json_encode([ "status" => "OK", "result" => [ "lab_number" => $lab_number ] ]); exit; } function insert_error($fn,$query,$data,$message) { $sql = "INSERT INTO log_error_upload( Log_ErrorUploadFn, Log_ErrorUploadQuery, Log_ErrorUploadData, Log_ErrorUploadMessage, Log_ErrorUploadCreated ) VALUES (?,?,?,?,NOW())"; $query = $this->db_log->query($sql, [$fn,$query,$data,$message]); if(!$query) { return false; } return true; } }