diff --git a/sql/manual_changes/2026-05-24-add-sp-sampling-check-normal-setting.sql b/sql/manual_changes/2026-05-24-add-sp-sampling-check-normal-setting.sql new file mode 100644 index 00000000..f87681d9 --- /dev/null +++ b/sql/manual_changes/2026-05-24-add-sp-sampling-check-normal-setting.sql @@ -0,0 +1,463 @@ +DROP PROCEDURE IF EXISTS sp_sampling_check_normal_setting; + +DELIMITER $$ + +CREATE PROCEDURE sp_sampling_check_normal_setting(IN pT_OrderDetailID INT) +BEGIN + DECLARE vOrderHeaderID INT DEFAULT NULL; + DECLARE vPatientID INT DEFAULT NULL; + DECLARE vPatientSexID INT DEFAULT NULL; + DECLARE vPatientDOB DATE DEFAULT NULL; + DECLARE vOrderDate DATE DEFAULT NULL; + DECLARE vAgeInDay INT DEFAULT NULL; + DECLARE vTTestID INT DEFAULT NULL; + DECLARE vNatTestID INT DEFAULT NULL; + DECLARE vOrderDetailMethodID 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 vFnNormalValueID INT DEFAULT 0; + + SELECT + od.T_OrderDetailT_OrderHeaderID, + oh.T_OrderHeaderM_PatientID, + p.M_PatientM_SexID, + p.M_PatientDOB, + DATE(oh.T_OrderHeaderDate), + od.T_OrderDetailT_TestID, + tt.T_TestNat_TestID, + od.T_OrderDetailNat_MethodeID + INTO + vOrderHeaderID, + vPatientID, + vPatientSexID, + vPatientDOB, + vOrderDate, + vTTestID, + vNatTestID, + vOrderDetailMethodID + 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; + 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 vFnNormalValueID = fn_sampling_get_normal(vSelectedMethodID, vNatTestID, vPatientSexID, vAgeInDay); + END IF; + + SELECT + pT_OrderDetailID AS T_OrderDetailID, + vOrderHeaderID AS T_OrderHeaderID, + vPatientID AS M_PatientID, + vPatientSexID AS M_PatientM_SexID, + vPatientDOB AS M_PatientDOB, + vOrderDate AS T_OrderHeaderDate, + vAgeInDay AS AgeInDay, + vTTestID AS T_TestID, + vNatTestID AS Nat_TestID, + vOrderDetailMethodID AS T_OrderDetailNat_MethodeID, + vMethodIDPriority AS MethodeIDFromPriority, + vMethodNamePriority AS MethodeNameFromPriority, + vMethodIDInstrument AS MethodeIDFromInstrument, + vMethodNameInstrument AS MethodeNameFromInstrument, + vMethodIDNormal AS MethodeIDFromNormalValue, + vMethodNameNormal AS MethodeNameFromNormalValue, + vSelectedMethodID AS SelectedMethodeID, + vSelectedMethodName AS SelectedMethodeName, + vSelectedMethodSource AS SelectedMethodeSource, + vFnNormalValueID AS FnSamplingGetNormalResult; + + SELECT + 'ORDER_DETAIL_ACTIVE' AS check_name, + IF(vOrderHeaderID IS NOT NULL, 'OK', 'MISSING') AS check_status, + CAST(pT_OrderDetailID AS CHAR) AS check_value, + 't_orderdetail aktif harus ditemukan' AS check_note + UNION ALL + SELECT + 'PATIENT_SEX', + IF(vPatientSexID IS NOT NULL AND vPatientSexID > 0, 'OK', 'MISSING'), + IFNULL(CAST(vPatientSexID AS CHAR), 'NULL'), + 'Dipakai pada type 1 dan type 3' + UNION ALL + SELECT + 'PATIENT_DOB', + IF(vPatientDOB IS NOT NULL, 'OK', 'MISSING'), + IFNULL(CAST(vPatientDOB AS CHAR), 'NULL'), + 'DOB dipakai untuk hitung AgeInDay' + UNION ALL + SELECT + 'ORDER_DATE', + IF(vOrderDate IS NOT NULL, 'OK', 'MISSING'), + IFNULL(CAST(vOrderDate AS CHAR), 'NULL'), + 'Tanggal order dipakai untuk hitung AgeInDay' + UNION ALL + SELECT + 'AGE_IN_DAY', + IF(vAgeInDay IS NOT NULL, 'OK', 'MISSING'), + IFNULL(CAST(vAgeInDay AS CHAR), 'NULL'), + 'Dipakai pada type 1 dan type 2' + UNION ALL + SELECT + 'NAT_TEST', + IF(vNatTestID IS NOT NULL AND vNatTestID > 0, 'OK', 'MISSING'), + IFNULL(CAST(vNatTestID AS CHAR), 'NULL'), + 'Harus ada mapping T_TestNat_TestID' + UNION ALL + SELECT + 'METHOD_PRIORITY', + IF(vMethodIDPriority IS NOT NULL AND vMethodIDPriority > 0, 'OK', 'MISSING'), + IFNULL(CAST(vMethodIDPriority AS CHAR), 'NULL'), + 'Sumber metode prioritas pertama' + UNION ALL + SELECT + 'METHOD_INSTRUMENT', + IF(vMethodIDInstrument IS NOT NULL AND vMethodIDInstrument > 0, 'OK', 'MISSING'), + IFNULL(CAST(vMethodIDInstrument AS CHAR), 'NULL'), + 'Fallback metode kedua' + UNION ALL + SELECT + 'METHOD_NORMALVALUE', + IF(vMethodIDNormal IS NOT NULL AND vMethodIDNormal > 0, 'OK', 'MISSING'), + IFNULL(CAST(vMethodIDNormal AS CHAR), 'NULL'), + 'Fallback metode ketiga' + UNION ALL + SELECT + 'SELECTED_METHOD', + IF(vSelectedMethodID IS NOT NULL AND vSelectedMethodID > 0, 'OK', 'MISSING'), + IFNULL(CAST(vSelectedMethodID AS CHAR), 'NULL'), + IFNULL(vSelectedMethodSource, 'Tidak ada metode yang bisa dipakai') + UNION ALL + SELECT + 'NORMALVALUE_TEST_METHOD_ACTIVE', + IF( + (SELECT COUNT(*) + FROM nat_normalvalue + WHERE Nat_NormalValueNat_TestID = vNatTestID + AND Nat_NormalValueNat_MethodeID = IFNULL(vSelectedMethodID, 0) + AND Nat_NormalValueIsActive = 'Y') > 0, + 'OK', + 'MISSING' + ), + CAST( + (SELECT COUNT(*) + FROM nat_normalvalue + WHERE Nat_NormalValueNat_TestID = vNatTestID + AND Nat_NormalValueNat_MethodeID = IFNULL(vSelectedMethodID, 0) + AND Nat_NormalValueIsActive = 'Y') AS CHAR + ), + 'Jumlah nat_normalvalue aktif untuk test + metode terpilih' + UNION ALL + SELECT + 'FN_RESULT', + IF(vFnNormalValueID IS NOT NULL AND vFnNormalValueID > 0, 'OK', 'NOT_FOUND'), + IFNULL(CAST(vFnNormalValueID AS CHAR), '0'), + 'Hasil akhir fn_sampling_get_normal' + ; + + IF vSelectedMethodID IS NOT NULL AND vSelectedMethodID > 0 THEN + SELECT + branch_name, + matched_count, + first_normalvalue_id + FROM ( + SELECT + 'TYPE_1' AS branch_name, + COUNT(*) AS matched_count, + MIN(Nat_NormalValueID) AS first_normalvalue_id + FROM nat_normalvalue + WHERE (Nat_NormalValueValidDate IS NULL OR Nat_NormalValueValidDate < NOW()) + AND Nat_NormalValueIsActive = 'Y' + AND Nat_NormalValueNat_NormalValueTypeID = 1 + AND Nat_NormalValueIsAbnormal = 'N' + AND Nat_NormalValueNat_MethodeID = vSelectedMethodID + AND Nat_NormalValueNat_TestID = vNatTestID + AND Nat_NormalValueNat_SexID = vPatientSexID + AND ( + (Nat_NormalValueMinAgeInclusive = 'Y' AND fn_normal_get_age(Nat_NormalValueMinAge, Nat_NormalValueAgeUnit) <= vAgeInDay) + OR (Nat_NormalValueMinAgeInclusive = 'N' AND fn_normal_get_age(Nat_NormalValueMinAge, Nat_NormalValueAgeUnit) < vAgeInDay) + ) + AND ( + (Nat_NormalValueMaxAgeInclusive = 'Y' AND fn_normal_get_age(Nat_NormalValueMaxAge, Nat_NormalValueAgeUnit) >= vAgeInDay) + OR (Nat_NormalValueMaxAgeInclusive = 'N' AND fn_normal_get_age(Nat_NormalValueMaxAge, Nat_NormalValueAgeUnit) > vAgeInDay) + ) + AND Nat_NormalValueNat_FlagID = 1 + + UNION ALL + + SELECT + 'TYPE_2', + COUNT(*), + MIN(Nat_NormalValueID) + FROM nat_normalvalue + WHERE (Nat_NormalValueValidDate IS NULL OR Nat_NormalValueValidDate < NOW()) + AND Nat_NormalValueIsActive = 'Y' + AND Nat_NormalValueNat_NormalValueTypeID = 2 + AND Nat_NormalValueIsAbnormal = 'N' + AND Nat_NormalValueNat_MethodeID = vSelectedMethodID + AND Nat_NormalValueNat_TestID = vNatTestID + AND ( + (Nat_NormalValueMinAgeInclusive = 'Y' AND fn_normal_get_age(Nat_NormalValueMinAge, Nat_NormalValueAgeUnit) <= vAgeInDay) + OR (Nat_NormalValueMinAgeInclusive = 'N' AND fn_normal_get_age(Nat_NormalValueMinAge, Nat_NormalValueAgeUnit) < vAgeInDay) + ) + AND ( + (Nat_NormalValueMaxAgeInclusive = 'Y' AND fn_normal_get_age(Nat_NormalValueMaxAge, Nat_NormalValueAgeUnit) >= vAgeInDay) + OR (Nat_NormalValueMaxAgeInclusive = 'N' AND fn_normal_get_age(Nat_NormalValueMaxAge, Nat_NormalValueAgeUnit) > vAgeInDay) + ) + AND Nat_NormalValueNat_FlagID = 1 + + UNION ALL + + SELECT + 'TYPE_3', + COUNT(*), + MIN(Nat_NormalValueID) + FROM nat_normalvalue + WHERE (Nat_NormalValueValidDate IS NULL OR Nat_NormalValueValidDate < NOW()) + AND Nat_NormalValueIsActive = 'Y' + AND Nat_NormalValueNat_NormalValueTypeID = 3 + AND Nat_NormalValueIsAbnormal = 'N' + AND Nat_NormalValueNat_MethodeID = vSelectedMethodID + AND Nat_NormalValueNat_TestID = vNatTestID + AND Nat_NormalValueNat_SexID = vPatientSexID + AND Nat_NormalValueNat_FlagID = 1 + + UNION ALL + + SELECT + 'TYPE_4', + COUNT(*), + MIN(Nat_NormalValueID) + FROM nat_normalvalue + WHERE (Nat_NormalValueValidDate IS NULL OR Nat_NormalValueValidDate < NOW()) + AND Nat_NormalValueIsActive = 'Y' + AND Nat_NormalValueNat_NormalValueTypeID = 4 + AND Nat_NormalValueIsAbnormal = 'N' + AND Nat_NormalValueNat_MethodeID = vSelectedMethodID + AND Nat_NormalValueNat_TestID = vNatTestID + AND Nat_NormalValueNat_FlagID = 1 + ) branch_summary; + ELSE + SELECT + 'NO_SELECTED_METHOD' AS branch_name, + 0 AS matched_count, + NULL AS first_normalvalue_id; + END IF; + + SELECT + nn.Nat_NormalValueID, + nn.Nat_NormalValueNat_TestID, + nn.Nat_NormalValueNat_MethodeID, + nm.Nat_MethodeName, + nn.Nat_NormalValueNat_NormalValueTypeID, + nn.Nat_NormalValueNat_SexID, + nn.Nat_NormalValueValidDate, + nn.Nat_NormalValueMinAge, + nn.Nat_NormalValueMaxAge, + nn.Nat_NormalValueAgeUnit, + nn.Nat_NormalValueMinAgeInclusive, + nn.Nat_NormalValueMaxAgeInclusive, + fn_normal_get_age(nn.Nat_NormalValueMinAge, nn.Nat_NormalValueAgeUnit) AS MinAgeInDay, + fn_normal_get_age(nn.Nat_NormalValueMaxAge, nn.Nat_NormalValueAgeUnit) AS MaxAgeInDay, + nn.Nat_NormalValueNat_FlagID, + nn.Nat_NormalValueIsAbnormal, + nn.Nat_NormalValueIsActive, + IF((nn.Nat_NormalValueValidDate IS NULL OR nn.Nat_NormalValueValidDate < NOW()), 'Y', 'N') AS MatchValidDate, + IF(nn.Nat_NormalValueIsActive = 'Y', 'Y', 'N') AS MatchActive, + IF(nn.Nat_NormalValueIsAbnormal = 'N', 'Y', 'N') AS MatchNotAbnormal, + IF(nn.Nat_NormalValueNat_FlagID = 1, 'Y', 'N') AS MatchFlag, + IF(nn.Nat_NormalValueNat_TestID = vNatTestID, 'Y', 'N') AS MatchNatTest, + IF(vSelectedMethodID IS NOT NULL AND nn.Nat_NormalValueNat_MethodeID = vSelectedMethodID, 'Y', 'N') AS MatchSelectedMethod, + IF(nn.Nat_NormalValueNat_SexID = vPatientSexID, 'Y', 'N') AS MatchSex, + IF( + (nn.Nat_NormalValueMinAgeInclusive = 'Y' AND fn_normal_get_age(nn.Nat_NormalValueMinAge, nn.Nat_NormalValueAgeUnit) <= vAgeInDay) + OR + (nn.Nat_NormalValueMinAgeInclusive = 'N' AND fn_normal_get_age(nn.Nat_NormalValueMinAge, nn.Nat_NormalValueAgeUnit) < vAgeInDay), + 'Y', + 'N' + ) AS MatchMinAge, + IF( + (nn.Nat_NormalValueMaxAgeInclusive = 'Y' AND fn_normal_get_age(nn.Nat_NormalValueMaxAge, nn.Nat_NormalValueAgeUnit) >= vAgeInDay) + OR + (nn.Nat_NormalValueMaxAgeInclusive = 'N' AND fn_normal_get_age(nn.Nat_NormalValueMaxAge, nn.Nat_NormalValueAgeUnit) > vAgeInDay), + 'Y', + 'N' + ) AS MatchMaxAge, + CASE + WHEN nn.Nat_NormalValueNat_NormalValueTypeID = 1 THEN + IF( + nn.Nat_NormalValueNat_SexID = vPatientSexID + AND ( + (nn.Nat_NormalValueMinAgeInclusive = 'Y' AND fn_normal_get_age(nn.Nat_NormalValueMinAge, nn.Nat_NormalValueAgeUnit) <= vAgeInDay) + OR + (nn.Nat_NormalValueMinAgeInclusive = 'N' AND fn_normal_get_age(nn.Nat_NormalValueMinAge, nn.Nat_NormalValueAgeUnit) < vAgeInDay) + ) + AND ( + (nn.Nat_NormalValueMaxAgeInclusive = 'Y' AND fn_normal_get_age(nn.Nat_NormalValueMaxAge, nn.Nat_NormalValueAgeUnit) >= vAgeInDay) + OR + (nn.Nat_NormalValueMaxAgeInclusive = 'N' AND fn_normal_get_age(nn.Nat_NormalValueMaxAge, nn.Nat_NormalValueAgeUnit) > vAgeInDay) + ), + 'Y', + 'N' + ) + WHEN nn.Nat_NormalValueNat_NormalValueTypeID = 2 THEN + IF( + ( + (nn.Nat_NormalValueMinAgeInclusive = 'Y' AND fn_normal_get_age(nn.Nat_NormalValueMinAge, nn.Nat_NormalValueAgeUnit) <= vAgeInDay) + OR + (nn.Nat_NormalValueMinAgeInclusive = 'N' AND fn_normal_get_age(nn.Nat_NormalValueMinAge, nn.Nat_NormalValueAgeUnit) < vAgeInDay) + ) + AND ( + (nn.Nat_NormalValueMaxAgeInclusive = 'Y' AND fn_normal_get_age(nn.Nat_NormalValueMaxAge, nn.Nat_NormalValueAgeUnit) >= vAgeInDay) + OR + (nn.Nat_NormalValueMaxAgeInclusive = 'N' AND fn_normal_get_age(nn.Nat_NormalValueMaxAge, nn.Nat_NormalValueAgeUnit) > vAgeInDay) + ), + 'Y', + 'N' + ) + WHEN nn.Nat_NormalValueNat_NormalValueTypeID = 3 THEN + IF(nn.Nat_NormalValueNat_SexID = vPatientSexID, 'Y', 'N') + WHEN nn.Nat_NormalValueNat_NormalValueTypeID = 4 THEN + 'Y' + ELSE + 'N' + END AS MatchTypeRule, + CONCAT_WS( + '; ', + IF(NOT (nn.Nat_NormalValueValidDate IS NULL OR nn.Nat_NormalValueValidDate < NOW()), 'valid_date_not_passed', NULL), + IF(nn.Nat_NormalValueIsActive <> 'Y', 'inactive', NULL), + IF(nn.Nat_NormalValueIsAbnormal <> 'N', 'abnormal_row', NULL), + IF(nn.Nat_NormalValueNat_FlagID <> 1, 'flag_not_1', NULL), + IF(nn.Nat_NormalValueNat_TestID <> vNatTestID, 'nat_test_mismatch', NULL), + IF(vSelectedMethodID IS NOT NULL AND nn.Nat_NormalValueNat_MethodeID <> vSelectedMethodID, 'methode_mismatch', NULL), + IF(nn.Nat_NormalValueNat_NormalValueTypeID IN (1,3) AND nn.Nat_NormalValueNat_SexID <> vPatientSexID, 'sex_mismatch', NULL), + IF( + nn.Nat_NormalValueNat_NormalValueTypeID IN (1,2) AND NOT ( + (nn.Nat_NormalValueMinAgeInclusive = 'Y' AND fn_normal_get_age(nn.Nat_NormalValueMinAge, nn.Nat_NormalValueAgeUnit) <= vAgeInDay) + OR + (nn.Nat_NormalValueMinAgeInclusive = 'N' AND fn_normal_get_age(nn.Nat_NormalValueMinAge, nn.Nat_NormalValueAgeUnit) < vAgeInDay) + ), + 'age_below_min', + NULL + ), + IF( + nn.Nat_NormalValueNat_NormalValueTypeID IN (1,2) AND NOT ( + (nn.Nat_NormalValueMaxAgeInclusive = 'Y' AND fn_normal_get_age(nn.Nat_NormalValueMaxAge, nn.Nat_NormalValueAgeUnit) >= vAgeInDay) + OR + (nn.Nat_NormalValueMaxAgeInclusive = 'N' AND fn_normal_get_age(nn.Nat_NormalValueMaxAge, nn.Nat_NormalValueAgeUnit) > vAgeInDay) + ), + 'age_above_max', + NULL + ) + ) AS FailReason + FROM nat_normalvalue nn + LEFT JOIN nat_methode nm + ON nm.Nat_MethodeID = nn.Nat_NormalValueNat_MethodeID + WHERE nn.Nat_NormalValueNat_TestID = vNatTestID + ORDER BY + CASE + WHEN vSelectedMethodID IS NOT NULL AND nn.Nat_NormalValueNat_MethodeID = vSelectedMethodID THEN 0 + ELSE 1 + END, + nn.Nat_NormalValueNat_MethodeID, + nn.Nat_NormalValueNat_NormalValueTypeID, + nn.Nat_NormalValueID; + END IF; +END$$ + +DELIMITER ; diff --git a/sql/manual_changes/2026-05-24-add-sp-sampling-fix-normal-by-orderdetail.sql b/sql/manual_changes/2026-05-24-add-sp-sampling-fix-normal-by-orderdetail.sql new file mode 100644 index 00000000..092ab41b --- /dev/null +++ b/sql/manual_changes/2026-05-24-add-sp-sampling-fix-normal-by-orderdetail.sql @@ -0,0 +1,194 @@ +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 ; diff --git a/sql/manual_changes/2026-05-24-fix-qr-printout-hosts-ibl.sql b/sql/manual_changes/2026-05-24-fix-qr-printout-hosts-ibl.sql new file mode 100644 index 00000000..d0a10de0 --- /dev/null +++ b/sql/manual_changes/2026-05-24-fix-qr-printout-hosts-ibl.sql @@ -0,0 +1,19 @@ +START TRANSACTION; + +UPDATE qr_printout +SET QR_PrintOutReportURL = REPLACE( + QR_PrintOutReportURL, + 'http://10.9.20.31', + 'http://localhost' + ) +WHERE QR_PrintOutReportURL LIKE 'http://10.9.20.31%'; + +UPDATE qr_printout +SET QR_PrintOutVerifyURL = REPLACE( + QR_PrintOutVerifyURL, + 'http://10.9.10.38:8899/xgw/', + 'http://devcpone.aplikasi.web.id/xgw/' + ) +WHERE QR_PrintOutVerifyURL LIKE 'http://10.9.10.38:8899/xgw/%'; + +COMMIT;