Backend Report: - Application/Reports/Dtos/DashboardStatsDto: 5 KPI + PhaseCount + SupplierCount + ProjectCount + MonthlyValue - Application/Reports/Queries/GetDashboardStats handler: total/active/overdue/published this month/totalValueActive + byPhase + top 5 NCC/du an + 12 thang monthly (fill zero khi thang empty) - Application/Reports/Services/IContractExcelExporter interface - Infrastructure/Reports/ContractExcelExporter: ClosedXML workbook 10 cot, header style bold+blue, number format #,##0, formula SUM, auto-fit, freeze header - Application/Reports/Commands/ExportContractsToExcelCommand: filter phase/supplier/project/date range - Api/Controllers/ReportsController: GET /reports/dashboard, GET /reports/contracts/export - DI register IContractExcelExporter (Scoped) Frontend fe-admin: - types/reports.ts: DashboardStats type - components/BarChart.tsx: generic horizontal bar chart — chi Tailwind, khong thu vien ngoai - pages/DashboardPage.tsx REWRITE: 5 KPI card (FileText/TrendingUp/AlertTriangle/CheckCircle2/Coins) + by-phase bar + monthly 12-month chart + top 5 NCC + top 5 du an + skeleton loader - pages/ReportsPage.tsx MOI: filter phase/fromDate/toDate → export Excel button - Route /reports vao App.tsx E2E verified: - GET /api/reports/dashboard → 200 voi day du KPI + monthly fill 12 thang - GET /api/reports/contracts/export → 200 xlsx 7229 bytes (Microsoft Excel 2007+) Docs consolidation (theo yeu cau user): - docs/rules.md MOI: 9 section coding conventions (ngon ngu UI/code/DB/docs, BE Clean Arch, CQRS+MediatR, Validation FluentValidation, Error handling, Async, Entity rules, DI, Package pinning, FE React/TS erasableSyntaxOnly, path alias, TanStack Query, Permission guard, Toast+error, DB convention, Git commit format, Docs structure, Testing, Security) - docs/architecture.md MOI: layered overview ASCII art, request lifecycle (1 POST/api/contracts qua 10 step), workflow state machine 9 phase, permission model, data flow sequence diagram 4 actor (Drafter/Manager/CCM/BOD/HRA), deployment architecture Phase 5, skill library, non-functional table - docs/database/schema-diagram.md MOI: full ERD 19 table mermaid + data flow diagram + vong doi 1 HD (create → 7 transition → gen ma → publish) + index strategy table + relationship cardinality + soft delete behavior + SQL queries (inbox/dashboard/gen ma) + migration history - docs/gotchas.md UPDATE: 17 → 26 pitfalls, them section "Claude Code harness quirks" (Edit File not read, DI build pass nhung runtime fail) + "Contract workflow" (ma HD gen 2 lan, BE-FE NEXT_PHASES sync, race condition) + "Permission matrix" (cache real-time, MenuKey typo) - docs/STATUS.md: Phase 4 MVP done, docs entry points section liet ke het, next Phase 5 Production - docs/HANDOFF.md: phase table them Phase 4 row, file tree update voi Reports, test points day du, git state commit 7 - docs/changelog/migration-todos.md: tick Phase 4 MVP items + them iteration 2 list - docs/changelog/sessions/2026-04-21-1430-phase4-report.md: session log voi thong so cumulative (BE 3100 LOC, 30 docs) - CLAUDE.md root: update Tai lieu quan trong section them rules.md, architecture.md, schema-diagram.md, .claude/skills (13 links now) Bug fix: - TS unused import ContractPhaseLabel trong DashboardPage - DI thieu register IContractExcelExporter — build pass but runtime would fail (added) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
89 lines
4.6 KiB
Markdown
89 lines
4.6 KiB
Markdown
# CLAUDE.md — AI Agent Context
|
|
|
|
> **Full content:** [`docs/CLAUDE.md`](docs/CLAUDE.md)
|
|
|
|
---
|
|
|
|
**SOLUTION_ERP** — Hệ thống Quản lý Hợp đồng Nhà cung cấp / Thầu phụ / Tổ đội cho Công ty TNHH Xây dựng Solutions.
|
|
|
|
Kiến trúc: **.NET 10 Clean Architecture + 2 React FE (admin + user) + SQL Server + IIS**.
|
|
|
|
## 🚀 BẮT ĐẦU SESSION — 4 file đọc trước tiên
|
|
|
|
```
|
|
1. docs/STATUS.md ← Snapshot HIỆN TẠI (phase nào, việc gì đang làm)
|
|
2. docs/PROJECT-MAP.md ← Bản đồ toàn cảnh (nên đọc đầu dự án)
|
|
3. docs/changelog/migration-todos.md ← Atomic tasks theo từng phase
|
|
4. docs/workflow-contract.md ← ⭐ State machine 9 phase — ảnh hưởng mọi thiết kế
|
|
```
|
|
|
|
## ⚡ Quick Rules
|
|
|
|
### Backend — `.NET 10` Clean Architecture
|
|
|
|
- Solution: `SolutionErp.slnx` ở root, projects ở `src/Backend/`
|
|
- **4 layer:** `Api → Application ← Domain` + `Infrastructure → Application`
|
|
- Pattern: **CQRS + MediatR**, **FluentValidation**, **AutoMapper**
|
|
- Repository qua `IApplicationDbContext` interface (Application layer)
|
|
- Auth: **JWT Bearer + ASP.NET Identity**
|
|
- DB: **SQL Server** (LocalDB dev / SQL Server prod), **EF Core 10 Code-First migrations**
|
|
- Error handling: `GlobalExceptionMiddleware` map exception → HTTP status
|
|
- Commit scope tech stack: `Api` · `App` · `Domain` · `Infra`
|
|
|
|
### Frontend — 2 app React 18 + Vite + TS + shadcn/ui + TanStack Query
|
|
|
|
- `fe-admin/` (port **8082**) · `fe-user/` (port **8080**)
|
|
- Vite proxy `/api → http://localhost:5443` (SolutionErp.Api)
|
|
- **Named export**, không default export (trừ `App`)
|
|
- shadcn/ui copy-paste, **duplicate giữa 2 app là CÓ CHỦ ĐÍCH** (mỗi app UX riêng)
|
|
- Auth context: `solution-erp-admin-token` / `solution-erp-user-token` ở `localStorage`
|
|
- TanStack Query cho data fetching
|
|
- **Node pin `>=20`** trong `engines`; CI pin `20.x` qua `.nvmrc` (bài học NamGroup — KHÔNG dùng Node latest trên CI)
|
|
- UI **100% tiếng Việt**
|
|
|
|
### Database conventions
|
|
|
|
- Schema: `dbo` (single schema)
|
|
- Table: **PascalCase tiếng Anh** (Contracts, Suppliers, Projects, ContractApprovals, ...)
|
|
- PK: `Id` (Guid), FK: `{Entity}Id`
|
|
- Audit fields: `CreatedAt`, `UpdatedAt`, `CreatedBy`, `UpdatedBy` (`BaseEntity`)
|
|
- Soft delete: `IsDeleted`, `DeletedAt`, `DeletedBy` (`AuditableEntity`)
|
|
- Migrations: `dotnet ef migrations add <Name> --project src/Backend/SolutionErp.Infrastructure --startup-project src/Backend/SolutionErp.Api`
|
|
|
|
### Commit convention
|
|
|
|
```
|
|
[CLAUDE] <scope>: <imperative message>
|
|
```
|
|
|
|
**Scope:** `Contract` · `Form` · `Workflow` · `Supplier` · `Auth` · `Admin` · `Api` · `App` · `Domain` · `Infra` · `FE-Admin` · `FE-User` · `Docs` · `CICD` · `Scripts`
|
|
|
|
## 📖 Tài liệu quan trọng
|
|
|
|
| File | Nội dung |
|
|
|---|---|
|
|
| [`docs/STATUS.md`](docs/STATUS.md) | **🔥 Current state** — đọc đầu tiên |
|
|
| [`docs/HANDOFF.md`](docs/HANDOFF.md) | Brief 5 phút: session trước làm gì + next tasks |
|
|
| [`docs/rules.md`](docs/rules.md) | ⭐ Coding conventions (BE Clean Arch, FE React, DB, Git, Docs) |
|
|
| [`docs/architecture.md`](docs/architecture.md) | ⭐ Layered architecture + request lifecycle + deployment |
|
|
| [`docs/PROJECT-MAP.md`](docs/PROJECT-MAP.md) | Bản đồ tổng quan |
|
|
| [`docs/changelog/migration-todos.md`](docs/changelog/migration-todos.md) | Roadmap 5 phase + atomic tasks |
|
|
| [`docs/CLAUDE.md`](docs/CLAUDE.md) | Full context — tech stack chi tiết |
|
|
| [`docs/workflow-contract.md`](docs/workflow-contract.md) | State machine 9 phase + role matrix |
|
|
| [`docs/forms-spec.md`](docs/forms-spec.md) | Catalog 8 form + quy định mã HĐ RG-001 |
|
|
| [`docs/database/database-guide.md`](docs/database/database-guide.md) | DB conventions + migration workflow + cheatsheet |
|
|
| [`docs/database/schema-diagram.md`](docs/database/schema-diagram.md) | ⭐ ERD + luồng DB + data flow 19 table |
|
|
| [`docs/flows/README.md`](docs/flows/README.md) | Index 6 flow (auth, permission, contract, form, SLA) |
|
|
| [`docs/gotchas.md`](docs/gotchas.md) | ⭐ 26 bẫy đã gặp — đọc trước khi debug tương tự |
|
|
| [`.claude/skills/`](.claude/skills/README.md) | 3 skill: contract-workflow, form-engine, permission-matrix |
|
|
|
|
## ⚠️ Kết thúc session
|
|
|
|
1. Update `docs/STATUS.md` (`In Progress` → `Recently Done`)
|
|
2. Tick checklist tương ứng trong `docs/changelog/migration-todos.md`
|
|
3. Tạo session log `docs/changelog/sessions/YYYY-MM-DD-HHMM-{topic}.md` nếu đáng ghi
|
|
4. Commit `[CLAUDE] <scope>: <message>`
|
|
5. ⚠️ **Update `SolutionErp.slnx`** nếu có `.cs/.csproj` mới
|
|
|
|
> Bỏ qua nếu chỉ trả lời câu hỏi, không sửa file nào.
|