[CLAUDE] ApprovalWorkflowsV2: Chunk H — K10 hotfix AwLevelDto wire AllowApproverSkipToFinal (Mig 31 admin DTO gap)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m23s

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) <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-05-14 23:58:19 +07:00
parent 098baa6da6
commit 0062fcb269

View File

@ -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(),