Skip to content

Delivery Index — Kho vật tư

FieldValue
FeatureKho vật tư — Quản lý định lượng & giá vật tư dịch vụ (material-warehouse)
Version3.0
Date2026-03-27
ProfileL (Large)
Quality BarPending

Files

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

RACI

DeliverablePO/BAFE DevBE DevQAUI/UXDevOps
DB Migration (6 bảng + 1 ALTER)IR/AIC
Hasura Metadata (8 files)IR/AIC
Event Trigger handlers (autoDeduct + autoReverse)IR/AC
Low Stock Notification logicIR/AC
SCR-01 Danh sách kho vật tưIR/ACC
SCR-02 Form cấu hình vật tưIR/ACC
SCR-03 Chi tiết + lịch sửIR/AC
SCR-04 MaterialForm nâng cấp (ĐVT/giá)IR/ACC
SCR-05 Aggregate view nâng cấpIR/AC
SCR-06 Nhập kho manual + ExcelIR/ACC
SCR-07 Kiểm kê + điều chỉnhIR/ACC
Sidebar tài chính — nguồn mớiIR/AC
Cảnh báo tồn kho trên subtask formIR/AC
Batch table + FIFO logic + Cron HSDIR/AC
Batch UI (nhập kho mở rộng + danh sách lô)IR/ACC
SCR-08 Form chuyển kho (branch → material warehouse)IR/ACCC
Update SCR-01: nút [★ Chuyển kho] + [Nhập tay]IR/AC
Transfer action + event trigger (BE)IR/AC
QA Testing (85 TCs)CCCR/A
Deploy stagingICCAR
Deploy productionAIICR

Timeline

MilestoneTargetOwnerDependencyOutput
M1: DB Migration + Hasura metadata (test env)T+4dBE Dev6 bảng, 1 ALTER, 8 Hasura files, event trigger + cron registered
M2: Event triggers (autoDeduct FIFO + autoReverse + notification)T+8dBE DevM1Go handlers: FIFO deduct logic, batch split, cron expiry check tested on staging
M3: SCR-01 + SCR-02 + SCR-03 (Kho vật tư CRUD)T+11dFE DevM1Danh sách, form cấu hình, chi tiết + lịch sử
M4: SCR-06 + SCR-07 (Nhập kho batch + Kiểm kê)T+14dFE DevM1, M3Nhập tay (tạo lô), import Excel, kiểm kê điều chỉnh, danh sách lô
M5: SCR-04 + SCR-05 nâng cấp (ĐVT, giá, aggregate)T+17dFE DevM1, M2MaterialForm + aggregate view + sidebar tài chính
M5b: Transfer BE (action + event trigger)T+12dBE DevM1, T6transferToMaterialWarehouse action, inventory_document_material_warehouse event trigger
M6: SCR-08 Transfer + SCR-01 buttonsT+19dFE DevM1, M5bSCR-08 form chuyển kho, SCR-01 nút [★ Chuyển kho] + [Nhập tay]
M7: QA TestingT+25dQAM2, M3, M4, M5, M5b, M685 TCs executed, bugs fixed
M8: Deploy productionT+29dDevOpsM7 pass + Sign-offProduction live

Critical path: M1 → M2 → M5 → M7 → M8

Parallel work:

  • M3 và M4 có thể làm song song (cùng depend M1, không depend nhau)
  • M5 cần M2 (event triggers) cho test auto-deduct trên FE
  • M5b (transfer BE) có thể song song với M3/M4/M5, chỉ depend M1 + T6
  • M6 (transfer FE) depend M5b, có thể song song với M5

Task Breakdown

Backend Tasks (T1-T11: ~11d)

