db_onedev = $this->load->database("onedev", true); $this->load->library('Satusehat'); } function getdata() { $prm = $this->sys_input; $orderHeaderID = $prm['orderheaderID']; $results = array(); $sql = "SELECT * FROM one_health.organization JOIN m_branch ON organizationM_BranchID = M_BranchID AND M_BranchIsDefault = 'Y' AND M_BranchIsActive = 'Y' WHERE organizationIsActive = 'Y'"; $query = $this->db_onedev->query($sql); if (!$query) { //echo $this->db_onedev->last_query(); $this->sys_error("error get m_branch"); exit; } //echo $this->db_onedev->last_query(); $r_organization = $query->row_array(); $organizationID = $r_organization['organizationID']; $sql = "SELECT IFNULL(OHPatientMapIHSNumber, 'Belum terdaftar') as patient_ihsnumber, EncounterUUID as encounter_uuid, IFNULL(OHDoctorMapIHSNumber,'') as doctor_ihsnumber, fn_global_age_count_day(M_PatientDOB, date(T_OrderHeaderDate)) age_in_day, M_PatientM_SexID as sex_id FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN one_health.encounter ON EncounterT_orderHeaderID = T_orderHeaderID AND EncounterIsActive = 'Y' LEFT JOIN one_health.oh_doctor_map ON OHDoctorMapM_DoctorID = T_OrderHeaderPjM_DoctorID AND OHDoctorMapIsActive = 'Y' LEFT JOIN one_health.oh_patient_map ON OHPatientMapM_PatientID = T_OrderHeaderM_PatientID AND OHPatientMapIsActive = 'Y' WHERE T_OrderHeaderID = ?"; $query = $this->db_onedev->query($sql, array($orderHeaderID)); if (!$query) { //echo $this->db_onedev->last_query(); $this->sys_error("error get t_orderheader"); exit; } //echo $this->db_onedev->last_query(); $r_order = $query->row_array(); $sql = "SELECT t_orderdetail.*, Group_ResultID, Group_ResultName, IFNULL(Nat_TestLoincCode,'') as code_loinc, IFNULL(Nat_TestLoincDisplay,'') as display_loinc, Nat_TestIsQuantitative as isQuantitatif, Nat_TestFlagObservationType as observationType, Nat_TestID, T_OrderDetailAddOnNormalFlag as code_interpretation, IF(T_OrderDetailAddOnNormalFlag = 'N','Normal',IF(T_OrderDetailAddOnNormalFlag = 'L','Low','High')) as display_interpretation FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestID JOIN t_orderdetailaddon ON T_OrderDetailAddOnT_OrderDetailID = T_OrderDetailID JOIN nat_test ON T_TestNat_TestID = Nat_TestID AND Nat_TestIsActive = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagNonLab = 'N' LEFT JOIN nat_test_loinc ON Nat_TestLoincNat_TestID = T_TestNat_TestID WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' AND T_OrderDetailT_TestIsResult = 'Y' ORDER BY T_OrderDetailT_TestSasCode ASC"; $query = $this->db_onedev->query($sql, array($orderHeaderID)); if (!$query) { // echo $this->db_onedev->last_query(); $this->sys_error("error get t_orderdetail"); exit; } //echo $this->db_onedev->last_query(); $r_details = $query->result_array(); //print_r($r_details); if ($r_details) { $data_results = []; foreach ($r_details as $key => $value) { //echo $value['isQuantitatif']; $sql = "SELECT * FROM one_health.observation WHERE observationT_OrderHeaderID = ? AND observationT_TestID = ? AND observationIsActive = 'Y'"; $query = $this->db_onedev->query($sql, array($orderHeaderID, $value['T_OrderDetailT_TestID'])); if (!$query) { // echo $this->db_onedev->last_query(); $this->sys_error("error get service_request exist"); exit; } //echo $this->db_onedev->last_query().";"; $exist_data = $query->result_array(); if (count($exist_data) == 0) { $observation_uuid = $this->satusehat->gen_uuid(); $data_result = []; $result["fullUrl"] = "urn:uuid:" . $observation_uuid; $data_result['resourceType'] = "Observation"; $data_result['identifier'] = array( array( "system" => "http://sys-ids.kemkes.go.id/observation/" . $organizationID, "value" => $value['T_OrderDetailID'] ) ); $data_result['status'] = "final"; $data_result['category'] = array( array( "coding" => array( array( "system" => "http://terminology.hl7.org/CodeSystem/observation-category", "code" => "laboratory", "display" => "Laboratory" ) ) ) ); $data_result['code'] = array( "coding" => array( array( "system" => "http://loinc.org", "code" => $value['code_loinc'], "display" => $value['display_loinc'] ) ) ); $data_result['subject'] = array( "reference" => "Patient/" . $r_order['patient_ihsnumber'] ); $data_result['encounter'] = array( 'reference' => "Encounter/" . $r_order['encounter_uuid'] ); $data_result['effectiveDateTime'] = date('c', strtotime($value['T_OrderDetailVerDate'])); $data_result['issued'] = date('c', strtotime($value['T_OrderDetailValDate'])); $data_result['performer'] = array( array( 'reference' => "Practitioner/" . $r_order['doctor_ihsnumber'] ), array( 'reference' => "Organization/" . $organizationID ) ); $sql = "SELECT SpecimenUUID FROM t_ordersample JOIN t_test ON T_OrderSampleT_SampleTypeID = T_TestT_SampleTypeID AND T_TestID = ? JOIN one_health.specimen ON SpecimentT_OrderSampleID = T_OrderSampleID AND SpecimenIsActive = 'Y' WHERE T_OrderSampleT_OrderHeaderID = ? AND T_OrderSampleIsActive = 'Y' GROUP BY T_TestT_SampleTypeID LIMIT 1"; $query = $this->db_onedev->query($sql, array($value['T_OrderDetailT_TestID'], $value['T_OrderDetailT_OrderHeaderID'])); if (!$query) { //echo $this->db_onedev->last_query(); $this->sys_error("error get spescimen"); exit; } $r_specimen = $query->row_array(); $data_result['specimen'] = array( 'reference' => "Specimen/" . $r_specimen['SpecimenUUID'] ); $serviceRequestUUID = ""; $data_parent = []; if ($value['T_OrderDetailT_TestIsPrice'] == "Y") { $sql = "SELECT ServiceRequestUUID, T_OrderDetailID, IFNULL(Nat_TestLoincCode,'') as code_loinc, IFNULL(Nat_TestLoincDisplay,T_OrderDetailT_TestName) as T_OrderDetailT_TestName FROM one_health.service_request JOIN t_orderdetail ON ServiceRequestT_OrderDetailID = T_OrderDetailID AND ServiceRequestIsActive = 'Y' JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestID LEFT JOIN nat_test_loinc ON Nat_TestLoincNat_TestID = T_TestNat_TestID WHERE ServiceRequestT_OrderDetailID = ? LIMIT 1"; $query_service_req = $this->db_onedev->query($sql, array($value['T_OrderDetailID'])); if (!$query_service_req) { //echo $this->db_onedev->last_query(); $this->sys_error("error get service_request 1"); exit; } $data_parent = $query_service_req->row_array(); $serviceRequestUUID = $data_parent['ServiceRequestUUID']; } else { $sql = "SELECT ServiceRequestUUID, T_OrderDetailID, IFNULL(Nat_TestLoincCode,'') as code_loinc, IFNULL(Nat_TestLoincDisplay,T_OrderDetailT_TestName) as T_OrderDetailT_TestName FROM t_orderdetail JOIN one_health.service_request ON ServiceRequestT_OrderDetailID = T_OrderDetailID AND ServiceRequestIsActive = 'Y' JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestID LEFT JOIN nat_test_loinc ON Nat_TestLoincNat_TestID = T_TestNat_TestID WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailT_TestIsPrice = 'Y' AND T_OrderDetailT_TestSasCode LIKE CONCAT(SUBSTR(?, 1, 8),'%') AND T_OrderDetailIsActive = 'Y' LIMIT 1"; $query_service_req = $this->db_onedev->query($sql, array( $value['T_OrderDetailT_OrderHeaderID'], $value['T_OrderDetailT_TestSasCode'] )); if (!$query_service_req) { //echo $this->db_onedev->last_query(); $this->sys_error("error get service_request 2"); exit; } $data_parent = $query_service_req->row_array(); $serviceRequestUUID = $data_parent['ServiceRequestUUID']; } $data_result['basedOn'] = array( array( "reference" => "ServiceRequest/" . $serviceRequestUUID ) ); $sql = "SELECT Nat_MethodeID, Nat_MethodeName,Nat_NormalValueMinValue,Nat_NormalValueMaxValue, Nat_NormalValueMinValueInclusive, Nat_NormalValueMaxValueInclusive FROM nat_normalvalue JOIN nat_methode ON Nat_NormalValueNat_MethodeID = Nat_MethodeID WHERE Nat_NormalValueID = ? "; $query = $this->db_onedev->query($sql, array( $value['T_OrderDetailNat_NormalValueID'] )); if (!$query) { $this->sys_error("error get Nat_MethodeName "); exit; } //echo $this->db_onedev->last_query(); $r_normal_value = $query->row_array(); //print_r($r_normal_value); //$data_result['methode_name'] = $r_normal_value['Nat_MethodeName']; if ($value['observationType'] == "S") { if ($value['Group_ResultName'] == 'Papsmear') { $sql = "SELECT Other_PapSmearDetailsResult as result FROM t_orderdetail JOIN other_papsmear ON Other_PapSmearT_OrderDetailID = ? AND Other_PapSmearT_OrderDetailID = T_OrderDetailID AND Other_PapSmearIsActive = 'Y' JOIN other_papsmeardetails ON Other_PapSmearDetailsOther_PapSmearID = Other_PapSmearID AND Other_PapSmearDetailsLabel = 'Kesimpulan' AND Other_PapSmearDetailsIsActive = 'Y' LIMIT 1"; $query = $this->db_onedev->query($sql, array( $value['T_OrderDetailID'] )); if (!$query) { $this->sys_error("error get papsmear result "); exit; } //echo $this->db_onedev->last_query(); $dt_papsmearresult = $query->row_array(); $detailResult = $dt_papsmearresult['result']; } $data_result['valueString'] = $detailResult; } elseif ($value['observationType'] == "C") { $detailResult = $value['T_OrderDetailResult']; //echo "IN"; $data_result['valueCodeableConcept'] = array( 'coding' => array(), 'text' => $value['T_OrderDetailResult'] ); if ($value['T_OrderDetailNormalValueNote'] && $value['T_OrderDetailNormalValueNote'] != "") { $data_result['referenceRange'] = array( array( 'text' => $value['T_OrderDetailNormalValueNote'] ) ); } }elseif($value['observationType'] == "K") { $data_result['valueQuantity'] = array( 'value' => floatval($value['T_OrderDetailResult']), 'unit' => "mmol/L", //$value['T_OrderDetailNat_UnitName'], 'system' => "http://unitsofmeasure.org", 'code' => "mmol/L", //$value['T_OrderDetailNat_UnitName'] ); $data_result['interpretation'] = array( array( 'coding' => array( array( 'system' => "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", 'code' => $value['code_interpretation'], 'display' => $value['display_interpretation'] ) ) ) ); $data_normal_values = []; $sql = "SELECT * FROM nat_normalvaluetype WHERE Nat_NormalValueTypeIsActive = 'Y'"; $query = $this->db_onedev->query($sql); if (!$query) { //echo $this->db_onedev->last_query(); $this->sys_error("error get normalvalues types"); exit; } $normal_value_types = $query->result_array(); foreach ($normal_value_types as $k_nvt => $v_nvt) { $sql = "SELECT * FROM nat_normalvalue JOIN nat_flag ON Nat_NormalValueNat_FlagID = Nat_FlagID JOIN nat_test ON Nat_NormalValueNat_TestID = Nat_TestID JOIN nat_unit ON Nat_TestNat_UnitID = Nat_UnitID WHERE ( Nat_NormalValueValidDate IS NULL OR Nat_NormalValueValidDate < NOW() ) AND Nat_NormalValueIsActive = 'Y' AND Nat_NormalValueNat_NormalValueTypeID = {$v_nvt['Nat_NormalValueTypeID']} AND Nat_NormalValueIsAbnormal = 'N' AND ( Nat_NormalValueNat_MethodeID = {$r_normal_value["Nat_MethodeID"]} ) AND Nat_NormalValueNat_TestID = {$value["Nat_TestID"]} AND ( ( {$v_nvt['Nat_NormalValueTypeID']} in (1,3) AND Nat_NormalValueNat_SexID = {$r_order['sex_id']} ) OR {$v_nvt['Nat_NormalValueTypeID']} in (2,4) ) AND ( ( Nat_NormalValueMinAgeInclusive = 'Y' AND fn_normal_get_age(Nat_NormalValueMinAge,Nat_NormalValueAgeUnit) <= {$r_order["age_in_day"]} ) OR ( Nat_NormalValueMinAgeInclusive = 'N' AND fn_normal_get_age(Nat_NormalValueMinAge,Nat_NormalValueAgeUnit) < {$r_order["age_in_day"]} ) ) AND ( ( Nat_NormalValueMaxAgeInclusive = 'Y' AND fn_normal_get_age(Nat_NormalValueMaxAge,Nat_NormalValueAgeUnit) >= {$r_order["age_in_day"]} ) OR ( Nat_NormalValueMaxAgeInclusive = 'N' AND fn_normal_get_age(Nat_NormalValueMaxAge,Nat_NormalValueAgeUnit) > {$r_order["age_in_day"]} ) ) "; $query = $this->db_onedev->query($sql); if (!$query) { echo $this->db_onedev->last_query(); $this->sys_error("error get normalvalues type" . $v_nvt['Nat_NormalValueTypeID']); exit; } $normalvalues = $query->result_array(); if ($normalvalues) { foreach ($normalvalues as $k_normalvalue => $v_normalvalue) { $data_normal_values[] = array( "text" => $v_normalvalue["Nat_FlagName"], "high" => array( "value" => floatval($v_normalvalue["Nat_NormalValueMaxValue"]), "unit" => "mmol/L", //$v_normalvalue["Nat_UnitName"], "system" => "http://unitsofmeasure.org", "code" => "mmol/L" //$v_normalvalue["Nat_UnitName"] ), "low" => array( "value" => floatval($v_normalvalue["Nat_NormalValueMinValue"]), "unit" => "mmol/L", //$v_normalvalue["Nat_UnitName"], "system" => "http://unitsofmeasure.org", "code" => "mmol/L" //$v_normalvalue["Nat_UnitName"] ) ); } } } $data_result['referenceRange'] = $data_normal_values; } $result["resource"] = $data_result; $result["request"] = array("method" => "POST", "url" => "Observation"); $sql = "INSERT INTO one_health.observation ( observationUUID, observationT_OrderHeaderID, observationT_OrderDetailID, observationT_TestName, observationLoincCode, observationT_TestID, observationType, observationJSON, observationCreated ) VALUES(?,?,?,?,?,?,?,?,NOW())"; $query = $this->db_onedev->query($sql, array( $observation_uuid, $value['T_OrderDetailT_OrderHeaderID'], $data_parent['T_OrderDetailID'], $data_parent['T_OrderDetailT_TestName'], $data_parent['code_loinc'], $value['T_OrderDetailT_TestID'], $value['observationType'], json_encode($result) )); if (!$query) { echo $this->db_onedev->last_query(); $this->sys_error("error insert observation"); exit; } // echo $this->db_onedev->last_query(); $last_id = $this->db_onedev->insert_id(); $sql = "SELECT * FROM one_health.observation WHERE observationID = ?"; $query = $this->db_onedev->query($sql, array($last_id)); if (!$query) { // echo $this->db_onedev->last_query(); $this->sys_error("error get service_request after insert"); exit; } //echo $this->db_onedev->last_query(); $exist_data = $query->result_array(); $exist_data[0]['observationJSON'] = json_decode($exist_data[0]['observationJSON']); $data_results[] = $exist_data[0]; } else { $exist_data[0]['observationJSON'] = json_decode($exist_data[0]['observationJSON']); $data_results[] = $exist_data[0]; } } } //print_r($data_results); $sql = "SELECT * FROM one_health.observation WHERE observationT_OrderHeaderID = ? AND observationIsActive = 'Y' GROUP BY observationT_TestName"; $query = $this->db_onedev->query($sql, array($orderHeaderID)); if (!$query) { // echo $this->db_onedev->last_query(); $this->sys_error("error get service_request exist"); exit; } //echo $this->db_onedev->last_query().";"; $parenttest = array(); $parent_datas = $query->result_array(); foreach ($parent_datas as $k_p => $v_p) { $parenttest[] = array( 'T_OrderDetailID' => $v_p['observationT_OrderDetailID'], 'T_TestName' => $v_p['observationT_TestName'], 'details' => [] ); } foreach ($data_results as $key => $value) { foreach ($parenttest as $k => $v) { if ($v['T_OrderDetailID'] == $value['observationT_OrderDetailID']) { $parenttest[$k]['details'][] = $value; } } } echo json_encode($parenttest); } function updateobservation() { try { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; // $orderheaderID = $prm['orderheaderID']; // $json_data = json_encode($prm['json_data']); $status = $prm['status']; $newJson = $prm['json']; $uuID = explode(":", $newJson["fullUrl"])[2]; // print_r($uuID); // exit; $sql = "UPDATE one_health.observation SET observationJSON = ?, observationStatus = ? WHERE observationUUID = ?"; $qry = $this->db_onedev->query($sql, [json_encode($newJson), $status, $uuID]); $last_qry = $this->db_onedev->last_query(); if (!$qry) { $error = array( "message" => $this->db_onedev->error()["message"], "sql" => $last_qry ); $this->sys_error_db($error); exit; } $sql = "SELECT * FROM one_health.observation WHERE observationUUID = ? AND observationIsActive = 'Y'"; $qry = $this->db_onedev->query($sql, [$uuID]); $last_qry = $this->db_onedev->last_query(); if (!$qry) { $error = array( "message" => $this->db_onedev->error()["message"], "sql" => $last_qry ); $this->sys_error_db($error); exit; } $result = $qry->row_array(); echo json_encode($result['observationJSON']); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } function get_terminologyresult(){ try { $prm = $this->sys_input; $search = $prm['search']; $code_system = $prm['code_system']; $sql = "SELECT code_system,code,display FROM one_terminology.`terminology` WHERE `resource_type` = 'Observation' AND `attribute_path` = 'observation.value' AND code_system = ? AND ( `display` LIKE CONCAT('%',?,'%') OR `code` LIKE CONCAT('%',?,'%') ) LIMIT 50"; $qry = $this->db_onedev->query($sql, [$code_system,$search,$search]); $last_qry = $this->db_onedev->last_query(); //echo $last_qry; if (!$qry) { $error = array( "message" => $this->db_onedev->error()["message"], "sql" => $last_qry ); $this->sys_error_db($error); exit; } $results = $qry->result_array(); echo json_encode($results); } catch (Exception $exc) { $message = $exc->getMessage(); $this->sys_error($message); } } }