Skip to content

Go-Live Checklist: Kho vật tư

Feature slug: material-warehouseVersion: 3.0 Ngày: 2026-03-27 Complexity: L (Large)


E1) Deploy Gates

Database Migrations (6 bảng mới + 1 ALTER)

#MigrationMô tảVerifyStatus
MIG-01XXXXXX_create_material_warehouseBảng kho vật tư per branch + UNIQUE(branch_id)SELECT count(*) FROM material_warehouse → 0[ ]
MIG-02XXXXXX_create_material_price_configBảng cấu hình giá + unique indexes (active global/branch)\d material_price_config — verify indexes[ ]
MIG-03XXXXXX_create_material_usage_unitBảng đơn vị sử dụng + UNIQUE(config_id, usage_unit_name)\d material_usage_unit[ ]
MIG-04XXXXXX_create_material_stock_movementBảng nhập/xuất + indexes + VIEW material_stock_balanceSELECT * FROM material_stock_balance LIMIT 1 → OK[ ]
MIG-05XXXXXX_create_material_batchBảng lô vật tư (batch) + indexes (warehouse_id, product_id, status, expiry_date)\d material_batch — verify indexes, CHECK (status IN ('active','depleted','locked','disposed'))[ ]
MIG-06XXXXXX_alter_project_task_material_add_priceALTER thêm 10 cột (usage_unit, unit_price, amount, ...)\d project_task_material — verify 10 cột mới[ ]

Hasura Metadata

#FileMô tảVerifyStatus
HAS-01public_material_warehouse.yamlTrack table + permissions (Admin: full, Manager: branch select/insert)Hasura Console → material_warehouse → Permissions tab[ ]
HAS-02public_material_price_config.yamlTrack + permissions (Admin: full, Manager: select only)Hasura Console → material_price_config[ ]
HAS-03public_material_usage_unit.yamlTrack + permissions (Admin: full, Manager: select only)Hasura Console → material_usage_unit[ ]
HAS-04public_material_stock_movement.yamlTrack + permissions (Admin/Manager: insert+select, NO update/delete — immutable)Verify: NO update_permissions[ ]
HAS-05public_material_stock_balance.yamlTrack view + select permissionsHasura Console → material_stock_balance[ ]
HAS-06public_material_batch.yamlTrack table + permissions (Admin: full, Manager: branch select/insert/update status)Hasura Console → material_batch → Permissions tab[ ]
HAS-07public_project_task_material.yamlUpdated — thêm permissions cho 10 cột mớiVerify cột mới visible trong select/insert[ ]
HAS-08tables.yamlUpdated — include 6 bảng mới + viewVerify all tables tracked[ ]

Hasura Actions (v3.0)

#ActionServiceVerifyStatus
ACT-01transferToMaterialWarehouseecommerce-apiHasura Console → Actions → verify registered + test on staging[ ]

Event Triggers

#TriggerHandlerVerifyStatus
EVT-01subtask_status_change (hoặc extend existing)materialAutoDeduct — Go handlerTest: subtask done → movement created (< 5s)[ ]
EVT-02(same trigger, condition check)materialAutoReverse — Go handlerTest: undo done → reverse movement created[ ]
EVT-03inventory_document_material_warehouse (fires on inventory_document status change cho kho vật tư)Go handler — xử lý behaviors export_material_warehouse, import_material_warehouseTest: transfer confirm → trigger fires → material_batch created[ ]

Scheduler (Cron Jobs)

#CronScheduleHandlerVerifyStatus
CRON-01material_batch_expiry_checkDaily 01:00 AM (Asia/Ho_Chi_Minh)batchExpiryCheck — Go handler: lock lô hết hạn + cảnh báo 90 ngàyTest: tạo lô HSD = yesterday → cron chạy → status = locked + notification sent[ ]

Env Vars / Feature Flags

