diff --git a/application/controllers/cpone/SendEmailPreregister.php b/application/controllers/cpone/SendEmailPreregister.php index e7cfaf5..b5fa335 100644 --- a/application/controllers/cpone/SendEmailPreregister.php +++ b/application/controllers/cpone/SendEmailPreregister.php @@ -445,4 +445,206 @@ class SendEmailPreregister extends MY_Controller 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] + ]); + + $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, + NULL, + $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, + NULL, + $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; + } + } }