651 lines
33 KiB
PHP
651 lines
33 KiB
PHP
<?php
|
|
class SendEmailPreregister extends MY_Controller
|
|
{
|
|
var $db;
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
// $this->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"] . ',
|
|
<p>
|
|
<p>Melalui email ini, kami ingin mengingatkan kembali jadwal pemeriksaan kesehatan (*Medical Check-Up*) Anda yang akan dilaksanakan pada:</p>
|
|
<p>
|
|
<strong>Hari/Tanggal : ' . $tanggalMCU . '</strong><br>
|
|
<strong>Lokasi : Laboratorium Klinik <span style="font-weight:bold;color:blue">WESTERINDO</span></strong>
|
|
</p>
|
|
<p>
|
|
</p>
|
|
<p>Mohon kehadirannya tepat waktu dan pastikan Anda telah mengikuti instruksi persiapan (seperti puasa jika diperlukan) sebelum melakukan pemeriksaan.</p>
|
|
<p>
|
|
</p>
|
|
<p>MOHON TIDAK DI-REPLY.</p>
|
|
Hormat kami,
|
|
<p>Laboratorium Klinik <span style="font-weight:bold;color:blue">WESTERINDO</span></p>';
|
|
|
|
$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
|
|
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]
|
|
]);
|
|
|
|
$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;
|
|
}
|
|
}
|
|
}
|