[CLAUDE] Contract: F-1 o-tich opt-in level-finalize man duyet KHKK (DTO expose co + UI x2 app, khuon PE-live S97)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 6m21s

Gate-K3 F-1 MAJOR: BE ApplyLevelFinalize ?? true ma 0 UI gui false => tram CEO
chi di duoc bang admin bo co Designer. Va: expose AllowApproverFinalize vao
ContractSigningPlanWorkflowLevelDto (1 site :640) + panel KHKK x2 app suy
actingLevel mirror ResolveActingLevel (own-truoc, Admin fallback First) + o-tich
OPT-IN khuon PE-live S97 (G-1 reviewer: default false — fail-mode an toan len CEO;
ratify treo so CHO-ANH) + body 3-field chi khi approve.

Reviewer PASS-WITH-FLAGS 7 (sub-reviewer-f1-checkbox.md): G-1 flip ap, G-5 bo
"(CEO)" ap, G-6 tach commit ap (K4a rieng), G-2/G-3/G-4 no nhip-K4, G-7 vao
commit K4a. Suite 614/0 + filter KHKK 34/34 + npm x2 + SHA-pair b37cd292.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-08-01 09:05:51 +07:00
parent 2cc22fde0f
commit 7a903cf108
5 changed files with 153 additions and 14 deletions

View File

@ -118,7 +118,11 @@ public record ContractSigningPlanWorkflowLevelDto(
int Order,
string? Name,
Guid ApproverUserId,
string? ApproverFullName);
string? ApproverFullName,
// [F-1 S166] Cờ per-Cấp cho ô-tích opt-out "Cấp này KẾT THÚC" ở panel duyệt (khuôn PE S96).
// FE mirror `ResolveActingLevel` (own-level trước, Admin fallback level đầu nhóm) để quyết
// hiện ô-tích — thiếu cờ này thì `applyLevelFinalize` của body transition không có UI nào gửi false.
bool AllowApproverFinalize);
public record ContractSigningPlanWorkflowStepDto(
Guid Id,
@ -635,7 +639,8 @@ public class GetContractSigningPlanQueryHandler(IApplicationDbContext db, ICurre
s.Id, s.Order, s.Name, s.DepartmentId,
s.Levels.OrderBy(l => l.Order).Select(l => new ContractSigningPlanWorkflowLevelDto(
l.Id, l.Order, l.Name, l.ApproverUserId,
approverNames.TryGetValue(l.ApproverUserId, out var fn) ? fn : null)).ToList()));
approverNames.TryGetValue(l.ApproverUserId, out var fn) ? fn : null,
l.AllowApproverFinalize)).ToList()));
foreach (var l in s.Levels)
levelMeta[l.Id] = (s.Order, s.Name, l.Order, l.ApproverUserId);