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'); $page = isset($prm["page"]) && $prm["page"] > 0 ? (int)$prm["page"] : 1; $limit = 8; $offset = ($page - 1) * $limit; // ================= 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 ?"; $query_count = $this->db_onedev->query($sql_count, array($startdate, $enddate)); $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 ? ORDER BY toh.T_OrderHeaderDate ASC LIMIT ? OFFSET ?"; $query = $this->db_onedev->query($sql, array( $startdate, $enddate, $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']); $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 dengan 3 UNION // // BAGIAN 1 : Group LAB biasa → FlagNonLab='N', FlagPerTest='N' // Status dari result_processtooffice // Filter T_TestIsResult='Y' tetap berlaku // // BAGIAN 2 : Group LAB per-test → FlagPerTest='Y' // Status dari result_processtooffice per T_TestID // Filter T_TestIsResult='Y' tetap berlaku // // BAGIAN 3 : Group NonLab (FIX!) → FlagNonLab='Y', FlagPerTest='N' // Contoh: Rontgen, Pemeriksaan Fisik // Tidak pakai filter T_TestIsResult='Y' karena hasil // dari sistem eksternal (BIRT/upload manual) // Status dari t_email_nonlab (ada record = 'Y') // ============================================================ $sql = " -- ------------------------------------------------------- -- BAGIAN 1: Group LAB biasa (FlagNonLab='N', FlagPerTest='N') -- ------------------------------------------------------- SELECT T_OrderHeaderID, T_OrderPromiseID, T_OrderPromiseDateTime, T_OrderHeaderLabNumber, UPPER(Group_ResultName) as group_name, IF(ISNULL(Result_ProcessToOfficeID),'N','Y') as status, 'default-format' as format_email FROM t_orderdetail JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID JOIN t_orderdelivery ON T_OrderDeliveryT_OrderHeaderID = T_OrderHeaderID AND T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y' 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' AND Group_ResultFlagNonLab = 'N' LEFT JOIN result_processtooffice ON Result_ProcessToOfficeT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND Result_ProcessToOfficeT_OrderDeliveryID = T_OrderDeliveryID AND Result_ProcessToOfficeT_OrderPromiseID = T_OrderPromiseID AND Result_ProcessToOfficeGroup_ResultID = Group_ResultID AND Result_ProcessToOfficeStatus = 'S' WHERE T_OrderHeaderID = {$prm['order_id']} AND DATE(T_OrderPromiseDateTime) = '{$prm['order_promise_date']}' AND T_OrderDetailIsActive = 'Y' GROUP BY Group_ResultID UNION -- ------------------------------------------------------- -- BAGIAN 2: Group LAB per-test (FlagPerTest='Y') -- ------------------------------------------------------- SELECT T_OrderHeaderID, T_OrderPromiseID, T_OrderPromiseDateTime, T_OrderHeaderLabNumber, UPPER(T_TestName) as group_name, IF(ISNULL(Result_ProcessToOfficeID),'N','Y') as status, 'default-format' as format_email FROM t_orderdetail JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID JOIN t_orderdelivery ON T_OrderDeliveryT_OrderHeaderID = T_OrderHeaderID AND T_OrderDeliveryM_DeliveryTypeID = 3 AND T_OrderDeliveryIsActive = 'Y' 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' LEFT JOIN so_resultentry ON So_ResultEntryT_OrderDetailID = T_OrderDetailID AND So_ResultEntryIsActive = '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 = T_OrderDeliveryID AND Result_ProcessToOfficeT_OrderPromiseID = T_OrderPromiseID AND Result_ProcessToOfficeGroup_ResultID = T_TestID AND Result_ProcessToOfficeStatus = 'S' WHERE T_OrderHeaderID = {$prm['order_id']} AND DATE(T_OrderPromiseDateTime) = '{$prm['order_promise_date']}' AND T_OrderDetailIsActive = 'Y' GROUP BY T_TestID UNION -- ------------------------------------------------------- -- BAGIAN 3 (FIX FINAL): Group NonLab (FlagNonLab='Y', FlagPerTest='N') -- Rontgen, Pemeriksaan Fisik, ECG, dll -- So_ResultEntryID > 0 = hasil eksternal (bukan LAB/FNA biasa) -- ------------------------------------------------------- SELECT oh.T_OrderHeaderID, op.T_OrderPromiseID, op.T_OrderPromiseDateTime, oh.T_OrderHeaderLabNumber, UPPER(nl.T_EmailNonLabGroup_ResultName) as group_name, IF(ISNULL(nl.T_EmailNonLabID),'N','Y') as status, IFNULL(nl.T_EmailNonLabUrl,'') as format_email FROM group_result gr INNER JOIN t_email_nonlab nl ON nl.T_EmailNonLabType = gr.Group_ResultName AND nl.T_EmailNonLabT_OrderHeaderID = {$prm['order_id']} AND nl.T_EmailNonLabSo_ResultEntryID > 0 JOIN t_orderheader oh ON oh.T_OrderHeaderID = {$prm['order_id']} JOIN t_orderpromise op ON op.T_OrderPromiseT_OrderHeaderID = oh.T_OrderHeaderID AND DATE(op.T_OrderPromiseDateTime) = '{$prm['order_promise_date']}' AND op.T_OrderPromiseIsActive = 'Y' JOIN t_orderdelivery od ON od.T_OrderDeliveryT_OrderHeaderID = oh.T_OrderHeaderID AND od.T_OrderDeliveryM_DeliveryTypeID = 3 AND od.T_OrderDeliveryIsActive = 'Y' WHERE gr.Group_ResultFlagPerTest = 'N' AND gr.Group_ResultFlagNonLab = 'Y' AND gr.Group_ResultIsActive = 'Y' GROUP BY gr.Group_ResultID UNION -- ------------------------------------------------------- -- BAGIAN 4 (FIX): Group NonLab FlagPerTest='Y' -- Contoh: ECG/Elektromedik, BMD, USG, dll -- ------------------------------------------------------- SELECT oh.T_OrderHeaderID, op.T_OrderPromiseID, op.T_OrderPromiseDateTime, oh.T_OrderHeaderLabNumber, UPPER(nl.T_EmailNonLabGroup_ResultName) as group_name, IF(ISNULL(nl.T_EmailNonLabID),'N','Y') as status, IFNULL(nl.T_EmailNonLabUrl,'') as format_email FROM group_result gr INNER JOIN t_email_nonlab nl ON nl.T_EmailNonLabType = gr.Group_ResultName AND nl.T_EmailNonLabT_OrderHeaderID = {$prm['order_id']} AND nl.T_EmailNonLabSo_ResultEntryID > 0 JOIN t_orderheader oh ON oh.T_OrderHeaderID = {$prm['order_id']} JOIN t_orderpromise op ON op.T_OrderPromiseT_OrderHeaderID = oh.T_OrderHeaderID AND DATE(op.T_OrderPromiseDateTime) = '{$prm['order_promise_date']}' AND op.T_OrderPromiseIsActive = 'Y' JOIN t_orderdelivery od ON od.T_OrderDeliveryT_OrderHeaderID = oh.T_OrderHeaderID AND od.T_OrderDeliveryM_DeliveryTypeID = 3 AND od.T_OrderDeliveryIsActive = 'Y' WHERE gr.Group_ResultFlagPerTest = 'Y' AND gr.Group_ResultFlagNonLab = 'Y' AND gr.Group_ResultIsActive = 'Y' GROUP BY gr.Group_ResultID "; $rows['info_test'] = $this->db_onedev->query($sql)->result_array(); // Tambahkan pengecekan status URL nonlab per pemeriksaan if (!empty($rows['info_test'])) { foreach ($rows['info_test'] as $k => $v) { $rows['info_test'][$k]['status_url_nonlab'] = $this->_check_email_nonlab_exists( $prm['order_id'], $v['group_name'] ); } } $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_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); } } }