db_onedev = $this->load->database("onedev", true); } /** sys_input + $_GET + $_POST + JSON body. */ private function merge_request_input() { $prm = is_array($this->sys_input) ? $this->sys_input : array(); if (!empty($_GET) && is_array($_GET)) { $prm = array_merge($prm, $_GET); } if (!empty($_POST) && is_array($_POST)) { $prm = array_merge($prm, $_POST); } $ct = isset($_SERVER["CONTENT_TYPE"]) ? $_SERVER["CONTENT_TYPE"] : ""; if (stripos($ct, "application/json") === false) { return $prm; } $raw = file_get_contents("php://input"); if ($raw === false || $raw === "") { return $prm; } $j = json_decode($raw, true); if (!is_array($j)) { return $prm; } return array_merge($prm, $j); } public function get_patient() { try { $prm = $this->merge_request_input(); $form_code = isset($prm['form_code']) ? $this->sanitize_form_code($prm['form_code']) : ''; $uuid_hex = isset($prm['id']) ? $this->uuid_to_hex32($prm['id']) : ''; if($form_code == '' || $uuid_hex == ''){ $this->sys_error("Form code atau ID tidak boleh kosong"); exit; } $sql = " SELECT FormRiwayatPasienID as xid, COALESCE(M_PatientName, Mcu_PreregisterPatientsPatientName) as patient_name, COALESCE(sex_pat.M_SexName, sex_pre.M_SexName) as gender, COALESCE(DATE_FORMAT(M_PatientDOB, '%d-%m-%Y'), DATE_FORMAT(Mcu_PreregisterPatientsDOB, '%d-%m-%Y')) as dob, Mcu_PreregisterPatientsPosisi as posisi, Mcu_PreregisterPatientsDivisi as divisi, Mcu_PreregisterPatientsLocation as location_mcu, Mcu_PreregisterPatientsDepartment as department, M_CompanyName as corporate_name, M_CompanyAddress as corporate_address, IFNULL(T_SamplingSoFlag, 'N') as is_sampling FROM form_riwayat_pasien JOIN mcu_preregister_patients ON Mcu_PreregisterPatientsID = FormRiwayatPasienPreregisterID AND Mcu_PreregisterPatientsIsActive = 'Y' AND FormRiwayatPasienPreregisterID > 0 LEFT JOIN m_patient ON Mcu_PreregisterPatientsM_PatientID = M_PatientID AND Mcu_PreregisterPatientsM_PatientID > 0 LEFT JOIN m_sex sex_pat ON M_PatientM_SexID = sex_pat.M_SexID LEFT JOIN m_sex sex_pre ON Mcu_PreregisterPatientsM_SexID = sex_pre.M_SexID JOIN m_company ON Mcu_PreregisterPatientsCompanyNumber = M_CompanyNumber LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = FormRiwayatPasienT_OrderHeaderID AND T_SamplingSoIsActive = 'Y' LEFT JOIN t_test ON T_SamplingSoT_TestID = T_TestID AND T_TestIsActive = 'Y' LEFT JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' LEFT JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y' WHERE FormRiwayatPasienCode = ? AND REPLACE(LOWER(FormRiwayatPasienUUID),'-','') = ? AND FormRiwayatPasienIsActive = 'Y' UNION SELECT FormRiwayatPasienID as xid, M_PatientName as patient_name, LOWER(M_SexNameLang) as gender, DATE_FORMAT(M_PatientDOB, '%d-%m-%Y') as dob, IFNULL(M_PatientPosisi, '-') as posisi, IFNULL(M_PatientDivisi, '-') as divisi, IFNULL(M_PatientLocation, '-') as location_mcu, IFNULL(M_PatientDepartement, '-') as department, M_CompanyName as corporate_name, M_CompanyAddress as corporate_address, IFNULL(T_SamplingSoFlag, 'N') as is_sampling FROM form_riwayat_pasien JOIN t_orderheader ON FormRiwayatPasienT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' AND FormRiwayatPasienPreregisterID = 0 JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_sex ON M_PatientM_SexID = M_SexID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = FormRiwayatPasienT_OrderHeaderID AND T_SamplingSoIsActive = 'Y' LEFT JOIN t_test ON T_SamplingSoT_TestID = T_TestID AND T_TestIsActive = 'Y' LEFT JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' LEFT JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y' WHERE FormRiwayatPasienCode = ? AND REPLACE(LOWER(FormRiwayatPasienUUID),'-','') = ? AND FormRiwayatPasienIsActive = 'Y' "; $sql_param = array($form_code, $uuid_hex, $form_code, $uuid_hex); $query = $this->db_onedev->query($sql, $sql_param); //echo $this->db_onedev->last_query(); if(!$query){ echo $this->db_onedev->last_query(); $this->sys_error_db("form_riwayat_pasien error get exist"); exit; } $exist_riwayat = $query->result_array(); if(count($exist_riwayat) > 0){ $sql = ""; $result = array ("total" => 1, "total_filter"=>1,"records" => $exist_riwayat[0]); $this->sys_ok($result); }else{ $this->sys_error("Data tidak ditemukan"); } } catch(Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } public function get_riwayat() { try { $prm = $this->merge_request_input(); $xid = isset($prm['id']) ? $this->sanitize_int_id($prm['id']) : 0; if($xid == 0 || $xid == ''){ $this->sys_error("ID tidak boleh kosong"); exit; } $results = array(); $return_data = array(); $sql = " SELECT FisikTemplateID as fisik_template_id, FisikTemplateCode as template_code, FisikTemplateTableName as template_table_name, FisikTemplateTitle as template_title, FormRiwayatPasienTemplateDetails as details, FormRiwayatPasienTemplateID as xid FROM form_riwayat_pasien JOIN form_riwayat_pasien_template ON FormRiwayatPasienTemplateFormRiwayatPasienID = FormRiwayatPasienID AND FormRiwayatPasienTemplateIsActive = 'Y' JOIN fisik_template ON FormRiwayatPasienTemplateFisikTemplateID = FisikTemplateID AND FisikTemplateIsActive = 'Y' AND FisikTemplateType IN ('Riwayat', 'K3') WHERE FormRiwayatPasienID = ? AND FormRiwayatPasienIsActive = 'Y' GROUP BY FisikTemplateID "; $sql_param = array($xid); $query = $this->db_onedev->query($sql, $sql_param); if(!$query){ //echo $this->db_onedev->last_query(); $this->sys_error_db("form_riwayat_pasien error get exist"); exit; } $exist_riwayat = $query->result_array(); if(count($exist_riwayat) > 0){ foreach($exist_riwayat as $key => $item){ //$results[$key]['details'] = json_decode($item['details'], true); //$results[$key]['xid'] = $item['xid']; $return_data[] = json_decode($item['details'], true); } $result = array ("records" => $return_data); $this->sys_ok($result); exit; } $sql = " SELECT * FROM ( SELECT FisikTemplateID as fisik_template_id, FisikTemplateCode as template_code, FisikTemplateTableName as template_table_name, FisikTemplateTitle as template_title, FisikTemplateJSON as details FROM form_riwayat_pasien JOIN t_orderheader ON FormRiwayatPasienT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' AND FormRiwayatPasienPreregisterID = 0 JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y' JOIN nat_test ON Nat_TestCode = T_OrderDetailT_TestCode AND Nat_TestIsActive = 'Y' JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y' JOIN fisik_template_mapping ON Fisik_MapTestTemplateFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingIsActive = 'Y' JOIN fisik_template_mapping_detail ON FisikTemplateMappingDetailFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingDetailIsActive = 'Y' JOIN fisik_template ON FisikTemplateID = FisikTemplateMappingDetailFisikTemplateID AND FisikTemplateIsActive = 'Y' AND ( FisikTemplateType = 'Riwayat' OR FisikTemplateType = 'K3' ) AND FisikTemplateCode NOT IN ('RI00', 'RI01') WHERE FormRiwayatPasienID = ? AND FormRiwayatPasienIsActive = 'Y' UNION SELECT FisikTemplateID as fisik_template_id, FisikTemplateCode as template_code, FisikTemplateTableName as template_table_name, FisikTemplateTitle as template_title, FisikTemplateJSON as details FROM form_riwayat_pasien JOIN mcu_preregister_patients ON Mcu_PreregisterPatientsID = FormRiwayatPasienPreregisterID AND Mcu_PreregisterPatientsIsActive = 'Y' AND FormRiwayatPasienPreregisterID > 0 JOIN t_test ON T_TestIsActive = 'Y' AND IFNULL(Mcu_PreregisterPatientsOrders, '') != '' AND ( FIND_IN_SET(TRIM(CAST(T_TestSasCode AS CHAR)), REPLACE(IFNULL(Mcu_PreregisterPatientsOrders, ''), ' ', '')) > 0 OR FIND_IN_SET(TRIM(CAST(T_TestCode AS CHAR)), REPLACE(IFNULL(Mcu_PreregisterPatientsOrders, ''), ' ', '')) > 0 OR EXISTS ( SELECT 1 FROM nat_test nt_ord WHERE nt_ord.Nat_TestID = T_TestNat_TestID AND nt_ord.Nat_TestIsActive = 'Y' AND FIND_IN_SET(TRIM(CAST(nt_ord.Nat_TestCode AS CHAR)), REPLACE(IFNULL(Mcu_PreregisterPatientsOrders, ''), ' ', '')) > 0 ) ) JOIN nat_test ON Nat_TestCode = T_TestCode AND Nat_TestIsActive = 'Y' JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y' JOIN fisik_template_mapping ON Fisik_MapTestTemplateFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingIsActive = 'Y' JOIN fisik_template_mapping_detail ON FisikTemplateMappingDetailFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingDetailIsActive = 'Y' JOIN fisik_template ON FisikTemplateID = FisikTemplateMappingDetailFisikTemplateID AND FisikTemplateIsActive = 'Y' AND ( FisikTemplateType = 'Riwayat' OR FisikTemplateType = 'K3' ) AND FisikTemplateCode NOT IN ('RI00', 'RI01') WHERE FormRiwayatPasienID = ? AND FormRiwayatPasienIsActive = 'Y' UNION SELECT FisikTemplateID as fisik_template_id, FisikTemplateCode as template_code, FisikTemplateTableName as template_table_name, FisikTemplateTitle as template_title, FisikTemplateJSON as details FROM form_riwayat_pasien JOIN mcu_preregister_patients ON Mcu_PreregisterPatientsID = FormRiwayatPasienPreregisterID AND Mcu_PreregisterPatientsIsActive = 'Y' AND FormRiwayatPasienPreregisterID > 0 JOIN t_packet ON T_PacketIsActive = 'Y' AND IFNULL(Mcu_PreregisterPatientsOrders, '') != '' AND FIND_IN_SET(TRIM(CAST(T_PacketSasCode AS CHAR)), REPLACE(IFNULL(Mcu_PreregisterPatientsOrders, ''), ' ', '')) > 0 JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID AND T_PacketDetailIsActive = 'Y' JOIN t_test ON T_PacketDetailT_TestID = T_TestID AND T_TestIsActive = 'Y' JOIN nat_test ON Nat_TestCode = T_TestCode AND Nat_TestIsActive = 'Y' JOIN fisik_map_test_template ON Fisik_MapTestTemplateNat_TestID = Nat_TestID AND Fisik_MapTestTemplateIsActive = 'Y' JOIN fisik_template_mapping ON Fisik_MapTestTemplateFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingIsActive = 'Y' JOIN fisik_template_mapping_detail ON FisikTemplateMappingDetailFisikTemplateMappingID = FisikTemplateMappingID AND FisikTemplateMappingDetailIsActive = 'Y' JOIN fisik_template ON FisikTemplateID = FisikTemplateMappingDetailFisikTemplateID AND FisikTemplateIsActive = 'Y' AND ( FisikTemplateType = 'Riwayat' OR FisikTemplateType = 'K3' ) AND FisikTemplateCode NOT IN ('RI00', 'RI01') WHERE FormRiwayatPasienID = ? AND FormRiwayatPasienIsActive = 'Y' ) as x GROUP BY fisik_template_id "; $query = $this->db_onedev->query($sql, array($xid, $xid, $xid)); //echo $this->db_onedev->last_query(); //exit; if(!$query){ //echo $this->db_onedev->last_query(); $this->sys_error_db("form_riwayat_pasien error get exist"); exit; } $riwayat_template = $query->result_array(); foreach($riwayat_template as $key => $item){ $sql = " SELECT * FROM form_riwayat_pasien_template WHERE FormRiwayatPasienTemplateFisikTemplateID = ? AND FormRiwayatPasienTemplateFormRiwayatPasienID = ? AND FormRiwayatPasienTemplateIsActive = 'Y'"; $sql_param = array($item['fisik_template_id'], $xid); $query = $this->db_onedev->query($sql, $sql_param); if(!$query){ $this->sys_error_db("form_riwayat_pasien error get exist"); exit; } $exist_riwayat = $query->result_array(); if(count($exist_riwayat) > 0){ //$results[$key]['details'] = json_decode($exist_riwayat[0]['details'], true); $return_data[] = json_decode($exist_riwayat[0]['details'], true); }else{ $details = json_decode($item['details'], true); $sql = "INSERT INTO form_riwayat_pasien_template ( FormRiwayatPasienTemplateFormRiwayatPasienID, FormRiwayatPasienTemplateFisikTemplateID, FormRiwayatPasienTemplateDetails, FormRiwayatPasienTemplateIsActive, FormRiwayatPasienTemplateCreated, FormRiwayatPasienTemplateCreatedUserID) VALUES (?, ?, ?, 'Y',NOW(),45312)"; $sql_param = array($xid, $item['fisik_template_id'], json_encode($details)); $query = $this->db_onedev->query($sql, $sql_param); if(!$query){ $this->sys_error_db("form_riwayat_pasien error save"); exit; } //$last_id = $this->db_onedev->insert_id(); //$results[$key]['xid'] = $last_id; $return_data[] = $details; } } $result = array ("records" => $return_data); $this->sys_ok($result); exit; } catch(Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function clean_json_encode($data) { return str_replace( ['\r', '\n'], '', json_encode($data, JSON_UNESCAPED_SLASHES) ); } private function sanitize_form_code($value) { $value = trim((string)$value); if ($value === '' || !preg_match('/^[A-Za-z0-9_-]{1,64}$/', $value)) { $value = ''; } return $value; } private function sanitize_uuid($value) { $value = trim((string) $value); if ($value === '') { return ''; } if (preg_match('/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/', $value)) { return $value; } $hex = preg_replace('/[^0-9a-fA-F]/', '', $value); if (strlen($hex) === 32) { return sprintf( '%s-%s-%s-%s-%s', substr($hex, 0, 8), substr($hex, 8, 4), substr($hex, 12, 4), substr($hex, 16, 4), substr($hex, 20, 12) ); } return ''; } /** 32 hex lowercase untuk cocokkan FormRiwayatPasienUUID (termasuk baris lama format vsprintf salah). */ private function uuid_to_hex32($value) { $hex = preg_replace('/[^0-9a-fA-F]/', '', (string) $value); return strlen($hex) === 32 ? strtolower($hex) : ''; } private function sanitize_int_id($value) { if (!is_numeric($value)) { $value = 0; } return (int)$value; } public function save_riwayat() { try { $prm = $this->merge_request_input(); $xid_hex = isset($prm['id']) ? $this->uuid_to_hex32($prm['id']) : ''; $form_code = isset($prm['form_code']) ? $this->sanitize_form_code($prm['form_code']) : ''; $data_riwayat = array(); if (isset($prm['data_riwayat'])) { if (is_array($prm['data_riwayat'])) { $data_riwayat = $prm['data_riwayat']; } elseif (is_string($prm['data_riwayat']) && $prm['data_riwayat'] !== '') { $decoded = json_decode($prm['data_riwayat'], true); $data_riwayat = is_array($decoded) ? $decoded : array(); } } if ($form_code == '') { $this->sys_error(isset($prm['form_code']) && (string) $prm['form_code'] !== '' ? "Format kode form tidak valid" : "Form code tidak boleh kosong"); exit; } if ($xid_hex == '') { $raw_id = isset($prm['id']) ? trim((string) $prm['id']) : ''; $this->sys_error($raw_id === '' ? "ID (UUID) form tidak boleh kosong" : "Format ID (UUID) tidak valid, pastikan token form utuh (32 digit hex)"); exit; } if(count($data_riwayat) == 0){ $this->sys_error("Data riwayat tidak boleh kosong"); exit; } $sql = "SELECT * FROM form_riwayat_pasien WHERE FormRiwayatPasienCode = ? AND REPLACE(LOWER(FormRiwayatPasienUUID),'-','') = ? AND FormRiwayatPasienIsActive = 'Y'"; $query = $this->db_onedev->query($sql, array($form_code, $xid_hex)); if(!$query){ $this->sys_error_db("error get exist or code form not match"); exit; } $exist_form_riwayat = $query->result_array(); if (count($exist_form_riwayat) == 0) { $this->sys_error("Form tidak ditemukan, pastikan id adalah form_uuid (response start_session), bukan token MCU di URL (mgm_mcu)."); exit; } $parent_id = $exist_form_riwayat[0]['FormRiwayatPasienID']; $this->db_onedev->trans_begin(); foreach($data_riwayat as $key => $item){ $riwayat = json_encode($item, JSON_UNESCAPED_SLASHES); $sql = "UPDATE form_riwayat_pasien_template JOIN fisik_template ON FormRiwayatPasienTemplateFisikTemplateID = FisikTemplateID AND FisikTemplateIsActive = 'Y' AND FisikTemplateTitle = ? SET FormRiwayatPasienTemplateDetails = ?, FormRiwayatPasienTemplateLastUpdated = NOW(), FormRiwayatPasienTemplateLastUpdatedUserID = 45312 WHERE FormRiwayatPasienTemplateFormRiwayatPasienID = ? AND FormRiwayatPasienTemplateIsActive = 'Y' "; $rst = $this->db_onedev->query($sql, array( $item['title'], $riwayat, $parent_id )); if(!$rst){ echo $this->db_onedev->last_query(); $this->db_onedev->trans_rollback(); $this->sys_error_db("form_riwayat_pasien error save"); exit; } } $this->db_onedev->trans_commit(); $this->sys_ok("Data berhasil disimpan"); } catch(Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } }