# DRAFT YÊU CẦU OWNER — Chuỗi 4 GĐ theo SOL-CCM-SP-002 (Bước 0, em-main tổng hợp @S164 2026-07-31)

> Nguồn: anh dạy 6 nhịp hội thoại + 3 hình prod + 2 bổ sung cuối. Verbatim lời chốt giữ nguyên trong ngoặc kép. File này = **nguồn PIN cho mọi bước sau** (fable invest/review + fan-out Opus) — đọc từ đây, không từ trí nhớ.

## 0. Lời chốt verbatim của anh (thứ tự thời gian)

1. *"Khi Duyệt NCC -> ra 1 hạng mục gói thầu bự -> Bổ xuống hạng mục duyệt hợp đồng nhỏ hơn"*
2. *"Chú ý hạng mục hợp đồng -> Nó khác với loại hợp đồng tức 5 form trong folder FORM nhé, hạng mục có thể là trọn gói, tổ đội, hợp đồng nguyên tắc"*
3. *"Thực tế chỗ ký kết hợp đồng nó là duyệt hạng mục... duyệt NCC -> nó là cha của các hạng mục còn lại -> Các hạng mục còn lại duyệt xong thì -> Đưa vào loại hợp đồng gì"*
4. *"ý tao đang nói là GĐ 2 thôi, còn GĐ 3 là bàn về điều khoản nhiều hơn, GĐ 3 ko bàn công việc hạng mục nữa"*
5. *"chỗ ký nháy đó là ký trên bảng cứng đó, thật ra nguyên nhóm này là nguyên nhóm các loại HĐ của SOLUTION"* + *"nó tương tự quy trình duyệt NCC"*
6. Hình 1 (eOffice sidebar): fan-out KẾ HOẠCH KÝ KẾT HĐ *"ra các loại mục A1, A2 (kèm chú thích ngắn)"*
7. Hình 2 (Admin): *"Ẩn hết đi bên Admin nhé, chỉ còn cái Quy trình duyệt (Mới) thôi"* + *"Thêm các chỗ duyệt đó trong mục duyệt NCC mới giống Duyệt NCC"*; trả lời 2 câu: (1) *"Vậy chừa lại User cũng đc"* (2) *"Theo nhóm duyệt đi, cùng 1 nhóm duyệt"*
8. Hình 3 (cây toàn trình): 3 GĐ sau đang "Chưa có dữ liệu" → *"Thêm các sub folder con ở đây"* + *"chú ý giao diện slider bar, nên giống nhau nhé"*
9. 🔴 *"Chú ý giống nhau nhé, chỉ khác về form, đừng chế thêm gì, lấy 1 khung sliderbar của duyệt NCC thôi"*
10. *"yêu cầu là dry-run luôn"* + *"Tạo luôn các cái master data danh mục hợp đồng luôn nhé"*

## 1. Model nghiệp vụ 4 GĐ (CHỐT)

| GĐ | Tên | Trả lời câu hỏi | Nội dung |
|---|---|---|---|
| GĐ1 | Duyệt NCC (PE) | *mua của ai* | Phiếu PE = **CHA**, chốt gói thầu bự + NCC thắng. ĐÃ CHẠY PROD (41 phiếu, 38 gói, 11 dự án) |
| GĐ2 | Kế hoạch ký kết HĐ (KHKK) | *mua gì, ai ký, bao nhiêu* | **DUYỆT HẠNG MỤC**: bổ PE cha → N hạng-mục con; mỗi hạng mục gắn 1 dòng danh mục SP-002 ⇒ suy người ký + nhóm duyệt; duyệt số trạm-by-trạm | 
| GĐ3 | Duyệt Hợp đồng | *ràng buộc thế nào* | **ĐIỀU KHOẢN** — "không bàn công việc hạng mục nữa". Hạng mục đã duyệt → "đưa vào loại HĐ gì" (chọn khuôn) → soạn/đàm phán terms |
| GĐ4 | Hợp đồng cứng | *giấy trắng mực đen* | 1-MỐC (đã chốt S161): form điền đủ → duyệt nếu có → upload bản cứng. **Ký nháy = MỰC trên bản cứng** — app in khối ký đúng pattern, không chạy ô nháy như workflow ảo |

