Files
BE_IBL/application/controllers/satu_sehat/Servicerequest.php
2026-04-15 15:23:57 +07:00

438 lines
16 KiB
PHP

<?php
class Servicerequest extends MY_Controller
{
var $db;
function __construct()
{
parent::__construct();
$this->load->library('Satusehat');
}
function index()
{
echo "Satu Sehat Service Request";
}
//fungsi translate hari
function translateDayToIndonesian($englishDay)
{
$englishDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
$indonesianDays = ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'];
$index = array_search($englishDay, $englishDays);
if ($index !== false) {
return $indonesianDays[$index];
}
return 'Hari tidak valid';
}
//fungsi translate bulan
function translateMonthToIndonesian($englishMonth)
{
$englishMonths = [
'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'
];
$indonesianMonths = [
'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
];
$index = array_search($englishMonth, $englishMonths);
if ($index !== false) {
return $indonesianMonths[$index];
}
return 'Bulan tidak valid';
}
function getservicerequest()
{
$prm = $this->sys_input;
$orderheaderID = $prm['orderheaderID'];
// get organization
$sql = "SELECT organizationID
FROM one_health.organization
WHERE organizationIsActive = 'Y'";
$qry = $this->db->query($sql, []);
$last_qry = $this->db->last_query();
if (!$qry) {
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error);
exit;
}
$organizationID = $qry->result_array()[0]['organizationID'];
// get T_OrderDetail by T_OrderHeaderID
$T_OrderDetailID = "";
$sql_get_orderDetailID = "SELECT
T_OrderDetailID,
IFNULL(Nat_TestLoincCode,'') as Nat_TestLoincCode ,
IFNULL(Nat_TestLoincDisplay,'') as Nat_TestLoincDisplay,
T_OrderDetailT_TestName,
T_OrderHeaderM_PatientID ,
OHPatientMapIHSNumber,
EncounterUUID,
M_PatientName,
DAYNAME(T_OrderHeaderDate) as OrderHeaderDay,
DATE_FORMAT(DATE(T_OrderHeaderDate),'%d %M %Y') as OrderHeaderDate,
TIME(T_OrderHeaderDate) as OrderHeaderTime,
T_OrderHeaderDate,
OHDoctorMapIHSNumber,
M_DoctorName,
OHStaffMapIhsNumber,
M_StaffName
FROM t_orderheader
JOIN t_orderdetail
ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID
AND T_OrderHeaderID = ?
AND T_OrderDetailIsActive = 'Y'
AND T_OrderDetailT_TestIsPrice ='Y'
JOIN t_test
ON T_OrderDetailT_TestID = T_TestID
JOIN nat_test
ON T_TestNat_TestID = Nat_TestID
and Nat_TestIsActive = 'Y'
LEFT JOIN nat_test_loinc
ON Nat_TestLoincNat_TestID = Nat_TestID
Join m_doctor
ON M_DoctorID = T_OrderHeaderSenderM_DoctorID
AND M_DoctorIsActive ='Y'
JOIN m_patient
ON T_OrderHeaderM_PatientID = M_PatientID
AND T_OrderHeaderIsActive = 'Y'
AND M_PatientIsActive = 'Y'
JOIN order_log
ON OrderLogT_OrderHeaderID = T_OrderHeaderID
JOIN m_user
ON M_UserID = OrderLogUserID
AND M_UserIsActive = 'Y'
JOIN m_staff
ON M_StaffID = M_UserM_StaffID
AND M_StaffIsActive = 'Y'
LEFT JOIN one_health.oh_patient_map
ON T_OrderHeaderM_PatientID = OHPatientMapM_PatientID
AND OHPatientMapIsActive = 'Y'
LEFT JOIN one_health.encounter
ON EncounterT_orderHeaderID = T_orderHeaderID
AND EncounterIsActive= 'Y'
AND T_OrderDetailT_OrderHeaderID = EncounterT_orderHeaderID
LEFT JOIN one_health.oh_doctor_map
ON OHDoctorMapM_DoctorID = M_DoctorID
AND OHDoctorMapIsActive = 'Y'
LEFT JOIN one_health.oh_staff_map
ON OHStaffMapM_StaffNIK = M_StaffNIK
AND OHStaffMapIsActive = 'Y'";
$qry_orderDetailID = $this->db->query($sql_get_orderDetailID, $orderheaderID);
$last_qry = $this->db->last_query();
if (!$qry_orderDetailID) {
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error);
exit;
}
$orders = $qry_orderDetailID->result_array();
$results = array();
$sql = "SELECT *
FROM t_orderpromise
WHERE
T_OrderPromiseT_OrderHeaderID = ? AND T_OrderPromiseIsActive = 'Y'
ORDER BY T_OrderPromiseDateTime ASC";
$qry = $this->db->query($sql, $orderheaderID);
$last_qry = $this->db->last_query();
if (!$qry) {
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error);
exit;
}
$rst_promise = $qry->result_array();
$T_OrderPromiseDateTime = $rst_promise[0]['T_OrderPromiseDateTime'];
$results = [];
foreach ($orders as $key => $value) {
$T_OrderorderDetailID = $value['T_OrderDetailID'];
$sql = "SELECT COUNT(*) as xcount
FROM one_health.service_request
WHERE
ServiceRequestT_OrderDetailID = ? AND ServiceRequestIsActive = 'Y'";
$qry_cek = $this->db->query($sql, $T_OrderorderDetailID);
$last_qry = $this->db->last_query();
if (!$qry_cek) {
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error);
exit;
}
if ($qry_cek->row()->xcount == 0) {
//blm ada data di one_health maka diinsertkan
$servicerequest_uuid = $this->satusehat->gen_uuid();
//mengambil orderpromise yang paling awal
//mengubah hari dari inggris menjadi indonesia
$dayInIndonesian = $this->translateDayToIndonesian($value['OrderHeaderDay']);
//mengubah bulan dalam tanggal menjadi ke bahasa indonesia
$parts = explode(' ', $value['OrderHeaderDate']);
$indonesianMonth = $this->translateMonthToIndonesian($parts[1]);
$timeParts = explode(':', $value['OrderHeaderTime']);
$hourMinute = $timeParts[0] . ':' . $timeParts[1];
// mengubah Nama menjadi Huruf besar ditiap awal kata dan kecil selanjutnya
$formattedNamePatient = ucwords(strtolower($value['M_PatientName']));
$formattedNameDoctor = ucwords(strtolower($value['M_DoctorName']));
$formattedNamePerformer = ucwords(strtolower($value['M_StaffName']));
$category = [];
$category[] = array(
"coding" => [
[
"system" => "http://snomed.info/sct",
"code" => "108252007",
"display" => "Laboratory procedure",
],
]
);
$serviceRequestJSON = [
"fullUrl" => "urn:uuid:{$servicerequest_uuid}",
"resource" => [
"resourceType" => "ServiceRequest",
"identifier" => [
[
"system" => "http://sys-ids.kemkes.go.id/servicerequest/$organizationID",
"value" => $value['T_OrderDetailID']
],
],
"status" => "active",
"intent" => "original-order",
"priority" => "routine",
"category" => $category,
"code" => [
"coding" => [
[
"system" => "http://loinc.org",
"code" => $value['Nat_TestLoincCode'],
"display" => $value['Nat_TestLoincDisplay'],
],
],
"text" => $value['T_OrderDetailT_TestName'],
],
"subject" => [
"reference" => "Patient/" . $value['OHPatientMapIHSNumber'],
],
"encounter" => [
"reference" => "Encounter/" . $value['EncounterUUID'],
"display" => "Permintaan {$value['T_OrderDetailT_TestName']} {$formattedNamePatient} di hari {$dayInIndonesian}, {$parts[0]} $indonesianMonth {$parts[2]} pukul {$hourMinute} WIB"
],
"occurrenceDateTime" => date('c', strtotime($T_OrderPromiseDateTime)),
"authoredOn" => date('c', strtotime($value['T_OrderHeaderDate'])),
"requester" => [
"reference" => "Practitioner/{$value['OHDoctorMapIHSNumber']}",
"display" => $formattedNameDoctor
],
"performer" => [
[
"reference" => "Practitioner/{$value['OHStaffMapIhsNumber']}",
"display" => $formattedNamePerformer
]
],
"reasonCode" => [
[
"text" => ""
]
]
],
"request" => [
"method" => "POST",
"url" => "ServiceRequest"
]
];
$sql = "INSERT INTO one_health.service_request
(
ServiceRequestUUID,
ServiceRequestT_OrderHeaderID,
ServiceRequestT_OrderDetailID,
ServiceRequestJSON,
ServiceRequestCreated
)
VALUES
(
?,
?,
?,
?,
NOW()
)";
$qry = $this->db->query($sql, [
$servicerequest_uuid,
$orderheaderID,
$T_OrderorderDetailID,
json_encode($serviceRequestJSON)
]);
$last_qry = $this->db->last_query();
if (!$qry) {
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error);
exit;
}
$results[] = $serviceRequestJSON;
} else {
//sudah ada data di one_health maka langsung di returnkan jsonya ;
$sql = "SELECT *
FROM one_health.service_request
WHERE
ServiceRequestT_OrderDetailID = ? AND ServiceRequestIsActive = 'Y'";
$qry_cek = $this->db->query($sql, $T_OrderorderDetailID);
$last_qry = $this->db->last_query();
//echo $last_qry;
if (!$qry_cek) {
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error);
exit;
}
$rtx = $qry_cek->row_array();
//print_r($rtx['ServiceRequestJSON']);
$results[] = json_decode($rtx['ServiceRequestJSON']);
}
}
echo json_encode($results);
}
function getCategoryServiceRequest()
{
try {
$sql = "SELECT code,
display_en AS display
FROM one_terminology.terminology
WHERE resource_type = 'ServiceRequest'
AND attribute_path = 'ServiceRequest.category'";
$qry = $this->db->query($sql, []);
$last_qry = $this->db->last_query();
if (!$qry) {
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error);
exit;
}
$data = $qry->result_array();
$finalData = array();
for ($i = 0; $i < count($data); $i++) {
if ($data[$i]['code'] == '108252007') {
$data[$i]['default'] = 'Y';
} else {
$data[$i]['default'] = 'N';
}
$finalData[] = $data;
}
$this->sys_ok($data);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function getCodeSystem()
{
try {
$codeSystem = [
[
"id" => "http://snomed.info/sct",
"name" => "http://snomed.info/sct"
],
[
"id" => "http://loinc.org",
"name" => "http://loinc.org"
]
];
$this->sys_ok($codeSystem);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function update()
{
try {
$prm = $this->sys_input;
if (!$this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$newJson = $prm['json'];
$status = $prm['status'];
// "fullUrl": "urn:uuid:072576f7-8606-4890-b64c-2f9850a1090d",
$uuID = explode(":", $newJson["fullUrl"])[2];
$sql = "UPDATE one_health.service_request
SET ServiceRequestJSON = ?,
ServiceRequestStatus = ?
WHERE ServiceRequestUUID = ?";
$qry = $this->db->query($sql, [json_encode($newJson), $status, $uuID]);
$last_qry = $this->db->last_query();
if (!$qry) {
$error = array(
"message" => $this->db->error()["message"],
"sql" => $last_qry
);
$this->sys_error_db($error);
exit;
}
$this->sys_ok($uuID);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
}