Files
2026-04-27 10:26:26 +07:00

435 lines
16 KiB
PHP

<?php
class Amr_limit extends MY_Controller
{
function __construct()
{
parent::__construct();
}
function corss()
{
global $_SERVER;
if (isset($_SERVER["HTTP_ORIGIN"])) {
header("Access-Control-Allow-Origin: " . $_SERVER["HTTP_ORIGIN"]);
} else {
header("Access-Control-Allow-Origin: */*");
}
header("Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS");
header(
"Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization"
);
if (
isset($_SERVER["REQUEST_METHOD"]) &&
$_SERVER["REQUEST_METHOD"] == "OPTIONS"
) {
http_response_code(200);
echo json_encode("OK");
exit();
}
}
function update()
{
$this->corss();
$userID = $this->sys_user["M_UserID"];
if (!($userID > 0)) {
echo json_encode([
"status" => "ERR",
"message" => "Invalid Token, please re-login",
]);
exit();
}
$cvID = $this->sys_input["criticalValueID"];
$reportedTo = $this->sys_input["reportedTo"];
$adviseNote = $this->sys_input["adviseNote"];
$sql = "select * from critical_value where criticalValueID=?";
$qry = $this->db->query($sql, [$cvID]);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" => $this->db->error()["message"],
]);
exit();
}
$rows = $qry->result_array();
if (count($rows) > 0 && $rows[0]["CriticalValueReportedTo"] != "") {
// update advise
$sql = "update critical_value set CriticalValueAdvisedNote =? , CriticalValueAdvicedM_UserID= ?,
CriticalValueIsAdvised = 'Y',
CriticalValueAdvisedDate = now() where CriticalValueID = ?";
$qry = $this->db->query($sql, [$adviseNote, $userID, $cvID]);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" => $this->db->error()["message"],
]);
exit();
}
} else {
if ($reportedTo != "") {
$sql = "update critical_value set CriticalValueReportedTo=? , CriticalValueReportedM_UserID= ?,
CriticalValueIsReported = 'Y',
CriticalValueReportedDate= now() where CriticalValueID = ?";
$qry = $this->db->query($sql, [$reportedTo, $userID, $cvID]);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" => $this->db->error()["message"],
]);
exit();
}
}
}
echo json_encode(["status" => "OK", "message" => "data updated"]);
}
function auto_get()
{
$sql = "select T_OrderHeaderID, T_OrderHeaderDate, T_OrderHeaderLabNumber,
fn_get_patient_atribute(T_OrderHeaderM_PatientID) patient,
T_TestName,critical_value.*
from critical_value
join t_orderdetail on
CriticalValueIsActive='Y'
and (
CriticalValueIsReported = 'N'
or
CriticalValueIsAdvised = 'N'
)
and CriticalValueT_OrderDetailID = T_OrderDetailID
and CriticalValueCreated + interval 10 day > now()
join t_test on T_OrderDetailT_TestID = T_TestID
join t_orderheader on CriticalValueT_OrderHeaderID = T_OrderHeaderID
order by T_OrderDetailT_TestSasCode,CriticalValueCreated desc
limit 0,10";
$qry = $this->db->query($sql);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" =>
$this->db->error()["message"] .
"|\n" .
$this->db->last_query(),
]);
exit();
}
$rows = $qry->result_array();
$result = [];
foreach ($rows as $r) {
$id = $r["T_OrderHeaderID"];
$j_pat = json_decode($r["patient"], true);
$pat_name = $j_pat["patient_fullname"];
if (
$r["CriticalValueIsAdvised"] == "Y" &&
$r["CriticalValueIsReported"] == "Y"
) {
continue;
}
if (!isset($result[$id])) {
$result[$id] = [
"labNo" => $r["T_OrderHeaderLabNumber"],
"date" => $r["T_OrderHeaderDate"],
"patient" => $pat_name,
"test" => [],
];
}
$result[$id]["test"][] = [
"px" => $r["T_TestName"],
"note" => $r["CriticalValueDescription"],
"IsReported" => $r["CriticalValueIsReported"],
"IsAdvised" => $r["CriticalValueIsAdvised"],
];
}
$xresult = [];
foreach ($result as $v) {
$xresult[] = $v;
}
echo json_encode(["status" => "OK", "data" => $xresult]);
}
function auto_update()
{
$s_headerID = "";
$s_detailID = "";
foreach ($this->sys_input["cv"] as $r) {
if ($s_headerID != "") {
$s_headerID .= ",";
}
$s_headerID .= $r["headerID"];
foreach ($r["details"] as $d) {
if ($s_detailID != "") {
$s_detailID .= ",";
}
$s_detailID .= $d;
}
}
if ($s_headerID == "" || $s_detailID == "") {
echo json_encode(["status" => "OK", "haveUpdate" => "N"]);
exit();
}
$sql = "select
T_OrderDetailID, T_TestName, min(NatMultiruleExtraLow) ExtraLow, max(NatMultiruleExtraHigh) ExtraHigh,
T_OrderDetailResult, T_OrderDetailT_OrderHeaderID
from t_orderdetail
join t_test on T_OrderDetailID in ( $s_detailID )
and T_OrderDetailIsActive = 'Y'
and T_OrderDetailT_TestID = T_TestID
and T_TestIsResult = 'Y'
and T_TestIsQuantitative='Y'
and T_OrderDetailResult <> ''
and T_OrderDetailID not in (
select CriticalValueT_OrderDetailID
from critical_value
where CriticalValueT_OrderHeaderID in ( $s_headerID )
)
join nat_multirule on T_TestNat_TestID = NatMultiruleNat_TestID
group by T_OrderDetailID";
$this->corss();
$qry = $this->db->query($sql);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" =>
$this->db->error()["message"] .
"|\n" .
$this->db->last_query(),
]);
exit();
}
$rows = $qry->result_array();
foreach ($rows as $idx => $r) {
$status = "X";
if ($r["T_OrderDetailResult"] == "") {
$rows[$idx]["status"] = "X";
$rows[$idx]["note"] = "Result Empty";
continue;
}
if (!is_numeric($r["T_OrderDetailResult"])) {
$rows[$idx]["status"] = "X";
$rows[$idx]["note"] = "Result Not Numeric";
continue;
}
if (
is_numeric($r["ExtraLow"]) &&
floatval($r["ExtraLow"]) > floatval($r["T_OrderDetailResult"])
) {
$rows[$idx]["status"] = "N";
$rows[$idx][
"note"
] = "Result {$r["T_OrderDetailResult"]} < Extra Low {$r["ExtraLow"]}";
continue;
}
if (
is_numeric($r["ExtraHigh"]) &&
floatval($r["ExtraHigh"]) < floatval($r["T_OrderDetailResult"])
) {
$rows[$idx]["status"] = "N";
$rows[$idx][
"note"
] = "Result {$r["T_OrderDetailResult"]} > Extra High {$r["ExtraHigh"]}";
continue;
}
$rows[$idx]["status"] = "Y";
$status = "";
if (is_numeric($r["ExtraLow"]) && is_numeric($r["ExtraHigh"])) {
$rows[$idx][
"note"
] = "Result dalama range ExtraLow {$r["ExtraLow"]} - Extra High {$r["ExtraHigh"]}";
continue;
}
if (!is_numeric($r["ExtraLow"])) {
$status .= $r["ExtraLow"] . " ExtraLow not numeric ";
}
if (!is_numeric($r["ExtraHigh"])) {
$status .= $r["ExtraHigh"] . " ExtraHigh not numeric ";
}
$rows[$idx]["note"] = $status;
}
$result = array_filter($rows, function ($r) {
return $r["status"] == "N";
});
$sql = "insert into critical_value(CriticalValueT_OrderHeaderID,CriticalValueT_OrderDetailID,CriticalValueDescription)
values(?,?,?)
on duplicate key update
CriticalValueID = CriticalValueID
";
$this->db->trans_begin();
$updateID = [];
foreach ($result as $r) {
$qry = $this->db->query($sql, [
$r["T_OrderDetailT_OrderHeaderID"],
$r["T_OrderDetailID"],
$r["note"],
]);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" =>
$this->db->error()["message"] .
"|\n" .
$this->db->last_query(),
]);
$this->db->trans_rollback();
exit();
}
$updateID[] = $this->db->insert_id();
}
$this->db->trans_commit();
echo json_encode(["status" => "OK", "haveUpdate" => "Y"]);
}
function get($orderHeaderID)
{
$sql = "select
T_OrderDetailID, T_TestName, min(NatMultiruleExtraLow) ExtraLow, max(NatMultiruleExtraHigh) ExtraHigh,
T_OrderDetailResult
from t_orderdetail
join t_test on T_OrderDetailT_OrderHeaderID = ?
and T_OrderDetailIsActive = 'Y'
and T_OrderDetailT_TestID = T_TestID
and T_TestIsResult = 'Y'
and T_TestIsQuantitative='Y'
and T_OrderDetailResult <> ''
and T_OrderDetailID not in (
select CriticalValueT_OrderDetailID
from critical_value
where CriticalValueT_OrderHeaderID = ?
)
join nat_multirule on T_TestNat_TestID = NatMultiruleNat_TestID
group by T_OrderDetailID";
$this->corss();
$qry = $this->db->query($sql, [$orderHeaderID, $orderHeaderID]);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" =>
$this->db->error()["message"] .
"|\n" .
$this->db->last_query(),
]);
exit();
}
$rows = $qry->result_array();
foreach ($rows as $idx => $r) {
$status = "X";
if ($r["T_OrderDetailResult"] == "") {
$rows[$idx]["status"] = "X";
$rows[$idx]["note"] = "Result Empty";
continue;
}
if (!is_numeric($r["T_OrderDetailResult"])) {
$rows[$idx]["status"] = "X";
$rows[$idx]["note"] = "Result Not Numeric";
continue;
}
if (
is_numeric($r["ExtraLow"]) &&
floatval($r["ExtraLow"]) > floatval($r["T_OrderDetailResult"])
) {
$rows[$idx]["status"] = "N";
$rows[$idx][
"note"
] = "Result {$r["T_OrderDetailResult"]} < Extra Low {$r["ExtraLow"]}";
continue;
}
if (
is_numeric($r["ExtraHigh"]) &&
floatval($r["ExtraHigh"]) < floatval($r["T_OrderDetailResult"])
) {
$rows[$idx]["status"] = "N";
$rows[$idx][
"note"
] = "Result {$r["T_OrderDetailResult"]} > Extra High {$r["ExtraHigh"]}";
continue;
}
$rows[$idx]["status"] = "Y";
$status = "";
if (is_numeric($r["ExtraLow"]) && is_numeric($r["ExtraHigh"])) {
$rows[$idx][
"note"
] = "Result dalama range ExtraLow {$r["ExtraLow"]} - Extra High {$r["ExtraHigh"]}";
continue;
}
if (!is_numeric($r["ExtraLow"])) {
$status .= $r["ExtraLow"] . " ExtraLow not numeric ";
}
if (!is_numeric($r["ExtraHigh"])) {
$status .= $r["ExtraHigh"] . " ExtraHigh not numeric ";
}
$rows[$idx]["note"] = $status;
}
$result = array_filter($rows, function ($r) {
return $r["status"] == "N";
});
$sql = "insert into critical_value(CriticalValueT_OrderHeaderID,CriticalValueT_OrderDetailID,CriticalValueDescription)
values(?,?,?)
on duplicate key update
CriticalValueID = CriticalValueID
";
$this->db->trans_begin();
foreach ($result as $r) {
$qry = $this->db->query($sql, [
$orderHeaderID,
$r["T_OrderDetailID"],
$r["note"],
]);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" =>
$this->db->error()["message"] .
"|\n" .
$this->db->last_query(),
]);
$this->db->trans_rollback();
exit();
}
}
$this->db->trans_commit();
$sql = "select T_TestName,critical_value.*,
M_UserUserName ReportUserName
from critical_value
join t_orderdetail on
CriticalValueT_OrderHeaderID =? and CriticalValueIsActive='Y'
and CriticalValueT_OrderDetailID = T_OrderDetailID
join t_test on T_OrderDetailT_TestID = T_TestID
left join m_user on CriticalValueReportedM_UserID = M_UserID";
$qry = $this->db->query($sql, [$orderHeaderID]);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" =>
$this->db->error()["message"] .
"|\n" .
$this->db->last_query(),
]);
exit();
}
$rows = $qry->result_array();
echo json_encode(["status" => "OK", "data" => $rows]);
}
}
/*
drop table if exists critical_value;
create table critical_value(
CriticalValueID int not null auto_increment primary key,
CriticalValueT_OrderHeaderID int,
CriticalValueT_OrderDetailID int,
CriticalValueDescription text,
CriticalValueCreated datetime default current_timestamp(),
CriticalValueIsReported varchar(1) default 'N',
CriticalValueReportedM_UserID int,
CriticalValueReportedDate datetime,
CriticalValueReportedTo varchar(50),
CriticalValueIsAdvised varchar(1) default 'N',
CriticalValueAdvisedDate datetime,
CriticalValueAdvisedBy varchar(50),
CriticalValueAdvisedNote varchar(100),
CriticalValueAdvicedM_UserID int,
CriticalValueIsActive varchar(1) default 'Y',
key (CriticalValueIsActive),
key (CriticalValueT_OrderHeaderID),
key (CriticalValueT_OrderDetailID),
key (CriticalValueAdvicedM_UserID),
key (CriticalValueReportedM_UserID),
unique(CriticalValueT_OrderDetailID,CriticalValueIsActive)
);
*/
?>