Appearance
Delivery Index — Quản lý vật tư theo Subtask
| Field | Value |
|---|---|
| Feature | Quản lý vật tư theo Subtask (subtask-material) |
| Version | 1.0 |
| Date | 2026-03-26 |
| Profile | M (Medium) |
| Quality Bar | ✅ 20/20 (M profile) |
Files
| # | File | Path | Audience |
|---|---|---|---|
| 1 | PRD | docs/features/subtask-material/prd.md | PO, Tech Lead, all |
| 2 | UI Spec | docs/features/subtask-material/ui-spec.md | UI/UX Designer, Frontend Dev |
| 3 | Dev Spec | docs/features/subtask-material/dev-spec.md | Frontend Dev, Backend Dev |
| 4 | QA Test Plan | docs/features/subtask-material/qa-test-plan.md | QA |
| 5 | Design Doc (reference) | docs/superpowers/specs/2026-03-26-subtask-material-management-design.md | Tech Lead (deep context) |
| 6 | Handoff (this file) | docs/features/subtask-material/handoff.md | All |
Timeline
| Milestone | Target | Owner | Dependency |
|---|---|---|---|
| M1: Migration + Hasura metadata (test env) | T+2d | Backend Dev | — |
| M2: MaterialForm component + auto-fill | T+5d | Frontend Dev | M1 |
| M3: Tích hợp TaskForm + save flow | T+7d | Frontend Dev | M2 |
| M4: Aggregate view + backward compat | T+9d | Frontend Dev | M1 |
| M5: Fix button + delete confirm + readonly + disabled | T+10d | Frontend Dev | M2 |
| M6: QA testing | T+11d | QA | M3, M4, M5 |
| M7: Deploy production | T+12d | DevOps | M6 pass |
Critical path: M1 → M2 → M3 → M6 → M7
Parallel work: M4 và M5 có thể làm song song với M3 (cùng depend M1/M2, không depend nhau).
RACI
| Deliverable | PO/BA | FE Dev | BE Dev | QA | UI/UX | DevOps |
|---|---|---|---|---|---|---|
| Migration + Hasura | I | — | R/A | I | — | C |
| MaterialForm component | I | R/A | — | C | C | — |
| Aggregate view | I | R/A | — | C | — | — |
| Fix button + confirm + readonly | I | R/A | — | C | — | — |
| QA testing | C | C | C | R/A | — | — |
| Deploy staging | I | C | C | A | — | R |
| Deploy production | A | I | I | C | — | R |
Open Items
| ID | Item | Owner | Deadline | Status |
|---|---|---|---|---|
| AI-01 | UI Designer review wireframes (MaterialForm layout, badge "Ngưng KD") | UI/UX Designer | T+3d | Open |
| AI-02 | QA review test plan + confirm seed data approach | QA Lead | T+3d | Open |
| AI-03 | DevOps verify migration strategy trên staging | DevOps | T+2d | Open |
Day 0 Verification (Dev chạy trước khi code)
Backend Dev
- [ ]
go test ./...pass trên main (verify không có test break) - [ ] Confirm migration timestamp > latest migration trong
projectDB:sqlSELECT name FROM hdb_catalog.schema_migrations ORDER BY name DESC LIMIT 1; - [ ] Hasura metadata version khớp:bash
hasura metadata export --project diva-backend/services/controller
Frontend Dev
- [ ]
pnpm codegenpass (không có type errors sau thêm fragment) - [ ] Verify các file sẽ sửa không có conflict:
src/modules/projects/components/TaskForm/index.tsx— 2,409 lines, kiểm tra không ai đang sửasrc/modules/projects/components/TaskDetail/SubtaskTable.tsxsrc/modules/projects/components/TaskDetail/General.tsxsrc/modules/projects/components/TaskDetail/MaterialTable.tsxsrc/modules/projects/graphql/project.graphql
- [ ] Verify
ServiceFormMaterial.tsxvẫn tồn tại (tham khảo pattern search product):src/modules/ecommerce/components/service/ServiceForm/ServiceFormMaterial.tsx
QA
- [ ] Test accounts sẵn sàng trên test env:
- Staff (KTV): có assign vào ít nhất 1 subtask
- Manager: có quyền quản lý project
- Admin (IT Leader): full access
- Call Center: verify MaterialForm ẩn
- [ ] Test data:
- Ít nhất 1 task cha có 2+ subtask (automatic board)
- Ít nhất 1 service có
product_relationvớisubtask_id(cho auto-fill test) - Ít nhất 1 task cha có
order_materialscũ (cho backward compat test)
All
- [ ] Đọc PRD section A2 "Tổng quan dễ hiểu" trước khi bắt đầu
- [ ] Đọc design doc nếu cần deep context kỹ thuật
Dev Task Checklist (từ dev-spec C11)
Backend (T1-T3: ~1.25d)
- [ ] T1 (0.5d): Tạo migration
create_project_task_material— DDL + indexes + trigger - [ ] T2 (0.5d): Tạo Hasura metadata
public_project_task_material.yaml— permissions + remote relationship - [ ] T3 (0.25d): Sửa
public_project_task.yamlthêmtask_materialsrelationship + updatetables.yaml
Frontend — Core (T4-T8: ~5.5d)
- [ ] T4 (0.5d): Thêm GraphQL fragment
task_materials+ mutations + queries vàoproject.graphql→ runpnpm codegen - [ ] T5 (2d): Tạo
MaterialForm.tsx— bảng editable (columns, inline SL input, delete icon, search bar) - [ ] T6 (1d): Auto-fill logic — query
product_relation→ map → fill MaterialForm - [ ] T7 (1d): Tích hợp MaterialForm vào
TaskForm/index.tsxkhiisChild=true - [ ] T8 (1d): Save flow — insert materials sau insert subtask, delete+re-insert khi sửa
Frontend — Support (T9-T14: ~2d)
- [ ] T9 (0.25d): Fix button label
SubtaskTable.tsx:402→ "Thêm công việc" - [ ] T10 (0.25d): Sửa delete confirm dialog — mention materials count
- [ ] T11 (1d): Aggregate view
General.tsx— flat query + aggregate logic + render - [ ] T12 (0.5d): Backward compat — hiển thị cả order_materials cũ + data mới
- [ ] T13 (0.5d): Readonly mode MaterialForm khi done/canceled
- [ ] T14 (0.5d): Product disabled — filter auto-fill/search + badge "Ngưng KD"
Testing (T15: ~1d)
- [ ] T15 (1d): Dev testing + bug fix trước handoff cho QA
Tổng: ~10.75d
Acceptance Criteria (Final sign-off)
| # | Criteria | Verify by |
|---|---|---|
| 1 | Tạo subtask với auto-fill vật tư → save thành công → DB có records | QA (TC-CP-001) |
| 2 | Sửa subtask: thay đổi SL + thêm/xóa → save đúng | QA (TC-CP-002) |
| 3 | Aggregate task cha = SUM tất cả subtask con, cộng dồn đúng | QA (TC-CP-003) |
| 4 | Xóa subtask → CASCADE materials + aggregate giảm + confirm dialog mention count | QA (TC-CP-004) |
| 5 | Backward compat: task cha có order_materials cũ vẫn hiển thị | QA (TC-FR-006a) |
| 6 | Tiền tour KHÔNG bị ảnh hưởng | QA (verify trên subtask có materials + tour_money) |
| 7 | Button "Thêm công việc" (không còn "Thêm vật tư") | QA (TC-FR-007a) |
| 8 | Readonly khi subtask done/canceled | QA (TC-FR-004) |
| 9 | Product disabled → filtered + badge | QA (TC-FR-008a, TC-FR-008b) |
| 10 | Performance: insert 10 materials < 500ms, aggregate 100 records < 200ms | QA (TC-NFR-001, TC-NFR-002) |
Không ảnh hưởng (reassurance cho team)
- Tiền tour/Commission/Lương: ZERO coupling — đã chứng minh trong design doc section 3
- Report modules: Không thay đổi — reports chỉ filter
order_kind, không aggregate materials - Flow giao việc hàng loạt: Không thay đổi
- Backend event triggers: Không thêm trigger mới
- Order/Kho: Không đụng — phase 2