# 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 --project src/Backend/SolutionErp.Infrastructure --startup-project src/Backend/SolutionErp.Api` ### Commit convention ``` [CLAUDE] : ``` **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/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, architecture | | [`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Đ | | [`docs/database/database-guide.md`](docs/database/database-guide.md) | DB conventions + schema hiện tại + planned + ERD | | [`docs/flows/README.md`](docs/flows/README.md) | Index 6 flow (auth, permission, contract create/approve, form render, SLA) | | [`docs/gotchas.md`](docs/gotchas.md) | ⭐ 17 bẫy đã gặp — đọc trước khi debug tương tự | | [`docs/HANDOFF.md`](docs/HANDOFF.md) | Brief 5 phút: session trước làm gì + P1 tasks tiếp | ## ⚠️ 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] : ` 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.