From 1263c0dd771122998ac302b7c1920d8057373fbe Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Tue, 23 Jun 2026 15:24:27 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20PurchaseEvaluation:=20ROOT=20FIX=20?= =?UTF-8?q?=E2=80=94=20S=E1=BB=ADa=20header=20KH=C3=94NG=20x=C3=B3a=20Quy?= =?UTF-8?q?=20tr=C3=ACnh=20duy=E1=BB=87t=20(bug-class=20S42,=20anh=20Ki?= =?UTF-8?q?=E1=BB=87t=20FDC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root-cause "chưa chọn quy trình duyệt" lặp lại (long.chau + nhiều account dù SQL-fix nhiều đợt): form Sửa header (PeHeaderForm → PUT /purchase-evaluations/{id}) KHÔNG gửi approvalWorkflowId → UpdatePurchaseEvaluationDraftCommandHandler absolute-set entity.ApprovalWorkflowId = null → XÓA workflow của phiếu (tạo CÓ workflow → bấm Sửa = MẤT → kẹt submit). ApprovalWorkflowId bị SÓT khỏi pattern null-safe (bug-class S42) mà BudgetPeriodAmount/ExpectedRemainingAmount/WorkItemId ngay dưới đã áp dụng ("client không gửi → GIỮ giá trị cũ"). Fix: null-safe — chỉ set ApprovalWorkflowId khi client CÓ gửi (preserve nếu không gửi). Đổi quy trình = FE phải gửi giá trị mới. + prod-data: gán QT-DN-V2-001 cho 5 phiếu bị clear (2 đợt 3+2). BE 1 file (UpdateDraftHandler). Test 371 PASS (no break — submit-guard S83 giữ nguyên). Co-Authored-By: Claude Opus 4.8 --- .../PurchaseEvaluations/PurchaseEvaluationFeatures.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Backend/SolutionErp.Application/PurchaseEvaluations/PurchaseEvaluationFeatures.cs b/src/Backend/SolutionErp.Application/PurchaseEvaluations/PurchaseEvaluationFeatures.cs index da162e5..7a850e3 100644 --- a/src/Backend/SolutionErp.Application/PurchaseEvaluations/PurchaseEvaluationFeatures.cs +++ b/src/Backend/SolutionErp.Application/PurchaseEvaluations/PurchaseEvaluationFeatures.cs @@ -279,7 +279,11 @@ public class UpdatePurchaseEvaluationDraftCommandHandler( entity.MoTa = request.MoTa; entity.HoSoLink = request.HoSoLink; // [HoSoLink] absolute-set như MoTa/DiaDiem (Section 1 text field, null = clear) entity.PaymentTerms = request.PaymentTerms; - entity.ApprovalWorkflowId = request.ApprovalWorkflowId; // Mig 23 — User đổi quy trình + // [S85 anh Kiet ROOT FIX bug-class S42] null-safe: form Sua KHONG gui approvalWorkflowId + // (tao co WF -> bam Sua = MAT WF -> ket submit "chua chon quy trinh" = root-cause whack-a-mole). + // Client khong gui field -> GIU WF cu (giong BudgetPeriodAmount duoi); doi WF thi FE phai gui gia tri. + if (request.ApprovalWorkflowId is not null) + entity.ApprovalWorkflowId = request.ApprovalWorkflowId; // Mig 23 — User đổi quy trình // [S61] null-safe 2 field ngân sách mới (mirror WorkItemId bên dưới): // client không gửi → GIỮ giá trị cũ, KHÔNG null-hóa (bug-class S42). if (request.BudgetPeriodAmount is not null)