|
|
5c200978cb
|
[CLAUDE] Domain+Infra: Migration 16 — 2-stage dept approval + smart reject schema
Chunk A của feature 2-stage department approval (Phase 9). 3 ràng buộc gộp
1 migration để rollback atomic.
Schema changes:
1. Smart reject (3 ALTER):
- Contracts.RejectedFromPhase int NULL
- PurchaseEvaluations.RejectedFromPhase int NULL
- Budgets.RejectedFromPhase int NULL
Lưu phase nguồn khi reject để Drafter trình lại quay về đúng phase
(skip phase trung gian đã duyệt) thay vì đi tuần tự từ DangSoanThao.
2. Bypass per-user (1 ALTER):
- Users.CanBypassReview bit NOT NULL DEFAULT 0
Khi true → NV được duyệt thay TPB (skip Stage Review, đẩy thẳng
Stage Confirm). Audit qua DepartmentApproval.IsBypassed=true.
3. 2-stage dept approval (3 CREATE TABLE):
- ContractDepartmentApprovals
- PurchaseEvaluationDepartmentApprovals
- BudgetDepartmentApprovals
Schema (chung):
- Id, *Id FK Cascade, PhaseAtApproval int, DepartmentId FK
- Stage enum (1=Review NV, 2=Confirm TPB)
- ApproverUserId, ApproverRoleSnapshot, Comment, ApprovedAt
- IsBypassed bit (mark NV bypass)
- AuditableEntity (CreatedAt/By/UpdatedAt/By/IsDeleted/...)
Indexes:
- UNIQUE (TargetId, PhaseAtApproval, DepartmentId, Stage)
- Single: TargetId, DepartmentId, ApproverUserId
Files:
- Domain: 4 entity update (Contract/PE/Budget/User add field) + 1 enum mới
ApprovalStage + 3 entity DepartmentApproval mới
- Infrastructure: 3 EntityConfiguration update + 1 file mới
DepartmentApprovalsConfiguration với 3 config classes
- IApplicationDbContext: thêm 3 DbSet
- ApplicationDbContext: thêm 3 DbSet
- Migration 16: 3 file (.cs + Designer.cs + Snapshot.cs) — 3-file rule
Verify:
- Build pass (2 warning DocxRenderer cũ, không liên quan)
- 77 unit test pass (54 Domain + 23 Infra) — Domain policy chưa update,
test pass nguyên không regression
Note: KHÔNG khác PurchaseEvaluationDepartmentOpinion (Migration 15) —
Opinion là sign-off block "Ý kiến 4 phòng ban" trên header phiếu.
DepartmentApproval mới là 2-stage approval workflow per phase.
Tổng sau Migration 16: 55 bảng (52+3), 16 migration. Chunk B-E sẽ implement
Application + FE + Tests.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-04 12:11:53 +07:00 |
|
|
|
702411fcc8
|
[CLAUDE] Phase1: foundation - BE Clean Arch + Identity + JWT + 2 FE React + login E2E
Backend (.NET 10):
- Domain: BaseEntity/AuditableEntity, ContractType/Phase/ApprovalDecision enums, User/Role (Identity<Guid>), AppRoles (12 const)
- Application: IApplicationDbContext/ICurrentUser/IDateTime/IJwtTokenService, custom exceptions, ValidationBehavior (MediatR pipeline), Auth CQRS (Login/Refresh/Me), DependencyInjection
- Infrastructure: ApplicationDbContext (IdentityDbContext), AuditingInterceptor (auto audit + soft delete), DbInitializer (seed 12 role + admin), DesignTimeDbContextFactory, JwtTokenService, DateTimeService, DI
- Api: CurrentUserService, GlobalExceptionMiddleware (ProblemDetails), AuthController, Program.cs rewrite (Serilog + JWT + CORS + Swagger), appsettings + launchSettings (port 5443)
- Migration Init applied to SolutionErp_Dev LocalDB
Frontend (React 19 + Vite 8 + Tailwind 4):
- fe-admin (:8082 blue) + fe-user (:8080 emerald) - shared structure, khac menu + brand color
- Tailwind 4 via @tailwindcss/vite plugin, theme brand colors
- AuthContext (localStorage token), ProtectedRoute, Layout (sidebar + header)
- UI kit: Button/Input/Label (CVA + Tailwind)
- LoginPage voi toast error, DashboardPage/InboxPage placeholder
- Axios interceptor: auto Bearer + 401 redirect
- TanStack Query client, React Router 7, Sonner toast
Package downgrades (do .NET 10 / TS 6 compat):
- MediatR 14 -> 12.4.1 (v14 breaking changes)
- Swashbuckle 10 -> 6.9.0 (v10 khong tuong thich OpenApi 2)
- Removed Microsoft.AspNetCore.OpenApi (conflict voi Swashbuckle)
E2E verified: POST /api/auth/login qua Vite proxy ca 2 FE -> JWT + user info
Credentials seed: admin@solutionerp.local / Admin@123456
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-04-21 10:59:44 +07:00 |
|