db->query($sql, [$nolab]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] . "\n|" . $this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
foreach ($rows as $idx => $r) {
$rows[$idx]["Process"] =
" Debug ";
}
$this->print_table_style();
$this->print_table($rows, array_keys($rows[0]));
}
function list($date = "", $format = "html")
{
if ($date == "") {
$date = date("Y-m-d");
}
$start = $date . " 00:00:01";
$end = $date . " 23:59:59";
$sql = "select
T_OrderHeaderDate, T_OrderHeaderLabNumber,
AutoValidDate,
AutoValidHaveReq HaveRequirement,
AutoValidIsOk,
T_OrderDetailT_TestName T_TestName,
-- Nat_MethodeName,
Nat_ConditionName,
replace(AutoValidNote,'\n','
') Note
,replace(AutoVerifTrendAnalysisNote,'\n','
') VerifNote
,T_OrderDetailID
from auto_valid
join auto_verif on AutoValidT_OrderDetailID = AutoVerifT_OrderDetailID
join t_orderdetail on AutoValidT_OrderDetailID = T_OrderDetailID
and T_OrderDetailIsActive = 'Y'
join t_orderheader on T_OrderDetailT_OrderHeaderID = T_OrderHeaderID
join t_test on T_OrderDetailT_TestID = T_TestID
and T_TestNat_GroupID = 1
left join nat_methode on AutoValidNat_MethodeID = Nat_MethodeID
left join nat_condition on AutoValidNat_ConditionID = Nat_ConditionID
where T_OrderHeaderDate >= ? and T_OrderHeaderDate <= ?
order by T_OrderHeaderID, T_TestSasCode
";
$qry = $this->db->query($sql, [$start, $end]);
if (!$qry) {
echo "Error : " .
$this->db->error()["message"] .
" | " .
$this->db->last_query();
exit();
}
$rows = $qry->result_array();
$header = [];
$header[] = [
"TotalPx" => 0,
"TotalAutoValid" => 0,
];
$prevLabNo = "";
foreach ($rows as $idx => $r) {
if ($r["HaveRequirement"] == "N" && $r["AutoValidIsOk"] == "Y") {
$header[0]["TotalAutoValid"]++;
}
$header[0]["TotalPx"]++;
if ($r["T_OrderHeaderLabNumber"] == $prevLabNo) {
$rows[$idx]["T_OrderHeaderLabNumber"] = "";
$rows[$idx]["T_OrderHeaderDate"] = "";
}
$prevLabNo = $r["T_OrderHeaderLabNumber"];
$rows[$idx]["Telusur"] =
" Check ";
if ($r["AutoValidIsReviewRange"] != "Y") {
$rows[$idx]["AutoValidNote"] .=
($r["AutoValidNote"] != "" ? "|" : "") . $r["VerifNote"];
}
unset($rows[$idx]["T_OrderDetailID"]);
unset($rows[$idx]["VerifNote"]);
}
if ($format == "html") {
$this->print_table_style();
$this->print_table($header, array_keys($header[0]));
$this->print_table($rows, array_keys($rows[0]));
}
}
function index()
{
$this->list();
}
function get_param()
{
$jparam = file_get_contents("php://input");
$param = json_decode($jparam, true);
return $param;
}
function calculate($id, $debug = false)
{
$sql = "select T_OrderDetailID, T_OrderDetailT_OrderHeaderID,
ifnull(T_OrderReqStatus,'Y') T_OrderReqStatus,
T_TestName, T_OrderDetailID, T_OrderDetailVerDate, T_OrderDetailVerUserID,
T_OrderDetailResult, T_OrderDetailNat_NormalValueID, T_OrderDetailNat_MethodeID,
M_UserUserName, T_OrderDetailMinValue,T_OrderDetailMinValueInclusive,
T_OrderDetailMaxValue, T_OrderDetailMaxValueInclusive, T_OrderdetailNat_MethodeName,
T_TestNat_TestID, ifnull(AutoVerifReviewRangeIsOK,'N') ReviewRangeIsOK,
AutoVerifTrendAnalysisImage
from t_orderdetail
join t_test on T_OrderDetailIsActive = 'Y'
and T_OrderDetailT_TestID = T_TestID
and T_OrderDetailVerification = 'Y'
and T_TestIsResult = 'Y'
join auto_verif on AutoVerifT_OrderDetailID = T_OrderDetailID
join m_user on T_OrderDetailVerUserID = M_UserID
left join t_orderreq on T_OrderDetailT_OrderHeaderID = T_OrderReqT_OrderHeaderID
and T_OrderReqIsActive = 'Y'
where T_OrderDetailID = ?
and T_OrderDetailID not in (select AutoValidT_OrderDetailID from auto_valid where AutoValidIsActive = 'Y' )";
if ($debug) {
$sql = "select T_OrderDetailID, T_OrderDetailT_OrderHeaderID,
ifnull(T_OrderReqStatus,'Y') T_OrderReqStatus,
T_TestName, T_OrderDetailID, T_OrderDetailVerDate, T_OrderDetailVerUserID,
T_OrderDetailResult, T_OrderDetailNat_NormalValueID, T_OrderDetailNat_MethodeID,
M_UserUserName, T_OrderDetailMinValue,T_OrderDetailMinValueInclusive,
T_OrderDetailMaxValue, T_OrderDetailMaxValueInclusive, T_OrderdetailNat_MethodeName,
T_TestNat_TestID, ifnull(AutoVerifReviewRangeIsOK,'N') ReviewRangeIsOK,
AutoVerifTrendAnalysisImage
from t_orderdetail
join t_test on T_OrderDetailIsActive = 'Y'
and T_OrderDetailT_TestID = T_TestID
and T_OrderDetailVerification = 'Y'
and T_TestIsResult = 'Y'
join auto_verif on AutoVerifT_OrderDetailID = T_OrderDetailID
join m_user on T_OrderDetailVerUserID = M_UserID
left join t_orderreq on T_OrderDetailT_OrderHeaderID = T_OrderReqT_OrderHeaderID
and T_OrderReqIsActive = 'Y'
where T_OrderDetailID = ?";
}
$qry = $this->db->query($sql, [$id]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] . "\n|" . $this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
if ($debug) {
echo "OrderDetail Not Found";
}
return false;
}
$r = $rows[0];
$haveReq = "N";
if ($r["T_OrderReqStatus"] != "Y") {
$haveReq = "Y";
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => "Tidak berlaku, karena ada catatan",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
if ($r["ReviewRangeIsOK"] != "Y") {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" =>
"Tidak berlaku, Review Range tidak terpenuhi",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
if (!is_numeric($r["T_OrderDetailResult"])) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => "Tidak berlaku, karena hasil bukan numerik",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
if (
!($r["T_OrderDetailNat_NormalValueID"] > 0 &&
$r["T_OrderDetailNat_MethodeID"] > 0
)
) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" =>
"Tidak berlaku, karena tidak ada Normal Value atau Methode",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
$minValue = $r["T_OrderDetailMinValue"];
$maxValue = $r["T_OrderDetailMaxValue"];
$minInclusive = $r["T_OrderDetailMinValueInclusive"];
$maxInclusive = $r["T_OrderDetailMaxValueInclusive"];
$methodeID = $r["T_OrderDetailNat_MethodeID"];
$methode = $r["T_OrderdetailNat_MethodeName"];
$value = $r["T_OrderDetailResult"];
$theTestName = $r["T_TestName"];
$nat_test_id = $r["T_TestNat_TestID"];
$headerID = $r["T_OrderDetailT_OrderHeaderID"];
try {
$n_value = floatval($value);
$n_minValue = floatval($minValue);
$n_maxValue = floatval($maxValue);
} catch (Exception $e) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" =>
"Multirule tidak berlaku karena Normal Value Min / Max tidak numerik",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
// Klasifikasi hasil
$conditionID = 0;
$condition = "Unknown";
if (
$n_value < $n_minValue ||
($n_value <= $n_minValue && $minInclusive == "N")
) {
$conditionID = 1;
$condition = "Low";
} elseif (
$n_value > $n_maxValue ||
($n_value >= $n_maxValue && $maxInclusive == "N")
) {
$conditionID = 3;
$condition = "High";
} else {
$conditionID = 2;
$condition = "Normal";
}
if ($conditionID == 0) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => "Multirule tidak berlaku karena kondisi Low/Normal/High tidak bisa ditentukan [ $n_value | min : $n_minValue | max : $n_maxValue ]",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
$sql = "select * from nat_multirule
where NatMultiruleIsActive = 'Y' and NatMultiruleNat_TestID = ?
and ( NatMultiruleNat_MethodeID is null or NatMultiruleNat_MethodeID = 0 or NatMultiruleNat_MethodeID = ?
or NatMultiruleIsAllMethode='Y' )
and NatMultiruleNat_ConditionID = ?
order by NatMultiruleNat_MethodeID desc
limit 0,1";
$qry = $this->db->query($sql, [$nat_test_id, $methodeID, $conditionID]);
if ($debug) {
$arr = [];
$arr[] = ["Query" => $this->db->last_query()];
$this->print_table_style();
$this->print_table($arr, array_keys($arr[0]));
}
if (!$qry) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" =>
"Multirule tidak berlaku karena multirule belum di setup [ $theTestName | kondisi : $condition | methode : $methode ]" .
$this->db->error()["message"],
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
$rows_rule = $qry->result_array();
if (count($rows_rule) == 0) {
if ($conditionID == 2) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => "Terpenuhi, $theTestName untuk kondisi $condition dengan methode $methode tidak memiliki reflex test.",
"AutoValidIsOk" => "Y",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" =>
$r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => "Tidak terpenuhi, $theTestName untuk kondisi $condition dengan methode $methode tidak memiliki reflex test.",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
$r_rule = $rows_rule[0];
$mrID = $r_rule["NatMultiruleID"];
if (count($rows_rule) > 0) {
// print_r($rows_rule);
}
//Extra Low
if ($conditionID == 1) {
try {
$n_x_low = floatval($r_rule["NatMultiruleExtraLow"]);
} catch (Exception $e) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" =>
"Tidak berlaku, karena masterdata extra low bukan numerik",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_MethodeID" =>
$r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
if ($n_x_low > $n_value) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => "Tidak berlaku, karena hasil lebih rendah dari extra low [ $n_value < $n_x_low ]",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_MethodeID" =>
$r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
}
//Extra Hight
if ($conditionID == 3) {
try {
$n_x_high = floatval($r_rule["NatMultiruleExtraHigh"]);
} catch (Exception $e) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" =>
"Tidak berlaku, karena masterdata extra high bukan numerik",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" =>
$r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
if ($n_x_high < $n_value) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => "Tidak berlaku, karena hasil lebih tinggi dari extra hight [ $n_value > $n_x_high]",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" =>
$r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
}
//Argument 1
$sql = "select distinct Nat_ReflexTestID,
Nat_TestName, Nat_ConditionName, Nat_TestID,
Nat_ReflexTestNat_ConditionID,
T_OrderDetailNat_NormalValueID, T_OrderDetailResult, T_OrderDetailNat_MethodeName,
T_OrderDetailMaxValueInclusive, T_OrderDetailMinValueInclusive,
T_OrderDetailMinValue, T_OrderDetailMaxValue, T_OrderDetailVerification
from
nat_reflextest
join nat_condition on Nat_ReflexTestNat_ConditionID = Nat_ConditionID and Nat_ReflexTestIsActive = 'Y'
join nat_test on Nat_ReflexTestNat_TestID = Nat_TestID and Nat_TestIsActive = 'Y'
and Nat_ReflexTestIsActive = 'Y' and Nat_ReflexTestNatMultiRuleID = ?
join t_test on Nat_TestID = T_TestNat_TestID and T_TestIsActive = 'Y'
join t_orderdetail on T_TestID = T_OrderDetailT_TestID
and T_OrderDetailIsActive = 'Y' and T_OrderDetailT_OrderHeaderID = ?
order by Nat_ReflexTestID, Nat_ReflexTestNat_RelationID desc";
$qry = $this->db->query($sql, [$mrID, $headerID]);
if (!$qry) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" =>
"Tidak berlaku, karena $theTestName dengan kondisi $condition, tidak memiliki masterdata Argument 1" .
"|" .
$this->db->error()["message"],
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
$rows_reflex = $qry->result_array();
if (count($rows_reflex) == 0) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => "Tidak berlaku, karena $theTestName dengan kondisi $condition, tidak memiliki masterdata Argument 1",
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
$argument_1_list = [];
$arr_px_1 = [];
foreach ($rows_reflex as $rfx) {
$rfx_conditionID = $rfx["Nat_ReflexTestNat_ConditionID"];
$rfx_conditionName = $rfx["Nat_ConditionName"];
$rfx_nat_TestID = $rfx["Nat_TestID"];
if (isset($arr_px_1[$rfx_nat_TestID])) {
$rfx_idx = $arr_px_1[$rfx_nat_TestID];
} else {
$argument_1_list[] = [
"px" => $rfx["Nat_TestName"],
"pxID" => $rfx["Nat_TestID"],
"reflexID" => $rfx["Nat_ReflexTestID"],
"is_ok" => false,
"is_show_mandatory" => false,
"condition" => $rfx_conditionName,
"conditionID" => $rfx_conditionID,
"note" => "",
];
$rfx_idx = count($argument_1_list) - 1;
$arr_px_1[$rfx_nat_TestID] = $rfx_idx;
}
// nat test ini sdh terpenuhi
if ($argument_1_list[$rfx_idx]["is_ok"] === true) {
continue;
}
if ($rfx["T_OrderDetailVerification"] != "Y") {
$argument_1_list[$rfx_idx]["note"] =
"Reflex Test [" .
$rfx["Nat_TestName"] .
"] belum di verifikasi";
continue;
}
if (!($rfx["T_OrderDetailNat_NormalValueID"] > 0)) {
$argument_1_list[$rfx_idx]["note"] =
"Reflex Test [" .
$rfx["Nat_TestName"] .
"] belum memiliki nilai normal";
continue;
}
try {
$d_value = floatval($rfx["T_OrderDetailResult"]);
$d_min_value = floatval($rfx["T_OrderDetailMinValue"]);
$d_max_value = floatval($rfx["T_OrderDetailMaxValue"]);
$d_min_inclusive = $rfx["T_OrderDetailMinValueInclusive"];
$d_max_inclusive = $rfx["T_OrderDetailMaxValueInclusive"];
$rfx_condition = "Unknown";
$argument_1_list[$rfx_idx]["result"] = $rfx_condition;
if (
$d_value < $d_min_value ||
($d_value <= $d_min_value && $d_min_inclusive == "N")
) {
$rfx_conditionID = 1;
$rfx_condition = "Low";
} elseif (
$d_value > $d_max_value ||
($d_value >= $d_max_value && $d_max_inclusive == "N")
) {
$rfx_conditionID = 3;
$rfx_condition = "High";
} else {
$rfx_conditionID = 2;
$rfx_condition = "Normal";
}
if ($rfx_conditionID == 0) {
$argument_1_list[$rfx_idx]["note"] =
"Reflex Test [" .
$rfx["Nat_TestName"] .
"] kondisi [ Low/Normal/Hight ] tidak bisa ditentukan ";
continue;
}
$argument_1_list[$rfx_idx]["result"] = $rfx_condition;
if ($rfx_conditionID == $rfx["Nat_ReflexTestNat_ConditionID"]) {
$argument_1_list[$rfx_idx]["note"] =
"Reflex Test [" .
$rfx["Nat_TestName"] .
"] hasil $rfx_condition, Argument 1 " .
$rfx["Nat_ConditionName"];
$argument_1_list[$rfx_idx]["is_ok"] = true;
$argument_1_list[$rfx_idx]["is_show_mandatory"] = true;
$argument_1_list[$rfx_idx]["reflexID"] =
$rfx["Nat_ReflexTestID"];
$argument_1_list[$rfx_idx]["condition"] = $rfx_conditionName;
$argument_1_list[$rfx_idx]["conditionID"] = $rfx_conditionID;
} else {
$argument_1_list[$rfx_idx]["note"] =
"Reflex Test [" .
$rfx["Nat_TestName"] .
"] hasil $rfx_condition, Argument 1 " .
$rfx["Nat_ConditionName"];
$argument_1_list[$rfx_idx]["reflexID"] =
$rfx["Nat_ReflexTestID"];
$argument_1_list[$rfx_idx]["is_ok"] = false;
}
} catch (Exception $e) {
$argument_1_list[$rfx_idx]["note"] =
"Reflex Test [" .
$rfx["Nat_TestName"] .
"] kondisi [ Low/Normal/Hight ] tidak bisa ditentukan ( konversi numerik )";
continue;
}
if ($debug) {
//echo "
";
//print_r($argument_1_list);
//echo "";
}
}
$flag_error = false;
$s_ids = "0";
//cari reflex yg memenuhi
foreach ($argument_1_list as $list) {
if ($list["is_ok"] == false) {
$flag_error = true;
continue;
}
$s_ids .= "," . $list["reflexID"];
}
// Mandatory
$sql = "select Nat_ReflexTestID,
Nat_TestName, Nat_ConditionName, Nat_TestID,
Nat_ReflexMandatoryNat_ConditionID, Nat_ConditionName,
T_OrderDetailNat_NormalValueID, T_OrderDetailResult, T_OrderDetailNat_MethodeName,
T_OrderDetailMaxValueInclusive, T_OrderDetailMinValueInclusive,
T_OrderDetailMinValue, T_OrderDetailMaxValue, T_OrderDetailVerification
from
nat_reflextest
join nat_reflexmandatory on Nat_ReflexMandatoryNat_ReflexTestID in ( $s_ids )
and Nat_ReflexTestID = Nat_ReflexMandatoryNat_ReflexTestID and Nat_ReflexTestIsActive = 'Y'
join nat_condition on Nat_ReflexMandatoryNat_ConditionID = Nat_ConditionID and Nat_ReflexMandatoryIsActive = 'Y'
join nat_test on Nat_ReflexMandatoryNat_TestID = Nat_TestID and Nat_TestIsActive = 'Y'
and Nat_ReflexMandatoryIsActive = 'Y'
join t_test on Nat_TestID = T_TestNat_TestID and T_TestIsActive = 'Y'
join t_orderdetail on T_TestID = T_OrderDetailT_TestID
and T_OrderDetailIsActive = 'Y' and T_OrderDetailT_OrderHeaderID = ?
order by Nat_ReflexTestID, Nat_ReflexTestNat_RelationID desc";
$qry = $this->db->query($sql, [$headerID]);
$reflex_id_not_ok = [];
if ($qry) {
$mdt_rows = $qry->result_array();
foreach ($mdt_rows as $r_mdt) {
$is_ok = false;
$is_display = true;
$result = "";
if ($r_mdt["T_OrderDetailVerification"] != "Y") {
$result = "Belum di verifikasi";
continue;
}
if (!($r_mdt["T_OrderDetailNat_NormalValueID"] > 0)) {
$result = "Belum memiliki nilai normal";
continue;
}
if ($result == "") {
try {
$d_value = floatval($r_mdt["T_OrderDetailResult"]);
$d_min_value = floatval(
$r_mdt["T_OrderDetailMinValue"]
);
$d_max_value = floatval(
$r_mdt["T_OrderDetailMaxValue"]
);
$d_min_inclusive =
$r_mdt["T_OrderDetailMinValueInclusive"];
$d_max_inclusive =
$r_mdt["T_OrderDetailMaxValueInclusive"];
$mdt_condition = "Unknown";
if (
$d_value < $d_min_value ||
($d_value <= $d_min_value &&
$d_min_inclusive == "N")
) {
$mdt_conditionID = 1;
$mdt_condition = "Low";
} elseif (
$d_value > $d_max_value ||
($d_value >= $d_max_value &&
$d_max_inclusive == "N")
) {
$mdt_conditionID = 3;
$mdt_condition = "High";
} else {
$mdt_conditionID = 2;
$mdt_condition = "Normal";
}
if ($mdt_conditionID == 0) {
$result =
"Mandatory Reflex Test [" .
$rfx["Nat_TestName"] .
"] kondisi [ Low/Normal/Hight ] tidak bisa ditentukan ";
}
} catch (Exception $e) {
$result =
"Mandatory Reflex Test [" .
$rfx["Nat_TestName"] .
"] kondisi [ Low/Normal/Hight ] tidak bisa ditentukan ( konversi numerik )";
}
if (
$mdt_conditionID ==
$r_mdt["Nat_ReflexMandatoryNat_ConditionID"]
) {
$result =
$r_mdt["Nat_TestName"] . " kondisi : " . $condition;
$is_ok = true;
} else {
$result =
$r_mdt["Nat_TestName"] . " kondisi : " . $condition;
$is_ok = false;
}
}
$mandatory[] = [
"reflexID" => $r_mdt["Nat_ReflexTestID"],
"px" => $r_mdt["Nat_TestName"],
"condition" => $r_mdt["Nat_ConditionName"],
"is_display" => $is_display,
"result" => $result,
"is_ok" => $is_ok,
];
if (!$is_ok) {
$reflex_id_not_ok[] = $r_mdt["Nat_ReflexTestID"];
}
}
}
$arr_notes = [];
if ($debug) {
//echo " Reflex ID Not OK :\n";
//print_r($reflex_id_not_ok);
//echo "";
}
foreach ($argument_1_list as $x_idx => $l) {
if (in_array($l["reflexID"], $reflex_id_not_ok)) {
$argument_1_list[$x_idx]["is_ok"] = false;
$x_mandatory = array_filter($mandatory, function ($m) use (
$reflex_id_not_ok
) {
if (in_array($m["reflexID"], $reflex_id_not_ok)) {
return true;
}
});
foreach ($x_mandatory as $m) {
$argument_1_list[$x_idx]["note"] = $m["result"];
}
continue;
}
$argument_1_list[$x_idx]["mandatory"] = [];
foreach ($mandatory as $m) {
if ($m["reflexID"] == $l["reflexID"]) {
$argument_1_list[$x_idx]["mandatory"][] = $m;
}
}
}
$flag_error = false;
$notes = "";
//print_r($argument_1_list);
foreach ($argument_1_list as $list) {
if ($list["is_ok"] == false) {
$flag_error = true;
}
if ($notes != "") {
$notes .= "\n";
}
$notes .= $list["note"];
}
if ($flag_error) {
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => $notes,
"AutoValidIsOk" => "N",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
return [
"AutoValidT_OrderDetailID" => $r["T_OrderDetailID"],
"AutoValidHaveReq" => $haveReq,
"AutoValidIsReviewRange" => $r["ReviewRangeIsOK"],
"AutoValidNote" => $notes,
"AutoValidIsOk" => "Y",
"AutoValidVerifDate" => $r["T_OrderDetailVerDate"],
"AutoValidVerifUserID" => $r["T_OrderDetailVerUserID"],
"AutoValidVerifUserName" => $r["M_UserUserName"],
"AutoValidNat_ConditionID" => $conditionID,
"AutoValidNat_NormalValueID" =>
$r["T_OrderDetailNat_NormalValueID"],
"AutoValidNat_MethodeID" => $r["T_OrderDetailNat_MethodeID"],
"AutoValidT_OrderDetailResult" => $r["T_OrderDetailResult"],
"image" => $r["AutoVerifTrendAnalysisImage"],
];
}
function debug($id)
{
$result = $this->calculate($id, true);
if ($result === false) {
echo "No Auto Valid Response";
exit();
}
$this->print_table_style();
$img =
"";
unset($result["image"]);
$this->print_table([$result], array_keys($result));
echo "
$img";
}
function order_debug($date = "")
{
if ($date == "") {
$date = date("Y-m-d");
}
$start_date = $date . " 00:00:01";
$end_date = $date . " 23:59:59";
$sql = "select
T_OrderHeaderDate, T_OrderHeaderLabNumber,
T_OrderHeaderAddonVerificationDone,
group_concat(T_OrderDetailT_TestName) TestName
from t_orderheader
join t_orderheaderaddon on T_OrderHeaderDate >= ? and T_OrderHeaderDate < ?
and T_OrderHeaderID = T_OrderHeaderAddonT_OrderHeaderID
and T_OrderHeaderIsActive = 'Y'
join t_orderdetail on T_OrderHeaderID = T_OrderDetailT_OrderHeaderID
and T_OrderDetailIsActive = 'Y'
and T_OrderDetailVerification = 'Y'
join t_test on T_OrderDetailT_TestID = T_TestID and T_TestIsResult = 'Y'
group by T_OrderHeaderID
limit 0,100
";
$qry = $this->db->query($sql, [$start_date, $end_date]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] . "\n|" . $this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
foreach ($rows as $idx => $r) {
$rows[$idx]["Check"] =
" Check ";
}
$this->print_table_style();
$this->print_table($rows, array_keys($rows[0]));
}
function get_verif_status($detailID)
{
$sql =
"select * from auto_verif_v2 where AutoVerifT_OrderDetailID = ? and autoVerifIsActive = 'Y'";
$qry = $this->db->query($sql, [$detailID]);
if (!$qry) {
return ["N", "Error : " . $this->db->error()["message"]];
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return ["X", "Auto Verif N/A"];
}
$r = $rows[0];
if (
$r["autoVerifIsPanicValue"] == "N" &&
$r["autoVerifIsPreAnalityc"] == "N" &&
$r["autoVerifIsInAmr"] == "Y" &&
$r["autoVerifIsUjiTrendOK"] == "Y"
) {
return ["Y", "Auto Verif terpenuhi."];
} else {
return ["N", "Auto Verif tidak terpenuhi."];
}
}
function get_is_quantitative($detailID)
{
$sql = "select T_TestIsQuantitative,T_OrderDetailResult
from t_orderdetail
join t_test on T_OrderDetailID = ? and T_OrderDetailT_TestID = T_TestID";
$qry = $this->db->query($sql, [$detailID]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] . "\n|" . $this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->reply_error("Record not found");
exit();
}
if ($rows[0]["T_TestIsQuantitative"] == "N") {
return "N";
}
if (
!is_numeric($rows[0]["T_OrderDetailResult"]) &&
$rows[0]["T_OrderDetailResult"] != ""
) {
return "N";
}
return "Y";
}
function get_condition_sedimen($result)
{
$negatif = ["Negatif", "Non Reaktif"];
$borderline = ["BorderLine", "GrayZone"];
$positif = ["Positif", "Reaktif"];
foreach ($negatif as $x) {
if (strpos($result, $x) !== false) {
return -1;
}
}
foreach ($positif as $x) {
if (strpos($result, $x) !== false) {
return 1;
}
}
foreach ($borderline as $x) {
if (strpos($result, $x) !== false) {
return 0;
}
}
return 99;
}
// -1 : negatif , 0: borderline , 1 : positive , 99 : n/a
function get_condition_qualitative($result, $debug = "")
{
$negatif = [
"Negatif",
"Normal",
"Non Reaktif",
"Kuning",
"Kuning Muda",
"Jernih",
];
$borderline = ["BorderLine", "GrayZone"];
$positif = ["Positif", "Reaktif"];
foreach ($negatif as $x) {
if (strpos($result, $x) !== false) {
return -1;
}
}
foreach ($positif as $x) {
if (strpos($result, $x) !== false) {
return 1;
}
}
foreach ($borderline as $x) {
if (strpos($result, $x) !== false) {
return 0;
}
}
return 99;
}
function get_condition($detailID)
{
$sql = "select T_OrderDetailT_OrderHeaderID,
T_TestName, T_OrderDetailID, date(T_OrderHeaderDate) orderDate,
T_OrderHeaderDate,
T_OrderDetailResult, T_OrderDetailNat_NormalValueID,
T_OrderDetailNat_MethodeID,
T_OrderDetailMinValue, T_OrderDetailMinValueInclusive,
T_OrderDetailMaxValue, T_OrderDetailMaxValueInclusive, T_OrderdetailNat_MethodeName,
T_TestNat_TestID, T_OrderHeaderM_PatientID, T_TestIsDeltaCheck
from t_orderdetail
join t_orderheader on T_OrderDetailID = ?
and T_OrderDetailT_OrderHeaderID = T_OrderHeaderID
join t_test on T_OrderDetailIsActive = 'Y'
and T_OrderDetailT_TestID = T_TestID
and T_OrderDetailVerification = 'Y'
and T_TestIsResult = 'Y' ";
$qry = $this->db->query($sql, [$detailID]);
if (!$qry) {
$this->reply_error(
"Get Condition" .
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$this->reply_error("Record not found");
exit();
}
$r = $rows[0];
$minValue = $r["T_OrderDetailMinValue"];
$maxValue = $r["T_OrderDetailMaxValue"];
$minInclusive = $r["T_OrderDetailMinValueInclusive"];
$maxInclusive = $r["T_OrderDetailMaxValueInclusive"];
$methodeID = $r["T_OrderDetailNat_MethodeID"];
$methode = $r["T_OrderdetailNat_MethodeName"];
$value = $r["T_OrderDetailResult"];
$theTestName = $r["T_TestName"];
$nat_test_id = $r["T_TestNat_TestID"];
$headerID = $r["T_OrderDetailT_OrderHeaderID"];
$conditionID = 0;
$condition = "Unknown";
try {
$n_value = floatval($value);
$n_minValue = floatval($minValue);
$n_maxValue = floatval($maxValue);
} catch (Exception $e) {
return [
"conditionID" => 0,
"conditionName" => "N/A Hasil: $value, Min: $minValue, Max: $maxValue",
];
}
if (
$n_value < $n_minValue ||
($n_value <= $n_minValue && $minInclusive == "N")
) {
$conditionID = 1;
$condition = "Low";
} elseif (
$n_value > $n_maxValue ||
($n_value >= $n_maxValue && $maxInclusive == "N")
) {
$conditionID = 3;
$condition = "High";
} else {
$conditionID = 2;
$condition = "Normal";
}
return [
"conditionID" => $conditionID,
"conditionName" => $condition,
"headerID" => $headerID,
"testName" => $theTestName,
"methodeID" => $methodeID,
"methode" => $methode,
"natTestID" => $nat_test_id,
"patientID" => $r["T_OrderHeaderM_PatientID"],
"orderDate" => $r["orderDate"],
"T_OrderHeaderDate" => $r["T_OrderHeaderDate"],
"orderResult" => $r["T_OrderDetailResult"],
];
}
function inReviewRange($natTestID, $result, $decimalDigit)
{
//rata-rata harian
$sql = "select Nat_TrendAnalysisLow, Nat_TrendAnalysisHigh, Nat_TrendAnalysisMinCount
from nat_trend_analysis
where Nat_TrendAnalysisNat_TestID = ?";
$qry = $this->db->query($sql, [$natTestID]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] . "\n|" . $this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return ["N", "Review Range belum di setting."];
}
$low = round($rows[0]["Nat_TrendAnalysisLow"], $decimalDigit);
$high = round($rows[0]["Nat_TrendAnalysisHigh"], $decimalDigit);
//yyyy-hh-mm
if ($result >= $low && $result <= $high) {
return [
"N",
"Tidak masuk Review Range. Hasil:$result, -2SD: $low, +2SD:$high",
];
}
return ["Y", "Masuk Review Range"];
}
function getInconsistensi($natTestID, $orderHeaderID, $debug = "")
{
//Glukosa Darah Puasa diabaikan
if ($natTestID == 4716) {
return ["Y", "N/A"];
}
$sql = "select distinct Nat_InkonsistensiID, Nat_InkonsistensiName
from nat_inkonsistensi_detail
join nat_inkonsistensi on Nat_InkonsistensiDetailNat_TestID = ?
and Nat_InkonsistensiDetailIsActive = 'Y'
and Nat_InkonsistensiDetailNat_InkonsistensiID = Nat_InkonsistensiID ";
$qry = $this->db->query($sql, [$natTestID]);
if (!$qry) {
$this->reply_error(
"Get Inkonsistensi Detail" .
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return ["Y", "N/A"];
}
$aInkonsistency = [];
foreach ($rows as $r) {
$aInkonsistency[$r["Nat_InkonsistensiID"]] =
$r["Nat_InkonsistensiName"];
}
$s_inkonsistensiID = implode(",", array_keys($aInkonsistency));
if ($s_inkonsistensiID == "") {
$s_inkonsistensiID = "0";
}
$sql = "select T_TestNat_TestID,T_OrderDetailResult, T_OrderDetailT_TestName
from t_orderdetail
join t_test on T_OrderDetailT_OrderHeaderID = ?
and T_OrderDetailIsActive = 'Y'
and T_OrderDetailT_TestID = T_TestID";
$qry = $this->db->query($sql, [$orderHeaderID]);
if (!$qry) {
$this->reply_error(
"Get T_OrderDetail Nat_Test" .
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
exit();
}
$rows_nat = $qry->result_array();
$orderNatTestID = [];
foreach ($rows_nat as $r) {
$orderNatTestID[$r["T_TestNat_TestID"]] = $r["T_OrderDetailResult"];
}
$sql = "select Nat_InkonsistensiID,
group_concat(Nat_InkonsistensiDetailNat_TestID) aNatTest,
group_concat(Nat_InkonsistensiDetailCode) aNatCode,
group_concat(Nat_TestName) aNatTestName,
Nat_InkonsistensiFormula
from nat_inkonsistensi_detail
join nat_inkonsistensi on Nat_InkonsistensiID = Nat_InkonsistensiDetailNat_InkonsistensiID
and Nat_InkonsistensiID in($s_inkonsistensiID)
join nat_test on Nat_InkonsistensiDetailNat_TestID = Nat_TestID
group by Nat_InkonsistensiID";
$qry = $this->db->query($sql);
if (!$qry) {
$this->reply_error(
"Get Inkonsistensi Detail" .
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
exit();
}
$rows_d = $qry->result_array();
$havingInconsistency = false;
$inconsistencyNote = "N/A";
$haveError = false;
foreach ($rows_d as $r) {
$natInkonsistensiID = $r["Nat_InkonsistensiID"];
$formula = $r["Nat_InkonsistensiFormula"];
$aNatTest = explode(",", $r["aNatTest"]);
$aNatCode = explode(",", $r["aNatCode"]);
$aNatTestName = explode(",", $r["aNatTestName"]);
$isAllPxExists = true;
$aResult = [];
$note = "";
foreach ($aNatTest as $idx => $nt) {
if (!in_array($nt, array_keys($orderNatTestID))) {
$isAllPxExists = false;
$note .=
$aInkonsistency[$nt] .
" N/A (" .
$aNatTestName[$idx] .
")";
break;
}
$aResult[$aNatCode[$idx]] = $orderNatTestID[$nt];
}
if ($isAllPxExists) {
foreach ($aResult as $ks => $rs) {
$formula = str_ireplace("{" . $ks . "}", $rs, $formula);
}
try {
$rstFormula = false;
try {
eval("\$rstFormula = {$formula} ;");
} catch (ParseError $e) {
return [
"N",
$aInkonsistency[$natInkonsistensiID] .
" | $formula Error ",
];
}
if ($debug != "") {
echo "Formula : $formula | " .
($rstFormula ? "Y" : "N");
}
if ($rstFormula == true) {
return [
"Y",
$aInkonsistency[$natInkonsistensiID] .
" | $formula | $rstFormula",
];
} else {
$haveError = true;
if ($inconsistencyNote == "N/A") {
$inconsistencyNote = "";
}
if ($inconsistencyNote != "") {
$inconsistencyNote .= ",";
}
$inconsistencyNote .=
$aInkonsistency[$natInkonsistensiID] .
"| $formula |" .
($rstFormula ? "TRUE" : "FALSE");
}
} catch (Exception $e) {
return [
"N",
$aInkonsistency[$natInkonsistensiID] .
" | $formula Error ",
];
}
}
}
if ($debug != "") {
echo "E : $inconsistencyNote \n";
}
return [$haveError ? "N" : "Y", $inconsistencyNote];
}
function get_delta_check_is_ok_sedimen(
$orderResult,
$orderHeaderID,
$patientID,
$natTestID,
$conditionID,
$low,
$high
) {
//last Result
if ($conditionID == 1) {
$conditionName = "Low";
}
if ($conditionID == 2) {
$conditionName = "Normal";
}
if ($conditionID == 3) {
$conditionName = "High";
}
$sql = "select T_OrderDetailResult
from t_orderheader
join t_orderdetail on T_OrderHeaderM_PatientID = ?
and T_OrderHeaderID < ? and T_OrderHeaderIsActive = 'Y'
and T_OrderDetailVerification = 'Y'
and T_OrderDetailIsActive = 'Y'
and T_OrderDetailT_OrderHeaderID = T_OrderHeaderID
join t_test on T_OrderDetailT_TestID = T_TestID
and T_TestNat_TestID = ?
order by T_OrderHeaderDate desc
limit 0,1";
$qry = $this->db->query($sql, [$patientID, $orderHeaderID, $natTestID]);
if (!$qry) {
return [
"N",
"Error Get Last Result | " . $this->db->error()["message"],
];
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return [
"N/A",
"N/A No Historical Result. Hasil : {$orderResult}, Low: {$low}, High : {$high}",
];
}
$lastResult = $rows[0]["T_OrderDetailResult"];
$tmpResult = explode("-", $lastResult);
$orgResult = $lastResult;
if (count($tmpResult) > 1) {
$lastResult = trim($tmpResult[1]);
}
if ($lastResult < $low) {
$x_conditionID = 1;
} elseif ($lastResult <= $high) {
$x_conditionID = 2;
} elseif ($lastResult > $high) {
$x_conditionID = 3;
} else {
$x_conditionID = 99;
}
if ($conditionID != $x_conditionID) {
return [
"N",
"Sedimen Delta Check tidak terpenuhi. Hasil {$orderResult}, hasil sebelumnya: {$lastResult} | {$orgResult}",
];
} else {
return [
"Y",
"Sedimen Delta Check terpenuhi. Hasil {$orderResult}, hasil sebelumnya: {$lastResult} | {$lastResult}",
];
}
}
function get_delta_check_is_ok_qualitative(
$orderResult,
$orderHeaderID,
$patientID,
$natTestID,
$debug = ""
) {
//last Result
$sql = "select T_OrderHeaderID,T_OrderDetailID,T_OrderHeaderM_PatientID,
T_OrderHeaderDate,T_OrderHeaderLabNumber, T_OrderDetailResult, T_OrderDetailT_TestName
from t_orderheader
join t_orderdetail on T_OrderHeaderM_PatientID = ?
and T_OrderHeaderID < ? and T_OrderHeaderIsActive = 'Y'
and T_OrderDetailVerification = 'Y'
and T_OrderDetailIsActive = 'Y'
and T_OrderDetailT_OrderHeaderID = T_OrderHeaderID
join t_test on T_OrderDetailT_TestID = T_TestID
and T_TestNat_TestID = ?
order by T_OrderHeaderDate desc
limit 0,3";
$qry = $this->db->query($sql, [$patientID, $orderHeaderID, $natTestID]);
if (!$qry) {
return [
"N",
"Error Get Last Result | " . $this->db->error()["message"],
];
}
$rows = $qry->result_array();
if ($debug != "") {
print_r($rows);
}
if (count($rows) == 0) {
return ["Y", "N/A No Historical Result."];
}
$lastResult = $rows[0]["T_OrderDetailResult"];
if (
$this->get_condition_qualitative($lastResult) !=
$this->get_condition_qualitative($orderResult)
) {
return [
"N",
"Qualitative Delta Check tidak terpenuhi. Hasil {$orderResult}, hasil sebelumnya: {$lastResult}",
];
} else {
return [
"Y",
"Qualitative Delta Check terpenuhi. Hasil {$orderResult}, hasil sebelumnya: {$lastResult}",
];
}
}
function get_delta_check_is_ok(
$orderHeaderDate,
$orderResult,
$orderHeaderID,
$patientID,
$natTestID,
$testIsDeltaCheck,
$decimalDigit,
$conditionID = 0,
$debug = ""
) {
$sql = " select
Nat_DeltaCheckNat_DeltaTypeID, Nat_DeltaCheckInterval,
Nat_DeltaCheckM_TimeID,
Nat_DeltaCheckMinValue, Nat_DeltaCheckMaxValue
from nat_delta_check
where Nat_DeltaCheckNat_TestID = ?
and Nat_DeltaCheckIsActive = 'Y'";
$qry = $this->db->query($sql, [$natTestID]);
if (!$qry) {
return [
"N",
"Error Get Nat Delta Check | " . $this->db->error()["message"],
];
}
$rows = $qry->result_array();
if (count($rows) == 0) {
if ($testIsDeltaCheck == "Y") {
return ["N", "Delta Check belum di setting."];
}
return ["Y", "Delta Check N/A"];
}
$r = $rows[0];
$minValue = $r["Nat_DeltaCheckMinValue"];
$maxValue = $r["Nat_DeltaCheckMaxValue"];
$type = $r["Nat_DeltaCheckNat_DeltaTypeID"];
$unitTime = $r["Nat_DeltaCheckM_TimeID"];
//last Result
$sql = "select T_OrderDetailResult, T_OrderHeaderDate,
T_OrderDetailMinValue, T_OrderDetailMinValueInclusive, T_OrderDetailMaxValue, T_OrderDetailMaxValueInclusive,
case
when '$unitTime' = '1' then
TIMESTAMPDIFF(MINUTE,T_OrderHeaderDate,'$orderHeaderDate')
when '$unitTime' = '2' then
TIMESTAMPDIFF(HOUR,T_OrderHeaderDate,'$orderHeaderDate')
when '$unitTime' = '3' then
TIMESTAMPDIFF(DAY,T_OrderHeaderDate,'$orderHeaderDate')
else
-1
end itv
from t_orderheader
join t_orderdetail on T_OrderHeaderM_PatientID = ?
and T_OrderHeaderID = T_OrderDetailT_OrderHeaderID
and T_OrderHeaderID < ? and T_OrderHeaderIsActive = 'Y'
and T_OrderDetailVerification = 'Y'
and T_OrderDetailIsActive = 'Y'
join t_test on T_OrderDetailT_TestID = T_TestID
and T_TestNat_TestID = ?
order by T_OrderHeaderDate desc
limit 0,1";
$qry = $this->db->query($sql, [$patientID, $orderHeaderID, $natTestID]);
if (!$qry) {
return [
"N",
"Error Get Last Result | " . $this->db->error()["message"],
];
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return ["Y", "N/A No Historical Result."];
}
$r = $rows[0];
if ($debug != "") {
print_r($r);
}
$last_minValue = $r["T_OrderDetailMinValue"];
$last_maxValue = $r["T_OrderDetailMaxValue"];
$last_minInclusive = $r["T_OrderDetailMinValueInclusive"];
$last_maxInclusive = $r["T_OrderDetailMaxValueInclusive"];
$last_value = $r["T_OrderDetailResult"];
try {
$last_n_value = floatval($last_value);
$last_n_minValue = floatval($last_minValue);
$last_n_maxValue = floatval($last_maxValue);
if (
$last_n_value < $last_n_minValue ||
($last_n_value <= $last_n_minValue && $last_minInclusive == "N")
) {
$last_conditionID = 1;
} elseif (
$last_n_value > $last_n_maxValue ||
($last_n_value >= $last_n_maxValue && $last_maxInclusive == "N")
) {
$last_conditionID = 3;
} else {
$last_conditionID = 2;
}
if ($last_conditionID == 2 && $conditionID == 2) {
return [
"Y",
"Delta Check terpenuhi. Hasil Sebelumnya $last_value [Normal], hasil saat ini $orderResult [ Normal ].",
];
}
} catch (Exception $e) {
}
$lastResult = $rows[0]["T_OrderDetailResult"];
$interval = $rows[0]["itv"];
if ($type == 1) {
$delta = round($orderResult - $lastResult, $decimalDigit);
if ($delta < $minValue || $delta > $maxValue) {
return [
"N",
"Delta Difference tidak terpenuhi. Delta {$delta}, min : {$minValue} , max : ${maxValue}, hasil: ${orderResult}, hasil sebelumnya : ${lastResult} ",
];
} else {
return [
"Y",
"Delta Difference terpenuhi. Delta {$delta}, min : {$minValue} , max : ${maxValue}, hasil: ${orderResult}, hasil sebelumnya : ${lastResult} ",
];
}
} elseif ($type == 2) {
$deltaPctChange = round(
(($orderResult - $lastResult) / $lastResult) * 100,
0
);
if ($deltaPctChange < $minValue || $deltaPctChange > $maxValue) {
return [
"N",
"Delta Percent Change tidak terpenuhi. Delta Percent Change {$deltaPctChange} , min : {$minValue} , max : ${maxValue}, hasil: ${orderResult}, hasil sebelumnya : ${lastResult} ",
];
} else {
return [
"Y",
"Delta Percent Change terpenuhi. Delta Percent Change {$deltaPctChange} , min : {$minValue} , max : ${maxValue}, hasil: ${orderResult}, hasil sebelumnya : ${lastResult} ",
];
}
} elseif ($type == 3) {
if ($interval == -1) {
return ["N", "Rate Difference, Interval Setting Error."];
}
$rateDiff = round(
($orderResult - $lastResult) / $interval,
$decimalDigit
);
if ($rateDiff < $minValue || $rateDiff > $maxValue) {
return [
"N",
"Rate difference tidak terpenuhi. Rate difference {$rateDiff} , min : {$minValue} , max : ${maxValue}, hasil: ${orderResult}, hasil sebelumnya : ${lastResult} ",
];
} else {
return [
"Y",
"Rate difference terpenuhi. Rate difference {$rateDiff} , min : {$minValue} , max : ${maxValue}, hasil: ${orderResult}, hasil sebelumnya : ${lastResult} ",
];
}
} elseif ($type == 4) {
if ($interval == -1) {
return ["N", "Rate Percent Change, Interval Setting Error."];
}
$ratePctChange = round(
(($orderResult - $lastResult) / $interval) * $lastResult,
$decimalDigit
);
if ($ratePctChange < $minValue || $ratePctChange > $maxValue) {
return [
"N",
"Rate Percent Change tidak terpenuhi. Rate Percent Change {$ratePctChange} , min : {$minValue} , max : ${maxValue}, hasil: ${orderResult}, hasil sebelumnya : ${lastResult} ",
];
} else {
return [
"Y",
"Rate Percent Change terpenuhi. Rate Percent Change {$ratePctChange} , min : {$minValue} , max : ${maxValue}, hasil: ${orderResult}, hasil sebelumnya : ${lastResult}",
];
}
} else {
return ["N", "Delta Check Interval Unit not Checked."];
}
}
function process_v2()
{
$param = $this->get_param();
$ids = $param["ids"];
$is_update = "N";
if (isset($param["is_update"])) {
$is_update = $param["is_update"];
}
if ($ids == "") {
$this->reply([
"total" => 0,
"total_ok" => 0,
"total_not_ok" => 0,
]);
exit();
}
$total = 0;
$total_ok = 0;
$total_not_ok = 0;
$a_ids = explode(",", $ids);
foreach ($a_ids as $id) {
$isOk = $this->re_process($id);
$total++;
if ($isOk) {
$total_ok++;
} else {
$total_not_ok++;
}
}
$this->reply([
"total" => $total,
"total_ok" => $total_ok,
"total_not_ok" => $total_not_ok,
]);
}
function get_status_sedimen()
{
}
function re_process($detailID, $debug = "")
{
$this->db->trans_begin();
$sql = "delete from auto_valid_v2 where AutoValidT_OrderDetailID=?";
$qry = $this->db->query($sql, [$detailID]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] . "\n|" . $this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$isQuantitative = $this->get_is_quantitative($detailID);
//A. check AutoVerif Is OK
//B. get condition L |N | H
// LOW
//1. IsReviewRange -> Y -> Not OK
//2. InkonsistensiRule -> tidak terpenuhi -> NOK OK
// ( N/A or OK lanjut 3)
//3. Delta Check -> tidak terpenuhi -> NOT OK
// ( N/A or OK lanjut 4 )
//4. Reflex Test -> N/A atau tidak terpenuhi -> NOT OK
// NORMAL
// (* Review Range pasti OK )
//1. InkonsistensiRule -> tidak terpenuhi -> NOK OK
// ( N/A or OK lanjut 2)
//2. Delta Check -> tidak terpenuhi -> NOT OK
// ( N/A or OK lanjut 3 )
//3. Reflex Test -> N/A atau tidak terpenuhi -> NOT OK
//
//1. IsReviewRange -> Y -> Not OK
//2. InkonsistensiRule -> tidak terpenuhi -> NOK OK
// ( N/A or OK lanjut 3)
//3. Delta Check -> tidak terpenuhi -> NOT OK
// ( N/A or OK lanjut 4 )
//4. Reflex Test -> N/A atau tidak terpenuhi -> NOT OK
list($autoVerifIsOK, $autoVerifNote) = $this->get_verif_status(
$detailID
);
$arr = [];
$arr["AutoValidT_OrderDetailID"] = $detailID;
$arr["AutoValidAutoVerifIsOK"] = $autoVerifIsOK;
$arr["AutoValidAutoVerifNote"] = $autoVerifNote;
if ($autoVerifIsOK == "X") {
//belum di kerjakan
$this->db->trans_commit();
return false;
}
if ($autoVerifIsOK != "Y" && $debug == "") {
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
$conditions = $this->get_condition($detailID);
// if ($debug != "") {
// echo $this->db->last_query();
// print_r($conditions);
// }
$orderResult = $conditions["orderResult"];
$orderHeaderDate = $conditions["T_OrderHeaderDate"];
$patientID = $conditions["patientID"];
$orderHeaderID = $conditions["headerID"];
$natTestID = $conditions["natTestID"];
$testIsDeltaCheck = $conditions["T_TestIsDeltaCheck"];
$isSedimen = false;
$arrNatTestSedimen = [4348, 4349, 4350, 4351, 4352, 4353];
if (in_array($natTestID, $arrNatTestSedimen)) {
$isSedimen = true;
$tmpResult = explode("-", $orderResult);
$orgResult = $orderResult;
if (count($tmpResult) > 1) {
$orderResult = trim($tmpResult[1]);
}
$isQuantitative = "N";
if (strpos("Negatif", $orderResult) !== false) {
$isSedimen = false;
$isQuantitative = "N";
}
if (strpos("Positif", $orderResult) !== false) {
$isSedimen = false;
$isQuantitative = "N";
}
}
if ($debug != "") {
echo "IsQuantitative : $isQuantitative \n";
print_r($conditions);
}
if ($isQuantitative == "Y") {
$decimalDigit = 0;
if (strpos($orderResult, ".") !== false) {
$decimalDigit =
strlen($orderResult) - strpos($orderResult, ".") - 1;
if ($decimalDigit < 0) {
$decimalDigit = 0;
}
}
//history interval di abaikan
$arr["AutoValidIsQuantitative"] = "Y";
if ($conditions["conditionID"] == 1) {
//LOW
list($isInReviewRange, $reviewRangeNote) = $this->inReviewRange(
$conditions["natTestID"],
$orderResult,
$decimalDigit
);
$arr["AutoValidIsInReviewRange"] = $isInReviewRange;
$arr["AutoValidInReviewRangeNote"] = $reviewRangeNote;
if ($isInReviewRange == "Y") {
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
list(
$isInconsistencyOK,
$inconsistencyNote,
) = $this->getInconsistensi(
$conditions["natTestID"],
$conditions["headerID"],
$debug
);
$arr["AutoValidIsInconsistencyOK"] = $isInconsistencyOK;
$arr["AutoValidInconsistencyNote"] = $inconsistencyNote;
if ($isInconsistencyOK == "N") {
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
list(
$isDeltaCheckOk,
$deltaCheckNote,
) = $this->get_delta_check_is_ok(
$orderHeaderDate,
$orderResult,
$orderHeaderID,
$patientID,
$natTestID,
$testIsDeltaCheck,
$decimalDigit,
$conditions["conditionID"],
$debug
);
$arr["AutoValidIsDeltacheckOK"] = $isDeltaCheckOk;
$arr["AutoValidDeltaCheckNote"] = $deltaCheckNote;
if ($isDeltaCheckOk != "Y") {
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
list(
$reflexTestIsOK,
$reflexTextNote,
) = $this->get_reflex_test_is_ok(
$natTestID,
$conditions["conditionID"],
$detailID,
$orderHeaderID
);
//Low N/A => manual validasi
if ($reflexTestIsOK == "X") {
$reflexTestIsOK = "N";
}
$arr["AutoValidReflexTestIsOK"] = $reflexTestIsOK;
$arr["AutoValidReflexTestNote"] =
$conditions["testName"] .
" " .
$conditions["conditionName"] .
"|" .
$reflexTextNote;
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
} elseif ($conditions["conditionID"] == 2) {
$arr["AutoValidIsInReviewRange"] = "N";
$arr["AutoValidInReviewRangeNote"] = "Normal Condition";
//NORMAL
list(
$isInconsistencyOK,
$inconsistencyNote,
) = $this->getInconsistensi(
$conditions["natTestID"],
$conditions["headerID"],
$debug
);
$arr["AutoValidIsInconsistencyOK"] = $isInconsistencyOK;
$arr["AutoValidInconsistencyNote"] = $inconsistencyNote;
if ($isInconsistencyOK == "N") {
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
list(
$isDeltaCheckOk,
$deltaCheckNote,
) = $this->get_delta_check_is_ok(
$orderHeaderDate,
$orderResult,
$orderHeaderID,
$patientID,
$natTestID,
$testIsDeltaCheck,
$decimalDigit,
$conditions["conditionID"],
$debug
);
$arr["AutoValidIsDeltacheckOK"] = $isDeltaCheckOk;
$arr["AutoValidDeltaCheckNote"] = $deltaCheckNote;
if ($isDeltaCheckOk != "Y") {
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
list(
$reflexTestIsOK,
$reflexTextNote,
) = $this->get_reflex_test_is_ok(
$natTestID,
$conditions["conditionID"],
$detailID,
$orderHeaderID
);
//Normal N/A => auto validasi
if ($reflexTestIsOK == "X") {
$reflexTestIsOK = "Y";
}
$arr["AutoValidReflexTestIsOK"] = $reflexTestIsOK;
$arr["AutoValidReflexTestNote"] =
$conditions["testName"] .
" " .
$conditions["conditionName"] .
"|" .
$reflexTextNote;
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
} elseif ($conditions["conditionID"] == 3) {
//HIGH
list($isInReviewRange, $reviewRangeNote) = $this->inReviewRange(
$conditions["natTestID"],
$orderResult,
$decimalDigit
);
$arr["AutoValidIsInReviewRange"] = $isInReviewRange;
$arr["AutoValidInReviewRangeNote"] = $reviewRangeNote;
if ($isInReviewRange == "Y") {
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
list(
$isInconsistencyOK,
$inconsistencyNote,
) = $this->getInconsistensi(
$conditions["natTestID"],
$conditions["headerID"],
$debug
);
$arr["AutoValidIsInconsistencyOK"] = $isInconsistencyOK;
$arr["AutoValidInconsistencyNote"] = $inconsistencyNote;
if ($isInconsistencyOK == "N") {
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
list(
$isDeltaCheckOk,
$deltaCheckNote,
) = $this->get_delta_check_is_ok(
$orderHeaderDate,
$orderResult,
$orderHeaderID,
$patientID,
$natTestID,
$testIsDeltaCheck,
$decimalDigit,
$conditions["conditionID"],
$debug
);
$arr["AutoValidIsDeltacheckOK"] = $isDeltaCheckOk;
$arr["AutoValidDeltaCheckNote"] = $deltaCheckNote;
if ($isDeltaCheckOk != "Y") {
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
list(
$reflexTestIsOK,
$reflexTextNote,
) = $this->get_reflex_test_is_ok(
$natTestID,
$conditions["conditionID"],
$detailID,
$orderHeaderID
);
//High N/A => auto validasi
if ($reflexTestIsOK == "X") {
$reflexTestIsOK = "N";
}
$arr["AutoValidReflexTestIsOK"] = $reflexTestIsOK;
$arr["AutoValidReflexTestNote"] =
$conditions["testName"] .
" " .
$conditions["conditionName"] .
"|" .
$reflexTextNote;
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
} else {
//Unknown Condition
$arr["AutoValidIsInReviewRange"] = "Y";
$arr["AutoValidInReviewRangeNote"] = "N/A : Invalid Condition : {$conditions["conditionID"]}";
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
}
} else {
// Kualitatif
if ($isSedimen) {
$sql = "select
T_OrderDetailID,
max(Nat_TrendAnalysisLow) Low,
min(Nat_TrendAnalysisHigh) High,
T_OrderDetailResult
from t_orderdetail
join t_test on T_OrderDetailID = ?
and T_OrderDetailIsActive = 'Y'
and T_OrderDetailT_TestID = T_TestID
and T_TestIsResult = 'Y'
and T_TestIsQuantitative='Y'
and T_OrderDetailResult <> ''
join nat_trend_analysis on T_TestNat_TestID = Nat_TrendAnalysisNat_TestID
and Nat_TrendAnalysisIsActive = 'Y'
group by T_OrderDetailID";
$qry = $this->db->query($sql, [$detailID]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
if (count($rows) == 0) {
$arr["AutoValidIsQuantitative"] = "N";
$arr["AutoValidIsInReviewRange"] = "Y";
$arr["AutoValidInReviewRangeNote"] = "N/A : Sedimen";
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
$arr["AutoValidIsInconsistencyOK"] = "Y";
$arr["AutoValidInconsistencyNote"] = "N/A: Sedimen";
$r = $rows[0];
if ($r["Low"] <= $orderResult && $orderResult <= $r["High"]) {
$conditionID = 2;
} elseif ($orderResult > $r["High"]) {
$conditionID = 3;
} else {
$arr["AutoValidIsInReviewRange"] = "Y";
$arr["AutoValidInReviewRangeNote"] = "N/A : Sedimen Invalid Condition : {$orgResult} => {$orderResult}";
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
$arr["AutoValidIsInconsistencyOK"] = "Y";
$arr["AutoValidInconsistencyNote"] = "N/A: Sedimen";
//Delta Check
list(
$isDeltaCheckOk,
$deltaCheckNote,
) = $this->get_delta_check_is_ok_sedimen(
$orderResult,
$orderHeaderID,
$patientID,
$natTestID,
$conditionID,
$r["Low"],
$r["High"]
);
if ($isDeltaCheckOk == "N/A") {
if ($conditionID == 2) {
$isDeltaCheckOk = "Y";
} else {
$isDeltaCheckOk = "N";
}
}
$arr["AutoValidIsDeltacheckOK"] = $isDeltaCheckOk;
$arr["AutoValidDeltaCheckNote"] = $deltaCheckNote;
$arr["AutoValidReflexTestIsOK"] = "Y";
$arr["AutoValidReflexTestNote"] = "N/A : Qualitative";
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
} else {
$arr["AutoValidIsQuantitative"] = "N";
$arr["AutoValidIsInReviewRange"] = "N";
$arr["AutoValidInReviewRangeNote"] = "N/A : Qualitative";
$conditionID = $this->get_condition_qualitative(
$orderResult,
$debug
);
if ($conditionID == 99) {
// N/A
$arr["AutoValidIsInReviewRange"] = "Y";
$arr["AutoValidInReviewRangeNote"] = "N/A : Qualitative Invalid Condition : {$orderResult}";
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
$this->db->trans_commit();
return false;
}
$arr["AutoValidIsInconsistencyOK"] = "Y";
$arr["AutoValidInconsistencyNote"] = "N/A: Qualitative hasil : $orderResult";
//Delta Check
list(
$isDeltaCheckOk,
$deltaCheckNote,
) = $this->get_delta_check_is_ok_qualitative(
$orderResult,
$orderHeaderID,
$patientID,
$natTestID,
$debug
);
$arr["AutoValidIsDeltacheckOK"] = $isDeltaCheckOk;
$arr["AutoValidDeltaCheckNote"] = $deltaCheckNote;
$arr["AutoValidReflexTestIsOK"] = "Y";
$arr["AutoValidReflexTestNote"] = "N/A : Qualitative";
$qry = $this->db->insert("auto_valid_v2", $arr);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
}
$this->db->trans_commit();
}
if ($debug != "") {
print_r($arr);
exit();
}
//$this->db->trans_rollback();
if (
$this->isUpdate &&
($autoVerifIsOK == "N" ||
$isInconsistencyOK == "N" ||
$isDeltaCheckOk == "N" ||
$reflexTestIsOK == "N" ||
$isInReviewRange == "Y")
) {
return false;
} else {
$this->db->trans_begin();
$sql = "update t_orderdetail set T_OrderDetailValidation='Y'
,T_OrderDetailValDate = now(), T_OrderDetailValUserID = 1500
where T_OrderDetailID = ? and T_OrderDetailValidation='X'";
$qry = $this->db->query($sql, [$detailID]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"\n|" .
$this->db->last_query()
);
exit();
}
if ($debug != "") {
$this->db->trans_rollback();
} else {
$this->db->trans_commit();
}
$this->load->library("Txbranchstatus");
$this->txbranchstatus->update(
"VALIDATION",
$detailID,
"Auto Validation"
);
return true;
}
}
function get_reflex_test_is_ok(
$natTestID,
$conditionID,
$detailID,
$headerID
) {
$sql = "select
nat_multirule.*
from nat_multirule
join t_orderdetail on NatMultiruleNat_TestID = ?
and NatMultiruleIsActive = 'Y'
and NatMultiruleNat_ConditionID = ?
and T_OrderDetailID = ?
and ( T_OrderDetailNat_MethodeID = NatMultiruleNat_MethodeID
or NatMultiruleIsAllMethode = 'Y')";
$qry = $this->db->query($sql, [$natTestID, $conditionID, $detailID]);
if (!$qry) {
return ["N", "Error : " . $this->db->error()["message"]];
}
$rows = $qry->result_array();
if (count($rows) == 0) {
return ["X", "Reflex Test N/A"];
}
$s_ids = "0";
foreach ($rows as $r) {
$s_ids .= "," . $r["NatMultiruleID"];
}
$sql = "select distinct Nat_ReflexTestID,
Nat_ConditionName,
Nat_ReflexTestNat_ConditionID,
T_OrderDetailNat_NormalValueID, T_OrderDetailResult, T_OrderDetailNat_MethodeName,
T_OrderDetailMaxValueInclusive, T_OrderDetailMinValueInclusive,
T_OrderDetailMinValue, T_OrderDetailMaxValue, T_OrderDetailVerification,
Nat_TestName
from nat_reflextest
join nat_condition on Nat_ReflexTestNat_ConditionID = Nat_ConditionID
and Nat_ReflexTestIsActive = 'Y'
join nat_test on Nat_ReflexTestNat_TestID = Nat_TestID and Nat_TestIsActive = 'Y'
and Nat_ReflexTestIsActive = 'Y' and Nat_ReflexTestNatMultiRuleID in ($s_ids)
join t_test on Nat_TestID = T_TestNat_TestID and T_TestIsActive = 'Y'
join t_orderdetail on T_TestID = T_OrderDetailT_TestID
and T_OrderDetailIsActive = 'Y' and T_OrderDetailT_OrderHeaderID = ?
order by Nat_ReflexTestID, Nat_ReflexTestNat_RelationID desc";
$qry = $this->db->query($sql, [$headerID]);
if (!$qry) {
return [
"N",
"Error Get Reflex Test " . $this->db->error()["message"],
];
}
$rows = $qry->result_array();
$xnote = [];
$xnatcond = [];
foreach ($rows as $r) {
if (trim($r["T_OrderDetailResult"]) == "") {
continue;
}
$xConditionID = $r["Nat_ReflexTestNat_ConditionID"];
$xCondition = $r["Nat_ConditionName"];
if ($xConditionID == 1) {
//LOW
if ($r["T_OrderDetailMinValueInclusive"] == "Y") {
if (
$r["T_OrderDetailResult"] >= $r["T_OrderDetailMinValue"]
) {
return [
"N",
"{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}",
];
}
} else {
if (
$r["T_OrderDetailResult"] > $r["T_OrderDetailMinValue"]
) {
return [
"N",
"{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}",
];
}
}
$xnatcond_idx = $r["Nat_TestName"] . "-" . $xCondition;
if (!isset($xnatcond[$xnatcond_idx])) {
$xnote[] = "{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}";
$xnatcond[$xnatcond_idx] = true;
}
} elseif ($xConditionID == 2) {
//NORMAL
if (
$r["T_OrderDetailMaxValueInclusive"] == "Y" &&
$r["T_OrderDetailMinValueInclusive"] == "Y"
) {
if (
$r["T_OrderDetailResult"] >
$r["T_OrderDetailMaxValue"] &&
$r["T_OrderDetailResult"] < $r["T_OrderDetailMinValue"]
) {
return [
"N",
"{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}",
];
}
} elseif (
$r["T_OrderDetailMaxValueInclusive"] == "Y" &&
$r["T_OrderDetailMinValueInclusive"] == "N"
) {
if (
$r["T_OrderDetailResult"] >
$r["T_OrderDetailMaxValue"] &&
$r["T_OrderDetailResult"] <= $r["T_OrderDetailMinValue"]
) {
return [
"N",
"{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}",
];
}
} elseif (
$r["T_OrderDetailMaxValueInclusive"] == "N" &&
$r["T_OrderDetailMinValueInclusive"] == "N"
) {
if (
$r["T_OrderDetailResult"] >=
$r["T_OrderDetailMaxValue"] &&
$r["T_OrderDetailResult"] <= $r["T_OrderDetailMinValue"]
) {
return [
"N",
"{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}",
];
}
}
$xnatcond_idx = $r["Nat_TestName"] . "-" . $xCondition;
if (!isset($xnatcond[$xnatcond_idx])) {
$xnote[] = "{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}";
$xnatcond[$xnatcond_idx] = true;
}
} elseif ($xConditionID == 3) {
//HIGHT
if ($r["T_OrderDetailMaxValueInclusive"] == "Y") {
if (
$r["T_OrderDetailResult"] < $r["T_OrderDetailMaxValue"]
) {
return [
"N",
"{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}",
];
}
} else {
if (
$r["T_OrderDetailResult"] <= $r["T_OrderDetailMaxValue"]
) {
return [
"N",
"{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}",
];
}
}
$xnatcond_idx = $r["Nat_TestName"] . "-" . $xCondition;
if (!isset($xnatcond[$xnatcond_idx])) {
$xnote[] = "{$r["Nat_TestName"]} {$xCondition}, hasil: {$r["T_OrderDetailResult"]}, min: {$r["T_OrderDetailMinValue"]}, max: {$r["T_OrderDetailMaxValue"]}";
$xnatcond[$xnatcond_idx] = true;
}
} else {
return [
"N",
"Reflex Test $xCondition tidak terpenuhi. invalid conditionID $xConditionID",
];
}
}
return ["Y", implode("|", $xnote)];
}
function process()
{
$param = $this->get_param();
$ids = $param["ids"];
$this->db->trans_begin();
$is_update = "N";
if (isset($param["is_update"])) {
$is_update = $param["is_update"];
}
if ($ids == "") {
$this->reply(["Total Order" => 0]);
exit();
}
$arr_id = explode(",", $ids);
$tot_ok = 0;
$tot_not_ok = 0;
$tot_req = 0;
$tot_review_range = 0;
foreach ($arr_id as $id) {
$result = $this->calculate($id);
if ($result === false) {
$tot_not_ok++;
continue;
}
unset($result["image"]);
$qry = $this->db->insert("auto_valid", $result);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] .
"|" .
$this->db->last_query()
);
$this->db->trans_rollback();
exit();
}
if ($result["AutoValidHaveReq"] == "Y") {
$tot_req++;
continue;
}
if ($result["AutoValidIsReviewRange"] != "Y") {
$tot_review_range++;
continue;
}
if ($result["AutoValidIsOk"] == "Y") {
$tot_ok++;
continue;
}
$tot_not_ok++;
}
$this->db->trans_commit();
$this->reply([
"total" => count($arr_id),
"requirement" => $tot_req,
"ok" => $tot_ok,
"not_ok" => $tot_not_ok,
"review_range_not_ok" => $tot_review_range,
]);
}
function order_v2($date = "")
{
if ($date == "") {
$date = "2021-07-21";
}
$start_date = $date . " 00:00:01";
$end_date = $date . " 23:59:59";
$sql = "select
T_OrderHeaderID, T_OrderHeaderDate, T_OrderHeaderLabNumber,
group_concat(T_TestName) TestName,
group_concat(T_OrderDetailID) OrderID
from t_orderheader
join t_orderdetail on T_OrderHeaderDate >= ? and T_OrderHeaderDate < ?
and T_OrderHeaderID = T_OrderDetailT_OrderHeaderID
and T_OrderHeaderIsActive = 'Y'
and T_OrderDetailIsActive = 'Y'
and T_OrderDetailVerification = 'Y'
and T_OrderDetailID not in (
select AutoValidT_OrderDetailID
from auto_valid_v2
where AutoValidIsActive = 'Y'
)
join t_test on T_OrderDetailT_TestID = T_TestID
and T_TestIsResult = 'Y'
and T_TestNat_GroupID = 1
group by T_OrderHeaderID, T_OrderHeaderDate, T_OrderHeaderLabNumber
order by T_OrderHeaderID
limit 0,20
";
$qry = $this->db->query($sql, [$start_date, $end_date]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] . "\n|" . $this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
$this->reply($rows);
}
function order($date = "")
{
if ($date == "") {
$date = "2021-07-21";
}
$start_date = $date . " 00:00:01";
$end_date = $date . " 23:59:59";
$sql = "select
T_OrderHeaderID,T_OrderHeaderDate, T_OrderHeaderLabNumber,
T_TestName, T_OrderDetailID, T_OrderDetailVerDate, T_OrderDetailVerUserID,
T_OrderDetailResult, T_OrderDetailNat_NormalValueID, T_OrderDetailNat_MethodeID
from t_orderheader
join t_orderdetail on T_OrderHeaderDate >= ? and T_OrderHeaderDate < ?
and T_OrderHeaderID = T_OrderDetailT_OrderHeaderID
and T_OrderHeaderIsActive = 'Y'
and T_OrderDetailIsActive = 'Y'
and T_OrderDetailVerification = 'Y'
and T_OrderDetailID not in (
select AutoValidT_OrderDetailID
from auto_valid
where AutoValidIsActive = 'Y'
)
join t_test on T_OrderDetailT_TestID = T_TestID and T_TestIsResult = 'Y'
order by T_OrderHeaderID,T_TestSasCode
limit 0,100
";
$qry = $this->db->query($sql, [$start_date, $end_date]);
if (!$qry) {
$this->reply_error(
$this->db->error()["message"] . "\n|" . $this->db->last_query()
);
exit();
}
$rows = $qry->result_array();
$this->reply($rows);
}
function reply_error($message)
{
echo json_encode(["status" => "ERR", "message" => $message]);
}
function reply($data)
{
echo json_encode(["status" => "OK", "data" => $data]);
}
public function print_table_style()
{
echo "
";
}
public function print_table($rows, $keys)
{
$this->print_table_style();
echo "";
echo "";
foreach ($keys as $k) {
echo "| $k | ";
}
echo "
\n";
foreach ($rows as $r) {
if ($r["AutoValidIsOk"] == "Y") {
echo "";
} else {
echo "
";
}
foreach ($keys as $k) {
echo "| " . $r[$k] . " | ";
}
echo "
";
}
echo "
";
}
}