[CLAUDE] PurchaseEvaluation: endsBeforeCeo pointer-aware + duyệt theo khoảng Min–Max (Mig 66)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m26s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m26s
Hai chỉnh từ buổi UAT anh Kiệt FDC (S117): 1) Fix hiển thị lũy kế "duyệt rồi không bắt" — root cause là DISPLAY-LIE, không phải lũy kế bug. endsBeforeCeo cho phiếu CHƯA DaDuyet nay POINTER-AWARE: chỉ báo "kết thúc trước CEO" khi con-trỏ còn ở/trước cấp finalize. Phiếu đã đi QUA cấp finalize (approver bỏ tick "Cấp này KẾT THÚC" → trình tiếp CEO) → false: sơ đồ hết làm mờ Bước CEO + hết nói dối "Kết thúc tại Cấp X" khi phiếu đang chờ CEO. 3 site (detail in-memory + list/inbox EF-subquery). Filter lũy kế GIỮ nguyên (đúng nguyên tắc "duyệt rồi mới bắc"). BE-only — FE là consumer thuần nên tự render đúng. 2) Feature "duyệt theo KHOẢNG Min–Max": khi PRO có cả Min & Max, người duyệt cấp cuối chọn CẢ HAI (radio "PRO — cả Min và Max", source=ProMinMax) → Min ở ApprovedPriceAmount + Max ở ApprovedPriceMaxAmount (Mig 66 AddColumn nullable, no backfill, phiếu cũ nguyên vẹn). Bất-biến Max⟺ProMinMax, Min≤Max (guard ở service + validator). HĐ.GiaTri KHÔNG đọc giá chốt (= SUM báo giá NCC được chọn) → range thuần record-of-decision hiển thị, 0 tác động HĐ. FE 2-app SHA-mirror (Panel + DetailTabs). Test 495 → 501 (+1 pointer-aware repro, +5 ProMinMax). Cả 2 điều tra qua /fable-real engine-đắt (investigator-codebase deep-pass) theo yêu cầu anh Kiệt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -92,11 +92,18 @@ public class PurchaseEvaluation : AuditableEntity
|
||||
|
||||
// [Mig 54] Giá CHỐT người duyệt cấp cuối chọn khi duyệt (① "duyệt theo giá đề xuất").
|
||||
// Set tại MỌI nhánh DaDuyet của ApproveV2Async (terminal + CCM-delegation-finalize).
|
||||
// ApprovedPriceSource ∈ {Ncc, ProMin, ProMax, Ccm} = nguồn giá đã chọn; Amount =
|
||||
// ApprovedPriceSource ∈ {Ncc, ProMin, ProMax, Ccm, ProMinMax} = nguồn giá đã chọn; Amount =
|
||||
// snapshot giá trị lúc duyệt. Null cho phiếu duyệt trước Mig 54 hoặc luồng V1 legacy.
|
||||
public decimal? ApprovedPriceAmount { get; set; }
|
||||
public string? ApprovedPriceSource { get; set; }
|
||||
|
||||
// [S117 2026-07-14 — anh Kiệt FDC] "Duyệt theo KHOẢNG": khi PRO có cả Min & Max, người duyệt
|
||||
// chọn CẢ HAI (source="ProMinMax") → ApprovedPriceAmount = Min, ApprovedPriceMaxAmount = Max.
|
||||
// Bất-biến: ApprovedPriceMaxAmount != null ⟺ ApprovedPriceSource == "ProMinMax". Source đơn → null
|
||||
// (giữ nguyên Mig 54). Range thuần record-of-decision hiển thị — HĐ-gen KHÔNG đọc (GiaTri = SUM
|
||||
// báo giá NCC được chọn). Mig 66 AddColumn nullable, no backfill (phiếu cũ nguyên vẹn).
|
||||
public decimal? ApprovedPriceMaxAmount { get; set; }
|
||||
|
||||
// [S97 2026-07-01 — anh Kiệt FDC] RUNTIME fact: phiếu này ĐÃ kết thúc sớm bằng level-finalize
|
||||
// ("Duyệt thay CEO", short-circuit TRƯỚC cấp cuối/CEO)? Set true DUY NHẤT ở nhánh finalize của
|
||||
// ApproveV2Async. Default false = phiếu đi HẾT quy trình (qua CEO). Phân biệt CONFIG "workflow
|
||||
|
||||
Reference in New Issue
Block a user