db_onedev = $this->load->database("onedev", true); } private function _check_is_supervisor() { $prm = $this->sys_input; $userid = 0; if (isset($this->sys_user['M_UserID'])) { $userid = $this->sys_user['M_UserID']; } elseif (isset($this->sys_user['id'])) { $userid = $this->sys_user['id']; } elseif (isset($prm['token'])) { $token_parts = explode('.', $prm['token']); if (count($token_parts) == 3) { $payload = json_decode(base64_decode($token_parts[1]), true); if (isset($payload['M_UserID'])) { $userid = $payload['M_UserID']; } } } if ($userid > 0) { $sql_check = "SELECT ug.M_UserGroupName FROM m_user u LEFT JOIN m_usergroup ug ON u.M_UserM_UserGroupID = ug.M_UserGroupID WHERE u.M_UserID = {$userid} LIMIT 1"; $group = $this->db_onedev->query($sql_check)->row_array(); if ($group && stripos($group['M_UserGroupName'], 'supervisor') !== false) { $this->sys_error("Akses Ditolak: Supervisor tidak diizinkan melihat rincian detail timeline."); exit; } } } function bckp_search() { $prm = $this->sys_input; if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $search = $prm["search"]; $companyid = isset($prm["companyid"])?$prm["companyid"]:0; if(!isset($prm['current_page'])) $prm['current_page'] = 1; $number_limit = 15; $number_offset = ($prm['current_page'] - 1) * $number_limit ; $sql_where = ""; if ($search != "") { $prm['current_page'] = 1; $sql_where = " AND ( T_OrderHeaderLabNumberExt like '%{$search}%' OR T_OrderHeaderLabNumber like '%{$search}%' OR M_PatientName like '%{$search}%' ) "; } $filter_company = ""; if($companyid != 0 ){ $filter_company = " AND T_OrderHeaderM_CompanyID = {$companyid}"; } $sql = " SELECT COUNT(*) as total FROM ( SELECT '' as xno, T_OrderHeaderID as xid, DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y') as order_date, T_OrderHeaderLabNumber as no_reg, CONCAT(M_TitleName,' ',M_PatientName) as patient_name, M_CompanyName as company_name, M_MouName as mou_name, T_OrderHeaderIsCito as status_cito, GROUP_CONCAT(DISTINCT DATE_FORMAT(T_OrderPromiseDateTime, '%d-%m-%Y %H:%m') ORDER BY T_OrderPromiseDateTime ASC) as order_promise, '' as details_order, '' as details_sampling, '' as details_verifications, '' as details_process, '' as details_result_verification, '' as details_result_validation, '' as details_print, T_OrderHeaderLabNumberExt as no_reg_ext FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND T_OrderPromiseIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderPromiseDateTime) = '{$prm['xdate']}' $sql_where GROUP BY T_OrderHeaderID UNION SELECT '' as xno, T_OrderHeaderID as xid, DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y') as order_date, T_OrderHeaderLabNumber as no_reg, CONCAT(M_TitleName,' ',M_PatientName) as patient_name, M_CompanyName as company_name, M_MouName as mou_name, T_OrderHeaderIsCito as status_cito, GROUP_CONCAT(DISTINCT DATE_FORMAT(T_OrderPromiseDateTime, '%d-%m-%Y %H:%m') ORDER BY T_OrderPromiseDateTime ASC) as order_promise, '' as details_order, '' as details_sampling, '' as details_verifications, '' as details_process, '' as details_result_verification, '' as details_result_validation, '' as details_print, T_OrderHeaderLabNumberExt as no_reg_ext FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID LEFT JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND T_OrderPromiseIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderHeaderDate) = '{$prm['xdate']}' $sql_where GROUP BY T_OrderHeaderID )x "; //echo $sql; $query = $this->db_onedev->query($sql); $tot_count = 0; $tot_page = 0; if ($query) { $tot_count = $query->result_array()[0]["total"]; $tot_page = ceil($tot_count/$number_limit); } else { $this->sys_error_db("t_samplestorageout count", $this->db_onedev); exit; } $sql = " SELECT * FROM ( SELECT '' as xno, T_OrderHeaderID as xid, DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y %H:%i') as order_date, T_OrderHeaderLabNumber as no_reg, CONCAT(M_TitleName,' ',M_PatientName) as patient_name, M_CompanyName as company_name, M_MouName as mou_name, T_OrderHeaderIsCito as status_cito, GROUP_CONCAT(DISTINCT DATE_FORMAT(T_OrderPromiseDateTime, '%d-%m-%Y %H:%i') ORDER BY T_OrderPromiseDateTime ASC) as order_promise, '' as details_order, '' as details_sampling, '' as details_verifications, '' as details_process, '' as details_result_verification, '' as details_result_validation, '' as details_print, T_OrderHeaderLabNumberExt as no_reg_ext FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND T_OrderPromiseIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderPromiseDateTime) = '{$prm['xdate']}' $sql_where GROUP BY T_OrderHeaderID UNION SELECT '' as xno, T_OrderHeaderID as xid, DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y %H:%i') as order_date, T_OrderHeaderLabNumber as no_reg, CONCAT(M_TitleName,' ',M_PatientName) as patient_name, M_CompanyName as company_name, M_MouName as mou_name, T_OrderHeaderIsCito as status_cito, GROUP_CONCAT(DISTINCT DATE_FORMAT(T_OrderPromiseDateTime, '%d-%m-%Y %H:%i') ORDER BY T_OrderPromiseDateTime ASC) as order_promise, '' as details_order, '' as details_sampling, '' as details_verifications, '' as details_process, '' as details_result_verification, '' as details_result_validation, '' as details_print, T_OrderHeaderLabNumberExt as no_reg_ext FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID LEFT JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND T_OrderPromiseIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderHeaderDate) = '{$prm['xdate']}' $sql_where GROUP BY T_OrderHeaderID )x ORDER BY xid ASC limit $number_limit offset $number_offset "; //echo $sql; $query = $this->db_onedev->query($sql); $rows = $query->result_array(); if($rows){ $no = 1; foreach($rows as $k => $v){ $xno = ($k + 1) + $number_offset; $rows[$k]['xno'] = $xno; //print_r($v); $sql = "SELECT GROUP_CONCAT(DISTINCT T_OrderDetailID SEPARATOR ',') as ids, Group_ResultName as group_name, Group_ResultID as group_id, Group_ResultFlagNonLab as flag_nonlab, '' as status FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailIsActive = 'Y' GROUP BY Group_ResultID UNION SELECT T_OrderDetailID as xid, T_TestName as group_name, Group_ResultID as group_id, Group_ResultFlagNonLab as flag_nonlab, '' as status FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'Y' WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailIsActive = 'Y' GROUP BY T_OrderDetailT_TestID; "; //echo $sql; $details = $this->db_onedev->query($sql)->result_array(); $details_order = $details; foreach($details_order as $i => $j){ $details_order[$i]['status'] = 'N'; $sql = "SELECT fn_patient_status_order({$v['xid']}) as status"; $query = $this->db_onedev->query($sql)->row(); //echo $this->db_onedev->last_query(); if($query){ $details_order[$i]['status'] = $query->status; } } $rows[$k]['details_order'] = $details_order; $details_sampling = $details; foreach($details_sampling as $i => $j){ $details_sampling[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ if($j['flag_nonlab'] == 'N'){ $sql = "SELECT fn_patient_status_get_sampling_lab({$v['xid']},'{$j['ids']}') as status"; } else{ $sql = "SELECT fn_patient_status_get_sampling_non_lab({$v['xid']},'{$j['ids']}') as status"; } $query = $this->db_onedev->query($sql)->row(); //echo $this->db_onedev->last_query(); if($query){ $details_sampling[$i]['status'] = $query->status; } } else{ $details_sampling[$i]['status'] = 'N'; } } $rows[$k]['details_sampling'] = $details_sampling; $details_verifications = $details; foreach($details_verifications as $i => $j){ $details_verifications[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ if($j['flag_nonlab'] == 'N'){ $sql = "SELECT fn_patient_status_get_sample_verification_lab({$v['xid']},'{$j['ids']}') as status"; //echo $sql; } else{ $sql = "SELECT fn_patient_status_get_sample_verification_non_lab({$v['xid']},'{$j['ids']}') as status"; } $query = $this->db_onedev->query($sql)->row(); //echo $this->db_onedev->last_query(); if($query){ $details_verifications[$i]['status'] = $query->status; } } else{ $details_verifications[$i]['status'] = 'N'; } } $rows[$k]['details_verifications'] = $details_verifications; $details_process = $details; foreach($details_process as $i => $j){ $details_process[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ if($j['flag_nonlab'] == 'N'){ $sql = "SELECT fn_patient_status_get_process_lab({$v['xid']},'{$j['ids']}') as status"; } else{ $sql = "SELECT fn_patient_status_get_process_non_lab({$v['xid']},'{$j['ids']}') as status"; } $query = $this->db_onedev->query($sql)->row(); //echo $this->db_onedev->last_query(); if($query){ $details_process[$i]['status'] = $query->status; } } else{ $details_process[$i]['status'] = 'N'; } } $rows[$k]['details_process'] = $details_process; $details_result_verification = $details; foreach($details_result_verification as $i => $j){ $details_result_verification[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ $sql = "SELECT fn_patient_status_get_result_verification({$v['xid']},'{$j['ids']}') as status"; $query = $this->db_onedev->query($sql)->row(); //echo $this->db_onedev->last_query(); if($query){ $details_result_verification[$i]['status'] = $query->status; } } else{ $details_result_verification[$i]['status'] = 'N'; } } $rows[$k]['details_result_verification'] = $details_result_verification; $details_result_validation = $details; foreach($details_result_validation as $i => $j){ $details_result_validation[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ $sql = "SELECT fn_patient_status_get_result_validation({$v['xid']},'{$j['ids']}') as status"; $query = $this->db_onedev->query($sql)->row(); //echo $this->db_onedev->last_query(); if($query){ $details_result_validation[$i]['status'] = $query->status; } } else{ $details_result_validation[$i]['status'] = 'N'; } } $rows[$k]['details_result_validation'] = $details_result_validation; $details_print = $details; foreach($details_print as $i => $j){ $details_print[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ $sql = "SELECT fn_patient_status_get_result_print({$v['xid']},'{$j['ids']}') as status"; $query = $this->db_onedev->query($sql)->row(); //echo $this->db_onedev->last_query(); if($query){ $details_print[$i]['status'] = $query->status; } } else{ $details_print[$i]['status'] = 'N'; } } $rows[$k]['details_print'] = $details_print; } } $result = array("total" => $tot_page,"total_all"=>$tot_count, "records" => $rows, "sql"=> ''); $this->sys_ok($result); exit; } function search() { $prm = $this->sys_input; if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $search = $prm["search"]; $companyid = isset($prm["companyid"])?$prm["companyid"]:0; if(!isset($prm['current_page'])) $prm['current_page'] = 1; $number_limit = 15; $number_offset = ($prm['current_page'] - 1) * $number_limit; $sql_where = ""; if ($search != "") { $prm['current_page'] = 1; $sql_where = " AND ( T_OrderHeaderLabNumberExt like '%{$search}%' OR T_OrderHeaderLabNumber like '%{$search}%' OR M_PatientName like '%{$search}%' ) "; } $filter_company = ""; if($companyid != 0){ $filter_company = " AND T_OrderHeaderM_CompanyID = {$companyid}"; } $sql = "SELECT COUNT(*) as total FROM ( SELECT '' as xno, T_OrderHeaderID as xid, DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y') as order_date, T_OrderHeaderLabNumber as no_reg, CONCAT(M_TitleName,' ',M_PatientName) as patient_name, M_CompanyName as company_name, M_MouName as mou_name, T_OrderHeaderIsCito as status_cito, GROUP_CONCAT(DISTINCT DATE_FORMAT(T_OrderPromiseDateTime, '%d-%m-%Y %H:%m') ORDER BY T_OrderPromiseDateTime ASC) as order_promise, '' as details_order, '' as details_sampling, '' as details_verifications, '' as details_process, '' as details_result_verification, '' as details_result_validation, '' as details_print, T_OrderHeaderLabNumberExt as no_reg_ext FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND T_OrderPromiseIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderPromiseDateTime) = '{$prm['xdate']}' $sql_where GROUP BY T_OrderHeaderID UNION SELECT '' as xno, T_OrderHeaderID as xid, DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y') as order_date, T_OrderHeaderLabNumber as no_reg, CONCAT(M_TitleName,' ',M_PatientName) as patient_name, M_CompanyName as company_name, M_MouName as mou_name, T_OrderHeaderIsCito as status_cito, GROUP_CONCAT(DISTINCT DATE_FORMAT(T_OrderPromiseDateTime, '%d-%m-%Y %H:%m') ORDER BY T_OrderPromiseDateTime ASC) as order_promise, '' as details_order, '' as details_sampling, '' as details_verifications, '' as details_process, '' as details_result_verification, '' as details_result_validation, '' as details_print, T_OrderHeaderLabNumberExt as no_reg_ext FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID LEFT JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND T_OrderPromiseIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderHeaderDate) = '{$prm['xdate']}' $sql_where GROUP BY T_OrderHeaderID )x"; $query = $this->db_onedev->query($sql); $tot_count = 0; $tot_page = 0; if ($query) { $tot_count = $query->result_array()[0]["total"]; $tot_page = ceil($tot_count/$number_limit); } else { $this->sys_error_db("t_samplestorageout count", $this->db_onedev); exit; } $sql = "SELECT * FROM ( SELECT '' as xno, T_OrderHeaderID as xid, DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y %H:%i') as order_date, T_OrderHeaderLabNumber as no_reg, CONCAT(M_TitleName,' ',M_PatientName) as patient_name, M_CompanyName as company_name, M_MouName as mou_name, T_OrderHeaderIsCito as status_cito, GROUP_CONCAT(DISTINCT DATE_FORMAT(T_OrderPromiseDateTime, '%d-%m-%Y %H:%i') ORDER BY T_OrderPromiseDateTime ASC) as order_promise, '' as details_order, '' as details_sampling, '' as details_verifications, '' as details_process, '' as details_result_verification, '' as details_result_validation, '' as details_print, T_OrderHeaderLabNumberExt as no_reg_ext FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND T_OrderPromiseIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderPromiseDateTime) = '{$prm['xdate']}' $sql_where GROUP BY T_OrderHeaderID UNION SELECT '' as xno, T_OrderHeaderID as xid, DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y %H:%i') as order_date, T_OrderHeaderLabNumber as no_reg, CONCAT(M_TitleName,' ',M_PatientName) as patient_name, M_CompanyName as company_name, M_MouName as mou_name, T_OrderHeaderIsCito as status_cito, GROUP_CONCAT(DISTINCT DATE_FORMAT(T_OrderPromiseDateTime, '%d-%m-%Y %H:%i') ORDER BY T_OrderPromiseDateTime ASC) as order_promise, '' as details_order, '' as details_sampling, '' as details_verifications, '' as details_process, '' as details_result_verification, '' as details_result_validation, '' as details_print, T_OrderHeaderLabNumberExt as no_reg_ext FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID LEFT JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND T_OrderPromiseIsActive = 'Y' LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID WHERE T_OrderHeaderIsActive = 'Y' AND DATE(T_OrderHeaderDate) = '{$prm['xdate']}' $sql_where GROUP BY T_OrderHeaderID )x ORDER BY xid ASC limit $number_limit offset $number_offset"; $query = $this->db_onedev->query($sql); $rows = $query->result_array(); if($rows){ foreach($rows as $k => $v){ $xno = ($k + 1) + $number_offset; $rows[$k]['xno'] = $xno; $sql = "SELECT GROUP_CONCAT(DISTINCT T_OrderDetailID SEPARATOR ',') as ids, Group_ResultName as group_name, Group_ResultID as group_id, Group_ResultFlagNonLab as flag_nonlab, '' as status FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailIsActive = 'Y' GROUP BY Group_ResultID UNION SELECT T_OrderDetailID as xid, T_TestName as group_name, Group_ResultID as group_id, Group_ResultFlagNonLab as flag_nonlab, '' as status FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'Y' WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailIsActive = 'Y' GROUP BY T_OrderDetailT_TestID"; $details = $this->db_onedev->query($sql)->result_array(); // DETAILS ORDER $details_order = $details; foreach($details_order as $i => $j){ $details_order[$i]['status'] = 'N'; $sql = "SELECT fn_patient_status_order({$v['xid']}) as status"; $query = $this->db_onedev->query($sql)->row(); if($query){ $details_order[$i]['status'] = $query->status; } } $rows[$k]['details_order'] = $details_order; // DETAILS SAMPLING $details_sampling = $details; foreach($details_sampling as $i => $j){ $details_sampling[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ $count_all = 0; $count_done = 0; if($j['flag_nonlab'] == 'N'){ $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderSampleID FROM t_ordersample JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderSampleT_OrderHeaderID JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN t_barcodelab ON T_BarcodeLabT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_OrderSampleT_BarcodeLabID = T_BarcodeLabID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderSampleT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderSampleID ) x_all"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderSampleID FROM t_ordersample JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderSampleT_OrderHeaderID JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN t_barcodelab ON T_BarcodeLabT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_OrderSampleT_BarcodeLabID = T_BarcodeLabID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderSampleT_OrderHeaderID = {$v['xid']} AND T_OrderSampleReceive = 'Y' GROUP BY T_OrderSampleID ) x_done"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } else{ $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderDetailID ) x_all"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$j['group_id']} JOIN t_samplingso ON T_OrderDetailT_OrderHeaderID = T_SamplingSoT_OrderHeaderID AND T_SamplingSoT_TestID = T_OrderDetailT_TestID AND T_SamplingSoDoneDate IS NOT NULL WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderDetailID ) x_done"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } $status = 'N'; if(intval($count_all) > 0 && intval($count_all) == intval($count_done)) $status = 'Y'; else if(intval($count_all) > intval($count_done) && intval($count_done) > 0) $status = 'P'; $details_sampling[$i]['status'] = $status; } else{ $details_sampling[$i]['status'] = 'N'; } } $rows[$k]['details_sampling'] = $details_sampling; // DETAILS VERIFICATIONS $details_verifications = $details; foreach($details_verifications as $i => $j){ $details_verifications[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ $count_all = 0; $count_done = 0; if($j['flag_nonlab'] == 'N'){ $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderSampleID FROM t_ordersample JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderSampleT_OrderHeaderID JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN t_barcodelab ON T_BarcodeLabT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_OrderSampleT_BarcodeLabID = T_BarcodeLabID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderSampleT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderSampleID ) x_all"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderSampleID FROM t_ordersample JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderSampleT_OrderHeaderID JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN t_barcodelab ON T_BarcodeLabT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_OrderSampleT_BarcodeLabID = T_BarcodeLabID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderSampleT_OrderHeaderID = {$v['xid']} AND T_OrderSampleVerification = 'Y' GROUP BY T_OrderSampleID ) x_done"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } else{ $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderDetailID ) x_all"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$j['group_id']} JOIN t_samplingso ON T_OrderDetailT_OrderHeaderID = T_SamplingSoT_OrderHeaderID AND T_SamplingSoT_TestID = T_OrderDetailT_TestID AND T_SamplingSoVerifyDate IS NOT NULL WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderDetailID ) x_done"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } $status = 'N'; if(intval($count_all) > 0 && intval($count_all) == intval($count_done)) $status = 'Y'; else if(intval($count_all) > intval($count_done) && intval($count_done) > 0) $status = 'P'; $details_verifications[$i]['status'] = $status; } else{ $details_verifications[$i]['status'] = 'N'; } } $rows[$k]['details_verifications'] = $details_verifications; // DETAILS PROCESS $details_process = $details; foreach($details_process as $i => $j){ $details_process[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ $count_all = 0; $count_done = 0; if($j['flag_nonlab'] == 'N'){ $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderSampleID FROM t_ordersample JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderSampleT_OrderHeaderID JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN t_barcodelab ON T_BarcodeLabT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_OrderSampleT_BarcodeLabID = T_BarcodeLabID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderSampleT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderSampleID ) x_all"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderSampleID FROM t_ordersample JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderSampleT_OrderHeaderID JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN t_barcodelab ON T_BarcodeLabT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_OrderSampleT_BarcodeLabID = T_BarcodeLabID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderSampleT_OrderHeaderID = {$v['xid']} AND T_OrderSampleHandling = 'Y' GROUP BY T_OrderSampleID ) x_done"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } else{ $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderDetailID ) x_all"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$j['group_id']} JOIN t_samplingso ON T_OrderDetailT_OrderHeaderID = T_SamplingSoT_OrderHeaderID AND T_SamplingSoT_TestID = T_OrderDetailT_TestID AND T_SamplingSoM_DoctorID <> 0 AND T_SamplingSoReceiveAdmDate IS NOT NULL WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderDetailID ) x_done"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } $status = 'N'; if(intval($count_all) > 0 && intval($count_all) == intval($count_done)) $status = 'Y'; else if(intval($count_all) > intval($count_done) && intval($count_done) > 0) $status = 'P'; $details_process[$i]['status'] = $status; } else{ $details_process[$i]['status'] = 'N'; } } $rows[$k]['details_process'] = $details_process; // DETAILS RESULT VERIFICATION $details_result_verification = $details; foreach($details_result_verification as $i => $j){ $details_result_verification[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ $count_all = 0; $count_done = 0; if($j['flag_nonlab'] == 'Y'){ // NON-LAB: pakai so_reactionlog $sql = "SELECT COUNT(*) as xcount FROM one_lab.so_resultentry JOIN one_lab.t_orderdetail ON So_ResultEntryT_OrderDetailID = T_OrderDetailID JOIN one_lab.group_resultdetail ON T_OrderDetailT_TestID = Group_ResultDetailT_TestID AND Group_ResultDetailIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND Group_ResultDetailGroup_ResultID = {$j['group_id']} AND T_OrderDetailIsActive = 'Y'"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(DISTINCT So_REActionLogSo_ResultEntryID) as xcount FROM one_lab.so_reactionlog JOIN one_lab.so_resultentry ON So_REActionLogSo_ResultEntryID = So_ResultEntryID JOIN one_lab.t_orderdetail ON So_ResultEntryT_OrderDetailID = T_OrderDetailID JOIN one_lab.group_resultdetail ON T_OrderDetailT_TestID = Group_ResultDetailT_TestID AND Group_ResultDetailIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND Group_ResultDetailGroup_ResultID = {$j['group_id']} AND T_OrderDetailIsActive = 'Y' AND So_REActionLogAction = 'UPDATE_ACT'"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } else { // LAB: pakai t_orderdetail langsung (bukan t_orderheader_group_result) // agar akurat ketika ada penambahan pemeriksaan baru $sql = "SELECT COUNT(*) as xcount FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailIsActive = 'Y'"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailIsActive = 'Y' AND T_OrderDetailVerification = 'Y'"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } $status = 'N'; if(intval($count_all) > 0 && intval($count_all) == intval($count_done)) $status = 'Y'; else if(intval($count_all) > intval($count_done) && intval($count_done) > 0) $status = 'P'; $details_result_verification[$i]['status'] = $status; } else{ $details_result_verification[$i]['status'] = 'N'; } } $rows[$k]['details_result_verification'] = $details_result_verification; // DETAILS RESULT VALIDATION $details_result_validation = $details; foreach($details_result_validation as $i => $j){ $details_result_validation[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ $count_all = 0; $count_done = 0; if($j['flag_nonlab'] == 'Y'){ // NON-LAB: pakai so_reactionlog $sql = "SELECT COUNT(*) as xcount FROM one_lab.so_resultentry JOIN one_lab.t_orderdetail ON So_ResultEntryT_OrderDetailID = T_OrderDetailID JOIN one_lab.group_resultdetail ON T_OrderDetailT_TestID = Group_ResultDetailT_TestID AND Group_ResultDetailIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND Group_ResultDetailGroup_ResultID = {$j['group_id']} AND T_OrderDetailIsActive = 'Y'"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(DISTINCT So_REActionLogSo_ResultEntryID) as xcount FROM one_lab.so_reactionlog JOIN one_lab.so_resultentry ON So_REActionLogSo_ResultEntryID = So_ResultEntryID JOIN one_lab.t_orderdetail ON So_ResultEntryT_OrderDetailID = T_OrderDetailID JOIN one_lab.group_resultdetail ON T_OrderDetailT_TestID = Group_ResultDetailT_TestID AND Group_ResultDetailIsActive = 'Y' WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND Group_ResultDetailGroup_ResultID = {$j['group_id']} AND T_OrderDetailIsActive = 'Y' AND So_REActionLogAction = 'VALIDATION'"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } else { // LAB: pakai t_orderdetail langsung (bukan t_orderheader_group_result) // agar akurat ketika ada penambahan pemeriksaan baru $sql = "SELECT COUNT(*) as xcount FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailIsActive = 'Y'"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailIsActive = 'Y' AND T_OrderDetailValidation = 'Y'"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } $status = 'N'; if(intval($count_all) > 0 && intval($count_all) == intval($count_done)) $status = 'Y'; else if(intval($count_all) > intval($count_done) && intval($count_done) > 0) $status = 'P'; $details_result_validation[$i]['status'] = $status; } else{ $details_result_validation[$i]['status'] = 'N'; } } $rows[$k]['details_result_validation'] = $details_result_validation; // DETAILS PRINT $details_print = $details; foreach($details_print as $i => $j){ $details_print[$i]['status'] = 'N'; $status_fo_ver = $details_order[0]['status']; if($status_fo_ver == 'Y'){ if($j['flag_nonlab'] == 'N'){ $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderDetailID ) x_all"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N' AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailPrintCount > 0 GROUP BY T_OrderDetailID ) x_done"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } else { $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} GROUP BY T_OrderDetailID ) x_all"; $count_all = $this->db_onedev->query($sql)->row()->xcount; $sql = "SELECT COUNT(*) as xcount FROM ( SELECT T_OrderDetailID FROM t_orderdetail JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$j['group_id']} WHERE T_OrderDetailT_OrderHeaderID = {$v['xid']} AND T_OrderDetailPrintCount > 0 GROUP BY T_OrderDetailID ) x_done"; $count_done = $this->db_onedev->query($sql)->row()->xcount; } $status = 'N'; if(intval($count_all) > 0 && intval($count_all) == intval($count_done)) $status = 'Y'; else if(intval($count_all) > intval($count_done) && intval($count_done) > 0) $status = 'P'; $details_print[$i]['status'] = $status; } else{ $details_print[$i]['status'] = 'N'; } } $rows[$k]['details_print'] = $details_print; } } $result = array("total" => $tot_page, "total_all" => $tot_count, "records" => $rows, "sql" => ''); $this->sys_ok($result); exit; } function searchcompany(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $max_rst = 12; $tot_count =0; $q = [ 'search' => '%' ]; if ($prm['search'] != '') { $q['search'] = "%{$prm['search']}%"; } // QUERY TOTAL $sql = "SELECT count(*) as total FROM m_company WHERE M_CompanyName like ? AND M_CompanyIsActive = 'Y'"; $query = $this->db_onedev->query($sql,$q['search']); //echo $query; if ($query) { $tot_count = $query->result_array()[0]["total"]; } else { $this->sys_error_db("m_city count",$this->db_onedev); exit; } $rows = array('id'=>0,'name'=>'Semua'); $sql = " SELECT M_CompanyID as id, M_CompanyName as name FROM m_company WHERE M_CompanyName like ? AND M_CompanyIsActive = 'Y' ORDER BY M_CompanyName DESC "; $query = $this->db_onedev->query($sql, array($q['search'])); if ($query) { $rows = $query->result_array(); array_push($rows,array('id'=>0,'name'=>'Semua')); //echo $this->db_onedev->last_query(); $result = array("total" => $tot_count, "records" => $rows, "total_display" => sizeof($rows)); $this->sys_ok($result); } else { $this->sys_error_db("m_company rows",$this->db_onedev); exit; } } function getdata_order(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $this->_check_is_supervisor(); $prm = $this->sys_input; $xid = $prm["xid"]; $sql = "SELECT * FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID WHERE T_OrderHeaderID = {$xid}"; $data_header = $this->db_onedev->query($sql)->row_array(); $datas = array(); $sql = " SELECT * FROM ( SELECT DATE_FORMAT(OrderLogCreated,'%d.%m.%Y %H:%i') as xdatetime, 'order' as type, JSON_OBJECT( 'company_name',M_CompanyName, 'mou_name', M_MouName, 'doctor_name',CONCAT(M_DoctorPrefix,M_DoctorPrefix2,' ',M_DoctorName,' ',M_DoctorSufix,M_DoctorSufix2,M_DoctorSufix3), 'doctor_address',M_DoctorAddressDescription, 'alias_doctor',orderLogT_OrderHeaderAddOnAliasDoctorName, 'alias_doctor_name',orderLogT_OrderHeaderAddOnAliasDoctorAddress, 'age',OrderLogAge, 'fo_note',IFNULL(OrderLogFoNote,'-'), 'subtotal',OrderLogSubtotal, 'total',OrderLogTotal, 'details',OrderLogDetails, 'deliveries',OrderLogDeliveries, 'promises',OrderLogPromises ) as data, M_UserUsername as username FROM order_log JOIN m_user ON OrderLogUserID = M_UserID JOIN m_doctor ON OrderLogM_DoctorSenderID = M_DoctorID JOIN m_company ON OrderLogM_CompanyID = M_CompanyID JOIN m_mou ON OrderLogM_MouID = M_MouID JOIN m_doctoraddress ON OrderLogM_DoctorSenderAddressID = M_DoctorAddressID WHERE OrderLogT_OrderHeaderID = {$xid} UNION SELECT DATE_FORMAT(orderAttrCreated,'%d.%m.%Y %H:%i') as xdatetime, orderAttrType as type, orderAttrJson as data, M_UserUsername as username FROM order_attr JOIN m_user ON orderAttrUserID = M_UserID WHERE orderAttrT_OrderHeaderID = {$xid} AND ( orderAttrType = 'req_change_dob' OR orderAttrType = 'change_dob' ) UNION SELECT DATE_FORMAT(orderAttrCreated,'%d.%m.%Y %H:%i') as xdatetime, orderAttrType as type, orderAttrJson as data, M_UserUsername as username FROM order_attr JOIN m_user ON orderAttrUserID = M_UserID WHERE orderAttrT_OrderHeaderID = {$xid} AND orderAttrType = 'spv_order_doctor' UNION SELECT DATE_FORMAT(orderAttrCreated,'%d.%m.%Y %H:%i') as xdatetime, orderAttrType as type, orderAttrJson as data, M_UserUsername as username FROM order_attr JOIN m_user ON orderAttrUserID = M_UserID WHERE orderAttrT_OrderHeaderID = {$xid} AND orderAttrType = 'spv_order_company' UNION SELECT DATE_FORMAT(orderAttrCreated,'%d.%m.%Y %H:%i') as xdatetime, orderAttrType as type, orderAttrJson as data, M_UserUsername as username FROM order_attr JOIN m_user ON orderAttrUserID = M_UserID WHERE orderAttrT_OrderHeaderID = {$xid} AND orderAttrType = 'spv_order_lang' UNION SELECT DATE_FORMAT(OrderPxCreated,'%d.%m.%Y %H:%i') as xdatetime, OrderPxType as type, OrderPxJson as data, M_UserUsername as username FROM order_px JOIN m_user ON OrderPxUserID = M_UserID WHERE OrderPxT_OrderHeaderID = {$xid} AND OrderPxType = 'spv_test' UNION SELECT DATE_FORMAT(OrderPxCreated,'%d.%m.%Y %H:%i') as xdatetime, OrderPxType as type, JSON_OBJECT('mou',OrderPxMou,'data',OrderPxJson) as data, M_UserUsername as username FROM order_px JOIN m_user ON OrderPxUserID = M_UserID WHERE OrderPxT_OrderHeaderID = {$xid} AND OrderPxType = 'update_mou' UNION SELECT DATE_FORMAT(Order_DeliveryCreated,'%d.%m.%Y %H:%i') as xdatetime, 'order_delivery' as type, Order_DeliveryJson as data, M_UserUsername as username FROM order_delivery JOIN m_user ON Order_DeliveryUserID = M_UserID WHERE Order_DeliveryT_OrdeheaderID = {$xid} UNION SELECT DATE_FORMAT(F_PaymentCreated,'%d.%m.%Y %H:%i') as xdatetime, 'payment' as type, F_PaymentID as data, M_UserUsername as username FROM f_payment JOIN m_user ON F_PaymentM_UserID = M_UserID WHERE F_PaymentT_OrderHeaderID = {$xid} UNION SELECT DATE_FORMAT(Fo_StatusDate,'%d.%m.%Y %H:%i') as xdatetime, 'fo_verification' as type, Fo_StatusID as data, M_UserUsername as username FROM fo_status JOIN m_user ON Fo_StatusM_UserID = M_UserID WHERE Fo_StatusT_OrderHeaderID = {$xid} AND Fo_StatusM_StatusID IN (3,4) UNION SELECT DATE_FORMAT(orderAttrCreated,'%d.%m.%Y %H:%i') as xdatetime, 'change_promise' as type, orderAttrJson as data, M_UserUsername as username FROM order_attr JOIN m_user ON orderAttrUserID = M_UserID WHERE orderAttrT_OrderHeaderID = {$xid} AND ( orderAttrType = 'spv_promise' OR orderAttrType = 'patlist_promise' ) UNION SELECT DATE_FORMAT(OrderPayloadCreated,'%d.%m.%Y %H:%i') as xdatetime, 'order_payload' as type, OrderPayloadJSON as data, M_UserUsername as username FROM one_lab_log.order_payload JOIN m_user ON OrderPayloadUserID = M_UserID WHERE OrderPayloadM_PatientID = {$data_header['T_OrderHeaderM_PatientID']} AND DATE(OrderPayloadCreated) = DATE('{$data_header['T_OrderHeaderDate']}') UNION SELECT DATE_FORMAT(Patient_SignatureCreated,'%d.%m.%Y %H:%i') as xdatetime, 'patient_signature' as type, JSON_OBJECT('url', Patient_SignatureUrl) as data, IFNULL(M_UserUsername, '-') as username FROM patient_signature LEFT JOIN m_user ON Patient_SignatureCreatedUserID = M_UserID WHERE Patient_SignatureM_PatientID = {$data_header['T_OrderHeaderM_PatientID']} AND DATE(Patient_SignatureCreated) = DATE('{$data_header['T_OrderHeaderDate']}') AND Patient_SignatureIsActive = 'Y' UNION SELECT DATE_FORMAT(Log_SignatureCreated,'%d.%m.%Y %H:%i') as xdatetime, 'log_signature' as type, JSON_OBJECT( 'before_url', Log_SignatureBeforeUrl, 'after_url', Log_SignatureAfterUrl ) as data, IFNULL(M_UserUsername, '-') as username FROM one_lab_log.log_signature LEFT JOIN m_user ON Log_SignatureUserID = M_UserID WHERE Log_SignatureM_PatientID = {$data_header['T_OrderHeaderM_PatientID']} AND DATE(Log_SignatureCreated) = DATE('{$data_header['T_OrderHeaderDate']}') UNION SELECT DATE_FORMAT(OrderLogPxCreated,'%d.%m.%Y %H:%i') as xdatetime, CONCAT('order_log_px_', LOWER(OrderLogPxType)) as type, JSON_OBJECT( 'action', OrderLogPxType, 'test_name', OrderLogPxT_TestName, 'packet_name', OrderLogPxT_PacketName, 'price', OrderLogPxT_PriceTotal, 'raw_data', OrderLogPxJson ) as data, IFNULL(M_UserUsername, '-') as username FROM one_lab.order_log_px LEFT JOIN m_user ON OrderLogPxUserID = M_UserID WHERE OrderLogPxJson LIKE '%\"T_OrderDetailT_OrderHeaderID\":\"{$xid}\"%' UNION SELECT DATE_FORMAT(Order_MouLogCreated,'%d.%m.%Y %H:%i') as xdatetime, 'change_mou_log' as type, JSON_OBJECT( 'from_mou_name', Order_MouLogFromM_MouName, 'to_mou_name', Order_MouLogToMouName, 'px_before', IFNULL(Order_MouLogPXBefore, ''), 'px_after', IFNULL(Order_MouLogPXAfter, '') ) as data, IFNULL(M_UserUsername, '-') as username FROM one_lab_log.order_mou_log LEFT JOIN m_user ON Order_MouLogCreatedUserID = M_UserID WHERE Order_MouLogT_OrderHeaderID = {$xid} ) x ORDER BY xdatetime ASC"; //echo $sql; $datas = $this->db_onedev->query($sql)->result_array(); foreach($datas as $k => $v){ if($v['type'] == 'order'){ $datas[$k]['data'] = json_decode($v['data']); $datas[$k]['data']->details = json_decode($datas[$k]['data']->details); $datas[$k]['data']->deliveries = json_decode($datas[$k]['data']->deliveries); $datas[$k]['data']->promises = json_decode($datas[$k]['data']->promises); foreach($datas[$k]['data']->deliveries as $kdev => $vdev){ $sql = "SELECT * FROM m_delivery WHERE M_DeliveryID = {$vdev->delivery_id}"; //echo $sql; $datas[$k]['data']->deliveries[$kdev]->delivery_code = $this->db_onedev->query($sql)->row()->M_DeliveryName; } } else if($v['type'] == 'fo_verification'){ $sql = "SELECT * FROM fo_verificationsvalue JOIN fo_verificationslabel ON Fo_VerificationsValueFo_VerificationsLabelID = Fo_VerificationsLabelID WHERE Fo_VerificationsValueT_OrderHeaderID = {$xid} ORDER BY Fo_VerificationsLabelOrder ASC"; $datas[$k]['data'] = $this->db_onedev->query($sql)->result_array(); } else if($v['type'] == 'update_mou'){ $xdt = json_decode($v['data']); $xdt->mou = json_decode($xdt->mou); $xdt->data = json_decode($xdt->data); $datas[$k]['data'] = $xdt; } else if($v['type'] == 'payment'){ $sql = "SELECT * FROM f_payment WHERE F_PaymentID = {$v['data']}"; $payment_header = $this->db_onedev->query($sql)->row_array(); $sql = "SELECT f_paymentdetail.*, M_PaymentTypeCode, CASE WHEN M_PaymentTypeCode = 'CASH' THEN M_PaymentTypeName WHEN M_PaymentTypeCode = 'DEBIT' THEN CONCAT(M_PaymentTypeName,' : ',card_bank.Nat_BankName,'+',bank.Nat_BankName,' [ ',M_BankAccountNo,' ]') WHEN M_PaymentTypeCode = 'CREDIT' THEN CONCAT(M_PaymentTypeName,' : ',card_bank.Nat_BankName,'+',bank.Nat_BankName,' [ ',M_BankAccountNo,' ]') WHEN M_PaymentTypeCode = 'TRANSFER' THEN CONCAT(M_PaymentTypeName,'+',bank.Nat_BankName,' [ ',M_BankAccountNo,' ]') ELSE CONCAT(M_PaymentTypeName,' [ ',F_PaymentDetailNote,' ]') END as name FROM f_paymentdetail JOIN m_paymenttype ON F_PaymentDetailM_PaymentTypeID = M_PaymentTypeID LEFT JOIN nat_bank card_bank ON F_PaymentDetailCardNat_BankID = card_bank.Nat_BankID LEFT JOIN m_bank_account ON F_PaymentDetailM_BankAccountID = M_BankAccountID LEFT JOIN nat_bank bank ON M_BankAccountNat_BankID = bank.Nat_BankID WHERE F_PaymentDetailF_PaymentID = '{$v['data']}' AND F_PaymentDetailIsActive = 'Y'"; //echo $sql; $payment_details = $this->db_onedev->query($sql)->result_array(); $datas[$k]['data'] = array('header'=>$payment_header,'details'=>$payment_details); } else{ $datas[$k]['data'] = json_decode($v['data']); } } $result = array("header"=>$data_header,"records" => $datas); $this->sys_ok($result); } function getdata_sampling(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $this->_check_is_supervisor(); $prm = $this->sys_input; $xid = $prm["xid"]; $sql = "SELECT *,'{$prm['group_name']}' as group_name FROM t_orderheader JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID WHERE T_OrderHeaderID = {$xid}"; $data_header = $this->db_onedev->query($sql)->row_array(); $x_status_so = " SampleSoByStepCode = 'SAMPLING.Sampling.Unsampled' OR SampleSoByStepCode = 'SAMPLING.Sampling.Sampled' OR SampleSoByStepCode = 'SAMPLING.Sampling.Received' "; if($prm['action'] == 'verif'){ $x_status_so = " SampleSoByStepCode = 'SAMPLING.Verification.Verify' "; } if($prm['action'] == 'process'){ $x_status_so = " SampleSoByStepCode = 'SAMPLING.Handling.Process' "; } $datas = array(); $sql = "SELECT * from group_result WHERE Group_ResultID = {$prm['group_id']}"; $group_rst = $this->db_onedev->query($sql)->row_array(); $sql_check_lab = "SELECT IFNULL(Nat_TestIsNonLab, '') as Nat_TestIsNonLab FROM group_resultdetail JOIN t_test ON Group_ResultDetailT_TestID = T_TestID LEFT JOIN nat_test ON T_TestNat_TestID = Nat_TestID WHERE Group_ResultDetailGroup_ResultID = {$prm['group_id']} LIMIT 1"; $check_lab_rst = $this->db_onedev->query($sql_check_lab)->row_array(); $is_lab = true; if ($check_lab_rst && $check_lab_rst['Nat_TestIsNonLab'] != '') { $is_lab = false; } if($is_lab){ // ================================================================ // LAB - RESUME // ================================================================ if($prm['action'] == 'verif'){ $sql_resume = "SELECT T_OrderSampleT_OrderHeaderID as order_id, T_OrderSampleT_SampleTypeID as sample_id, T_SampleTypeName as sample_name, T_OrderSampleT_SampleStationID as station_id, T_BarcodeLabBarcode as barcode, T_OrderSampleSampling as sampling_status, DATE_FORMAT(T_OrderSampleSamplingDate,'%d-%m-%Y') as sampling_date, DATE_FORMAT(T_OrderSampleSamplingTime,'%H:%i') as sampling_time, T_OrderSampleSamplingUserID as sampling_user_id, sampling_user.M_UserUsername as sampling_username, T_OrderSampleVerification as reveice_status, DATE_FORMAT(T_OrderSampleVerificationDate,'%d-%m-%Y') as receive_date, DATE_FORMAT(T_OrderSampleVerificationTime,'%H:%i') as receive_time, T_OrderSampleVerificationUserID as receive_user_id, receive_user.M_UserUsername as receive_username FROM t_barcodelab JOIN t_sampletype ON T_BarcodeLabT_SampleTypeID = T_SampleTypeID LEFT JOIN t_ordersample ON T_OrderSampleT_BarcodeLabID = T_BarcodeLabID LEFT JOIN m_user sampling_user ON T_OrderSampleSamplingUserID = sampling_user.M_UserID LEFT JOIN m_user receive_user ON T_OrderSampleVerificationUserID = receive_user.M_UserID WHERE T_OrderSampleT_OrderHeaderID = {$xid}"; } else if($prm['action'] == 'process'){ $sql_resume = "SELECT T_OrderSampleT_OrderHeaderID as order_id, T_OrderSampleT_SampleTypeID as sample_id, T_SampleTypeName as sample_name, T_OrderSampleT_SampleStationID as station_id, T_BarcodeLabBarcode as barcode, T_OrderSampleSampling as sampling_status, DATE_FORMAT(T_OrderSampleSamplingDate,'%d-%m-%Y') as sampling_date, DATE_FORMAT(T_OrderSampleSamplingTime,'%H:%i') as sampling_time, T_OrderSampleSamplingUserID as sampling_user_id, sampling_user.M_UserUsername as sampling_username, T_OrderSampleHandling as reveice_status, DATE_FORMAT(T_OrderSampleHandlingDate,'%d-%m-%Y') as receive_date, DATE_FORMAT(T_OrderSampleHandlingTime,'%H:%i') as receive_time, T_OrderSampleHandlingUserID as receive_user_id, receive_user.M_UserUsername as receive_username FROM t_barcodelab JOIN t_sampletype ON T_BarcodeLabT_SampleTypeID = T_SampleTypeID LEFT JOIN t_ordersample ON T_OrderSampleT_BarcodeLabID = T_BarcodeLabID LEFT JOIN m_user sampling_user ON T_OrderSampleSamplingUserID = sampling_user.M_UserID LEFT JOIN m_user receive_user ON T_OrderSampleHandlingUserID = receive_user.M_UserID WHERE T_OrderSampleT_OrderHeaderID = {$xid}"; } else { $sql_resume = "SELECT T_OrderSampleT_OrderHeaderID as order_id, T_OrderSampleT_SampleTypeID as sample_id, T_SampleTypeName as sample_name, T_OrderSampleT_SampleStationID as station_id, T_BarcodeLabBarcode as barcode, T_OrderSampleSampling as sampling_status, DATE_FORMAT(T_OrderSampleSamplingDate,'%d-%m-%Y') as sampling_date, DATE_FORMAT(T_OrderSampleSamplingTime,'%H:%i') as sampling_time, T_OrderSampleSamplingUserID as sampling_user_id, sampling_user.M_UserUsername as sampling_username, T_OrderSampleReceive as reveice_status, DATE_FORMAT(T_OrderSampleReceiveDate,'%d-%m-%Y') as receive_date, DATE_FORMAT(T_OrderSampleReceiveTime,'%H:%i') as receive_time, T_OrderSampleReceiveUserID as receive_user_id, receive_user.M_UserUsername as receive_username FROM t_barcodelab JOIN t_sampletype ON T_BarcodeLabT_SampleTypeID = T_SampleTypeID LEFT JOIN t_ordersample ON T_OrderSampleT_BarcodeLabID = T_BarcodeLabID LEFT JOIN m_user sampling_user ON T_OrderSampleSamplingUserID = sampling_user.M_UserID LEFT JOIN m_user receive_user ON T_OrderSampleReceiveUserID = receive_user.M_UserID WHERE T_OrderSampleT_OrderHeaderID = {$xid}"; } $data_resume = $this->db_onedev->query($sql_resume)->result_array(); // ================================================================ // LAB - RECORDS (log_sample) // ================================================================ $arr_datas = array(); if($prm['action'] == 'verif'){ // Verifikasi → langsung dari log, tidak ada duplikat $sql_log = "SELECT SampleByStepID, T_BarcodeLabBarcode, T_SampleTypeName, SampleByStepDateTime, SampleByStepM_StatusSampleCode, M_UserUsername, SampleByStepRequirementStatus, GROUP_CONCAT(Nat_RequirementName separator ', ') as requirements, 1 as group_id, 'LAB' as group_name, NULL xform, NULL xfilm FROM ( SELECT Log_SampleID as SampleByStepID, Log_SampleBarcode as T_BarcodeLabBarcode, T_SampleTypeName, Log_SampleDate as SampleByStepDateTime, Log_SampleCode as SampleByStepM_StatusSampleCode, M_UserUsername, IFNULL(JSON_UNQUOTE(JSON_EXTRACT(Log_SampleJson, '$.requirement_status')), 'Y') as SampleByStepRequirementStatus, Nat_RequirementName FROM one_lab_log.log_sample LEFT JOIN t_barcodelab ON Log_SampleBarcode = T_BarcodeLabBarcode AND T_BarcodeLabT_OrderHeaderID = {$xid} LEFT JOIN t_sampletype ON T_BarcodeLabT_SampleTypeID = T_SampleTypeID LEFT JOIN m_user ON Log_SampleUserID = M_UserID LEFT JOIN nat_requirement ON json_contains(JSON_EXTRACT(Log_SampleJson, '$.requirements'), Nat_RequirementID) WHERE Log_SampleOrderID = {$xid} AND Log_SampleCode = 'SAMPLING.Verification.Verify' ) x GROUP BY SampleByStepID ORDER BY SampleByStepDateTime ASC"; } else if($prm['action'] == 'process'){ // Process → langsung dari log, tidak ada duplikat $sql_log = "SELECT SampleByStepID, T_BarcodeLabBarcode, T_SampleTypeName, SampleByStepDateTime, SampleByStepM_StatusSampleCode, M_UserUsername, SampleByStepRequirementStatus, GROUP_CONCAT(Nat_RequirementName separator ', ') as requirements, 1 as group_id, 'LAB' as group_name, NULL xform, NULL xfilm FROM ( SELECT Log_SampleID as SampleByStepID, Log_SampleBarcode as T_BarcodeLabBarcode, T_SampleTypeName, Log_SampleDate as SampleByStepDateTime, Log_SampleCode as SampleByStepM_StatusSampleCode, M_UserUsername, IFNULL(JSON_UNQUOTE(JSON_EXTRACT(Log_SampleJson, '$.requirement_status')), 'Y') as SampleByStepRequirementStatus, Nat_RequirementName FROM one_lab_log.log_sample LEFT JOIN t_barcodelab ON Log_SampleBarcode = T_BarcodeLabBarcode AND T_BarcodeLabT_OrderHeaderID = {$xid} LEFT JOIN t_sampletype ON T_BarcodeLabT_SampleTypeID = T_SampleTypeID LEFT JOIN m_user ON Log_SampleUserID = M_UserID LEFT JOIN nat_requirement ON json_contains(JSON_EXTRACT(Log_SampleJson, '$.requirements'), Nat_RequirementID) WHERE Log_SampleOrderID = {$xid} AND Log_SampleCode = 'SAMPLING.Handling.Process' ) x GROUP BY SampleByStepID ORDER BY SampleByStepDateTime ASC"; } else { // Sampling default: // Step 1: Unsampled pertama per barcode (dari log) // Step 2: Sampled dari t_ordersample (lebih akurat) // Step 3: Received dari t_ordersample (lebih akurat) $sql_log = "SELECT SampleByStepID, T_BarcodeLabBarcode, T_SampleTypeName, SampleByStepDateTime, SampleByStepM_StatusSampleCode, M_UserUsername, SampleByStepRequirementStatus, requirements, group_id, group_name, xform, xfilm FROM ( -- STEP 1: Unsampled pertama per barcode dari log SELECT Log_SampleID as SampleByStepID, Log_SampleBarcode as T_BarcodeLabBarcode, T_SampleTypeName, Log_SampleDate as SampleByStepDateTime, Log_SampleCode as SampleByStepM_StatusSampleCode, IFNULL(u.M_UserUsername, 'Sistem') as M_UserUsername, IFNULL(JSON_UNQUOTE(JSON_EXTRACT(Log_SampleJson, '$.requirement_status')), 'Y') as SampleByStepRequirementStatus, NULL as requirements, 1 as group_id, 'LAB' as group_name, NULL as xform, NULL as xfilm FROM one_lab_log.log_sample LEFT JOIN t_barcodelab ON Log_SampleBarcode = T_BarcodeLabBarcode AND T_BarcodeLabT_OrderHeaderID = {$xid} LEFT JOIN t_sampletype ON T_BarcodeLabT_SampleTypeID = T_SampleTypeID LEFT JOIN m_user u ON Log_SampleUserID = u.M_UserID WHERE Log_SampleOrderID = {$xid} AND Log_SampleCode = 'SAMPLING.Sampling.Unsampled' AND Log_SampleID = ( SELECT MIN(ls2.Log_SampleID) FROM one_lab_log.log_sample ls2 WHERE ls2.Log_SampleOrderID = {$xid} AND ls2.Log_SampleBarcode = Log_SampleBarcode AND ls2.Log_SampleCode = 'SAMPLING.Sampling.Unsampled' ) UNION ALL -- STEP 2: Sampled dari t_ordersample SELECT CONCAT('s_', T_OrderSampleID) as SampleByStepID, T_BarcodeLabBarcode, T_SampleTypeName, CONCAT(DATE_FORMAT(T_OrderSampleSamplingDate,'%Y-%m-%d'), ' ', TIME_FORMAT(T_OrderSampleSamplingTime,'%H:%i:%s')) as SampleByStepDateTime, 'SAMPLING.Sampling.Sampled' as SampleByStepM_StatusSampleCode, IFNULL(sampling_user.M_UserUsername, 'Sistem') as M_UserUsername, 'Y' as SampleByStepRequirementStatus, NULL as requirements, 1 as group_id, 'LAB' as group_name, NULL as xform, NULL as xfilm FROM t_ordersample JOIN t_barcodelab ON T_OrderSampleT_BarcodeLabID = T_BarcodeLabID JOIN t_sampletype ON T_BarcodeLabT_SampleTypeID = T_SampleTypeID LEFT JOIN m_user sampling_user ON T_OrderSampleSamplingUserID = sampling_user.M_UserID WHERE T_OrderSampleT_OrderHeaderID = {$xid} AND T_OrderSampleSampling = 'Y' UNION ALL -- STEP 3: Received dari t_ordersample SELECT CONCAT('r_', T_OrderSampleID) as SampleByStepID, T_BarcodeLabBarcode, T_SampleTypeName, CONCAT(DATE_FORMAT(T_OrderSampleReceiveDate,'%Y-%m-%d'), ' ', TIME_FORMAT(T_OrderSampleReceiveTime,'%H:%i:%s')) as SampleByStepDateTime, 'SAMPLING.Sampling.Received' as SampleByStepM_StatusSampleCode, IFNULL(receive_user.M_UserUsername, 'Sistem') as M_UserUsername, 'Y' as SampleByStepRequirementStatus, NULL as requirements, 1 as group_id, 'LAB' as group_name, NULL as xform, NULL as xfilm FROM t_ordersample JOIN t_barcodelab ON T_OrderSampleT_BarcodeLabID = T_BarcodeLabID JOIN t_sampletype ON T_BarcodeLabT_SampleTypeID = T_SampleTypeID LEFT JOIN m_user receive_user ON T_OrderSampleReceiveUserID = receive_user.M_UserID WHERE T_OrderSampleT_OrderHeaderID = {$xid} AND T_OrderSampleReceive = 'Y' ) x ORDER BY SampleByStepDateTime ASC, FIELD(SampleByStepM_StatusSampleCode, 'SAMPLING.Sampling.Unsampled', 'SAMPLING.Sampling.Sampled', 'SAMPLING.Sampling.Received' ) ASC"; } $datas = $this->db_onedev->query($sql_log)->result_array(); foreach($datas as $k => $v){ $found = $this->search_exist($arr_datas, $v['SampleByStepDateTime'], $v['SampleByStepM_StatusSampleCode'], $v['M_UserUsername']); if ($found == -1) { $xv = array( "datetime" => $v['SampleByStepDateTime'], "status" => $v['SampleByStepM_StatusSampleCode'], "user" => $v["M_UserUsername"] ? $v["M_UserUsername"] : 'Sistem', "group_id" => $v["group_id"], "details" => array( array( "SampleByStepID" => $v["SampleByStepID"], "T_BarcodeLabBarcode" => $v["T_BarcodeLabBarcode"], "T_SampleTypeName" => $v["T_SampleTypeName"], "M_UserUsername" => $v["M_UserUsername"] ? $v["M_UserUsername"] : 'Sistem', "SampleByStepRequirementStatus"=> $v["SampleByStepRequirementStatus"], "requirements" => $v["requirements"], "group_id" => $v["group_id"], "xform" => $v["xform"], "xfilm" => $v["xfilm"] ) ) ); array_push($arr_datas, $xv); } else { $xarr = $arr_datas[$found]['details']; array_push( $xarr, array( "SampleByStepID" => $v["SampleByStepID"], "T_BarcodeLabBarcode" => $v["T_BarcodeLabBarcode"], "T_SampleTypeName" => $v["T_SampleTypeName"], "M_UserUsername" => $v["M_UserUsername"] ? $v["M_UserUsername"] : 'Sistem', "SampleByStepRequirementStatus"=> $v["SampleByStepRequirementStatus"], "requirements" => $v["requirements"], "group_id" => $v["group_id"], "xform" => $v["xform"], "xfilm" => $v["xfilm"] ) ); $arr_datas[$found]['details'] = $xarr; } } } else { // ================================================================ // NON-LAB - RESUME // ================================================================ if($prm['action'] == 'verif'){ $sql_resume = "SELECT T_OrderHeaderID as order_id, T_TestID as sample_id, T_TestName as sample_name, T_OrderHeaderLabNumberExt as barcode, IF(ISNULL(T_SamplingSoProcessDate),'N','Y') as sampling_status, DATE_FORMAT(T_SamplingSoProcessDate,'%d-%m-%Y') as sampling_date, DATE_FORMAT(T_SamplingSoProcessTime,'%H:%i') as sampling_time, sampling_user.M_UserUsername as sampling_username, IF(ISNULL(T_SamplingSoVerifyDate),'N','Y') as reveice_status, DATE_FORMAT(T_SamplingSoVerifyDate,'%d-%m-%Y') as receive_date, DATE_FORMAT(T_SamplingSoVerifyTime,'%H:%i') as receive_time, T_SamplingSoVerifyUserID as receive_user_id, receive_user.M_UserUsername as receive_username FROM t_orderheader JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderAddOnIsActive = 'Y' JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y' JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID JOIN t_bahan ON T_SampleTypeT_BahanID = T_BahanID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$prm['group_id']} LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = T_OrderHeaderID AND T_SamplingSoT_TestID = T_TestID AND T_SamplingSoIsActive = 'Y' LEFT JOIN m_user sampling_user ON T_SamplingSoProcessUserID = sampling_user.M_UserID LEFT JOIN m_user receive_user ON T_SamplingSoVerifyUserID = receive_user.M_UserID WHERE T_OrderHeaderID = {$xid} AND T_OrderHeaderIsActive = 'Y' GROUP BY T_OrderDetailID"; } else if($prm['action'] == 'process'){ $sql_resume = "SELECT T_OrderHeaderID as order_id, T_TestID as sample_id, T_TestName as sample_name, T_OrderHeaderLabNumberExt as barcode, IF(ISNULL(T_SamplingSoProcessDate),'N','Y') as sampling_status, DATE_FORMAT(T_SamplingSoProcessDate,'%d-%m-%Y') as sampling_date, DATE_FORMAT(T_SamplingSoProcessTime,'%H:%i') as sampling_time, sampling_user.M_UserUsername as sampling_username, IF(ISNULL(T_SamplingSoReceiveAdmDate),'N','Y') as reveice_status, DATE_FORMAT(T_SamplingSoReceiveAdmDate,'%d-%m-%Y') as receive_date, DATE_FORMAT(T_SamplingSoReceiveAdmTime,'%H:%i') as receive_time, T_SamplingSoReceiveAdmUserID as receive_user_id, receive_user.M_UserUsername as receive_username FROM t_orderheader JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderAddOnIsActive = 'Y' JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y' JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID JOIN t_bahan ON T_SampleTypeT_BahanID = T_BahanID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$prm['group_id']} LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = T_OrderHeaderID AND T_SamplingSoT_TestID = T_TestID AND T_SamplingSoIsActive = 'Y' LEFT JOIN m_user sampling_user ON T_SamplingSoProcessUserID = sampling_user.M_UserID LEFT JOIN m_user receive_user ON T_SamplingSoReceiveAdmUserID = receive_user.M_UserID WHERE T_OrderHeaderID = {$xid} AND T_OrderHeaderIsActive = 'Y' GROUP BY T_OrderDetailID"; } else { $sql_resume = "SELECT T_OrderHeaderID as order_id, T_TestID as sample_id, T_TestName as sample_name, T_OrderHeaderLabNumberExt as barcode, IF(ISNULL(T_SamplingSoProcessDate),'N','Y') as sampling_status, DATE_FORMAT(T_SamplingSoProcessDate,'%d-%m-%Y') as sampling_date, DATE_FORMAT(T_SamplingSoProcessTime,'%H:%i') as sampling_time, sampling_user.M_UserUsername as sampling_username, IF(ISNULL(T_SamplingSoDoneDate),'N','Y') as reveice_status, DATE_FORMAT(T_SamplingSoDoneDate,'%d-%m-%Y') as receive_date, DATE_FORMAT(T_SamplingSoDoneTime,'%H:%i') as receive_time, T_SamplingSoDoneUserID as receive_user_id, receive_user.M_UserUsername as receive_username FROM t_orderheader JOIN t_orderheaderaddon ON T_OrderHeaderAddOnT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderAddOnIsActive = 'Y' JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID AND T_OrderDetailIsActive = 'Y' JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID JOIN t_bahan ON T_SampleTypeT_BahanID = T_BahanID JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$prm['group_id']} LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = T_OrderHeaderID AND T_SamplingSoT_TestID = T_TestID AND T_SamplingSoIsActive = 'Y' LEFT JOIN m_user sampling_user ON T_SamplingSoProcessUserID = sampling_user.M_UserID LEFT JOIN m_user receive_user ON T_SamplingSoDoneUserID = receive_user.M_UserID WHERE T_OrderHeaderID = {$xid} AND T_OrderHeaderIsActive = 'Y' GROUP BY T_OrderDetailID"; } $data_resume = $this->db_onedev->query($sql_resume)->result_array(); // ================================================================ // NON-LAB - RECORDS (sample_so_by_step) // ================================================================ $sql_log = "SELECT SampleByStepID, T_BarcodeLabBarcode, T_SampleTypeName, SampleByStepDateTime, SampleByStepM_StatusSampleCode, M_UserUsername, SampleByStepRequirementStatus, GROUP_CONCAT(Nat_RequirementName separator ', ') as requirements, Group_ResultID as group_id, Group_ResultName as group_name, xform, xfilm FROM ( SELECT SampleSoByStepID SampleByStepID, T_OrderHeaderLabNumberExt T_BarcodeLabBarcode, T_TestName T_SampleTypeName, SampleSoByStepDateTime SampleByStepDateTime, SampleSoByStepCode SampleByStepM_StatusSampleCode, M_UserUsername, SampleSoByStepRequirementStatus SampleByStepRequirementStatus, Nat_RequirementName, Group_ResultID, Group_ResultName, CONCAT(T_SamplingSoFormKv,'^',T_SamplingSoFormMa,'^',T_SamplingSoFormSecond,'^',T_SamplingSoFormExpose) as xform, CONCAT(T_SamplingSoFilmType,'^',T_SamplingSoFilmAmount) as xfilm FROM sample_so_by_step JOIN t_test ON SampleSoByStepT_TestID = T_TestID JOIN group_resultdetail ON Group_ResultDetailT_TestID = SampleSoByStepT_TestID AND Group_ResultDetailIsActive = 'Y' LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = SampleSoByStepT_OrderHeaderID AND T_SamplingSoT_TestID = SampleSoByStepT_TestID LEFT JOIN t_samplingso_form ON T_SamplingSoFormT_SamplingSOID = T_SamplingSoID LEFT JOIN t_samplingso_film ON T_SamplingSoFilmT_SamplingSoID = T_SamplingSoID JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$prm['group_id']} JOIN t_orderheader ON SampleSoByStepT_OrderHeaderID = T_OrderHeaderID LEFT JOIN m_user ON SampleSoByStepUserID = M_UserID LEFT JOIN nat_requirement ON json_contains(SampleSoByStepReuirements, Nat_RequirementID) WHERE SampleSoByStepT_OrderHeaderID = {$xid} AND ( {$x_status_so} ) ) x GROUP BY SampleByStepID"; $datas = $this->db_onedev->query($sql_log)->result_array(); $arr_datas = array(); foreach($datas as $k => $v){ $found = $this->search_exist($arr_datas, $v['SampleByStepDateTime'], $v['SampleByStepM_StatusSampleCode'], $v['M_UserUsername']); if ($found == -1) { $xv = array( "datetime" => $v['SampleByStepDateTime'], "status" => $v['SampleByStepM_StatusSampleCode'], "user" => $v["M_UserUsername"] ? $v["M_UserUsername"] : 'Sistem', "group_id" => $v["group_id"], "details" => array( array( "SampleByStepID" => $v["SampleByStepID"], "T_BarcodeLabBarcode" => $v["T_BarcodeLabBarcode"], "T_SampleTypeName" => $v["T_SampleTypeName"], "M_UserUsername" => $v["M_UserUsername"] ? $v["M_UserUsername"] : 'Sistem', "SampleByStepRequirementStatus"=> $v["SampleByStepRequirementStatus"], "requirements" => $v["requirements"], "group_id" => $v["group_id"], "xform" => $v["xform"], "xfilm" => $v["xfilm"] ) ) ); array_push($arr_datas, $xv); } else { $xarr = $arr_datas[$found]['details']; array_push( $xarr, array( "SampleByStepID" => $v["SampleByStepID"], "T_BarcodeLabBarcode" => $v["T_BarcodeLabBarcode"], "T_SampleTypeName" => $v["T_SampleTypeName"], "M_UserUsername" => $v["M_UserUsername"] ? $v["M_UserUsername"] : 'Sistem', "SampleByStepRequirementStatus"=> $v["SampleByStepRequirementStatus"], "requirements" => $v["requirements"], "group_id" => $v["group_id"], "xform" => $v["xform"], "xfilm" => $v["xfilm"] ) ); $arr_datas[$found]['details'] = $xarr; } } } $result = array("header" => $data_header, "resume" => $data_resume, "records" => $arr_datas); $this->sys_ok($result); } function getdata_result(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $this->_check_is_supervisor(); $prm = $this->sys_input; $xid = $prm["xid"]; $sql = "SELECT *,'{$prm['group_name']}' as group_name, '{$prm['action']}' as action FROM one_lab.t_orderheader JOIN one_lab.m_patient ON T_OrderHeaderM_PatientID = M_PatientID WHERE T_OrderHeaderID = {$xid}"; $data_header = $this->db_onedev->query($sql)->row_array(); // 1. Cek tipe grup (LAB atau NON-LAB) $sql_check = "SELECT IFNULL(Nat_TestIsNonLab, '') as Nat_TestIsNonLab, Group_ResultFlagNonLab, Group_ResultName, IFNULL(Nat_GroupCode, '') as Nat_GroupCode FROM one_lab.group_result JOIN one_lab.group_resultdetail ON Group_ResultID = Group_ResultDetailGroup_ResultID JOIN one_lab.t_test ON Group_ResultDetailT_TestID = T_TestID LEFT JOIN one_lab.nat_test ON T_TestNat_TestID = Nat_TestID LEFT JOIN one_lab.nat_group ON Nat_TestNat_GroupID = Nat_GroupID WHERE Group_ResultID = {$prm['group_id']} LIMIT 1"; $check_query = $this->db_onedev->query($sql_check); $check_rst = $check_query ? $check_query->row_array() : null; $is_lab = true; $nat_group_code = ''; $is_other_lab = false; if ($check_rst) { if ($check_rst['Nat_TestIsNonLab'] != '') { if ($check_rst['Group_ResultFlagNonLab'] == 'N') { $is_other_lab = true; } else { $is_lab = false; } } elseif ($check_rst['Group_ResultFlagNonLab'] == 'Y') { $is_lab = false; } $nat_group_code = $check_rst['Nat_GroupCode']; } $datas = array(); if ($is_lab) { // LAB - ambil dari log_orderdetail $sql = " SELECT o.T_OrderDetailID, o.T_OrderDetailT_TestSasCode as sascode, o.T_OrderDetailT_TestName as test_name, UPPER(IF(l.Log_OrderDetailStatus = '' OR l.Log_OrderDetailStatus IS NULL, 'RESULTENTRY', l.Log_OrderDetailStatus)) as log_status, DATE_FORMAT(l.Log_OrderDetailCreated,'%d-%m-%Y %H:%i') as log_datetime, l.Log_OrderDetailCreated as raw_date, IFNULL(u.M_UserUsername, 'Sistem') as log_username, l.Log_OrderDetailResult as result FROM one_lab_log.log_orderdetail l JOIN one_lab.t_orderdetail o ON l.Log_OrderDetailT_OrderDetailID = o.T_OrderDetailID LEFT JOIN one_lab.m_user u ON l.Log_OrderDetailUserID = u.M_UserID JOIN one_lab.group_resultdetail ON Group_ResultDetailT_TestID = o.T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' JOIN one_lab.group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultID = {$prm['group_id']} WHERE o.T_OrderDetailT_OrderHeaderID = {$xid} AND o.T_OrderDetailIsActive = 'Y' ORDER BY l.Log_OrderDetailCreated ASC "; $q_lab = $this->db_onedev->query($sql); if ($q_lab) { $datas = $q_lab->result_array(); if ($is_other_lab) { $db_debug = $this->db_onedev->db_debug; $this->db_onedev->db_debug = false; foreach ($datas as &$v) { $raw_date = $v['raw_date']; $det_id = $v['T_OrderDetailID']; $queries = [ "SELECT Log_OtherCytologiJSON as res, Log_OtherCytologiDatetime as ddate FROM one_lab_log.log_other_cytologi WHERE Log_OtherCytologiOther_CytologiID IN (SELECT Other_CytologiID FROM one_lab.other_cytologi WHERE Other_CytologiT_OrderDetailID = {$det_id}) AND Log_OtherCytologiDatetime <= '{$raw_date}' ORDER BY Log_OtherCytologiDatetime DESC LIMIT 1", "SELECT Log_OtherFNAJSON as res, Log_OtherFNADatetime as ddate FROM one_lab_log.log_other_fna WHERE Log_OtherFNAOther_FNAID IN (SELECT Other_FNAID FROM one_lab.other_fna WHERE Other_FNAT_OrderDetailID = {$det_id}) AND Log_OtherFNADatetime <= '{$raw_date}' ORDER BY Log_OtherFNADatetime DESC LIMIT 1", "SELECT Log_OtherLcprepJSON as res, Log_OtherLcprepDateTime as ddate FROM one_lab_log.log_other_lcprep WHERE Log_OtherLcprepOther_LcprepID IN (SELECT Other_LcprepID FROM one_lab.other_lcprep WHERE Other_LcprepT_OrderDetailID = {$det_id}) AND Log_OtherLcprepDateTime <= '{$raw_date}' ORDER BY Log_OtherLcprepDateTime DESC LIMIT 1", "SELECT Log_OtherMikroJSON as res, Log_OtherMikroCreated as ddate FROM one_lab_log.log_other_mikro WHERE Log_OtherMikroOther_MikroID IN (SELECT Other_MikroID FROM one_lab.other_mikro WHERE Other_MikroT_OrderDetailID = {$det_id}) AND Log_OtherMikroCreated <= '{$raw_date}' ORDER BY Log_OtherMikroCreated DESC LIMIT 1", "SELECT Log_OtherPatologiAnatomyJSON as res, Log_OtherPatologiAnatomyCreated as ddate FROM one_lab_log.log_other_patologianatomy WHERE Log_OtherPatologiAnatomyLog_OtherPatologiAnatomyID IN (SELECT Other_PatologiAnatomyID FROM one_lab.other_patologianatomy WHERE Other_PatologiAnatomyT_OrderDetailID = {$det_id}) AND Log_OtherPatologiAnatomyCreated <= '{$raw_date}' ORDER BY Log_OtherPatologiAnatomyCreated DESC LIMIT 1", "SELECT Log_OtherPapsmearJSON as res, Log_OtherPapsmearDatetime as ddate FROM one_lab_log.log_other_papsmear WHERE Log_OtherPapsmearOther_PapsmearID IN (SELECT Other_PapsmearID FROM one_lab.other_papsmear WHERE Other_PapsmearT_OrderDetailID = {$det_id}) AND Log_OtherPapsmearDatetime <= '{$raw_date}' ORDER BY Log_OtherPapsmearDatetime DESC LIMIT 1" ]; $best_date = null; $best_res = null; foreach ($queries as $q) { $q_det = @$this->db_onedev->query($q); if ($q_det && $q_det->num_rows() > 0) { $det = $q_det->row_array(); if ($best_date === null || strtotime($det['ddate']) > strtotime($best_date)) { $best_date = $det['ddate']; $best_res = $det['res']; } } } if ($best_res !== null) { $res_json = json_decode($best_res, true); if (is_array($res_json)) { $v['result'] = "Formulir telah diisi (Lihat detail pada form)"; } else { $v['result'] = $best_res ? $best_res : "Lihat detail pada form"; } } } unset($v); $this->db_onedev->db_debug = $db_debug; } } } else { // NON-LAB - cek nat_group_code untuk menentukan sumber data // Nat_GroupCode = 4 = Layanan Medis lainnya (Pemeriksaan Fisik, dll) → pakai t_samplingso // Nat_GroupCode = 2 = Elektromedis, 3 = Radiologi → pakai so_resultentry if ($nat_group_code == '4' || $nat_group_code == '') { // Layanan Medis lainnya → ambil dari t_samplingso $sql_re = "SELECT o.T_OrderDetailID, o.T_OrderDetailT_TestSasCode as sascode, o.T_OrderDetailT_TestName as test_name, IF(T_SamplingSoProcessDate IS NOT NULL, 'SAMPLING', NULL) as step1_status, DATE_FORMAT(T_SamplingSoProcessDate,'%d-%m-%Y %H:%i') as step1_datetime, proc_user.M_UserUsername as step1_username, IF(T_SamplingSoDoneDate IS NOT NULL, 'DONE', NULL) as step2_status, DATE_FORMAT(T_SamplingSoDoneDate,'%d-%m-%Y %H:%i') as step2_datetime, done_user.M_UserUsername as step2_username, IF(T_SamplingSoVerifyDate IS NOT NULL, 'VERIF', NULL) as step3_status, DATE_FORMAT(T_SamplingSoVerifyDate,'%d-%m-%Y %H:%i') as step3_datetime, verif_user.M_UserUsername as step3_username, IF(T_SamplingSoReceiveAdmDate IS NOT NULL, 'PROCESS', NULL) as step4_status, DATE_FORMAT(T_SamplingSoReceiveAdmDate,'%d-%m-%Y %H:%i') as step4_datetime, adm_user.M_UserUsername as step4_username FROM t_orderdetail o JOIN t_test ON o.T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y' JOIN group_resultdetail ON Group_ResultDetailT_TestID = o.T_OrderDetailT_TestID AND Group_ResultDetailIsActive = 'Y' LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = o.T_OrderDetailT_OrderHeaderID AND T_SamplingSoT_TestID = o.T_OrderDetailT_TestID AND T_SamplingSoIsActive = 'Y' LEFT JOIN m_user proc_user ON T_SamplingSoProcessUserID = proc_user.M_UserID LEFT JOIN m_user done_user ON T_SamplingSoDoneUserID = done_user.M_UserID LEFT JOIN m_user verif_user ON T_SamplingSoVerifyUserID = verif_user.M_UserID LEFT JOIN m_user adm_user ON T_SamplingSoReceiveAdmUserID = adm_user.M_UserID WHERE o.T_OrderDetailT_OrderHeaderID = {$xid} AND Group_ResultDetailGroup_ResultID = {$prm['group_id']} AND o.T_OrderDetailIsActive = 'Y' GROUP BY o.T_OrderDetailID"; $q_re = $this->db_onedev->query($sql_re); if ($q_re) { $re_list = $q_re->result_array(); foreach ($re_list as $re) { $steps = [ [ 'status' => $re['step1_status'], 'datetime' => $re['step1_datetime'], 'username' => $re['step1_username'] ], [ 'status' => $re['step2_status'], 'datetime' => $re['step2_datetime'], 'username' => $re['step2_username'] ], [ 'status' => $re['step3_status'], 'datetime' => $re['step3_datetime'], 'username' => $re['step3_username'] ], [ 'status' => $re['step4_status'], 'datetime' => $re['step4_datetime'], 'username' => $re['step4_username'] ], ]; foreach ($steps as $step) { if ($step['status'] === null) continue; $datas[] = [ 'sascode' => $re['sascode'], 'test_name' => $re['test_name'], 'log_status' => $step['status'], 'log_datetime' => $step['datetime'], 'log_username' => $step['username'] ? $step['username'] : 'Sistem', 'result' => '-' ]; } } } } else { // Elektromedis / Radiologi → ambil dari so_resultentry & so_reactionlog $sql_re = "SELECT re.So_ResultEntryID, re.So_ResultEntryNonlab_TemplateID as template_id, IFNULL(nt.NonlabTemplateFlagOther, 'N') as flag_other, o.T_OrderDetailT_TestSasCode as sascode, o.T_OrderDetailT_TestName as test_name FROM one_lab.so_resultentry re JOIN one_lab.t_orderdetail o ON re.So_ResultEntryT_OrderDetailID = o.T_OrderDetailID JOIN one_lab.group_resultdetail gd ON o.T_OrderDetailT_TestID = gd.Group_ResultDetailT_TestID AND gd.Group_ResultDetailIsActive = 'Y' LEFT JOIN one_lab.nonlab_template nt ON re.So_ResultEntryNonlab_TemplateID = nt.NonlabTemplateID WHERE o.T_OrderDetailT_OrderHeaderID = {$xid} AND gd.Group_ResultDetailGroup_ResultID = {$prm['group_id']} AND o.T_OrderDetailIsActive = 'Y'"; $q_re = $this->db_onedev->query($sql_re); if ($q_re) { $re_list = $q_re->result_array(); foreach ($re_list as $re) { $re_id = $re['So_ResultEntryID']; $sql_react = "SELECT So_REActionLogAction as log_status, DATE_FORMAT(So_REActionLogDate,'%d-%m-%Y %H:%i') as log_datetime, So_REActionLogDate as raw_date, u.M_UserUsername as log_username FROM one_lab.so_reactionlog LEFT JOIN one_lab.m_user u ON So_REActionLogUserID = u.M_UserID WHERE So_REActionLogSo_ResultEntryID = {$re_id} ORDER BY So_REActionLogDate ASC"; $q_react = $this->db_onedev->query($sql_react); if (!$q_react) continue; $reactions = $q_react->result_array(); foreach ($reactions as $reaction) { $result_text = "Lihat detail pada form"; $raw_date = $reaction['raw_date']; $template_id = $re['template_id']; $flag_other = $re['flag_other']; if ($flag_other == 'N') { $sql_det = "SELECT Log_ResultEntrySoAfterSON as res FROM one_lab_log.log_resultentry_so_detail WHERE Log_ResultEntrySoSo_ResultEntryID = {$re_id} AND Log_ResultEntrySoDate <= '{$raw_date}' ORDER BY Log_ResultEntrySoDate DESC LIMIT 1"; $q_det = $this->db_onedev->query($sql_det); if ($q_det && $q_det->num_rows() > 0) { $det = $q_det->row_array(); $res_json = json_decode($det['res'], true); if (is_array($res_json) && count($res_json) > 0) { $texts = []; foreach ($res_json as $r) { if (isset($r['So_ResultEntryDetailResult']) && $r['So_ResultEntryDetailResult'] !== '') { $texts[] = $r['So_ResultEntryDetailResult']; } } if (count($texts) > 0) $result_text = implode(", ", $texts); } else { $result_text = $det['res']; } } } else { $sql_det = ""; if ($template_id == 27) { $sql_det = "SELECT Log_ResultEntryFisikUmumAfterJSON as res FROM one_lab_log.log_resultentry_fisik_umum WHERE Log_ResultEntryFisikUmumT_OrderHeaderID = {$xid} AND Log_ResultEntryFisikUmumDate <= '{$raw_date}' ORDER BY Log_ResultEntryFisikUmumDate DESC LIMIT 1"; } else if ($template_id == 52) { $sql_det = "SELECT Log_ResultEntrySDSAfterJSON as res, Log_ResultEntrySDSDate as ddate FROM one_lab_log.log_resultentrysds WHERE Log_ResultEntrySDSSo_ResultEntryID = {$re_id} AND Log_ResultEntrySDSDate <= '{$raw_date}' UNION ALL SELECT Log_ResultEntrySDSIdentityAfterJSON as res, Log_ResultEntrySDSIdentityDate as ddate FROM one_lab_log.log_resultentrysdsidentity WHERE Log_ResultEntrySDSIdentitySo_ResultEntryID = {$re_id} AND Log_ResultEntrySDSIdentityDate <= '{$raw_date}' UNION ALL SELECT Log_ResultEntrySDSInterpretationAfterJSON as res, Log_ResultEntrySDSInterpretationDate as ddate FROM one_lab_log.log_resultentrysdsinterpretation WHERE Log_ResultEntrySDSInterpretationSo_ResultEntryID = {$re_id} AND Log_ResultEntrySDSInterpretationDate <= '{$raw_date}' UNION ALL SELECT Log_ResultEntrySDSTypeAfterJSON as res, Log_ResultEntrySDSTypeDate as ddate FROM one_lab_log.log_resultentrysds_type WHERE Log_ResultEntrySDSTypeSo_ResultEntryID = {$re_id} AND Log_ResultEntrySDSTypeDate <= '{$raw_date}' ORDER BY ddate DESC LIMIT 1"; } else if ($template_id == 53) { $sql_det = "SELECT Log_ResultEntrySrq29ConclusionAfterJSON as res, Log_ResultEntrySrq29ConclusionDate as ddate FROM one_lab_log.log_resultentry_srq29_conclusion WHERE Log_ResultEntrySrq29ConclusionSo_ResultEntryID = {$re_id} AND Log_ResultEntrySrq29ConclusionDate <= '{$raw_date}' UNION ALL SELECT Log_ResultEntrySrq29QuestionAfterJSON as res, Log_ResultEntrySrq29QuestionDate as ddate FROM one_lab_log.log_resultentry_srq29_question WHERE Log_ResultEntrySrq29QuestionSo_ResultEntryID = {$re_id} AND Log_ResultEntrySrq29QuestionDate <= '{$raw_date}' ORDER BY ddate DESC LIMIT 1"; } else if ($template_id == 57) { $sql_det = "SELECT Log_ResultEntrySmwtAfterJSON as res, Log_ResultEntrySmwtDate as ddate FROM one_lab_log.log_resultentry_smwt WHERE Log_ResultEntrySmwtSo_ResultentryID = {$re_id} AND Log_ResultEntrySmwtDate <= '{$raw_date}' UNION ALL SELECT Log_ResultEntrySmwtDetailsAfterJSON as res, Log_ResultEntrySmwtDetailsDate as ddate FROM one_lab_log.log_resultentry_smwt_details WHERE Log_ResultEntrySmwtDetailsSo_ResultentrySmwtID = {$re_id} AND Log_ResultEntrySmwtDetailsDate <= '{$raw_date}' ORDER BY ddate DESC LIMIT 1"; } else if ($template_id == 58) { $sql_det = "SELECT Log_ResultEntryFisioterapiAfterJSON as res FROM one_lab_log.log_resultentry_fisioterapi WHERE Log_ResultEntryFisioterapiSo_ResultEntryID = {$re_id} AND Log_ResultEntryFisioterapiDate <= '{$raw_date}' ORDER BY Log_ResultEntryFisioterapiDate DESC LIMIT 1"; } if ($sql_det != "") { $q_det = $this->db_onedev->query($sql_det); if ($q_det && $q_det->num_rows() > 0) { $det = $q_det->row_array(); $res_json = json_decode($det['res'], true); if (is_array($res_json)) { $result_text = "Formulir telah diisi (Lihat detail pada form)"; } else { $result_text = $det['res'] ? $det['res'] : "Lihat detail pada form"; } } } } $log_status = strtoupper($reaction['log_status']); if ($log_status == 'INSERT' || $log_status == 'UPDATE') { $log_status = 'RESULTENTRY'; } $datas[] = [ 'sascode' => $re['sascode'], 'test_name' => $re['test_name'], 'log_status' => $log_status, 'log_datetime' => $reaction['log_datetime'], 'log_username' => $reaction['log_username'] ? $reaction['log_username'] : 'Sistem', 'result' => $result_text ]; } } } } // Sort semua data NON-LAB berdasarkan datetime usort($datas, function($a, $b) { return strtotime($a['log_datetime']) - strtotime($b['log_datetime']); }); } // Grouping data berdasarkan datetime + status + username $arr_datas = array(); foreach ($datas as $k => $v) { $found = $this->search_exist($arr_datas, $v['log_datetime'], $v['log_status'], $v['log_username']); if ($found == -1) { $xv = array( "datetime" => $v['log_datetime'], "status" => $v['log_status'], "user" => $v["log_username"], "group_id" => $prm['group_id'], "details" => array( array( "sascode" => $v["sascode"], "test_name" => $v["test_name"], "result" => $v["result"] ) ) ); array_push($arr_datas, $xv); } else { $xarr = $arr_datas[$found]['details']; array_push( $xarr, array( "sascode" => $v["sascode"], "test_name" => $v["test_name"], "result" => $v["result"] ) ); $arr_datas[$found]['details'] = $xarr; } } $result = array("header" => $data_header, "records" => $arr_datas); $this->sys_ok($result); } function getdata_print(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $this->_check_is_supervisor(); $prm = $this->sys_input; $xid = $prm["xid"]; $arr_datas = array('group_name' => $prm['group_name'],'patient_name' => $prm['patient_name'],'no_reg' => $prm['no_reg'], 'no_reg_ext' => $prm['no_reg_ext'],'data_internal' => array(),'data_external' => array()); $sql = "SELECT result_processtooffice.*, Group_ResultName as group_name, sender.M_UserUsername as sender_name, receiver.M_UserUsername as receiver_name, DATE_FORMAT(Result_ProcessToOfficeSendTime,'%d-%m-%Y %H:%i') as sent_time, DATE_FORMAT(Result_ProcessToOfficeReceiveTime,'%d-%m-%Y %H:%i') as received_time, Result_ProcessToOfficeStatus as status, M_DeliveryTypeCode as delivery_type, DATE_FORMAT(T_OrderPromiseDateTime,'%d-%m-%Y %H:%i') as promise_time FROM result_processtooffice JOIN t_orderpromise ON Result_ProcessToOfficeT_OrderPromiseID = T_OrderPromiseID JOIN group_result ON Result_ProcessToOfficeGroup_ResultID = Group_ResultID JOIN m_delivery ON Result_ProcessToOfficeT_OrderDeliveryM_DeliveryID = M_DeliveryID JOIN m_deliverytype ON Result_ProcessToOfficeT_OrderDeliveryM_DeliveryTypeID = M_DeliveryTypeID JOIN m_user sender ON Result_ProcessToOfficeSendBy = sender.M_UserID LEFT JOIN m_user receiver ON Result_ProcessToOfficeReceivedBy = receiver.M_UserID WHERE Result_ProcessToOfficeIsActive = 'Y' AND Result_ProcessToOfficeT_OrderHeaderID = {$prm['xid']} UNION SELECT result_processtooffice.*, Group_ResultName as group_name, sender.M_UserUsername as sender_name, receiver.M_UserUsername as receiver_name, DATE_FORMAT(Result_ProcessToOfficeSendTime,'%d-%m-%Y %H:%i') as sent_time, DATE_FORMAT(Result_ProcessToOfficeReceiveTime,'%d-%m-%Y %H:%i') as received_time, Result_ProcessToOfficeStatus as status, M_DeliveryTypeCode as delivery_type, DATE_FORMAT(T_OrderPromiseDateTime,'%d-%m-%Y %H:%i') as promise_time FROM result_processtooffice JOIN t_orderpromise ON Result_ProcessToOfficeT_OrderPromiseID = T_OrderPromiseID JOIN group_resultdetail ON Result_ProcessToOfficeGroup_ResultID = Group_ResultDetailT_TestID JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID JOIN m_delivery ON Result_ProcessToOfficeT_OrderDeliveryM_DeliveryID = M_DeliveryID JOIN m_deliverytype ON Result_ProcessToOfficeT_OrderDeliveryM_DeliveryTypeID = M_DeliveryTypeID JOIN m_user sender ON Result_ProcessToOfficeSendBy = sender.M_UserID LEFT JOIN m_user receiver ON Result_ProcessToOfficeReceivedBy = receiver.M_UserID WHERE Result_ProcessToOfficeIsActive = 'Y' AND Result_ProcessToOfficeT_OrderHeaderID = {$prm['xid']}"; //echo $sql; $data_rst = $this->db_onedev->query($sql)->result_array(); if($data_rst){ $arr_datas['data_internal'] = $data_rst; } $sql = "SELECT T_OrderDeliveryID as id, M_DeliveryName as delivery_name, T_OrderDeliveryDestination as destinastion, M_DeliveryTypeCode as delivery_type, 'Y' as xshow, '' as details FROM t_orderdelivery JOIN m_delivery ON T_OrderDeliveryM_DeliveryID = M_DeliveryID JOIN m_deliverytype ON T_OrderDeliveryM_DeliveryTypeID = M_DeliveryTypeID WHERE T_OrderDeliveryT_OrderHeaderID = {$prm['xid']} AND T_OrderDeliveryIsActive = 'Y'"; $data_delivery = $this->db_onedev->query($sql)->result_array(); if($data_delivery){ foreach($data_delivery as $k => $v){ if($v['delivery_type'] == 'PICKUP'){ $sql = "SELECT M_UserUsername as sender_name, DATE_FORMAT(Result_HandOverPatientDateTime,'%d-%m-%Y %H:%i') as sent_time, Result_HandOverPatientReceiverName as receiver_name, IFNULL(Result_HandOverPatientReceiverHp,'') as receiver_hp, IFNULL(Result_HandOverPatientReceiverInfo,'') as receiver_info, DATE_FORMAT(T_OrderPromiseDateTime,'%d-%m-%Y %H:%i') as promise_time FROM result_handoverpatient LEFT JOIN m_user ON Result_HandOverPatientOfficer = M_UserID JOIN t_orderpromise ON Result_HandOverPatientT_OrderPromiseID = T_OrderPromiseID WHERE Result_HandOverPatientT_OrderHeaderID = {$prm['xid']} AND Result_HandOverPatientIsActive = 'Y'"; $data_details = $this->db_onedev->query($sql)->result_array(); if($data_details){ $data_delivery[$k]['details'] = $data_details; } } if($v['delivery_type'] == 'EMAIL'){ $sql = "SELECT M_UserUsername as sender_name, DATE_FORMAT(Result_HandOverEmailSendDateTime,'%d-%m-%Y %H:%i') as sent_time, DATE_FORMAT(Result_HandOverEmailReceivedDateTime,'%d-%m-%Y %H:%i') as received_time, DATE_FORMAT(T_OrderPromiseDateTime,'%d-%m-%Y %H:%i') as promise_time, Result_HandOverEmailStatus as status FROM result_handoveremail LEFT JOIN m_user ON Result_HandOverEmailOfficer = M_UserID JOIN t_orderpromise ON Result_HandOverEmailT_OrderPromiseID = T_OrderPromiseID WHERE Result_HandOverEmailT_OrderHeaderID = {$prm['xid']} AND Result_HandOverEmailIsActive = 'Y' AND Result_HandOverEmailT_OrderDeliveryID = {$v['id']}"; $data_details = $this->db_onedev->query($sql)->result_array(); if($data_details){ $data_delivery[$k]['details'] = $data_details; } } if($v['delivery_type'] == 'WHATSAPP'){ $sql = " SELECT Tx_WhatsappDetailID as xid, Group_ResultName as group_name, Tx_WhatsappDestination as destination, Tx_WhatsappDetailUuid as uuid, DATE_FORMAT(Tx_WhatsappDetailSend,'%d-%m-%Y %H:%i') as send_time, DATE_FORMAT(Tx_WhatsappDetailReceive,'%d-%m-%Y %H:%i') as received_time, DATE_FORMAT(Tx_WhatsappDetailRead,'%d-%m-%Y %H:%i') as read_time, Tx_WhatsappDetailIsSend as isSend, Tx_WhatsappDetailIsReceive as isReceive, Tx_WhatsappDetailIsRead as isRead FROM tx_whatsappdetail JOIN tx_whatsapp ON Tx_WhatsappDetailTx_WhatsappID = Tx_WhatsappID AND Tx_WhatsappT_OrderHeaderID = {$prm['xid']} JOIN group_result ON Tx_WhatsappGroup_ResultID = Group_ResultID WHERE Tx_WhatsappIsActive = 'Y' UNION SELECT Tx_WhatsappDetailID as xid, Group_ResultName as group_name, Tx_WhatsappDestination as destination, Tx_WhatsappDetailUuid as uuid, DATE_FORMAT(Tx_WhatsappDetailSend,'%d-%m-%Y %H:%i') as send_time, DATE_FORMAT(Tx_WhatsappDetailReceive,'%d-%m-%Y %H:%i') as received_time, DATE_FORMAT(Tx_WhatsappDetailRead,'%d-%m-%Y %H:%i') as read_time, Tx_WhatsappDetailIsSend as isSend, Tx_WhatsappDetailIsReceive as isReceive, Tx_WhatsappDetailIsRead as isRead FROM tx_whatsappdetail JOIN tx_whatsapp ON Tx_WhatsappDetailTx_WhatsappID = Tx_WhatsappID AND Tx_WhatsappT_OrderHeaderID = {$prm['xid']} JOIN group_resultdetail ON Tx_WhatsappGroup_ResultID = Group_ResultDetailT_TestID JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID WHERE Tx_WhatsappIsActive = 'Y' "; //echo $sql; $data_details = $this->db_onedev->query($sql)->result_array(); if($data_details){ $data_delivery[$k]['details'] = $data_details; } } if($v['delivery_type'] == 'ADDRESS'){ $sql = " SELECT * FROM ( SELECT CONCAT('dibuat spk : ',Result_CourierSPKNumbering) as status, DATE_FORMAT(Result_CourierDetailStepByStepLastUpdated,'%d.%m.%Y %H:%i') as xtime, M_UserUsername as username, '' as xperson, '' as xnote, Result_CourierSPKDetailID as xid, Result_CourierDetailStepByStepID as stepid FROM result_courierspk_detail_step_by_step JOIN result_courierspk_detail ON Result_CourierDetailStepByStepResult_CourierSPKDetailID = Result_CourierSPKDetailID JOIN result_courierspk ON Result_CourierSPKDetailResult_CourierSPKID = Result_CourierSPKID JOIN m_user ON Result_CourierDetailStepByStepUserID = M_UserID WHERE Result_CourierSPKDetailT_OrderDeliveryID = {$v['id']} AND Result_CourierDetailStepByStepStatus = 'N' UNION SELECT CONCAT('dikonfirmasi spv : ',Result_CourierSPKNumbering) as status, DATE_FORMAT(Result_CourierDetailStepByStepLastUpdated,'%d.%m.%Y %H:%i') as xtime, M_UserUsername as username, '' as xperson, '' as xnote, Result_CourierSPKDetailID as xid, Result_CourierDetailStepByStepID as stepid FROM result_courierspk_detail_step_by_step JOIN result_courierspk_detail ON Result_CourierDetailStepByStepResult_CourierSPKDetailID = Result_CourierSPKDetailID JOIN result_courierspk ON Result_CourierSPKDetailResult_CourierSPKID = Result_CourierSPKID JOIN m_user ON Result_CourierDetailStepByStepUserID = M_UserID WHERE Result_CourierSPKDetailT_OrderDeliveryID = {$v['id']} AND Result_CourierDetailStepByStepStatus = 'O' UNION SELECT 'dikonfirmasi spv' as status, DATE_FORMAT(Result_CourierDetailStepByStepLastUpdated,'%d.%m.%Y %H%i') as xtime, M_UserUsername as username, '' as xperson, '' as xnote, Result_CourierSPKDetailID as xid, Result_CourierDetailStepByStepID as stepid FROM result_courierspk_detail_step_by_step JOIN result_courierspk_detail ON Result_CourierDetailStepByStepResult_CourierSPKDetailID = Result_CourierSPKDetailID JOIN result_courierspk ON Result_CourierSPKDetailResult_CourierSPKID = Result_CourierSPKID JOIN m_user ON Result_CourierDetailStepByStepUserID = M_UserID WHERE Result_CourierSPKDetailT_OrderDeliveryID = {$v['id']} AND Result_CourierDetailStepByStepStatus = 'X' UNION SELECT CONCAT('diserahkan ke kurir : ',Result_CourierSPKNumbering) as status, DATE_FORMAT(Result_CourierDetailStepByStepLastUpdated,'%d.%m.%Y %H:%i') as xtime, M_UserUsername as username, '' as xperson, '' as xnote, Result_CourierSPKDetailID as xid, Result_CourierDetailStepByStepID as stepid FROM result_courierspk_detail_step_by_step JOIN result_courierspk_detail ON Result_CourierDetailStepByStepResult_CourierSPKDetailID = Result_CourierSPKDetailID JOIN result_courierspk ON Result_CourierSPKDetailResult_CourierSPKID = Result_CourierSPKID JOIN m_user ON Result_CourierDetailStepByStepUserID = M_UserID WHERE Result_CourierSPKDetailT_OrderDeliveryID = {$v['id']} AND Result_CourierDetailStepByStepStatus = 'S' UNION SELECT CONCAT('selesai : ',Result_CourierSPKNumbering) as status, DATE_FORMAT(Result_CourierDetailStepByStepLastUpdated,'%d.%m.%Y %H:%i') as xtime, M_UserUsername as username, Result_CourierComingHomeDetailsReceiver as xperson, UPPER(M_CourierStatusReceiveName) as xnote, Result_CourierSPKDetailID as xid, Result_CourierDetailStepByStepID as stepid FROM result_courierspk_detail_step_by_step JOIN result_courierspk_detail ON Result_CourierDetailStepByStepResult_CourierSPKDetailID = Result_CourierSPKDetailID JOIN result_courierspk ON Result_CourierSPKDetailResult_CourierSPKID = Result_CourierSPKID JOIN result_couriercominghome_details ON Result_CourierComingHomeDetailsResult_CourierSPKDetailID = Result_CourierSPKDetailID JOIN m_user ON Result_CourierDetailStepByStepUserID = M_UserID JOIN m_courierstatusreceive ON Result_CourierComingHomeDetailsM_CourierStatusReceiveID = M_CourierStatusReceiveID WHERE Result_CourierSPKDetailT_OrderDeliveryID = {$v['id']} AND Result_CourierDetailStepByStepStatus = 'D' ) x GROUP BY xid,status ORDER BY stepid ASC "; //echo $sql; $data_details = $this->db_onedev->query($sql)->result_array(); if($data_details){ $data_delivery[$k]['details'] = $data_details; } } } } $arr_datas['data_external'] = $data_delivery; $result = $arr_datas; $this->sys_ok($result); } function search_exist($datas,$xtime,$status,$username){ $rtn = -1; foreach($datas as $k => $v){ if($v['datetime'] == $xtime && $v['status'] == $status && $v['user'] == $username){ $rtn = $k; } } return $rtn; } function get_mou_list(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $company_id = isset($prm['company_id']) ? $prm['company_id'] : 0; $sql = "SELECT M_MouID, M_MouName FROM m_mou WHERE M_MouIsActive = 'Y' AND M_MouM_CompanyID = {$company_id} ORDER BY M_MouName ASC"; $query = $this->db_onedev->query($sql); if($query){ $this->sys_ok($query->result_array()); } else { $this->sys_error("Gagal mengambil data MOU"); } } function get_mou(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $xid = $prm["xid"]; // T_OrderHeaderID // Ambil MOU yang sedang dipakai pada order ini $sql = "SELECT m.M_MouID, m.M_MouName, h.T_OrderHeaderID, h.T_OrderHeaderLabNumber FROM t_orderheader h JOIN m_mou m ON h.T_OrderHeaderM_MouID = m.M_MouID WHERE h.T_OrderHeaderID = {$xid} AND h.T_OrderHeaderIsActive = 'Y'"; $query = $this->db_onedev->query($sql); $current_mou = array(); if($query){ $row = $query->row_array(); if($row){ $current_mou = $row; } } // Ambil daftar MOU berdasarkan company pertama registrasi pasien $sql = "SELECT M_MouID, M_MouName FROM m_mou WHERE M_MouIsActive = 'Y' AND M_MouM_CompanyID = ( SELECT T_OrderHeaderM_CompanyID FROM t_orderheader WHERE T_OrderHeaderID = {$xid} AND T_OrderHeaderIsActive = 'Y' ) ORDER BY M_MouName ASC"; $query = $this->db_onedev->query($sql); $mou_list = array(); if($query){ $mou_list = $query->result_array(); } $result = array( "current_mou" => $current_mou, "mou_list" => $mou_list ); $this->sys_ok($result); } function save_mou(){ if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $xid = $prm["xid"]; $new_mou_id = $prm["new_mou_id"]; // Ambil User ID secara aman dari session atau JWT payload $user_id = 0; if (isset($this->sys_user['M_UserID'])) { $user_id = $this->sys_user['M_UserID']; } elseif (isset($this->sys_user['id'])) { $user_id = $this->sys_user['id']; } elseif (isset($prm['token'])) { $token_parts = explode('.', $prm['token']); if (count($token_parts) == 3) { $payload = json_decode(base64_decode($token_parts[1]), true); if (isset($payload['M_UserID'])) { $user_id = $payload['M_UserID']; } } } $sql = "SELECT m.M_MouID, m.M_MouName FROM t_orderheader h JOIN m_mou m ON h.T_OrderHeaderM_MouID = m.M_MouID WHERE h.T_OrderHeaderID = {$xid} AND h.T_OrderHeaderIsActive = 'Y'"; $old_mou = $this->db_onedev->query($sql)->row_array(); if(!$old_mou){ $this->sys_error("Data order tidak ditemukan"); exit; } $sql = "SELECT M_MouID, M_MouName FROM m_mou WHERE M_MouID = {$new_mou_id} AND M_MouIsActive = 'Y'"; $new_mou = $this->db_onedev->query($sql)->row_array(); if(!$new_mou){ $this->sys_error("MOU baru tidak ditemukan"); exit; } if($old_mou['M_MouID'] == $new_mou_id){ $this->sys_error("MOU baru sama dengan MOU lama"); exit; } $this->db_onedev->trans_start(); // 1. Update Order Header menggunakan Query Builder (lebih aman dari SQL Injection & karakter kutip) $this->db_onedev->where('T_OrderHeaderID', $xid); $this->db_onedev->update('t_orderheader', array( 'T_OrderHeaderM_MouID' => $new_mou_id )); // 2. Insert log histori perubahan MOU $log_data = array( 'Order_MouLogT_OrderHeaderID' => $xid, 'Order_MouLogFromMouID' => $old_mou['M_MouID'], 'Order_MouLogFromM_MouName' => $old_mou['M_MouName'], 'Order_MouLogToMouID' => $new_mou['M_MouID'], 'Order_MouLogToMouName' => $new_mou['M_MouName'], 'Order_MouLogCreated' => date('Y-m-d H:i:s'), 'Order_MouLogCreatedUserID' => $user_id ); $this->db_onedev->insert('one_lab_log.order_mou_log', $log_data); $this->db_onedev->trans_complete(); if($this->db_onedev->trans_status() === FALSE){ // Tampilkan detail error SQL agar lebih mudah dilakukan debugging $error = $this->db_onedev->error(); $msg = (isset($error['message']) && $error['message'] != '') ? "Gagal menyimpan: " . $error['message'] : "Gagal menyimpan perubahan MOU"; $this->sys_error($msg); exit; } $result = array( "xid" => $xid, "old_mou_id" => $old_mou['M_MouID'], "old_mou_name" => $old_mou['M_MouName'], "new_mou_id" => $new_mou['M_MouID'], "new_mou_name" => $new_mou['M_MouName'] ); $this->sys_ok($result); } function search_pemeriksaan() { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $keyword = isset($prm["keyword"]) ? $prm["keyword"] : ""; $xid = isset($prm["xid"]) ? (int)$prm["xid"] : 0; $mouCompanyID = 0; if ($xid > 0) { // Cari MouID dari order yang bersangkutan $sql_mou = "SELECT T_OrderHeaderM_MouID FROM t_orderheader WHERE T_OrderHeaderID = ?"; $qry_mou = $this->db_onedev->query($sql_mou, [$xid]); if ($qry_mou && $qry_mou->num_rows() > 0) { $mouCompanyID = $qry_mou->row()->T_OrderHeaderM_MouID; } } $sql_param = array($mouCompanyID, "%$keyword%"); $query = $this->db_onedev->query("CALL sp_fo_px_search_v2(?, ?)", $sql_param); $this->clean_mysqli_connection($this->db_onedev->conn_id); if ($query) { $rows = $query->result_array(); $id_to_remove = []; foreach ($rows as $k => $v) { $rows[$k]['requirement'] = []; if ($v['px_type'] == "PX") { $x = $this->db_onedev->query("SELECT fn_fo_requirement_get('{$v['T_TestID']}') x")->row(); if ($x && $x->x != null) { $rows[$k]['requirement'] = json_decode($x->x); } } if ($v['is_packet'] == 'N') { $tests = $v['T_PriceT_TestID']; $panels = ''; } else { $tests = ''; $panels = $v['T_PriceT_TestID']; } $sql_param_promise = array($tests, $panels); $sql_promise = "select fn_fo_find_promise_by_px(?, ?) as x"; $x = $this->db_onedev->query($sql_promise, $sql_param_promise)->row(); if ($x && $x->x != null) { $rows[$k]['promise'] = $x->x; } $rows[$k]['nat_test'] = json_decode($v['nat_test']); $rows[$k]['child_test'] = json_decode($v['child_test']); // IF PROFILE/PANEL if ($v['px_type'] == "PR" || $v['px_type'] == "PXR") { if ($v['T_TestID'] == null) { $id_to_remove[] = $k; continue; } else { foreach ($rows[$k]['child_test'] as $l => $w) { $rows[$k]['child_test'][$l]->requirement = []; $rows[$k]['child_test'][$l]->nat_test = json_decode($w->nat_test); $rows[$k]['child_test'][$l]->promise = null; $x_req = $this->db_onedev->query("SELECT fn_fo_requirement_get('{$w->T_TestID}') x")->row(); if ($x_req && $x_req->x != null) { $rows[$k]['child_test'][$l]->requirement = json_decode($x_req->x); } $x_prom = $this->db_onedev->query("SELECT fn_fo_find_promise_by_one_px('{$w->T_TestID}') x")->row(); if ($x_prom && $x_prom->x != null) { $rows[$k]['child_test'][$l]->promise = $x_prom->x; } } } } } // REMOVE INDEXES (Bersihkan data kosong) foreach ($id_to_remove as $l => $w) { $offset = $w - $l; array_splice($rows, $offset, 1); } $this->sys_ok($rows); } else { $this->sys_error("Gagal melakukan pencarian pemeriksaan"); } } function get_pemeriksaan() { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $xid = isset($prm["xid"]) ? (int)$prm["xid"] : 0; if ($xid == 0) { $this->sys_error("Parameter order tidak valid"); exit; } $sql = "SELECT T_OrderDetailOrderID as T_OrderDetailID, T_OrderDetailOrderT_TestID as T_OrderDetailT_TestID, IF(T_OrderDetailOrderIsPacket = 'Y', T_OrderDetailOrderT_PacketName, T_OrderDetailOrderT_TestName) as T_TestName, T_OrderDetailOrderT_PriceAmount as T_OrderDetailPrice, ((T_OrderDetailOrderT_PriceDisc/100) * T_OrderDetailOrderT_PriceAmount) + T_OrderDetailOrderT_PriceDiscRp as T_OrderDetailDiscTotal, T_OrderDetailOrderT_PriceTotal as T_OrderDetailTotal FROM t_orderdetailorder WHERE T_OrderDetailOrderT_OrderHeaderID = ? AND T_OrderDetailOrderIsActive = 'Y'"; $query = $this->db_onedev->query($sql, [$xid]); if ($query) { $this->sys_ok($query->result_array()); } else { $this->sys_error("Gagal mengambil data pemeriksaan"); } } // function get_pemeriksaan() { // if (! $this->isLogin) { // $this->sys_error("Invalid Token"); // exit; // } // $prm = $this->sys_input; // $xid = isset($prm["xid"]) ? (int)$prm["xid"] : 0; // if ($xid == 0) { // $this->sys_error("Parameter order tidak valid"); // exit; // } // $sql = "SELECT DATE_FORMAT(OrderPxCreated,'%d.%m.%Y %H:%i') as xdatetime, // OrderPxType as type, // OrderPxJson as data, // M_UserUsername as username // FROM order_px // JOIN m_user ON OrderPxUserID = M_UserID // WHERE // OrderPxT_OrderHeaderID = {$xid} AND // OrderPxType = 'spv_test' // ORDER BY OrderPxCreated ASC"; // $query = $this->db_onedev->query($sql); // if ($query) { // $datas = $query->result_array(); // foreach($datas as $k => $v){ // $datas[$k]['data'] = json_decode($v['data']); // } // $this->sys_ok($datas); // } else { // $this->sys_error("Gagal mengambil data pemeriksaan"); // } // } function add_pemeriksaan() { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $xid = isset($prm["xid"]) ? $prm["xid"] : 0; $tests = isset($prm["tests"]) ? $prm["tests"] : array(); // Ambil User ID secara aman dari session atau JWT payload $user_id = 0; if (isset($this->sys_user['M_UserID'])) { $user_id = $this->sys_user['M_UserID']; } elseif (isset($this->sys_user['id'])) { $user_id = $this->sys_user['id']; } elseif (isset($prm['token'])) { $token_parts = explode('.', $prm['token']); if (count($token_parts) == 3) { $payload = json_decode(base64_decode($token_parts[1]), true); if (isset($payload['M_UserID'])) { $user_id = $payload['M_UserID']; } } } $this->db_onedev->trans_start(); $tests_to_add = array(); $tests_to_delete = array(); foreach ($tests as $test) { $action = isset($test['action']) ? strtoupper($test['action']) : ''; $test_name = isset($test['T_TestName']) ? $test['T_TestName'] : ''; $price = isset($test['T_OrderDetailPrice']) ? $test['T_OrderDetailPrice'] : 0; if ($action == 'ADD') { $tests_to_add[] = $test; } elseif ($action == 'DELETE') { $tests_to_delete[] = $test; } if ($action == 'ADD' || $action == 'DELETE') { // Pastikan T_OrderDetailT_OrderHeaderID ada di JSON agar bisa dilacak oleh query SELECT log $test['T_OrderDetailT_OrderHeaderID'] = (string)$xid; $log_data = array( 'OrderLogPxType' => $action, 'OrderLogPxT_TestName' => $test_name, 'OrderLogPxT_PacketName' => '', 'OrderLogPxT_PriceTotal' => $price, 'OrderLogPxJson' => json_encode($test), 'OrderLogPxUserID' => $user_id, 'OrderLogPxCreated' => date('Y-m-d H:i:s') ); $res_log = $this->db_onedev->insert('one_lab.order_log_px', $log_data); if (!$res_log) { $this->sys_error("Gagal menyimpan log pemeriksaan: " . $this->db_onedev->error()['message']); exit; } } } if (!empty($tests_to_add)) { $save_res = $this->save_pemeriksaan_detail($tests_to_add, $xid, $user_id); if (!$save_res['status']) { $this->sys_error($save_res['message']); exit; } } if (!empty($tests_to_delete)) { $del_res = $this->delete_pemeriksaan_detail($tests_to_delete, $xid, $user_id); if (!$del_res['status']) { $this->sys_error($del_res['message']); exit; } } $this->db_onedev->trans_complete(); if ($this->db_onedev->trans_status() === FALSE) { $error = $this->db_onedev->error(); $msg = (isset($error['message']) && $error['message'] != '') ? "Gagal menyimpan pemeriksaan: " . $error['message'] : "Gagal menyimpan perubahan pemeriksaan"; $this->sys_error($msg); exit; } $this->sys_ok(array("message" => "Perubahan pemeriksaan berhasil disimpan.")); } function save_pemeriksaan_detail($details, $header_id, $userid) { $return = [ "status" => true, "message" => "", "data" => [] ]; $tests = []; foreach ($details as $k => $v) { $dt_test_price = []; $test_id = isset($v['T_OrderDetailT_TestID']) ? $v['T_OrderDetailT_TestID'] : (isset($v['T_TestID']) ? $v['T_TestID'] : 0); $sql = "SELECT * FROM t_test WHERE T_TestID = ?"; $query = $this->db_onedev->query($sql, [$test_id]); if (!$query || $query->num_rows() == 0) { return ["status" => false, "message" => "Terjadi kesalahan saat memilih data test"]; } $dt_test = $query->row_array(); $child_test = isset($v['child_test']) ? $v['child_test'] : []; if (is_string($child_test)) { $decoded = json_decode($child_test, true); $child_test = is_array($decoded) ? $decoded : []; } $dt_test_price['T_TestID'] = $dt_test['T_TestID']; $dt_test_price['T_TestName'] = $dt_test['T_TestName']; $dt_test_price['px_type'] = isset($v['px_type']) ? $v['px_type'] : 'PX'; $dt_test_price['T_PriceAmount'] = isset($v['T_OrderDetailPrice']) ? $v['T_OrderDetailPrice'] : 0; $dt_test_price['T_PriceDisc'] = 0; $dt_test_price['T_PriceDiscRp'] = isset($v['T_OrderDetailDiscTotal']) ? $v['T_OrderDetailDiscTotal'] : 0; $dt_test_price['T_PriceSubTotal'] = $dt_test_price['T_PriceAmount'] - $dt_test_price['T_PriceDiscRp']; $dt_test_price['T_PriceTotal'] = $dt_test_price['T_PriceSubTotal']; $dt_test_price['child_test'] = $child_test; $tests[] = $dt_test_price; } foreach ($tests as $k => $detail) { $sql_orderdetailorder = "INSERT INTO t_orderdetailorder( T_OrderDetailOrderT_OrderHeaderID, T_OrderDetailOrderT_TestID, T_OrderDetailOrderT_TestName, T_OrderDetailOrderIsPacket, T_OrderDetailOrderPacketType, T_OrderDetailOrderT_PacketID, T_OrderDetailOrderT_PacketName, T_OrderDetailOrderT_PriceAmount, T_OrderDetailOrderT_PriceDisc, T_OrderDetailOrderT_PriceDiscRp, T_OrderDetailOrderT_PriceSubTotal, T_OrderDetailOrderT_PriceTotal, T_OrderDetailOrderCreated, T_OrderDetailOrderCreatedUserID, T_OrderDetailOrderJsonChildren ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,NOW(),?,?)"; $prm_detail_order = [ $header_id, $detail['px_type'] == 'PX' ? $detail['T_TestID'] : '0', $detail['px_type'] == 'PX' ? $detail['T_TestName'] : '', $detail['px_type'] != 'PX' ? 'Y' : 'N', $detail['px_type'] != 'PX' ? $detail['px_type'] : 'PX', $detail['px_type'] != 'PX' ? $detail['T_TestID'] : '0', $detail['px_type'] != 'PX' ? $detail['T_TestName'] : '', $detail['T_PriceAmount'], $detail['T_PriceDisc'], $detail['T_PriceDiscRp'], $detail['T_PriceSubTotal'], $detail['T_PriceTotal'], $userid, json_encode($detail['child_test']) ]; $query_detail_order = $this->db_onedev->query($sql_orderdetailorder, $prm_detail_order); if (!$query_detail_order) { return ["status" => false, "message" => "Terjadi kesalahan saat menyimpan data detail order: " . $this->db_onedev->error()['message']]; } $detail_order_id = $this->db_onedev->insert_id(); if ($detail['px_type'] != 'PX') { if (count($detail['child_test']) == 0) { return ["status" => false, "message" => "Detail packet tidak boleh kosong"]; } foreach ($detail['child_test'] as $k => $child_test_packet) { $child_test_packet['test_id'] = isset($child_test_packet['T_TestID']) ? $child_test_packet['T_TestID'] : 0; $child_test_packet['test_name'] = isset($child_test_packet['T_TestName']) ? $child_test_packet['T_TestName'] : ''; $child_test_packet['T_PriceAmount'] = isset($child_test_packet['T_PriceAmount']) ? $child_test_packet['T_PriceAmount'] : 0; $detail_insert = $this->insert_pemeriksaan_detail($header_id, $detail_order_id, $child_test_packet, $userid); if ($detail_insert['status'] == 'N') { return ["status" => false, "message" => $detail_insert['message']]; } } } else { $detail_insert = $this->insert_pemeriksaan_detail($header_id, $detail_order_id, $detail, $userid); if ($detail_insert['status'] == 'N') { return ["status" => false, "message" => "Terjadi kesalahan saat menyimpan data detail order " . $detail['T_TestName']]; } } } return $return; } function insert_pemeriksaan_detail($header_id, $detail_order_id, $detail, $userid) { $result = [ 'status' => 'Y', 'message' => 'Success' ]; $test_id = isset($detail['T_TestID']) ? $detail['T_TestID'] : (isset($detail['test_id']) ? $detail['test_id'] : 0); $sql = "SELECT * FROM t_test WHERE T_TestID = ?"; $query = $this->db_onedev->query($sql, [$test_id]); if (!$query || $query->num_rows() == 0) { $result['status'] = 'N'; $result['message'] = 'Test tidak ditemukan'; return $result; } $dt_test = $query->row_array(); $price = isset($detail['T_PriceAmount']) ? $detail['T_PriceAmount'] : (isset($detail['price']) ? $detail['price'] : 0); $disc = isset($detail['T_PriceDisc']) ? $detail['T_PriceDisc'] : (isset($detail['disc']) ? $detail['disc'] : 0); $disc_rp = isset($detail['T_PriceDiscRp']) ? $detail['T_PriceDiscRp'] : (isset($detail['disc_rp']) ? $detail['disc_rp'] : 0); $subtotal = isset($detail['T_PriceSubTotal']) ? $detail['T_PriceSubTotal'] : $price; $total = isset($detail['T_PriceTotal']) ? $detail['T_PriceTotal'] : $subtotal; $sql_unit = "SELECT Nat_UnitID, Nat_UnitName FROM t_test JOIN nat_test ON T_TestNat_TestID = Nat_TestID JOIN nat_unit ON Nat_TestNat_UnitID = Nat_UnitID WHERE T_TestID = ? LIMIT 1"; $dt_unit = $this->db_onedev->query($sql_unit, [$test_id])->row_array(); $sql_orderdetail = "INSERT INTO t_orderdetail( T_OrderDetailT_OrderHeaderID, T_OrderDetailT_OrderDetailOrderID, T_OrderDetailT_TestID, T_OrderDetailT_TestCode, T_OrderDetailT_TestSasCode, T_OrderDetailT_TestName, T_OrderDetailT_TestIsResult, T_OrderDetailT_TestIsPanel, T_OrderDetailT_TestIsPanelChildren, T_OrderDetailT_TestIsPanelChildrenPrintNota, T_OrderDetailT_TestIsPrice, T_OrderDetailIsCito, T_OrderDetailPrice, T_OrderDetailPriceForDisc, T_OrderDetailDisc, T_OrderDetailDiscAmount, T_OrderDetailDiscTotal, T_OrderDetailTotal, T_OrderDetailReq, T_OrderDetailReqNote, T_OrderDetailNat_UnitID, T_OrderDetailNat_UnitName, T_OrderDetailCreatedUserID, T_OrderDetailCreated ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'N','',?,?,?,NOW())"; $prm_orderdetail = [ $header_id, $detail_order_id, $dt_test['T_TestID'], $dt_test['T_TestCode'], $dt_test['T_TestSasCode'], $dt_test['T_TestName'], $dt_test['T_TestIsResult'], 'N', 'N', 'N', $dt_test['T_TestIsPrice'], 'N', $dt_test['T_TestIsPrice'] == 'N' ? 0 : $price, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $price, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $disc, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $disc_rp, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $subtotal, $dt_test['T_TestIsPrice'] == 'N' ? 0 : $total, $dt_unit ? $dt_unit['Nat_UnitID'] : 0, $dt_unit ? $dt_unit['Nat_UnitName'] : '', $userid ]; $query_orderdetail = $this->db_onedev->query($sql_orderdetail, $prm_orderdetail); if (!$query_orderdetail) { $result['status'] = 'N'; $result['message'] = 'Terjadi kesalahan saat menyimpan data detail order: ' . $this->db_onedev->error()['message']; return $result; } // Insert Child Tests $sql_child = "SELECT * FROM t_test WHERE T_TestSasCode LIKE ? AND T_TestIsActive = 'Y' AND T_TestSasCode != ?"; $query_child = $this->db_onedev->query($sql_child, [$dt_test['T_TestSasCode'] . '%', $dt_test['T_TestSasCode']]); if ($query_child) { $rows_test_child = $query_child->result_array(); foreach ($rows_test_child as $test_child) { $sql_child_unit = "SELECT Nat_UnitID, Nat_UnitName FROM t_test JOIN nat_test ON T_TestNat_TestID = Nat_TestID JOIN nat_unit ON Nat_TestNat_UnitID = Nat_UnitID WHERE T_TestID = ? LIMIT 1"; $dt_child_unit = $this->db_onedev->query($sql_child_unit, [$test_child['T_TestID']])->row_array(); $prm_orderdetail_child = [ $header_id, $detail_order_id, $test_child['T_TestID'], $test_child['T_TestCode'], $test_child['T_TestSasCode'], $test_child['T_TestName'], $test_child['T_TestIsResult'], 'N', 'N', 'N', $test_child['T_TestIsPrice'], 'N', 0, 0, 0, 0, 0, 0, $dt_child_unit ? $dt_child_unit['Nat_UnitID'] : 0, $dt_child_unit ? $dt_child_unit['Nat_UnitName'] : '', $userid ]; $query_child_insert = $this->db_onedev->query($sql_orderdetail, $prm_orderdetail_child); if (!$query_child_insert) { $result['status'] = 'N'; $result['message'] = 'Terjadi kesalahan saat menyimpan data child test: ' . $this->db_onedev->error()['message']; return $result; } } } return $result; } function delete_pemeriksaan_detail($details, $header_id, $userid) { $return = [ "status" => true, "message" => "", "data" => [] ]; // Cek apakah sample sudah diterima lab $sql_sampled = "SELECT COUNT(*) as total FROM t_ordersample WHERE T_OrderSampleT_OrderHeaderID = ? AND T_OrderSampleReceive = 'Y'"; $sampled = $this->db_onedev->query($sql_sampled, [$header_id])->row()->total; if ($sampled > 0) { return ["status" => false, "message" => "Pemeriksaan tidak dapat dihapus, sebagian atau seluruh sampel sudah diterima lab"]; } foreach ($details as $detail) { $detail_order_id = isset($detail['T_OrderDetailID']) ? (int)$detail['T_OrderDetailID'] : 0; if ($detail_order_id == 0) { return ["status" => false, "message" => "ID Pemeriksaan tidak valid untuk dihapus"]; } // Set tidak aktif pada t_orderdetailorder (parent) $this->db_onedev->where('T_OrderDetailOrderID', $detail_order_id); $this->db_onedev->where('T_OrderDetailOrderT_OrderHeaderID', $header_id); $this->db_onedev->update('t_orderdetailorder', array('T_OrderDetailOrderIsActive' => 'N')); // Set tidak aktif pada t_orderdetail (children) $this->db_onedev->where('T_OrderDetailT_OrderDetailOrderID', $detail_order_id); $this->db_onedev->where('T_OrderDetailT_OrderHeaderID', $header_id); $this->db_onedev->update('t_orderdetail', array('T_OrderDetailIsActive' => 'N')); } return $return; } function delete_pemeriksaan() { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $xid = isset($prm["xid"]) ? $prm["xid"] : 0; $detail_id = isset($prm["detail_id"]) ? $prm["detail_id"] : 0; $user_id = 0; if (isset($this->sys_user['M_UserID'])) { $user_id = $this->sys_user['M_UserID']; } elseif (isset($this->sys_user['id'])) { $user_id = $this->sys_user['id']; } elseif (isset($prm['token'])) { $token_parts = explode('.', $prm['token']); if (count($token_parts) == 3) { $payload = json_decode(base64_decode($token_parts[1]), true); if (isset($payload['M_UserID'])) { $user_id = $payload['M_UserID']; } } } if ($xid == 0 || $detail_id == 0) { $this->sys_error("Parameter tidak valid"); exit; } $sql = "SELECT T_OrderDetailOrderID, T_OrderDetailOrderT_TestID, T_OrderDetailOrderT_TestName, T_OrderDetailOrderT_PriceTotal, T_OrderDetailOrderIsActive FROM t_orderdetailorder WHERE T_OrderDetailOrderID = {$detail_id} AND T_OrderDetailOrderT_OrderHeaderID = {$xid} AND T_OrderDetailOrderIsActive = 'Y'"; $existing = $this->db_onedev->query($sql)->row_array(); if (!$existing) { $this->sys_error("Data pemeriksaan tidak ditemukan atau sudah dihapus"); exit; } $sql = "SELECT COUNT(*) as total FROM t_ordersample WHERE T_OrderSampleT_OrderHeaderID = {$xid} AND T_OrderSampleReceive = 'Y'"; $sampled = $this->db_onedev->query($sql)->row()->total; if ($sampled > 0) { $this->sys_error("Pemeriksaan tidak dapat dihapus, sampel sudah diterima lab"); exit; } $this->db_onedev->trans_start(); $this->db_onedev->where('T_OrderDetailOrderID', $detail_id); $this->db_onedev->where('T_OrderDetailOrderT_OrderHeaderID', $xid); $this->db_onedev->update('t_orderdetailorder', array( 'T_OrderDetailOrderIsActive' => 'N' )); $this->db_onedev->where('T_OrderDetailT_OrderDetailOrderID', $detail_id); $this->db_onedev->where('T_OrderDetailT_OrderHeaderID', $xid); $this->db_onedev->update('t_orderdetail', array( 'T_OrderDetailIsActive' => 'N' )); $log_data = array( 'OrderLogPxType' => 'DELETE', 'OrderLogPxT_TestName' => $existing['T_OrderDetailOrderT_TestName'], 'OrderLogPxT_PacketName' => '', 'OrderLogPxT_PriceTotal' => $existing['T_OrderDetailOrderT_PriceTotal'], 'OrderLogPxJson' => json_encode(array( 'T_OrderDetailT_OrderHeaderID' => "{$xid}", 'T_OrderDetailID' => $existing['T_OrderDetailOrderID'], 'T_OrderDetailT_TestID' => $existing['T_OrderDetailOrderT_TestID'], 'T_OrderDetailT_TestName' => $existing['T_OrderDetailOrderT_TestName'], 'T_OrderDetailPrice' => $existing['T_OrderDetailOrderT_PriceTotal'], 'action' => 'DELETE' )), 'OrderLogPxUserID' => $user_id, 'OrderLogPxCreated' => date('Y-m-d H:i:s') ); $res_log = $this->db_onedev->insert('one_lab.order_log_px', $log_data); if (!$res_log) { $this->sys_error("Gagal menyimpan log hapus pemeriksaan: " . $this->db_onedev->error()['message']); exit; } $this->db_onedev->trans_complete(); if ($this->db_onedev->trans_status() === FALSE) { $error = $this->db_onedev->error(); $msg = (isset($error['message']) && $error['message'] != '') ? "Gagal menghapus pemeriksaan: " . $error['message'] : "Gagal menghapus pemeriksaan"; $this->sys_error($msg); exit; } $this->sys_ok(array( "message" => "Pemeriksaan berhasil dihapus.", "xid" => $xid, "detail_id" => $detail_id, "test_name" => $existing['T_OrderDetailOrderT_TestName'] )); } function search_doctor() { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $keyword = isset($prm['keyword']) ? $prm['keyword'] : (isset($prm['search']) ? $prm['search'] : ''); $id = isset($prm['id']) ? (int)$prm['id'] : 0; $q = [ 'search' => '%' ]; if ($keyword != '') { $q['search'] = "%{$keyword}%"; } $sql = "SELECT M_DoctorID, M_DoctorIsDefault, IF(M_DoctorPJID IS NULL, 'Y', 'N') M_DoctorIsPJ, CONCAT('[ ',M_DoctorCode,' ] ',IFNULL(M_DoctorPrefix, ''), ' ',IFNULL(M_DoctorPrefix2, ''), ' ',M_DoctorName,' ',IFNULL(M_DoctorSufix, ''), ' ',IFNULL(M_DoctorSufix2, ''), ' ',IFNULL(M_DoctorSufix3, '')) as M_DoctorName, fn_fo_delivery_code('DOCTOR', 'EMAIL', 0) as delivery_email_code, IF(M_DoctorEmail IS NULL OR M_DoctorEmail = '', 'N', M_DoctorEmailIsDefault) email_default, IFNULL( concat('[', group_concat(JSON_OBJECT('description',M_DoctorAddressNote,'M_DoctorAddressNote',M_DoctorAddressNote,'M_DoctorAddressDescription', M_DoctorAddressDescription, 'M_DoctorAddressID', M_DoctorAddressID, 'delivery_default', M_DoctorAddressDeliveryDefault, 'delivery_code', fn_fo_delivery_code('DOCTOR', 'ADDRESS', M_DoctorAddressID)) SEPARATOR ','), ']'), '[]') as address, M_DoctorNote from m_doctor join m_doctoraddress on M_DoctorAddressIsActive = 'Y' and M_DoctorAddressM_DoctorID = M_DoctorID left join m_doctorpj on M_DoctorPJM_DoctorID = M_DoctorID and M_DoctorPjIsactive = 'Y' where M_DoctorIsActive = 'Y'"; $params = []; if ($id > 0) { $sql .= " AND M_DoctorID = ? "; $params[] = $id; } else { $sql .= " AND CONCAT('[ ',M_DoctorCode,' ] ',IFNULL(M_DoctorPrefix, ''), ' ',IFNULL(M_DoctorPrefix2, ''), ' ',M_DoctorName,' ',IFNULL(M_DoctorSufix, ''), ' ',IFNULL(M_DoctorSufix2, ''), ' ',IFNULL(M_DoctorSufix3, '')) like ? "; $params[] = $q['search']; } $sql .= " group by M_DoctorID limit 30"; $query = $this->db_onedev->query($sql, $params); if ($query) { $rows = $query->result_array(); foreach ($rows as $k => $v) { $rows[$k]['address'] = json_decode($v['address']); foreach ($rows[$k]['address'] as $k_a => $v_a) { $rows[$k]['address'][$k_a]->description = $rows[$k]['address'][$k_a]->M_DoctorAddressNote . " : " . $rows[$k]['address'][$k_a]->M_DoctorAddressDescription; } } $result = array("total" => 0, "records" => $rows, "total_display" => sizeof($rows)); $this->sys_ok($result); } else { $this->sys_error_db("m_doctor rows", $this->db_onedev); exit; } } function save_doctor_pengirim() { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $xid = isset($prm["xid"]) ? $prm["xid"] : 0; $user_id = 0; if (isset($this->sys_user['M_UserID'])) { $user_id = $this->sys_user['M_UserID']; } elseif (isset($this->sys_user['id'])) { $user_id = $this->sys_user['id']; } elseif (isset($prm['token'])) { $token_parts = explode('.', $prm['token']); if (count($token_parts) == 3) { $payload = json_decode(base64_decode($token_parts[1]), true); if (isset($payload['M_UserID'])) { $user_id = $payload['M_UserID']; } } } if ($xid == 0) { $this->sys_error("Parameter xid tidak valid"); exit; } $new_doctor_id = isset($prm["new_doctor_id"]) ? $prm["new_doctor_id"] : 0; $new_doctor_address_id = isset($prm["new_doctor_address_id"]) ? $prm["new_doctor_address_id"] : 0; if ($new_doctor_id == 0) { $this->sys_error("Dokter baru tidak boleh kosong"); exit; } $sql = "SELECT h.T_OrderHeaderID, h.T_OrderHeaderSenderM_DoctorID, h.T_OrderHeaderSenderM_DoctorAddressID, TRIM(CONCAT( IFNULL(d.M_DoctorPrefix, ''), IFNULL(d.M_DoctorPrefix2, ''), ' ', IFNULL(d.M_DoctorName, ''), ' ', IFNULL(d.M_DoctorSufix, ''), IFNULL(d.M_DoctorSufix2, ''), IFNULL(d.M_DoctorSufix3, '') )) as old_doctor_name, CONCAT( h.T_OrderHeaderSenderM_DoctorID, '^', h.T_OrderHeaderSenderM_DoctorAddressID ) as old_doctor_id_combined, CONCAT( TRIM(CONCAT( IFNULL(d.M_DoctorPrefix, ''), IFNULL(d.M_DoctorPrefix2, ''), ' ', IFNULL(d.M_DoctorName, ''), ' ', IFNULL(d.M_DoctorSufix, ''), IFNULL(d.M_DoctorSufix2, ''), IFNULL(d.M_DoctorSufix3, '') )), '^', IFNULL(da.M_DoctorAddressDescription, '') ) as old_doctor_name_combined FROM t_orderheader h LEFT JOIN m_doctor d ON h.T_OrderHeaderSenderM_DoctorID = d.M_DoctorID LEFT JOIN m_doctoraddress da ON h.T_OrderHeaderSenderM_DoctorAddressID = da.M_DoctorAddressID WHERE h.T_OrderHeaderID = {$xid} AND h.T_OrderHeaderIsActive = 'Y'"; $q_old = $this->db_onedev->query($sql); if (!$q_old) { $this->sys_error("Gagal mengambil data dokter lama: " . $this->db_onedev->error()['message']); exit; } $old_data = $q_old->row_array(); if (!$old_data) { $this->sys_error("Data order tidak ditemukan"); exit; } $sql = "SELECT d.M_DoctorID, da.M_DoctorAddressID, TRIM(CONCAT( IFNULL(d.M_DoctorPrefix, ''), IFNULL(d.M_DoctorPrefix2, ''), ' ', IFNULL(d.M_DoctorName, ''), ' ', IFNULL(d.M_DoctorSufix, ''), IFNULL(d.M_DoctorSufix2, ''), IFNULL(d.M_DoctorSufix3, '') )) as new_doctor_name, CONCAT( d.M_DoctorID, '^', da.M_DoctorAddressID ) as new_doctor_id_combined, CONCAT( TRIM(CONCAT( IFNULL(d.M_DoctorPrefix, ''), IFNULL(d.M_DoctorPrefix2, ''), ' ', IFNULL(d.M_DoctorName, ''), ' ', IFNULL(d.M_DoctorSufix, ''), IFNULL(d.M_DoctorSufix2, ''), IFNULL(d.M_DoctorSufix3, '') )), '^', IFNULL(da.M_DoctorAddressDescription, '') ) as new_doctor_name_combined FROM m_doctor d JOIN m_doctoraddress da ON da.M_DoctorAddressM_DoctorID = d.M_DoctorID AND da.M_DoctorAddressID = {$new_doctor_address_id} WHERE d.M_DoctorID = {$new_doctor_id} AND d.M_DoctorIsActive = 'Y'"; $q_new = $this->db_onedev->query($sql); if (!$q_new) { $this->sys_error("Gagal mengambil data dokter baru: " . $this->db_onedev->error()['message']); exit; } $new_data = $q_new->row_array(); if (!$new_data) { $this->sys_error("Dokter baru tidak ditemukan"); exit; } if ( $old_data['T_OrderHeaderSenderM_DoctorID'] == $new_doctor_id && $old_data['T_OrderHeaderSenderM_DoctorAddressID'] == $new_doctor_address_id ) { $this->sys_error("Dokter pengirim tidak berubah"); exit; } $attr_json = json_encode(array( "old" => array( "id" => $old_data['old_doctor_id_combined'], "name" => $old_data['old_doctor_name_combined'] ), "new" => array( "id" => $new_data['new_doctor_id_combined'], "name" => $new_data['new_doctor_name_combined'] ) ), JSON_UNESCAPED_UNICODE); $this->db_onedev->trans_start(); $this->db_onedev->where('T_OrderHeaderID', $xid); $this->db_onedev->update('t_orderheader', array( 'T_OrderHeaderSenderM_DoctorID' => $new_doctor_id, 'T_OrderHeaderSenderM_DoctorAddressID' => $new_doctor_address_id )); $this->db_onedev->insert('one_lab.order_attr', array( 'orderAttrT_OrderHeaderID' => $xid, 'orderAttrType' => 'spv_order_doctor', 'orderAttrJson' => $attr_json, 'orderAttrCreated' => date('Y-m-d H:i:s'), 'orderAttrUserID' => $user_id )); $this->db_onedev->trans_complete(); if ($this->db_onedev->trans_status() === FALSE) { $error = $this->db_onedev->error(); $msg = (isset($error['message']) && $error['message'] != '') ? "Gagal menyimpan perubahan dokter: " . $error['message'] : "Gagal menyimpan perubahan dokter pengirim"; $this->sys_error($msg); exit; } $this->sys_ok(array( "message" => "Dokter pengirim berhasil diubah.", "xid" => $xid, "old_doctor_id" => $old_data['T_OrderHeaderSenderM_DoctorID'], "old_doctor_name" => $old_data['old_doctor_name'], "new_doctor_id" => $new_data['M_DoctorID'], "new_doctor_name" => $new_data['new_doctor_name'] )); } public function get_doctor_addresses() { if (! $this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $doctor_id = isset($prm['doctor_id']) ? (int)$prm['doctor_id'] : 0; if ($doctor_id == 0) { $this->sys_error("ID Dokter tidak valid"); exit; } $sql = "SELECT M_DoctorAddressID, M_DoctorAddressDescription, M_DoctorAddressNote, M_DoctorAddressDeliveryDefault FROM m_doctoraddress WHERE M_DoctorAddressM_DoctorID = ? AND M_DoctorAddressIsActive = 'Y'"; $query = $this->db_onedev->query($sql, [$doctor_id]); if ($query) { $rows = $query->result_array(); $this->sys_ok(["records" => $rows]); } else { $this->sys_error_db("m_doctoraddress rows", $this->db_onedev); exit; } } function get_second_language() { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $order_id = isset($prm['xid']) ? intval($prm['xid']) : (isset($prm['order_id']) ? intval($prm['order_id']) : 0); if ($order_id <= 0) { $this->sys_error("Parameter order_id tidak valid"); exit; } // Ambil bahasa kedua yang sedang dipakai pada order ini $sql = "SELECT a.T_OrderHeaderAddOnSecondM_LangID as M_LanguageID, a.T_OrderHeaderAddOnSecondLangIsSI as second_lang_is_si, l.M_LangName as M_LanguageName FROM t_orderheaderaddon a LEFT JOIN m_lang l ON a.T_OrderHeaderAddOnSecondM_LangID = l.M_LangID WHERE a.T_OrderHeaderAddOnT_OrderHeaderID = ? AND a.T_OrderHeaderAddOnIsActive = 'Y' LIMIT 1"; $query = $this->db_onedev->query($sql, [$order_id]); $current_language = ['M_LanguageID' => null, 'second_lang_is_si' => null, 'M_LanguageName' => null]; if ($query) { $data = $query->row_array(); if ($data) { // Sesuaikan format data current_language agar cocok dengan composite key di list (id-is_si) if (!empty($data['M_LanguageID'])) { $is_si = $data['second_lang_is_si'] === 'Y' ? 'Y' : 'N'; $si_text = $is_si === 'Y' ? ' (SI)' : ''; $data['M_LanguageID'] = $data['M_LanguageID'] . '-' . $is_si; $data['M_LanguageName'] = $data['M_LanguageName'] . $si_text; } $current_language = $data; } } // Ambil list semua bahasa yang aktif $sql_list = "SELECT M_LangID as id, M_LangName as name FROM m_lang WHERE M_LangIsActive = 'Y' ORDER BY M_LangName ASC"; $query_list = $this->db_onedev->query($sql_list); $language_list = array(); if ($query_list) { $rows = $query_list->result_array(); $si = [["is_si" => "N", "si_text" => ""], ["is_si" => "Y", "si_text" => "(SI)"]]; foreach ($rows as $v) { foreach ($si as $w) { $item = $v; $item['is_si'] = $w['is_si']; $item['name'] .= $w['si_text'] == '' ? '' : ' ' . $w['si_text']; $item['key'] = $item['id'] . '-' . $item['is_si']; // Mapping ke M_LanguageID dan M_LanguageName agar langsung dikenali oleh v-autocomplete Vue $item['M_LanguageID'] = $item['key']; $item['M_LanguageName'] = $item['name']; $language_list[] = $item; } } } $result = array( "current_language" => $current_language, "language_list" => $language_list ); $this->sys_ok($result); exit; } function save_second_language() { if (!$this->isLogin) { $this->sys_error("Invalid Token"); exit; } $prm = $this->sys_input; $xid = isset($prm["xid"]) ? intval($prm["xid"]) : 0; if (isset($prm["new_language_id"]) && strpos($prm["new_language_id"], '-') !== false) { $parts = explode('-', $prm["new_language_id"]); $new_lang_id = intval($parts[0]); $new_lang_is_si = (isset($parts[1]) && $parts[1] === 'Y') ? 'Y' : 'N'; } else { $new_lang_id = isset($prm["new_lang_id"]) ? intval($prm["new_lang_id"]) : (isset($prm["new_language_id"]) ? intval($prm["new_language_id"]) : 0); $new_lang_is_si = (isset($prm["new_lang_is_si"]) && $prm["new_lang_is_si"] === 'Y') ? 'Y' : 'N'; } if ($xid <= 0) { $this->sys_error("Parameter order tidak valid"); exit; } $user_id = 0; if (isset($this->sys_user['M_UserID'])) { $user_id = $this->sys_user['M_UserID']; } elseif (isset($this->sys_user['id'])) { $user_id = $this->sys_user['id']; } elseif (isset($prm['token'])) { $token_parts = explode('.', $prm['token']); if (count($token_parts) == 3) { $payload = json_decode(base64_decode($token_parts[1]), true); if (isset($payload['M_UserID'])) { $user_id = $payload['M_UserID']; } } } // 1. Ambil data bahasa kedua lama dari addon $sql_old = "SELECT a.T_OrderHeaderAddOnSecondM_LangID, a.T_OrderHeaderAddOnSecondLangIsSI, l.M_LangName FROM t_orderheaderaddon a LEFT JOIN m_lang l ON a.T_OrderHeaderAddOnSecondM_LangID = l.M_LangID WHERE a.T_OrderHeaderAddOnT_OrderHeaderID = {$xid} AND a.T_OrderHeaderAddOnIsActive = 'Y' LIMIT 1"; $old_data = $this->db_onedev->query($sql_old)->row_array(); if (!$old_data) { $this->sys_error("Data order header addon tidak ditemukan"); exit; } // 2. Jika ada ID bahasa baru, ambil nama bahasanya untuk kebutuhan log $new_lang_name = '-'; if ($new_lang_id > 0) { $sql_new = "SELECT M_LangName FROM m_lang WHERE M_LangID = {$new_lang_id} AND M_LangIsActive = 'Y'"; $new_lang_row = $this->db_onedev->query($sql_new)->row_array(); if (!$new_lang_row) { $this->sys_error("Bahasa baru tidak ditemukan"); exit; } $new_lang_name = $new_lang_row['M_LangName']; if ($new_lang_is_si === 'Y') { $new_lang_name .= ' (SI)'; } } // 3. Cek apakah ada perubahan antara data yang lama dengan yang baru if ( $old_data['T_OrderHeaderAddOnSecondM_LangID'] == $new_lang_id && $old_data['T_OrderHeaderAddOnSecondLangIsSI'] == $new_lang_is_si ) { $this->sys_error("Bahasa kedua tidak ada perubahan"); exit; } $old_lang_name = $old_data['M_LangName'] ? $old_data['M_LangName'] : '-'; if ($old_data['T_OrderHeaderAddOnSecondLangIsSI'] === 'Y' && $old_lang_name !== '-') { $old_lang_name .= ' (SI)'; } // 4. Siapkan JSON untuk atribut log $attr_json = json_encode(array( "old" => array( "id" => $old_data['T_OrderHeaderAddOnSecondM_LangID'], "is_si" => $old_data['T_OrderHeaderAddOnSecondLangIsSI'], "name" => $old_lang_name ), "new" => array( "id" => $new_lang_id, "is_si" => $new_lang_is_si, "name" => $new_lang_name ) ), JSON_UNESCAPED_UNICODE); $this->db_onedev->trans_start(); // 5. Update Tabel Utama (t_orderheaderaddon) $this->db_onedev->where('T_OrderHeaderAddOnT_OrderHeaderID', $xid); $this->db_onedev->where('T_OrderHeaderAddOnIsActive', 'Y'); $this->db_onedev->update('t_orderheaderaddon', array( 'T_OrderHeaderAddOnSecondM_LangID' => $new_lang_id > 0 ? $new_lang_id : null, 'T_OrderHeaderAddOnSecondLangIsSI' => $new_lang_is_si )); // 6. Insert log ke order_attr $this->db_onedev->insert('one_lab.order_attr', array( 'orderAttrT_OrderHeaderID' => $xid, 'orderAttrType' => 'spv_order_lang', 'orderAttrJson' => $attr_json, 'orderAttrCreated' => date('Y-m-d H:i:s'), 'orderAttrUserID' => $user_id )); $this->db_onedev->trans_complete(); if ($this->db_onedev->trans_status() === FALSE) { $error = $this->db_onedev->error(); $msg = (isset($error['message']) && $error['message'] != '') ? "Gagal menyimpan perubahan bahasa: " . $error['message'] : "Gagal menyimpan perubahan bahasa kedua"; $this->sys_error($msg); exit; } $this->sys_ok(array( "message" => "Bahasa kedua berhasil diubah.", "xid" => $xid, "new_lang_id" => $new_lang_id, "new_lang_is_si" => $new_lang_is_si, "new_lang_name" => $new_lang_name )); } }