[CLAUDE] Contract: K2 SP-002 phieu KHKK mang hang-muc + nhom duyet N1-8 (Mig 71) + FE x2 app + 11 test
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 6m12s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 6m12s
Mig 71 AddKhkkApprovalGroupCatalogAndFinalizeRuntime: +ApprovalGroup (backfill=1)
+EndedByLevelFinalize (K2 de, K3 tieu - ghost-window khai) + Line +CatalogEntryId/
TenHangMuc + unique (Plan,Supplier,CatalogEntry) filtered IsDeleted=0. Rao
1-PE-1-phieu doi (PeId,ApprovalGroup) 2 site + picker OG-7 ExistingGroups + nut
'Tao them cho nhom khac'. Submit-guard va-5 (CHAN null, thang nen cho-qua-legacy;
ghost-window K2->K4b khai) + dem-so-khop (gate F-1: bit duong hang-muc xoa-mem).
List ?group= end-to-end + Tong-Approved list (va-8). FE: select nhom default 1 +
badge N{g} + cot Hang-muc + cot Tong-duyet, SHA-pair 5/5. Gate K2 PASS-WITH-FLAGS
10f: F-1 guard fix + 2 test bit (xoa-mem chan + reflection ?group=); F-2/F-5/F-7/
F-8/F-9 comment-honest; F-3/F-4 docs-delta. Suite 609/0 (45D+564I). Wave co #53 x5,
artifact + relaunch-cat-got cuu 100% (0 mat cong).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@ -30,6 +30,26 @@ public class ContractSigningPlan : AuditableEntity
|
||||
|
||||
public ContractSigningPlanPhase Phase { get; set; } = ContractSigningPlanPhase.DangSoanThao;
|
||||
|
||||
// [K2 Mig 71 — S164] NHÓM DUYỆT 1..8 (N1..N8 theo SOL-CCM-SP-002). 1 phiếu = 1 nhóm,
|
||||
// N hạng mục CÙNG nhóm. Phiếu cũ backfill = 1 (Mig 71 `Sql UPDATE`) ⇒ COUNT(phiếu) ==
|
||||
// Σ COUNT 8 folder, không có phiếu nào rơi ngoài cây.
|
||||
// 🔴 K2 là CHỦ DUY NHẤT của cột này (QĐ-3/spec §②-3): K3 chỉ ĐỌC (map Code `KHKK-N{n}`
|
||||
// ↔ group + validator phiếu-pin-đúng-nhóm). Range 1..8 gác bằng validator, KHÔNG CHECK
|
||||
// constraint (khuôn repo: `ContractCatalogEntry.ApprovalGroup` cũng vậy).
|
||||
// 🔴 [gate-K2 F-9] Mig 71 để DEFAULT constraint 0 (AddColumn) — app LUÔN set giá trị;
|
||||
// CẤM INSERT SQL thô (họ #84): SQL thô sẽ ra nhóm 0 ngoài dải 1..8, rơi khỏi cây 8 folder câm lặng.
|
||||
public int ApprovalGroup { get; set; } = 1;
|
||||
|
||||
// [K2 Mig 71 — S164, forward-provision cho K3] Cờ RUNTIME "phiếu kết thúc SỚM bằng
|
||||
// level-finalize" (approver ở Cấp có `AllowApproverFinalize` tick kết-thúc-tại-đây).
|
||||
// 🔴 GHOST-WINDOW KHAI TRƯỚC: K2 ĐẺ cột, K3 TIÊU THỤ. Từ lúc K2 land tới lúc K3 land,
|
||||
// cột này NẰM IM = luôn false, KHÔNG có site nào ghi (service KHKK hiện chỉ có đúng một
|
||||
// nhánh set DaDuyet — `ContractSigningPlanWorkflowService.cs:277-278` — và nhánh đó là
|
||||
// đường THƯỜNG, không phải finalize sớm). Cố ý gộp vào Mig 71 để K3 = 0-mig
|
||||
// (spec §②-9 + vá-7 item-6). Đọc RUNTIME chứ không suy từ CONFIG = né tái diễn #78
|
||||
// (PE S97: phiếu opt-out vẫn lên CEO mà display suy từ cờ config nên báo sai).
|
||||
public bool EndedByLevelFinalize { get; set; }
|
||||
|
||||
// Workflow V2 pin (ApplicableType = ContractSigningPlan = 10). Con-trỏ ĐÔI mirror PE:
|
||||
// StepIndex 0-based (Bước) + LevelOrder 1-based (Cấp trong Bước). Null khi terminal.
|
||||
public Guid? ApprovalWorkflowId { get; set; }
|
||||
|
||||
@ -14,6 +14,18 @@ public class ContractSigningPlanLine : AuditableEntity
|
||||
public Guid ContractSigningPlanId { get; set; }
|
||||
public Guid SupplierId { get; set; } // loose-Guid (KHÔNG FK vật lý sang Suppliers)
|
||||
|
||||
// [K2 Mig 71 — S164] Hạng mục danh mục SP-002 của dòng này (→ `ContractCatalogEntries.Id`).
|
||||
// 🔴 loose-Guid KHÔNG FK VẬT LÝ — mirror `PurchaseEvaluation.WorkItemId` (Mig 49) và
|
||||
// chính `SupplierId` ngay trên: convention module là mọi con trỏ ra ngoài module đều
|
||||
// loose. Thêm FK thật ở đây = phá khuôn + chặn soft-delete dòng danh mục.
|
||||
// NULL = dòng legacy (phiếu lập trước K2) hoặc dòng vừa auto-sinh chưa gán hạng mục.
|
||||
// Trình duyệt thì BẮT BUỘC có (submit-guard `ContractSigningPlanWorkflowService`).
|
||||
public Guid? CatalogEntryId { get; set; }
|
||||
|
||||
// Denorm tên hạng mục TẠI THỜI ĐIỂM GÁN — danh mục đổi tên sau KHÔNG viết lại lịch sử
|
||||
// phiếu (khuôn `SignedByFullName` Mig 26). Đọc để hiển thị; đừng join ngược lấy tên mới.
|
||||
public string? TenHangMuc { get; set; }
|
||||
|
||||
// SNAPSHOT tổng báo giá của NCC này trên phiếu PE (SUM Quote.IsSelected) tại thời
|
||||
// điểm TẠO kế hoạch — chụp 1 lần, KHÔNG đọc live (PE sửa sau không được làm trôi
|
||||
// số của kế hoạch đã lập; cùng triết lý freeze ngân sách Mig 67).
|
||||
|
||||
Reference in New Issue
Block a user