-- Migration 010: Add age column to mcu_patient and update SP ALTER TABLE mcu_patient ADD COLUMN Mcu_PatientAge INT DEFAULT NULL AFTER Mcu_PatientDOB; -- Update SP: tambah age dari T_OrderHeader.M_PatientAge 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) -- ---------------------------------------------------------- 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_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, o.T_OrderHeaderM_PatientAge, 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 LEFT JOIN cpone.t_orderheader o ON o.T_OrderHeaderID = p.Mcu_PreregisterPatientsT_OrderHeaderID WHERE p.Mcu_PreregisterPatientsMgm_McuID = p_mcu_id AND p.Mcu_PreregisterPatientsIsActive = 'Y' ON DUPLICATE KEY UPDATE Mcu_PatientName = VALUES(Mcu_PatientName), Mcu_PatientAge = VALUES(Mcu_PatientAge), Mcu_PatientIsRegistered = VALUES(Mcu_PatientIsRegistered), Mcu_PatientOrderID = VALUES(Mcu_PatientOrderID), 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 -- Satu baris per tanggal proses. -- ---------------------------------------------------------- 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 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(); -- ---------------------------------------------------------- -- 5. mcu_station_progress — lab (dari t_ordersample) -- GROUP BY order+station supaya satu baris per pasien per station -- ---------------------------------------------------------- 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 (dari t_samplingso) -- ---------------------------------------------------------- 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(); END $$ DELIMITER ;