Test Scenarios · MVP
Quick Reference — 8 kịch bản theo user journey. Mỗi kịch bản = 1 câu chuyện thực tế, đa-vai trò. Pass = tất cả bước ✅.
Cách dùng: mỗi tester chạy 1 scenario từ đầu đến cuối, không skip bước, ghi ✅/❌ vào cột "Result".
Scenario 1 · KAM L'Oréal báo đợt Mid-Month 15/06
Persona involved: KAM → AM → Planner → WH Manager → Auditor Mục tiêu: verify happy path end-to-end của 1 adjustment thông thường (Δ < 30%)
| # | Vai | Bước | Expected | Result |
|---|---|---|---|---|
| 1 | KAM | Login kam.loreal@demo.boxme | Sidebar có "Gửi điều chỉnh" | |
| 2 | KAM | Vào /planner/override-import, form 1 dòng: cust=LOREAL_VN, wh=HCM_01, date=today+5, qty=5500, event=MID_MONTH | Preview OK | |
| 3 | KAM | Submit | Toast OK, state=NEW | |
| 4 | KAM | Logout | ||
| 5 | AM | Login am.fmcg@demo.boxme, vào /planner/forecast/review | Thấy row mới ở NEW | |
| 6 | AM | Bấm "Đã xem" | State → SEEN, audit row | |
| 7 | Planner | Login planner@demo.boxme, mở review | Row ở SEEN, Δ% < 30% | |
| 8 | Planner | Bấm "Duyệt" | State → ACCEPTED, audit 2 row | |
| 9 | WH | Login wh.hcm@demo.boxme, vào /planner/forecast/warehouse, chọn HCM_01, date=today+5 | WLU_minutes phản ánh qty mới | |
| 10 | Auditor | Login auditor@demo.boxme, mở Audit Timeline của adjustment | Thấy đủ chuỗi: SUBMIT → SEEN → ACCEPTED |
Pass criteria: 10/10 ✅, audit timeline đầy đủ.
Scenario 2 · KAM Shopee Mega Sale 11.11 — Δ > 30%
Mục tiêu: verify guardrail Δ > 30% bắt buộc note + Planner phải có dẫn chứng
| # | Vai | Bước | Expected | Result |
|---|---|---|---|---|
| 1 | KAM | Submit SHOPEE_VN × HCM_01 × 11/11 × qty=25000 × event=MEGA_SALE KHÔNG note | Submit fail, yêu cầu note | |
| 2 | KAM | Submit lại có note "11.11 megasale, KAM ước dựa lịch sử 10.10" | OK | |
| 3 | Planner | Mở review, thấy Δ = +180% so P85, cell màu 🔴 | Cảnh báo rõ ràng | |
| 4 | Planner | Bấm "Duyệt" mà không note | UI block, hiện input note bắt buộc | |
| 5 | Planner | Nhập note "11.11, baseline 10.10 +120%, add 50% buffer KOL" → Duyệt | OK | |
| 6 | Auditor | Audit log có note đầy đủ + Δ% snapshot | OK |
Scenario 3 · Planner sửa số KAM gửi
| # | Vai | Bước | Expected | Result |
|---|---|---|---|---|
| 1 | KAM | Submit qty=10000 | NEW | |
| 2 | Planner | Bấm "Sửa & duyệt" → qty=8000 + note "Buffer KAM hơi cao, giữ 8000" | ACCEPTED, audited_qty=8000 | |
| 3 | Auditor | Audit log có row QTY_EDIT với before.qty=10000, after.qty=8000, reason="..." | Đủ | |
| 4 | WH | Đọc warehouse report ngày đó | WLU tính theo 8000 (không phải 10000) |
Scenario 4 · Planner reject + KAM resubmit
| # | Vai | Bước | Expected | Result |
|---|---|---|---|---|
| 1 | KAM | Submit qty=50000 (vô lý) + note "Test" | NEW | |
| 2 | Planner | Bấm "Từ chối" + note "Số quá cao, không có dẫn chứng" | REJECTED, audited_qty=baseline | |
| 3 | KAM | Lịch sử gửi: thấy row REJECTED + lý do | Có | |
| 4 | KAM | Tạo adjustment mới cùng (cust,wh,date) với qty=15000 + dẫn chứng | NEW | |
| 5 | Planner | Mở review, thấy row mới | OK | |
| 6 | Planner | Verify forecast hiển thị KAM-qty mới nhất, không phải số cũ | OK |
Scenario 5 · Admin sửa monthly multiplier
| # | Vai | Bước | Expected | Result |
|---|---|---|---|---|
| 1 | Admin | Login, vào /admin/config/thamso tab Mùa | 12 row T1-T12 | |
| 2 | Admin | T11 đang = 1.4, sửa thành 1.6, Lưu | Toast OK, audit row CONFIG_CHANGE | |
| 3 | Admin | Bấm "Rerun nightly" | Job chạy < 2' | |
| 4 | Planner | Refresh /planner/forecast, xem ngày trong T11 | Forecast tăng (≈ ×1.14 so trước) | |
| 5 | Auditor | Audit log có before=1.4, after=1.6, actor=admin | OK |
Scenario 6 · WH Manager lên ca cho ngày sale
Mục tiêu: verify report đủ thông tin để planner ca
| # | Vai | Bước | Expected | Result |
|---|---|---|---|---|
| 1 | WH | Login, vào /planner/forecast/warehouse, chọn kho + range=14d | Bảng hiện | |
| 2 | WH | Tìm ngày có event=MEGA_SALE | Headcount tăng đáng kể | |
| 3 | WH | Click ngày → bóc PK breakdown | SB+MIX+HVY = 100% | |
| 4 | WH | Export Excel | File mở, 2 sheet | |
| 5 | WH | Verify công thức 1 cell: headcount = ceil(WLU / 480) | Đúng |
Scenario 7 · Import lịch sử + impact lên baseline
| # | Vai | Bước | Expected | Result |
|---|---|---|---|---|
| 1 | Admin | Vào /admin/history-import, download template | OK | |
| 2 | Admin | Điền 30 dòng valid cho 1 cặp (cust, wh) mới chưa có data | – | |
| 3 | Admin | Upload + preview | 30 dòng, ngày min/max đúng | |
| 4 | Admin | Confirm Nhập | Audit row IMPORT_HISTORICAL | |
| 5 | Admin | Bấm "Rerun" | – | |
| 6 | Planner | Mở forecast cho cặp đó | Baseline có giá trị (không null) | |
| 7 | Planner | Sample_size column ≈ 30 | OK | |
| 8 | Planner | Nếu n < 10 → cờ fallback_used | Test với cặp khác có < 10d |
Scenario 8 · Auditor quarter-end report
Mục tiêu: verify auditor có thể truy vết & build báo cáo quý
| # | Vai | Bước | Expected | Result |
|---|---|---|---|---|
| 1 | Auditor | Login, xem có thể đọc mọi trang forecast | OK (read-only) | |
| 2 | Auditor | Thử bấm nút "Duyệt" trên review | Disabled / hidden | |
| 3 | Auditor | Chạy SQL trên Supabase: count audit_log by action, month | Có data, không có gap > 5' | |
| 4 | Auditor | Tìm decisions Δ > 30% không có reason | List = 0 (mong đợi) | |
| 5 | Auditor | Thử UPDATE audit_log SET reason='...' | RLS từ chối | |
| 6 | Auditor | Thử DELETE FROM audit_log WHERE ... | RLS từ chối | |
| 7 | Auditor | Build báo cáo quý theo template | OK |
Tổng kết Scenarios
| # | Scenario | Pass? | Bugs | Severity |
|---|---|---|---|---|
| 1 | KAM L'Oréal Mid-Month happy path | |||
| 2 | Shopee Mega Sale Δ > 30% guardrail | |||
| 3 | Planner sửa số | |||
| 4 | Reject + resubmit | |||
| 5 | Admin sửa multiplier | |||
| 6 | WH lên ca ngày sale | |||
| 7 | Import lịch sử | |||
| 8 | Auditor quarter-end |
Verdict:
- [ ] 8/8 scenarios pass
- [ ] 0 P0 bug
- [ ] ≤ 3 P1 bug (workaround có)
Sau khi hoàn thành
- Tổng hợp Checklist + Scenarios → report tổng
- Gửi report cho:
- Product Lead → approve release
- Eng Lead → fix bugs còn lại
- Data Lead → verify forecast accuracy trên dataset thật