[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
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:
@ -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; }
|
||||
}
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user