TaskMô tảOwnerEstimateDependencyStatus
T1Migration create_material_warehouse — DDL + UNIQUE(branch_id)BE Dev0.25d[ ] Todo
T2Migration create_material_price_config — DDL + CHECK constraints + unique indexesBE Dev0.5d[ ] Todo
T3Migration create_material_usage_unit — DDL + UNIQUE(config_id, usage_unit_name)BE Dev0.5dT2[ ] Todo
T4Migration create_material_stock_movement — DDL + indexes + VIEW material_stock_balanceBE Dev0.5dT1[ ] Todo
T5Migration ALTER project_task_material — thêm 10 cột (usage_unit, unit_price, amount, ...)BE Dev0.25d[ ] Todo
T6Hasura metadata — 7 files (4 bảng mới + view + update ptm + tables.yaml) + permissionsBE Dev1dT1-T5[ ] Todo
T7Event trigger handlers — materialAutoDeduct (FIFO batch split) + materialAutoReverse + low stock notificationBE Dev4dT6[ ] Todo
T7bMigration create_material_batch — DDL + indexes (warehouse_id, product_id, status, expiry_date) + CHECK constraintBE Dev0.5dT1[ ] Todo
T7cFIFO deduct logic — batch selection (oldest active first), split across batches, block if insufficientBE Dev2dT7, T7b[ ] Todo
T7dCron material_batch_expiry_check — auto-lock expired batches + 90-day warning notificationBE Dev1dT7b, T6[ ] Todo
T7eHasura metadata material_batch.yaml — permissions Admin/ManagerBE Dev0.5dT7b[ ] Todo

Frontend Tasks (T8-T19b: ~15d)

TaskMô tảOwnerEstimateDependencyStatus
T8GraphQL fragments + mutations + queries cho 5 bảng mới → pnpm codegenFE Dev0.5dT6[ ] Todo
T9SCR-01: Trang danh sách Kho vật tư (route + page + table + search + branch dropdown)FE Dev2dT8[ ] Todo
T10SCR-02: Form cấu hình vật tư (giá, hao hụt, ĐVT, auto-calc giá)FE Dev2dT8[ ] Todo
T11SCR-03: Chi tiết vật tư + lịch sử giá + lịch sử movement (pagination)FE Dev1.5dT8[ ] Todo
T12SCR-06: Nhập kho manual (multi-row form + validation)FE Dev1.5dT8[ ] Todo
T12bSCR-06: Nhập kho mở rộng — thêm fields lô: batch_code, purchase_price, expiry_dateFE Dev1dT12[ ] Todo
T12cDanh sách lô per sản phẩm — bảng lô với status badge, HSD, remaining_qtyFE Dev1dT8, T7e[ ] Todo
T13SCR-06b: Import Excel nhập kho (upload + preview + confirm)FE Dev0.5dT12[ ] Todo
T14SCR-07: Kiểm kê (bảng so sánh hệ thống vs thực tế + adjustment)FE Dev1.5dT8[ ] Todo
T15SCR-04: Nâng cấp MaterialForm — dropdown ĐVT, cột giá/thành tiền, snapshot logicFE Dev2dT8, T7[ ] Todo
T16SCR-05: Nâng cấp Aggregate view — cột giá + FORMULA-005FE Dev0.5dT15[ ] Todo
T17Sidebar tài chính — thêm nguồn chi phí vật tư (FORMULA-005 + backward compat)FE Dev1dT15[ ] Todo
T18Cảnh báo tồn kho trên form subtask (badge đỏ + tooltip)FE Dev0.5dT8[ ] Todo
T19Permission integration — ẩn menu/cột theo role + branch scopingFE Dev0.5dT9-T18[ ] Todo

Transfer Tasks — v3.0 (T21-T26: ~8.25d)

TaskMô tảOwnerEstimateDependencyStatus
T21BE: transferToMaterialWarehouse action handler — validate branch warehouse stock, unit conversion, lot selection FIFO, create movement pair (out branch + in material)BE Dev2dT6[ ] Todo
T22BE: inventory_document_material_warehouse event trigger — listen inventory_document insert (type=transfer_to_material), auto-create stock movement in material warehouseBE Dev1.5dT21[ ] Todo
T23BE: Add master_data entries — transfer behavior configs (DEC-D29, DEC-D30, DEC-D32)BE Dev0.25dT6[ ] Todo
T24FE: SCR-08 Transfer form page — branch selector, product search (reuse ProductLotNumberSelect), lot selection table, dual-input (qty + ĐVT quy đổi), submit + confirm dialogFE Dev2.5dT8, T21[ ] Todo
T25FE: Update SCR-01 — thêm nút [★ Chuyển kho] + [Nhập tay] trên toolbar, routing to SCR-08 / SCR-06FE Dev0.5dT9, T24[ ] Todo
T26QA: Transfer test cases (TC-TRF-001→017, 17 TCs) — happy path, insufficient stock, unit conversion, lot FIFO, concurrent transfer, permissionQA1.5dT22, T25[ ] Todo

