Files
BE_IBL/sql/manual_changes/2026-05-24-add-sp-sampling-fix-normal-by-orderdetail.sql
2026-05-24 19:00:18 +07:00

195 lines
7.7 KiB
SQL

DROP PROCEDURE IF EXISTS sp_sampling_fix_normal_by_orderdetail;
DELIMITER $$
CREATE PROCEDURE sp_sampling_fix_normal_by_orderdetail(IN pT_OrderDetailID INT)
BEGIN
DECLARE vOrderHeaderID INT DEFAULT NULL;
DECLARE vPatientSexID INT DEFAULT NULL;
DECLARE vPatientDOB DATE DEFAULT NULL;
DECLARE vOrderDate DATE DEFAULT NULL;
DECLARE vAgeInDay INT DEFAULT NULL;
DECLARE vNatTestID INT DEFAULT NULL;
DECLARE vCurrentNormalValueID INT DEFAULT NULL;
DECLARE vMethodIDPriority INT DEFAULT NULL;
DECLARE vMethodNamePriority VARCHAR(100) DEFAULT NULL;
DECLARE vMethodIDInstrument INT DEFAULT NULL;
DECLARE vMethodNameInstrument VARCHAR(100) DEFAULT NULL;
DECLARE vMethodIDNormal INT DEFAULT NULL;
DECLARE vMethodNameNormal VARCHAR(100) DEFAULT NULL;
DECLARE vSelectedMethodID INT DEFAULT NULL;
DECLARE vSelectedMethodName VARCHAR(100) DEFAULT NULL;
DECLARE vSelectedMethodSource VARCHAR(30) DEFAULT NULL;
DECLARE vNormalValueID INT DEFAULT 0;
SELECT
od.T_OrderDetailT_OrderHeaderID,
p.M_PatientM_SexID,
p.M_PatientDOB,
DATE(oh.T_OrderHeaderDate),
tt.T_TestNat_TestID,
od.T_OrderDetailNat_NormalValueID
INTO
vOrderHeaderID,
vPatientSexID,
vPatientDOB,
vOrderDate,
vNatTestID,
vCurrentNormalValueID
FROM t_orderdetail od
JOIN t_orderheader oh
ON oh.T_OrderHeaderID = od.T_OrderDetailT_OrderHeaderID
JOIN m_patient p
ON p.M_PatientID = oh.T_OrderHeaderM_PatientID
LEFT JOIN t_test tt
ON tt.T_TestID = od.T_OrderDetailT_TestID
WHERE od.T_OrderDetailID = pT_OrderDetailID
AND od.T_OrderDetailIsActive = 'Y'
LIMIT 1;
IF vOrderHeaderID IS NULL THEN
SELECT
'ERR' AS status,
CONCAT('T_OrderDetailID ', pT_OrderDetailID, ' tidak ditemukan atau tidak aktif') AS message,
NULL AS selected_methode_id,
NULL AS selected_methode_name,
NULL AS nat_normalvalue_id,
0 AS updated_rows;
ELSE
IF vPatientDOB IS NOT NULL AND vOrderDate IS NOT NULL THEN
SET vAgeInDay = fn_global_age_count_day(vPatientDOB, vOrderDate);
END IF;
SELECT
mp.M_MethodePriorityNat_MethodeID,
nm.Nat_MethodeName
INTO
vMethodIDPriority,
vMethodNamePriority
FROM m_methode_priority mp
JOIN nat_methode nm
ON nm.Nat_MethodeID = mp.M_MethodePriorityNat_MethodeID
AND nm.Nat_MethodeIsActive = 'Y'
JOIN m_instrumentmethode im
ON im.M_InstrumentMethodeNat_MethodeID = nm.Nat_MethodeID
AND im.M_InstrumentMethodeIsActive = 'Y'
JOIN nat_instrument ni
ON ni.Nat_InstrumentID = im.M_InstrumentMethodeNat_InstrumentID
AND ni.Nat_InstrumentIsActive = 'Y'
WHERE mp.M_MethodePriorityIsActive = 'Y'
AND mp.M_MethodePriorityNat_TestID = vNatTestID
AND mp.M_MethodePriorityM_DayOfWeekID = DAYOFWEEK(NOW())
ORDER BY mp.M_MethodePriorityNumber DESC
LIMIT 1;
SELECT
im.M_InstrumentMethodeNat_MethodeID,
nm.Nat_MethodeName
INTO
vMethodIDInstrument,
vMethodNameInstrument
FROM m_instrumentmethode im
JOIN nat_methode nm
ON nm.Nat_MethodeID = im.M_InstrumentMethodeNat_MethodeID
AND nm.Nat_MethodeIsActive = 'Y'
JOIN nat_instrument ni
ON ni.Nat_InstrumentID = im.M_InstrumentMethodeNat_InstrumentID
AND ni.Nat_InstrumentIsActive = 'Y'
WHERE im.M_InstrumentMethodeNat_TestID = vNatTestID
AND im.M_InstrumentMethodeIsActive = 'Y'
ORDER BY im.M_InstrumentMethodePriority DESC
LIMIT 1;
SELECT
nn.Nat_NormalValueNat_MethodeID,
nm.Nat_MethodeName
INTO
vMethodIDNormal,
vMethodNameNormal
FROM nat_normalvalue nn
JOIN nat_methode nm
ON nm.Nat_MethodeID = nn.Nat_NormalValueNat_MethodeID
AND nm.Nat_MethodeIsActive = 'Y'
WHERE nn.Nat_NormalValueNat_TestID = vNatTestID
AND nn.Nat_NormalValueIsActive = 'Y'
ORDER BY nn.Nat_NormalValueID
LIMIT 1;
IF vMethodIDPriority IS NOT NULL AND vMethodIDPriority > 0 THEN
SET vSelectedMethodID = vMethodIDPriority;
SET vSelectedMethodName = vMethodNamePriority;
SET vSelectedMethodSource = 'm_methode_priority';
ELSEIF vMethodIDInstrument IS NOT NULL AND vMethodIDInstrument > 0 THEN
SET vSelectedMethodID = vMethodIDInstrument;
SET vSelectedMethodName = vMethodNameInstrument;
SET vSelectedMethodSource = 'm_instrumentmethode';
ELSEIF vMethodIDNormal IS NOT NULL AND vMethodIDNormal > 0 THEN
SET vSelectedMethodID = vMethodIDNormal;
SET vSelectedMethodName = vMethodNameNormal;
SET vSelectedMethodSource = 'nat_normalvalue';
END IF;
IF vSelectedMethodID IS NOT NULL
AND vSelectedMethodID > 0
AND vNatTestID IS NOT NULL
AND vPatientSexID IS NOT NULL
AND vAgeInDay IS NOT NULL THEN
SET vNormalValueID = fn_sampling_get_normal(vSelectedMethodID, vNatTestID, vPatientSexID, vAgeInDay);
END IF;
IF vNormalValueID IS NOT NULL AND vNormalValueID > 0 THEN
UPDATE t_orderdetail od
JOIN nat_normalvalue nn
ON nn.Nat_NormalValueID = vNormalValueID
SET
od.T_OrderDetailNat_NormalValueID = nn.Nat_NormalValueID,
od.T_OrderDetailNormalValueNote = nn.Nat_NormalValueNote,
od.T_OrderDetailNormalValueDescription = nn.Nat_NormalValueDescription,
od.T_OrderDetailMinValue = nn.Nat_NormalValueMinValue,
od.T_OrderDetailMaxValue = nn.Nat_NormalValueMaxValue,
od.T_OrderDetailMinValueInclusive = nn.Nat_NormalValueMinValueInclusive,
od.T_OrderDetailMaxValueInclusive = nn.Nat_NormalValueMaxValueInclusive,
od.T_OrderDetailNat_MethodeID = vSelectedMethodID,
od.T_OrderdetailNat_MethodeName = vSelectedMethodName
WHERE od.T_OrderDetailID = pT_OrderDetailID
AND od.T_OrderDetailIsActive = 'Y';
SELECT
'OK' AS status,
CONCAT('Normal value berhasil diupdate untuk T_OrderDetailID ', pT_OrderDetailID) AS message,
vSelectedMethodID AS selected_methode_id,
vSelectedMethodName AS selected_methode_name,
vSelectedMethodSource AS selected_methode_source,
vNormalValueID AS nat_normalvalue_id,
ROW_COUNT() AS updated_rows;
ELSE
SELECT
'NOT_FOUND' AS status,
CONCAT('Normal value tidak ditemukan untuk T_OrderDetailID ', pT_OrderDetailID) AS message,
vSelectedMethodID AS selected_methode_id,
vSelectedMethodName AS selected_methode_name,
vSelectedMethodSource AS selected_methode_source,
vNormalValueID AS nat_normalvalue_id,
0 AS updated_rows;
END IF;
SELECT
od.T_OrderDetailID,
od.T_OrderDetailNat_NormalValueID,
od.T_OrderDetailNat_MethodeID,
od.T_OrderdetailNat_MethodeName,
od.T_OrderDetailNormalValueDescription,
od.T_OrderDetailMinValue,
od.T_OrderDetailMaxValue,
od.T_OrderDetailMinValueInclusive,
od.T_OrderDetailMaxValueInclusive
FROM t_orderdetail od
WHERE od.T_OrderDetailID = pT_OrderDetailID
LIMIT 1;
END IF;
END$$
DELIMITER ;