#BiếnGiá trịServiceStatus
ENV-01MATERIAL_WAREHOUSE_ENABLEDtruediva-admin (FE)[ ]
ENV-02LOW_STOCK_NOTIFICATION_ENABLEDtruenotification-api[ ]
ENV-03MATERIAL_STOCK_IMPORT_MAX_ROWS500export-api (Excel import)[ ]
ENV-04MATERIAL_AUTO_DEDUCT_ENABLEDtruecrm-api (BE event handler)[ ]

Transfer Deploy Gates (v3.0)

  • [ ] master_data entries đã tạo: behaviors export_material_warehouse, import_material_warehouse
  • [ ] Hasura Action transferToMaterialWarehouse đã registered và tested trên staging
  • [ ] Event trigger inventory_document_material_warehouse đã tạo trong Hasura metadata
  • [ ] Verify các flow inventory_document hiện tại KHÔNG bị ảnh hưởng (regression: transfer/check/return vẫn hoạt động)
  • [ ] Verify component ProductLotNumberSelect load đúng trong context kho vật tư
  • [ ] Ít nhất 1 chi nhánh có data kho chính sạch để pilot transfer

E2) Pre-checks

Staging Verification

#CheckStepsExpectedStatus
STG-01DB migration thành côngSSH staging → psql\dt material_* (5 bảng: material_warehouse, material_price_config, material_usage_unit, material_stock_movement, material_batch) + \dv material_* (1 view: material_stock_balance)\dt → 5 bảng listed, \dv → 1 view listed[ ]
STG-01bmaterial_batch indexes verified\di idx_mb_* hoặc \di+ material_batch*Indexes on (warehouse_id, product_id), (status), (expiry_date) listed[ ]
STG-02Hasura metadata reloadHasura Console → Settings → Reload Metadata"Metadata reloaded successfully"[ ]
STG-03FE build passpnpm codegen && pnpm build trên staging branchBuild thành công, không error[ ]
STG-04SCR-01 renderLogin Admin → Kho > Kho vật tưTrang hiện, không crash, table trống[ ]
STG-05Event trigger registeredHasura Console → Events → subtask_status_changeTrigger active, handler URL đúng[ ]
STG-06Cron material_batch_expiry_check registeredHasura Console → Events → Cron TriggersCron active, schedule = 0 1 * * *, handler URL đúng[ ]
STG-07Cron tested trên stagingTạo lô với HSD = yesterday → trigger cron manuallyLô chuyển locked + disposal movement + notification sent[ ]

Data Validation

#CheckQueryExpectedStatus
DV-01Không có data rácSELECT count(*) FROM material_warehouse0 (chưa ai tạo kho)[ ]
DV-02project_task_material cũ không bị ảnh hưởngSELECT count(*) FROM project_task_material WHERE usage_unit IS NOT NULL0 (cột mới, chưa có data)[ ]
DV-03Indexes tạo đúng\di idx_mpc_product_active_*2 partial unique indexes listed[ ]
DV-04View hoạt độngSELECT * FROM material_stock_balance LIMIT 1Empty result (OK) hoặc error-free[ ]
DV-05material_batch table sạchSELECT count(*) FROM material_batch0 (chưa ai nhập kho)[ ]
DV-06material_batch permissionsHasura Console → material_batch → PermissionsAdmin: full, Manager: branch-scoped select/insert/update[ ]

Performance Test

#TestStepsExpectedStatus
PF-01Danh sách kho vật tưTạo 100 vật tư config → load SCR-01Response < 500ms[ ]
PF-02Auto-deduct event triggerSubtask done với 5 materials → measureAll 5 movements created < 5s total[ ]
PF-03Aggregate view task chaTask cha có 10 subtask x 5 materials = 50 records → loadRender < 500ms[ ]
PF-04Stock movement history1000 movements per product → load SCR-03Page load < 1s (with pagination)[ ]

