Files
cpone_dashboard/cpone-dashboard/db/migrations/002_sp_generate_data.sql
2026-04-30 14:27:01 +07:00

251 lines
9.7 KiB
SQL

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