QA Tasks (T20: ~3d)

TaskMô tảOwnerEstimateDependencyStatus
T20Execute 64 test cases (16 nhóm gốc + pricing + config) + regression + bug verificationQA3dT7e, T19[ ] Todo

Tổng: ~33d


Notes

BE Dev Notes

  • Concurrency: Event trigger materialAutoDeduct PHẢI dùng pg_advisory_xact_lock(hashtext(warehouse_id || product_id)) — serialize per (warehouse, product) để tránh race condition running_balance
  • Immutable log: material_stock_movement KHÔNG có update/delete permission trong Hasura. Sai → tạo movement mới điều chỉnh (BR-13)
  • Price precision: NUMERIC(15,4) cho đơn giá nội bộ, BIGINT cho amount cuối (DEC-D01). Round 1 lần duy nhất ở amount
  • Reverse logic: Khi undo subtask done HOẶC cancel sau done → tạo movement auto_reverse (KHÔNG dùng auto_deduct cho reverse, DEC-D18)
  • Branch fallback: Query giá: WHERE (branch_id = $bid OR branch_id IS NULL) AND effective_to IS NULL ORDER BY branch_id NULLS LAST LIMIT 1 (BR-12)
  • Transfer action: transferToMaterialWarehouse PHẢI tạo movement pair đối xứng: 1 movement transfer_out ở branch warehouse + 1 movement transfer_in ở material warehouse trong cùng transaction (DEC-D29)
  • No approval flow: Transfer không cần duyệt (DEC-D31) — action thực hiện ngay khi submit
  • Unit conversion: Khi transfer, quy đổi theo material_price_config.source_quantity (đơn vị mua → stock unit), KHÔNG dùng to_stock_factor (usage unit → stock unit)
  • Lot selection: Transfer để user chọn lot thủ công theo PRD (DEC-D36), KHÔNG tự động chọn FIFO rồi mới override

FE Dev Notes

  • Snapshot giá: Khi thêm vật tư vào subtask → copy unit_price, to_stock_factor, config_version_id tại thời điểm thêm. KHÔNG query lại giá khi mở form sửa (DEC-D05)
  • Staff view: Ẩn cột Đơn giá + Thành tiền cho role Staff (KTV). Check hasRole('staff') → hide columns (DEC-D10)
  • Discrete validation: Nếu is_discrete = true → input SL chỉ chấp nhận số nguyên (BR-04)
  • Product disabled: Filter search + badge "Ngưng KD" — pattern tham khảo từ ServiceFormMaterial.tsx
  • Auto-calc: Khi Admin sửa source_price / wastage_rate trên form cấu hình → usage_unit_price recalc realtime (BR-07). Dùng computed hoặc watch trong Vue
  • Backward compat: Sidebar tài chính phải check cả project_task_material.amount (mới) VÀ inventory_document.capture (cũ) — FORMULA-005
  • SCR-08 Transfer form: Reuse ProductLotNumberSelect component cho lot selection. Dual-input: hiển thị cả qty ĐVT gốc + qty ĐVT quy đổi, auto-calc khi nhập 1 bên (DEC-D33)
  • SCR-01 buttons: Thêm [★ Chuyển kho] (primary, icon star) + [Nhập tay] (secondary) trên toolbar. Ẩn [★ Chuyển kho] nếu chưa có branch warehouse nào (DEC-D30)