Transfer Smoke Tests (v3.0)

  • [ ] Smoke: Manager tạo transfer → chọn lot → confirm → tồn kho chi nhánh giảm + material_batch được tạo
  • [ ] Smoke: Transfer với cost_price=0 → warning hiển thị nhưng cho phép tiếp tục
  • [ ] Smoke: Transfer không có cấu hình quy đổi đơn vị → bị chặn với thông báo lỗi rõ ràng
  • [ ] Smoke: Hủy transfer (batch chưa sử dụng) → cả 2 phía được reversed
  • [ ] Smoke: Hủy transfer (batch đã dùng bởi auto_deduct) → bị chặn
  • [ ] Smoke: Flow transfer request hiện tại (kho tổng → kho chi nhánh) vẫn hoạt động sau deploy

E3) Day-0 / Day-1

Day-0: Deploy Steps

#BướcAiThời gianChi tiếtStatus
D0-01Backup DB productionDevOpsT-30minpg_dump project database[ ]
D0-02Apply migrations (MIG-01 → MIG-06)DevOpsT-20minChạy tuần tự, verify mỗi migration (bao gồm material_batch)[ ]
D0-03Apply Hasura metadataDevOpsT-10minhasura metadata apply + reload[ ]
D0-04Deploy BE servicesDevOpsT-5minDeploy crm-api (hoặc service chứa handlers)[ ]
D0-05Deploy FE (diva-admin)DevOpsT+0Deploy với MATERIAL_WAREHOUSE_ENABLED=true[ ]
D0-06Verify event triggerDevOps + QAT+5minTạo 1 subtask test → done → verify movement[ ]
D0-07Smoke test SCR-01QAT+10minLogin Admin → Kho vật tư → tạo kho → thêm vật tư[ ]
D0-08Verify cron job activeDevOpsT+12minHasura Console → Cron Triggers → material_batch_expiry_check → Active[ ]
D0-09Verify batch table permissionsDevOps + QAT+15minHasura Console → material_batch → test insert/select as Manager[ ]

Day-0: Transfer Deploy (v3.0)

#BướcAiThời gianChi tiếtStatus
D0-T01Deploy master_data entriesDevOpsT+16minTạo entries export_material_warehouse, import_material_warehouse TRƯỚC action/trigger[ ]
D0-T02Deploy BE action + event triggerDevOpsT+18minDeploy transferToMaterialWarehouse action + inventory_document_material_warehouse trigger[ ]
D0-T03Deploy FE với SCR-08DevOpsT+20minDeploy FE bao gồm trang Transfer form (SCR-08)[ ]
D0-T04Enable transfer cho pilot branch(es)Admin + POT+22minChỉ bật cho chi nhánh pilot (DEC-D35: cần data cleanup trước)[ ]
D0-T05Monitor transfer actionDevOpsT+25minTheo dõi: tỉ lệ tạo inventory_document, error rate trên transferToMaterialWarehouse action[ ]

Day-0: Monitoring (T+0 → T+2h)

#MetricToolNgưỡng cảnh báoStatus
MON-01Error rate diva-adminSentry/Grafana> 1% → investigate[ ]
MON-02Event trigger failureHasura Console → Events → Invocation LogsBất kỳ failure → investigate[ ]
MON-03DB connection poolGrafana> 80% usage → alert[ ]
MON-04Response time SCR-01APMp99 > 2s → investigate[ ]
MON-05Disk usage material_stock_movementSELECT pg_size_pretty(pg_total_relation_size('material_stock_movement')) / Grafana> 2GB → alert, review partition strategy[ ]
MON-06material_batch table sizeSELECT pg_size_pretty(pg_total_relation_size('material_batch')) / Grafana> 500MB → alert[ ]
MON-07Cron job success/failure rateHasura Console → Cron Triggers → material_batch_expiry_check → Invocation LogsBất kỳ failure → investigate immediately[ ]
MON-08Lô hết hạn bị lock countSELECT count(*) FROM material_batch WHERE status = 'locked' AND updated_at > now() - interval '24h'Track daily — spike bất thường → verify cron logic[ ]

Day-1: Post-deploy

