[CLAUDE] PurchaseEvaluation: ô "Cấp này KẾT THÚC quy trình" → opt-out bỏ-tick-được (anh Kiệt FDC)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m12s

anh Kiệt UAT "cái này option thôi chứ e" — cấp cấu hình AllowApproverFinalize (Mig 58, S89 auto-finalize im lặng) NAY là ô-tích BỎ được:
- Default checked = giữ hành vi cũ (duyệt xong KẾT THÚC, không lên CEO) — backward-compat.
- BỎ tick (applyLevelFinalize=false) → KHÔNG finalize, trình tiếp CEO/cấp sau; giá chốt ẩn (CEO chọn sau).

BE: +param applyLevelFinalize (default true) xuyên interface → service (finalize guard `&& applyLevelFinalize`) → command → handler → controller body. FE: ô xanh static → checkbox 2 app (fe-admin+fe-user SHA-mirror) + hint động + sendPrice/shouldPickPrice gate theo cờ. Test: +test #6 opt-out→advance-to-CEO (spec change; #1-5 backward-compat giữ). Build slnx + 2 FE PASS 0-err; test 434→435.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-01 15:39:24 +07:00
parent ba4b8e0339
commit e657faa74a
7 changed files with 130 additions and 25 deletions

View File

@ -47,6 +47,7 @@ public class PurchaseEvaluationWorkflowService(
bool finalizeByCcmDelegation = false,
decimal? approvedPriceAmount = null,
string? approvedPriceSource = null,
bool applyLevelFinalize = true,
CancellationToken ct = default)
{
var fromPhase = evaluation.Phase;
@ -272,7 +273,7 @@ public class PurchaseEvaluationWorkflowService(
// V2 path nhận flag, V1 legacy throw nếu non-admin gọi skipToFinal=true.
if (evaluation.ApprovalWorkflowId is Guid awId)
{
await ApproveV2Async(evaluation, awId, actorUserId, actorRoles, isAdmin, isSystem, comment, skipToFinal, finalizeByCcmDelegation, approvedPriceAmount, approvedPriceSource, ct);
await ApproveV2Async(evaluation, awId, actorUserId, actorRoles, isAdmin, isSystem, comment, skipToFinal, finalizeByCcmDelegation, approvedPriceAmount, approvedPriceSource, applyLevelFinalize, ct);
}
else
{
@ -694,6 +695,7 @@ public class PurchaseEvaluationWorkflowService(
bool finalizeByCcmDelegation,
decimal? approvedPriceAmount,
string? approvedPriceSource,
bool applyLevelFinalize,
CancellationToken ct)
{
var aw = await db.ApprovalWorkflows.AsNoTracking()
@ -858,7 +860,11 @@ public class PurchaseEvaluationWorkflowService(
// hay hơn"). KHÔNG threshold/role-gate (admin chỉ-định slot = đủ thẩm quyền). ① giá chốt:
// người duyệt phải chọn (Conflict nếu thiếu, isSystem miễn). Đặt SAU skipToFinal, TRƯỚC
// ccm-delegation + advance.
if (matchingLevel.AllowApproverFinalize)
// [S96 2026-07-01 — anh Kiệt FDC] Cấp cấu hình KẾT THÚC (AllowApproverFinalize) NAY là
// OPT-OUT: người duyệt BỎ tick "Cấp này KẾT THÚC quy trình" (applyLevelFinalize=false) →
// KHÔNG finalize, rơi xuống advance bình thường → trình tiếp CEO/cấp sau. Đảo S89 (2026-06-24
// auto-finalize im lặng) theo phản hồi UAT "cái này option thôi". Default true = giữ auto cũ.
if (matchingLevel.AllowApproverFinalize && applyLevelFinalize)
{
ApplyApprovedPriceOnFinalize(evaluation, isSystem, approvedPriceAmount, approvedPriceSource);
evaluation.Phase = PurchaseEvaluationPhase.DaDuyet;