From 0062fcb269faab7deb37d202a234d35312119c1e Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Thu, 14 May 2026 23:58:19 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20ApprovalWorkflowsV2:=20Chunk=20H=20?= =?UTF-8?q?=E2=80=94=20K10=20hotfix=20AwLevelDto=20wire=20AllowApproverSki?= =?UTF-8?q?pToFinal=20(Mig=2031=20admin=20DTO=20gap)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CICD Monitor K9 catch: GET /api/approval-workflows-v2 response thiếu field `allowApproverSkipToFinal` trong levels[]. Mig 31 column added Levels + Service ApproveV2Async wire (K2) + PE bundle DTO ApprovalWorkflowOptionsDto wire (K2) + FE Designer 7th checkbox UI (K3) đầy đủ — NHƯNG `AwLevelDto` admin overview DTO chưa wire field → round-trip Designer create/update fail (em main K2 design gap, Reviewer K2 cũng miss audit ApprovalWorkflowV2AdminFeatures). 4 edits ApprovalWorkflowV2AdminFeatures.cs: 1. AwLevelDto record +AllowApproverSkipToFinal field (7th — sau AllowApproverEditBudget) 2. ToDto handler (GetAwAdminOverviewQueryHandler) ctor call +l.AllowApproverSkipToFinal 3. CreateAwLevelInput record +AllowApproverSkipToFinal=false default (admin opt-in) 4. CreateAwDefinitionCommandHandler entity init +AllowApproverSkipToFinal = l.AllowApproverSkipToFinal Pattern lesson: per-NV admin opt-in flag wire 6 surface points required (entity + EF config + Mig + Service guard + PE bundle DTO + ApprovalWorkflowOptionsDto + FE Designer + admin AwLevelDto + Create input). Mig 30 F4 đã có same gap risk ban đầu (S22+5 needed full wire). Update memory `feedback_per_nv_permission_scope` checklist add "admin AwLevelDto + Create input wire" cho future flag F5+. Verify: - dotnet build production projects clean (0 err, 2 pre-existing DocxRenderer warn) - Awaiting CICD Monitor K11 verify post-deploy (GET /api/approval-workflows-v2 levels[].allowApproverSkipToFinal field PRESENT + Designer round-trip OK) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../ApprovalWorkflowV2AdminFeatures.cs | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Backend/SolutionErp.Application/ApprovalWorkflowsV2/ApprovalWorkflowV2AdminFeatures.cs b/src/Backend/SolutionErp.Application/ApprovalWorkflowsV2/ApprovalWorkflowV2AdminFeatures.cs index 8130d62..646ca61 100644 --- a/src/Backend/SolutionErp.Application/ApprovalWorkflowsV2/ApprovalWorkflowV2AdminFeatures.cs +++ b/src/Backend/SolutionErp.Application/ApprovalWorkflowsV2/ApprovalWorkflowV2AdminFeatures.cs @@ -29,13 +29,15 @@ public record AwLevelDto( string? ApproverEmail, // Mig 29 (S21 t5) — 5 advanced options per slot Approver (F1 mode Trả lại // + F3 Edit Section 2). Mig 30 (S22+5) — F4 +AllowApproverEditBudget. - // Mỗi NV trong workflow có quyền riêng. + // Mig 31 (S23 t1) — F2 +AllowApproverSkipToFinal (refactor sang Approver scope ChoDuyet). + // Mỗi NV trong workflow có quyền riêng — 7 Allow* cumulative. bool AllowReturnOneLevel, bool AllowReturnOneStep, bool AllowReturnToAssignee, bool AllowReturnToDrafter, bool AllowApproverEditDetails, - bool AllowApproverEditBudget); + bool AllowApproverEditBudget, + bool AllowApproverSkipToFinal); public record AwStepDto( Guid Id, @@ -152,10 +154,11 @@ public class GetAwAdminOverviewQueryHandler( s.Levels.OrderBy(l => l.Order).Select(l => { users.TryGetValue(l.ApproverUserId, out var info); - // Mig 29 (S21 t5) — 5 Allow* flag per slot Level + // Mig 29 (S21 t5) + Mig 30 (S22+5) + Mig 31 (S23 t1) — 7 Allow* flag per slot Level return new AwLevelDto(l.Id, l.Order, l.Name, l.ApproverUserId, info.FullName, info.Email, l.AllowReturnOneLevel, l.AllowReturnOneStep, l.AllowReturnToAssignee, - l.AllowReturnToDrafter, l.AllowApproverEditDetails, l.AllowApproverEditBudget); + l.AllowReturnToDrafter, l.AllowApproverEditDetails, l.AllowApproverEditBudget, + l.AllowApproverSkipToFinal); }).ToList() )).ToList()); @@ -185,15 +188,17 @@ public record CreateAwLevelInput( int Order, string? Name, Guid ApproverUserId, - // Mig 29 (S21 t5) — 5 Allow* options per slot. Admin Designer tick per - // Level row. Default backward compat: AllowReturnToDrafter=true, 4 còn lại - // false (admin opt-in từng slot). Mig 30 (S22+5) — F4 AllowApproverEditBudget. + // Mig 29 (S21 t5) + Mig 30 (S22+5) + Mig 31 (S23 t1) — 7 Allow* options per + // slot. Admin Designer tick per Level row. Default backward compat: + // AllowReturnToDrafter=true (S17 fallback), 6 còn lại false (admin opt-in + // từng slot). Pattern proven 3× cumulative. bool AllowReturnOneLevel = false, bool AllowReturnOneStep = false, bool AllowReturnToAssignee = false, bool AllowReturnToDrafter = true, bool AllowApproverEditDetails = false, - bool AllowApproverEditBudget = false); + bool AllowApproverEditBudget = false, + bool AllowApproverSkipToFinal = false); public record CreateAwStepInput( int Order, @@ -313,13 +318,14 @@ public class CreateAwDefinitionCommandHandler(IApplicationDbContext db) Order = l.Order, Name = l.Name, ApproverUserId = l.ApproverUserId, - // Mig 29 (S21 t5) — 5 Allow* per slot + // Mig 29 (S21 t5) + Mig 30 (S22+5) + Mig 31 (S23 t1) — 7 Allow* per slot AllowReturnOneLevel = l.AllowReturnOneLevel, AllowReturnOneStep = l.AllowReturnOneStep, AllowReturnToAssignee = l.AllowReturnToAssignee, AllowReturnToDrafter = l.AllowReturnToDrafter, AllowApproverEditDetails = l.AllowApproverEditDetails, AllowApproverEditBudget = l.AllowApproverEditBudget, + AllowApproverSkipToFinal = l.AllowApproverSkipToFinal, }).ToList(), }) .ToList(),