**3 trục ĐỘC LẬP (cấm trộn):** hạng-mục công-việc (instance GĐ2) ⟂ loại-HĐ SOLUTION (dòng danh mục SP-002 — quyết ai ký + nhóm duyệt) ⟂ khuôn-form (5 file `FORM\SOL-CCM-FO-002`: .02 trọn-gói NC+VT · .03 trọn-gói NC+TB · .05 giao-khoán · .06 mua-bán · .07 đặt-hàng; hệ thống có 7 ContractType gồm 06/07 Nguyên tắc NCC/DV). ⚠️ Chữ "loại HĐ" trong hội thoại mang 2 nghĩa — đặt tên field tách bạch.

## 2. 8 NHÓM DUYỆT (nén từ SP-002 — "cùng 1 nhóm duyệt" lời anh)

| # | Nhóm (menu label + chú thích ngắn) | Gồm danh mục | Chuỗi duyệt (trạm-by-trạm) | Ký chính |
|---|---|---|---|---|
| 1 | A1 · Thiết bị, máy móc, vật tư phụ | A1 ×5 | TBP.CCM → NV.CCM → TBP.EQU → NV.EQU | TP.CCM |
| 2 | A2-A3 · Hạ tầng & DV hỗ trợ thi công | A2 ×1 + A3 ×9 | TBP.CCM → PD/PM → SM → QS | TP.CCM |
| 3 | A4 · Hoạt động văn phòng | A4 ×5 | TBP.CCM → TPB/TBP → TBP/NV.PB | TP.CCM |
| 4 | B1 · Vật tư | B1 ×23 | TBP.PRO → NV.PRO | TP.PRO |
| 5 | B2 · Thầu phụ xây dựng | B2 ×14 dòng (đánh số tới 13, trùng số "7" ×2) | TP.CCM → TBP.PRO → PD/PM/SM → QS | TP.PRO |
| 6 | B3 · Thầu phụ MEP | B3 ×15 | TP.CCM → TBP.PRO → PD/PM/SM → MEP SM | TP.PRO |
| 7 | C · BCH công trường | C1 ×6 + C2 ×3 + C3 ×4 | TP.CCM → SM → QS | PD/PM |
| 8 | CEO · Chưa ủy quyền | fallback mọi HĐ chưa UQ | TP.CCM → TP.PRO | CEO |

Tổng danh mục ~85 dòng (đếm từ ảnh trang 5-9; **số chính xác PHẢI extract từ file gốc** `D:\Dropbox\CONG_VIEC\SOLUTION\QUY_TRINH\SOL-CCM-SP-002...` bằng office-document khi build). Vai trò: site = PD·PM·SM·MEP-SM·QS (BCH) · văn-phòng generic = TPB/TBP + NV.PB · thiết-bị = TBP.EQU/NV.EQU · CCM = TP>TBP>NV · PRO = TP>TBP>NV. NĐUQ = ngưỡng giá trị ủy quyền (trang chưa gửi — invest chốt cách lưu: threshold trên nhóm? trên workflow như `CeoApprovalThreshold` Mig 53?).

## 3. SCOPE — 5 mảnh

