Some checks failed
Deploy SOLUTION_ERP / build-deploy (push) Failing after 22s
Session 5 (29/04) — 6 commit feature + 1 chốt MD này. ==== Stats sau session 5 ==== - 52 DB tables (+1 PEDeptOpinions) - 15 migrations (+`AddPurchaseEvaluationDepartmentOpinions`) - ~128 API endpoints (+4) - ~31 FE pages (+5 Budget + 1 PeWorkflowsPage) - 71 unit test pass (54 Domain + 17 Infra) — CI gate live, fail → no deploy - ~13050 BE LOC (+1300) - 30 demo user, 38 gotchas, 6 skill (no change) ==== MD touched ==== - STATUS.md: header Phase 8 + 6 row Recently Done session 5 + cumulative cột S5 + In Progress S6 (Hard blockers + Optional polish + Tests Phase 3-5 + Ops) - HANDOFF.md: TL;DR 6 milestone S5 + Cảnh báo S6 (CI test gate workflow mới) + Priority 0 S6 (UAT + Ops focus) + Phase status table cập nhật - migration-todos.md: Phase 8 done với A/B/C/D/E (FE Budget / PE-HD integration / PE WF Designer / Ý kiến 4 PB / Tests Phase 1-2) + Phase 9 active (UAT + Ops + carry over) - architecture.md: §11 Testing strategy mới (test pyramid bottom-heavy + stack + CI gate + phased priority + quy tắc bổ sung mỗi feature) - database/schema-diagram.md: Migration 15 row + total 52 tables + §13 PE Department Opinion (1 bảng UNIQUE PEId+Kind + Upsert behavior + SQL DDL) - ef-core-migration SKILL: migration 15 entry + 52 tables total + Phase 8 update note - CLAUDE.md (root): modules table + Tests row + scope `Tests` + Tests section mới + count update 15/52 - docs/CLAUDE.md: 7 module bullet + ERD 52 bảng + Roadmap Phase 8 done + Phase 9 active S6 - memory project_solution_erp.md: Phase 8 summary + Session 6 priority + workflow user mới (dotnet test → commit → push) - session log 2026-04-29-chot-session-5-budget-fe-pe-tests.md (NEW — 10+ section detail) ==== Verify ==== - dotnet test SolutionErp.slnx → 71 pass / 2s - git status clean sau commit này Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
206 lines
12 KiB
Markdown
206 lines
12 KiB
Markdown
# Migration To-dos — Atomic Roadmap
|
||
|
||
> Tick `[x]` khi xong. Phase 0-8 đã DONE — collapsed. Detail xem session
|
||
> logs trong `docs/changelog/sessions/`. Active work: Phase 9 (UAT + Ops + carry over PE PDF export + Tests Phase 3-5).
|
||
|
||
## ✅ Phase 0-5 + Tier 3 — Done (2026-04-21..22)
|
||
|
||
| Phase | Focus | Trạng thái |
|
||
|---|---|---|
|
||
| 0 Draft | Scaffold .NET 10 + 2 Vite + parse FORM/QT + docs | ✅ |
|
||
| 1 Alpha Core | Auth + 12 role + Permission Matrix + 3 master CRUD + Contract draft | ✅ |
|
||
| 2 Form Engine | OpenXml + ClosedXML render + LibreOffice PDF + DynamicForm | ✅ |
|
||
| 3 Workflow | State machine 9 phase + RG-001 code gen + SLA job + attachments + SignalR realtime | ✅ |
|
||
| 4 Reporting | Dashboard KPI + Excel export + MyDashboard role-aware + brand identity #1F7DC1 | ✅ |
|
||
| 5 Production | CI/CD Gitea Actions + 3 IIS site + Let's Encrypt + Security headers + Users CRUD | ✅ |
|
||
| Tier 3 | Versioned workflow + 3-panel layout + 4-bảng overhaul + 4 master catalogs + 16 demo users + RolesPage CRUD + 7 demo HĐ varied | ✅ |
|
||
|
||
Detail chi tiết: `docs/changelog/sessions/2026-04-21-*.md` + `2026-04-22-0300-tier3-feature-complete.md` + `2026-04-23-*.md`.
|
||
|
||
## ✅ Phase 6 — Module Duyệt NCC (tiền-HĐ) — Done
|
||
|
||
### Iter 1 (2026-04-23)
|
||
|
||
- [x] Migration 12 `AddPurchaseEvaluations` — 10 bảng (Header/Suppliers/Details/Quotes/Approvals/Changelogs/Attachments/WorkflowDefinitions/Steps/StepApprovers)
|
||
- [x] Domain — 2 enum (Type A/B, Phase 7-state) + Policy record + Registry + FromDefinition builder
|
||
- [x] Seed — 13 menu Pe_*/PeWf_* + 2 WorkflowDefinition v01 (QT-DN-A 3-step, QT-DN-B 5-step)
|
||
- [x] Application CQRS ~900 LOC — Create/Update/Transition/List/Inbox/Get/Delete + Supplier CRUD + Detail CRUD + Quote Upsert + SelectWinner + Changelog
|
||
- [x] PurchaseEvaluationWorkflowService — policy guard + approval + notification + changelog
|
||
- [x] PurchaseEvaluationsController — 17 endpoint REST
|
||
- [x] FE 2 app — Types + PurchaseEvaluationsListPage 3-panel + Create page + PeDetailTabs + PeWorkflowPanel + Menu resolver Pe_*
|
||
- [x] Kế thừa HĐ — `CreateContractFromEvaluationCommand` (guard DaDuyet + SelectedSupplier + !ContractId) → Contract draft. FE CreateContractDialog pick ContractType.
|
||
- [x] **Migration 13** `AddPurchaseEvaluationCodeSequences` — atomic MaPhieu sequence `PE/{YYYY}/{A|B}/{Seq:D3}`
|
||
- [x] Demo PE seed — 4 phiếu varied phase (A-001/A-002/A-003/B-001) + Pe_* permission defaults 7 role × 9 menu key
|
||
|
||
Session log: `2026-04-23-2300-purchase-evaluations.md` + `2026-04-24-1030-pe-polish-demo-maphieu-perms.md`.
|
||
|
||
### Iter 2 — UX polish (2026-04-24)
|
||
|
||
- [x] Rename menu "Phương Án" → "Giải pháp" + backfill DB (zero breaking change)
|
||
- [x] Menu tree inheritance extend Pe_*/PeWf_* (`GetMyMenuTreeQuery` + 4 root)
|
||
- [x] Accordion mutex Pe_* groups + sidebar w-72 + label nowrap
|
||
- [x] NavLink active check query string (queryMatches helper) — fix 2 leaf cùng highlight
|
||
- [x] PE detail flat layout: Panel 2 = 4 section (Thông tin/NCC/Hạng mục/**Bảng so sánh**), Panel 3 += Approvals + Changelog
|
||
- [x] Upload file đính kèm per-NCC (SupplierAttachmentsCell) + Bảng so sánh tổng (GeneralAttachmentsSection, supplierRowId=null) + enum `ComparisonTable=4`
|
||
- [x] readOnly mode menu "Duyệt" (pendingMe=1) — hide Sửa/Xóa/Thêm/Edit/Upload/Delete, giữ download + transition + comment
|
||
- [x] Contract: move Lịch sử điều chỉnh Panel 2 → Panel 3 (Chi tiết HĐ full-width)
|
||
- [x] Demo email rebrand `@solutionerp.local` → `@solutions.com.vn` + `BackfillUserEmailDomainAsync` (idempotent rename 4 field Email/NormalizedEmail/UserName/NormalizedUserName)
|
||
|
||
Session log: `2026-04-24-chot-session-3-pe-polish.md`.
|
||
|
||
### ✅ Domain rebrand `.huypham.vn` → `.solutions.com.vn` (2026-04-24)
|
||
|
||
- [x] 18 file repo (FE env + scripts + CI/CD + docs + skill + code comments)
|
||
- [x] `scripts/migrate-domains.ps1` (ASCII-only #30) — 3 IIS binding + 3 cert Let's Encrypt + auto HTTPS + redirect
|
||
- [x] CI/CD auto rebuild BE CORS + FE bundle VITE_API_BASE_URL
|
||
- [x] E2E verified 3 domain live + preflight OK
|
||
|
||
Sub: `api.solutions.com.vn` · `admin.solutions.com.vn` · `eoffice.solutions.com.vn`. Old `.huypham.vn` vẫn fallback (chưa remove).
|
||
|
||
## 📝 Phase 7 — PE feature gap + Budget BE (Session 4 partial done)
|
||
|
||
### A. PE feature gap (3 task MISSING — carry over session 5)
|
||
|
||
- [ ] **PE Workflow admin designer UI** `/system/pe-workflows/:typeCode`
|
||
- BE `Application/PurchaseEvaluations/PeWorkflowAdminFeatures.cs` (mirror `WorkflowAdminFeatures.cs`)
|
||
- `Api/Controllers/PeWorkflowsController.cs`
|
||
- FE `fe-admin/src/pages/system/PeWorkflowsPage.tsx` + `PeWorkflowDesigner.tsx`
|
||
- Route `/system/pe-workflows/:typeCode` (menu PeWf_* + resolver đã sẵn)
|
||
- [ ] **Ý kiến 4 phòng ban** (Phê duyệt / P.CCM / P.MuaHàng / SM-PM) ở tab Thông tin
|
||
- Option A: 4 text field + signoff date + UserId vào header
|
||
- Option B: dùng `PurchaseEvaluationApprovals` với roleKind extra field
|
||
- UX: 4 box sign-off như Excel mẫu
|
||
- [ ] **Export phiếu PDF/Excel** — tái dùng `IDocumentConverter` + template `PE-TrinhDuyet.docx`
|
||
|
||
### B. Optional polish
|
||
|
||
- [ ] Auto-map PE Details → Contract per-type Details khi gen HĐ (phức tạp vì 7 schema khác nhau)
|
||
- [ ] Payment terms tách field từ JSON → 6 column (Tạm ứng/TT tạm/Quyết toán/Bảo hành/Hạn mức/Đánh giá)
|
||
- [ ] Matrix Quotes bulk paste từ Excel
|
||
- [ ] fe-user Inbox thêm section "Phiếu Duyệt NCC chờ tôi"
|
||
|
||
### C. Ops
|
||
|
||
- [ ] Remove binding cũ `.huypham.vn` sau verify stable: `ssh vietreport-vps ; cd C:\solution-erp\scripts ; .\migrate-domains.ps1 -RemoveOld -SkipCert`
|
||
- [ ] win-acme scheduled task fix unhealthy (cert expire 2026-06-18)
|
||
- [ ] UAT thật 1 tuần với 2-3 user (30 demo user — 16 sample + 14 Solutions thật)
|
||
- [ ] SMTP config → Email outbox
|
||
- [ ] Rotate credentials (admin + 30 demo + SA + vrapp + JWT)
|
||
- [ ] Schedule SQL backup Task Scheduler
|
||
|
||
### D. Module Ngân sách (Budget) — Session 4 ✅ partial done
|
||
|
||
- [x] **Migration 14** `AddBudgets` — 4 bảng (Budgets/BudgetDetails/BudgetApprovals/BudgetChangelogs) + index BudgetId nullable trên Contract & PurchaseEvaluation
|
||
- [x] Domain — `Budget` (Header) + `BudgetDetail` (flat row) + `BudgetApproval` + `BudgetChangelog` + enum `BudgetPhase` 5-state + `BudgetEntityType` Header/Detail/Workflow
|
||
- [x] `BudgetPolicy.Default` hardcoded simple 3-step (Drafter→CCM→CEO + Reject từ ChoCCM/ChoCEO về DangSoanThao)
|
||
- [x] Application CQRS ~340 LOC — Create + UpdateDraft + Transition + List + GetDetail + Delete (only DangSoanThao/TuChoi) + Detail CRUD (auto-recompute TongNganSach) + ListChangelogs
|
||
- [x] `BudgetsController` 11 endpoint REST
|
||
- [x] Menu seed `Budgets` root + 3 leaf (Bg_List/Bg_Create/Bg_Pending) order=27 icon Wallet
|
||
- [x] **14 demo user Solutions thật** — PRO 5 + CCM 7 + ISO 1 + CEO 1 (pwd `User@123456`)
|
||
|
||
Session log: `2026-04-28-chot-session-4-budget.md`.
|
||
|
||
### E. Pending migrations
|
||
|
||
- [ ] `AddPePaymentTermFields` (nếu chốt UX tách field — JSON blob → 6 column)
|
||
- [x] **`AddPurchaseEvaluationDepartmentOpinions`** ✅ migration 15 (S5)
|
||
- [ ] `AddBudgetCodeSequences` (nếu chốt format MaNganSach atomic — hiện Random.Shared)
|
||
- [ ] `AddBudgetVersionedWorkflow` (nếu user cần admin config UI thay vì hardcoded `BudgetPolicy.Default`)
|
||
|
||
## ✅ Phase 8 — Budget FE + PE/HD integration (Session 5 done)
|
||
|
||
### A. FE Budget pages — done ✅
|
||
|
||
- [x] `fe-admin/src/types/budget.ts` (BudgetPhase 5-state enum + DTO types)
|
||
- [x] `fe-admin/src/pages/budgets/BudgetsListPage.tsx` (3-panel `[340px_1fr_360px]` + filter Phase/Năm + ?phase=Pending alias + readOnly mode + BudgetDetailPage fullpage mobile)
|
||
- [x] `fe-admin/src/pages/budgets/BudgetCreatePage.tsx` (form Header — Tên/Năm/Dự án/Phòng ban/Mô tả)
|
||
- [x] `fe-admin/src/components/budgets/BudgetDetailTabs.tsx` (Section Thông tin Header + Section Hạng mục table CRUD inline auto-compute ThanhTien=KL×ĐG)
|
||
- [x] `fe-admin/src/components/budgets/BudgetWorkflowPanel.tsx` (Panel 3 timeline activePhases + nextPhases buttons + Dialog comment + Approvals/Changelog)
|
||
- [x] Mirror tất cả sang `fe-user/`
|
||
- [x] App.tsx routes `/budgets`, `/budgets/new`, `/budgets/:id` cả 2 app
|
||
- [x] Menu resolver `Bg_*` (Bg_List → `/budgets`, Bg_Pending → `/budgets?phase=Pending`, Bg_Create → `/budgets/new`)
|
||
|
||
### B. PE/Contract → Budget integration — done ✅
|
||
|
||
- [x] **PE form** + Select "Ngân sách" filter Phase=DaDuyet, ProjectId match, BE validate
|
||
- [x] **Contract form** (Header + Edit) tương tự, EditForm read-only link card khi !isDraft
|
||
- [x] PE Detail Hạng mục thêm cột "NS link · Δ" — match per-row qua `groupCode|itemCode` + footer aggregate (xanh dưới / đỏ vượt / xám khớp)
|
||
- [x] PE Detail UI restructure 4 section đánh số match form spec PHIẾU TRÌNH KÝ
|
||
- [x] BE: BudgetSummaryDto shared + Create/Update PE+Contract commands + BudgetId? + GetQueries load Budget
|
||
- [x] CreateContractFromEvaluation carry forward pe.BudgetId → contract.BudgetId
|
||
|
||
### C. PE Workflow Designer admin UI — done ✅
|
||
|
||
- [x] BE `PeWorkflowAdminFeatures.cs` ~250 LOC mirror Contract pattern
|
||
- [x] BE `PeWorkflowsController` 2 endpoint reuse policy `Workflows.*`
|
||
- [x] FE `PeWorkflowsPage.tsx` ~500 LOC + designer dialog (clone/edit/+Role/+User)
|
||
- [x] App.tsx route `/system/pe-workflows/:typeCode`
|
||
|
||
### D. Ý kiến 4 phòng ban — done ✅
|
||
|
||
- [x] Migration 15 `AddPurchaseEvaluationDepartmentOpinions` (UNIQUE PEId+Kind)
|
||
- [x] Domain entity + enum `PeDepartmentKind` (PheDuyet/Ccm/MuaHang/SmPm)
|
||
- [x] BE Upsert (sign=true → set SignedAt+UserId, sign=false giữ chữ ký cũ) + Delete + 2 endpoint
|
||
- [x] FE Section "5. Ý kiến 4 phòng ban (sign-off)" 2x2 grid OpinionBox
|
||
|
||
### E. Tests Phase 1-2 + CI gate — done ✅
|
||
|
||
- [x] **Phase 1** — `tests/SolutionErp.Domain.Tests/` (xUnit + FluentAssertions 7.2): 54 test policy state machine (Contract WF + PE WF + Budget) + Registry + FromDefinition versioned + UserKindApprover
|
||
- [x] **Phase 2** — `tests/SolutionErp.Infrastructure.Tests/` (EF SQLite + TestApplicationDbContext override `nvarchar(max) → TEXT`): 17 test code generator format + sequence + year boundary + persistence verify
|
||
- [x] CI gate `.gitea/workflows/deploy.yml` — 2 step `dotnet test` trước build, fail → no deploy
|
||
- [x] Total 71 test pass / ~2s
|
||
- [x] Session log + commit + push
|
||
|
||
## 📝 Phase 9 — UAT + Ops + carry over (Session 6+ active)
|
||
|
||
### A. Hard blockers (chờ user / ops)
|
||
|
||
- [ ] UAT thật 1 tuần với 2-3 user (30 demo: 16 sample + 14 Solutions thật)
|
||
- [ ] SMTP config → Email outbox (BLOCKED chờ user cấp host/user/pass)
|
||
- [ ] Rotate credentials (admin + 30 demo + SA + vrapp + JWT secret + Gitea runner token)
|
||
- [ ] Schedule SQL backup daily Task Scheduler
|
||
|
||
### B. PE feature gap còn lại
|
||
|
||
- [ ] Export phiếu PDF/Excel — `IDocumentConverter` + template `PE-TrinhDuyet.docx` (user pending — không quan trọng lắm)
|
||
|
||
### C. Optional polish (làm khi UAT phát sinh)
|
||
|
||
- [ ] Budget MaNganSach atomic sequence + migration `AddBudgetCodeSequences`
|
||
- [ ] Budget versioned workflow + migration `AddBudgetVersionedWorkflow`
|
||
- [ ] Payment terms PE tách field (JSON → 6 column)
|
||
- [ ] Auto-map PE Details → Contract Details khi gen HĐ
|
||
- [ ] Matrix Quotes bulk paste từ Excel
|
||
- [ ] fe-user Inbox thêm section "Phiếu Duyệt NCC chờ tôi"
|
||
|
||
### D. Tests Phase 3-5 (làm khi gặp bug recurring để justify ROI)
|
||
|
||
- [ ] **Phase 3** — Application handler tests (CQRS + EF InMemory) ~15 test
|
||
- [ ] **Phase 4** — API smoke tests (WebApplicationFactory) ~7 test
|
||
- [ ] **Phase 5** — FE Vitest cho lib utility (queryMatches, fmtMoney) ~10 test
|
||
|
||
### E. Ops chưa xong
|
||
|
||
- [ ] Remove binding cũ `.huypham.vn` sau verify stable
|
||
- [ ] win-acme scheduled task fix unhealthy (cert expire 2026-06-18)
|
||
|
||
## 🔁 Skill governance (recurring)
|
||
|
||
Quy tắc: `docs/rules.md §9`. Audit định kỳ mỗi đầu tháng — workflow §9.4.
|
||
|
||
- [x] **Setup ban đầu** — 6 skill (3 domain + 3 ops), rules §9 ← `661f859`
|
||
- [ ] **Audit 2026-05-01** — log `docs/changelog/skill-audit-2026-05.md`
|
||
- [ ] **Audit 2026-06-01**
|
||
- [ ] **Audit 2026-07-01**
|
||
|
||
Cron task `solution-erp-skill-audit-monthly` fire 9:00 AM ngày 1 mỗi tháng.
|
||
|
||
## 📦 Post-launch (Phase 10+ — future)
|
||
|
||
- [ ] **Email outbox** (MailKit + SMTP) — blocked chờ SMTP config
|
||
- [ ] E-signature integration (VNPT CA hoặc FPT CA)
|
||
- [ ] Tích hợp Bravo / SAP ERP import NCC
|
||
- [ ] Mobile app (React Native?) cho BOD duyệt ngoài giờ
|
||
- [ ] AI: gợi ý điền form dựa HĐ cũ, OCR scan HĐ đối tác
|
||
- [ ] Multi-tenant nếu có công ty thứ 2
|