Files
solution-erp/.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-k8-dryrun.md
2026-08-01 17:06:45 +07:00

70 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

K8-DRYRUN: ĐANG CHẠY — B0 PASS (backup 26,6MB + roster LIVE + login admin OK); B1.. đổ ruột liên tục bên dưới
# sub-k8-dryrun — K8 dry-run E2E toàn trình (S168, 2026-08-01)
> Mandate owner @S168 (verbatim): *"Chạy dry-run hết luôn đi rồi tao giao tiếp plan khác"*.
> Kịch bản = spec-cụm3 §③ K8 + bảng B0-B16 (`sub-invest-fable-b2-cum3.md` K8.1) + **vá-9..15 spec-final THẮNG nền**.
> 🔴 Vá-12 owner-ratified @S164 *"tạo PE Test SOLUTION-PE-1,2,3… không test trên phiếu thật"* ⇒ **bộ test RIÊNG** (Project+NCC+gói ZZTEST/SOLUTION-PE-{n}), **KHÔNG đụng `PE/2026/A/049`** — câu giờ-G K8.2 của bản nền coi như ĐÃ trả.
> Người bấm mọi bước hôm nay = **admin (duyệt thay — SignedByUserId track, banner "Admin duyệt thay" by-design)**; cột "Ai (thật)" trong form = roster LIVE để buổi chạy với người thật dùng lại.
## B0 — PRE-FLIGHT (fail-closed) — ✅ PASS 16:2x-16:3x +07
- (i) **Backup prod:** `C:\Backups\SolutionErp\SolutionErp_preK8_S168.bak` — 27.877.888 B @ 2026-08-01 16:28 (BACKUP DATABASE 3393 pages OK). *(Script `scripts/backup-sql.ps1` default `D:\` — VPS KHÔNG có ổ D ⇒ dùng `C:\Backups`; default ĐÃ VÁ `C:\` @S168 cùng lượt.)*
- (ii) **Workflow LIVE (sqlcmd -E; ⚠️ `$env:PROD_DB_PASSWORD` KHÔNG tồn tại cả 3 scope trên VPS — persona-note stale cùng lớp F-9):**
- type-1 PE: `QT-DN-V2-001` active+selectable · 3 trạm (P1: 4NV L1 + tra.bui L2[SkipToFinal,Delete] · P2: 4NV L1 + **chuong.phan L2 [Finalize=1,SkipToFinal,Delete]** · P3: truong.nguyen [SkipToFinal]).
- type-10 KHKK: **đủ 8 nhóm N1-N8 active**; `KHKK-N4` 3 trạm 11 người (Cung ứng: 4NV+tra.bui · Kiểm soát CP: 4NV+**chuong.phan [Finalize=1]** · BGĐ: truong.nguyen) — khớp anchor OG-3/OG-9.
- type-3 HĐ: `QT-HD-V2-001` active — **1 trạm 1 người: binh.le (Bước 1 - Phòng CCM)**.
- (ii-b) Catalog: `ContractCatalogEntries` = **86** dòng; nhóm-4 mẫu B1-01 Đá · B1-02 Cát · B1-03 Cọc tràm · B1-04 Bê tông · **B1-05 Xi măng (chọn cho line test)** · B1-06 Thép.
- (iii) Dữ liệu test sẵn có: Projects ZZTEST = **0** · Suppliers TEST = **0** ⇒ TẠO MỚI qua API (GĐ0 dưới). Contracts prod = **0** (HĐ dry-run sẽ là HĐ ĐẦU TIÊN trên prod — seq cháy thuộc cặp prefix TEST, vô hại data thật).
- (iv) **Dặn team:** em KHÔNG có kênh Zalo/email — thay bằng ZZTEST-prefix mọi bản ghi + mục này để anh nhắn team *"notification phiếu ZZTEST trong hôm nay — bỏ qua"*. KHAI trade-off, không im.
- (v) Login API prod: `POST /api/auth/login` admin OK (accessToken 468c — field `accessToken` đúng bài S160).
## B0-FORM 14 dòng {bước · người THẬT (roster LIVE) · tài khoản · ai bấm hôm nay} — vá-9 fail-closed
| B | Ai (thật, theo roster LIVE) | Tài khoản | Hôm nay |
|---|---|---|---|
| B1-B3 | BCH drafter (đại diện Cung ứng: Nguyễn Văn Duy) | duy.nguyen@solutions.com.vn | admin (tạo thay) |
| B4 | Trạm-1 PE/KHKK — 1 trong {duy.nguyen · binh.lethanh · long.chau · phuong.nguyen} + L2 tra.bui | (4+1 tài khoản trên) | admin duyệt thay |
| B5 | Trạm-2 — 1 trong {luu.tran · nguyen.ho · binh.le · truong.letrandang} | (4 tài khoản) | admin duyệt thay |
| B6 | **TP.CCM Phan Văn Chương (Finalize)** | chuong.phan@solutions.com.vn | admin duyệt thay (tick finalize) |
| B7 | CEO Nguyễn Văn Trường (nhánh B) | truong.nguyen@solutions.com.vn | admin duyệt thay |
| B8 | BCH/Admin kiểm khóa | — | admin |
| B9 | Người có `Contracts.Create` (câu III default: Drafter/Procurement/Admin — seeder K7 CanCreate=3) | — | admin |
| B10 | Người bấm B9 | — | admin |
| B11 | Approver HĐ: **Lê Văn Bình** (QT-HD-V2-001 trạm duy nhất) | binh.le@solutions.com.vn | admin duyệt thay |
| B12 | HRA/CCM (HardCopyActorRoles) | — | admin |
| B13 | Bất kỳ + Admin (mở cây) | — | admin |
| B14 | Lead chốt sổ | — | lead |
⇒ 14/14 dòng CÓ CHỦ — fail-closed ĐẠT (không dòng nào trống).
## Nhật ký bước (đổ ruột liên tục — ID ghi TẠI CHỖ cho rollback vá-11/13)
### 🔴 PHÁT HIỆN TRƯỚC GIỜ CHẠY — BLOCKER toàn trình: Lines-editor KHÔNG TỒN TẠI (vá tại chỗ @S168)
Truy vết trước khi bấm B1 (đúng tinh thần "K8 lộ wave thiếu"):
- `ContractSigningPlanFeatures.cs` auto-gen line mồi `CatalogEntryId = null` + comment HẸN *"Người soạn gán sau qua `UpdateContractSigningPlanLineCommand`"***command đó chỉ tồn tại TRONG COMMENT** (grep toàn src + FE = 0 impl, 0 route, 0 call).
- `ContractSigningPlanWorkflowService.SubmitAsync` (vá-5) **CHẶN THẬT** line null: `"Còn dòng chưa gán hạng mục…"` + đếm-so-khớp nhóm.
- FE `KhkkDetailPage` cột Hạng mục tự khai *"Đường GÁN (Lines-editor) = K4b"* — nhưng K4b THẬT ship việc khác (`88e7ecf` = nối `?group=` sidebar, đo `git show --name-only`). ⇒ mảnh rơi giữa build-order.
- Hệ quả nếu không vá: **MỌI phiếu KHKK tạo sau K2 kẹt Nháp vĩnh viễn** — dry-run chết ở B3. Đây chính là chỗ cicd-K2 khai *"mục-4 chân-lý-rỗng — đo lại khi K8 đẻ phiếu thật"*.
**Vá @S168 (BE + FE ×2 app + 3 test):** `UpdateContractSigningPlanLineCommand(PlanId, LineId, CatalogEntryId)` handler (EnsureDraftEditable + fail-fast entry sống/đúng-nhóm 409 + denorm `TenHangMuc` + changelog Line) · route `PUT /contract-signing-plans/{id}/lines/{lineId}` policy `KeHoachKyKet.Update` · FE select gán tại bảng (Nháp/TraLai, khoá dòng đã bắc cầu HĐ, options lọc `?approvalGroup=`) mirror SHA-pair `21e0ca0507d4` ×2 app · 3 Fact (dương gán→submit-QUA · âm khác-nhóm 409 · âm phase). Gate + commit riêng trước khi chạy chuỗi.
### GĐ0 — dựng bộ test — ✅ PASS (script `k8run.py gd0`, state `k8-state.json` scratchpad)
| Vật | ID |
|---|---|
| Project `ZZTEST-K8` "ZZTEST Du an dry-run K8 (SOLUTION-PE)" | `9c6caa7a-22b9-4482-bc74-2ef36fbebc54` |
| Supplier `ZZTEST-NCC-K8` | `10b60f58-1bb0-4164-b191-3cb9af3896fe` |
| WorkItem `ZZTEST-WI-K8` | `a29c7932-411c-4763-9ca6-5546798c3d5c` |
| Catalog line-test | B1-05 Xi măng `69a6db3a-30b1-4289-878b-a364a1fd1eab` |
| Workflow ids | PE `8a0aa922…` · KHKK-N4 `bf90b962…` · HĐ `12aee3bf…` |
### GĐ1 — PE 2 nhánh — ✅ TRỌN (B1-B7 phần PE)
- **PE-1 nhánh A = `PE/2026/A/052`** (`4e4ad413-30cb-4eda-b5cf-31f2936e8ec2`; supplier-row `512f6b41` · detail `55285053` · quote 110tr-VAT isSelected · Bảng-so-sánh att `50bbcf46`): submit → 3 lượt trạm → lượt 4 **giá-chốt NCC 110tr + finalize tại CCM (chuong.phan)****DaDuyet KHÔNG qua CEO** (OG-9 nhánh A chứng ✓) → winner ZZTEST-NCC ✓.
- **PE-2 nhánh B = `PE/2026/A/053`** (`a53db8b9-df60-42d0-92c0-e2ca4c80f2e5`; row `9e3d8060` · detail `1f98f925` · att `4a79abfd`): submit → **5 lượt ĐỦ đường** với `applyLevelFinalize=false` ở mọi lượt (checkbox opt-out F-1 `7a903cf` chứng chạy thật) ⇒ qua **CEO Trường** → DaDuyet → winner ✓.
- Sự-cố script tự bắt + sửa dọc đường (đều là THUỐC THỬ tốt cho form B0 buổi người-thật): ① PE detail đòi `GroupCode/GroupName` required · ② `QuoteBody.BgVat/ChuaVat` = decimal non-null · ③ submit-guard đòi đính kèm **Bảng so sánh** (purpose=4) · ④ cấp cuối đòi **chọn giá chốt** (Ncc/ProMin/ProMax/Ccm/ProMinMax — Mig 66) · ⑤ auth rate-limit **429** khi login mỗi-stage ⇒ cache token (JWT 1h) vào state · ⑥ 1 phiếu nháp orphan (script fail giữa) ⇒ **DELETE 204 dọn liền** — allow-list Nháp xoá được, đúng thiết kế.
### GĐ2+ (KHKK → bridge → HĐ → bản-cứng → QĐ9) — CHỜ deploy line-editor (commit + push + cicd) rồi chạy stages `khkk1…qd9-2`