**(i) Master data danh mục hợp đồng** (yêu cầu 10): bảng catalog "Danh mục HĐ SOLUTION" (~85 dòng: mã nhóm A1…C3 + tên VN/EN + nhóm-duyệt 1-8 + người-ký + chuỗi nháy) **+ seed code-first idempotent** (khuôn `SeedRealMasterDataAsync` Mig 48; luật #84 code-first-seeder + #75 gate wipe + #76 config-example). Admin CRUD được (quy trình có version v01→v02).

**(ii) eOffice sidebar:** root KẾ HOẠCH KÝ KẾT HĐ fan-out **8 mục nhóm-duyệt** (bảng trên, kèm chú thích ngắn) — mỗi mục = **đúng bộ 6 leaf** khuôn Duyệt NCC (Luồng duyệt / Danh sách / Thao tác / Đang duyệt / Đã duyệt / Đã xóa).

**(iii) Cây toàn trình mirror sidebar:** dưới từng gói thầu — folder "Kế hoạch Hợp đồng" mở **8 sub-folder đúng bộ nhóm**; folder "Duyệt Hợp đồng" + "Hợp đồng cứng" mở sub-folder theo **7 loại HĐ** khớp sidebar sẵn có. Thay dòng "Chưa có dữ liệu ở giai đoạn này". Sidebar ↔ cây = MỘT bộ nhóm, hai mặt hiển thị.

**(iv) Admin:** ẨN mục nghiệp vụ cũ (Tổng quan, DUYỆT NCC, KẾ HOẠCH KÝ KẾT HĐ, NHÂN SỰ, VĂN PHÒNG SỐ, CÁ NHÂN, Duyệt hợp đồng, HỢP ĐỒNG CỨNG, Biểu mẫu, Báo cáo, DANH MỤC) + 2 mục quy trình cũ (Quy trình Duyệt NCC · Quy trình HĐ) — **CHỪA khối HỆ THỐNG** (Người dùng · Vai trò · Phân quyền · Menu eOffice) + **"Quy trình duyệt (Mới)"** += **8 designer nhóm-duyệt** (khuôn y Duyệt NCC (Mới): Bước—Phòng—Cấp, versioned + archived history). Ẩn ≠ xóa (revert được). Map vai → user thật từ đội hình sống `QT-DN-V2-001`: B1-PRO C1 = Bích Phượng·Văn Duy·Kim Long·Binh Le Thanh, C2 = Thủy Trà · B2-CCM C1 = Nữ Nguyên·Xuân Lưu·Đăng Trưởng/Văn Binh, C2 = Phan Văn Chương · B3-BGĐ = Nguyễn Văn Trường (⚠️ verify bản LIVE không phải archived trước khi wire).

**(v) DRY-RUN E2E** (yêu cầu 10): sau build — chạy thử toàn trình trên prod/UAT: PE đã duyệt (vd `PE/2026/A/049` gói `14 Mat PVC, vải địa`) → tạo phiếu KHKK hạng mục theo nhóm → duyệt qua trạm → đưa vào loại HĐ → (GĐ3/GĐ4 tới đâu nghiệm thu tới đó). Bằng chứng: screenshot + phiếu thật + cây hiện đúng sub-folder.

## 4. 🔴 RÀNG BUỘC KHUÔN (lời 9 — luật sắt cho MỌI wave)

**"GIỐNG NHAU — CHỈ KHÁC FORM — ĐỪNG CHẾ THÊM."** MỘT khung = khung Duyệt NCC: (a) sidebar mục con + 6 leaf; (b) cây gói → folder GĐ → sub-folder nhóm → card phiếu (badge trạng thái + mã + ngày + người); (c) layout 3 cột (cây trái · danh sách giữa · panel chi tiết phải). Thứ KHÁC duy nhất = **FORM phiếu** (ruột panel phải per GĐ). CẤM chế layout/khái niệm UI mới. = luật cookie-cutter mirror (PE→Contract→KHKK ở BE) chốt cho tầng UI: **nhân khung, đổi form**.

## 5. Nền kỹ thuật hiện có (ground-truth để invest soi, KHÔNG đập dựng)

- KHKK **Mig 69** (S161): 7 bảng `ContractSigningPlans` + `~Approvals/~Attachments/~Changelogs/~DossierItems/~LevelOpinions/~Lines` — 🔍 **soi `ContractSigningPlanLines` = hạng mục tới đâu** trước khi thêm bảng. CRUD + Dossier 15 policy (W2) · duyệt V2 3-trạm test-before (W3) · đường-ống HĐ V2 (W6) · bản-cứng 1-mốc (W7).
- Workflow V2: `ApprovalWorkflows/Steps/Levels` + `ApplicableType` + `IsUserSelectable` + Designer — PE/Contract/KHKK cùng nền. Header GĐ2 prod: "Chốt giá per-NCC trúng thầu + căn cứ hồ sơ trước khi ký hợp đồng".
- Cây 4-folder S162: `PipelineStageFolders` + `PipelineTreePanel` + `usePipelineStages` ×2 app (SHA-mirror, `bfc7b79` + `e5123ff`).
- Menu-key: `KeHoachKyKet` root sinh policy (KHÔNG menu-row) + 7 MenuItem `Khkk_G1/WfView/List/Create/Pending/Approved/Deleted` seed `DbInitializer.cs:1780-1787`; KHKK **KHÔNG inherit** — grant từng leaf (`DbInitializer.cs:2107`, seeder chạy SAU revoke để THẮNG #84).
- 🔴 Gotchas phải né: **#85** gate FE dùng ĐÚNG key policy endpoint (không OR key con) · **#82** menu-hiện ≠ API-mở (grep controller authz) · **#84** sửa quyền = code-first seeder (KHÔNG SQL tay) · **#75/#76** seed gate + config · **#63/#64** EF scaffold RenameColumn + Design-DB · **#57-EXT** filtered-unique.
- Test: 590 PASS (45D+545I) baseline; bug-fix = test-before; mig mới = 3-file rule.

## 6. Treo — INVEST PHẢI CHỐT trong spec (đừng để lửng)

1. 🔴 **Cardinality "đưa vào loại HĐ"**: N hạng-mục-đã-duyệt → 1 HĐ (gộp) hay 1-1? (anh chưa trả lời 2 lần hỏi — bảng 3.5 nhiều dòng gợi ý gộp; invest đề phương án + để slot owner-gate nếu cần).
2. Phiếu KHKK per NHÓM hay per HẠNG-MỤC? (menu theo nhóm; 1 phiếu chứa N hạng mục cùng nhóm? — soi `Lines` hiện có).
3. 8 workflow nhóm map vào `ApplicableType` thế nào (8 type mới? 1 type + 8 workflow pinned?).
4. Vai trò catalog (TBP.CCM, QS…) lưu ở đâu — map user thật (đội hình QT-DN-V2-001) vs role-placeholder.
5. NĐUQ ngưỡng tiền: field trên nhóm/workflow (tiền lệ `CeoApprovalThreshold` Mig 53).
6. Mục "1. Kế hoạch ký kết HĐ (NCC-TP)" cũ (đã có phiếu?) → migrate/giữ/ẩn thế nào khi fan-out 8 nhóm.
7. Admin ẩn = `IsVisible` menu hay bỏ render sidebar (2 app khác nhau — admin sidebar là code tĩnh hay menu-tree?).
8. Danh mục B2 trùng số "7" ×2 + A4 ô "TPB/TBP" dấu "/" nghĩa OR? — extract file gốc chốt.

## 7. Choreography (lệnh anh — "Bước 0→3 + fan-out")

- **B0** (file này) em-main draft ✅
- **B1** `/fable-real invest` → **spec-tổng-quát các wave** → `/fable-clone review` spec đó
- **B2** per **cụm 3 wave**: `/fable-real invest` sâu → **spec-chi-tiết + checklist** → `/fable-clone review`
- **B3** `/fable-real review` **chốt spec cuối** 1 lần
- **B4** fan-out **Opus 5 MAX** làm, bám sát spec-chi-tiết + checklist (HMW marker ON; worker-tier-pin S124)
- Xen kẽ: em-main verify + WAL từng nấc; run-trace folder này (H10); **dry-run E2E** là wave cuối bắt buộc (scope v).