QA Notes

  • Seed data: Chạy DS-001 → DS-006 trên test env trước khi bắt đầu test. Hoặc tạo bằng UI (option B)
  • Formula verification: Nhóm TC-FML là critical — verify số liệu exact match (4 decimal)
  • Race condition test (TC-EC-002): Cần 2 browser sessions đồng thời chuyển subtask done. Dùng 2 tab hoặc 2 người test
  • Backward compat (TC-FI-002): Cần data cũ (inventory_document) trên test env. Hỏi DevOps nếu cần import
  • Transfer test (TC-TRF-*): Cần branch warehouse có stock để test chuyển kho. Setup: tạo inventory_document nhập kho ≥ 3 sản phẩm, mỗi SP ≥ 2 lô
  • Concurrent transfer (TC-TRF-012): 2 user cùng chuyển 1 SP, tổng vượt stock → 1 phải fail. Test bằng 2 browser sessions

Open Items

IDItemOwnerDeadlineStatus
OI-01UI Designer review wireframes (SCR-01 → SCR-07)UI/UX DesignerT+3dOpen
OI-02QA review test plan + confirm seed data approachQA LeadT+3dOpen
OI-03DevOps verify migration strategy trên stagingDevOpsT+2dOpen
OI-04Confirm Excel import template format (column headers, sample file)PO/BA + FE DevT+5dOpen
OI-05Confirm notification channel (chỉ in-app hay cả SMS/Zalo?)PO/BAT+3dOpen
OI-06PO quyết định Phase 1 hay 1.5 cho nút "Thay thế vật tư"PO/BAT+5dOpen
OI-07Data cleanup kho chính (DEC-D35) — song song, không block go-liveDevOps + BE DevT+10dOpen
OI-08UI Designer review wireframe SCR-08 Transfer formUI/UX DesignerT+5dOpen

Sign-off Status

DomainReviewerRoleStatusDate
PRD & Business RulesPO/BAProduct Owner[ ] Pending
Design DocTech LeadTech Lead[ ] Pending
Frontend (SCR-01 → SCR-08)FE LeadFrontend Dev[ ] Pending
Backend (DB + Hasura + Triggers)BE LeadBackend Dev[ ] Pending
QA Test Plan (81 TCs)QA LeadQA[ ] Pending
QA Execution (Exit Criteria met)QA LeadQA[ ] Pending
Go-Live ChecklistDevOpsDevOps[ ] Pending
Final Go-Live ApprovalPO/BA + Tech LeadFinal[ ] Pending

Acceptance Criteria (Final sign-off)

#CriteriaVerify by
1Tạo kho vật tư per branch → UNIQUE constraint hoạt độngQA (TC-MW-001, TC-MW-002)
2Cấu hình giá + hao hụt → FORMULA-001 tính đúngQA (TC-PC-001, TC-PC-005)
3Price versioning → giá cũ archive, snapshot subtask không thay đổiQA (TC-PC-003, TC-PC-004)
4Usage unit quy đổi + auto-calc giá → FORMULA-002 đúngQA (TC-UU-001, TC-UU-003)
5Nhập kho tay + Excel → tồn kho cập nhật đúngQA (TC-SI-001, TC-SI-003)
6Subtask material: snapshot giá, ĐVT, thành tiền → FORMULA-003/004 đúngQA (TC-SM-001, TC-SM-003)
7Auto-deduct khi done → running_balance đúngQA (TC-AD-001)
8Undo done / cancel sau done → reverse movement đúngQA (TC-AD-003, TC-AD-005)
9Kiểm kê → adjustment movement đúngQA (TC-SK-002)
10Cảnh báo tồn kho ≤ min_stock → notification + dedupeQA (TC-AL-001, TC-AL-002)
11Sidebar tài chính → FORMULA-005 đúng (mới + backward compat)QA (TC-FI-001, TC-FI-002)
12RBAC: Staff ẩn menu/giá, Manager branch-scoped, Admin fullQA (TC-PM-001 ~ TC-PM-003)
13Race condition: pg_advisory_xact_lock → no data corruptionQA (TC-EC-002)
14Tiền tour / Commission / Lương KHÔNG bị ảnh hưởngQA (manual verify)
15Performance: auto-deduct < 5s, list page < 500msQA (staging test)
16Chuyển kho branch → material warehouse: tồn kho 2 bên cập nhật đúng, movement pair đối xứngQA (TC-TRF-001, TC-TRF-002)
17Unit conversion khi chuyển kho: quy đổi ĐVT đúng theo to_stock_factorQA (TC-TRF-005)
18Lot selection FIFO khi chuyển kho: chọn lô cũ nhất trướcQA (TC-TRF-007)
19SCR-08: form chuyển kho hoạt động đúng (select branch, product, lot, qty)QA (TC-TRF-001)
20SCR-01: nút [★ Chuyển kho] + [Nhập tay] hiển thị đúng roleQA (TC-TRF-015, TC-PM-001~003)

