Files
BE_IBL/sql/manual_changes/2026-04-23-fix-resultentry-save-trigger-log-created.sql
2026-04-23 14:27:55 +07:00

347 lines
12 KiB
SQL

-- Date: 2026-04-23
-- Commit message stem: Fix resultentry save trigger log created
-- Target: devone / one_lab
-- Reason:
-- t_orderdetail_au failed on UPDATE with:
-- ERROR 1136 (21S01): Column count doesn't match value count at row 1
-- Root cause:
-- INSERT into one_lab_log.log_orderdetail listed Log_OrderDetailCreated
-- but did not provide a corresponding VALUES entry.
-- Fix:
-- restore the trigger and add NOW() for Log_OrderDetailCreated.
DELIMITER //
DROP TRIGGER IF EXISTS t_orderdetail_au//
CREATE TRIGGER t_orderdetail_au AFTER UPDATE ON t_orderdetail
FOR EACH ROW
BEGIN
DECLARE count_lab INTEGER;
DECLARE cnt_rst_a INTEGER;
DECLARE cnt_rst_b INTEGER;
DECLARE cnt_ver_n INTEGER;
DECLARE cnt_val_n INTEGER;
DECLARE cnt_rst CHAR(1);
DECLARE cnt_ver CHAR(1);
DECLARE cnt_val CHAR(1);
DECLARE ROUNDING double;
DECLARE TYPE_LOG VARCHAR(50);
DECLARE ref CHAR(1);
DECLARE ref_id INTEGER;
DECLARE nat_test_id INTEGER;
DECLARE curr_pre_analytic CHAR(1);
DECLARE pre_analytic CHAR(1) DEFAULT 'N';
DECLARE sumx DOUBLE;
SET sumx = 0;
SET sumx = (
SELECT SUM(IFNULL(T_OrderDetailTotal, 0))
FROM t_orderdetail
WHERE T_OrderDetailT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID
AND T_OrderDetailIsActive = 'Y'
);
SET sumx = (
SELECT SUM(IFNULL(T_OrderDetailTotal, 0))
FROM t_orderdetail
WHERE T_OrderDetailT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID
AND T_OrderDetailIsActive = 'Y'
);
IF sumx IS NULL THEN
SET sumx = 0;
END IF;
SET ROUNDING = MOD(sumx, 500);
SET sumx = sumx - MOD(sumx, 500);
UPDATE t_orderheader
SET T_OrderHeaderSubTotal = sumx,
T_OrderHeaderRounding = ROUNDING
WHERE T_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID;
IF NEW.T_OrderDetailIsActive = 'N'
AND OLD.T_OrderDetailIsActive = 'Y'
AND NEW.T_OrderDetailT_TestIsPrice = 'Y' THEN
INSERT INTO one_log.log_px(Log_PxCode, Log_PxJson, Log_PxUserID)
SELECT 'FO.DELPX',
JSON_OBJECT('test_id', NEW.T_OrderDetailT_TestID, 'old_is_active', 'Y', 'new_is_active', 'N'),
0;
END IF;
IF NEW.T_OrderDetailIsActive = 'N' AND OLD.T_OrderDetailIsActive = 'Y' THEN
UPDATE so_resultentry
SET So_ResultEntryIsActive = 'N'
WHERE So_ResultEntryT_OrderDetailID = NEW.T_OrderDetailID;
UPDATE t_samplingso
SET T_SamplingSoIsActive = 'N'
WHERE T_SamplingSoT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID
AND T_SamplingSoT_TestID = NEW.T_OrderDetailT_TestID;
SET count_lab = (
SELECT COUNT(T_OrderDetailID)
FROM t_orderdetail
JOIN t_test ON T_OrderDetailT_TestID = T_TestID
JOIN nat_group ON Nat_GroupID = T_TestNat_GroupID
AND Nat_GroupCode = 1
AND Nat_GroupIsActive = 'Y'
WHERE T_OrderDetailIsActive = 'Y'
AND T_OrderDetailT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID
);
IF count_lab = 0 THEN
UPDATE helper_order
SET Helper_OrderIsLAB = 'N'
WHERE Helper_OrderT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID;
ELSE
UPDATE helper_order
SET Helper_OrderIsLAB = 'Y'
WHERE Helper_OrderT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID;
END IF;
END IF;
IF NEW.T_OrderDetailT_TestIsResult = 'Y' THEN
SELECT COUNT(T_OrderDetailID),
SUM(IF(T_OrderDetailResult <> '' AND T_OrderDetailResult IS NOT NULL, 1, 0)),
SUM(IF(T_OrderDetailVerification = 'Y', 1, 0)),
SUM(IF(T_OrderDetailValidation = 'Y', 1, 0))
INTO cnt_rst_a, cnt_rst_b, cnt_ver_n, cnt_val_n
FROM t_orderdetail
JOIN t_test ON T_OrderDetailT_TestID = T_TestID
JOIN documentation_group_detail ON DocumentationGroupDetailNat_SubGroupID = T_TestNat_SubGroupID
AND DocumentationGroupDetailIsActive = 'Y'
JOIN documentation_group ON DocumentationGroupDetailDocumentationGroupID = DocumentationGroupID
AND DocumentationGroupName = 'lab'
WHERE T_OrderDetailIsActive = 'Y'
AND T_OrderDetailT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID
AND T_OrderDetailT_TestIsResult = 'Y';
IF OLD.T_OrderDetailResult <> NEW.T_OrderDetailResult THEN
IF cnt_rst_a = cnt_rst_b THEN
SET cnt_rst = 'Y';
ELSE
SET cnt_rst = 'N';
END IF;
UPDATE t_orderheaderaddon
SET T_OrderHeaderAddonResultDone = cnt_rst
WHERE T_OrderHeaderAddOnT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID;
END IF;
IF OLD.T_OrderDetailVerification <> NEW.T_OrderDetailVerification THEN
IF cnt_rst_a = cnt_ver_n THEN
SET cnt_ver = 'Y';
ELSE
SET cnt_ver = 'N';
END IF;
IF cnt_rst_a <> cnt_ver_n AND cnt_ver_n > 0 THEN
SET cnt_ver = 'P';
END IF;
UPDATE t_orderheaderaddon
SET T_OrderHeaderAddonVerificationDone = cnt_ver
WHERE T_OrderHeaderAddOnT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID;
END IF;
IF OLD.T_OrderDetailValidation <> NEW.T_OrderDetailValidation THEN
IF cnt_rst_a = cnt_val_n THEN
SET cnt_val = 'Y';
ELSE
SET cnt_val = 'N';
END IF;
IF cnt_rst_a <> cnt_val_n AND cnt_val_n > 0 THEN
SET cnt_val = 'P';
END IF;
UPDATE t_orderheaderaddon
SET T_OrderHeaderAddonValidationDone = cnt_val
WHERE T_OrderHeaderAddOnT_OrderHeaderID = NEW.T_OrderDetailT_OrderHeaderID;
END IF;
END IF;
IF NEW.T_OrderDetailT_TestIsResult = 'Y' THEN
IF NEW.T_OrderDetailResult <> OLD.T_OrderDetailResult
OR (NEW.T_OrderDetailResult IS NOT NULL AND OLD.T_OrderDetailResult IS NULL) THEN
SELECT T_OrderDetailAddOnRef, T_OrderDetailAddOnRefID
INTO ref, ref_id
FROM t_orderdetailaddon
WHERE T_OrderDetailAddOnT_OrderDetailID = NEW.T_OrderDetailID
AND T_OrderDetailAddOnIsActive = 'Y'
LIMIT 1;
IF ref = 'X' THEN
INSERT INTO xfer_internal(
Xfer_InternalType,
Xfer_InternalDataType,
Xfer_InternalSrcM_BranchID,
Xfer_InternalDestM_BranchID,
Xfer_InternalRefID,
Xfer_InternalJson
)
SELECT 'O',
'RES.RESULT',
Xfer_InternalDestM_BranchID,
Xfer_InternalSrcM_BranchID,
Xfer_InternalRefID,
JSON_OBJECT(
'ref_detail_id', Xfer_InternalDetailSrcRefID,
'test_id', NEW.T_OrderDetailT_TestID,
'test_result', NEW.T_OrderDetailResult,
'test_result_note', IFNULL(NEW.T_OrderDetailNote, ''),
'normal_id', NEW.T_OrderDetailNat_NormalValueID,
'methode_id', NEW.T_OrderDetailNat_MethodeID
)
FROM xfer_internaldetail
JOIN xfer_internal ON Xfer_InternalID = Xfer_InternalDetailXfer_InternalID
WHERE Xfer_InternalDetailID = ref_id;
END IF;
SET nat_test_id = (
SELECT T_TestNat_TestID
FROM t_test
WHERE T_TestID = NEW.T_OrderDetailT_TestID
);
SET curr_pre_analytic = (
SELECT T_OrderDetailAddOnPreAnalytic
FROM t_orderdetailaddon
WHERE T_OrderDetailAddOnT_OrderDetailID = NEW.T_OrderDetailID
AND T_OrderDetailAddOnIsActive = 'Y'
);
IF curr_pre_analytic = 'N' THEN
SET pre_analytic = (
SELECT PreAnalyticIsOk
FROM pre_analytic
WHERE PreAnalyticNat_TestID = nat_test_id
AND PreAnalyticDate = DATE(NOW())
AND PreAnalyticIsActive = 'Y'
LIMIT 1
);
IF pre_analytic IS NULL THEN
SET pre_analytic = 'N';
END IF;
UPDATE t_orderdetailaddon
SET T_OrderDetailAddOnPreAnalytic = pre_analytic,
T_OrderDetailAddOnPreAnalyticDate = NOW()
WHERE T_OrderDetailAddOnT_OrderDetailID = NEW.T_OrderDetailID;
END IF;
END IF;
IF OLD.T_OrderDetailVerification <> 'Y' AND NEW.T_OrderDetailVerification = 'Y' THEN
SELECT T_OrderDetailAddOnRef, T_OrderDetailAddOnRefID
INTO ref, ref_id
FROM t_orderdetailaddon
WHERE T_OrderDetailAddOnT_OrderDetailID = NEW.T_OrderDetailID
AND T_OrderDetailAddOnIsActive = 'Y'
LIMIT 1;
IF ref = 'X' THEN
INSERT INTO xfer_internal(
Xfer_InternalType,
Xfer_InternalDataType,
Xfer_InternalSrcM_BranchID,
Xfer_InternalDestM_BranchID,
Xfer_InternalRefID,
Xfer_InternalJson
)
SELECT 'O',
'RES.VERIFY',
Xfer_InternalDestM_BranchID,
Xfer_InternalSrcM_BranchID,
Xfer_InternalRefID,
JSON_OBJECT(
'ref_detail_id', Xfer_InternalDetailSrcRefID,
'test_id', NEW.T_OrderDetailT_TestID,
'test_result', NEW.T_OrderDetailResult,
'delta_check', NEW.T_OrderDetailVerDeltaCheck,
'trend_analysis', NEW.T_OrderDetailVerTrendAnalysis,
'verification', NEW.T_OrderDetailVerification,
'verification_date', NEW.T_OrderDetailVerDate,
'normal_id', NEW.T_OrderDetailNat_NormalValueID
)
FROM xfer_internaldetail
JOIN xfer_internal ON Xfer_InternalID = Xfer_InternalDetailXfer_InternalID
WHERE Xfer_InternalDetailID = ref_id;
END IF;
END IF;
END IF;
UPDATE t_orderdetail_ss
SET t_orderDetailSsH1Result = NEW.T_OrderDetailResult
WHERE t_orderDetailSsH1ID = NEW.T_OrderDetailID;
IF NEW.T_OrderDetailResult <> OLD.T_OrderDetailResult THEN
SET TYPE_LOG = 'RESULTENTRY_TR';
INSERT INTO one_lab_log.log_orderdetail(
Log_OrderDetailStatus,
Log_OrderDetailT_OrderDetailID,
Log_OrderDetailResult,
Log_OrderDetailJSON,
Log_OrderDetailCreated,
Log_OrderDetailUserID
)
VALUES(
TYPE_LOG,
NEW.T_OrderDetailID,
NEW.T_OrderDetailResult,
JSON_OBJECT(
'T_OrderDetailID', NEW.T_OrderDetailID,
'T_OrderDetailT_TestID', NEW.T_OrderDetailT_TestID,
'T_OrderDetailT_TestCode', NEW.T_OrderDetailT_TestCode,
'T_OrderDetailT_TestSasCode', NEW.T_OrderDetailT_TestSasCode,
'T_OrderDetailT_TestName', NEW.T_OrderDetailT_TestName,
'T_OrderDetailT_TestIsResult', NEW.T_OrderDetailT_TestIsResult,
'T_OrderDetailT_TestIsPrice', NEW.T_OrderDetailT_TestIsPrice,
'T_OrderDetailReq', NEW.T_OrderDetailReq,
'T_OrderDetailReqNote', NEW.T_OrderDetailReqNote,
'T_OrderDetailIsCito', NEW.T_OrderDetailIsCito,
'T_OrderDetailPrice', NEW.T_OrderDetailPrice,
'T_OrderDetailDisc', NEW.T_OrderDetailDisc,
'T_OrderDetailDiscAmount', NEW.T_OrderDetailDiscAmount,
'T_OrderDetailDiscTotal', NEW.T_OrderDetailDiscTotal,
'T_OrderDetailTotal', NEW.T_OrderDetailTotal,
'T_OrderDetailHasResult', NEW.T_OrderDetailHasResult,
'T_OrderDetailResult', NEW.T_OrderDetailResult,
'T_OrderDetailResult_OLD', OLD.T_OrderDetailResult,
'T_OrderDetailResultFlag', NEW.T_OrderDetailResultFlag,
'T_OrderDetailNote', NEW.T_OrderDetailNote,
'T_OrderDetailNat_UnitID', NEW.T_OrderDetailNat_UnitID,
'T_OrderDetailNat_UnitName', NEW.T_OrderDetailNat_UnitName,
'T_OrderDetailT_OrderPromiseID', NEW.T_OrderDetailT_OrderPromiseID,
'T_OrderDetailNat_InstrumentID', NEW.T_OrderDetailNat_InstrumentID,
'T_OrderDetailVerDeltaCheck', NEW.T_OrderDetailVerDeltaCheck,
'T_OrderDetailVerTrendAnalysis', NEW.T_OrderDetailVerTrendAnalysis,
'T_OrderDetailVerification', NEW.T_OrderDetailVerification,
'T_OrderDetailVerDate', NEW.T_OrderDetailVerDate,
'T_OrderDetailVerUserID', NEW.T_OrderDetailVerUserID,
'T_OrderDetailValMRState', NEW.T_OrderDetailValMRState,
'T_OrderDetailValidation', NEW.T_OrderDetailValidation,
'T_OrderDetailValDate', NEW.T_OrderDetailValDate,
'T_OrderDetailValUserID', NEW.T_OrderDetailValUserID,
'T_OrderDetailNat_NormalValueID', NEW.T_OrderDetailNat_NormalValueID,
'T_OrderDetailNormalValueNote', NEW.T_OrderDetailNormalValueNote,
'T_OrderDetailNormalValueDescription', NEW.T_OrderDetailNormalValueDescription,
'T_OrderDetailMinValue', NEW.T_OrderDetailMinValue,
'T_OrderDetailMaxValue', NEW.T_OrderDetailMaxValue
),
NOW(),
NEW.T_OrderDetailLastUpdatedUserID
);
END IF;
END//
DELIMITER ;