[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
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:
@ -29,13 +29,15 @@ public record AwLevelDto(
|
|||||||
string? ApproverEmail,
|
string? ApproverEmail,
|
||||||
// Mig 29 (S21 t5) — 5 advanced options per slot Approver (F1 mode Trả lại
|
// 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.
|
// + 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 AllowReturnOneLevel,
|
||||||
bool AllowReturnOneStep,
|
bool AllowReturnOneStep,
|
||||||
bool AllowReturnToAssignee,
|
bool AllowReturnToAssignee,
|
||||||
bool AllowReturnToDrafter,
|
bool AllowReturnToDrafter,
|
||||||
bool AllowApproverEditDetails,
|
bool AllowApproverEditDetails,
|
||||||
bool AllowApproverEditBudget);
|
bool AllowApproverEditBudget,
|
||||||
|
bool AllowApproverSkipToFinal);
|
||||||
|
|
||||||
public record AwStepDto(
|
public record AwStepDto(
|
||||||
Guid Id,
|
Guid Id,
|
||||||
@ -152,10 +154,11 @@ public class GetAwAdminOverviewQueryHandler(
|
|||||||
s.Levels.OrderBy(l => l.Order).Select(l =>
|
s.Levels.OrderBy(l => l.Order).Select(l =>
|
||||||
{
|
{
|
||||||
users.TryGetValue(l.ApproverUserId, out var info);
|
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,
|
return new AwLevelDto(l.Id, l.Order, l.Name, l.ApproverUserId, info.FullName, info.Email,
|
||||||
l.AllowReturnOneLevel, l.AllowReturnOneStep, l.AllowReturnToAssignee,
|
l.AllowReturnOneLevel, l.AllowReturnOneStep, l.AllowReturnToAssignee,
|
||||||
l.AllowReturnToDrafter, l.AllowApproverEditDetails, l.AllowApproverEditBudget);
|
l.AllowReturnToDrafter, l.AllowApproverEditDetails, l.AllowApproverEditBudget,
|
||||||
|
l.AllowApproverSkipToFinal);
|
||||||
}).ToList()
|
}).ToList()
|
||||||
)).ToList());
|
)).ToList());
|
||||||
|
|
||||||
@ -185,15 +188,17 @@ public record CreateAwLevelInput(
|
|||||||
int Order,
|
int Order,
|
||||||
string? Name,
|
string? Name,
|
||||||
Guid ApproverUserId,
|
Guid ApproverUserId,
|
||||||
// Mig 29 (S21 t5) — 5 Allow* options per slot. Admin Designer tick per
|
// Mig 29 (S21 t5) + Mig 30 (S22+5) + Mig 31 (S23 t1) — 7 Allow* options per
|
||||||
// Level row. Default backward compat: AllowReturnToDrafter=true, 4 còn lại
|
// slot. Admin Designer tick per Level row. Default backward compat:
|
||||||
// false (admin opt-in từng slot). Mig 30 (S22+5) — F4 AllowApproverEditBudget.
|
// AllowReturnToDrafter=true (S17 fallback), 6 còn lại false (admin opt-in
|
||||||
|
// từng slot). Pattern proven 3× cumulative.
|
||||||
bool AllowReturnOneLevel = false,
|
bool AllowReturnOneLevel = false,
|
||||||
bool AllowReturnOneStep = false,
|
bool AllowReturnOneStep = false,
|
||||||
bool AllowReturnToAssignee = false,
|
bool AllowReturnToAssignee = false,
|
||||||
bool AllowReturnToDrafter = true,
|
bool AllowReturnToDrafter = true,
|
||||||
bool AllowApproverEditDetails = false,
|
bool AllowApproverEditDetails = false,
|
||||||
bool AllowApproverEditBudget = false);
|
bool AllowApproverEditBudget = false,
|
||||||
|
bool AllowApproverSkipToFinal = false);
|
||||||
|
|
||||||
public record CreateAwStepInput(
|
public record CreateAwStepInput(
|
||||||
int Order,
|
int Order,
|
||||||
@ -313,13 +318,14 @@ public class CreateAwDefinitionCommandHandler(IApplicationDbContext db)
|
|||||||
Order = l.Order,
|
Order = l.Order,
|
||||||
Name = l.Name,
|
Name = l.Name,
|
||||||
ApproverUserId = l.ApproverUserId,
|
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,
|
AllowReturnOneLevel = l.AllowReturnOneLevel,
|
||||||
AllowReturnOneStep = l.AllowReturnOneStep,
|
AllowReturnOneStep = l.AllowReturnOneStep,
|
||||||
AllowReturnToAssignee = l.AllowReturnToAssignee,
|
AllowReturnToAssignee = l.AllowReturnToAssignee,
|
||||||
AllowReturnToDrafter = l.AllowReturnToDrafter,
|
AllowReturnToDrafter = l.AllowReturnToDrafter,
|
||||||
AllowApproverEditDetails = l.AllowApproverEditDetails,
|
AllowApproverEditDetails = l.AllowApproverEditDetails,
|
||||||
AllowApproverEditBudget = l.AllowApproverEditBudget,
|
AllowApproverEditBudget = l.AllowApproverEditBudget,
|
||||||
|
AllowApproverSkipToFinal = l.AllowApproverSkipToFinal,
|
||||||
}).ToList(),
|
}).ToList(),
|
||||||
})
|
})
|
||||||
.ToList(),
|
.ToList(),
|
||||||
|
|||||||
Reference in New Issue
Block a user