#TaskAiChi tiếtStatus
D1-01Smoke test full flowQATạo kho → thêm config → nhập kho → subtask done → verify tồn kho[ ]
D1-02Verify backward compatQAMở 3 đơn cũ có inventory_document → sidebar tài chính hiện đúng[ ]
D1-03Verify tiền tour không ảnh hưởngQAMở 1 subtask có materials + tour_money → verify tour_money giữ nguyên[ ]
D1-04Admin tạo kho chi nhánh đầu tiênAdmin userHướng dẫn Admin tạo kho + config vật tư thực tế[ ]
D1-05Collect feedbackPOHỏi Admin/Manager về UX: form cấu hình, nhập kho, kiểm kê[ ]
D1-06Monitor low stock notificationsDevOpsVerify notification gửi đúng khi tồn <= min_stock[ ]

Day-1: Transfer Verification (v3.0)

#TaskAiChi tiếtStatus
D1-T01Verify pilot branch transfer dataQA + POmaterial_batch được tạo đúng, giá khớp với source lot[ ]
D1-T02Verify auto-deduct trên transferred batchesQASubtask done sử dụng batch từ transfer → auto_deduct hoạt động đúng[ ]
D1-T03Check inventory_document audit trailQAVerify behavior = export_material_warehouse xuất hiện trong inventory_document[ ]
D1-T04Monitor low stock alerts từ transferred batchesDevOpsTheo dõi cảnh báo tồn kho thấp từ các batch được transfer[ ]

E4) Rollback Plan

Khi nào rollback

  • Migration fail ở bước nào → rollback tất cả bước từ đó
  • P1 bug trên production ảnh hưởng flow hiện có (tiền tour, commission, order)
  • Event trigger gây load bất thường (> 100 invocations/s)

Steps to Rollback

#BướcCommand / ActionLưu ý
RB-01Tắt feature flag FESet MATERIAL_WAREHOUSE_ENABLED=false → redeploy FEFE ẩn menu Kho vật tư, MaterialForm mới không render
RB-02Disable event triggerHasura Console → Events → subtask_status_change → Disable (hoặc remove handler URL)Ngăn auto-deduct chạy
RB-03Rollback Hasura metadatahasura metadata apply từ backup metadata (pre-deploy)Untrack 5 bảng mới
RB-03bBackup cột mới trước DROPCREATE TABLE project_task_material_backup_v1 AS SELECT id, usage_unit, unit_price, amount, to_stock_factor, stock_equivalent, total_stock_equivalent, config_version_id, price_snapshot_at, wastage_quantity FROM project_task_material WHERE usage_unit IS NOT NULL;Giữ backup để restore nếu cần
RB-04Rollback migration MIG-05 (ALTER)ALTER TABLE project_task_material DROP COLUMN usage_unit, DROP COLUMN unit_price, ... (10 cột)Data trong cột mới sẽ mất (đã backup ở RB-03b)
RB-05Rollback migration MIG-04DROP VIEW material_stock_balance; DROP TABLE material_stock_movement;Movement data mất
RB-06Rollback migration MIG-03DROP TABLE material_usage_unit;Config data mất
RB-07Rollback migration MIG-02DROP TABLE material_price_config;Config data mất
RB-08Rollback migration MIG-01DROP TABLE material_warehouse;Warehouse data mất
RB-09Deploy BE services (rollback version)Redeploy previous BE versionHandlers cũ không có materialAutoDeduct
RB-10VerifyMở 1 đơn cũ + 1 subtask → verify flow bình thườngTiền tour, commission không ảnh hưởng

Transfer Rollback (v3.0)

  • [ ] Nếu transferToMaterialWarehouse action lỗi: disable action trong Hasura, các flow hiện tại không bị ảnh hưởng
  • [ ] Nếu event trigger inventory_document_material_warehouse fire sai: disable trigger, review thủ công các inventory_documents bị ảnh hưởng
  • [ ] Nếu tồn kho chi nhánh bị trừ sai: sử dụng flow kiểm kê (inventory adjustment) hiện tại để điều chỉnh
  • [ ] Nếu material_batch được tạo với data sai: sử dụng flow thanh lý (disposal) để dispose batch + nhập lại thủ công
  • [ ] QUAN TRỌNG: KHÔNG rollback master_data entries nếu đã có transfers được tạo — đảm bảo data integrity

