Files
BE_CPONE/application/controllers/Api_itf.php
2026-04-27 10:26:26 +07:00

1248 lines
42 KiB
PHP

<?php
class Api_itf extends MY_Controller
{
var $intervalHour;
var $tmp_body;
function __construct()
{
parent::__construct();
$this->intervalHour = 12;
}
function param()
{
$body = file_get_contents("php://input");
$this->tmp_body = $body;
return json_decode($body, true);
}
function auth_token()
{
$headers = getallheaders();
if (!array_key_exists('Authorization', $headers)) {
echo json_encode(["status" => "ERR", "message" => "No Authorization Bearer [Auth003]"]);
exit;
}
$token = $headers["Authorization"];
$token = trim(str_replace("Bearer", "", $token));
$param = JWT::decode($token, $this->SECRET_KEY, true);
$param = json_decode(json_encode($param), true);
$xnow = date("Y-m-d H:i:s");
if ($param["expired"] < $xnow) {
echo json_encode(["status" => "ERR", "message" => "Access Token expired [Auth003]"]);
exit;
}
return $param["branchCode"];
}
function update_order()
{
$branch_code = $this->auth_token();
$param = $this->param();
$sql_i = "insert into order_download(order_DownloadT_OrderHeaderID,order_DownloadM_BranchCode) values(?,?)";
$this->db->trans_begin();
foreach ($param["ids"] as $id) {
$qry = $this->db->query($sql_i, [$id, $branch_code]);
if (!$qry) {
// echo $this->db->last_query();
// print_r($this->db->error());
echo json_encode(["status" => "ERR", "message" => "Update Order error [UpdOrder001]"]);
$this->db->trans_rollback();
exit;
}
}
$this->db->trans_commit();
echo json_encode(["status" => "OK", "message" => "Order Updated"]);
}
/*
alter table api_result
add api_ResultSpecimenCollectDate datetime,
add api_ResultSpecimenReceivedDate datetime,
add api_ResultInputDate datetime,
add api_ResultComment varchar(300),
add api_ResultNote varchar(300),
add api_ResultPathologistNote varchar(300),
add api_ResultNormalNote text,
add api_ResultVerificationUser varchar(300),
add api_ResultVerificationDate datetime,
add api_ResultAuthorizationDate datetime,
add api_ResultAuthorizationUser varchar(300);
alter table api_result
add api_ResultAgeYear varchar(3),
add api_ResultAgeMonth varchar(3),
add api_ResultAgeDays varchar(3);
{
"PatientName": "Pasien 5 Karyawan PT PMF",
"LisRegNo": "W10530500",
"LisTestID": "00000062",
"HisRegNo": "04802782DA",
"SpecimenCollectDate": "2024-02-08 08:12:49",
"SpecimenReceivedDate": "2024-02-08 08:12:49",
"TestName": "Asam Urat",
"TestTypeID": "1",
"TestHeader": "False",
"TestGroupName": "Kimia Klinik",
"TestSubGroupName": "Fungsi Lemak",
"TestSequence": "L010200000012",
"Result": "5.3",
"ResultInputDate": "2024-02-08 08:12:49",
"ResultComment": "Duplo",
"ResultNote": "Periksa ulang dalam 3 hari",
"PathologistNote": "",
"ReferenceValue": "3,5 - 7,2",
"ReferenceNote": "",
"TestMethodName": "URICASE",
"TestFlagSign": "",
"TestUnitsName": "mg\/dL",
"InstrumentName": "Kimia Klinik Analyzer",
"VerificationDate": "2023/06/13 12:45:39",
"VerificationUser": "Analis Bagian Kimia",
"AuthorizationDate": "2023/06/13 13:00:12",
"AuthorizationUser": "dr. Laboratorium",
"GreaterthanValue": "3.5",
"LessthanValue": "7.2",
"AgeYear": "042",
"AgeMonth": "00",
"AgeDays": "14",
"TestFlagTextNote": "",
"HisTestIDOrder": "720400001",
"TransferFlag": "1"
}
*/
function LabResult()
{
$branchCode = "NOAUTH";
$param = $this->param();
if (json_last_error() != JSON_ERROR_NONE) {
$log_ApiID = $this->log($branchCode, "LabResult", $this->tmp_body, "", "Result");
$sql = "update cpone_log.log_api set log_ApiIsParsed = 'E', log_ApiParam =? where log_ApiID=?";
$qry = $this->db->query($sql, [$this->tmp_body, $log_ApiID]);
if (!$qry) {
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Invalid JSON Param [Result001]"],
"OrderList" => [],
]);
exit;
}
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Invalid JSON Param [Result002]"],
"OrderList" => [],
]);
exit;
}
// insert to log_api
$log_ApiID = $this->log($branchCode, "LabResult", $this->tmp_body, "", "Result");
//parsed param
// partial commit
$this->db->trans_begin();
$sql_i = "insert into api_result(api_ResultDate,api_ResultNolab,
api_ResultPatient, api_ResultTestCode, api_ResultTestName, api_ResultResult,
api_ResultFlag, api_ResultUnit, api_ResultNormalText, api_ResultNormalNote, api_ResultNormalMethode,
api_ResultNormalMinValue, api_ResultNormalMinInclusive, api_ResultNormalMaxValue, api_ResultNormalMaxInclusive,
api_ResultM_BranchCode, api_ResultLog_ApiID,
api_ResultSpecimenCollectDate, api_ResultSpecimenReceivedDate, api_ResultInputDate, api_ResultComment,
api_ResultPathologistNote, api_ResultVerificationUser, api_ResultVerificationDate, api_ResultAuthorizationUser,
api_ResultAuthorizationDate, api_ResultAgeYear, api_ResultAgeMonth, api_ResultAgeDays, api_ResultNote
)
values (
now(),?,
?,?,?,?,
?,?,?,?,?,
?,?,?,?,
?,?,
?,?,?,?,
?,?,?,?,
?,?,?,?,?
)";
$qry = $this->db->query($sql_i, [
$param["HisRegNo"],
$param["PatientName"], $param["LisTestID"], $param["TestName"], $param["Result"],
$param["TestFlagSign"], $param["TestUnitsName"], $param["ReferenceValue"], $param["ReferenceNote"], $param["TestMethodName"],
$param["GreaterthanValue"], "N", $param["LessthanValue"], "N",
$branchCode, $log_ApiID,
$param["SpecimenCollectDate"], $param["SpecimenReceivedDate"], $param["ResultInputDate"], $param["ResultComment"],
$param["PathologistNote"], $param["VerificationUser"], $param["VerificationDate"], $param["AuthorizationUser"],
$param["AuthorizationDate"], $param["AgeYear"], $param["AgeMonth"], $param["AgeDays"], $param["ResultNote"]
]);
if (!$qry) {
echo json_encode([
"Status" => [
"OK" => false, "Code" => 0, "Messages" => "Sys Error [Result003]",
"err" => $this->db->error()
],
"OrderList" => [],
]);
$this->db->trans_rollback();
exit;
}
$date = $param["date"];
$noreg = $param["noreg"];
$nolab = $param["nolab"];
$patient = $param["patient"];
foreach ($param["result"] as $r) {
$abnormal = $r["abnormal"];
$flag = $r["flag"];
$is_quantitative = $r["is_quantitative"];
$result = $r["result"];
$test_code = $r["test_code"];
$test_name = $r["test_name"];
$unit = $r["unit"];
$description = $r["ref_range"]["description"];
$methode = $r["ref_range"]["methode"];
$min_comparator = $r["ref_range"]["min"]["comparator"];
$min_value = $r["ref_range"]["min"]["value"];
$max_value = $r["ref_range"]["max"]["value"];
$max_comparator = $r["ref_range"]["max"]["comparator"];
$min_value_inclusive = "N";
if ($min_comparator == ">=") $min_value_inclusive = "Y";
$max_value_inclusive = "N";
if ($max_comparator == ">=") $max_value_inclusive = "Y";
$qry = $this->db->query($sql_i, [
$date, $nolab,
$noreg, $patient, $test_code, $test_name,
$result, $flag, $unit, $is_quantitative,
$abnormal, $description, $methode,
$min_value, $min_value_inclusive,
$max_value, $max_value_inclusive,
$branchCode, $log_ApiID
]);
}
$this->db->trans_commit();
$this->parse($log_ApiID);
echo json_encode([
"Status" => ["OK" => true, "Code" => -1, "Messages" => "SUCCESS"],
]);
}
function SetReceivedOrder()
{
$param = $this->param();
$this->log("NOAUTH", "SetReceivedOrder", $this->tmp_body, "", "SetReceivedOrder");
$nolab = $param["orderNumber"];
$labRegNo = $param["LabRegNo"];
$receivedFlag = $param["ReceivedFlag"];
$ReceivedDateTime = $param["ReceivedDatetime"];
$sql = "insert into order_download(order_DownloadT_OrderHeaderID,order_DownloadT_OrderHeaderDate,order_DownloadLabRegNo,
order_DownloadReceivedFlag,order_DownloadReceivedDateTime)
select T_OrderHeaderID, T_OrderHeaderDate, ?, ?, ?
from t_orderheader
where T_OrderHeaderLabNumber = ?";
$qry = $this->db->query($sql, [$labRegNo, $receivedFlag, $ReceivedDateTime, $nolab]);
if (!$qry) {
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Get Order Detail issue [Order005]"],
"OrderList" => [],
]);
exit;
}
echo json_encode([
"Status" => [
"OK" => true, "Code" => -1,
"Messages" => ""
],
"orderNumber" => $nolab,
"ReceivedFlag" => $receivedFlag,
"LabRegNo" => $labRegNo,
"ReceivedDatetime" => $ReceivedDateTime
]);
}
function GetOrderDetail()
{
$param = $this->param();
$nolab = $param["orderNumber"];
$sql = "select
CorporateID,
CorporateName,
M_BranchCodeLab outletId,
M_BranchCode BranchCode,
M_BranchName BranchName,
M_PatientNoreg PatientCode,
concat(
ifnull(M_TitleName,''),
if(M_TitleName is not null, ' ',''),
if (M_PatientPrefix is not null, M_PatientPrefix, '') ,
if (M_PatientPrefix is not null, ' ', '') ,
M_PatientName,
if (M_PatientSuffix is not null, M_PatientSuffix, '') ,
if (M_PatientSuffix is not null, ' ', '')
) PatientName,
if( lower(M_PatientGender) = 'male', 'M','F') PatientSexCode,
if( lower(M_PatientGender) = 'male', 'Male','Female') PatientSexName,
replace(M_PatientDOB,'-','/') PatientDOB,
'CpOne Address' PatientAdress,
T_OrderHeaderLabNumber OrderNumber,
replace(T_OrderHeaderDate,'-','/') OrderDateTime,
'CpOne001' DoctorOrderCode ,
'Dr CpOne' DoctorOrderName ,
M_BranchCode GuarantorID,
M_BranchName GuarantorName,
'Cp001' AgreementID,
'CpOne' AgreementName,
false ReceivedFlag,
null LabRegNo,
null ReceivedDateTime,
ifnull(Nat_TestMapCode,'Un-Map') ItemCode,
T_TestName ItemName
from t_orderheader
join m_branch
on T_OrderHeaderLabNumber = ?
and T_OrderHeaderIsActive = 'Y'
and T_OrderHeaderM_BranchID = M_BranchID
and M_BranchIsActive = 'Y'
join corporate on T_OrderHeaderCorporateID = CorporateID
and CorporateIsActive = 'Y'
join m_patient on T_OrderHeaderM_PatientID = M_PatientID
join t_orderdetail on T_OrderHeaderID = T_OrderDetailT_OrderHeaderID
and T_OrderDetailIsActive = 'Y'
join t_test on T_OrderDetailT_TestID = T_TestID
and (T_TestIsPrice = 'Y'
-- or T_TestIsResult = 'Y'
)
and T_TestNat_GroupID=1
left join nat_testmap
on T_TestNat_TestID = Nat_TestMapNat_TestID
and Nat_TestMapIsActive = 'Y'
left join m_title on M_PatientM_TitleID = M_TitleID
order by T_OrderHeaderLabNumber,Nat_TestMapCode";
$qry = $this->db->query($sql, [$nolab]);
//echo $this->db->last_query();
if (!$qry) {
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Get Order Detail issue [Order004]"],
"OrderList" => [],
]);
exit;
}
$rows = $qry->result_array();
$result = [];
foreach ($rows as $idx => $r) {
if ($idx == 0) {
$result = $r;
unset($result["ItemCode"]);
unset($result["ItemName"]);
$result["OrderedItems"] = [];
$result["ReceivedFlag"] = (bool) false;
}
$result["OrderedItems"][] = [
"itemCode" => $r["ItemCode"],
"itemName" => $r["ItemName"]
];
}
$this->send_order($result);
echo json_encode([
"Status" => ["OK" => true, "Code" => -1, "Messages" => "SUCCESS"],
"OrderList" => $result
]);
}
function GetOutstandingList()
{
$param = $this->param();
$s_date = $param["orderDateTimeStart"]; // “2019/05/01”,
$e_date = $param["orderDateTimeEnd"]; // : “2019/06/01”,
$branchCode = $param["branchCode"]; // : “2019/06/01”,
$receivedFlag = $param["receivedFlag"]; //: fals
if (strtotime($s_date)) {
$s_date = date("Y-m-d", strtotime($s_date));
}
if (strtotime($e_date)) {
$e_date = date("Y-m-d", strtotime($e_date));
}
$s_date = $s_date . " 00:00:00";
$e_date = $e_date . " 23:59:59";
if (!strtotime($s_date)) {
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "orderDateTimeStart is not valid [Order001]"],
"OrderList" => []
]);
exit;
}
if (!strtotime($e_date)) {
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "orderDateTimeEnd {$param["orderDateTimeEnd"]} $e_date is not valid [Order002]"],
"OrderList" => []
]);
exit;
}
$w_flag = " not in ";
$s_flag = "false";
if ($receivedFlag === true) {
$w_flag = " in ";
$s_flag = "true";
}
$sql = "select
CorporateID,
CorporateName,
M_BranchCode BranchCode,
M_BranchName BranchName,
M_PatientNoreg PatientCode,
concat(
ifnull(M_TitleName,''),
if(M_TitleName is not null, ' ',''),
if (M_PatientPrefix is not null, M_PatientPrefix, '') ,
if (M_PatientPrefix is not null, ' ', '') ,
M_PatientName,
if (M_PatientSuffix is not null, M_PatientSuffix, '') ,
if (M_PatientSuffix is not null, ' ', '')
) PatientName,
if( lower(M_PatientGender) = 'male', 'M','F') PatientSexCode,
if( lower(M_PatientGender) = 'male', 'Male','Female') PatientSexName,
replace(M_PatientDOB,'-','/') PatientDOB,
'CpOne Address' PatientAdress,
T_OrderHeaderLabNumber OrderNumber,
replace(T_OrderHeaderDate,'-','/') OrderDateTime,
'CpOne001' DoctorOrderCode ,
'Dr CpOne' DoctorOrderName ,
M_BranchCode GuarantorID,
M_BranchName GuarantorName,
'Cp001' AgreementID,
'CpOne' AgreementName,
$s_flag ReceivedFlag,
null LabRegNo,
null ReceivedDateTime
from t_orderheader
join m_branch
on T_OrderHeaderDate >= ?
and T_OrderHeaderDate <= ?
and T_OrderHeaderIsActive = 'Y'
and T_OrderHeaderM_BranchID = M_BranchID
and M_BranchIsActive = 'Y'
and T_OrderHeaderID $w_flag (
select order_DownloadT_OrderHeaderID
from
order_download
where order_DownloadT_OrderHeaderDate >= ?
and order_DownloadT_OrderHeaderDate <= ?
)
join mcu_preregister_patients on Mcu_PreregisterPatientsT_OrderHeaderID = T_OrderHeaderID
and Mcu_PreregisterPatientsIsActive = 'Y'
join corporate on T_OrderHeaderCorporateID = CorporateID
and CorporateIsActive = 'Y'
join m_patient on T_OrderHeaderM_PatientID = M_PatientID
left join m_title on M_PatientM_TitleID = M_TitleID
order by T_OrderHeaderLabNumber
";
$qry = $this->db->query($sql, [$s_date, $e_date, $s_date, $e_date]);
if ($branchCode != "") {
$sql = "select
CorporateID,
CorporateName,
M_BranchCode BranchCode,
M_BranchName BranchName,
M_PatientNoreg PatientCode,
concat(
ifnull(M_TitleName,''),
if(M_TitleName is not null, ' ',''),
if (M_PatientPrefix is not null, M_PatientPrefix, '') ,
if (M_PatientPrefix is not null, ' ', '') ,
M_PatientName,
if (M_PatientSuffix is not null, M_PatientSuffix, '') ,
if (M_PatientSuffix is not null, ' ', '')
) PatientName,
if( lower(M_PatientGender) = 'male', 'M','F') PatientSexCode,
if( lower(M_PatientGender) = 'male', 'Male','Female') PatientSexName,
replace(M_PatientDOB,'-','/') PatientDOB,
'CpOne Address' PatientAdress,
T_OrderHeaderLabNumber OrderNumber,
replace(T_OrderHeaderDate,'-','/') OrderDateTime,
'CpOne001' DoctorOrderCode ,
'Dr CpOne' DoctorOrderName ,
M_BranchCode GuarantorID,
M_BranchName GuarantorName,
concat('CpOne-',T_OrderHeaderMgm_McuID) AgreementID,
concat('CpOne-',T_OrderHeaderMgm_McuID) AgreementName,
$s_flag ReceivedFlag,
null LabRegNo,
null ReceivedDateTime
from t_orderheader
join m_branch
on T_OrderHeaderDate >= ?
and T_OrderHeaderDate <= ?
and T_OrderHeaderIsActive = 'Y'
and T_OrderHeaderM_BranchID = M_BranchID
and M_BranchCode = ?
and M_BranchIsActive = 'Y'
join mcu_preregister_patients on Mcu_PreregisterPatientsT_OrderHeaderID = T_OrderHeaderID
and Mcu_PreregisterPatientsIsActive = 'Y'
join corporate on T_OrderHeaderCorporateID = CorporateID
and CorporateIsActive = 'Y'
and T_OrderHeaderID $w_flag (
select order_DownloadT_OrderHeaderID
from
order_download
where order_DownloadT_OrderHeaderDate >= ?
and order_DownloadT_OrderHeaderDate <= ?
)
join m_patient on T_OrderHeaderM_PatientID = M_PatientID
left join m_title on M_PatientM_TitleID = M_TitleID
order by T_OrderHeaderLabNumber
";
$qry = $this->db->query($sql, [$s_date, $e_date, $branchCode, $s_date, $e_date]);
}
if (!$qry) {
echo json_encode([
"Status" => [
"OK" => false, "Code" => 0, "Messages" => "Get Order issue [Order003]",
],
"OrderList" => [],
]);
exit;
}
$rows = $qry->result_array();
foreach ($rows as $idx => $r) {
$rows[$idx]["ReceivedFlag"] = (bool) $receivedFlag;
}
echo json_encode([
"Status" => ["OK" => true, "Code" => -1, "Messages" => "SUCCESS"],
"OrderList" => $rows
]);
}
function order()
{
$branch_code = $this->auth_token();
$param = $this->param();
$order_per_page = 10;
$sdate = date("Y-m-d 00:00:00");
$edate = date("Y-m-d 23:59:59");
if (array_key_exists("date", $param)) {
$date = $param["date"];
if (!strtotime($date)) {
echo json_encode(["status" => "ERR", "message" => "Date param is not valid [Order001]"]);
exit;
}
$sdate = "$date 00:00:00";
$edate = "$date 23:59:59";
}
$page = 1;
if (array_key_exists("page", $param)) {
$page = $param["page"];
if ($page == "") $page = 1;
}
$start_offset = ($page - 1) * $order_per_page;
$sql = "select count(*) as total
from t_orderheader
where T_OrderHeaderDate >= ?
and T_OrderHeaderDate <=?
and T_OrderHeaderIsActive = 'Y'
and T_OrderHeaderID not in (
select order_DownloadT_OrderHeaderID
from order_download where order_DownloadIsActive = 'Y'
)
";
$qry = $this->db->query($sql, [$sdate, $edate]);
if (!$qry) {
echo json_encode(["status" => "ERR", "message" => "Get Order error [Order002]"]);
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
echo json_encode([
"status" => "OK", "pages" => 0, "orders" => 0,
"records" => []
]);
exit;
}
$orders = $rows[0]["total"];
$pages = ceil($orders / $order_per_page);
$sql = "select T_OrderHeaderID
from t_orderheader
where T_OrderHeaderDate >= ?
and T_OrderHeaderDate <= ?
and T_OrderHeaderIsActive = 'Y'
and T_OrderHeaderID not in (
select order_DownloadT_OrderHeaderID
from order_download where order_DownloadIsActive = 'Y'
)
limit ?,?";
$qry = $this->db->query($sql, [
$sdate, $edate,
$start_offset, $order_per_page
]);
if (!$qry) {
echo json_encode(["status" => "ERR", "message" => "Get Order error [Order003]"]);
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
echo json_encode([
"status" => "OK", "pages" => 0, "orders" => 0,
"data" => []
]);
exit;
}
$s_ids = "0";
foreach ($rows as $r) {
$s_ids .= "," . $r["T_OrderHeaderID"];
}
$sql = "select
T_OrderHeaderid id,
T_OrderHeaderDate date,
T_OrderHeaderLabNumber nolab,
M_PatientNoreg noreg,
concat(
ifnull(M_TitleName,''),
if(M_TitleName is not null, ' ',''),
if (M_PatientPrefix is not null, M_PatientPrefix, '') ,
if (M_PatientPrefix is not null, ' ', '') ,
M_PatientName,
if (M_PatientSuffix is not null, M_PatientSuffix, '') ,
if (M_PatientSuffix is not null, ' ', '')
) patient,
M_PatientDOB dob,
M_PatientGender gender,
M_PatientCitizenship citizenship,
M_PatientIdentifierCode identifier_code,
M_PatientIdentifierValue identifier_value,
Nat_TestMapCode,
T_TestName
from t_orderheader
join t_orderdetail on
T_OrderHeaderID in ( $s_ids )
and T_OrderHeaderID = T_OrderDetailT_OrderHeaderID
and T_OrderDetailIsActive = 'Y'
join m_patient on T_OrderHeaderM_PatientID = M_PatientID
join t_test
on T_OrderDetailT_TestID = T_TestID
and T_TestIsResult = 'Y'
left join m_title on M_PatientM_TitleID = M_TitleID
left join nat_testmap
on T_TestNat_TestID = Nat_TestMapNat_TestID
and Nat_TestMapIsActive = 'Y'
order by T_OrderHeaderLabNumber, Nat_TestMapCode
";
$qry = $this->db->query($sql);
if (!$qry) {
echo json_encode(["status" => "ERR", "message" => "Get Order error [Order004]"]);
exit;
}
$rows = $qry->result_array();
$response = [
"status" => "OK",
"pages" => $pages,
"orders" => $orders,
"records" => []
];
$prev_no = "";
$records_idx = 0;
foreach ($rows as $r) {
if ($prev_no != $r["nolab"]) {
$response["records"][] = [
"id" => $r["id"],
"nolab" => $r["nolab"],
"date" => $r["date"],
"noreg" => $r["noreg"],
"patient" => $r["patient"],
"citizenship" => $r["citizenship"],
"dob" => $r["dob"],
"gender" => $r["gender"],
"identifier_code" => $r["identifier_code"],
"identifier_value" => $r["identifier_value"],
"order" => []
];
$records_idx = count($response["records"]) - 1;
}
$response["records"][$records_idx]["order"][] = [
"test_code" => $r["Nat_TestMapCode"],
"test_name" => $r["T_TestName"]
];
$prev_no = $r["nolab"];
}
$this->log($branch_code, "/one-api/order", json_encode($param), json_encode($response));
echo json_encode($response);
}
function log(
$branch_code,
$end_point,
$param,
$response,
$type = "Order",
$is_rollback = false
) {
$sql = "insert into cpone_log.log_api(log_ApiM_BranchCode,
log_ApiEndPoint, log_ApiParam, log_ApiResponse, log_ApiType) values(?,?,?,?,?)";
$qry = $this->db->query($sql, [$branch_code, $end_point, $param, $response, $type]);
if (!$qry) {
// print_r($this->db->error());
// echo $this->db->last_query();
echo json_encode(["status" => "ERR", "message" => "System Log error [Log001]"]);
if ($is_rollback) $this->db->trans_rollback();
exit;
}
return $this->db->insert_id();
}
function access_token()
{
//auth token
//get branchID from token
$param = $this->param();
$client = $param["client"];
$secret = $param["secret"];
$sql = "select api_KeyM_BranchCode
from api_key
where api_KeyM_BranchCode= ?
and api_KeySecretKey = ?
and api_KeyIsActive='Y'";
$qry = $this->db->query($sql, [$client, $secret]);
if (!$qry) {
echo json_encode(["status" => "ERR", "message" => "Auth Err, no client or secret key [Auth0001]"]);
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
echo json_encode(["status" => "ERR", "message" => "Auth Err, invalid client or secret key [Auth0002]"]);
exit;
}
$expired = date("Y-m-d H:i:s", strtotime("now + {$this->intervalHour} hour"));
$auth_param = ["branchCode" => $rows[0]["api_KeyM_BranchCode"], "expired" => $expired];
$token = JWT::encode($auth_param, $this->SECRET_KEY);
echo json_encode(["status" => "OK", "token" => $token, "expired" => $expired]);
}
function refresh_token()
{
$branchCode = $this->auth_token();
$sql = "select api_KeyM_BranchCode
from api_key
where api_KeyM_BranchCode= ?
and api_KeyIsActive='Y'";
$qry = $this->db->query($sql, [$branchCode]);
if (!$qry) {
echo $this->db->error()["message"];
echo json_encode(["status" => "ERR", "message" => "Auth Err, access Token invalid [Auth003]"]);
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
echo json_encode(["status" => "ERR", "message" => "Auth Err, access Token invalid [Auth0004]"]);
exit;
}
$expired = date("Y-m-d H:i:s", strtotime("now + {$this->intervalHour} hour"));
$auth_param = ["branchCode" => $rows[0]["api_KeyM_BranchCode"], "expired" => $expired];
$token = JWT::encode($auth_param, $this->SECRET_KEY);
echo json_encode(["status" => "OK", "token" => $token, "expired" => $expired]);
}
function result()
{
$branchCode = $this->auth_token();
$param = $this->param();
if (json_last_error() != JSON_ERROR_NONE) {
$log_ApiID = $this->log($branchCode, "/one-api/result", $this->tmp_body, "", "Result");
$sql = "update cpone_log set log_ApiIsParsed = 'E', log_ApiParam =? where log_ApiID=?";
$qry = $this->db->query($sql, [$this->tmp_body, $log_ApiID]);
if (!$qry) {
echo $this->db->error()["message"];
echo json_encode(["status" => "ERR", "message" => "Invalid Json Param [Result001]"]);
exit;
}
echo json_encode(["status" => "ERR", "message" => "Invalid Json Param [Result002]"]);
exit;
}
// insert to log_api
$log_ApiID = $this->log($branchCode, "/one-api/result", $this->tmp_body, "", "Result");
//parsed param
// partial commit
$this->db->trans_begin();
$sql_i = "insert into api_result(api_ResultDate,api_ResultNolab,
api_ResultNoreg, api_ResultPatient, api_ResultTestCode, api_ResultTestName,
api_ResultResult, api_ResultFlag, api_ResultUnit, api_ResultIsQuantitative,
api_ResultAbnormalText, api_ResultNormalText, api_ResultNormalMethode,
api_ResultNormalMinValue, api_ResultNormalMinInclusive,
api_ResultNormalMaxValue, api_ResultNormalMaxInclusive,
api_ResultM_BranchCode, api_ResultLog_ApiID )
values ( ?,?, ?,?,?,?, ?,?,?,?, ?,?,?, ?,?, ?,?, ?,?)";
$date = $param["date"];
$noreg = $param["noreg"];
$nolab = $param["nolab"];
$patient = $param["patient"];
foreach ($param["result"] as $r) {
$abnormal = $r["abnormal"];
$flag = $r["flag"];
$is_quantitative = $r["is_quantitative"];
$result = $r["result"];
$test_code = $r["test_code"];
$test_name = $r["test_name"];
$unit = $r["unit"];
$description = $r["ref_range"]["description"];
$methode = $r["ref_range"]["methode"];
$min_comparator = $r["ref_range"]["min"]["comparator"];
$min_value = $r["ref_range"]["min"]["value"];
$max_value = $r["ref_range"]["max"]["value"];
$max_comparator = $r["ref_range"]["max"]["comparator"];
$min_value_inclusive = "N";
if ($min_comparator == ">=") $min_value_inclusive = "Y";
$max_value_inclusive = "N";
if ($max_comparator == ">=") $max_value_inclusive = "Y";
$qry = $this->db->query($sql_i, [
$date, $nolab,
$noreg, $patient, $test_code, $test_name,
$result, $flag, $unit, $is_quantitative,
$abnormal, $description, $methode,
$min_value, $min_value_inclusive,
$max_value, $max_value_inclusive,
$branchCode, $log_ApiID
]);
if (!$qry) {
// print_r($this->db->error());
// echo $this->db->last_query();
echo json_encode(["status" => "ERR", "message" => "Error Api_Result $test_code [Result003]"]);
$this->db->trans_rollback();
exit;
}
}
$this->db->trans_commit();
$this->parse($log_ApiID);
echo json_encode(["status" => "OK", "message" => "$nolab received"]);
}
function get_header_id($nolab,$debug="")
{
$sql = "select * from t_orderheader
where T_OrderHeaderLabNumber = ?
and T_OrderHeaderIsActive = 'Y'";
$qry = $this->db->query($sql, [$nolab]);
if (!$qry) {
// print_r($this->db->error());
// echo $this->db->last_query();
// echo json_encode(["status" => "ERR", "message" => "Error Api_Result Header [Result004]"]);
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Invalid JSON Param [Result001]"],
"OrderList" => [],
]);
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return 0;
}
if ($debug != "") {
echo "Header ID : " . $rows[0]["T_OrderHeaderID"];
}
return $rows[0]["T_OrderHeaderID"];
}
function get_detail_id($header_id, $test_code,$debug="")
{
$sql = "select
T_OrderDetailID
from t_orderdetail
join t_test on T_OrderDetailT_OrderHeaderID = ?
and T_OrderDetailT_TestID = T_TestID
and T_OrderDetailIsActive = 'Y'
join nat_testmap on T_TestNat_TestID = Nat_TestMapNat_TestID
and Nat_TestMapIsActive = 'Y'
and Nat_TestMapCode = ?";
$qry = $this->db->query($sql, [$header_id, $test_code]);
if (!$qry) {
// echo $this->db->last_query();
// print_r($this->db->error());
// echo json_encode(["status" => "ERR", "message" => "Error Api_Result Detail O2 [Result007]"]);
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Invalid JSON Param [Result001]"],
"OrderList" => [],
]);
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return 0;
}
if ($debug !="") {
echo "Detail ID : " . $rows[0]["T_OrderDetailID"];
}
return $rows[0]["T_OrderDetailID"];
}
function send_order($params)
{
// URL endpoint yang ingin dikirimkan POST request
$url = 'http://10.9.10.207:23381/PushOrder';
// Inisialisasi CURL
$ch = curl_init($url);
// Mengatur CURL untuk mengirim POST request dengan JSON
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
// Eksekusi CURL dan mendapatkan respons dari server
$response = curl_exec($ch);
// Cek apakah ada error saat eksekusi CURL
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
// Tutup CURL
curl_close($ch);
// Tampilkan respons dari server
$rst = json_decode($response);
//print_r($rst);
//echo $rst->message;
//exit;
$rst_save = stripslashes(json_encode($rst));
$res = json_encode($response);
$save_param = $params;
$nolab_lis = $rst->orderNumber?$rst->orderNumber:"Kosong";
$sql = "INSERT INTO api_push (
Api_PushT_OrderHeaderLabNumber,
Api_PushParams,
Api_PushResponse,
Api_PushRetry,
Api_PushLISLabNumber,
Api_PushStatus,
Api_PushCreated
)
VALUES(?,?,?,?,?,?,NOW())
ON DUPLICATE KEY
UPDATE Api_PushParams = ?, Api_PushResponse = ?, Api_PushRetry = Api_PushRetry + 1, Api_PushStatus = ?";
$qry = $this->db->query($sql, [$params['OrderNumber'], stripslashes(json_encode($save_param)), $rst_save, 1, $nolab_lis, $rst->message,stripslashes(json_encode($save_param)), $rst_save, $rst->message]);
//echo $this->db->last_query();
//exit;
return true;
}
function parse($logApiID)
{
$sql = "select *
from api_result where api_ResultLog_ApiID = ?
and api_ResultIsParsed = 'N'";
$qry = $this->db->query($sql, [$logApiID]);
if (!$qry) {
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse001]"],
"OrderList" => [],
]);
exit;
}
$rows = $qry->result_array();
$arr_header_id = [];
$sql_u = "update api_result set api_ResultIsParsed = ?,
api_ResultT_OrderDetailID = ? where api_ResultID = ?";
$sql_r = "update t_orderdetail set
T_OrderDetailResult = ?, T_OrderDetailNat_UnitName = ?,
T_OrderDetailResultFlag = ?, T_OrderDetailNormalValueNote = ?, T_OrderDetailNormalValueDescription= ?, T_OrderdetailNat_MethodeName = ?,
T_OrderDetailMinValue = ?, T_OrderDetailMinValueInclusive = ?,
T_OrderDetailMaxValue = ?, T_OrderDetailMaxValueInclusive = ?, T_OrderDetailNote = ?
where T_OrderDetailID = ?
";
foreach ($rows as $r) {
$nolab = $r["api_ResultNolab"];
$id = $r["api_ResultID"];
if (array_key_exists($nolab, $arr_header_id)) {
$header_id = $arr_header_id[$nolab];
} else {
$header_id = $this->get_header_id($nolab);
if ($header_id != 0) {
$arr_header_id[$nolab] = $header_id;
}
}
if ($header_id == 0) {
$qry = $this->db->query($sql_u, ["O1", 0, $id]);
if (!$qry) {
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse002]"],
"OrderList" => [],
]);
exit;
}
continue;
}
$detail_id = $this->get_detail_id($header_id, $r["api_ResultTestCode"]);
if ($detail_id == 0) {
$qry = $this->db->query($sql_u, ["O2", 0, $id]);
if (!$qry) {
// echo $this->db->last_query();
// print_r($this->db->error());
// echo json_encode(["status" => "ERR", "message" => "Error Api_Result Parse O2 [Result007]"]);
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse003]"],
"OrderList" => [],
]);
exit;
}
continue;
}
$qry = $this->db->query($sql_u, ["H", $detail_id, $id]);
if (!$qry) {
// echo $this->db->last_query();
// print_r($this->db->error());
// echo json_encode(["status" => "ERR", "message" => "Error Api_Result Parse H [Result008]"]);
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse004]"],
"OrderList" => [],
]);
exit;
}
//update result, flag, unit, methode , normal_value,
$qry = $this->db->query($sql_r, [
$r["api_ResultResult"], $r["api_ResultUnit"],
$r["api_ResultFlag"], $r["api_ResultNormalText"], $r["api_ResultNormalNote"], $r["api_ResultNormalMethode"],
$r["api_ResultNormalMinValue"], $r["api_ResultNormalMinInclusive"],
$r["api_ResultNormalMaxValue"], $r["api_ResultNormalMaxInclusive"], $r["api_ResultNote"],
$detail_id
]);
if (!$qry) {
// echo $this->db->last_query();
// print_r($this->db->error());
// echo json_encode(["status" => "ERR", "message" => "Error Api_Result Parse H [Result009]"]);
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse005]"],
"OrderList" => [],
]);
exit;
}
}
}
function fix_api_result($nolab)
{
$sql = "select *
from api_result where api_ResultNolab= ?
";
$qry = $this->db->query($sql, [$nolab]);
if (!$qry) {
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse001]"],
"OrderList" => [],
]);
exit;
}
$rows = $qry->result_array();
$arr_header_id = [];
$sql_u = "update api_result set api_ResultIsParsed = ?,
api_ResultT_OrderDetailID = ? where api_ResultID = ?";
$sql_r = "update t_orderdetail set
T_OrderDetailResult = ?, T_OrderDetailNat_UnitName = ?,
T_OrderDetailResultFlag = ?, T_OrderDetailNormalValueNote = ?, T_OrderDetailNormalValueDescription = ?, T_OrderdetailNat_MethodeName = ?,
T_OrderDetailMinValue = ?, T_OrderDetailMinValueInclusive = ?,
T_OrderDetailMaxValue = ?, T_OrderDetailMaxValueInclusive = ?
where T_OrderDetailID = ? and (
trim(T_OrderDetailResult) = ''
or
T_OrderDetailResult is null
or
true
)
";
foreach ($rows as $r) {
$nolab = $r["api_ResultNolab"];
$id = $r["api_ResultID"];
if (array_key_exists($nolab, $arr_header_id)) {
$header_id = $arr_header_id[$nolab];
} else {
$header_id = $this->get_header_id($nolab);
if ($header_id != 0) {
$arr_header_id[$nolab] = $header_id;
}
}
if ($header_id == 0) {
$qry = $this->db->query($sql_u, ["O1", 0, $id]);
if (!$qry) {
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse002]"],
"OrderList" => [],
]);
exit;
}
continue;
}
$detail_id = $this->get_detail_id($header_id, $r["api_ResultTestCode"]);
if ($detail_id == 0) {
$qry = $this->db->query($sql_u, ["O2", 0, $id]);
if (!$qry) {
// echo $this->db->last_query();
// print_r($this->db->error());
// echo json_encode(["status" => "ERR", "message" => "Error Api_Result Parse O2 [Result007]"]);
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse003]"],
"OrderList" => [],
]);
exit;
}
continue;
}
$qry = $this->db->query($sql_u, ["H", $detail_id, $id]);
if (!$qry) {
// echo $this->db->last_query();
// print_r($this->db->error());
// echo json_encode(["status" => "ERR", "message" => "Error Api_Result Parse H [Result008]"]);
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse004]"],
"OrderList" => [],
]);
exit;
}
//update result, flag, unit, methode , normal_value,
$qry = $this->db->query($sql_r, [
$r["api_ResultResult"], $r["api_ResultUnit"],
$r["api_ResultFlag"], $r["api_ResultNormalText"], $r["api_ResultNormalNote"], $r["api_ResultNormalMethode"],
$r["api_ResultNormalMinValue"], $r["api_ResultNormalMinInclusive"],
$r["api_ResultNormalMaxValue"], $r["api_ResultNormalMaxInclusive"],
$detail_id
]);
if (!$qry) {
// echo $this->db->last_query();
// print_r($this->db->error());
// echo json_encode(["status" => "ERR", "message" => "Error Api_Result Parse H [Result009]"]);
echo json_encode([
"Status" => ["OK" => false, "Code" => 0, "Messages" => "Error LabResult [Parse005]"],
"OrderList" => [],
]);
exit;
}
}
}
function sample_abnormal($id)
{
$sql = "select
Mcu_ResumeDetailsT_TestID test_id,
Mcu_ResumeDetailsResult result
from mcu_resume
join mcu_resumedetails on Mcu_ResumeT_OrderHeaderID = ?
and Mcu_ResumeIsActive = 'Y'
and Mcu_ResumeID = Mcu_ResumeDetailsMcu_ResumeID
and Mcu_ResumeDetailsIsActive = 'Y'
";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
print_r($this->db->error());
echo "\n " . $this->db->last_query();
return [];
}
$rows = $qry->result_array();
$result = [];
foreach ($rows as $r) {
$id = $r["test_id"];
$result[$id] = $r["result"];
}
return $result;
}
function sample_order($id)
{
$sql = "select
M_PatientNoreg noreg,
M_PatientName patient,
T_OrderHeaderLabNumber nolab,
T_OrderHeaderDate date,
T_OrderDetailT_TestID test_id,
T_OrderDetailT_TestCode test_code,
T_OrderDetailT_TestName test_name,
T_OrderDetailResult result,
T_OrderDetailResultFlag flag,
ifnull(T_OrderDetailNat_UnitName,'') unit,
T_OrderDetailVerDate verif_date,
T_OrderDetailValDate valid_date,
T_OrderDetailNormalValueNote normal_value,
T_OrderDetailNormalValueDescription normal_value_desc,
T_OrderDetailMinValueInclusive min_inclusive,
T_OrderDetailMinValue min_value,
T_OrderDetailMaxValueInclusive max_inclusive,
T_OrderDetailMaxValue max_value,
T_OrderdetailNat_MethodeName methode_name,
T_TestIsQuantitative is_quantitative
from
t_orderheader
join m_patient on T_OrderHeaderM_PatientID = M_PatientID
and T_OrderHeaderIsActive = 'Y'
and T_OrderHeaderID = ?
join t_orderdetail on T_OrderHeaderID = T_OrderDetailT_OrderHeaderID
and T_OrderDetailT_TestIsResult = 'Y'
and T_OrderDetailIsActive ='Y'
join t_test
on T_OrderDetailT_TestID = T_TestID";
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
echo $this->db->last_query();
print_r($this->db->error());
}
$rows = $qry->result_array();
$header = [];
$details = [];
$lookup_abnormal = $this->sample_abnormal($id);
foreach ($rows as $r) {
if ($header == []) {
$header = [
"noreg" => $r["noreg"],
"patient" => $r["patient"],
"nolab" => $r["nolab"],
"date" => $r["date"]
];
}
$min_comparator = ">";
if ($r["min_inclusive"] == "Y") {
$min_comparator = ">=";
}
$max_comparator = "<";
if ($r["max_inclusive"] == "Y") {
$max_comparator = "<=";
}
$ref_range = [
"methode" => $r["methode_name"],
"description" => $r["normal_value"],
"min" => [
"comparator" => $min_comparator,
"value" => $r["min_value"]
],
"max" => [
"comparator" => $max_comparator,
"value" => $r["max_value"]
]
];
if ($r["is_quantitative"] == "N") {
$ref_range = [
"methode" => $r["methode_name"],
"description" => $r["normal_value"],
];
}
$details[] = [
"test_code" => "W" . $r["test_code"],
"test_name" => $r["test_name"],
"result" => $r["result"],
"flag" => $r["flag"],
"unit" => $r["unit"],
"is_quantitative" => $r["is_quantitative"],
"ref_range" => $ref_range,
"abnormal" => array_key_exists($r["test_id"], $lookup_abnormal) ? $lookup_abnormal[$r["test_id"]] : ""
];
}
$result = $header;
$result["result"] = $details;
echo json_encode($result);
}
}