Initial commit
This commit is contained in:
250
cpone-dashboard/db/migrations/002_sp_generate_data.sql
Normal file
250
cpone-dashboard/db/migrations/002_sp_generate_data.sql
Normal file
@@ -0,0 +1,250 @@
|
||||
-- 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 ;
|
||||
Reference in New Issue
Block a user