Update MCU sync, dummy generator, and kelainan trigger

This commit is contained in:
sas.fajri
2026-05-06 22:01:57 +07:00
parent 3d50bcf7f1
commit 3cde1b3cdb
6 changed files with 575 additions and 98 deletions

View File

@@ -790,6 +790,11 @@ BEGIN
DECLARE v_lab_number VARCHAR(25);
DECLARE v_seq INT;
DECLARE v_effective_date DATE;
DECLARE v_lab_exists INT DEFAULT 0;
DECLARE v_checkin_time TIME;
DECLARE v_checkout_time TIME;
DECLARE v_total_station INT DEFAULT 0;
DECLARE v_done_station INT DEFAULT 0;
DECLARE cur_target CURSOR FOR
SELECT
@@ -821,6 +826,11 @@ BEGIN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Gunakan preregister_id, atau mcu_id + date';
END IF;
SELECT IFNULL(MAX(CAST(RIGHT(T_OrderHeaderLabNumber, 4) AS UNSIGNED)), 0) + 1
INTO v_seq
FROM cpone.t_orderheader
WHERE T_OrderHeaderLabNumber LIKE CONCAT('X', DATE_FORMAT(NOW(), '%y%m%d'), '%');
OPEN cur_target;
read_loop: LOOP
FETCH cur_target INTO v_preregister_id, v_patient_id, v_gender, v_corporate_id, v_mcu_id, v_orders;
@@ -845,75 +855,102 @@ BEGIN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Tanggal MCU tidak ditemukan di mcu_preregister_date aktif';
END IF;
SELECT oh.T_OrderHeaderID
INTO v_source_order_id
FROM cpone.t_orderheader oh
JOIN cpone.mcu_preregister_patients p2
ON p2.Mcu_PreregisterPatientsT_OrderHeaderID = oh.T_OrderHeaderID
AND p2.Mcu_PreregisterPatientsIsActive = 'Y'
WHERE oh.T_OrderHeaderIsActive = 'Y'
AND p2.Mcu_PreregisterPatientsGender = v_gender
AND EXISTS (
SELECT 1
FROM cpone.so_resultentry r
JOIN cpone.so_resultentrydetail rd
ON rd.So_ResultEntryDetailSo_ResultEntryID = r.So_ResultEntryID
AND rd.So_ResultEntryDetailIsActive = 'Y'
WHERE r.So_ResultEntryT_OrderHeaderID = oh.T_OrderHeaderID
AND r.So_ResultEntryIsActive = 'Y'
AND r.So_ResultEntryValidation1 = 'Y'
AND r.So_ResultEntryStatus = 'VAL'
)
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetail odr
WHERE odr.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odr.T_OrderDetailIsActive = 'Y'
AND IFNULL(TRIM(odr.T_OrderDetailResult), '') <> ''
)
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetail odf
JOIN cpone.so_resultentry rf
ON rf.So_ResultEntryT_OrderHeaderID = odf.T_OrderDetailT_OrderHeaderID
AND rf.So_ResultEntryT_OrderDetailID = odf.T_OrderDetailID
AND rf.So_ResultEntryIsActive = 'Y'
AND rf.So_ResultEntryValidation1 = 'Y'
AND rf.So_ResultEntryStatus = 'VAL'
JOIN cpone.so_resultentry_fisik_umum rfu
ON rfu.So_ResultEntryFisikUmumSo_ResultEntryID = rf.So_ResultEntryID
AND rfu.So_ResultEntryFisikUmumIsActive = 'Y'
WHERE odf.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odf.T_OrderDetailIsActive = 'Y'
AND odf.T_OrderDetailT_TestID = 2562
)
AND (
(v_orders LIKE '%PN%' AND EXISTS (
SELECT IFNULL((
SELECT oh.T_OrderHeaderID
FROM cpone.t_orderheader oh
JOIN cpone.mcu_preregister_patients p2
ON p2.Mcu_PreregisterPatientsT_OrderHeaderID = oh.T_OrderHeaderID
AND p2.Mcu_PreregisterPatientsIsActive = 'Y'
WHERE oh.T_OrderHeaderIsActive = 'Y'
AND p2.Mcu_PreregisterPatientsGender = v_gender
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetailorder odo
WHERE odo.T_OrderDetailOrderT_OrderHeaderID = oh.T_OrderHeaderID
AND odo.T_OrderDetailOrderIsPacket = 'Y'
AND odo.T_OrderDetailOrderIsActive = 'Y'
))
OR v_orders NOT LIKE '%PN%'
)
ORDER BY oh.T_OrderHeaderDate DESC
LIMIT 1;
FROM cpone.so_resultentry r
JOIN cpone.so_resultentrydetail rd
ON rd.So_ResultEntryDetailSo_ResultEntryID = r.So_ResultEntryID
AND rd.So_ResultEntryDetailIsActive = 'Y'
WHERE r.So_ResultEntryT_OrderHeaderID = oh.T_OrderHeaderID
AND r.So_ResultEntryIsActive = 'Y'
AND r.So_ResultEntryValidation1 = 'Y'
AND r.So_ResultEntryStatus = 'VAL'
)
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetail odr
WHERE odr.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odr.T_OrderDetailIsActive = 'Y'
AND IFNULL(TRIM(odr.T_OrderDetailResult), '') <> ''
)
AND (
(v_orders LIKE '%PN%' AND EXISTS (
SELECT 1
FROM cpone.t_orderdetailorder odo
WHERE odo.T_OrderDetailOrderT_OrderHeaderID = oh.T_OrderHeaderID
AND odo.T_OrderDetailOrderIsPacket = 'Y'
AND odo.T_OrderDetailOrderIsActive = 'Y'
))
OR EXISTS (
SELECT 1
FROM cpone.t_orderdetail odx
WHERE odx.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odx.T_OrderDetailIsActive = 'Y'
AND FIND_IN_SET(TRIM(odx.T_OrderDetailT_TestCode), REPLACE(v_orders, ' ', '')) > 0
)
OR IFNULL(TRIM(v_orders), '') = ''
)
ORDER BY oh.T_OrderHeaderDate DESC
LIMIT 1
), 0)
INTO v_source_order_id;
IF IFNULL(v_source_order_id, 0) = 0 THEN
SELECT IFNULL((
SELECT oh.T_OrderHeaderID
FROM cpone.t_orderheader oh
JOIN cpone.mcu_preregister_patients p2
ON p2.Mcu_PreregisterPatientsT_OrderHeaderID = oh.T_OrderHeaderID
AND p2.Mcu_PreregisterPatientsIsActive = 'Y'
WHERE oh.T_OrderHeaderIsActive = 'Y'
AND p2.Mcu_PreregisterPatientsGender = v_gender
AND EXISTS (
SELECT 1
FROM cpone.t_orderdetail odr
WHERE odr.T_OrderDetailT_OrderHeaderID = oh.T_OrderHeaderID
AND odr.T_OrderDetailIsActive = 'Y'
AND IFNULL(TRIM(odr.T_OrderDetailResult), '') <> ''
)
ORDER BY oh.T_OrderHeaderDate DESC
LIMIT 1
), 0)
INTO v_source_order_id;
END IF;
IF IFNULL(v_source_order_id, 0) = 0 THEN
ITERATE read_loop;
END IF;
SELECT IFNULL(MAX(CAST(RIGHT(T_OrderHeaderLabNumber, 4) AS UNSIGNED)), 0) + 1
INTO v_seq
FROM cpone.t_orderheader
WHERE T_OrderHeaderLabNumber LIKE CONCAT('X', DATE_FORMAT(NOW(), '%y%m%d'), '%');
SET v_lab_number = CONCAT(
'X',
DATE_FORMAT(NOW(), '%y%m%d'),
LPAD(v_seq, 4, '0')
);
SELECT COUNT(1)
INTO v_lab_exists
FROM cpone.t_orderheader
WHERE T_OrderHeaderLabNumber = v_lab_number;
WHILE v_lab_exists > 0 DO
SET v_seq = v_seq + 1;
SET v_lab_number = CONCAT(
'X',
DATE_FORMAT(NOW(), '%y%m%d'),
LPAD(v_seq, 4, '0')
);
SELECT COUNT(1)
INTO v_lab_exists
FROM cpone.t_orderheader
WHERE T_OrderHeaderLabNumber = v_lab_number;
END WHILE;
SET v_seq = v_seq + 1;
INSERT INTO cpone.t_orderheader (
T_OrderHeaderM_BranchID,
@@ -994,7 +1031,7 @@ BEGIN
v_mcu_id,
os.T_OrderSampleT_SampleStationID,
ss.T_SampleStationName,
'LAB',
'lab',
os.T_OrderSampleSamplingDate,
CONCAT(os.T_OrderSampleSamplingDate, ' ', IFNULL(os.T_OrderSampleSamplingTime, '00:00:00')),
CONCAT(os.T_OrderSampleReceiveDate, ' ', IFNULL(os.T_OrderSampleReceiveTime, '00:00:00')),
@@ -1020,6 +1057,83 @@ BEGIN
Mcu_StationProgressProcessAt = VALUES(Mcu_StationProgressProcessAt),
Mcu_StationProgressDoneAt = VALUES(Mcu_StationProgressDoneAt),
Mcu_StationProgressSyncedAt = VALUES(Mcu_StationProgressSyncedAt);
SELECT TIME(oh.T_OrderHeaderDate)
INTO v_checkin_time
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = v_new_order_id
LIMIT 1;
IF v_checkin_time IS NULL THEN
SET v_checkin_time = '07:30:00';
END IF;
SELECT COUNT(*)
INTO v_total_station
FROM cpone.t_ordersample os
WHERE os.T_OrderSampleT_OrderHeaderID = v_new_order_id
AND os.T_OrderSampleIsActive = 'Y';
SELECT COUNT(*)
INTO v_done_station
FROM cpone.t_ordersample os
JOIN cpone.t_samplingso sso
ON sso.T_SamplingSoT_OrderHeaderID = os.T_OrderSampleT_OrderHeaderID
AND sso.T_SamplingSoT_SampleStationID = os.T_OrderSampleT_SampleStationID
AND sso.T_SamplingSoIsActive = 'Y'
WHERE os.T_OrderSampleT_OrderHeaderID = v_new_order_id
AND os.T_OrderSampleIsActive = 'Y'
AND sso.T_SamplingSoDoneDate IS NOT NULL
AND sso.T_SamplingSoDoneDate <> '0000-00-00'
AND IFNULL(sso.T_SamplingSoDoneTime, '') <> '';
IF v_total_station > 0 AND v_done_station = v_total_station THEN
SELECT MAX(sso.T_SamplingSoDoneTime)
INTO v_checkout_time
FROM cpone.t_samplingso sso
WHERE sso.T_SamplingSoT_OrderHeaderID = v_new_order_id
AND sso.T_SamplingSoIsActive = 'Y'
AND sso.T_SamplingSoDoneDate IS NOT NULL
AND sso.T_SamplingSoDoneDate <> '0000-00-00'
AND IFNULL(sso.T_SamplingSoDoneTime, '') <> '';
ELSE
SET v_checkout_time = NULL;
END IF;
INSERT INTO cpone_dashboard.mcu_checkinout (
Mcu_CheckinoutMcuID,
Mcu_CheckinoutPreregisterID,
Mcu_CheckinoutOrderID,
Mcu_CheckinoutDate,
Mcu_CheckinoutInTime,
Mcu_CheckinoutOutTime,
Mcu_CheckinoutOutUserID,
Mcu_CheckinoutIsActive,
Mcu_CheckinoutSyncedAt
)
VALUES (
v_mcu_id,
v_preregister_id,
v_new_order_id,
v_effective_date,
v_checkin_time,
v_checkout_time,
CASE WHEN v_checkout_time IS NULL THEN 0 ELSE p_user_id END,
'Y',
NOW()
)
ON DUPLICATE KEY UPDATE
Mcu_CheckinoutMcuID = VALUES(Mcu_CheckinoutMcuID),
Mcu_CheckinoutOrderID = VALUES(Mcu_CheckinoutOrderID),
Mcu_CheckinoutOutTime = CASE
WHEN VALUES(Mcu_CheckinoutOutTime) IS NULL THEN Mcu_CheckinoutOutTime
ELSE VALUES(Mcu_CheckinoutOutTime)
END,
Mcu_CheckinoutOutUserID = CASE
WHEN VALUES(Mcu_CheckinoutOutTime) IS NULL THEN Mcu_CheckinoutOutUserID
ELSE VALUES(Mcu_CheckinoutOutUserID)
END,
Mcu_CheckinoutSyncedAt = NOW();
END LOOP;
CLOSE cur_target;

View File

@@ -0,0 +1,204 @@
-- Auto-maintain cpone_corporate.kelainan_summary from cpone_corporate.kelainan_details
-- 1) deduplicate existing rows before adding unique key
DELETE ks1
FROM cpone_corporate.kelainan_summary ks1
JOIN cpone_corporate.kelainan_summary ks2
ON ks1.Mcu_KelainanMgm_McuID = ks2.Mcu_KelainanMgm_McuID
AND ks1.Mcu_KelainanID = ks2.Mcu_KelainanID
AND ks1.created_at > ks2.created_at;
DELETE dks1
FROM cpone_dashboard.kelainan_summary dks1
JOIN cpone_dashboard.kelainan_summary dks2
ON dks1.Mgm_McuID = dks2.Mgm_McuID
AND dks1.Mcu_KelainanID = dks2.Mcu_KelainanID
AND dks1.created_at > dks2.created_at;
DROP TRIGGER IF EXISTS cpone_corporate.trg_kelainan_details_ai_sync_summary;
DROP TRIGGER IF EXISTS cpone_corporate.trg_kelainan_details_au_sync_summary;
DROP TRIGGER IF EXISTS cpone_corporate.trg_kelainan_details_ad_sync_summary;
DELIMITER $$
CREATE TRIGGER cpone_corporate.trg_kelainan_details_ai_sync_summary
AFTER INSERT ON cpone_corporate.kelainan_details
FOR EACH ROW
BEGIN
DECLARE v_mgm_mcuid INT;
SELECT oh.T_OrderHeaderMgm_McuID
INTO v_mgm_mcuid
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = NEW.T_OrderHeaderID
AND oh.T_OrderHeaderIsActive = 'Y'
LIMIT 1;
IF v_mgm_mcuid IS NOT NULL
AND NEW.Mcu_KelainanID IS NOT NULL
AND NEW.Mcu_KelainanName IS NOT NULL
AND NEW.Mcu_KelainanName <> '' THEN
INSERT INTO cpone_corporate.kelainan_summary (
Mcu_KelainanID,
Mcu_KelainanMgm_McuID,
Mcu_KelainanName,
created_at
)
SELECT NEW.Mcu_KelainanID, v_mgm_mcuid, NEW.Mcu_KelainanName, NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM cpone_corporate.kelainan_summary ks
WHERE ks.Mcu_KelainanMgm_McuID = v_mgm_mcuid
AND ks.Mcu_KelainanID = NEW.Mcu_KelainanID
);
UPDATE cpone_corporate.kelainan_summary
SET Mcu_KelainanName = NEW.Mcu_KelainanName
WHERE Mcu_KelainanMgm_McuID = v_mgm_mcuid
AND Mcu_KelainanID = NEW.Mcu_KelainanID;
INSERT INTO cpone_dashboard.kelainan_summary (
Mcu_KelainanID,
Mcu_KelainanMgm_McuID,
Mcu_KelainanName,
created_at,
Mgm_McuID
)
SELECT NEW.Mcu_KelainanID, v_mgm_mcuid, NEW.Mcu_KelainanName, NOW(), v_mgm_mcuid
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM cpone_dashboard.kelainan_summary dks
WHERE dks.Mgm_McuID = v_mgm_mcuid
AND dks.Mcu_KelainanID = NEW.Mcu_KelainanID
);
UPDATE cpone_dashboard.kelainan_summary
SET Mcu_KelainanName = NEW.Mcu_KelainanName,
Mcu_KelainanMgm_McuID = v_mgm_mcuid
WHERE Mgm_McuID = v_mgm_mcuid
AND Mcu_KelainanID = NEW.Mcu_KelainanID;
END IF;
END$$
CREATE TRIGGER cpone_corporate.trg_kelainan_details_au_sync_summary
AFTER UPDATE ON cpone_corporate.kelainan_details
FOR EACH ROW
BEGIN
DECLARE v_mgm_old INT;
DECLARE v_mgm_new INT;
SELECT oh.T_OrderHeaderMgm_McuID
INTO v_mgm_old
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = OLD.T_OrderHeaderID
AND oh.T_OrderHeaderIsActive = 'Y'
LIMIT 1;
SELECT oh.T_OrderHeaderMgm_McuID
INTO v_mgm_new
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = NEW.T_OrderHeaderID
AND oh.T_OrderHeaderIsActive = 'Y'
LIMIT 1;
IF v_mgm_old IS NOT NULL AND OLD.Mcu_KelainanID IS NOT NULL THEN
IF NOT EXISTS (
SELECT 1
FROM cpone_corporate.kelainan_details kd
JOIN cpone.t_orderheader oh ON oh.T_OrderHeaderID = kd.T_OrderHeaderID
WHERE oh.T_OrderHeaderMgm_McuID = v_mgm_old
AND oh.T_OrderHeaderIsActive = 'Y'
AND kd.Mcu_KelainanID = OLD.Mcu_KelainanID
) THEN
DELETE FROM cpone_corporate.kelainan_summary
WHERE Mcu_KelainanMgm_McuID = v_mgm_old
AND Mcu_KelainanID = OLD.Mcu_KelainanID;
DELETE FROM cpone_dashboard.kelainan_summary
WHERE Mgm_McuID = v_mgm_old
AND Mcu_KelainanID = OLD.Mcu_KelainanID;
END IF;
END IF;
IF v_mgm_new IS NOT NULL
AND NEW.Mcu_KelainanID IS NOT NULL
AND NEW.Mcu_KelainanName IS NOT NULL
AND NEW.Mcu_KelainanName <> '' THEN
INSERT INTO cpone_corporate.kelainan_summary (
Mcu_KelainanID,
Mcu_KelainanMgm_McuID,
Mcu_KelainanName,
created_at
)
SELECT NEW.Mcu_KelainanID, v_mgm_new, NEW.Mcu_KelainanName, NOW()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM cpone_corporate.kelainan_summary ks
WHERE ks.Mcu_KelainanMgm_McuID = v_mgm_new
AND ks.Mcu_KelainanID = NEW.Mcu_KelainanID
);
UPDATE cpone_corporate.kelainan_summary
SET Mcu_KelainanName = NEW.Mcu_KelainanName
WHERE Mcu_KelainanMgm_McuID = v_mgm_new
AND Mcu_KelainanID = NEW.Mcu_KelainanID;
INSERT INTO cpone_dashboard.kelainan_summary (
Mcu_KelainanID,
Mcu_KelainanMgm_McuID,
Mcu_KelainanName,
created_at,
Mgm_McuID
)
SELECT NEW.Mcu_KelainanID, v_mgm_new, NEW.Mcu_KelainanName, NOW(), v_mgm_new
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM cpone_dashboard.kelainan_summary dks
WHERE dks.Mgm_McuID = v_mgm_new
AND dks.Mcu_KelainanID = NEW.Mcu_KelainanID
);
UPDATE cpone_dashboard.kelainan_summary
SET Mcu_KelainanName = NEW.Mcu_KelainanName,
Mcu_KelainanMgm_McuID = v_mgm_new
WHERE Mgm_McuID = v_mgm_new
AND Mcu_KelainanID = NEW.Mcu_KelainanID;
END IF;
END$$
CREATE TRIGGER cpone_corporate.trg_kelainan_details_ad_sync_summary
AFTER DELETE ON cpone_corporate.kelainan_details
FOR EACH ROW
BEGIN
DECLARE v_mgm_mcuid INT;
SELECT oh.T_OrderHeaderMgm_McuID
INTO v_mgm_mcuid
FROM cpone.t_orderheader oh
WHERE oh.T_OrderHeaderID = OLD.T_OrderHeaderID
AND oh.T_OrderHeaderIsActive = 'Y'
LIMIT 1;
IF v_mgm_mcuid IS NOT NULL AND OLD.Mcu_KelainanID IS NOT NULL THEN
IF NOT EXISTS (
SELECT 1
FROM cpone_corporate.kelainan_details kd
JOIN cpone.t_orderheader oh ON oh.T_OrderHeaderID = kd.T_OrderHeaderID
WHERE oh.T_OrderHeaderMgm_McuID = v_mgm_mcuid
AND oh.T_OrderHeaderIsActive = 'Y'
AND kd.Mcu_KelainanID = OLD.Mcu_KelainanID
) THEN
DELETE FROM cpone_corporate.kelainan_summary
WHERE Mcu_KelainanMgm_McuID = v_mgm_mcuid
AND Mcu_KelainanID = OLD.Mcu_KelainanID;
DELETE FROM cpone_dashboard.kelainan_summary
WHERE Mgm_McuID = v_mgm_mcuid
AND Mcu_KelainanID = OLD.Mcu_KelainanID;
END IF;
END IF;
END$$
DELIMITER ;