Add manual preregister email resend endpoint

This commit is contained in:
sas.fajri
2026-05-06 14:16:08 +07:00
parent 89ea847a80
commit 5aed7c05b4

View File

@@ -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;
}
}
}