Rollback nhanh (không mất data cũ)

Nếu chỉ cần ẩn feature mà KHÔNG rollback migration:

  1. RB-01: Tắt feature flag FE
  2. RB-02: Disable event trigger
  3. RB-02b (v3.0): Disable transferToMaterialWarehouse action + inventory_document_material_warehouse trigger
  4. Data bảng mới vẫn giữ → khi fix xong, bật lại

E5) Sign-off

DomainReviewerRoleStatusDate
PRD & Business RulesPO/BAProduct Owner[ ] Pending
Frontend (UI/UX)FE LeadFrontend Dev[ ] Pending
Backend (DB + Triggers)BE LeadBackend Dev[ ] Pending
Hasura Metadata & PermissionsBE LeadBackend Dev[ ] Pending
QA Test PlanQA LeadQA[ ] Pending
QA Execution (Exit Criteria met)QA LeadQA[ ] Pending
DevOps (Migration + Deploy)DevOpsDevOps[ ] Pending
Security (RBAC verified)Tech LeadTech Lead[ ] Pending
Go-Live ApprovalPO/BA + Tech LeadFinal Sign-off[ ] Pending

Transfer Sign-off (v3.0)

  • [ ] Transfer smoke test passed trên staging (Manager + Admin)
  • [ ] Regression các flow inventory hiện tại passed
  • [ ] Chi nhánh pilot đã xác định và data cleanup đã verified (DEC-D35)

Changelog

VersionNgàyThay đổiTác giả
1.02026-03-26Khởi tạo Go-Live Checklist: 5 migrations, 7 Hasura files, 2 event triggers, 3 env vars, staging verification, day-0/day-1 plan, rollback plan, sign-offPO/BA + AI
1.12026-03-27MIG-05: sửa "9 cột" → "10 cột". STG-01: tách \dt (4 bảng) + \dv (1 view). +MON-05 disk usage monitoring material_stock_movement (alert > 2GB). +ENV-04 MATERIAL_AUTO_DEDUCT_ENABLED. Rollback: +RB-03b backup step trước DROP COLUMN.PO/BA + AI
2.02026-03-27Design v2 — Batch-based FIFO. E1: +MIG-05 material_batch table, renumber MIG-06. +HAS-06 material_batch.yaml, renumber HAS-07/08. +CRON-01 material_batch_expiry_check (daily 01:00). E2: STG-01 sửa 4→5 bảng. +STG-01b batch indexes. +STG-06/07 cron registered + tested. +DV-05/06 batch table validation. E3: +D0-08 verify cron active, +D0-09 verify batch permissions. Monitoring: +MON-06 batch table size, +MON-07 cron success/failure, +MON-08 locked batch count.PO/BA + AI
2.12026-03-27Version header bump đồng bộ với các spec files khác. Không có thay đổi nội dung.PO/BA
3.02026-03-27Design v3 — Transfer kho chi nhánh → kho vật tư. E1: +ACT-01 transferToMaterialWarehouse action (ecommerce-api). +EVT-03 inventory_document_material_warehouse trigger. +Transfer Deploy Gates (master_data entries, regression check, pilot branch). E2: +Transfer Smoke Tests (6 items: create/cancel/regression). E3: +Day-0 Transfer Deploy (D0-T01→T05: master_data → action/trigger → FE SCR-08 → pilot enable → monitor). +Day-1 Transfer Verification (D1-T01→T04: pilot data, auto-deduct, audit trail, low stock). E4: +Transfer Rollback (5 items: action disable, trigger disable, kiểm kê adjust, disposal, master_data integrity). Rollback nhanh: +RB-02b. E5: +Transfer Sign-off (3 items: smoke test, regression, pilot verified).PO/BA + AI