[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

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:
pqhuy1987
2026-07-31 17:05:27 +07:00
parent 89b5bbee8a
commit 0779f2d45a
23 changed files with 8905 additions and 109 deletions

View File

@ -87,8 +87,10 @@ when-to-use:
| **65** | **`BackfillPeQuoteIsSelectedAndWinnerInvariant`** | **🎯 S114 DATA-ONLY no-schema (multi-NCC per hạng mục anh Kiệt): backfill **2-CHIỀU** thiết lập bất-biến `Supplier.IsWinner == Any(Quote.IsSelected)`. CHIỀU-1 `IsWinner→IsSelected` (phiếu whole-supplier winner Mig58 set IsSelected mọi quote NCC, **preserve tổng** winnerQuoteTotal) + CHIỀU-2 `IsSelected→IsWinner` (dormant/seed EXISTS). Idempotent (`WHERE ...=0`), SQL-Server-only (SQLite EnsureCreated bỏ qua migration), Down **no-op** (data backfill không reversible, mirror Mig 61). **No new table (89 giữ)** snapshot UNCHANGED (0 CreateColumn). Prod-verified bundle rotate ×2 `D51OYyGV`/`BVdssm5S`; commit `d436af2`. Kèm **gotcha #81** (delete-writer sót re-derive IsWinner phantom giaTri=0 verify-bắt).** |
| **66** | **`AddPeApprovedPriceRange`** | **🎯 S117 PE +`ApprovedPriceMaxAmount decimal(18,2)?` (feature "duyệt theo khoảng MinMax" anh Kiệt FDC "chọn cả 2 min max"): source `"ProMinMax"` = Amount(Min)+MaxAmount(Max), bất-biến `MaxAmount != null ⟺ Source=="ProMinMax"` + MinMax (guard service `ApplyApprovedPriceOnFinalize` + FluentValidation). 1 AddColumn nullable, **no backfill** (phiếu Source-đơn Max=null nguyên vẹn), **no new table (89 giữ)**, reversible Down (DropColumn). .GiaTri KHÔNG đọc giá chốt (=SUM báo giá NCC được chọn) 0 tác động (range = record-of-decision hiển thị). Prod-verified Run #387 (`ApprovedPriceMaxAmount` col decimal(18,2) + `__EFMigrationsHistory` top); commit `316a82f`.** |
| **67** | **`AddPeApprovedBudgetSnapshot`** | **🎯 S133 PE freeze ngân sách phiếu DaDuyet (UAT anh Kiệt: cập nhật NS gói thầu làm phiếu ĐÃ DUYỆT đổi số theo): snapshot **11 cột** AddColumn, chốt tại finalize choke-point + site-5 admin-override + backfill `Sql()` OUTER APPLY 18/18 phiếu prod; **no new table (89 giữ)**; display-gate `budgetFrozen` phiếu DaDuyet đọc snapshot 🔒 badge, phiếu chưa duyệt đọc live "bản cập nhật gần nhất"; reviewer bắt **#81-EXT indirect-assignment** (2 site gán Phase thẳng bypass choke-point FIXED + test site-5); test 509520 (+11 `PeBudgetFreezeTests`). Prod-verified Run #398 (mig top `20260717032812` + backfill 18/18); commit `d4fbced`.** *(row bổ sung @S151 — ring1 TRƯỢT-1 bắt bảng dừng ở 66 trong khi canonical Mig 67)* |
| **68** | **`AddPeAllowApproverDelete`** | **🎯 S157 PE nút XÓA phiếu màn duyệt: +`AllowApproverDelete bit` trên **`ApprovalWorkflowLevels`** (config PER-CẤP-DUYỆT, KHÔNG phải cột trên PE admin bật cấp nào được xóa phiếu ngay màn duyệt). 1 AddColumn, **no new table (89 giữ)**, reversible Down (DropColumn). Ship 2 đợt `b1bae77`+`4464a46`+`f4494cf`, cicd PASS, test 532562; byte-verify marker `allowApproverDelete`/`by-approver`/`deleted=1` (S156).** |
| **69** | **`AddContractSigningPlans`** | **🎯 S161 module MỚI Kế hoạch kết (KHKK): **7 `CreateTable`** `ContractSigningPlans` + `~Approvals` + `~Attachments` + `~Changelogs` + `~DossierItems` + `~LevelOpinions` + `~Lines` **89→96 bảng**, mirror khuôn PE/Contract V2 (Approvals/Changelogs/LevelOpinions tách vai). Menu-key `KeHoachKyKet` sinh **policy** KHÔNG sinh menu-row; 15 policy CRUD+Dossier (W2); duyệt V2 3-trạm (W3); 🔴 gotcha **#85** gate FE dùng đúng key policy endpoint, KHÔNG OR key con. Commit `a8027c0` (W1/5 wave S161).** |
Total: **89 bảng** `sys.tables` (= 88 dbo-app + `__EFMigrationsHistory`; re-ground S97 cicd Run #482 LIVE số canonical `docs/STATUS.md`; last schema-changing Mig 50 net 9388-app, Mig 51-66 đều AddColumn/index/data-only/schema-expand không đổi số bảng). Xem `docs/database/schema-diagram.md` migration table + §11-15 module ERD 16+ Mig 27-66 chi tiết pending).
Total: **97 bảng** `sys.tables` (= 96 dbo-app + `__EFMigrationsHistory`; số canonical `docs/STATUS.md`; last schema-changing **Mig 70 `AddContractCatalogEntries` +1 bảng 96→97 (S164/S165 K1 SP-002, commit `50e6d8c`)** Mig 71 `AddKhkkApprovalGroupCatalogAndFinalizeRuntime` (K2) = AddColumn ×4 + index-swap unique 3-cột + backfill, 0 CreateTable; trước đó Mig 69 +7 bảng KHKK 8996, Mig 50 net 9388-app, Mig 51-68 đều AddColumn/index/data-only không đổi số bảng). Xem `docs/database/schema-diagram.md` migration table + §11-15 module ERD 16+ Mig 27-66 chi tiết pending).
## N-stage workflow pattern (Mig 18-20 — Session 12-13)