From 03496b59ff83fb2eac68e0e467a521719fce426b Mon Sep 17 00:00:00 2001 From: "sas.fajri" Date: Mon, 11 May 2026 15:11:50 +0700 Subject: [PATCH] Update sp_refresh_mcu_participant_daily_by_mcu_date to cleanup old dates without checkin Co-Authored-By: Claude Sonnet 4.6 --- ...reate_sp_refresh_mcu_participant_daily.sql | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/scripts/sql/2026-05-05_create_sp_refresh_mcu_participant_daily.sql b/scripts/sql/2026-05-05_create_sp_refresh_mcu_participant_daily.sql index 4cb46e9..8b01b18 100644 --- a/scripts/sql/2026-05-05_create_sp_refresh_mcu_participant_daily.sql +++ b/scripts/sql/2026-05-05_create_sp_refresh_mcu_participant_daily.sql @@ -93,6 +93,106 @@ BEGIN COMMIT; + -- Cleanup tanggal lain untuk pasien yang baru masuk ke p_schedule_date, + -- jika di tanggal lain itu belum checkin + cleanup_block: BEGIN + DECLARE v_old_date DATE; + DECLARE v_old_total INT DEFAULT 0; + DECLARE done INT DEFAULT 0; + DECLARE cur_old_dates CURSOR FOR + SELECT DISTINCT s.Mcu_PatientScheduleDate + FROM cpone_dashboard.mcu_patient_schedule s + JOIN cpone.mcu_preregister_patients pp + ON pp.Mcu_PreregisterPatientsID = s.Mcu_PatientSchedulePreregisterID + WHERE pp.Mcu_PreregisterPatientsMgm_McuID = p_mgm_mcuid + AND s.Mcu_PatientScheduleDate != p_schedule_date + AND s.Mcu_PatientSchedulePreregisterID IN ( + SELECT Mcu_PatientSchedulePreregisterID + FROM cpone_dashboard.mcu_patient_schedule + WHERE Mcu_PatientScheduleDate = p_schedule_date + AND Mcu_PatientScheduleIsActive = 'Y' + ); + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; + + OPEN cur_old_dates; + old_date_loop: LOOP + SET done = 0; + FETCH cur_old_dates INTO v_old_date; + IF done = 1 THEN LEAVE old_date_loop; END IF; + + START TRANSACTION; + + -- Hapus detail pasien yang pindah ke p_schedule_date dan belum checkin di v_old_date + DELETE d + FROM cpone_dashboard.mcu_participant_daily_details d + JOIN cpone_dashboard.mcu_participant_daily h + ON h.Mcu_ParticipantDailyID = d.Mcu_ParticipantDailyDetailsParticipantDailyID + JOIN cpone_dashboard.mcu_patient mp + ON mp.Mcu_PatientID = d.Mcu_ParticipantDailyDetailsMcu_PatientID + WHERE h.Mcu_ParticipantDailyMcuID = p_mgm_mcuid + AND h.Mcu_ParticipantDailyDate = v_old_date + AND mp.Mcu_PatientPreregisterID IN ( + SELECT preregister_id FROM ( + SELECT Mcu_PatientSchedulePreregisterID AS preregister_id + FROM cpone_dashboard.mcu_patient_schedule + WHERE Mcu_PatientScheduleDate = p_schedule_date + AND Mcu_PatientScheduleIsActive = 'Y' + ) AS tmp + ) + AND NOT EXISTS ( + SELECT 1 FROM cpone_dashboard.mcu_checkinout c + WHERE c.Mcu_CheckinoutPreregisterID = mp.Mcu_PatientPreregisterID + AND c.Mcu_CheckinoutDate = v_old_date + AND c.Mcu_CheckinoutIsActive = 'Y' + ); + + -- Hapus dari mcu_patient_schedule untuk tanggal lama, pasien yang belum checkin + DELETE s + FROM cpone_dashboard.mcu_patient_schedule s + WHERE s.Mcu_PatientScheduleDate = v_old_date + AND s.Mcu_PatientSchedulePreregisterID IN ( + SELECT preregister_id FROM ( + SELECT Mcu_PatientSchedulePreregisterID AS preregister_id + FROM cpone_dashboard.mcu_patient_schedule + WHERE Mcu_PatientScheduleDate = p_schedule_date + AND Mcu_PatientScheduleIsActive = 'Y' + ) AS tmp + ) + AND NOT EXISTS ( + SELECT 1 FROM cpone_dashboard.mcu_checkinout c + WHERE c.Mcu_CheckinoutPreregisterID = s.Mcu_PatientSchedulePreregisterID + AND c.Mcu_CheckinoutDate = v_old_date + AND c.Mcu_CheckinoutIsActive = 'Y' + ); + + -- Hitung sisa total untuk tanggal lama dan update/delete mcu_participant_daily + SELECT COUNT(DISTINCT s.Mcu_PatientSchedulePreregisterID) + INTO v_old_total + FROM cpone_dashboard.mcu_patient_schedule s + JOIN cpone.mcu_preregister_patients pp + ON pp.Mcu_PreregisterPatientsID = s.Mcu_PatientSchedulePreregisterID + WHERE s.Mcu_PatientScheduleDate = v_old_date + AND s.Mcu_PatientScheduleIsActive = 'Y' + AND pp.Mcu_PreregisterPatientsMgm_McuID = p_mgm_mcuid + AND pp.Mcu_PreregisterPatientsIsActive = 'Y'; + + IF v_old_total > 0 THEN + UPDATE cpone_dashboard.mcu_participant_daily + SET Mcu_ParticipantDailyTotal = v_old_total + WHERE Mcu_ParticipantDailyMcuID = p_mgm_mcuid + AND Mcu_ParticipantDailyDate = v_old_date; + ELSE + DELETE FROM cpone_dashboard.mcu_participant_daily + WHERE Mcu_ParticipantDailyMcuID = p_mgm_mcuid + AND Mcu_ParticipantDailyDate = v_old_date; + END IF; + + COMMIT; + + END LOOP old_date_loop; + CLOSE cur_old_dates; + END cleanup_block; + SELECT v_participant_daily_id AS participant_daily_id, (