Không ảnh hưởng (reassurance cho team)

  • Tiền tour / Commission / Lương: ZERO coupling — material_cost là field mới, không thay đổi logic tính tour_money
  • Kho chính (kho chi nhánh): Kho vật tư kết nối với kho chi nhánh qua transfer (DEC-D29) — chỉ READ dữ liệu kho chi nhánh, KHÔNG sửa bảng/logic kho chi nhánh
  • Order / Ecommerce: Không sửa order flow — sidebar tài chính chỉ THÊM 1 dòng mới
  • Report modules: Không thay đổi — reports hiện tại không query material tables
  • Flow giao việc hàng loạt: Không thay đổi
  • Backend services khác: Chỉ sửa 1 service (crm-api hoặc project handler)

Changelog

VersionNgàyThay đổiTác giả
1.02026-03-26Khởi tạo Handoff: RACI, timeline 7 milestones, task breakdown T1-T20 (~23d), open items OI-01~05, sign-off, acceptance criteriaPO/BA + AI
1.12026-03-27Sửa "9 cột" → "10 cột" (T5, HAS-06). Update TC count 46→49 (T20, RACI, Sign-off). +OI-06: PO quyết định Phase 1 hay 1.5 cho "Thay thế vật tư". Verify T1-T20 numbering OK.PO/BA + AI
2.02026-03-27Design v2 — Batch-based FIFO. RACI: +batch table/FIFO logic, +batch UI rows. DB migration 5→6 bảng. Hasura 7→8 files. Timeline: 20d→25d. BE tasks: +T7b (batch table), +T7c (FIFO logic, 2d), +T7d (cron HSD, 1d), +T7e (batch Hasura). FE tasks: +T12b (nhập kho mở rộng), +T12c (danh sách lô). QA: 49→60 TCs. Tổng effort: 23d→29d. Sign-off: update TC count.PO/BA + AI
2.12026-03-27QA TCs: 60→66. +TC-PRICE-001~004 (Two-Phase Pricing), +TC-CFG-001~002 (FR-017 import config). Sửa TC-SI-001~003 (stock-in → batch contract). FR traceability aligned 100% với PRD FR-001~021.PO/BA
3.02026-03-27Design v3 — Transfer from branch warehouse. DEC-D12 (kho độc lập) superseded → DEC-D29 (kết nối kho chi nhánh). +FR-022 (transfer branch→material). +SCR-08 (transfer form). +DEC-D29→D36 (8 decisions: transfer, dual-input, no approval, unit conversion, lot selection, data cleanup). BE tasks: +T21 (transferToMaterialWarehouse action, 2d), +T22 (event trigger, 1.5d), +T23 (master_data, 0.25d). FE tasks: +T24 (SCR-08, 2.5d), +T25 (SCR-01 buttons, 0.5d). QA: +T26 (TC-TRF-001→017, 17 TCs, 1.5d). Tổng QA: 64→81 TCs. Tổng effort: 29d→33d. Timeline: +M5b (transfer BE), +M6 (transfer FE), milestones renumbered M7/M8. RACI: +3 rows transfer. Acceptance criteria: +5 items (#16-20). Open items: +OI-07 (data cleanup), +OI-08 (SCR-08 wireframe review).PO/BA + AI