db = $this->load->database("cpone", true); } public function index() { echo "SEND EMAIL API"; } public function RegisterEmailNotif_BAK_050526() { try { $data_send_patients = []; $data_patients = []; # get list data preregist patient # $sql_patients = "SELECT Mcu_PreregisterPatientsPatientName AS nama_pasien, Mcu_PreregisterPatientsEmail AS email_pasien, Mcu_PreregisterPatientsT_OrderHeaderID AS orderid, T_OrderHeaderLabNumber AS ordernumber, Mcu_PreregisterDateCheckinSchedule AS tanggal_mcu, Mgm_McuStartDate, Mgm_McuEndDate FROM mcu_preregister_patients JOIN mgm_mcu ON Mgm_McuID = Mcu_PreregisterPatientsMgm_McuID AND Mgm_McuNotifByEmail = 'Y' AND Mcu_PreregisterPatientsT_OrderHeaderID != 0 AND Mcu_PreregisterPatientsIsRegistered = 'Y' AND LENGTH(TRIM(Mcu_PreregisterPatientsEmail)) > 0 JOIN t_orderheader ON T_OrderHeaderID = Mcu_PreregisterPatientsT_OrderHeaderID LEFT JOIN mcu_preregister_date ON Mcu_PreregisterDateIsActive = 'Y' AND Mcu_PreregisterDateMcu_PreregisterPatientsID = Mcu_PreregisterPatientsID WHERE Mcu_PreregisterPatientsIsActive = 'Y' AND ( (Mcu_PreregisterDateCheckinSchedule IS NOT NULL AND Mcu_PreregisterDateCheckinSchedule != '0000-00-00' AND Mcu_PreregisterDateCheckinSchedule < CURDATE()) OR ((Mcu_PreregisterDateCheckinSchedule IS NULL OR Mcu_PreregisterDateCheckinSchedule = '0000-00-00') AND Mgm_McuStartDate <= CURDATE() AND CURDATE() < Mgm_McuEndDate ) )"; $que_patients = $this->db->query($sql_patients); if (!$que_patients) { throw new Exception('[Error] failed get data patients'); } $data_patients = $que_patients->result_array(); # check patient test is done / not # foreach ($data_patients as $key => $patient) { $sql_sample_lab = "SELECT COUNT(*) AS is_sampling FROM (SELECT T_SampleTypeName AS sampletype_name, T_OrderSampleSampling AS is_sampling, T_OrderSampleReceive AS is_received FROM t_ordersample JOIN t_sampletype ON T_OrderSampleT_SampleTypeID = T_SampleTypeID LEFT JOIN m_user ON T_OrderSampleReceiveUserID = M_UserID LEFT JOIN m_staff ON M_UserM_StaffID = M_StaffID WHERE T_OrderSampleT_OrderHeaderID = ? AND T_OrderSampleIsActive = 'Y' Order BY T_SampleTypeName ASC ) as subquery WHERE is_sampling = 'N'"; $que_sample_lab = $this->db->query($sql_sample_lab, [$patient['orderid']]); if (!$que_sample_lab) { throw new Exception('[Error] failed get data sample lab'); } $count_sample_lab = $que_sample_lab->row_array()['is_sampling']; $sql_sample_radiodiagnostic = "SELECT COUNT(*) AS is_sampling FROM (SELECT T_TestName as sampletype_name, IF(ISNULL(T_SamplingSoFlag),'N','Y') as is_sampling, IF(ISNULL(T_SamplingSoFlag) OR T_SamplingSoFlag <> 'D','N','Y') as is_received FROM t_orderdetail JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID JOIN t_test ON T_OrderDetailT_TestID = T_TestID JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID JOIN t_bahan ON T_SampleTypeT_BahanID = T_BahanID JOIN t_samplestation ON T_BahanT_SampleStationID = T_SampleStationID AND T_SampleStationIsNonLab = 'RADIODIAGNOSTIC' LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_SamplingSoT_TestID = T_TestID LEFT JOIN m_user ON T_SamplingSoDoneUserID = M_UserID LEFT JOIN m_staff ON M_UserM_StaffID = M_StaffID WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' ) as subquery WHERE is_sampling = 'N'"; $que_sample_radiodiagnostic = $this->db->query($sql_sample_radiodiagnostic, [ $patient['orderid'] ]); if (!$que_sample_lab) { throw new Exception('[Error] failed get data sample radiodiagnostik'); } $count_sample_radiodiagnostic = $que_sample_radiodiagnostic->row_array()['is_sampling']; $sql_sample_electromedic = "SELECT COUNT(*) AS is_sampling FROM (SELECT T_TestName as sampletype_name, IF(ISNULL(T_SamplingSoFlag),'N','Y') as is_sampling, IF(ISNULL(T_SamplingSoFlag) OR T_SamplingSoFlag <> 'D','N','Y') as is_received FROM t_orderdetail JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID JOIN t_test ON T_OrderDetailT_TestID = T_TestID JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID JOIN t_bahan ON T_SampleTypeT_BahanID = T_BahanID JOIN t_samplestation ON T_BahanT_SampleStationID = T_SampleStationID AND T_SampleStationIsNonLab = 'ELEKTROMEDIS' LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_SamplingSoT_TestID = T_TestID LEFT JOIN m_user ON T_SamplingSoDoneUserID = M_UserID LEFT JOIN m_staff ON M_UserM_StaffID = M_StaffID WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' ) as subquery WHERE is_sampling = 'N'"; $que_sample_electromedic = $this->db->query($sql_sample_electromedic, [ $patient['orderid'] ]); $count_sample_electromedic = $que_sample_electromedic->row_array()['is_sampling']; $sql_sample_other = "SELECT COUNT(*) AS is_sampling FROM (SELECT T_TestName as sampletype_name, IF(ISNULL(T_SamplingSoFlag),'N','Y') as is_sampling, IF(ISNULL(T_SamplingSoFlag) OR T_SamplingSoFlag <> 'D','N','Y') as is_received, IFNULL(M_StaffName,'') as staff_name FROM t_orderdetail JOIN t_orderheader ON T_OrderDetailT_OrderHeaderID = T_OrderHeaderID JOIN t_test ON T_OrderDetailT_TestID = T_TestID JOIN t_sampletype ON T_TestT_SampleTypeID = T_SampleTypeID JOIN t_bahan ON T_SampleTypeT_BahanID = T_BahanID JOIN t_samplestation ON T_BahanT_SampleStationID = T_SampleStationID AND T_SampleStationIsNonLab = 'OTHERS' LEFT JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND T_SamplingSoT_TestID = T_TestID LEFT JOIN m_user ON T_SamplingSoDoneUserID = M_UserID LEFT JOIN m_staff ON M_UserM_StaffID = M_StaffID WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' ) as subquery WHERE is_sampling = 'N'"; $que_sample_other = $this->db->query($sql_sample_other, [ $patient['orderid'] ]); if (!$que_sample_other) { throw new Exception('[Error] failed to get data sample other'); } $count_sample_other = $que_sample_other->row_array()['is_sampling']; $total_is_sampling_n = array_sum(array( $count_sample_lab, $count_sample_electromedic, $count_sample_radiodiagnostic, $count_sample_other )); if ($total_is_sampling_n > 0) { $data_send_patients[] = $patient; } } # collect email # $this->db->trans_begin(); foreach ($data_send_patients as $key => $patient) { // sementar pakai email config type R (result MCU) $sql_config_email = "SELECT * FROM m_emailconfig WHERE M_EmailConfigType = 'R'"; $que_config_email = $this->db->query($sql_config_email, []); if (!$que_config_email) { $this->db->trans_rollback(); throw new Exception('[Error] failed to get email ocnfig'); } $emailconfig = $que_config_email->row_array(); $tanggalMCURaw = (empty($patient['tanggal_mcu']) || $patient['tanggal_mcu'] === '0000-00-00') ? $patient['Mgm_McuStartDate'] : $patient['tanggal_mcu']; $tanggalMCUTs = strtotime($tanggalMCURaw); $hariIndonesia = [ 'Sunday' => 'Minggu', 'Monday' => 'Senin', 'Tuesday' => 'Selasa', 'Wednesday' => 'Rabu', 'Thursday' => 'Kamis', 'Friday' => 'Jumat', 'Saturday' => 'Sabtu' ]; $dayEn = date('l', $tanggalMCUTs); $dayId = isset($hariIndonesia[$dayEn]) ? $hariIndonesia[$dayEn] : $dayEn; $tanggalMCU = $dayId . ', ' . date('d-m-Y', $tanggalMCUTs); $body = 'Yth ' . $patient["nama_pasien"] . ',

Melalui email ini, kami ingin mengingatkan kembali jadwal pemeriksaan kesehatan (*Medical Check-Up*) Anda yang akan dilaksanakan pada:

Hari/Tanggal : ' . $tanggalMCU . '
Lokasi : Laboratorium Klinik WESTERINDO

Mohon kehadirannya tepat waktu dan pastikan Anda telah mengikuti instruksi persiapan (seperti puasa jika diperlukan) sebelum melakukan pemeriksaan.

MOHON TIDAK DI-REPLY.

Hormat kami,

Laboratorium Klinik WESTERINDO

'; $subject = "{$patient['ordernumber']} {$patient['nama_pasien']}"; $recipient = json_encode([ ["name" => $patient['nama_pasien'], "email" => $patient['email_pasien']] ]); $sendCC = json_encode([ ["name" => $emailconfig['M_EmailConfigCc'], "email" => $emailconfig['M_EmailConfigCc']] ]); $sql_cek_outbox = "SELECT PreregisterEmailOutboxID FROM preregister_email_outbox WHERE PreregisterEmailOutboxReffID = ? AND PreregisterEmailOutboxRecipientType = 'P' AND PreregisterEmailOutboxIsActive = 'Y' AND PreregisterEmailOutboxType = 'PREREGIST'"; $que_cek_outbox = $this->db->query($sql_cek_outbox, [$patient['orderid']]); if (!$que_cek_outbox) { $this->db->trans_rollback(); throw new Exception('[Error] failed check existing outbox data'); } $cek_outbox = $que_cek_outbox->result_array(); if (count($cek_outbox) == 0) { $sql_insert_outbox = "INSERT INTO preregister_email_outbox ( PreregisterEmailOutboxSubject, PreregisterEmailOutboxRecipient, PreregisterEmailOutboxRecipientType, PreregisterEmailOutboxCC, PreregisterEmailOutboxIsHtml, PreregisterEmailOutboxBody, PreregisterEmailOutboxType, PreregisterEmailOutboxReffID ) VALUES (?,?,'P',?,'Y',?,?,?)"; $que_insert_outbox = $this->db->query($sql_insert_outbox, [ $subject, $recipient, $sendCC, $body, 'PREREGIST', $patient['orderid'] ]); if (!$que_insert_outbox) { $this->db->trans_rollback(); throw new Exception('[Error] failed insert email outbox'); } } else { $sql_update_outbox = "UPDATE preregister_email_outbox SET PreregisterEmailOutboxSubject = ?, PreregisterEmailOutboxRecipient = ?, PreregisterEmailOutboxCC = ?, PreregisterEmailOutboxBody = ?, PreregisterEmailOutboxIsSent = 'R', PreregisterEmailOutboxRetry = 0, PreregisterEmailOutboxLastUpdated = NOW() WHERE PreregisterEmailOutboxID = ?"; $que_update_outbox = $this->db->query($sql_update_outbox, [ $subject, $recipient, $sendCC, $body, $cek_outbox[0]['PreregisterEmailOutboxID'] ]); if (!$que_update_outbox) { $this->db->trans_rollback(); throw new Exception('[Error] failed update outbox'); } } } $this->db->trans_commit(); $total_email_sent = count($data_send_patients); $this->sys_ok($total_email_sent); } catch (Exception $e) { $msg = $e->getMessage(); $this->sys_error_db($msg); exit; } } public function RegisterEmailNotif() { try { $data_send_patients = []; $sql_patients = "SELECT pp.Mcu_PreregisterPatientsID AS preregister_id, pp.Mcu_PreregisterPatientsPatientName AS nama_pasien, pp.Mcu_PreregisterPatientsEmail AS email_pasien, pp.Mcu_PreregisterPatientsT_OrderHeaderID AS orderid, oh.T_OrderHeaderLabNumber AS ordernumber, mpd.Mcu_ParticipantDailyDate AS tanggal_mcu FROM mgm_mcu mm JOIN cpone_dashboard.mcu_participant_daily mpd ON mpd.Mcu_ParticipantDailyMcuID = mm.Mgm_McuID AND mpd.Mcu_ParticipantDailyDate = DATE_ADD(CURDATE(), INTERVAL 1 DAY) AND mpd.Mcu_ParticipantDailyIsActive = 'Y' JOIN cpone_dashboard.mcu_participant_daily_details mpdd ON mpdd.Mcu_ParticipantDailyDetailsParticipantDailyID = mpd.Mcu_ParticipantDailyID AND mpdd.Mcu_ParticipantDailyDetailsIsActive = 'Y' JOIN cpone_dashboard.mcu_patient mp ON mp.Mcu_PatientID = mpdd.Mcu_ParticipantDailyDetailsMcu_PatientID AND mp.Mcu_PatientIsActive = 'Y' JOIN mcu_preregister_patients pp ON pp.Mcu_PreregisterPatientsID = mp.Mcu_PatientPreregisterID AND pp.Mcu_PreregisterPatientsIsActive = 'Y' AND pp.Mcu_PreregisterPatientsMgm_McuID = mm.Mgm_McuID LEFT JOIN t_orderheader oh ON oh.T_OrderHeaderID = pp.Mcu_PreregisterPatientsT_OrderHeaderID WHERE mm.Mgm_McuNotifByEmail = 'Y' AND LENGTH(TRIM(IFNULL(pp.Mcu_PreregisterPatientsEmail, ''))) > 0"; $que_patients = $this->db->query($sql_patients); if (!$que_patients) { throw new Exception('[Error] failed get data patients'); } $data_send_patients = $que_patients->result_array(); $sql_notif_config = "SELECT Email_ConfigNofificationTemplate, Email_ConfigNofificationSender FROM email_config_nofification WHERE Email_ConfigNofificationIsActive = 'Y' ORDER BY Email_ConfigNofificationID DESC LIMIT 1"; $que_notif_config = $this->db->query($sql_notif_config); if (!$que_notif_config || $que_notif_config->num_rows() == 0) { throw new Exception('[Error] failed get notif email template config'); } $notifConfig = $que_notif_config->row_array(); $templateBody = $notifConfig['Email_ConfigNofificationTemplate']; $this->db->trans_begin(); foreach ($data_send_patients as $patient) { $sql_config_email = "SELECT * FROM m_emailconfig WHERE M_EmailConfigType = 'R'"; $que_config_email = $this->db->query($sql_config_email, []); if (!$que_config_email) { $this->db->trans_rollback(); throw new Exception('[Error] failed to get email config'); } $emailconfig = $que_config_email->row_array(); $tanggalMCUTs = strtotime($patient['tanggal_mcu']); $hariIndonesia = [ 'Sunday' => 'Minggu', 'Monday' => 'Senin', 'Tuesday' => 'Selasa', 'Wednesday' => 'Rabu', 'Thursday' => 'Kamis', 'Friday' => 'Jumat', 'Saturday' => 'Sabtu' ]; $dayEn = date('l', $tanggalMCUTs); $dayId = isset($hariIndonesia[$dayEn]) ? $hariIndonesia[$dayEn] : $dayEn; $tanggalMCU = $dayId . ', ' . date('d-m-Y', $tanggalMCUTs); $body = str_replace( ['{PASIEN}', '{TANGGAL_MCU}'], [$patient['nama_pasien'], $tanggalMCU], $templateBody ); $subjectPrefix = empty($patient['ordernumber']) ? '' : ($patient['ordernumber'] . ' '); $subject = $subjectPrefix . $patient['nama_pasien']; $recipient = json_encode([ ["name" => $patient['nama_pasien'], "email" => $patient['email_pasien']] ]); $sendCC = json_encode([ ["name" => $emailconfig['M_EmailConfigCc'], "email" => $emailconfig['M_EmailConfigCc']] ]); $sql_cek_outbox = "SELECT PreregisterEmailOutboxID FROM preregister_email_outbox WHERE PreregisterEmailOutboxReffID = ? AND PreregisterEmailOutboxRecipientType = 'P' AND PreregisterEmailOutboxIsActive = 'Y' AND PreregisterEmailOutboxType = 'PREREGIST'"; $que_cek_outbox = $this->db->query($sql_cek_outbox, [$patient['preregister_id']]); if (!$que_cek_outbox) { $this->db->trans_rollback(); throw new Exception('[Error] failed check existing outbox data'); } $cek_outbox = $que_cek_outbox->result_array(); if (count($cek_outbox) == 0) { $sql_insert_outbox = "INSERT INTO preregister_email_outbox ( PreregisterEmailOutboxSubject, PreregisterEmailOutboxRecipient, PreregisterEmailOutboxRecipientType, PreregisterEmailOutboxCC, PreregisterEmailOutboxIsHtml, PreregisterEmailOutboxBody, PreregisterEmailOutboxType, PreregisterEmailOutboxReffID ) VALUES (?,?,'P',?,'Y',?,?,?)"; $que_insert_outbox = $this->db->query($sql_insert_outbox, [ $subject, $recipient, $sendCC, $body, 'PREREGIST', $patient['preregister_id'] ]); if (!$que_insert_outbox) { $this->db->trans_rollback(); throw new Exception('[Error] failed insert email outbox'); } } else { $sql_update_outbox = "UPDATE preregister_email_outbox SET PreregisterEmailOutboxSubject = ?, PreregisterEmailOutboxRecipient = ?, PreregisterEmailOutboxCC = ?, PreregisterEmailOutboxBody = ?, PreregisterEmailOutboxIsSent = 'R', PreregisterEmailOutboxRetry = 0, PreregisterEmailOutboxLastUpdated = NOW() WHERE PreregisterEmailOutboxID = ?"; $que_update_outbox = $this->db->query($sql_update_outbox, [ $subject, $recipient, $sendCC, $body, $cek_outbox[0]['PreregisterEmailOutboxID'] ]); if (!$que_update_outbox) { $this->db->trans_rollback(); throw new Exception('[Error] failed update outbox'); } } } $this->db->trans_commit(); $total_email_sent = count($data_send_patients); $this->sys_ok($total_email_sent); } catch (Exception $e) { $msg = $e->getMessage(); $this->sys_error_db($msg); exit; } } public function RegisterEmailNotifManual() { try { $prm = is_array($this->sys_input) ? $this->sys_input : []; $mcuID = isset($prm['mcu_id']) ? intval($prm['mcu_id']) : intval($this->input->get('mcu_id')); $scheduleDate = isset($prm['date']) ? trim($prm['date']) : trim((string)$this->input->get('date')); $preregisterID = isset($prm['preregister_id']) ? intval($prm['preregister_id']) : intval($this->input->get('preregister_id')); $emailOverride = isset($prm['email']) ? trim((string)$prm['email']) : trim((string)$this->input->get('email')); if ($preregisterID <= 0) { if ($mcuID <= 0) { $this->sys_error("mcu_id wajib diisi jika preregister_id kosong"); exit; } if ($scheduleDate === '' || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $scheduleDate)) { $this->sys_error("date wajib format YYYY-MM-DD jika preregister_id kosong"); exit; } } if ($preregisterID > 0) { $sql_patients = "SELECT pp.Mcu_PreregisterPatientsID AS preregister_id, pp.Mcu_PreregisterPatientsPatientName AS nama_pasien, pp.Mcu_PreregisterPatientsEmail AS email_pasien, pp.Mcu_PreregisterPatientsT_OrderHeaderID AS orderid, oh.T_OrderHeaderLabNumber AS ordernumber, COALESCE(?, pd.Mcu_PreregisterDateCheckinSchedule, mm.Mgm_McuStartDate) AS tanggal_mcu FROM mcu_preregister_patients pp JOIN mgm_mcu mm ON mm.Mgm_McuID = pp.Mcu_PreregisterPatientsMgm_McuID LEFT JOIN ( SELECT Mcu_PreregisterDateMcu_PreregisterPatientsID, MIN(Mcu_PreregisterDateCheckinSchedule) AS Mcu_PreregisterDateCheckinSchedule FROM mcu_preregister_date WHERE Mcu_PreregisterDateIsActive = 'Y' GROUP BY Mcu_PreregisterDateMcu_PreregisterPatientsID ) pd ON pd.Mcu_PreregisterDateMcu_PreregisterPatientsID = pp.Mcu_PreregisterPatientsID LEFT JOIN t_orderheader oh ON oh.T_OrderHeaderID = pp.Mcu_PreregisterPatientsT_OrderHeaderID WHERE pp.Mcu_PreregisterPatientsID = ? AND pp.Mcu_PreregisterPatientsIsActive = 'Y' AND LENGTH(TRIM(IFNULL(pp.Mcu_PreregisterPatientsEmail, ''))) > 0"; $que_patients = $this->db->query($sql_patients, [ ($scheduleDate !== '' ? $scheduleDate : NULL), $preregisterID ]); } else { $sql_patients = "SELECT pp.Mcu_PreregisterPatientsID AS preregister_id, pp.Mcu_PreregisterPatientsPatientName AS nama_pasien, pp.Mcu_PreregisterPatientsEmail AS email_pasien, pp.Mcu_PreregisterPatientsT_OrderHeaderID AS orderid, oh.T_OrderHeaderLabNumber AS ordernumber, mpd.Mcu_ParticipantDailyDate AS tanggal_mcu FROM cpone_dashboard.mcu_participant_daily mpd JOIN cpone_dashboard.mcu_participant_daily_details mpdd ON mpdd.Mcu_ParticipantDailyDetailsParticipantDailyID = mpd.Mcu_ParticipantDailyID AND mpdd.Mcu_ParticipantDailyDetailsIsActive = 'Y' JOIN cpone_dashboard.mcu_patient mp ON mp.Mcu_PatientID = mpdd.Mcu_ParticipantDailyDetailsMcu_PatientID AND mp.Mcu_PatientIsActive = 'Y' JOIN mcu_preregister_patients pp ON pp.Mcu_PreregisterPatientsID = mp.Mcu_PatientPreregisterID AND pp.Mcu_PreregisterPatientsIsActive = 'Y' LEFT JOIN t_orderheader oh ON oh.T_OrderHeaderID = pp.Mcu_PreregisterPatientsT_OrderHeaderID WHERE mpd.Mcu_ParticipantDailyMcuID = ? AND mpd.Mcu_ParticipantDailyDate = ? AND mpd.Mcu_ParticipantDailyIsActive = 'Y' AND LENGTH(TRIM(IFNULL(pp.Mcu_PreregisterPatientsEmail, ''))) > 0"; $que_patients = $this->db->query($sql_patients, [$mcuID, $scheduleDate]); } if (!$que_patients) { throw new Exception('[Error] failed get data patients'); } $data_send_patients = $que_patients->result_array(); $sql_notif_config = "SELECT Email_ConfigNofificationTemplate FROM email_config_nofification WHERE Email_ConfigNofificationIsActive = 'Y' ORDER BY Email_ConfigNofificationID DESC LIMIT 1"; $que_notif_config = $this->db->query($sql_notif_config); if (!$que_notif_config || $que_notif_config->num_rows() == 0) { throw new Exception('[Error] failed get notif email template config'); } $notifConfig = $que_notif_config->row_array(); $templateBody = $notifConfig['Email_ConfigNofificationTemplate']; $this->db->trans_begin(); foreach ($data_send_patients as $patient) { $tanggalMCUTs = strtotime($patient['tanggal_mcu']); $hariIndonesia = [ 'Sunday' => 'Minggu', 'Monday' => 'Senin', 'Tuesday' => 'Selasa', 'Wednesday' => 'Rabu', 'Thursday' => 'Kamis', 'Friday' => 'Jumat', 'Saturday' => 'Sabtu' ]; $dayEn = date('l', $tanggalMCUTs); $dayId = isset($hariIndonesia[$dayEn]) ? $hariIndonesia[$dayEn] : $dayEn; $tanggalMCU = $dayId . ', ' . date('d-m-Y', $tanggalMCUTs); $body = str_replace( ['{PASIEN}', '{TANGGAL_MCU}'], [$patient['nama_pasien'], $tanggalMCU], $templateBody ); $subjectPrefix = empty($patient['ordernumber']) ? '' : ($patient['ordernumber'] . ' '); $subject = $subjectPrefix . $patient['nama_pasien']; $targetEmail = $emailOverride !== '' ? $emailOverride : $patient['email_pasien']; $recipient = json_encode([ ["name" => $patient['nama_pasien'], "email" => $targetEmail] ]); $senderEmail = isset($notifConfig['Email_ConfigNofificationSender']) ? trim((string)$notifConfig['Email_ConfigNofificationSender']) : ''; $sendCC = $senderEmail !== '' ? json_encode([["name" => $senderEmail, "email" => $senderEmail]]) : NULL; $sql_cek_outbox = "SELECT PreregisterEmailOutboxID FROM preregister_email_outbox WHERE PreregisterEmailOutboxReffID = ? AND PreregisterEmailOutboxRecipientType = 'P' AND PreregisterEmailOutboxIsActive = 'Y' AND PreregisterEmailOutboxType = 'PREREGIST'"; $que_cek_outbox = $this->db->query($sql_cek_outbox, [$patient['preregister_id']]); if (!$que_cek_outbox) { $this->db->trans_rollback(); throw new Exception('[Error] failed check existing outbox data'); } $cek_outbox = $que_cek_outbox->result_array(); if (count($cek_outbox) == 0) { $sql_insert_outbox = "INSERT INTO preregister_email_outbox ( PreregisterEmailOutboxSubject, PreregisterEmailOutboxRecipient, PreregisterEmailOutboxRecipientType, PreregisterEmailOutboxCC, PreregisterEmailOutboxIsHtml, PreregisterEmailOutboxBody, PreregisterEmailOutboxType, PreregisterEmailOutboxReffID ) VALUES (?,?,'P',?,'Y',?,?,?)"; $que_insert_outbox = $this->db->query($sql_insert_outbox, [ $subject, $recipient, $sendCC, $body, 'PREREGIST', $patient['preregister_id'] ]); if (!$que_insert_outbox) { $this->db->trans_rollback(); throw new Exception('[Error] failed insert email outbox'); } } else { $sql_update_outbox = "UPDATE preregister_email_outbox SET PreregisterEmailOutboxSubject = ?, PreregisterEmailOutboxRecipient = ?, PreregisterEmailOutboxCC = ?, PreregisterEmailOutboxBody = ?, PreregisterEmailOutboxIsSent = 'R', PreregisterEmailOutboxRetry = 0, PreregisterEmailOutboxLastUpdated = NOW() WHERE PreregisterEmailOutboxID = ?"; $que_update_outbox = $this->db->query($sql_update_outbox, [ $subject, $recipient, $sendCC, $body, $cek_outbox[0]['PreregisterEmailOutboxID'] ]); if (!$que_update_outbox) { $this->db->trans_rollback(); throw new Exception('[Error] failed update outbox'); } } } $this->db->trans_commit(); $result = [ "preregister_id" => $preregisterID > 0 ? $preregisterID : NULL, "mcu_id" => $mcuID, "date" => $scheduleDate, "email_override" => $emailOverride !== '' ? $emailOverride : NULL, "total_email_queued" => count($data_send_patients) ]; $this->sys_ok($result); } catch (Exception $e) { $msg = $e->getMessage(); $this->sys_error_db($msg); exit; } } }