Cpone-BUG-00024 - fix sync status aktif patient di sp_generate_dashboard_data

Restore blok sinkron mcu_project yang hilang sejak migration 014, dan
hapus filter IsActive='Y' pada sync mcu_patient supaya baris yang jadi
inactive di sumber (mcu_preregister_patients) ikut ter-update statusnya,
bukan nyangkut permanen sebagai 'Y'.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
sas.fajri
2026-08-28 13:57:51 +07:00
parent 20146f1d91
commit 466474c1f2

View File

@@ -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 ;