-- Migration 002: stored procedure untuk generate dashboard data dari project cpone yang sudah ada -- Digunakan untuk testing dengan data historis (contoh: Mgm_McuID = 99) -- Tambah unique key di mcu_patient_schedule agar ON DUPLICATE KEY UPDATE bisa berjalan ALTER TABLE mcu_patient_schedule ADD UNIQUE KEY uq_preregister_schedule (Mcu_PatientSchedulePreregisterID, Mcu_PatientScheduleDate); ALTER TABLE mcu_checkinout DROP INDEX uq_checkinout_id, ADD UNIQUE KEY uq_checkinout_segment ( Mcu_CheckinoutPreregisterID, Mcu_CheckinoutDate, Mcu_CheckinoutInTime ); -- ============================================================ -- sp_generate_dashboard_data -- Parameter: p_mcu_id INT (Mgm_McuID dari cpone) -- Mengisi: mcu_project, mcu_patient, mcu_patient_schedule, mcu_checkinout -- ============================================================ DROP PROCEDURE IF EXISTS sp_generate_dashboard_data; DELIMITER $$ CREATE PROCEDURE sp_generate_dashboard_data(IN p_mcu_id INT) BEGIN -- ---------------------------------------------------------- -- 1. mcu_project -- Source: cpone.mgm_mcu JOIN cpone.corporate -- ---------------------------------------------------------- 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 -- Source: cpone.mcu_preregister_patients -- ---------------------------------------------------------- INSERT INTO mcu_patient ( Mcu_PatientPreregisterID, Mcu_PatientMcuID, Mcu_PatientName, Mcu_PatientNIP, Mcu_PatientGender, Mcu_PatientDOB, Mcu_PatientDepartment, Mcu_PatientDivision, Mcu_PatientPosisi, 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, p.Mcu_PreregisterPatientsDepartment, p.Mcu_PreregisterPatientsDivisi, p.Mcu_PreregisterPatientsPosisi, p.Mcu_PreregisterPatientsIsRegistered, p.Mcu_PreregisterPatientsT_OrderHeaderID, p.Mcu_PreregisterPatientsIsActive, NOW() FROM cpone.mcu_preregister_patients p WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id AND p.Mcu_PreregisterPatientsIsActive = 'Y' ON DUPLICATE KEY UPDATE Mcu_PatientName = VALUES(Mcu_PatientName), Mcu_PatientIsRegistered = VALUES(Mcu_PatientIsRegistered), Mcu_PatientOrderID = VALUES(Mcu_PatientOrderID), Mcu_PatientSyncedAt = NOW(); -- ---------------------------------------------------------- -- 3. mcu_patient_schedule -- Source: T_OrderHeaderDate sebagai jadwal checkin -- Hanya untuk pasien yang sudah punya order -- ---------------------------------------------------------- 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 -- Satu baris per tanggal proses. -- Check-in : tanggal header untuk hari pertama, atau event paling awal untuk hari lanjutan. -- Check-out : event paling akhir pada tanggal itu. -- ---------------------------------------------------------- INSERT INTO mcu_checkinout ( Mcu_CheckinoutCheckinoutID, Mcu_CheckinoutPreregisterID, Mcu_CheckinoutOrderID, Mcu_CheckinoutDate, Mcu_CheckinoutInTime, Mcu_CheckinoutOutTime, Mcu_CheckinoutNextDate, Mcu_CheckinoutIsActive, Mcu_CheckinoutSyncedAt ) 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() 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 AS preregister_id, o2.T_OrderHeaderID AS order_id, o2.T_OrderHeaderDate AS checkin_dt, DATE(TIMESTAMP(s2.T_OrderSampleReceiveDate, s2.T_OrderSampleReceiveTime)) AS segment_date, TIMESTAMP(s2.T_OrderSampleReceiveDate, s2.T_OrderSampleReceiveTime) AS event_dt 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 AS preregister_id, o2.T_OrderHeaderID AS order_id, o2.T_OrderHeaderDate AS checkin_dt, DATE(TIMESTAMP(ts2.T_SamplingSoDoneDate, ts2.T_SamplingSoDoneTime)) AS segment_date, TIMESTAMP(ts2.T_SamplingSoDoneDate, ts2.T_SamplingSoDoneTime) AS event_dt 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(); END $$ DELIMITER ;