diff --git a/cpone-dashboard/db/migrations/018_fix_patient_active_sync.sql b/cpone-dashboard/db/migrations/018_fix_patient_active_sync.sql new file mode 100644 index 0000000..03c47f3 --- /dev/null +++ b/cpone-dashboard/db/migrations/018_fix_patient_active_sync.sql @@ -0,0 +1,267 @@ +-- Migration 018: Cpone-BUG-00024 +-- Fix sp_generate_dashboard_data: +-- 1. mcu_project sync (Mcu_ProjectTotalParticipant, dst) sempat hilang sejak migration 014, dikembalikan. +-- 2. mcu_patient tidak pernah di-nonaktifkan saat baris sumber (cpone.mcu_preregister_patients) +-- berubah jadi IsActive='N' (mis. duplikat/registrasi ulang) — filter WHERE ...IsActive='Y' +-- menyebabkan baris tsb tidak ikut ter-SELECT sehingga ON DUPLICATE KEY UPDATE tidak +-- pernah menyentuhnya lagi. Filter itu dihapus dan Mcu_PatientIsActive ditambahkan ke +-- ON DUPLICATE KEY UPDATE supaya status aktif selalu mengikuti kondisi sumber terkini. + +DROP PROCEDURE IF EXISTS sp_generate_dashboard_data; + +DELIMITER $$ + +CREATE PROCEDURE sp_generate_dashboard_data(IN p_mcu_id INT) +BEGIN + + -- ---------------------------------------------------------- + -- 1. mcu_project + -- ---------------------------------------------------------- + INSERT INTO mcu_project ( + Mcu_ProjectMcuID, Mcu_ProjectCorporateID, Mcu_ProjectCorporateName, + Mcu_ProjectNumber, Mcu_ProjectLabel, Mcu_ProjectBranchID, + Mcu_ProjectStartDate, Mcu_ProjectEndDate, Mcu_ProjectIsActive, + Mcu_ProjectTotalParticipant, Mcu_ProjectSyncedAt + ) + SELECT + m.Mgm_McuID, m.Mgm_McuCorporateID, c.CorporateName, + m.Mgm_McuNumber, m.Mgm_McuLabel, m.Mgm_McuM_BranchID, + m.Mgm_McuStartDate, m.Mgm_McuEndDate, m.Mgm_McuIsActive, + m.Mgm_McuTotalParticipant, NOW() + FROM cpone.mgm_mcu m + LEFT JOIN cpone.corporate c ON c.CorporateID = m.Mgm_McuCorporateID + WHERE m.Mgm_McuID = p_mcu_id + ON DUPLICATE KEY UPDATE + Mcu_ProjectCorporateName = VALUES(Mcu_ProjectCorporateName), + Mcu_ProjectLabel = VALUES(Mcu_ProjectLabel), + Mcu_ProjectIsActive = VALUES(Mcu_ProjectIsActive), + Mcu_ProjectTotalParticipant = VALUES(Mcu_ProjectTotalParticipant), + Mcu_ProjectSyncedAt = NOW(); + + + -- ---------------------------------------------------------- + -- 2. mcu_patient (with age + pemeriksaan) + -- Tidak lagi memfilter IsActive='Y' di WHERE, supaya baris yang berubah + -- jadi inactive di sumber tetap ke-SELECT dan status-nya ikut ter-update. + -- ---------------------------------------------------------- + INSERT INTO mcu_patient ( + Mcu_PatientPreregisterID, Mcu_PatientMcuID, Mcu_PatientName, + Mcu_PatientNIP, Mcu_PatientGender, Mcu_PatientDOB, Mcu_PatientAge, + Mcu_PatientDepartment, Mcu_PatientDivision, Mcu_PatientPosisi, + Mcu_PatientPemeriksaan, + Mcu_PatientIsRegistered, Mcu_PatientOrderID, Mcu_PatientIsActive, + Mcu_PatientSyncedAt + ) + SELECT + p.Mcu_PreregisterPatientsID, p.Mcu_PreregisterPatientsMgm_McuID, + p.Mcu_PreregisterPatientsPatientName, p.Mcu_PreregisterPatientsNIP, + p.Mcu_PreregisterPatientsGender, p.Mcu_PreregisterPatientsDOB, + CAST(o.T_OrderHeaderM_PatientAge AS UNSIGNED), + p.Mcu_PreregisterPatientsDepartment, p.Mcu_PreregisterPatientsDivisi, + p.Mcu_PreregisterPatientsPosisi, + p.Mcu_PreregisterPatientsPemeriksaan, + p.Mcu_PreregisterPatientsIsRegistered, p.Mcu_PreregisterPatientsT_OrderHeaderID, + p.Mcu_PreregisterPatientsIsActive, NOW() + FROM cpone.mcu_preregister_patients p + LEFT JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID + WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + ON DUPLICATE KEY UPDATE + Mcu_PatientName = VALUES(Mcu_PatientName), + Mcu_PatientAge = VALUES(Mcu_PatientAge), + Mcu_PatientPemeriksaan = VALUES(Mcu_PatientPemeriksaan), + Mcu_PatientIsRegistered = VALUES(Mcu_PatientIsRegistered), + Mcu_PatientOrderID = VALUES(Mcu_PatientOrderID), + Mcu_PatientIsActive = VALUES(Mcu_PatientIsActive), + Mcu_PatientSyncedAt = NOW(); + + + -- ---------------------------------------------------------- + -- 3. mcu_patient_schedule + -- ---------------------------------------------------------- + INSERT INTO mcu_patient_schedule ( + Mcu_PatientSchedulePreregisterID, Mcu_PatientScheduleDate, + Mcu_PatientScheduleIsActive, Mcu_PatientScheduleSyncedAt + ) + SELECT + p.Mcu_PreregisterPatientsID, DATE(o.T_OrderHeaderDate), 'Y', NOW() + FROM cpone.mcu_preregister_patients p + JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID + WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + AND p.Mcu_PreregisterPatientsT_OrderHeaderID > 0 + AND p.Mcu_PreregisterPatientsIsActive = 'Y' + ON DUPLICATE KEY UPDATE + Mcu_PatientScheduleSyncedAt = NOW(); + + + -- ---------------------------------------------------------- + -- 4. mcu_checkinout + -- ---------------------------------------------------------- + INSERT INTO mcu_checkinout ( + Mcu_CheckinoutCheckinoutID, Mcu_CheckinoutPreregisterID, Mcu_CheckinoutOrderID, + Mcu_CheckinoutDate, Mcu_CheckinoutInTime, Mcu_CheckinoutOutTime, + Mcu_CheckinoutNextDate, Mcu_CheckinoutIsActive, Mcu_CheckinoutSyncedAt, Mcu_CheckinoutMcuID + ) + SELECT + src.order_id, + src.preregister_id, + src.order_id, + src.segment_date, + TIME(src.checkin_dt), + TIME(src.checkout_dt), + CASE + WHEN DATE(src.checkout_dt) = src.segment_date THEN NULL + ELSE DATE(src.checkout_dt) + END, + 'Y', NOW(), p_mcu_id + FROM ( + SELECT + o.T_OrderHeaderID AS order_id, + p.Mcu_PreregisterPatientsID AS preregister_id, + o.T_OrderHeaderDate AS header_dt, + ev.segment_date, + CASE + WHEN ev.segment_date = DATE(o.T_OrderHeaderDate) THEN o.T_OrderHeaderDate + ELSE MIN(ev.event_dt) + END AS checkin_dt, + MAX(ev.event_dt) AS checkout_dt + FROM cpone.mcu_preregister_patients p + JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID + JOIN ( + SELECT p2.Mcu_PreregisterPatientsID AS preregister_id, o2.T_OrderHeaderID AS order_id, + o2.T_OrderHeaderDate AS checkin_dt, DATE(o2.T_OrderHeaderDate) AS segment_date, + o2.T_OrderHeaderDate AS event_dt + FROM cpone.mcu_preregister_patients p2 + JOIN cpone.t_orderheader o2 ON o2.T_OrderHeaderID = p2.Mcu_PreregisterPatientsT_OrderHeaderID + WHERE p2.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + AND p2.Mcu_PreregisterPatientsT_OrderHeaderID > 0 + AND p2.Mcu_PreregisterPatientsIsActive = 'Y' + UNION ALL + SELECT p2.Mcu_PreregisterPatientsID, o2.T_OrderHeaderID, o2.T_OrderHeaderDate, + DATE(TIMESTAMP(s2.T_OrderSampleReceiveDate, s2.T_OrderSampleReceiveTime)), + TIMESTAMP(s2.T_OrderSampleReceiveDate, s2.T_OrderSampleReceiveTime) + FROM cpone.mcu_preregister_patients p2 + JOIN cpone.t_orderheader o2 ON o2.T_OrderHeaderID = p2.Mcu_PreregisterPatientsT_OrderHeaderID + JOIN cpone.t_ordersample s2 ON s2.T_OrderSampleT_OrderHeaderID = o2.T_OrderHeaderID + AND s2.T_OrderSampleIsActive = 'Y' + WHERE p2.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + AND p2.Mcu_PreregisterPatientsT_OrderHeaderID > 0 + AND p2.Mcu_PreregisterPatientsIsActive = 'Y' + AND s2.T_OrderSampleReceiveDate IS NOT NULL + AND s2.T_OrderSampleReceiveTime IS NOT NULL + UNION ALL + SELECT p2.Mcu_PreregisterPatientsID, o2.T_OrderHeaderID, o2.T_OrderHeaderDate, + DATE(TIMESTAMP(ts2.T_SamplingSoDoneDate, ts2.T_SamplingSoDoneTime)), + TIMESTAMP(ts2.T_SamplingSoDoneDate, ts2.T_SamplingSoDoneTime) + FROM cpone.mcu_preregister_patients p2 + JOIN cpone.t_orderheader o2 ON o2.T_OrderHeaderID = p2.Mcu_PreregisterPatientsT_OrderHeaderID + JOIN cpone.t_samplingso ts2 ON ts2.T_SamplingSoT_OrderHeaderID = o2.T_OrderHeaderID + AND ts2.T_SamplingSoIsActive = 'Y' + WHERE p2.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + AND p2.Mcu_PreregisterPatientsT_OrderHeaderID > 0 + AND p2.Mcu_PreregisterPatientsIsActive = 'Y' + AND ts2.T_SamplingSoDoneDate IS NOT NULL + AND ts2.T_SamplingSoDoneTime IS NOT NULL + ) ev + ON ev.preregister_id = p.Mcu_PreregisterPatientsID + AND ev.order_id = o.T_OrderHeaderID + WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + AND p.Mcu_PreregisterPatientsT_OrderHeaderID > 0 + AND p.Mcu_PreregisterPatientsIsActive = 'Y' + GROUP BY o.T_OrderHeaderID, p.Mcu_PreregisterPatientsID, o.T_OrderHeaderDate, ev.segment_date + ) AS src + ON DUPLICATE KEY UPDATE + Mcu_CheckinoutOutTime = VALUES(Mcu_CheckinoutOutTime), + Mcu_CheckinoutNextDate = VALUES(Mcu_CheckinoutNextDate), + Mcu_CheckinoutSyncedAt = NOW(); + + + -- ---------------------------------------------------------- + -- 5. mcu_station_progress — lab + -- ---------------------------------------------------------- + INSERT INTO mcu_station_progress ( + Mcu_StationProgressOrderID, Mcu_StationProgressPreregisterID, Mcu_StationProgressMcuID, + Mcu_StationProgressStationID, Mcu_StationProgressStationName, Mcu_StationProgressSource, + Mcu_StationProgressCheckinDate, + Mcu_StationProgressSamplingAt, Mcu_StationProgressReceiveAt, Mcu_StationProgressProcessAt, + Mcu_StationProgressDoneAt, Mcu_StationProgressSyncedAt + ) + SELECT + o.T_OrderHeaderID, p.Mcu_PreregisterPatientsID, p_mcu_id, + s.T_OrderSampleT_SampleStationID, ss.T_SampleStationName, 'lab', + DATE(o.T_OrderHeaderDate), + NULLIF(MAX(TIMESTAMP(s.T_OrderSampleSamplingDate, s.T_OrderSampleSamplingTime)), '0000-00-00 00:00:00'), + NULLIF(MAX(TIMESTAMP(s.T_OrderSampleReceiveDate, s.T_OrderSampleReceiveTime)), '0000-00-00 00:00:00'), + NULLIF(MAX(TIMESTAMP(s.T_OrderSampleProcessingDate, s.T_OrderSampleProcessingTime)), '0000-00-00 00:00:00'), + NULL, NOW() + FROM cpone.mcu_preregister_patients p + JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID + JOIN cpone.t_ordersample s ON s.T_OrderSampleT_OrderHeaderID = o.T_OrderHeaderID AND s.T_OrderSampleIsActive = 'Y' + JOIN cpone.t_samplestation ss ON ss.T_SampleStationID = s.T_OrderSampleT_SampleStationID + WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + AND p.Mcu_PreregisterPatientsT_OrderHeaderID > 0 + AND p.Mcu_PreregisterPatientsIsActive = 'Y' + GROUP BY o.T_OrderHeaderID, p.Mcu_PreregisterPatientsID, s.T_OrderSampleT_SampleStationID, ss.T_SampleStationName, o.T_OrderHeaderDate + ON DUPLICATE KEY UPDATE + Mcu_StationProgressSamplingAt = VALUES(Mcu_StationProgressSamplingAt), + Mcu_StationProgressReceiveAt = VALUES(Mcu_StationProgressReceiveAt), + Mcu_StationProgressProcessAt = VALUES(Mcu_StationProgressProcessAt), + Mcu_StationProgressSyncedAt = NOW(); + + + -- ---------------------------------------------------------- + -- 6. mcu_station_progress — nonlab + -- ---------------------------------------------------------- + INSERT INTO mcu_station_progress ( + Mcu_StationProgressOrderID, Mcu_StationProgressPreregisterID, Mcu_StationProgressMcuID, + Mcu_StationProgressStationID, Mcu_StationProgressStationName, Mcu_StationProgressSource, + Mcu_StationProgressCheckinDate, + Mcu_StationProgressSamplingAt, Mcu_StationProgressReceiveAt, Mcu_StationProgressProcessAt, + Mcu_StationProgressDoneAt, Mcu_StationProgressSyncedAt + ) + SELECT + o.T_OrderHeaderID, p.Mcu_PreregisterPatientsID, p_mcu_id, + ts.T_SamplingSoT_SampleStationID, ss.T_SampleStationName, 'nonlab', + DATE(o.T_OrderHeaderDate), + NULL, NULL, + NULLIF(MAX(TIMESTAMP(ts.T_SamplingSoProcessDate, ts.T_SamplingSoProcessTime)), '0000-00-00 00:00:00'), + NULLIF(MAX(TIMESTAMP(ts.T_SamplingSoDoneDate, ts.T_SamplingSoDoneTime)), '0000-00-00 00:00:00'), + NOW() + FROM cpone.mcu_preregister_patients p + JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID + JOIN cpone.t_samplingso ts ON ts.T_SamplingSoT_OrderHeaderID = o.T_OrderHeaderID AND ts.T_SamplingSoIsActive = 'Y' + JOIN cpone.t_samplestation ss ON ss.T_SampleStationID = ts.T_SamplingSoT_SampleStationID + WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + AND p.Mcu_PreregisterPatientsT_OrderHeaderID > 0 + AND p.Mcu_PreregisterPatientsIsActive = 'Y' + GROUP BY o.T_OrderHeaderID, p.Mcu_PreregisterPatientsID, ts.T_SamplingSoT_SampleStationID, ss.T_SampleStationName, o.T_OrderHeaderDate + ON DUPLICATE KEY UPDATE + Mcu_StationProgressProcessAt = VALUES(Mcu_StationProgressProcessAt), + Mcu_StationProgressDoneAt = VALUES(Mcu_StationProgressDoneAt), + Mcu_StationProgressSyncedAt = NOW(); + + + -- ---------------------------------------------------------- + -- 7. mcu_patient_resume_status + -- ---------------------------------------------------------- + INSERT INTO mcu_patient_resume_status ( + Mcu_PatientResumeStatusPreregisterID, Mcu_PatientResumeStatusMcuID, + Mcu_PatientResumeStatusStatus, Mcu_PatientResumeStatusValidated, + Mcu_PatientResumeStatusPublished, Mcu_PatientResumeSyncedAt + ) + SELECT + p.Mcu_PreregisterPatientsID, p_mcu_id, + r.Mcu_ResumeStatus, r.Mcu_ResumeValidation, 'N', NOW() + FROM cpone.mcu_preregister_patients p + JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID + LEFT JOIN cpone.mcu_resume r ON r.Mcu_ResumeT_OrderHeaderID = o.T_OrderHeaderID AND r.Mcu_ResumeIsActive = 'Y' + WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id + AND p.Mcu_PreregisterPatientsT_OrderHeaderID > 0 + AND p.Mcu_PreregisterPatientsIsActive = 'Y' + ON DUPLICATE KEY UPDATE + Mcu_PatientResumeStatusStatus = VALUES(Mcu_PatientResumeStatusStatus), + Mcu_PatientResumeStatusValidated = VALUES(Mcu_PatientResumeStatusValidated), + Mcu_PatientResumeSyncedAt = NOW(); + +END $$ + +DELIMITER ;