Skip to content

Delivery Index — Quản lý vật tư theo Subtask

FieldValue
FeatureQuản lý vật tư theo Subtask (subtask-material)
Version1.0
Date2026-03-26
ProfileM (Medium)
Quality Bar✅ 20/20 (M profile)

Files

#FilePathAudience
1PRDdocs/features/subtask-material/prd.mdPO, Tech Lead, all
2UI Specdocs/features/subtask-material/ui-spec.mdUI/UX Designer, Frontend Dev
3Dev Specdocs/features/subtask-material/dev-spec.mdFrontend Dev, Backend Dev
4QA Test Plandocs/features/subtask-material/qa-test-plan.mdQA
5Design Doc (reference)docs/superpowers/specs/2026-03-26-subtask-material-management-design.mdTech Lead (deep context)
6Handoff (this file)docs/features/subtask-material/handoff.mdAll

Timeline

MilestoneTargetOwnerDependency
M1: Migration + Hasura metadata (test env)T+2dBackend Dev
M2: MaterialForm component + auto-fillT+5dFrontend DevM1
M3: Tích hợp TaskForm + save flowT+7dFrontend DevM2
M4: Aggregate view + backward compatT+9dFrontend DevM1
M5: Fix button + delete confirm + readonly + disabledT+10dFrontend DevM2
M6: QA testingT+11dQAM3, M4, M5
M7: Deploy productionT+12dDevOpsM6 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

DeliverablePO/BAFE DevBE DevQAUI/UXDevOps
Migration + HasuraIR/AIC
MaterialForm componentIR/ACC
Aggregate viewIR/AC
Fix button + confirm + readonlyIR/AC
QA testingCCCR/A
Deploy stagingICCAR
Deploy productionAIICR

Open Items

IDItemOwnerDeadlineStatus
AI-01UI Designer review wireframes (MaterialForm layout, badge "Ngưng KD")UI/UX DesignerT+3dOpen
AI-02QA review test plan + confirm seed data approachQA LeadT+3dOpen
AI-03DevOps verify migration strategy trên stagingDevOpsT+2dOpen

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 project DB:
    sql
    SELECT 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 codegen pass (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ửa
    • src/modules/projects/components/TaskDetail/SubtaskTable.tsx
    • src/modules/projects/components/TaskDetail/General.tsx
    • src/modules/projects/components/TaskDetail/MaterialTable.tsx
    • src/modules/projects/graphql/project.graphql
  • [ ] Verify ServiceFormMaterial.tsx vẫ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_relation với subtask_id (cho auto-fill test)
    • Ít nhất 1 task cha có order_materials cũ (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.yaml thêm task_materials relationship + update tables.yaml

Frontend — Core (T4-T8: ~5.5d)

  • [ ] T4 (0.5d): Thêm GraphQL fragment task_materials + mutations + queries vào project.graphql → run pnpm 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.tsx khi isChild=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)

#CriteriaVerify by
1Tạo subtask với auto-fill vật tư → save thành công → DB có recordsQA (TC-CP-001)
2Sửa subtask: thay đổi SL + thêm/xóa → save đúngQA (TC-CP-002)
3Aggregate task cha = SUM tất cả subtask con, cộng dồn đúngQA (TC-CP-003)
4Xóa subtask → CASCADE materials + aggregate giảm + confirm dialog mention countQA (TC-CP-004)
5Backward compat: task cha có order_materials cũ vẫn hiển thịQA (TC-FR-006a)
6Tiền tour KHÔNG bị ảnh hưởngQA (verify trên subtask có materials + tour_money)
7Button "Thêm công việc" (không còn "Thêm vật tư")QA (TC-FR-007a)
8Readonly khi subtask done/canceledQA (TC-FR-004)
9Product disabled → filtered + badgeQA (TC-FR-008a, TC-FR-008b)
10Performance: insert 10 materials < 500ms, aggregate 100 records < 200msQA (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