Files
BE_IBL/application/controllers/mockup/fo/resultemailv7/Patient.php
2026-05-24 22:37:27 +07:00

1741 lines
60 KiB
PHP

<?php
class Patient extends MY_Controller
{
var $db_onedev;
public function index()
{
echo "Patient API";
}
public function __construct()
{
parent::__construct();
$this->db_onedev = $this->load->database("onedev", true);
}
function add_verifications_label($orderid){
$query = " SELECT Result_VerificationsID as id,
IFNULL(Result_VerificationsValueID,0) as xid,
IFNULL(Result_VerificationsValueCheck,'N') as chex,
IF(ISNULL(Result_VerificationsValueID),'',Result_VerificationsValueNote) as note,
Result_VerificationsLabel as label
FROM result_verifications
LEFT JOIN result_verifications_value ON Result_VerificationsValueResult_VerificationsID = Result_VerificationsID AND
Result_VerificationsValueSo_ResultEntryID = $orderid
WHERE
Result_VerificationIsActive = 'Y'
GROUP BY Result_VerificationsID
";
$rows = $this->db_onedev->query($query)->result_array();
foreach($rows as $k => $v){
if($v['chex'] == 'N')
$rows[$k]['chex'] = false;
else
$rows[$k]['chex'] = true;
}
return $rows;
}
function search()
{
$prm = $this->sys_input;
// 1. VALIDASI KEAMANAN: Cek apakah user sudah login
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
// 2. INISIALISASI PARAMETER: Mengambil data dari input user (Nolab, Nama, Status, Perusahaan)
$nolab = $prm["nolab"];
$nama = $prm["name"];
$status = $prm["status"]; // 'N' = Belum kirim, 'S' = Berhasil kirim, 'E' = Error
$company = $prm["company"]["M_CompanyID"];
// 3. LOGIKA FILTER STATUS:
// Jika status 'N', cari yang BELUM ada di tabel result_handoveremail (Isnull)
$where_status = " AND (ISNULL(Result_HandOverEmailID))";
$xstatus = "IF(ISNULL(Result_ProcessToOfficeID),'N','Y') as status_ready";
// Filter Join dinamis: Digunakan untuk menghubungkan data order dengan status kirim email
$filter_status = "LEFT JOIN result_processtooffice ON Result_ProcessToOfficeT_OrderHeaderID = T_OrderHeaderID AND
Result_ProcessToOfficeT_OrderDeliveryID = T_OrderDeliveryID AND
Result_ProcessToOfficeT_OrderPromiseID = T_OrderPromiseID
LEFT JOIN result_handoveremail ON Result_HandOverEmailT_OrderHeaderID = T_OrderHeaderID AND
Result_HandOverEmailT_OrderDeliveryID = T_OrderDeliveryID AND
Result_HandOverEmailT_OrderPromiseID = T_OrderPromiseID
";
$paramxid= "0 as xid";
// Jika user mencari status yang sudah diproses (Bukan 'N')
if($status != 'N'){
$xstatus = "'Y' as status_ready";
$where_status = '';
$paramxid= "Result_HandOverEmailID as xid";
// JOIN paksa ke tabel email untuk mengambil data yang memang sudah ada record kirimnya
$filter_status = "JOIN result_handoveremail ON Result_HandOverEmailT_OrderHeaderID = T_OrderHeaderID AND
Result_HandOverEmailT_OrderPromiseID = T_OrderPromiseID AND
Result_HandOverEmailT_OrderDeliveryID = T_OrderDeliveryID AND
Result_HandOverEmailIsActive = 'Y' AND Result_HandOverEmailStatus = '{$status}'";
}
$filter_company = '';
if(intval($company) > 0){
$filter_company = " AND M_CompanyID = {$company}";
}
$startdate = $prm["startdate"];
$enddate = isset($prm["enddate"]) ? $prm["enddate"] : $startdate;
$d_start = new DateTime($startdate);
$d_end = new DateTime($enddate);
$diff = $d_start->diff($d_end);
if($diff->days > 14){
$this->sys_error("Rentang tanggal tidak boleh lebih dari 2 minggu");
exit;
}
if(!isset($prm['current_page']))
$prm['current_page'] = 1;
$sql_where = "";
$number_limit = 5;
$number_offset = ($prm['current_page'] - 1) * $number_limit ;
if ($nolab != "") {
$sql_where = " AND ( T_OrderHeaderLabNumber like '%$nolab%' OR T_OrderHeaderLabNumberExt like '%$nolab%' OR M_PatientName like '%$nolab%' ) ";
}
// 4. QUERY HITUNG TOTAL: untuk pagination
$sql = "SELECT COUNT(*) as total FROM (
SELECT
T_OrderHeaderID as order_id,
T_OrderDeliveryID as delivery_id,
T_OrderPromiseID as order_promise_id
FROM t_orderheader
JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID
JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company
JOIN t_orderdetail ON T_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_OrderDetailIsActive = 'Y' AND T_OrderDetailT_TestIsResult = 'Y'
JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND
T_OrderDetailT_OrderPromiseID = T_OrderPromiseID AND
T_OrderPromiseIsActive = 'Y'
JOIN t_orderdelivery ON T_orderDeliveryT_OrderHeaderID = T_OrderHeaderID AND
T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y'
$filter_status
WHERE
(
DATE(T_OrderPromiseDateTime) BETWEEN '{$startdate}' AND '{$enddate}'
) AND
T_OrderHeaderIsActive = 'Y'
$sql_where $where_status
GROUP BY T_OrderHeaderID, T_OrderPromiseID, T_OrderDeliveryID
) xz";
//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("m_doctor count", $this->db_onedev);
exit;
}
$sql = "SELECT $paramxid,
T_OrderHeaderID as order_id,
T_OrderDeliveryID as delivery_id,
T_OrderDeliveryDestination as email_address,
T_OrderPromiseID as order_promise_id,
T_OrderHeaderLabNumber as noreg,
M_CompanyID,
M_CompanyName,
T_OrderHeaderLabNumberExt as noreg_ext,
CONCAT(IFNULL(M_TitleName,''),' ',M_PatientName) as patient_fullname,
/* TAMBAHKAN LOGIKA NAMA DOKTER DI SINI */
CONCAT(
IFNULL(M_DoctorPrefix,''),
IFNULL(M_DoctorPrefix2,''), ' ',
M_DoctorName,
IFNULL(M_DoctorSufix,''),
IFNULL(M_DoctorSufix2,''),
IFNULL(M_DoctorSufix3,'')
) as doctor_fullname,
DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y %H:%i') as order_date,
DATE_FORMAT(T_OrderPromiseDateTime,'%d-%m-%Y %H:%i') as promise_date,
DATE(T_OrderPromiseDateTime) as order_promise_date,
M_CompanyName as company_name,
IF(M_MouIsBill = 'Y','Y',Last_StatusPaymentIsLunas) as status_payment,
'' as staff_name,
'' as send_time,
'' as receiver_time,
'Y' as status_ready,
'Y' as status_complete_format,
T_OrderHeaderIsCito as iscito,
M_DeliveryName as label_delivery,
'' as not_found_format,
'N' as status_send,
'' as not_ready,
$xstatus
FROM t_orderheader
JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID
LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID
JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID $filter_company
JOIN m_mou ON T_OrderHeaderM_MouID = M_MouID
/* TAMBAHKAN LEFT JOIN KE M_DOCTOR */
LEFT JOIN m_doctor ON T_OrderHeaderSenderM_DoctorID = M_DoctorID
JOIN t_orderdetail ON T_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_OrderDetailIsActive = 'Y' AND T_OrderDetailT_TestIsResult = 'Y'
JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND
T_OrderDetailT_OrderPromiseID = T_OrderPromiseID AND
T_OrderPromiseIsActive = 'Y'
JOIN t_orderdelivery ON T_orderDeliveryT_OrderHeaderID = T_OrderHeaderID AND
T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y'
JOIN m_delivery ON T_OrderDeliveryM_DeliveryID = M_DeliveryID
JOIN last_statuspayment ON Last_StatusPaymentT_OrderHeaderID = T_OrderHeaderID
$filter_status
WHERE
(
DATE(T_OrderPromiseDateTime) BETWEEN '{$startdate}' AND '{$enddate}'
) AND
T_OrderHeaderIsActive = 'Y'
$sql_where $where_status
GROUP BY T_OrderHeaderID, DATE(T_OrderPromiseDateTime), T_OrderDeliveryID
Order BY T_OrderPromiseDateTime ASC, T_OrderHeaderID ASC, T_OrderDeliveryID ASC
limit $number_limit offset $number_offset";
$query = $this->db_onedev->query($sql);
$rows = $query->result_array();
//echo $sql;
$query = $this->db_onedev->query($sql);
$rows = $query->result_array();
// 6. LOOPING DATA (Foreach): Melakukan pengecekan mendalam per-pasien
if($rows){
foreach($rows as $k => $v){
$rows[$k]['summary_nonlab'] = $this->get_count_url_nonlab(true, array(
'order_id' => $v['order_id'],
'order_promise_date' => $v['order_promise_date'],
'order_promise_id' => $v['order_promise_id']
));
$rows[$k]['info_deliveries'] = $this->_get_delivery_info($v['order_id'], $v['delivery_id']);
$email_config = array();
if($rows[$k]['info_deliveries']){
foreach($rows[$k]['info_deliveries'] as $kd => $vd){
$type = strtoupper($vd['delivery_source']);
if($type == 'DOCTOR') $type = 'DOKTER';
if(!isset($email_config[$type]) && ($type == 'PATIENT' || $type == 'DOKTER' || $type == 'COMPANY')){
$email_config[$type] = $this->get_email_config(true, array('type'=>$type, 'order_id'=>$v['order_id']));
}
}
}
$rows[$k]['email_config'] = $email_config;
$arr_not_ready = array();
$sql = "SELECT IFNULL(Result_ProcessToOfficeID,'0') as xid, Group_ResultName as testname
FROM t_orderdetail
JOIN group_resultdetail ON T_OrderDetailT_TestID = Group_ResultDetailT_TestID AND Group_ResultDetailIsActive = 'Y'
JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'N'
LEFT JOIN result_processtooffice ON Result_ProcessToOfficeT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND
Result_ProcessToOfficeT_OrderDeliveryID = {$v['delivery_id']} AND
Result_ProcessToOfficeT_OrderPromiseID = {$v['order_promise_id']} AND
Result_ProcessToOfficeGroup_ResultID = Group_ResultID
WHERE
T_OrderDetailT_OrderHeaderID = {$v['order_id']} AND
T_OrderDetailT_OrderPromiseID = {$v['order_promise_id']} AND
T_OrderDetailT_TestIsResult = 'Y' AND
T_OrderDetailIsActive = 'Y'
GROUP BY Group_ResultID
UNION
SELECT IFNULL(Result_ProcessToOfficeID,'0') as xid, T_TestName as testname
FROM t_orderdetail
JOIN group_resultdetail ON T_OrderDetailT_TestID = Group_ResultDetailT_TestID AND Group_ResultDetailIsActive = 'Y'
JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y'
JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagPerTest = 'Y'
LEFT JOIN result_processtooffice ON Result_ProcessToOfficeT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND
Result_ProcessToOfficeT_OrderDeliveryID = {$v['delivery_id']} AND
Result_ProcessToOfficeT_OrderPromiseID = {$v['order_promise_id']} AND
Result_ProcessToOfficeGroup_ResultID = T_TestID
WHERE
T_OrderDetailT_OrderHeaderID = {$v['order_id']} AND
T_OrderDetailT_OrderPromiseID = {$v['order_promise_id']} AND
T_OrderDetailT_TestIsResult = 'Y' AND
T_OrderDetailIsActive = 'Y'
GROUP BY T_TestID";
//echo $sql.";";
$rows_not_ready = $this->db_onedev->query($sql)->result_array();
foreach($rows_not_ready as $k_nr => $v_nr){
if($v_nr['xid'] == '0' || $v_nr['xid'] == 0){
array_push($arr_not_ready,$v_nr['testname']);
}
}
if(count($arr_not_ready) > 0){
$rows[$k]['status_ready'] = 'N';
$rows[$k]['not_ready'] = join($arr_not_ready,',');
}
//echo $rows[$k]['status_ready'];
$arr_not_found_format = array();
$sql = "SELECT '0' as rpo_id, IFNULL(T_EmailNonLabID,'0') as xid, Group_ResultName as testname, Group_ResultID as group_test_id
FROM t_orderdetail
JOIN group_resultdetail ON T_OrderDetailT_TestID = Group_ResultDetailT_TestID AND Group_ResultDetailIsActive = 'Y'
JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagNonLab = 'Y' AND Group_ResultFlagPerTest = 'N'
LEFT JOIN t_email_nonlab ON T_EmailNonLabT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_EmailNonLabResultEntryID = 0 AND
T_EmailNonLabType = Group_ResultName
LEFT JOIN result_processtooffice ON Result_ProcessToOfficeT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND
Result_ProcessToOfficeT_OrderDeliveryID = {$v['delivery_id']} AND
Result_ProcessToOfficeT_OrderPromiseID = {$v['order_promise_id']}
WHERE
T_OrderDetailT_OrderHeaderID = {$v['order_id']} AND
T_OrderDetailT_OrderPromiseID = {$v['order_promise_id']} AND
T_OrderDetailIsActive = 'Y'
UNION
SELECT '0' as rpo_id, IFNULL(T_EmailNonLabID,'0') as xid, T_TestName as testname, T_TestID as group_test_id
FROM t_orderdetail
JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestIsResult = 'Y'
JOIN group_resultdetail ON T_OrderDetailT_TestID = Group_ResultDetailT_TestID AND Group_ResultDetailIsActive = 'Y'
JOIN group_result ON Group_ResultDetailGroup_ResultID = Group_ResultID AND Group_ResultFlagNonLab = 'Y' AND Group_ResultFlagPerTest = 'Y'
LEFT JOIN so_resultentry ON So_ResultEntryT_OrderDetailID = T_OrderDetailID AND So_ResultEntryIsActive = 'Y'
LEFT JOIN t_email_nonlab ON T_EmailNonLabT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_EmailNonLabResultEntryID = So_ResultEntryID
LEFT JOIN result_processtooffice ON Result_ProcessToOfficeT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND
Result_ProcessToOfficeT_OrderDeliveryID = {$v['delivery_id']} AND
Result_ProcessToOfficeT_OrderPromiseID = {$v['order_promise_id']}
WHERE
T_OrderDetailT_OrderHeaderID = {$v['order_id']} AND
T_OrderDetailT_OrderPromiseID = {$v['order_promise_id']} AND
T_OrderDetailIsActive = 'Y'
";
//echo $sql.";";
// $rows_not_found_format = $this->db_onedev->query($sql)->result_array();
// if($rows_not_found_format){
// foreach($rows_not_found_format as $ki => $vi){
// if($vi['xid'] == '0' || $vi['xid'] == 0){
// //echo $vi['testname'];
// array_push($arr_not_found_format,$vi['testname']);
// }
// }
// }
if(count($arr_not_found_format) > 0){
$rows[$k]['status_complete_format'] = 'N';
$rows[$k]['status_ready'] = 'N';
$rows[$k]['test_not_ready'] = join($arr_not_found_format,',');
}
//echo $rows[$k]['status_ready'];
$sql = "SELECT COUNT(*) as xcount
FROM result_handoveremail
WHERE
Result_HandOverEmailT_OrderHeaderID = {$v['order_id']} AND
Result_HandOverEmailT_OrderPromiseID = {$v['order_promise_id']} AND
Result_HandOverEmailT_OrderDeliveryID = {$v['delivery_id']} AND
Result_HandOverEmailStatus = 'S' AND
Result_HandOverEmailIsActive = 'Y'
";
$xrow_status = $this->db_onedev->query($sql)->row();
if($xrow_status->xcount > 0){
$rows[$k]['status_send'] = 'Y';
}
}
}
$companies = array(array('M_CompanyID'=>'0','M_CompanyName'=>'Semua'));
$sql = "SELECT
M_CompanyID,
M_CompanyName
FROM t_orderheader
JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID
JOIN t_orderdetail ON T_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_OrderDetailIsActive = 'Y' AND T_OrderDetailT_TestIsResult = 'Y'
JOIN t_orderpromise ON T_OrderHeaderID = T_OrderPromiseT_OrderHeaderID AND
T_OrderDetailT_OrderPromiseID = T_OrderPromiseID AND
T_OrderPromiseIsActive = 'Y'
JOIN t_orderdelivery ON T_orderDeliveryT_OrderHeaderID = T_OrderHeaderID AND
T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y'
LEFT JOIN result_processtooffice ON Result_ProcessToOfficeT_OrderHeaderID = T_OrderHeaderID AND
Result_ProcessToOfficeT_OrderDeliveryID = T_OrderDeliveryID AND
Result_ProcessToOfficeT_OrderPromiseID = T_OrderPromiseID
LEFT JOIN result_handoveremail ON Result_HandOverEmailT_OrderHeaderID = T_OrderHeaderID AND
Result_HandOverEmailT_OrderDeliveryID = T_OrderDeliveryID AND
Result_HandOverEmailT_OrderPromiseID = T_OrderPromiseID
WHERE
(
DATE(T_OrderPromiseDateTime) BETWEEN '{$startdate}' AND '{$enddate}'
) AND
T_OrderHeaderIsActive = 'Y' AND
ISNULL(Result_HandOverEmailID)
GROUP BY M_CompanyID";
// 7. QUERY KOMPONEN UI: Mengambil daftar perusahaan untuk ditampilkan di dropdown filter
$xcompanies = $this->db_onedev->query($sql)->result_array();
if($xcompanies){
foreach($xcompanies as $kc => $vc){
array_push($companies,$vc);
}
}
//echo $this->db_onedev->last_query();
$result = array("total" => $tot_page, "companies" => $companies,"records" => $rows, "sql"=> '');
// 8. RESPONSE: Mengirim hasil akhir ke Frontend
$this->sys_ok($result);
exit;
}
function search_v2()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$startdate = isset($prm["startdate"]) && $prm["startdate"] != '' ? $prm["startdate"] : date('Y-m-d');
$enddate = isset($prm["enddate"]) && $prm["enddate"] != '' ? $prm["enddate"] : date('Y-m-d');
$name = isset($prm["name"]) ? trim($prm["name"]) : '';
$nolab = isset($prm["nolab"]) ? trim($prm["nolab"]) : '';
$status = isset($prm["status"]) ? trim($prm["status"]) : '';
$company = isset($prm["company"]["M_CompanyID"]) ? (int)$prm["company"]["M_CompanyID"] : 0;
$page = isset($prm["page"]) && $prm["page"] > 0 ? (int)$prm["page"] : 1;
$limit = 8;
$offset = ($page - 1) * $limit;
// Build dynamic WHERE filters
$extra_where = '';
$extra_params = array();
if ($status != '') {
$extra_where .= ' AND tse.T_SendEmailStatus = ?';
$extra_params[] = $status;
}
if ($name != '') {
$extra_where .= ' AND tse.T_SendEmailPatientName LIKE ?';
$extra_params[] = '%' . $name . '%';
}
if ($nolab != '') {
$extra_where .= ' AND (toh.T_OrderHeaderLabNumber LIKE ? OR tse.T_SendEmailPatientName LIKE ?)';
$extra_params[] = '%' . $nolab . '%';
$extra_params[] = '%' . $nolab . '%';
}
if ($company > 0) {
$extra_where .= ' AND toh.T_OrderHeaderM_CompanyID = ?';
$extra_params[] = $company;
}
// ================= TOTAL DATA =================
$sql_count = "SELECT COUNT(*) as total
FROM t_send_email tse
JOIN t_orderheader toh
ON tse.T_SendEmailT_OrderHeaderID = toh.T_OrderHeaderID
JOIN (
SELECT
T_OrderPromiseT_OrderHeaderID,
MAX(T_OrderPromiseDateTime) AS T_OrderPromiseDateTime
FROM t_orderpromise
WHERE T_OrderPromiseIsActive = 'Y'
GROUP BY T_OrderPromiseT_OrderHeaderID
) tp_latest
ON tp_latest.T_OrderPromiseT_OrderHeaderID = toh.T_OrderHeaderID
WHERE tse.T_SendEmailIsActive = 'Y'
AND DATE(tp_latest.T_OrderPromiseDateTime)
BETWEEN ? AND ?
{$extra_where}";
$query_count = $this->db_onedev->query($sql_count, array_merge(array($startdate, $enddate), $extra_params));
$total_data = $query_count->row()->total;
// ================= DATA DENGAN LIMIT =================
$sql = "SELECT
tse.T_SendEmailT_OrderHeaderID as order_id,
tse.T_SendEmailT_OrderHeaderID as T_OrderHeaderID,
tse.T_SendEmailPatientName,
tse.T_SendEmailDoctorName,
tse.T_SendEmailRecepient,
tse.T_SendEmailRecepientType,
tse.T_SendEmailStatus,
toh.T_OrderHeaderDate AS Tanggal_Order,
tp_latest.T_OrderPromiseDateTime AS Janji_Hasil,
DATE(tp_latest.T_OrderPromiseDateTime) AS order_promise_date,
toh.T_OrderHeaderLabNumber AS No_Reg,
mc.M_CompanyName AS Kel_Pelanggan,
(SELECT T_OrderDeliveryID
FROM t_orderdelivery
WHERE T_OrderDeliveryT_OrderHeaderID = tse.T_SendEmailT_OrderHeaderID
AND T_OrderDeliveryM_DeliveryTypeID = 3
AND T_OrderDeliveryIsActive = 'Y'
LIMIT 1) as delivery_id
FROM t_send_email tse
JOIN t_orderheader toh
ON tse.T_SendEmailT_OrderHeaderID = toh.T_OrderHeaderID
JOIN (
SELECT
T_OrderPromiseT_OrderHeaderID,
MAX(T_OrderPromiseDateTime) AS T_OrderPromiseDateTime
FROM t_orderpromise
WHERE T_OrderPromiseIsActive = 'Y'
GROUP BY T_OrderPromiseT_OrderHeaderID
) tp_latest
ON tp_latest.T_OrderPromiseT_OrderHeaderID = toh.T_OrderHeaderID
JOIN m_company mc
ON toh.T_OrderHeaderM_CompanyID = mc.M_CompanyID
WHERE tse.T_SendEmailIsActive = 'Y'
AND DATE(tp_latest.T_OrderPromiseDateTime)
BETWEEN ? AND ?
{$extra_where}
ORDER BY toh.T_OrderHeaderDate ASC
LIMIT ? OFFSET ?";
$query = $this->db_onedev->query($sql, array_merge(
array($startdate, $enddate),
$extra_params,
array($limit, $offset)
));
if (!$query) {
$this->sys_error_db("Database Error", $this->db_onedev);
exit;
}
$rows = $query->result_array();
if ($rows) {
foreach ($rows as $k => $v) {
$rows[$k]['nonlab_urls'] = $this->get_email_nonlab_urls_data($v['T_OrderHeaderID']);
$rows[$k]['reports_url'] = $this->_get_reports_url($v['T_OrderHeaderID']);
$type = strtoupper($v['T_SendEmailRecepientType']);
if ($type == 'DOCTOR') $type = 'DOKTER';
$rows[$k]['email_config'] = $this->get_email_config(true, array(
'type' => $type,
'order_id' => $v['T_OrderHeaderID']
));
}
}
$result = array(
"total" => (int)$total_data,
"page" => $page,
"per_page" => $limit,
"total_page" => ceil($total_data / $limit),
"records" => $rows
);
$this->sys_ok($result);
} catch (Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
public function save()
{
try {
$xprm = $this->sys_input;
//# cek token valid
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$xuserid = $this->sys_user['M_UserID'];
//# ambil parameter input
//print_r($xprm);
$prm = $xprm['patient'];
$xstatus = $xprm['act'];
$fostatusid = 3;
$fologcode = 'FO.VERIFICATION.CONFIRM';
$id = $prm['T_OrderHeaderID'];
echo $xstatus;
if($xstatus == 'N'){
$fostatusid = 4;
$fologcode = 'FO.VERIFICATION.REJECT';
}else{
$this->save_barcode_new($id);
}
//print_r($prm);
$xverificationnote = $prm['verification_note'];
//echo $xverificationnote;
$sql = "update t_orderheader
set
T_OrderHeaderVerificationNote = '{$xverificationnote}'
where
T_OrderHeaderID = $id";
//echo $sql;
$query = $this->db_onedev->query($sql);
$sql = "insert into fo_status(
Fo_StatusDate,
Fo_StatusT_OrderHeaderID,
Fo_StatusM_StatusID,
Fo_StatusM_UserID,
Fo_StatusCreated,
Fo_StatusUpdated)
values( now(), ?, ?, ?, now(),now())";
//echo $sql;
$query = $this->db_onedev->query($sql,
array(
$id,
$fostatusid,
$xuserid
)
);
if (!$query) {
$this->sys_error_db("fo_status insert");
exit;
}
$data_log = array();
$data_log['orderid'] = $id;
$json_dt_log = json_encode($data_log);
$sql = "insert into one_log.log_fo(
Log_FoDate,
Log_FoCode,
Log_FoJson,
Log_FoUserID)
values( now(), ?, ?, ?)";
//echo $sql;
$query = $this->db_onedev->query($sql,
array(
$fologcode,
$json_dt_log,
$xuserid
)
);
if (!$query) {
$this->sys_error_db("one_log.fo_log insert");
exit;
}
if($xstatus == 'Y'){
$msg = 'Verifikasi berhasil dilakukan';
}
else{
$msg = 'Tolak Verifikasi berhasil dilakukan';
$sql = "INSERT INTO t_ordermessage (
T_OrderMessageT_OrderHeaderID,
T_OrderMessageType,
T_OrderMessageMessage,
T_OrderMessageFromUserID,
T_OrderMessageCreated,
T_OrderMessageLastUpdated
)
VALUES(
{$id},
'FO.VERIFICATION.REJECT',
'{$xverificationnote}',
{$xuserid},
NOW(),
NOW()
)";
//echo $sql;
$query = $this->db_onedev->query($sql);
if (!$query) {
$this->sys_error_db("one_log.t_ordermessage insert");
exit;
}
}
$rows = array('message'=>$msg);
$result = array ("total" => 0, "records" => $rows);
$this->sys_ok($result);
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function save_barcode_new($orderid){
$xuserid = $this->sys_user['M_UserID'];
$query =" SELECT T_SampleTypeID as id,
T_SampleTypeName as name,
'' as children
FROM t_orderheader
JOIN t_orderdetail ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID
JOIN t_test ON T_OrderDetailT_TestID = T_TestID
JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID
WHERE
T_OrderHeaderID = {$orderid}
GROUP BY T_SampleTypeID
";
//echo $query ;
$barcodes = $this->db_onedev->query($query)->result();
foreach($barcodes as $k => $v){
$query = "SELECT T_SampleTypeID as id, IFNULL(T_BarcodeLabID,0) as xid,
IF(ISNULL(T_BarcodeLabID),'Y',T_BarcodeLabIsActive) as chex,
T_TestName as testname,
T_SampleTypeName as samplename,
IF(ISNULL(T_BarcodeLabID),CONCAT(T_OrderHeaderLabNumber,'.',T_SampleTypeID,'.',1),T_BarcodeLabBarcode) as barcodenumber
FROM t_orderdetail
JOIN t_orderheader ON T_OrderHeaderID = T_OrderDetailT_OrderHeaderID
JOIN t_test ON T_OrderDetailT_TestID = T_TestID
JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID
LEFT JOIN t_barcodelab ON T_BarcodeLabT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND
T_BarcodeLabT_SampleTypeID = T_TestT_SampleTypeID AND T_BarcodeLabIsActive = 'Y'
WHERE
T_OrderDetailT_OrderHeaderID = {$orderid} AND T_SampleTypeID = {$v->id}
GROUP BY T_BarcodeLabID ";
$v->children = $this->db_onedev->query($query)->result_array();
//$v->children = $barcode_data;
foreach($v->children as $ki => $vi){
if($vi['chex'] == 'N')
$v->children[$ki]['chex'] = false;
else
$v->children[$ki]['chex'] = true;
$sql = "insert into t_barcodelab(
T_BarcodeLabT_OrderHeaderID,
T_BarcodeLabBarcode,
T_BarcodeLabT_SampleTypeID,
T_BarcodeLabCreated,
T_BarcodeLabLastUpdated,
T_BarcodeLabUserID)
values( ?, ?, ?, now(),now(),?)";
$query = $this->db_onedev->query($sql,
array(
$orderid,
$v->children[$ki]['barcodenumber'],
$v->children[$ki]['id'],
$xuserid
)
);
// echo $this->db_onedev->last_query();
if (!$query) {
$this->sys_error_db("t_barcodelab insert");
exit;
}
}
}
//insert log
$supplies = array();
$query =" SELECT M_SuppliesID as id,
IFNULL(T_OrderSuppliesID,0) as xid,
IF(ISNULL(T_OrderSuppliesID),'N',T_OrderSuppliesIsActive) as chex,
IFNULL(T_OrderSuppliesQty,1) as qty,
M_SuppliesName as name,
IF(ISNULL(T_OrderSuppliesID),NOW(),T_OrderSuppliesLastUpdated) as lastupdated,
IF(ISNULL(T_OrderSuppliesID),NOW(),T_OrderSuppliesLastUpdated) as tx_lastupdated
FROM m_supplies
JOIN t_ordersupplies ON T_OrderSuppliesT_OrderHeaderID = $orderid AND T_OrderSuppliesM_SuppliesID = M_SuppliesID
WHERE
M_SuppliesIsActive = 'Y'
";
//echo $query ;
$supplies = $this->db_onedev->query($query)->result_array();
foreach($supplies as $k => $v){
if($v['chex'] == 'N')
$supplies[$k]['chex'] = false;
else
$supplies[$k]['chex'] = true;
}
$dt_log = array('orderid'=>$orderid,'supplies'=>$supplies,'barcode'=>$barcodes);
$fologcode = 'FO.Verification.BarcodeSupplies';
$json_dt_log = json_encode($dt_log);
$sql = "insert into one_log.log_supplies_barcode(
Log_SuppliesBarcodeDate,
Log_SuppliesBarcodeCode,
Log_SuppliesBarcodeJson,
Log_SuppliesBarcodeUserID)
values( now(), ?, ?, ?)";
//echo $sql;
$query = $this->db_onedev->query($sql,
array(
$fologcode,
$json_dt_log,
$xuserid
)
);
if (!$query) {
$this->sys_error_db("one_log.log_supplies_barcode insert");
exit;
}
}
function saveverifications($id,$verifications,$type,$userid)
{
try {
//$xverificationtypeid = $this->db_onedev->query("SELECT * FROM fo_verificationtype WHERE Fo_VerificationTypeGroup = '{$type}' AND Fo_VerificationTypeIsActive = 'Y'")->row()->Fo_VericationTypeID;
//echo $xverificationtypeid;
//print_r($verifications);
foreach($verifications as $k => $v){
//print_r($v);
if(intval($v['xid']) == 0){
$sql = "insert into fo_verification(
Fo_VerificationT_OrderHeaderID,
Fo_VerificationFo_VericationTypeID,
Fo_VerificationIsOK,
Fo_VerificationReason,
Fo_VerificationCreated,
Fo_VerificationLastUpdated,
Fo_VerificationUserID)
values( ?, ?, ?, ?, now(),now(),?)";
//echo $sql;
$query = $this->db_onedev->query($sql,
array(
$id,
$v['id'],
$v['chex'] == true ?'Y':'N',
$v['note'],
$userid
)
);
if (!$query) {
$this->sys_error_db("fo_verification insert");
exit;
}
}
}
return true;
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveverification_delivery($id,$deliveries,$userid)
{
try {
foreach($deliveries as $k => $v){
if($v['id'] === 0){
$sql = "insert into fo_verification_delivery_add(
Fo_VerificationDeliveryAddT_OrderHeaderID,
Fo_VerificationDeliveryAddM_DeliveryID,
Fo_VerificationDeliveryAddM_DeliveryTypeID,
Fo_VerificationDeliveryAddDestination,
Fo_VerificationDeliveryAddAddressID,
Fo_VerificationDeliveryAddM_KelurahanID,
Fo_VerificationDeliveryAddOK,
Fo_VerificationDeliveryAddReason,
Fo_VerificationDeliveryAddCreated,
Fo_VerificationDeliveryAddLastUpdated,
Fo_VerificationDeliveryAddUserID)
values( ?, ?, ?, ?,?,?,?,?, now(),now(),?)";
//echo $sql;
$query = $this->db_onedev->query($sql,
array(
$id,
$v['deliveryid'],
$v['typedeliveryid'],
$v['destination'],
$v['addressid'],
$v['vilageid'],
$v['chex'] == true ?'Y':'N',
$v['note'],
$userid
)
);
if (!$query) {
echo $this->db_onedev->last_query();
$this->sys_error_db("fo_verification_delivery_add insert");
exit;
}
}else{
$sql = "insert into fo_verification_delivery(
Fo_VerificationDeliveryT_OrderHeaderID,
Fo_VerificationDeliveryT_OrderDeliveryID,
Fo_VerificationDeliveryIsOK,
Fo_VerificationDeliveryReason,
Fo_VerificationDeliveryCreated,
Fo_VerificationDeliveryLastUpdated,
Fo_VerificationDeliveryUserID)
values( ?, ?, ?, ?, now(),now(),?)";
//echo $sql;
$query = $this->db_onedev->query($sql,
array(
$id,
$v['id'],
$v['chex'] == true ?'Y':'N',
$v['note'],
$userid
)
);
if (!$query) {
echo $this->db_onedev->last_query();
$this->sys_error_db("fo_verification_delivery insert");
exit;
}
//echo $this->db_onedev->last_query();
}
}
return true;
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function lookup_barcodes()
{
try {
$prm = $this->sys_input;
//# cek token valid
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$sql = "SELECT T_BarcodeLabID as id, 'barcode' as type,T_BarcodeLabID,T_BarcodeLabBarcode, T_BarcodeLabCounter, T_SampleTypeName, 'N' as chex
FROM t_barcodelab
JOIN t_sampletype ON T_BarcodeLabT_SampleTypeID = T_SampleTypeID
WHERE
T_BarcodeLabT_OrderHeaderID = {$prm['ohid']} AND T_BarcodeLabIsActive = 'Y'
UNION
SELECT T_OrderHeaderID as id, 'formulir' as type, 0,T_OrderHeaderLabNumber as T_BarcodeLabBarcode, 1, 'Formulir' as T_SampleTypeName, 'N' as chex
FROM t_orderheader
WHERE
T_OrderHeaderID = {$prm['ohid']}
";
//echo $sql;
$rows = $this->db_onedev->query($sql)->result_array();
if($rows){
foreach($rows as $k => $v){
if($v['chex'] == 'N')
$rows[$k]['chex'] = false;
else
$rows[$k]['chex'] = true;
}
}
$result = array ("total" => 0, "records" => $rows);
$this->sys_ok($result);
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function saveverification_px($id,$pxs,$userid)
{
try {
foreach($pxs as $k => $v){
if(intval($v['id']) == 0){
$cxh = $v['chex'] == true ?'Y':'N';
$sql = "insert into fo_verification_test_add(
Fo_VerificationTestAddT_OrderHeaderID,
Fo_VerificationTestAddT_TestID,
Fo_VerificationTestAddBruto,
Fo_VerificationTestAddDiscount,
Fo_VerificationTestAddTotal,
Fo_VerificationTestAddIsOK,
Fo_VerificationTestAddIsCito,
Fo_VerificationTestAddCreated,
Fo_VerificationTestAddLastUpdated,
Fo_VerificationTestAddUserID)
values( $id, {$v['pxid']}, {$v['bruto']}, {$v['discount']},{$v['total']},'{$cxh}','{$v['flagcito']}',now(),now(),{$userid})";
//echo $sql;
$query = $this->db_onedev->query($sql);
//echo $this->db_onedev->last_query();
if (!$query) {
$this->sys_error_db("fo_verification_test_add insert");
exit;
}
}else{
$sql = "insert into fo_verification_test(
Fo_VerificationTestT_OrderHeaderID,
Fo_VerificationTestT_OrderDetailID,
Fo_VerificationTestIsOK,
Fo_VerificationTestReason,
Fo_VerificationTestCreated,
Fo_VerificationTestLastUpdated,
Fo_VerificationTestUserID)
values( ?, ?, ?, ?, now(),now(),?)";
//echo $sql;
$query = $this->db_onedev->query($sql,
array(
$id,
$v['id'],
$v['chex'] == true ?'Y':'N',
$v['note'],
$userid
)
);
//echo $this->db_onedev->last_query();
if (!$query) {
$this->sys_error_db("fo_verification_test insert");
exit;
}
}
}
return true;
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function verify(){
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$userid = $this->sys_user["M_UserID"];
$xstatus = $prm['act'];
if($xstatus == 'Y'){
$msg = "Berhasil melakukan verifikasi";
$query =" INSERT INTO result_verifications_value (
Result_VerificationsValueSo_ResultEntryID,
Result_VerificationsValueResult_VerificationsID,
Result_VerificationsValueCheck,
Result_VerificationsValueNote,
Result_VerificationsValueUserID,
Result_VerificationsValueCreated
)
SELECT {$prm['trx_id']},
Result_VerificationsID,
'Y',
'',
{$userid},
NOW()
FROM result_verifications
WHERE
Result_VerificationIsActive = 'Y'
ON DUPLICATE KEY UPDATE
Result_VerificationsValueCheck = 'Y',
Result_VerificationsValueNote = '',
Result_VerificationsValueUserID = {$userid},
Result_VerificationsValueLastUpdated = NOW()
";
//echo $query;
$this->db_onedev->query($query);
$sql = "UPDATE so_resultentry SET So_ResultEntryStatus = 'VAL2' , So_ResultEntryValidation2 = 'Y' WHERE So_ResultEntryID = {$prm['trx_id']}";
$this->db_onedev->query($sql);
}
else{
$msg = "Tolak untuk perbaikan";
$verifications = $prm['verifications'];
foreach($verifications as $k => $v){
$chx = $v['chex'] == true ?'Y':'N';
$query =" INSERT INTO result_verifications_value (
Result_VerificationsValueSo_ResultEntryID,
Result_VerificationsValueResult_VerificationsID,
Result_VerificationsValueCheck,
Result_VerificationsValueNote,
Result_VerificationsValueUserID,
Result_VerificationsValueCreated
)
values( {$prm['trx_id']},
{$v['id']},
'{$chx}',
'{$v['note']}',
{$userid},
NOW()
)
ON DUPLICATE KEY UPDATE
Result_VerificationsValueCheck = '{$chx}',
Result_VerificationsValueNote = '{$v['note']}',
Result_VerificationsValueUserID = {$userid},
Result_VerificationsValueLastUpdated = NOW()
";
//echo $query;
$this->db_onedev->query($query);
}
}
$result = array ("total" => 0, "records" => array('status'=>'OK','message'=>$msg));
$this->sys_ok($result);
}
function get_count_url_nonlab($is_internal = false, $custom_prm = null)
{
try {
//# 1. Inisialisasi Parameter
$prm = ($custom_prm) ? $custom_prm : $this->sys_input;
if(!isset($prm['order_promise_id'])){
$sql_pid = "SELECT T_OrderPromiseID FROM t_orderpromise WHERE T_OrderPromiseT_OrderHeaderID = ? AND DATE(T_OrderPromiseDateTime) = ? LIMIT 1";
$q_pid = $this->db_onedev->query($sql_pid, array($prm['order_id'], $prm['order_promise_date']));
if ($q_pid && $q_pid->num_rows() > 0) {
$prm['order_promise_id'] = $q_pid->row()->T_OrderPromiseID;
} else {
$prm['order_promise_id'] = 0;
}
}
$rows = array(
'total_test' => 0,
'total_available' => 0,
'reports' => array()
);
//# 2. Query untuk mengambil list pemeriksaan (Sama dengan logic getstatuspergroup)
$sql = "
SELECT UPPER(Group_ResultName) as group_name
FROM t_orderdetail
JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID
JOIN t_orderpromise ON T_OrderDetailT_OrderPromiseID = T_OrderPromiseID AND T_OrderPromiseIsActive = 'Y'
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_OrderHeaderID = {$prm['order_id']}
AND DATE(T_OrderPromiseDateTime) = '{$prm['order_promise_date']}'
AND T_OrderDetailIsActive = 'Y'
GROUP BY Group_ResultID
UNION
SELECT UPPER(T_TestName) as group_name
FROM t_orderdetail
JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID
JOIN t_orderpromise ON T_OrderDetailT_OrderPromiseID = T_OrderPromiseID AND T_OrderPromiseIsActive = 'Y'
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_OrderHeaderID = {$prm['order_id']}
AND DATE(T_OrderPromiseDateTime) = '{$prm['order_promise_date']}'
AND T_OrderDetailIsActive = 'Y'
GROUP BY T_TestID
";
$info_test = $this->db_onedev->query($sql)->result_array();
//# 3. Hitung Statistik URL
if (!empty($info_test)) {
foreach ($info_test as $v) {
$rows['total_test']++;
// Cek ketersediaan URL menggunakan helper function
$status = $this->_check_email_nonlab_exists($prm['order_id'], $v['group_name']);
$sql_url = "SELECT T_EmailNonLabUrl
FROM t_email_nonlab
WHERE T_EmailNonLabT_OrderHeaderID = ?
AND T_EmailNonLabGroup_ResultName = ?
AND T_EmailNonLabUrl IS NOT NULL AND T_EmailNonLabUrl != ''
LIMIT 1";
if ($status == 'ada') {
$rows['total_available']++;
// Ambil detail URL untuk dimasukkan ke reports
$q_url = $this->db_onedev->query($sql_url, array($prm['order_id'], $v['group_name']));
if ($q_url && $q_url->num_rows() > 0) {
$row_url = $q_url->row();
// Masukkan ke array reports
$rows['reports'][] = array("id" => (string)(count($rows['reports']) + 1), "url" => $row_url->T_EmailNonLabUrl, "result" => $v['group_name']);
}
}
}
}
//# 4. Logika Response
if ($is_internal) {
// Jika dipanggil dari function lain, kembalikan array (jangan disys_ok)
return $rows;
} else {
// Jika dipanggil via REST HTTP, berikan response JSON standar
$result = array("total" => 0, "records" => $rows);
$this->sys_ok($result);
}
} catch (Exception $exc) {
if ($is_internal) {
throw $exc; // Lempar error ke function pemanggil
}
$this->sys_error($exc->getMessage());
}
}
function getstatuspergroup()
{
try {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$rows = array();
// ============================================================
// Query 1: Ambil info delivery (email tujuan)
// ============================================================
$sql = "SELECT T_OrderDeliveryID as id,
T_OrderDeliveryDestination as name,
T_OrderDeliveryM_DeliveryID as delivery_id,
M_DeliveryName as delivery_name
FROM t_orderdelivery
JOIN m_delivery ON T_OrderDeliveryM_DeliveryID = M_DeliveryID
JOIN m_deliverytype ON T_OrderDeliveryM_DeliveryTypeID = M_DeliveryTypeID AND M_DeliveryTypeID = 3
LEFT JOIN fo_verification_delivery ON Fo_VerificationDeliveryT_OrderHeaderID = T_OrderDeliveryT_OrderHeaderID AND Fo_VerificationDeliveryIsActive = 'Y'
WHERE
T_OrderDeliveryID = {$prm['delivery_id']} AND T_OrderDeliveryT_OrderHeaderID = {$prm['order_id']} AND T_OrderDeliveryIsActive = 'Y'
GROUP BY T_OrderDeliveryID
";
$rows_deliveries = $this->db_onedev->query($sql)->result_array();
$rows['info_deliveries'] = array();
foreach($rows_deliveries as $k_rd => $v_rd){
$email_now = explode(',',$v_rd['name']);
foreach($email_now as $k_email => $v_email){
array_push($rows['info_deliveries'], array(
'id'=>$v_rd['id'],
'name'=>$v_email,
'delivery_id'=>$v_rd['delivery_id'],
'delivery_name'=>$v_rd['delivery_name']
));
}
}
// ============================================================
// Query 2: Ambil info_test dari t_orderheader_group_result
// Status = 'ready' jika sudah ada di qr_printout (IsActive='Y')
// ============================================================
$sql = "
SELECT
togr.T_OrderHeaderGroupResultT_OrderHeaderID AS T_OrderHeaderID,
togr.T_OrderHeaderGroupResultGroup_ResultID AS Group_ResultID,
togr.T_OrderHeaderGroupResultT_TestID AS T_TestID,
togr.T_OrderHeaderGroupResultGroup_ResultName AS group_name,
IF(ISNULL(qr.QR_PrintOutID), 'not_ready', 'ready') AS status,
IFNULL(qr.QR_PrintOutReportURLElectronic, '') AS url_report
FROM t_orderheader_group_result togr
LEFT JOIN qr_printout qr
ON qr.QR_PrintOutT_OrderHeaderID = togr.T_OrderHeaderGroupResultT_OrderHeaderID
AND qr.QR_PrintOutGroup_ResultID = togr.T_OrderHeaderGroupResultGroup_ResultID
AND qr.QR_PrintOutT_TestID = togr.T_OrderHeaderGroupResultT_TestID
AND qr.QR_PrintOutIsActive = 1
WHERE
togr.T_OrderHeaderGroupResultT_OrderHeaderID = {$prm['order_id']}
AND togr.T_OrderHeaderGroupResultIsActive = 'Y'
";
$rows['info_test'] = $this->db_onedev->query($sql)->result_array();
$rows['summary_nonlab'] = $this->get_count_url_nonlab(true);
// ============================================================
// Query 3: Timeline pengiriman email
// ============================================================
$sql = "SELECT DATE_FORMAT(Result_HandOverEmailSendDateTime,'%d-%m-%Y %H:%i') as sent_time,
DATE_FORMAT(Result_HandOverEmailReceivedDateTime,'%d-%m-%Y %H:%i') as received_time,
Result_HandOverEmailStatus as status,
M_StaffName as officer
FROM t_orderdelivery
JOIN t_orderheader ON T_OrderDeliveryT_OrderHeaderID = T_OrderHeaderID
JOIN t_orderpromise ON T_OrderPromiseT_OrderHeaderID = T_OrderHeaderID AND
DATE(T_OrderPromiseDateTime) = '{$prm['order_promise_date']}' AND
T_OrderPromiseIsActive = 'Y'
JOIN result_handoveremail ON Result_HandOverEmailT_OrderHeaderID = T_OrderHeaderID AND
Result_HandOverEmailT_OrderPromiseID = T_OrderPromiseID AND
Result_HandOverEmailT_OrderDeliveryID = T_OrderDeliveryID
JOIN m_user ON Result_HandOverEmailOfficer = M_UserID
JOIN m_staff ON M_UserM_StaffID = M_StaffID
WHERE
T_OrderDeliveryID = {$prm['delivery_id']} AND T_OrderDeliveryIsActive = 'Y'
GROUP BY Result_HandOverEmailID
ORDER BY Result_HandOverEmailID ASC";
$rows['timeline'] = $this->db_onedev->query($sql)->result_array();
if(!$rows['timeline']){
$rows['timeline'] = array();
}
// ============================================================
// Ambil info_send_email dan send_email_logs
// ============================================================
$recepient = isset($prm['T_SendEmailRecepient']) ? $prm['T_SendEmailRecepient'] : '';
$rows['info_send_email'] = $this->_get_send_email_info($prm['order_id'], $recepient);
$rows['send_email_logs'] = array();
$list_recepients = array();
if(isset($prm['T_SendEmailRecepient']) && !empty($prm['T_SendEmailRecepient'])){
$list_recepients[] = $prm['T_SendEmailRecepient'];
}
if (!empty($list_recepients)) {
foreach ($list_recepients as $recepient) {
$recepient = trim($recepient);
if (empty($recepient)) continue;
$sql_log = "SELECT
log.T_SendEmailLogID,
log.T_SendEmailLogRecepient,
log.T_SendEmailLogStatus,
log.T_SendEmailLogCreated,
log.T_SendEmailLogCreatedUserID,
log.T_SendEmailLogGroup_ResultName,
log.T_SendEmailLogJson,
usr.M_UserFullName
FROM one_lab_log.t_send_email_log log
JOIN one_lab.m_user usr ON log.T_SendEmailLogCreatedUserID = usr.M_UserID
WHERE log.T_SendEmailLogT_OrderHeaderID = ?
AND log.T_SendEmailLogRecepient = ?
ORDER BY log.T_SendEmailLogCreated DESC";
$q_log = $this->db_onedev->query($sql_log, array($prm['order_id'], $recepient));
$rows['send_email_logs'][$recepient] = $q_log ? $q_log->result_array() : array();
}
}
$result = array("total" => 0, "records" => $rows);
$this->sys_ok($result);
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
function _check_email_nonlab_exists($order_id, $group_name)
{
// Gunakan binding (?) untuk keamanan dua parameter
$sql = "SELECT T_EmailNonLabID
FROM t_email_nonlab
WHERE T_EmailNonLabT_OrderHeaderID = ?
AND T_EmailNonLabGroup_ResultName = ?
LIMIT 1";
$query = $this->db_onedev->query($sql, array($order_id, $group_name));
// Kembalikan teks sesuai permintaan
if ($query && $query->num_rows() > 0) {
return "ada";
}
return "tidak ada";
}
private function get_email_nonlab_urls_data($T_OrderHeaderID)
{
$sql = "SELECT
T_EmailNonLabID AS id,
T_EmailNonLabUrl AS url,
T_EmailNonLabGroup_ResultName AS result
FROM t_email_nonlab
WHERE
T_EmailNonLabT_OrderHeaderID = ?
AND T_EmailNonLabUrl IS NOT NULL
AND T_EmailNonLabUrl <> ''
ORDER BY T_EmailNonLabID DESC";
$query = $this->db_onedev->query($sql, [$T_OrderHeaderID]);
if (!$query) {
return [];
}
return $query->result_array();
}
function getinfo()
{
try {
//# cek token valid
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$startdate = $prm["startdate"];
$enddate = isset($prm["enddate"]) ? $prm["enddate"] : $startdate;
$d_start = new DateTime($startdate);
$d_end = new DateTime($enddate);
$diff = $d_start->diff($d_end);
if($diff->days > 14){
$this->sys_error("Rentang tanggal tidak boleh lebih dari 2 minggu");
exit;
}
$rows = array();
$sql =" SELECT COUNT(*) as xcount
FROM (
SELECT *
FROM t_orderdelivery
JOIN t_orderheader ON T_OrderDeliveryT_OrderHeaderID = T_OrderHeaderID
JOIN t_orderpromise ON T_OrderPromiseT_OrderHeaderID = T_OrderHeaderID AND
DATE(T_OrderPromiseDateTime) BETWEEN '{$startdate}' AND '{$enddate}' AND
T_OrderPromiseIsActive = 'Y'
WHERE
T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y'
GROUP BY T_OrderDeliveryID
) x
";
//echo $sql ;
$rows['total'] = $this->db_onedev->query($sql)->row()->xcount;
$sql =" SELECT COUNT(*) as xcount
FROM (
SELECT *
FROM t_orderdelivery
JOIN t_orderheader ON T_OrderDeliveryT_OrderHeaderID = T_OrderHeaderID
JOIN t_orderpromise ON T_OrderPromiseT_OrderHeaderID = T_OrderHeaderID AND
DATE(T_OrderPromiseDateTime) BETWEEN '{$startdate}' AND '{$enddate}' AND
T_OrderPromiseIsActive = 'Y'
JOIN result_handoveremail ON Result_HandOverEmailT_OrderHeaderID = T_OrderHeaderID AND
Result_HandOverEmailT_OrderPromiseID = T_OrderPromiseID AND
Result_HandOverEmailT_OrderDeliveryID = T_OrderDeliveryID AND
Result_HandOverEmailStatus = 'D'
WHERE
T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y'
GROUP BY T_OrderDeliveryID
) x
";
//echo $sql ;
$rows['done'] = $this->db_onedev->query($sql)->row()->xcount;
$sql =" SELECT COUNT(*) as xcount
FROM (
SELECT *
FROM t_orderdelivery
JOIN t_orderheader ON T_OrderDeliveryT_OrderHeaderID = T_OrderHeaderID
JOIN t_orderpromise ON T_OrderPromiseT_OrderHeaderID = T_OrderHeaderID AND
DATE(T_OrderPromiseDateTime) BETWEEN '{$startdate}' AND '{$enddate}' AND
T_OrderPromiseIsActive = 'Y'
JOIN result_handoveremail ON Result_HandOverEmailT_OrderHeaderID = T_OrderHeaderID AND
Result_HandOverEmailT_OrderPromiseID = T_OrderPromiseID AND
Result_HandOverEmailT_OrderDeliveryID = T_OrderDeliveryID AND
Result_HandOverEmailStatus = 'S'
WHERE
T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y'
GROUP BY T_OrderDeliveryID
) x
";
//echo $sql ;
$rows['send'] = $this->db_onedev->query($sql)->row()->xcount;
$sql =" SELECT COUNT(*) as xcount
FROM (
SELECT *
FROM t_orderdelivery
JOIN t_orderheader ON T_OrderDeliveryT_OrderHeaderID = T_OrderHeaderID
JOIN t_orderpromise ON T_OrderPromiseT_OrderHeaderID = T_OrderHeaderID AND
DATE(T_OrderPromiseDateTime) BETWEEN '{$startdate}' AND '{$enddate}' AND
T_OrderPromiseIsActive = 'Y'
JOIN result_handoveremail ON Result_HandOverEmailT_OrderHeaderID = T_OrderHeaderID AND
Result_HandOverEmailT_OrderPromiseID = T_OrderPromiseID AND
Result_HandOverEmailT_OrderDeliveryID = T_OrderDeliveryID AND
Result_HandOverEmailStatus = 'X'
WHERE
T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y'
GROUP BY T_OrderDeliveryID
) x
";
//echo $sql ;
$rows['fail'] = $this->db_onedev->query($sql)->row()->xcount;
$sql =" SELECT COUNT(*) as xcount
FROM (
SELECT *
FROM t_orderdelivery
JOIN t_orderheader ON T_OrderDeliveryT_OrderHeaderID = T_OrderHeaderID
JOIN t_orderpromise ON T_OrderPromiseT_OrderHeaderID = T_OrderHeaderID AND
DATE(T_OrderPromiseDateTime) BETWEEN '{$startdate}' AND '{$enddate}' AND
T_OrderPromiseIsActive = 'Y'
JOIN result_handoveremail ON Result_HandOverEmailT_OrderHeaderID = T_OrderHeaderID AND
Result_HandOverEmailT_OrderPromiseID = T_OrderPromiseID AND
Result_HandOverEmailT_OrderDeliveryID = T_OrderDeliveryID AND
Result_HandOverEmailStatus = 'S'
WHERE
T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y' AND
NOW() > DATE_ADD(Result_HandOverEmailSendDateTime, INTERVAL 1 HOUR)
GROUP BY T_OrderDeliveryID
) x
";
//echo $sql ;
$rows['warning'] = $this->db_onedev->query($sql)->row()->xcount;
$result = array ("total" => 0, "records" => $rows);
$this->sys_ok($result);
} catch(Exception $exc) {
$message = $exc->getMessage();
$this->sys_error($message);
}
}
private function _get_reports_url($order_id)
{
$sql = "SELECT
togr.T_OrderHeaderGroupResultGroup_ResultID AS Group_ResultID,
togr.T_OrderHeaderGroupResultT_TestID AS T_TestID,
togr.T_OrderHeaderGroupResultGroup_ResultName AS group_name,
IF(ISNULL(qr.QR_PrintOutID), 'not_ready', 'ready') AS status,
IFNULL(qr.QR_PrintOutReportURLElectronic, '') AS url_report
FROM t_orderheader_group_result togr
LEFT JOIN qr_printout qr
ON qr.QR_PrintOutT_OrderHeaderID = togr.T_OrderHeaderGroupResultT_OrderHeaderID
AND qr.QR_PrintOutGroup_ResultID = togr.T_OrderHeaderGroupResultGroup_ResultID
AND qr.QR_PrintOutT_TestID = togr.T_OrderHeaderGroupResultT_TestID
AND qr.QR_PrintOutIsActive = 1
WHERE
togr.T_OrderHeaderGroupResultT_OrderHeaderID = ?
AND togr.T_OrderHeaderGroupResultIsActive = 'Y'";
$query = $this->db_onedev->query($sql, [$order_id]);
return $query ? $query->result_array() : [];
}
private function _get_delivery_info($order_id, $delivery_id)
{
$filter_delivery = "";
if(!empty($delivery_id) && $delivery_id != 0){
$filter_delivery = "AND T_OrderDeliveryID = {$delivery_id}";
}
$sql = "SELECT T_OrderDeliveryID as id,
T_OrderDeliveryDestination as name,
T_OrderDeliveryM_DeliveryID as delivery_id,
M_DeliveryName as delivery_name,
M_DeliverySource as delivery_source
FROM t_orderdelivery
JOIN m_delivery ON T_OrderDeliveryM_DeliveryID = M_DeliveryID
JOIN m_deliverytype ON T_OrderDeliveryM_DeliveryTypeID = M_DeliveryTypeID
AND M_DeliveryTypeID = 3
LEFT JOIN fo_verification_delivery ON Fo_VerificationDeliveryT_OrderHeaderID = T_OrderDeliveryT_OrderHeaderID
AND Fo_VerificationDeliveryIsActive = 'Y'
WHERE
T_OrderDeliveryT_OrderHeaderID = {$order_id}
AND T_OrderDeliveryIsActive = 'Y'
$filter_delivery
GROUP BY T_OrderDeliveryID";
$rows_deliveries = $this->db_onedev->query($sql)->result_array();
$info_deliveries = array();
foreach ($rows_deliveries as $v_rd) {
$email_list = explode(',', $v_rd['name']);
foreach ($email_list as $email) {
$info_deliveries[] = array(
'id' => $v_rd['id'],
'name' => trim($email),
'delivery_id' => $v_rd['delivery_id'],
'delivery_name' => $v_rd['delivery_name'],
'delivery_source' => $v_rd['delivery_source']
);
}
}
return $info_deliveries;
}
private function _get_send_email_info($order_id, $recepient_email = null, $filter_type = null)
{
$sql = "SELECT
T_SendEmailRecepient,
T_SendEmailRecepientType,
T_SendEmailDoctorName,
T_SendEmailReports,
T_SendEmailResponse,
T_SendEmailStatus,
T_SendEmailCreated,
T_SendEmailReceived
FROM t_send_email
WHERE T_SendEmailIsActive = 'Y'
AND T_SendEmailT_OrderHeaderID = ?";
$params = [$order_id];
// Tambahkan filter recepient jika ada
if (!empty($recepient_email)) {
$sql .= " AND T_SendEmailRecepient = ?";
$params[] = $recepient_email;
}
$sql .= " ORDER BY T_SendEmailCreated DESC";
$query = $this->db_onedev->query($sql, $params);
$results = [];
if ($query && $query->num_rows() > 0) {
foreach ($query->result_array() as $row) {
// Decode report (jika format JSON)
$row['T_SendEmailReports'] = !empty($row['T_SendEmailReports'])
? json_decode($row['T_SendEmailReports'], true)
: null;
// Tentukan type (kalau memang ada di kolom lain)
$type = 'UNKNOWN';
if (isset($row['T_SendEmailRecepientType'])) {
$type = strtoupper($row['T_SendEmailRecepientType']);
}
// Filter type jika diminta
if ($filter_type && strtoupper($filter_type) != $type) {
continue;
}
$row['T_SendEmailRecepients'] = array(
array(
'email' => $row['T_SendEmailRecepient'],
'type' => $type
)
);
// Ambil terbaru per type (karena sudah ORDER BY DESC)
if (!isset($results[$type])) {
$results[$type] = $row;
}
}
}
return array_values($results);
}
public function get_send_email_info()
{
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
$prm = $this->sys_input;
$orderHeaderID = isset($prm['order_id']) ? $prm['order_id'] : (isset($prm['T_OrderHeaderID']) ? $prm['T_OrderHeaderID'] : 0);
$recepient = isset($prm['recepient']) ? $prm['recepient'] : (isset($prm['T_SendEmailRecepient']) ? $prm['T_SendEmailRecepient'] : '');
$sql = "SELECT
T_SendEmailRecepient,
T_SendEmailRecepientType,
T_SendEmailDoctorName,
T_SendEmailReports,
T_SendEmailResponse,
T_SendEmailStatus,
T_SendEmailCreated,
T_SendEmailReceived
FROM t_send_email
WHERE T_SendEmailIsActive = 'Y'
AND T_SendEmailT_OrderHeaderID = ?
AND T_SendEmailRecepient = ?
ORDER BY T_SendEmailCreated DESC";
$query = $this->db_onedev->query($sql, [
$orderHeaderID,
$recepient
]);
$rows = [];
if ($query) {
$rows = $query->result_array();
foreach($rows as &$row){
if(isset($row['T_SendEmailReports']) && is_string($row['T_SendEmailReports'])){
$row['T_SendEmailReports'] = json_decode($row['T_SendEmailReports'], true);
}
// Format agar sesuai dengan tampilan di frontend (oneFoVerificationCenterList.vue)
$row['T_SendEmailRecepients'] = [
[
'email' => $row['T_SendEmailRecepient'],
'type' => $row['T_SendEmailRecepientType']
]
];
}
}
$result = array("total" => count($rows), "records" => $rows);
$this->sys_ok($result);
}
function get_email_config($is_internal = false, $custom_prm = null)
{
try {
//# cek token valid
if (!$is_internal) {
if (! $this->isLogin) {
$this->sys_error("Invalid Token");
exit;
}
}
$prm = ($custom_prm) ? $custom_prm : $this->sys_input;
$type = isset($prm['type']) ? strtoupper($prm['type']) : '';
$order_id = isset($prm['order_id']) ? $prm['order_id'] : 0;
$field = "";
if($type == 'DOKTER'){
$field = "M_EmailConfigResultFormatAPD";
}else if($type == 'PATIENT'){
$field = "M_EmailConfigResultFormatAPS";
}else if($type == 'COMPANY'){
$field = "M_EmailConfigResultFormatRK";
} else {
if ($is_internal) return null;
$this->sys_error("Tipe konfigurasi tidak valid");
exit;
}
$sql = "SELECT $field as format FROM m_emailconfig LIMIT 1";
$row = $this->db_onedev->query($sql)->row_array();
// Jika ada order_id, lakukan replace placeholder
if ($row && $order_id > 0) {
$sql_patient = "SELECT
CONCAT(IFNULL(M_TitleName,''),' ',M_PatientName) as patient_fullname,
DATE_FORMAT(T_OrderHeaderDate,'%d-%m-%Y') as order_date,
CONCAT(IFNULL(M_DoctorPrefix,''),IFNULL(M_DoctorPrefix2,''),' ',IFNULL(M_DoctorName,''),IFNULL(M_DoctorSufix,''),IFNULL(M_DoctorSufix2,''),IFNULL(M_DoctorSufix3,'')) as doctor_fullname,
M_CompanyName as company_name
FROM t_orderheader
JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID
LEFT JOIN m_title ON M_PatientM_TitleID = M_TitleID
LEFT JOIN m_doctor ON T_OrderHeaderSenderM_DoctorID = M_DoctorID
LEFT JOIN m_company ON T_OrderHeaderM_CompanyID = M_CompanyID
WHERE T_OrderHeaderID = ?";
$q_patient = $this->db_onedev->query($sql_patient, array($order_id));
if ($q_patient && $q_patient->num_rows() > 0) {
$r_patient = $q_patient->row();
$row['format'] = str_replace('{PASIEN}', $r_patient->patient_fullname, $row['format']);
$row['format'] = str_replace('{TANGGAL}', $r_patient->order_date, $row['format']);
$row['format'] = str_replace('{DOKTER}', $r_patient->doctor_fullname, $row['format']);
$row['format'] = str_replace('{COMPANY}', $r_patient->company_name, $row['format']);
}
}
if ($is_internal) {
return $row;
}
$result = array ("total" => 0, "records" => $row);
$this->sys_ok($result);
} catch(Exception $exc) {
if ($is_internal) return null;
$message = $exc->getMessage();
$this->sys_error($message);
}
}
}