[CLAUDE] PurchaseEvaluation: CCM 3-fix — multi-winner sum + budget=0 hợp lệ + cấp KẾT THÚC quy trình (Mig 58, anh Kiệt FDC)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m10s

CCM (Lưu Trần / anh Kiệt FDC) — làm 3/4 mục (mục 3 "CCM sửa ngân sách" để riêng):

1. Multi-winner: chọn NHIỀU NTP/NCC/ĐVDV cùng trúng → winnerQuoteTotal = SUM
   ThanhTien MỌI đơn vị isWinner (vd 3 ông 37.8+9+10 = 56.8tr). Cột mới
   PurchaseEvaluationSupplier.IsWinner (Mig 58, backfill từ SelectedSupplierId).
   SelectWinner → multi-toggle SupplierIds[]. FE: bảng so sánh tick nhiều ô +
   dòng "Tổng chi phí đã chọn"; mọi guard/checklist/computeGiaChaoThau/tạo-HĐ
   đổi sang isWinner (selectedSupplierId = null khi liên-danh ≥2).

2. Ngân sách = 0 hợp lệ: nới submit-guard + 3 validator (chỉ chặn khi NULL,
   số 0 cố ý đi qua; fallback ProInitial chỉ khi null). Mirror BE + FE.

3. Cấp KẾT THÚC quy trình: ApprovalWorkflowLevel.AllowApproverFinalize (Mig 58)
   — admin bật per-cấp trong Workflow Designer; duyệt tới cấp đó TỰ DaDuyet,
   bỏ qua CEO (AUTO theo cấu hình quy trình, không ô-tích runtime — anh Kiệt
   chốt). FE: banner cảnh báo + bắt chọn giá chốt.

Mig 58 AddPeMultiWinnerAndLevelFinalize (2 AddColumn bool + backfill IsWinner,
additive/reversible). Test 377→395 (+PeMultiWinnerTests +PeApproverFinalizeTests
+budget=0; auto-model gọn bớt 2 test bypass/opt-out). FE 2 app SHA-mirror.
Build sạch BE + 2 FE local.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-06-24 15:22:35 +07:00
parent ae4f106fd7
commit f1b10e9c33
26 changed files with 7578 additions and 245 deletions

View File

@ -130,5 +130,16 @@ public class ApprovalWorkflowLevel : BaseEntity
/// reinforced 3× cumulative. NO BACKFILL — 4 prod user lose value cũ per bro Option A.
public bool AllowApproverSkipToFinal { get; set; }
/// F5 (Mig 58 2026-06-24 — CCM/anh Kiệt FDC) — Cho phép NV slot này, khi duyệt
/// ở cấp của mình, KẾT THÚC quy trình luôn (Phase=DaDuyet) KHÔNG cần trình CEO/
/// các Bước-Cấp sau. Admin opt-in per slot trong Workflow Designer ("Duyệt là
/// kết thúc (không trình CEO)"). Default false. KHÁC AllowApproverSkipToFinal
/// (skip = advance pointer tới Cấp cuối, CEO vẫn ký thật): F5 = chính NV này
/// approve = terminal NGAY. Service ApproveV2Async TỰ finalize khi
/// matchingLevel.AllowApproverFinalize=true (AUTO theo cấu hình quy trình, anh Kiệt
/// chốt 2026-06-24 — KHÔNG ô-tích runtime; admin per-level designation = cổng duy
/// nhất, KHÔNG threshold/role check). Mirror F2/F3/F4 admin opt-in per-slot pattern.
public bool AllowApproverFinalize { get; set; }
public ApprovalWorkflowStep? Step { get; set; }
}

View File

@ -18,5 +18,14 @@ public class PurchaseEvaluationSupplier : BaseEntity
public string? Note { get; set; } // Chip trạng thái so sánh
public int Order { get; set; } // Thứ tự cột trong bảng so sánh
// [Mig 58 2026-06-24 — CCM/anh Kiệt FDC] Multi-winner: chọn NHIỀU đơn vị NCC/TP
// cùng trúng (whole-supplier multi-select). IsWinner=true → báo giá của đơn vị
// này tính vào "Giá trị kỳ này" (winnerQuoteTotal = SUM ThanhTien của MỌI
// winner). Thay tiêu chí cũ "SupplierId == SelectedSupplierId" (1 winner) bằng
// IsWinner trên supplier-row = nguồn-sự-thật mới. SelectedSupplierId vẫn sync:
// = winner duy nhất khi đúng 1, null khi ≥2 (multi). Backfill Mig 58:
// IsWinner=1 cho row khớp SelectedSupplierId cũ (single-winner phiếu UAT giữ).
public bool IsWinner { get; set; }
public PurchaseEvaluation? PurchaseEvaluation { get; set; }
}