[CLAUDE] Docs: chốt Phase 6 — Module Duyệt NCC E2E
Update 5 file:
- STATUS.md: phase hiện tại + recently done 4 entry + cumulative stats
(46 tables, ~110 endpoints, 12 migrations, ~26 FE pages)
- HANDOFF.md: TL;DR + thêm row "Module Duyệt NCC E2E" ✅
- changelog/migration-todos.md: thêm Phase 6 section với checklist
done/optional (PE Workflow admin UI + Attachments + Auto-map
Details skip MVP)
- database/schema-diagram.md: Migration 12 row + section 11 "PurchaseEvaluation
module" full (10 bảng + state machine + kế thừa HĐ flow)
- changelog/sessions/2026-04-23-2300-purchase-evaluations.md: session
log đầy đủ (user input + design + 4 commit + stats + skip MVP notes)
This commit is contained in:
@ -480,8 +480,9 @@ COMMIT;
|
||||
| **9** | **`AddContractDetailsAndChangelog`** | **7 ContractType-specific Details + ContractChangelogs (unified audit log)** |
|
||||
| **10** | **`AddMasterCatalogs`** | **UnitsOfMeasure, MaterialItems, ServiceItems, WorkItems** |
|
||||
| **11** | **`AddRoleShortNameAndUserDepartment`** | **+Role.ShortName + User.DepartmentId/Position (cột thêm, không bảng mới)** |
|
||||
| **12** | **`AddPurchaseEvaluations`** | **10 bảng module Duyệt NCC: PurchaseEvaluations + Suppliers + Details + Quotes + Approvals + Changelogs + Attachments + WorkflowDefinitions + WorkflowSteps + WorkflowStepApprovers** |
|
||||
|
||||
Tổng: **36 bảng** (+ `__EFMigrationsHistory` hệ thống).
|
||||
Tổng: **46 bảng** (+ `__EFMigrationsHistory` hệ thống).
|
||||
|
||||
## 8bis. Bảng mới sau Migration 9-11
|
||||
|
||||
@ -566,7 +567,65 @@ Common: `AuditableEntity`, `IX_<Table>_Code` UNIQUE filtered `IsDeleted=0`,
|
||||
- Runtime guard hiện tại chỉ dùng Role-kind (User-kind data model ready, enable iter sau)
|
||||
```
|
||||
|
||||
## 10. Liên quan
|
||||
## 11. PurchaseEvaluation module (Migration 12 — 10 bảng mới)
|
||||
|
||||
Module tiền-HĐ: phiếu trình duyệt so sánh giá N NCC × M hạng mục.
|
||||
Sau khi DaDuyet → user click "Tạo HĐ từ phiếu" → gen Contract draft
|
||||
kế thừa Supplier/Project/GiaTri, link qua `PurchaseEvaluation.ContractId`.
|
||||
|
||||
### Core (7 bảng):
|
||||
|
||||
| Bảng | Mục đích |
|
||||
|---|---|
|
||||
| `PurchaseEvaluations` | Header. MaPhieu auto PE-YYYYMM-XXXX, Type enum (1=DuyetNcc A, 2=DuyetNccPhuongAn B), Phase (7 state + TuChoi), WorkflowDefinitionId pinned at create, SelectedSupplierId (winner), PaymentTerms JSON (D section form), ContractId? FK kế thừa. AuditableEntity. |
|
||||
| `PurchaseEvaluationSuppliers` | N:M Phiếu × Supplier. DisplayName ("TGN-30 ngày"), ContactName/Email/Phone (E section), PaymentTermText per NCC, Note (chip "ĐÃ CHỐT SO SÁNH LẦN 1/2"), Order. UK(EvaluationId, SupplierId). |
|
||||
| `PurchaseEvaluationDetails` | Hạng mục so sánh. GroupCode (A.I/II/III/IV), GroupName (Bê tông/Phụ gia...), ItemCode, NoiDung, ĐơnViTinh, KhoiLuongNganSach/ThiCong, DonGiaNganSach, ThanhTienNganSach. |
|
||||
| `PurchaseEvaluationQuotes` | Báo giá per NCC per Detail (matrix cell). FK Detail + Supplier-row, BgVat/ChuaVat/ThanhTien, IsSelected flag, Note. UK(DetailId, SupplierId). |
|
||||
| `PurchaseEvaluationApprovals` | Workflow history (giống ContractApprovals). FromPhase/ToPhase/Decision/Comment/ApprovedAt. |
|
||||
| `PurchaseEvaluationChangelogs` | Audit log unified (EntityType: Header/Supplier/Detail/Quote/Workflow/Attachment + Action: Insert/Update/Delete/Transition). |
|
||||
| `PurchaseEvaluationAttachments` | File upload — báo giá NCC gửi, bản vẽ, phiếu export. Purpose enum. |
|
||||
|
||||
### Workflow config (3 bảng — tái dùng pattern HĐ versioned):
|
||||
|
||||
| Bảng | Mục đích |
|
||||
|---|---|
|
||||
| `PurchaseEvaluationWorkflowDefinitions` | Versioned definition per Type. Code+Version UNIQUE, IsActive (1 per Type). Seed v01: QT-DN-A (3-step) + QT-DN-B (5-step). |
|
||||
| `PurchaseEvaluationWorkflowSteps` | Ordered steps: Order+Phase+Name+SlaDays. |
|
||||
| `PurchaseEvaluationWorkflowStepApprovers` | Role/User kind + AssignmentValue (reuse WorkflowApproverKind enum từ HĐ). |
|
||||
|
||||
### State machine PE Phase:
|
||||
|
||||
```
|
||||
A (NccOnly 3-step):
|
||||
DangSoanThao → ChoPurchasing → ChoCCM → ChoCEODuyetNCC → DaDuyet
|
||||
bất kỳ phase duyệt reject → DangSoanThao
|
||||
DangSoanThao → TuChoi (cancel)
|
||||
|
||||
B (NccWithPlan 5-step):
|
||||
DangSoanThao → ChoPurchasing → ChoDuAn → ChoCCM → ChoCEODuyetPA → ChoCEODuyetNCC → DaDuyet
|
||||
Role mapping: Drafter/DeptManager → Procurement (PRO) → ProjectManager (PM) → CostControl (CCM) → Director (BOD)
|
||||
```
|
||||
|
||||
### Kế thừa HĐ flow:
|
||||
|
||||
```
|
||||
PE.Phase=DaDuyet && SelectedSupplierId && !ContractId
|
||||
→ user FE click "Tạo HĐ từ phiếu"
|
||||
→ pick ContractType (1-7) + TenHopDong + bypassCCM flag
|
||||
→ POST /api/purchase-evaluations/{id}/create-contract
|
||||
→ CreateContractFromEvaluationCommand:
|
||||
1. Verify PE state
|
||||
2. new Contract { SupplierId=PE.Selected, ProjectId=PE.Project, ... }
|
||||
3. GiaTri = sum(PE.Details.ThanhTienNganSach)
|
||||
4. DraftData = PE.PaymentTerms (carry)
|
||||
5. WorkflowDefinitionId = active ContractWorkflowDefinition[Type]
|
||||
6. Gen MaHopDong (ContractCodeGenerator SERIALIZABLE)
|
||||
7. PE.ContractId = contract.Id (link 2 chiều)
|
||||
8. Changelog cả 2 bảng
|
||||
→ navigate /contracts/{newId}
|
||||
```
|
||||
|
||||
## 12. Liên quan
|
||||
|
||||
- [`database-guide.md`](database-guide.md) — conventions + migration workflow + cheatsheet đầy đủ
|
||||
- [`../architecture.md`](../architecture.md) — layered architecture + data flow
|
||||
|
||||
Reference in New Issue
Block a user