wal: flush 20260731T1636
This commit is contained in:
@ -0,0 +1,40 @@
|
||||
K2-FE: IN-PROGRESS — build ×2 chưa chạy · SHA-pair chưa đo
|
||||
|
||||
# sub-implfe-k2 — K2 FRONTEND (S164, wave 2/8, SP-002 phiếu mang hạng-mục + nhóm)
|
||||
|
||||
> Luật đan-xen (bài K1 + #53): làm mục nào GHI NGAY mục đó. Dòng-1 = verdict, cập nhật CUỐI.
|
||||
> Nguồn: `sub-implbe-k2.md` (BE đã land) + spec-cum1 vá-4 + spec-tổng-quát QĐ-1/OG-1/OG-7 + nền `sub-invest-fable-b2-cum1.md` §K2.f.
|
||||
|
||||
## §0 Tiền đề — ĐO TRƯỚC MỌI WRITE (không tin sổ)
|
||||
|
||||
- `git status --porcelain` @start: `sub-implfe-k2.md` **KHÔNG tồn tại** trong run-folder (có k1/implbe-k2/test/reviewer/cicd) ⇒ Write mới AN TOÀN, không đè lane khác.
|
||||
- **0 file `fe-*/src` nào đang M** trong git status @start ⇒ mọi thay đổi FE dưới đây là của lane này, git-diff sẽ quy trách nhiệm đúng.
|
||||
- BE lane đã land (đọc `sub-implbe-k2.md`): Mig 71 applied 2-DB · rào (PeId,Group) · submit-guard · list `?group=` · Σ-Approved · build 0W/0E · suite 598/0.
|
||||
- 🔴 CẤM theo task: đụng BE/.cs · chạy dotnet (lane test song song) · route/menu mới (K4a) · sửa spec.
|
||||
|
||||
### §0.a SHA baseline 5 cặp KHKK FE (TRƯỚC khi sửa) — cả 5 IDENTICAL
|
||||
|
||||
| File (`fe-*/src/…`) | admin (12 ký tự đầu SHA256) | user | Trạng thái |
|
||||
|---|---|---|---|
|
||||
| `types/khkk.ts` | `8b757f5b1422` | `8b757f5b1422` | IDENTICAL |
|
||||
| `pages/khkk/KhkkCreatePage.tsx` | `ea51e7626eb1` | `ea51e7626eb1` | IDENTICAL |
|
||||
| `pages/khkk/KhkkDetailPage.tsx` | `c8ab2eadd3fd` | `c8ab2eadd3fd` | IDENTICAL |
|
||||
| `pages/khkk/KhkkListPage.tsx` | `40a650bf6964` | `40a650bf6964` | IDENTICAL |
|
||||
| `pages/khkk/KhkkWorkflowPanel.tsx` | `2b64144ef6e8` | `2b64144ef6e8` | IDENTICAL |
|
||||
|
||||
⇒ Chiến lược: sửa **fe-admin** → `cp` sang **fe-user** → đo lại SHA (khuôn cookie-cutter, 9× proven). Không có UX riêng 2 app trong 5 file này (đối chứng: baseline identical).
|
||||
|
||||
### §0.b Hình dạng DTO BE ĐỌC TỪ MÃ THẬT (không đoán — task ép)
|
||||
|
||||
- `ContractSigningPlanListItemDto` `ContractSigningPlanFeatures.cs:58-64`: append-CUỐI **`int ApprovalGroup`** + **`decimal TotalApprovedAmount`** (vá-8 — Σ thứ 3).
|
||||
- `ContractSigningPlanLineDto` `:66-79`: append-CUỐI **`Guid? CatalogEntryId`** + **`string? TenHangMuc`** (denorm).
|
||||
- `ContractSigningPlanDetailDto` `:130-166`: append-CUỐI (SAU cả các List) **`int ApprovalGroup`** + **`bool BudgetFrozen`** (display-gate, KHÔNG phải cột DB).
|
||||
- `ApprovedPeAwaitingPlanDto` `:169-191`: append-CUỐI **`List<int> ExistingGroups`** (nhóm của các plan `Phase != TuChoi`; rỗng = PE chưa có phiếu). Picker **KHÔNG còn loại PE-đã-có-phiếu** (`:1291-1295` gỡ vế `!Any(...)`).
|
||||
- `CreateContractSigningPlanCommand` `:333-337`: `PeId, ApprovalWorkflowId, GhiChu?, **int? ApprovalGroup = null**` — **null ⇒ nhóm 1** (`:393`); validator `InclusiveBetween(1,8)` CHỈ khi có giá trị (`:349-353`).
|
||||
- `ListContractSigningPlansQuery` `:700-705` `+int? ApprovalGroup`; controller expose **`?group=`** (BE lane §f).
|
||||
- 409 message create (`:400-402`): *"Phiếu Duyệt NCC này đã có kế hoạch ký kết cho nhóm duyệt N{g}. Chọn nhóm duyệt khác, hoặc xoá/để bị từ chối kế hoạch cũ của nhóm này trước khi lập lại."*
|
||||
|
||||
> 🔴 **[lead @S165] p1 CHẾT ngay sau §0.b** — 4 dòng markup tool-call rò vào đuôi file (sub-class #53 MỚI:
|
||||
> content-Write lẫn cú pháp invoke), lead đã cắt. Disk-truth p1: fe-admin 4 file M (types +69 · CreatePage +177
|
||||
> mid-wire [unused: select-nhóm + nút-phụ + badge chưa vào JSX] · Detail +33 · List +1); fe-user CHƯA cp.
|
||||
> p2 tiếp từ đây — append §1 trở xuống.
|
||||
@ -0,0 +1,33 @@
|
||||
K2-TEST: DONE — suite 607/0 (45D+562I, +9 mới)
|
||||
|
||||
# sub-test-k2 — K2 TEST SUITE (S164/S165, wave 2/8)
|
||||
|
||||
> 🔴 **[lead on-behalf @S165]** Lane test-specialist LÀM XONG VIỆC nhưng chết ở return (#53 — return rỗng
|
||||
> no-StructuredOutput) VÀ **không tạo artifact này dù prompt ép** (vi phạm ghi-trong-lúc-làm lần 2 trong
|
||||
> wave). File này = lead ghi SAU VERIFY-ĐĨA: đọc file test thật + chạy build/suite thật — không phải lời lane.
|
||||
|
||||
## Sản phẩm lane (disk-truth)
|
||||
|
||||
- File MỚI `tests/SolutionErp.Infrastructure.Tests/Application/ContractSigningPlanGroupAndCatalogTests.cs`
|
||||
— **824 dòng · 9 [Fact]** · header khai "test-AFTER rules §7" + bảng code-under-test đo-lại-trên-đĩa
|
||||
(submit-guard `WorkflowService.cs:174-182` · rào `Features.cs:393-402` · list `:737-738` · Σ `:803-804`
|
||||
· gate `:229-237` · site Phase-qua-BIẾN `:327-359`) — đúng luật con-trỏ-theo-NỘI-DUNG.
|
||||
- 9 test (tên = hành-vi, khuôn tiếng Việt nhà):
|
||||
1. `Submit_ConDongChuaGanHangMuc_ThiBiChan_GanDuThiTrinhQua` (T-a — vá-5, test ÂM trên phiếu CÓ line)
|
||||
2. `Submit_HangMucKhacNhomDuyetCuaPhieu_ThiBiChan_CungNhomThiQua` (T-b)
|
||||
3. `Create_CungPeCungNhom_ThiConflict_KhacNhom_ThiTaoDuoc_VaKhongDotMa` (T-c vế 1 — rào (PeId,Group))
|
||||
4. `Create_PhieuNhomDaTuChoi_KhongChiemCho_PhieuDangChoDuyet_ThiChiemCho` (T-c vế 2)
|
||||
5. `List_LocTheoNhomDuyet_ChiTraDungNhom_VaTotalKhopFilter` (T-d)
|
||||
6. `List_TongDaChot_CongTheoApprovedAmount_PhieuChuaDuyetThiBangKhong` (T-e — Σ vá-8)
|
||||
7. `EnsureDraftEditable_ChanMoiPhaseNgoaiNhapVaTraLai_VaDaNoiVaoDuongGhiThat` (T-f — phase-guard §e)
|
||||
8. `Entity_MacDinhNhomMot_VaGiuNguyenKhiGanTay_ConCoKetThucSomMacDinhTat` (T-g + EndedByLevelFinalize default)
|
||||
9. `Transition_ChiNhanhDuyetCuoiMoiToiDaDuyet_VaLuonKemChotGia` (bonus — choke-point 1-site DaDuyet + ??=)
|
||||
|
||||
## Trọng-tài (lead chạy SAU khi mọi lane dừng — #68)
|
||||
|
||||
- `dotnet build` **0W/0E** · `dotnet test` **607/0 = 45D + 562I** (553 + 9, delta rơi trọn Infra đúng chỗ).
|
||||
- 3 test lead vá trước đó (SchemaTests unique-3-cột + ApprovalTests fixture) KHÔNG bị lane đè — diff stat
|
||||
khớp phần lead (+19/+56 marks), file mới tách riêng. Ranh giữ đúng.
|
||||
- k = **9**, khai đủ. Bug-BE lộ ra = 0 (9/9 pass ngay trên BE đã land).
|
||||
|
||||
END sub-test-k2 — VERDICT=DONE (9 test T-a..T-g+2 · suite 607/0 · artifact lead-on-behalf sau verify-đĩa)
|
||||
@ -0,0 +1,43 @@
|
||||
K2-TEST: IN-PROGRESS — chưa đo suite (baseline nhận 598/0, CHƯA tự đo)
|
||||
|
||||
# sub-test-k2 — K2 TEST lane (S164, wave 2/8, SP-002)
|
||||
|
||||
> Luật đan-xen (bài K1/K2-BE): làm mục nào GHI NGAY mục đó, KHÔNG dựng dàn-bài kèm số chưa đo (bài S161-W7d2:
|
||||
> dàn-bài có sẵn con-số = bẫy claim-trước-đo). Mục chưa chạy CHỈ được tiêu-đề + "CHƯA ĐO".
|
||||
|
||||
## §0 Tiền đề — git status TRƯỚC mọi Write
|
||||
|
||||
- `git status --porcelain` @start: `sub-test-specialist-1.md` **KHÔNG tồn tại** trong run-folder ⇒ Write mới AN TOÀN.
|
||||
- File test đang M (lead vừa sửa, CẤM đè): `tests/.../Application/ContractSigningPlanApprovalTests.cs`,
|
||||
`tests/.../Common/ContractSigningPlanSchemaTests.cs`.
|
||||
- Prod code đang M (lane BE K2, CẤM đụng): Features/WorkflowService/entity/config/controller + Mig 71 (untracked).
|
||||
- Baseline nhận từ lead: 598/0 (45D+553I). CHƯA tự đo (sẽ đo cuối, không tin số đề bài — bài S161-W2).
|
||||
|
||||
## §1 Đọc nền — ĐO ĐƯỢC GÌ (đã đọc, trước mọi Write)
|
||||
|
||||
Đọc trọn: `sub-implbe-k2.md` (§a-§h) · `sub-invest-fable-b2-cum1.md:77-172` (K2.a-K2.h, blueprint 7 test) ·
|
||||
`spec-cum1-chi-tiet-31-07-2026.md` (12 vá + checklist ③). Đo lại trên ĐĨA (không tin sổ):
|
||||
|
||||
| Thứ cần đo | Site thật | Ghi chú |
|
||||
|---|---|---|
|
||||
| submit-guard null | `ContractSigningPlanWorkflowService.cs:174-176` | vá-5 CHẶN null (THẮNG nền `:126` cho-qua) |
|
||||
| submit-guard khác-nhóm | `…Service.cs:177-182` | message `…cùng nhóm N{plan.ApprovalGroup}` |
|
||||
| rào (PeId,Group) | `ContractSigningPlanFeatures.cs:393-402` | `Phase != TuChoi` + `ApprovalGroup == approvalGroup` |
|
||||
| list filter group | `Features.cs:737-738` | ĐẶT SAU khối IDOR `:720-729` |
|
||||
| Σ Approved | `Features.cs:803-804` | `Sum(l.ApprovedAmount) ?? 0m`, DTO slot 25 `:64` |
|
||||
| EnsureDraftEditable | `Features.cs:229-237` | owner∥Admin TRƯỚC, phase {DangSoanThao,TraLai} SAU |
|
||||
| default ApprovalGroup | `ContractSigningPlan.cs:39` `= 1` | mig `:52` defaultValue 0 + `Sql UPDATE … = 1` `:61` |
|
||||
| site gán-qua-BIẾN | `…Service.cs:327-359` `ReturnOrRejectAsync` | vá-2 chọn phương án (ii) = TEST KHOÁ, cấm sửa code |
|
||||
|
||||
**Hạ tầng tái dùng:** `InternalsVisibleTo` CÓ SẴN (`SolutionErp.Application.csproj:25`) ⇒ gọi THẲNG
|
||||
`ContractSigningPlanScope.EnsureDraftEditable` (Pattern 12, không cần reflection). Global using Xunit +
|
||||
FluentAssertions (`…Tests.csproj:31-32`). `.slnx` chỉ liệt PROJECT ⇒ file .cs mới KHÔNG cần sửa slnx.
|
||||
|
||||
**QUYẾT: file MỚI** `Application/ContractSigningPlanGroupAndCatalogTests.cs` + fixture RIÊNG
|
||||
(mirror `ContractSigningPlanCrudTests.cs:49-82`, có `AuditingInterceptor`) — KHÔNG chạm 2 file lead vừa vá
|
||||
(`ContractSigningPlanApprovalTests.cs` fixture SeedPlanAsync +catalog · `ContractSigningPlanSchemaTests.cs`
|
||||
unique-3-cột), KHÔNG chạm `ContractSigningPlanCrudTests.cs` (helper `CreateAsync` ở đó không mang tham số
|
||||
nhóm; thêm tham số = sửa file người khác đang dùng).
|
||||
|
||||
## §2 Test đã viết — CHƯA ĐO (đang viết)
|
||||
|
||||
Reference in New Issue
Block a user