[CLAUDE] Domain: Chunk A — Mig 31 swap F2 storage Users→ApprovalWorkflowLevels (Approver scope ChoDuyet)

Mig 31 RefactorSkipToFinalToApproverLevel — 2 stage manual reorder:
- ADD ApprovalWorkflowLevels.AllowApproverSkipToFinal bit NOT NULL DEFAULT 0
- DROP Users.AllowDrafterSkipToFinal (semantic mới khác hẳn — admin re-config qua Designer)
- NO BACKFILL (Option A — accept lose 4 prod user value per K0-bis audit)

Plan K refactor F2 semantic: Drafter from Nháp → Approver during ChoDuyet skip thẳng Cấp cuối.
Mirror F3+F4 admin opt-in per-Approver-slot pattern (Mig 29 + Mig 30) reinforced 3× cumulative.

Service line 121-157 F2 Drafter SUBMIT branch REMOVED stub (K2 sẽ add Approver F2 branch
trong APPROVE STEP line ~393-525). TransitionAsync skipToFinal param 8th KEPT cho K2 repurpose.

Application layer compile-break fix transient: UserDto field mapping + GET handler + LIST
handler + SetUserAllowDrafterSkipToFinalCommandHandler NoOp + PurchaseEvaluationFeatures
drafter flag → sentinel false. DTO + Command signature UNCHANGED (K2 chunk Chủ trì sẽ
refactor DTO/Command theo plan).

4 prod user (fin.pp + pm.nv + nv.test + truong.nguyen) lose AllowDrafterSkipToFinal=true
per bro Option A. Audit trail trong session log K8.

Verify:
- dotnet ef migrations add pass
- dotnet ef database update Dev + Design pass (Mig 31 applied both DB)
- dotnet build src/Backend/SolutionErp.Api production projects clean (0 err, 0 warn)
- dotnet test SKIPPED per UAT mode (memory feedback_uat_skip_verify) — K7 chunk fix
  remaining PurchaseEvaluationWorkflowServiceReturnModeTests.cs:253 reference

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-05-14 23:03:05 +07:00
parent 56868bfd7f
commit db6625304a
10 changed files with 4039 additions and 63 deletions

View File

@ -104,5 +104,13 @@ public class ApprovalWorkflowLevel : BaseEntity
/// Nháp/Trả lại — flag này CHỈ mở thêm scope cho Approver ChoDuyet.
public bool AllowApproverEditBudget { get; set; }
/// F2 (Mig 31 — S23 t1 Plan K) — REFACTOR semantic + storage từ
/// `Users.AllowDrafterSkipToFinal`. Cho phép NV slot này (khi đang duyệt
/// ChoDuyet) Approve skip thẳng Cấp cuối, bỏ qua mọi Bước/Cấp trung gian
/// còn lại. Default false (admin opt-in per slot). Mirror F3+F4 admin opt-in
/// per-Approver pattern (Mig 29 + Mig 30) reinforced 3× cumulative.
/// NO BACKFILL — 4 prod user lose value cũ per bro Option A.
public bool AllowApproverSkipToFinal { get; set; }
public ApprovalWorkflowStep? Step { get; set; }
}

View File

@ -28,12 +28,9 @@ public class User : IdentityUser<Guid>
// được sub-step đó. Null cho admin/system/external user.
public PositionLevel? PositionLevel { get; set; }
// Mig 29 (Session 21 turn 5) — F2 per-Drafter: cho phép user này (khi đóng
// vai Drafter) gửi PE thẳng Cấp cuối, skip mọi Bước/Cấp trung gian. Workspace
// hiện checkbox "Gửi thẳng Cấp cuối" conditional theo flag này.
//
// Mặc định false (an toàn). Admin set ở User Management page. Backfill
// Mig 29: bulk set TRUE cho user nào từng Drafter PE link workflow có
// workflow.AllowDrafterSkipToFinal=true (preserve admin config S21 t4).
public bool AllowDrafterSkipToFinal { get; set; }
// Mig 31 (S23 t1 Plan K Chunk A) — F2 semantic + storage REFACTOR:
// Drafter-skip-from-Nháp (cũ Mig 29) → Approver-skip-during-ChoDuyet (mới).
// Cờ chuyển sang `ApprovalWorkflowLevels.AllowApproverSkipToFinal` per-slot
// Approver (mirror F3+F4 admin opt-in per-Approver pattern). NO BACKFILL —
// 4 prod user accept lose value per bro Option A, admin re-config qua Designer.
}