251 lines
9.7 KiB
SQL
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 ;
|