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

547 lines
20 KiB
PHP

<?php
class Mgmmcu extends MY_Controller
{
var $base_url;
function __construct()
{
parent::__construct();
$this->base_url = "/one-api/etl/mgmmcu";
$this->db->query("use one_etl");
}
function non_active_exist($orderHeaderID, $mgmMcuID, $type)
{
$sql = "UPDATE mgm_header SET Mgm_HeaderIsActive = 'N', Mgm_HeaderLastUpdated = NOW() WHERE Mgm_HeaderType = ? AND Mgm_HeaderMgm_McuID = ? AND Mgm_HeaderT_OrderHeaderID = ?";
$qry = $this->db->query($sql, [$type, $mgmMcuID, $orderHeaderID]);
//echo $this->db->last_query();
$sql = "UPDATE mgm_detail
JOIN mgm_header ON Mgm_DetailMgm_HeaderID = Mgm_HeaderID AND
Mgm_HeaderMgm_McuID = ? AND
Mgm_HeaderT_OrderHeaderID = ? AND
Mgm_HeaderIsActive = 'N'
SET Mgm_DetailIsActive = 'N',
Mgm_DetailLastUpdated = NOW()
WHERE
Mgm_DetailIsActive = 'Y'";
$qry = $this->db->query($sql, [$mgmMcuID, $orderHeaderID]);
//echo $this->db->last_query();
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" => "Error is active N | " . $this->db->error()["message"]
]);
exit;
}
return true;
}
function lab_kelainan($orderHeaderID, $mgmMcuID)
{
$this->non_active_exist($orderHeaderID, $mgmMcuID, 'L');
$sql = "select
T_OrderHeaderID,T_OrderHeaderLabNumber,
T_OrderHeaderLabNumberExt,
T_TestName, T_OrderDetailResult, T_OrderDetailNat_MethodeID,
T_OrderDetailNat_MethodeID, T_OrderDetailNat_MethodeName,
T_OrderDetailMinValue, T_OrderDetailMaxValue, T_OrderDetailMinValueInclusive,
T_OrderDetailMaxValueInclusive,
Mcu_SummaryLabValue,
Mcu_SummaryLabNat_MethodeID,
Mcu_SummaryLabWithMethode,
Mcu_SummaryLabType,
Mcu_SummaryLabIsNormalValue,
Mcu_KelainanID, Mcu_KelainanName, Mcu_KelainanClasification,
Nat_TestCode,
mcu_kelainangroup.*,
T_OrderHeaderM_PatientAge,
IFNULL(M_PatientKedudukan,'') M_PatientKedudukan,
M_SexCode
from one.t_orderdetail
join one.t_orderheader on T_OrderHeaderID = ?
and T_OrderHeaderID = T_OrderDetailT_OrderHeaderID
and T_OrderDetailIsActive = 'Y'
join one.m_patient on T_OrderHeaderM_PatientID = M_PatientID
join one.m_sex on M_PatientM_SexID = M_SexID
join one.t_test
on T_OrderDetailT_TestID = T_TestID
join one.nat_test ON T_TestNat_TestID = Nat_TestID
join mcu_summarylab on T_TestNat_TestID = Mcu_SummaryLabNat_TestID AND Mcu_SummaryLabIsActive = 'Y'
join mcu_kelainan on Mcu_SummaryLabMcu_KelainanID = Mcu_KelainanID
join mcu_kelainangroup on Mcu_KelainanMcu_KelainanGroupID = Mcu_KelainanGroupID";
$qry = $this->db->query($sql, [$orderHeaderID]);
//echo $this->db->last_query();
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" => "Error get order | " . $this->db->error()["message"]
]);
exit;
}
$rows = $qry->result_array();
$results = [];
foreach ($rows as $r) {
//loop dan cari kelainan
//Nat_TestID, WithMethode, terhadap NormalValue atau AdHoc Value
//rule penentuan
// print_r($r);
$sql = "SELECT COUNT(*) as cnt, Mgm_HeaderID
FROM mgm_header
WHERE
Mgm_HeaderMgm_McuID = ? AND
Mgm_HeaderT_OrderHeaderID = ? AND
Mgm_HeaderNat_TestCode = ? AND
Mgm_HeaderType = 'L' AND
Mgm_HeaderIsActive = 'Y'";
$query = $this->db->query($sql, array($mgmMcuID, $orderHeaderID, $r['Nat_TestCode']));
//echo $this->db->last_query();
$row_header_exist = $query->row_array();
$header_id = 0;
if ($row_header_exist['cnt'] == 0) {
$data_header = array(
'Mgm_HeaderMgm_McuID' => $mgmMcuID,
'Mgm_HeaderT_OrderHeaderID' => $orderHeaderID,
'Mgm_HeaderNat_TestCode' => $r['Nat_TestCode'],
'Mgm_HeaderType' => 'L',
'Mgm_HeaderCreated' => date("Y-m-d H:i:s", time()),
'Mgm_HeaderT_OrderHeaderM_PatientAge' => $r['T_OrderHeaderM_PatientAge'],
'Mgm_HeaderM_PatientLocation' => $r['M_PatientKedudukan'],
'Mgm_HeaderM_SexCode' => $r['M_SexCode']
);
$this->db->insert('mgm_header', $data_header);
//echo $this->db->last_query();
$header_id = $this->db->insert_id();
}
$result_value = $r['T_OrderDetailResult'];
$value_comparison = 0;
//echo $r['Mcu_SummaryLabIsNormalValue'];
$kelainan = [];
$notavailable = [];
if (trim($result_value) == 'NA') {
$notavailable = $r;
} elseif ($r['Mcu_SummaryLabIsNormalValue'] == 'Y') {
if ($r['Mcu_SummaryLabType'] == '<' || $r['Mcu_SummaryLabType'] == '<=') {
$value_comparison = $r['T_OrderDetailMinValue'];
}
if ($r['Mcu_SummaryLabType'] == '>' || $r['Mcu_SummaryLabType'] == '>=') {
$value_comparison = $r['T_OrderDetailMaxValue'];
}
//echo "Y";
if ($r['Mcu_SummaryLabWithMethode'] == 'N' && $this->dynamic_comparison($result_value, $r['Mcu_SummaryLabType'], $value_comparison)) {
//echo $r['T_TestName']." : ".$r['Mcu_KelainanName'].", ";
$kelainan = $r;
$results[] = array('test' => $r['T_TestName'], 'nat_test' => $r['Nat_TestCode'], 'kelainan' => $r['Mcu_KelainanName']);
}
} else {
$value_comparison = $r['Mcu_SummaryLabValue'];
if ($r['Mcu_SummaryLabType'] == '!=' || $r['Mcu_SummaryLabType'] == '==') {
if ($this->dynamic_comparison($result_value, $r['Mcu_SummaryLabType'], $value_comparison)) {
//echo $r['T_TestName']." : ".$r['Mcu_KelainanName'].", ";
$kelainan = $r;
$results[] = array('test' => $r['T_TestName'], 'nat_test' => $r['Nat_TestCode'], 'kelainan' => $r['Mcu_KelainanName']);
}
} else {
if (is_numeric($result_value) && $this->dynamic_comparison($result_value, $r['Mcu_SummaryLabType'], $value_comparison)) {
//echo $r['T_TestName']." : ".$r['Mcu_KelainanName'].", ";
$kelainan = $r;
$results[] = array('test' => $r['T_TestName'], 'nat_test' => $r['Nat_TestCode'], 'kelainan' => $r['Mcu_KelainanName']);
}
}
}
$kelainan_id = 0;
$group_kelainan_id = 0;
if (count($notavailable) > 0) {
$kelainan_id = -1;
} elseif (count($kelainan) > 0) {
$kelainan_id = $r['Mcu_KelainanID'];
$group_kelainan_id = $r['Mcu_KelainanGroupID'];
}
if ($kelainan_id > 0) {
$sql = "UPDATE mgm_header SET Mgm_HeaderIsNormal = 'N', Mgm_HeaderLastUpdated = NOW() WHERE Mgm_HeaderID = ?";
$query = $this->db->query($sql, array($header_id));
$sql = "SELECT COUNT(*) as cnt, Mgm_DetailID
FROM mgm_detail
WHERE
Mgm_DetailMgm_HeaderID = ? AND
Mgm_DetailMcu_KelainanID = ? AND
Mgm_DetailIsActive = 'Y'";
$query = $this->db->query($sql, array($header_id, $kelainan_id));
//echo $this->db->last_query();
$row_exist = $query->row_array();
if ($row_exist['cnt'] == 0) {
$data = array(
'Mgm_DetailMgm_HeaderID' => $header_id,
'Mgm_DetailMcu_KelainanID' => $kelainan_id,
'Mgm_DetailMcu_KelainanGroupID' => $group_kelainan_id,
'Mgm_DetailCreated' => date("Y-m-d H:i:s", time())
);
$this->db->insert('mgm_detail', $data);
//echo $this->db->last_query();
} else {
$data = array(
'Mgm_DetailMgm_HeaderID' => $header_id,
'Mgm_DetailMcu_KelainanID' => $kelainan_id,
'Mgm_DetailMcu_KelainanGroupID' => $group_kelainan_id,
'Mgm_DetailIsActive' => 'Y',
'Mgm_DetailLastUpdated' => date("Y-m-d H:i:s", time())
);
$this->db->where('Mgm_DetailID', $row_exist['Mgm_DetailID']);
$this->db->update('mgm_detail', $data);
}
} else {
if ($kelainan_id == -1) {
$sql = "UPDATE mgm_header SET Mgm_HeaderIsNormal = 'X', Mgm_HeaderLastUpdated = NOW() WHERE Mgm_HeaderID = ?";
$query = $this->db->query($sql, array($header_id));
}
}
}
$sql = "UPDATE mcu_order SET
Mcu_OrderStatusLab = 'Y',
Mcu_OrderLastUpdated = NOW(),
Mcu_OrderStatusLabDateTime = NOW()
WHERE Mcu_OrderMgm_McuID = ? AND Mcu_OrderT_OrderHeaderID = ?";
$qry = $this->db->query($sql, [$mgmMcuID, $orderHeaderID]);
$this->statusDone($mgmMcuID, $orderHeaderID);
//echo json_encode($results);
//return $results;
}
function nonlab_kelainan($orderHeaderID, $mgmMcuID)
{
$this->non_active_exist($orderHeaderID, $mgmMcuID, 'NL');
$sql = "SELECT Nat_TestID,
Nat_TestCode,
T_TestName,
So_ResultEntryCategoryResultValue,
IFNULL(Mcu_SummaryNonlabMcu_KelainanID,0) as Mcu_SummaryNonlabMcu_KelainanID,
IFNULL(Mcu_KelainanGroupID,0) as Mcu_KelainanGroupID,
T_OrderHeaderM_PatientAge,
IFNULL(M_PatientKedudukan,'') M_PatientKedudukan,
M_SexCode
FROM one.so_resultentry_category_result
JOIN one.so_resultentry ON So_ResultEntryCategoryResultSo_ResultEntryID = So_ResultEntryID AND
So_ResultEntryT_OrderHeaderID = ?
JOIN one.t_orderheader ON T_OrderHeaderID = So_ResultEntryT_OrderHeaderID
JOIN one.t_orderdetail ON T_OrderDetailID = SO_ResultENtryT_OrderDetailID AND T_OrderDetailIsActive = 'Y'
join one.m_patient on T_OrderHeaderM_PatientID = M_PatientID
join one.m_sex on M_PatientM_SexID = M_SexID
JOIN one.t_test ON T_TestID = T_OrderDetailT_TestID
JOIN one.nat_test ON T_TestNat_TestID = Nat_TestID
JOIN mcu_summarynonlab ON Mcu_SummaryNonlabNat_TestID = Nat_TestID AND
FIND_IN_SET(So_ResultEntryCategoryResultValue,Mcu_SummaryNonlabValue) <> 0
LEFT JOIN mcu_kelainan ON Mcu_SummaryNonlabMcu_KelainanID = Mcu_KelainanID
LEFT JOIN mcu_kelainangroup ON Mcu_KelainanMcu_KelainanGroupID = Mcu_KelainanGroupID
WHERE
So_ResultEntryCategoryResultIsActive = 'Y'
GROUP BY So_ResultEntryCategoryResultID";
$query = $this->db->query($sql, array($orderHeaderID));
// echo $this->db->last_query();
$datas = $query->result_array();
$header_id = 0;
foreach ($datas as $key => $value) {
$sql = "SELECT COUNT(*) as cnt, Mgm_HeaderID
FROM mgm_header
WHERE
Mgm_HeaderT_OrderHeaderID = ? AND
Mgm_HeaderMgm_McuID = ? AND
Mgm_HeaderNat_TestCode = ? AND
Mgm_HeaderIsActive = 'Y'";
$query = $this->db->query($sql, array($orderHeaderID, $mgmMcuID, $value['Nat_TestCode']));
$exist_data = $query->row_array();
//print_r($exist_data);
if ($exist_data['cnt'] == 0) {
$data_header = array(
'Mgm_HeaderMgm_McuID' => $mgmMcuID,
'Mgm_HeaderT_OrderHeaderID' => $orderHeaderID,
'Mgm_HeaderNat_TestCode' => $value['Nat_TestCode'],
'Mgm_HeaderType' => 'NL',
'Mgm_HeaderCreated' => date("Y-m-d H:i:s", time()),
'Mgm_HeaderT_OrderHeaderM_PatientAge' => $value['T_OrderHeaderM_PatientAge'],
'Mgm_HeaderM_PatientLocation' => $value['M_PatientKedudukan'],
'Mgm_HeaderM_SexCode' => $value['M_SexCode']
);
$this->db->insert('mgm_header', $data_header);
// echo $this->db->last_query();
$header_id = $this->db->insert_id();
} else {
$header_id = $exist_data['Mgm_HeaderID'];
}
$kelainan_id = $value['Mcu_SummaryNonlabMcu_KelainanID'];
//echo $kelainan_id;
if ($kelainan_id > 0) {
$sql = "SELECT COUNT(*) as cnt, Mgm_DetailID
FROM mgm_detail
WHERE
Mgm_DetailMgm_HeaderID = ? AND
Mgm_DetailMcu_KelainanID = ? AND
Mgm_DetailIsActive = 'Y'";
$query = $this->db->query($sql, array($header_id, $kelainan_id));
//echo $this->db->last_query();
$row_exist = $query->row_array();
//print_r($row_exist);
if ($row_exist['cnt'] == 0) {
$data = array(
'Mgm_DetailMgm_HeaderID' => $header_id,
'Mgm_DetailMcu_KelainanID' => $kelainan_id,
'Mgm_DetailMcu_KelainanGroupID' => $value['Mcu_KelainanGroupID'],
'Mgm_DetailCreated' => date("Y-m-d H:i:s", time())
);
$this->db->insert('mgm_detail', $data);
//echo $this->db->last_query();
} else {
$data = array(
'Mgm_DetailMgm_HeaderID' => $header_id,
'Mgm_DetailMcu_KelainanID' => $kelainan_id,
'Mgm_DetailMcu_KelainanGroupID' => $value['Mcu_KelainanGroupID'],
'Mgm_DetailIsActive' => 'Y',
'Mgm_DetailLastUpdated' => date("Y-m-d H:i:s", time())
);
$this->db->where('Mgm_DetailID', $row_exist['Mgm_DetailID']);
$this->db->update('mgm_detail', $data);
}
}
$sql = "UPDATE mgm_header SET Mgm_HeaderIsNormal = 'N', Mgm_HeaderLastUpdated = NOW() WHERE Mgm_HeaderID = ?";
$query = $this->db->query($sql, array($header_id));
}
$sql = "UPDATE mcu_order
SET Mcu_OrderStatusNonLab = 'Y',
Mcu_OrderLastUpdated = NOW(),
Mcu_OrderStatusNonLabDateTime = NOW()
WHERE Mcu_OrderMgm_McuID = ? AND Mcu_OrderT_OrderHeaderID = ?";
$qry = $this->db->query($sql, [$mgmMcuID, $orderHeaderID]);
$this->statusDone($mgmMcuID, $orderHeaderID);
//echo json_encode($results);
// echo json_encode(["status" => "OK", "message" => ""]);
}
function dynamic_comparison($varleft, $op, $varright)
{
switch ($op) {
case "=":
return $varleft == $varright;
case "!=":
return $varleft != $varright;
case ">=":
return $varleft >= $varright;
case "<=":
return $varleft <= $varright;
case ">":
return $varleft > $varright;
case "<":
return $varleft < $varright;
default:
return true;
}
}
function generate_kelainan_lab($Mgm_McuID, $orderHeaderID)
{
// Mcu_OrderStatusFisik
$sql = "SELECT * FROM one_etl.mcu_order WHERE Mcu_OrderMgm_McuID = ? AND Mcu_OrderT_OrderHeaderID = ?";
$qry = $this->db->query(
$sql,
[$Mgm_McuID, $orderHeaderID]
);
if (!$qry) {
// echo "Error :" . $this->db->error()["message"];
// echo $this->db->last_query();
$this->sys_error_db("Error cek mcu order riwayat");
exit;
}
$cek = $qry->result_array();
if (count($cek) > 0) {
if ($cek[0]['Mcu_OrderStatusLab'] == 'Y') {
$this->statusDone($Mgm_McuID, $orderHeaderID);
$this->sys_ok('Already generated');
exit;
}
}
$this->lab_kelainan($orderHeaderID, $Mgm_McuID);
echo json_encode(["status" => "OK", "message" => "Success"]);
}
function generate_kelainan_nonlab($Mgm_McuID, $orderHeaderID)
{
// Mcu_OrderStatusFisik
$sql = "SELECT * FROM one_etl.mcu_order WHERE Mcu_OrderMgm_McuID = ? AND Mcu_OrderT_OrderHeaderID = ?";
$qry = $this->db->query(
$sql,
[$Mgm_McuID, $orderHeaderID]
);
if (!$qry) {
// echo "Error :" . $this->db->error()["message"];
// echo $this->db->last_query();
$this->sys_error_db("Error cek mcu order riwayat");
exit;
}
$cek = $qry->result_array();
if (count($cek) > 0) {
if ($cek[0]['Mcu_OrderStatusNonLab'] == 'Y') {
$this->statusDone($Mgm_McuID, $orderHeaderID);
$this->sys_ok('Already generated');
exit;
}
}
$this->nonlab_kelainan($orderHeaderID, $Mgm_McuID);
echo json_encode(["status" => "OK", "message" => "Success"]);
}
function populate_order($mgmMouID)
{
// $sql = "select Mgm_McuStartDate,Mgm_McuEndDate
// from mgm_mcu
// where Mgm_McuID = ?";
$sql = "
select Mgm_McuID Mcu_OrderMgm_McuID,
T_OrderHeaderID Mcu_OrderT_OrderHeaderID
from mgm_mcu
join mgm_mou on Mgm_McuID = ?
and Mgm_McuID = Mgm_MouMgm_McuID
and Mgm_McuIsActive = 'Y'
and Mgm_MouIsActive = 'Y'
join one.t_orderheader on
T_OrderHeaderM_MouID = Mgm_MouM_MouID
and T_OrderHeaderDate >= Mgm_McuStartDate
and T_OrderHeaderDate <= Mgm_McuEndDate
and T_OrderHeaderIsActive = 'Y'
and T_OrderHeaderID not in (
select Mcu_OrderT_OrderHeaderID
from mcu_order
where Mcu_OrderMgm_McuID = ?
)";
$qry = $this->db->query($sql, [$mgmMouID, $mgmMouID]);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" => "Error get mgm_mcu $mgmMouID | " . $this->db->error()["message"]
]);
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
echo json_encode([
"status" => "OK",
"message" => "No Pending Order",
]);
exit;
}
// $this->db->trans_begin();
$qry = $this->db->insert_batch("mcu_order", $rows);
if (!$qry) {
echo json_encode([
"status" => "ERR",
"message" => "Error batch insert | " . $this->db->error()["message"]
]);
// $this->db->trans_rollback();
exit;
}
// $this->db->trans_commit();
echo json_encode(["status" => "OK", "message" => count($rows) . " inserted. "]);
}
// helper function
// post
// get
// insert_or_update
function post($service, $data)
{
$xbase_url = $this->base_url;
$url = $xbase_url . "$service";
$ch = curl_init($url);
$payload = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
$data_rst = json_decode($result);
return $data_rst;
}
function get($service, $debug = "")
{
$xbase_url = $this->base_url;
$url = $xbase_url . "$service";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
if ($debug != "") {
echo "url : $url \n";
print_r($result);
}
$data_rst = json_decode($result);
return $data_rst;
}
function statusDone($Mgm_McuID, $orderHeaderID)
{
$sql = "SELECT
Mcu_OrderStatusLab,
Mcu_OrderStatusNonLab,
Mcu_OrderStatusFisik,
Mcu_OrderStatusRiwayat,
Mcu_OrderStatusFitness
FROM one_etl.mcu_order
WHERE Mcu_OrderT_OrderHeaderID = ?
AND Mcu_OrderMgm_McuID = ?";
$qry = $this->db->query($sql, array(
$orderHeaderID,
$Mgm_McuID
));
if (!$qry) {
$this->sys_error_db("Update status done", $this->db);
exit;
}
$cek = $qry->result_array();
if (count($cek) > 0) {
$data = $cek[0];
if (
$data['Mcu_OrderStatusLab'] == 'Y'
&& $data['Mcu_OrderStatusNonLab'] == 'Y'
&& $data['Mcu_OrderStatusFisik'] == 'Y'
&& $data['Mcu_OrderStatusRiwayat'] == 'Y'
&& $data['Mcu_OrderStatusFitness'] == 'Y'
) {
$sql = "UPDATE one_etl.mcu_order
SET Mcu_OrderStatus = 'Y',
Mcu_OrderLastUpdated = NOW()
WHERE Mcu_OrderT_OrderHeaderID = ?
AND Mcu_OrderMgm_McuID = ?";
$qry = $this->db->query($sql, array(
$orderHeaderID,
$Mgm_McuID
));
if (!$qry) {
$this->sys_error_db("Update status done", $this->db);
exit;
}
}
}
}
}