[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
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:
@ -138,7 +138,7 @@ public class PurchaseEvaluationsController(IMediator mediator) : ControllerBase
|
||||
await mediator.Send(new TransitionPurchaseEvaluationCommand(
|
||||
id, body.TargetPhase, body.Decision, body.Comment,
|
||||
body.ReturnMode, body.ReturnTargetUserId, body.SkipToFinal,
|
||||
body.FinalizeByCcmDelegation, body.ApprovedPriceAmount, body.ApprovedPriceSource), ct);
|
||||
body.FinalizeByCcmDelegation, body.ApprovedPriceAmount, body.ApprovedPriceSource, body.ApplyLevelFinalize), ct);
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
@ -350,7 +350,9 @@ public record TransitionPeBody(
|
||||
// [Mig 54 2026-06-18 — anh Kiệt FDC] ③ CCM duyệt done miễn CEO + ① giá chốt.
|
||||
bool FinalizeByCcmDelegation = false,
|
||||
decimal? ApprovedPriceAmount = null,
|
||||
string? ApprovedPriceSource = null);
|
||||
string? ApprovedPriceSource = null,
|
||||
// [S96 2026-07-01 — anh Kiệt FDC] false = BỎ tick "Cấp này KẾT THÚC" → vẫn trình CEO.
|
||||
bool ApplyLevelFinalize = true);
|
||||
|
||||
public record AddSupplierBody(
|
||||
Guid SupplierId,
|
||||
|
||||
@ -478,7 +478,9 @@ public record TransitionPurchaseEvaluationCommand(
|
||||
// người duyệt cuối chọn (amount + source ∈ Ncc/ProMin/ProMax/Ccm).
|
||||
bool FinalizeByCcmDelegation = false,
|
||||
decimal? ApprovedPriceAmount = null,
|
||||
string? ApprovedPriceSource = null) : IRequest;
|
||||
string? ApprovedPriceSource = null,
|
||||
// [S96 2026-07-01 — anh Kiệt FDC] false = người duyệt BỎ tick "Cấp này KẾT THÚC" → vẫn trình CEO.
|
||||
bool ApplyLevelFinalize = true) : IRequest;
|
||||
|
||||
public class TransitionPurchaseEvaluationCommandValidator : AbstractValidator<TransitionPurchaseEvaluationCommand>
|
||||
{
|
||||
@ -531,6 +533,7 @@ public class TransitionPurchaseEvaluationCommandHandler(
|
||||
request.FinalizeByCcmDelegation,
|
||||
request.ApprovedPriceAmount,
|
||||
request.ApprovedPriceSource,
|
||||
request.ApplyLevelFinalize,
|
||||
ct);
|
||||
}
|
||||
}
|
||||
|
||||
@ -32,6 +32,10 @@ public interface IPurchaseEvaluationWorkflowService
|
||||
bool finalizeByCcmDelegation = false,
|
||||
decimal? approvedPriceAmount = null,
|
||||
string? approvedPriceSource = null,
|
||||
// [S96 2026-07-01 — anh Kiệt FDC] Người duyệt BỎ tick "Cấp này KẾT THÚC quy trình"
|
||||
// (AllowApproverFinalize) → false = KHÔNG finalize, vẫn trình tiếp CEO/cấp sau.
|
||||
// Default true = giữ hành vi cũ (cấp cấu hình finalize → auto kết thúc). Đảo S89 auto→opt-out.
|
||||
bool applyLevelFinalize = true,
|
||||
CancellationToken ct = default);
|
||||
|
||||
TimeSpan? GetPhaseSla(PurchaseEvaluationPhase phase);
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user