Appearance
QA Test Plan — Redesign Tab Tư vấn (Commission -> Advisory Fee)
Ref: PRD v1.1 | Date: 07/04/2026 | Complexity: M | Type: FE-only refactor
D1) Coverage Summary
| Phạm vi | Chi tiết |
|---|---|
| Module | ecommerce (diva-admin) |
| Order types | Service Order, Cosmetic Order, Prepaid Order |
| Roles | IT Leader, POS Staff, CRM Telesales, Staff (no permission) |
| Browsers | Chrome (primary), Firefox, Safari (smoke) |
| Devices | Desktop (primary), Tablet (responsive check) |
| BE/DB | Không test — FE-only refactor, không đổi API/DB |
| Scope guard | Customer commission / affiliate / referral / người giới thiệu là KEEP theo PRD out-of-scope; QA không confirm bỏ nếu UI spec/wireframe thiếu block |
FR Coverage
| FR | Mô tả | Priority | Số TC |
|---|---|---|---|
| FR-001 | Summary Bar: 4 chỉ số + tooltip + context line | Must | 6 |
| FR-002 | Summary Cards: per NV, 2 số + trạng thái + expand DV | Must | 7 |
| FR-003 | Click card filter bảng dưới | Should | 4 |
| FR-004a | Flat list: 1 lần TT, không thu hồi (5 cột + group header) | Must | 4 |
| FR-004b | Flat list: nhiều lần TT (+ group header) | Must | 4 |
| FR-004c | Flat list: có thu hồi [PLANNED] | Must | 5 |
| FR-005 | Search: mã TT, mã GD, tên NV | Should | 5 |
| FR-006 | Dropdown filter | Should | 3 |
| FR-007 | Đổi thuật ngữ UI (7 locations) | Must | 3 |
| FR-008 | Nút "Cấu hình tư vấn" | Must | 3 |
| FR-009 | Empty state | Must | 4 |
| FR-010 | Loading state | Should | 2 |
| FR-011 | Sort order | Must | 3 |
| FR-012 | Format tiền | Must | 5 |
| FR-013 | Tooltip giải thích | Must | 3 |
| Cross | 3 Order Types + Permission + feature parity guard | — | 9 |
| Tổng: | 70 TC |
D2) Requirements Matrix (FR -> TC Mapping)
| FR | TC IDs | Coverage | Ghi chú |
|---|---|---|---|
| FR-001 | TC-001-01 .. TC-001-07 (excl TC-001-03) | 6 TC (1 happy + 5 beyond) | Formula verify + context lines |
| FR-002 | TC-002-01 .. TC-002-08 (excl TC-002-06) | 7 TC (1 happy + 6 beyond) | Card states + expand + scale |
| FR-003 | TC-003-01 .. TC-003-04 | 4 TC (1 happy + 3 beyond) | Click/toggle filter |
| FR-004a | TC-004a-01 .. TC-004a-04 | 4 TC | Simple case, 5 columns |
| FR-004b | TC-004b-01 .. TC-004b-04 | 4 TC | Group headers, multi-payment |
| FR-004c | TC-004c-01 .. TC-004c-05 | 5 TC | Revoke sub-sections [PLANNED] |
| FR-005 | TC-005-01 .. TC-005-05 | 5 TC | Search debounce + 3 match types |
| FR-006 | TC-006-01 .. TC-006-03 (excl TC-006-03 cũ) | 3 TC | Dropdown filter options |
| FR-007 | TC-007-01 .. TC-007-03 | 3 TC | i18n + hardcode locations |
| FR-008 | TC-008-01 .. TC-008-03 | 3 TC | Button label + permission + dialog |
| FR-009 | TC-009-01 .. TC-009-04 | 4 TC | Empty: no config + no invoice |
| FR-010 | TC-010-01 .. TC-010-02 | 2 TC | Skeleton + spinner |
| FR-011 | TC-011-01 .. TC-011-03 | 3 TC | Card sort + group sort |
| FR-012 | TC-012-01 .. TC-012-05 | 5 TC | VND format per section |
| FR-013 | TC-013-01 .. TC-013-03 | 3 TC | Tooltip content + behavior |
| Cross | TC-OT-01 .. TC-OT-03, TC-PERM-01 .. TC-PERM-05, TC-KEEP-01 | 9 TC | 3 order types + 4 roles + regression + customer commission/referral KEEP |
D3) Seed Data
Dataset: DS-001 — Đơn dịch vụ, 2 NV, 2 lần thanh toán, không thu hồi
Scenario: Đơn dịch vụ "BTX thiết kế + Gội đầu" với 2 NV, 2 lần thanh toán đã completed.
| Entity | Data |
|---|---|
| Order | Service Order #SO-20260301-001, branch_id = {test_branch}, status = completed |
| Order Items | OI-1: "BTX thiết kế" 500.000đ, OI-2: "Gội đầu" 200.000đ |
| order_commission | NV Lan: OI-1 = 30.000đ (vnd), OI-2 = 10.000đ (vnd). NV Hoa: OI-1 = 20.000đ (vnd) |
| invoice #1 | INV-001, status = invoice_completed, paid_at = 2026-03-01 10:00 |
| invoice_commission #1 | NV Lan: 25.000đ (completed), NV Hoa: 15.000đ (completed) |
| invoice #2 | INV-002, status = invoice_completed, paid_at = 2026-03-01 14:00 |
| invoice_commission #2 | NV Lan: 15.000đ (completed), NV Hoa: 5.000đ (completed) |
| transaction_request | 4 records, behavior_id = transaction_commission, status = S |
Expected values:
| Chỉ số | NV Lan | NV Hoa | Tổng đơn |
|---|---|---|---|
| Phân bổ | 40.000đ | 20.000đ | 60.000đ |
| Đã chi | 40.000đ | 20.000đ | 60.000đ |
| Thu hồi | 0đ | 0đ | 0đ |
| Đã nhận | 40.000đ | 20.000đ | 60.000đ |
Dataset: DS-002 — Đơn dịch vụ, chi trả 1 phần (Phân bổ > Đã chi)
| Entity | Data |
|---|---|
| Order | Service Order #SO-20260302-001 |
| order_commission | NV Lan: 40.000đ |
| invoice #1 | INV-003, status = invoice_completed |
| invoice_commission #1 | NV Lan: 30.000đ (completed) |
Expected: Phân bổ = 40.000đ, Đã chi = 30.000đ, Đã nhận = 30.000đ, context line "10.000đ chờ thanh toán đợt tiếp theo"
Dataset: DS-003 — Đơn có thu hồi [PLANNED]
| Entity | Data |
|---|---|
| Order | Service Order #SO-20260303-001 |
| order_commission | NV Lan: 40.000đ |
| invoice #1 | INV-004, status = invoice_completed |
| invoice_commission #1 | NV Lan: 30.000đ (completed) |
| transaction_request (refund) | behavior_id = refund_commission, amount = 5.000đ, status = S, created_by = Admin |
Expected: Phân bổ = 40.000đ, Đã chi = 30.000đ, Thu hồi = 5.000đ, Đã nhận = 25.000đ. Group header: "Thu hồi 17%" (5.000/30.000 * 100 = 16.67 ~ 17%)
Note: DS-003 chỉ test được khi backend refund_commission sẵn sàng. Trước đó: Thu hồi luôn = 0.
Dataset: DS-004 — Đơn rỗng (chưa cấu hình commission)
| Entity | Data |
|---|---|
| Order | Service Order #SO-20260304-001, chưa có order_commission |
Expected: Summary Bar tất cả = 0đ. Không hiện card nào. Transaction List: "Chưa có giao dịch". Nút "Cấu hình tư vấn" nổi bật.
Dataset: DS-005 — Đơn mỹ phẩm (Cosmetic Order)
| Entity | Data |
|---|---|
| Order | Cosmetic Order #CO-20260305-001 |
| order_commission | NV Mai: 15.000đ |
| invoice #1 | INV-005, status = invoice_completed |
| invoice_commission #1 | NV Mai: 15.000đ (completed) |
Expected: Tương tự DS-001 nhưng route = /e/product-order/:id/commissions
Dataset: DS-006 — Đơn nạp tiền (Prepaid Order)
| Entity | Data |
|---|---|
| Order | Prepaid Order #PO-20260306-001 |
| order_commission | NV Trang: 10.000đ |
| invoice #1 | INV-006, status = invoice_completed |
| invoice_commission #1 | NV Trang: 10.000đ (completed) |
Expected: Tương tự DS-001 nhưng route = /e/prepaid-order/:id/commissions
D4) Test Cases
Group 1: Summary Bar (FR-001)
TC-001-01: Happy path — Summary Bar hiện đúng 4 chỉ số
- FR: FR-001
- Priority: P0
- Precondition: DS-001 (2 NV, 2 lần TT, không thu hồi)
- Steps:
- Đăng nhập role IT Leader
- Truy cập
/e/service-order/{SO-20260301-001}/commissions - Quan sát Summary Bar
- Expected:
- Hiện 4 chỉ số: Phân bổ = 60.000đ | Đã chi = 60.000đ | Thu hồi = 0đ | Đã nhận = 60.000đ
- Mỗi chỉ số có icon
?bên cạnh - Context line: "(icon) Đã chi đủ" (vì Phân bổ == Đã nhận và không có thu hồi)
TC-001-02: Context line — Phân bổ > Đã chi
- FR: FR-001
- Priority: P0
- Precondition: DS-002 (chi trả 1 phần)
- Steps:
- Truy cập đơn hàng DS-002
- Quan sát Summary Bar context line
- Expected:
- Context line hiện: "(icon) 10.000đ chờ thanh toán đợt tiếp theo"
- Giá trị = Phân bổ - Đã chi = 40.000đ - 30.000đ = 10.000đ
TC-001-04: Formula verify — Phân bổ = SUM(order_commission.amount)
- FR: FR-001, FORMULA-001
- Priority: P0
- Precondition: DS-001
- Steps:
- Truy cập đơn hàng DS-001
- So sánh giá trị Phân bổ trên UI với SUM(order_commission.amount) từ GraphQL response (DevTools > Network)
- Expected:
- Phân bổ UI = 60.000đ = SUM(30.000 + 10.000 + 20.000)
TC-001-05: Formula verify — Đã chi = SUM(invoice_commission.amount) WHERE completed
- FR: FR-001, FORMULA-002
- Priority: P0
- Precondition: DS-001
- Steps:
- Truy cập đơn hàng DS-001
- Kiểm tra GraphQL response: chỉ tính invoice_commission có invoice_status = 'invoice_completed'
- Expected:
- Đã chi = SUM(25.000 + 15.000 + 15.000 + 5.000) = 60.000đ
TC-001-06: Formula verify — Đã nhận = Đã chi - Thu hồi
- FR: FR-001, FORMULA-004
- Priority: P0
- Precondition: DS-003 (có thu hồi [PLANNED])
- Steps:
- Truy cập đơn hàng DS-003
- Verify: Đã nhận = Đã chi - Thu hồi
- Expected:
- Đã nhận = 30.000 - 5.000 = 25.000đ
[PLANNED] Trước khi BE refund sẵn sàng: Thu hồi = 0, Đã nhận = Đã chi
TC-001-07: Boundary — tất cả chỉ số = 0 (đơn rỗng)
- FR: FR-001, FR-009
- Priority: P1
- Precondition: DS-004 (chưa cấu hình commission)
- Steps:
- Truy cập đơn hàng DS-004
- Quan sát Summary Bar
- Expected:
- Phân bổ = 0đ, Đã chi = 0đ, Thu hồi = 0đ, Đã nhận = 0đ
- Không hiện context line
Group 2: Summary Cards (FR-002)
TC-002-01: Happy path — Cards hiện đúng per NV
- FR: FR-002
- Priority: P0
- Precondition: DS-001 (2 NV: Lan và Hoa)
- Steps:
- Truy cập đơn hàng DS-001
- Quan sát Summary Cards section
- Expected:
- 2 cards: NV Lan (Avatar + Tên + Role + Phân bổ = 40.000đ + Đã nhận = 40.000đ) và NV Hoa (Phân bổ = 20.000đ + Đã nhận = 20.000đ)
- Trạng thái: "(icon) Đã chi đủ" (vì Đã nhận == Phân bổ, không thu hồi)
- "Phân bổ" và "Đã nhận" có icon
?với tooltip
TC-002-02: Trạng thái — Còn lại (Đã nhận < Phân bổ, không thu hồi)
- FR: FR-002
- Priority: P0
- Precondition: DS-002 (Phân bổ = 40.000đ, Đã nhận = 30.000đ)
- Steps:
- Truy cập đơn hàng DS-002
- Quan sát card NV Lan
- Expected:
- Trạng thái: "(icon) Còn 10.000đ"
TC-002-03: Trạng thái — Có thu hồi [PLANNED]
- FR: FR-002
- Priority: P1
- Precondition: DS-003 (thu hồi 5.000đ)
- Steps:
- Truy cập đơn hàng DS-003
- Quan sát card NV Lan
- Expected:
- Trạng thái: "(icon) Thu hồi 5.000đ"
[PLANNED] Trước khi BE sẵn sàng: trạng thái sẽ là "(icon) Còn 10.000đ" (vì thu hồi = 0)
TC-002-04: Expand chi tiết dịch vụ
- FR: FR-002
- Priority: P0
- Precondition: DS-001 (NV Lan có 2 DV)
- Steps:
- Click "> Chi tiết" trên card NV Lan
- Expected:
- Expand table hiện:
DV | Phân bổ - Row 1: BTX thiết kế | 30.000đ
- Row 2: Gội đầu | 10.000đ
- Click lại "> Chi tiết" → collapse
- Expand table hiện:
TC-002-05: Trạng thái — Đã thu hồi hết (Đã nhận == 0 và có thu hồi) [PLANNED]
- FR: FR-002
- Priority: P1
- Precondition: Đơn có Đã chi = 10.000đ, Thu hồi = 10.000đ (custom data)
- Steps:
- Truy cập đơn có Đã nhận = 0 và có thu hồi
- Expected:
- Trạng thái: "(icon) Đã thu hồi hết"
TC-002-07: Scale — nhiều NV (> 5 cards)
- FR: FR-002
- Priority: P2
- Precondition: Đơn hàng có 7 NV được cấu hình commission
- Steps:
- Truy cập đơn hàng có 7 NV
- Quan sát cards layout
- Expected:
- Max 5 cards/hàng, 2 cards wrap xuống hàng 2
- Không bị tràn layout
TC-002-08: Cards sort theo Phân bổ DESC
- FR: FR-002, FR-011
- Priority: P1
- Precondition: DS-001 (NV Lan: 40.000đ, NV Hoa: 20.000đ)
- Steps:
- Truy cập đơn hàng DS-001
- Quan sát thứ tự cards
- Expected:
- NV Lan (40.000đ) hiện trước NV Hoa (20.000đ)
Group 3: Card Click Filter (FR-003)
TC-003-01: Happy path — Click card filter bảng
- FR: FR-003
- Priority: P1
- Precondition: DS-001 (2 NV, nhiều giao dịch)
- Steps:
- Click card NV Lan
- Quan sát Transaction List
- Expected:
- Chỉ hiện giao dịch của NV Lan
- Card NV Lan có visual highlight (border/background khác)
TC-003-02: Toggle — Click lại card đang active
- FR: FR-003
- Priority: P1
- Precondition: Đã filter NV Lan
- Steps:
- Click lại card NV Lan (đang active)
- Expected:
- Bỏ filter (toggle off)
- Hiện lại tất cả giao dịch
TC-003-03: Switch filter — Click card khác
- FR: FR-003
- Priority: P2
- Precondition: Đã filter NV Lan
- Steps:
- Click card NV Hoa (khác NV đang filter)
- Expected:
- Filter chuyển sang NV Hoa
- Chỉ hiện giao dịch của NV Hoa
- Card NV Hoa highlight, NV Lan bỏ highlight
TC-003-04: Group header ẩn khi không có giao dịch
- FR: FR-003
- Priority: P2
- Precondition: DS-001, nhiều groups, filter NV chỉ có giao dịch trong 1 group
- Steps:
- Click card NV Hoa (chỉ có giao dịch trong 1 group nhất định)
- Expected:
- Group headers không có giao dịch của NV Hoa bị ẩn
Group 4: Transaction List (FR-004a/b/c/d)
TC-004a-01: Happy path — 1 lần TT, không thu hồi (5 cột + group header)
- FR: FR-004a
- Priority: P0
- Precondition: Đơn chỉ có 1 invoice, không thu hồi (subset DS-002)
- Steps:
- Truy cập đơn hàng
- Quan sát Transaction List
- Expected:
- Hiện group header:
-- #MãTT . DD/MM/YYYY -- (icon) Đã chi . X.XXXđ -- - 5 cột:
# | Mã GD | Nhân viên | Số tiền | Thời gian - Mỗi NV có mã GD riêng (transaction_request.code khác nhau)
- Không hiện cột "Hành động" và "Trạng thái"
- Số tiền hiện
+X.XXXđmàu xanh
- Hiện group header:
TC-004a-02: Column check — không hiện cột thừa
- FR: FR-004a
- Priority: P1
- Precondition: Đơn 1 lần TT, tất cả completed
- Steps:
- Quan sát columns
- Expected:
- KHÔNG có cột "Trạng thái" (tất cả Thành công → thừa)
- KHÔNG có cột "Hành động"
- Chỉ đúng 5 cột
TC-004a-03: Sort — thời gian DESC
- FR: FR-004a, FR-011
- Priority: P1
- Precondition: Đơn 1 lần TT, 3+ giao dịch
- Steps:
- Quan sát thứ tự rows
- Expected:
- Giao dịch mới nhất (thời gian lớn nhất) ở trên cùng
TC-004a-04: Số tiền format — positive green
- FR: FR-004a, FR-012
- Priority: P1
- Precondition: Đơn 1 lần TT
- Steps:
- Quan sát cột Số tiền
- Expected:
- Hiện
+X.XXXđmàu xanh cho Chi tư vấn - Dấu phân cách hàng nghìn = dấu chấm (VD: +10.000đ)
- Hiện
TC-004b-01: Happy path — nhiều lần TT, group headers
- FR: FR-004b
- Priority: P0
- Precondition: DS-001 (2 lần TT: INV-001 và INV-002)
- Steps:
- Truy cập đơn hàng DS-001
- Quan sát Transaction List
- Expected:
- 2 group headers dạng divider:
-- #INV-002 . DD/MM/YYYY -- (icon) Đã chi . X.XXXđ --(mới nhất trước) - Vẫn 5 cột
- Mỗi group có giao dịch tương ứng
- 2 group headers dạng divider:
TC-004b-02: Group sort — thời gian DESC
- FR: FR-004b, FR-011
- Priority: P1
- Precondition: DS-001
- Steps:
- Quan sát thứ tự group headers
- Expected:
- INV-002 (14:00) trên INV-001 (10:00)
TC-004b-03: Group header format
- FR: FR-004b
- Priority: P1
- Precondition: DS-001
- Steps:
- Quan sát group header nội dung
- Expected:
- Format:
-- #MãTT . DD/MM/YYYY -- (icon) Đã chi . X.XXXđ -- - Số tiền = tổng chi tư vấn trong group
- Format:
TC-004b-04: Boundary — đơn có 5+ lần thanh toán
- FR: FR-004b
- Priority: P2
- Precondition: Đơn có 5 invoices
- Steps:
- Quan sát Transaction List
- Expected:
- 5 group headers hiện đúng, không bị tràn layout
- Sort đúng theo thời gian DESC
TC-004c-01: Happy path — có thu hồi, sub-sections [PLANNED]
- FR: FR-004c
- Priority: P0
- Precondition: DS-003 (có thu hồi)
- Steps:
- Truy cập đơn hàng DS-003
- Quan sát group có thu hồi
- Expected:
- Group tách 2 sub-sections: "Chi tư vấn" (subtotal) và "Thu hồi" (subtotal)
- Sub-section "Chi tư vấn": dòng
+X.XXXđmàu xanh - Sub-section "Thu hồi": dòng
-X.XXXđmàu đỏ + sub-text "bởi:{Admin name}" [PLANNED] Trước khi BE sẵn sàng: sub-section "Thu hồi" không hiện (không có data)
TC-004c-02: Group header trạng thái — thu hồi 1-99%
- FR: FR-004c, FORMULA-005
- Priority: P1
- Precondition: DS-003 (thu hồi 17%)
- Steps:
- Quan sát group header
- Expected:
- "(icon) Thu hồi 17%" (5.000/30.000 * 100 = 16.67 ~ làm tròn 17%)
- Group header số tiền = 30.000 - 5.000 = 25.000đ
TC-004c-03: Group header trạng thái — 0% (không thu hồi)
- FR: FR-004c
- Priority: P1
- Precondition: DS-001 (không có thu hồi)
- Steps:
- Quan sát group header
- Expected:
- "(icon) Đã chi" (không hiện tỷ lệ)
TC-004c-04: Group header trạng thái — 100% (đã hoàn tiền hết)
- FR: FR-004c
- Priority: P1
- Precondition: Đơn có thu hồi = 100% chi tư vấn (custom data)
- Steps:
- Tạo dữ liệu: chi tư vấn = 10.000đ, thu hồi = 10.000đ (cùng group)
- Quan sát group header
- Expected:
- "(icon) Đã hoàn tiền"
- Group header số tiền = 0đ
TC-004c-05: Boundary — FORMULA-005 edge case: SUM_chi = 0
- FR: FR-004c, FORMULA-005
- Priority: P1
- Precondition: Group không có chi tư vấn (edge case bất thường)
- Steps:
- Quan sát group
- Expected:
- Không hiện tỷ lệ (hiện "—" thay vì NaN/0%)
Group 5: Search (FR-005)
TC-005-01: Happy path — tìm theo mã thanh toán
- FR: FR-005
- Priority: P1
- Precondition: DS-001 (có INV-001, INV-002)
- Steps:
- Nhập "INV-001" vào ô search
- Chờ 300ms debounce
- Expected:
- Chỉ hiện giao dịch thuộc INV-001
- Group INV-002 bị ẩn
TC-005-02: Tìm theo mã giao dịch
- FR: FR-005
- Priority: P1
- Precondition: DS-001
- Steps:
- Nhập mã giao dịch (transaction_request.code) vào search
- Expected:
- Chỉ hiện giao dịch match
TC-005-03: Tìm theo tên nhân viên
- FR: FR-005
- Priority: P1
- Precondition: DS-001 (NV Lan, NV Hoa)
- Steps:
- Nhập "Lan" vào search
- Expected:
- Chỉ hiện giao dịch của NV Lan
TC-005-04: Clear search
- FR: FR-005
- Priority: P1
- Precondition: Đã search (TC-005-01)
- Steps:
- Click nút clear (x) trong ô search
- Expected:
- Ô search trống
- Hiện lại tất cả giao dịch
TC-005-05: Negative — keyword không match
- FR: FR-005
- Priority: P1
- Precondition: DS-001
- Steps:
- Nhập "ZZZZZ" vào search
- Expected:
- Transaction List hiện trống hoặc message "Không tìm thấy giao dịch"
Group 6: Dropdown Filter (FR-006)
TC-006-01: Happy path — filter "Chi tư vấn"
- FR: FR-006
- Priority: P1
- Precondition: DS-003 (có cả chi tư vấn và thu hồi [PLANNED])
- Steps:
- Chọn dropdown "Chi tư vấn"
- Expected:
- Chỉ hiện giao dịch có behavior_id = 'transaction_commission'
- Ẩn giao dịch thu hồi
TC-006-02: Filter "Thu hồi"
- FR: FR-006
- Priority: P1
- Precondition: DS-003 [PLANNED]
- Steps:
- Chọn dropdown "Thu hồi"
- Expected:
- Chỉ hiện giao dịch có behavior_id = 'refund_commission'
TC-006-03: Combination — dropdown + search + card filter
- FR: FR-006, FR-005, FR-003
- Priority: P2
- Precondition: DS-001
- Steps:
- Click card NV Lan (FR-003 filter)
- Chọn dropdown "Chi tư vấn" (FR-006 filter)
- Nhập "INV-001" vào search (FR-005 filter)
- Expected:
- Chỉ hiện giao dịch của NV Lan + behavior = transaction_commission + match INV-001
- 3 filter kết hợp AND logic
Group 7: Thuật ngữ (FR-007)
TC-007-01: Happy path — 7 locations đổi thuật ngữ
- FR: FR-007
- Priority: P0
- Precondition: Truy cập đơn hàng bất kỳ
- Steps:
- Kiểm tra tab label
- Kiểm tra section title
- Kiểm tra button label
- Kiểm tra message text
- Kiểm tra report label tại
/r/reports/ - Chuyển locale sang EN, kiểm tra lại
- Expected:
- Tab label: "Tư vấn" (không còn "Hoa hồng")
- Section title: "PHÂN BỔ TƯ VẤN"
- Button: "Cấu hình tư vấn"
- Message: "người tư vấn"
- Report label: "Báo cáo tư vấn"
- Route URL path giữ nguyên (không đổi)
TC-007-02: Negative — kiểm tra không còn "Hoa hồng" trong UI
- FR: FR-007
- Priority: P0
- Precondition: Truy cập cả 3 loại đơn hàng
- Steps:
- Tìm tất cả text hiển thị trên màn hình tab Tư vấn
- Tìm text trong report menu
- Expected:
- KHÔNG còn bất kỳ text "Hoa hồng" / "hoa hồng" nào trong UI visible text
- (GraphQL field names, DB columns vẫn giữ "commission" — đó là backend, không check)
TC-007-03: Regression — route URL không đổi
- FR: FR-007
- Priority: P0
- Precondition: Bookmark URL cũ
- Steps:
- Truy cập
/e/service-order/:id/commissions(URL cũ) - Truy cập
/e/product-order/:id/commissions - Truy cập
/e/prepaid-order/:id/commissions
- Truy cập
- Expected:
- Tất cả 3 URL vẫn hoạt động (không bị 404)
- Hiện tab "Tư vấn" với giao diện mới
Group 8: Nút "Cấu hình tư vấn" + Permission (FR-008)
TC-008-01: Happy path — IT Leader click button
- FR: FR-008
- Priority: P0
- Precondition: Đăng nhập IT Leader, đơn hàng bất kỳ
- Steps:
- Click nút "Cấu hình tư vấn"
- Expected:
- Mở dialog cấu hình commission (ServiceOrderCommissionCreate / CosmeticOrderCommissionCreate / PrepaidOrderCommissionCreate tùy loại đơn)
- Dialog hoạt động bình thường (giữ nguyên logic cũ)
TC-008-02: POS Staff — time-limited edit
- FR: FR-008
- Priority: P1
- Precondition: Đăng nhập POS Staff, đơn trong thời gian cho phép edit
- Steps:
- Quan sát nút "Cấu hình tư vấn"
- Expected:
- Nút hiển thị và click được (trong thời gian cho phép)
- Ngoài thời gian cho phép: nút ẨN (không disable)
TC-008-03: Staff no permission — nút ẩn
- FR: FR-008
- Priority: P0
- Precondition: Đăng nhập Staff không có quyền canEditCommission
- Steps:
- Truy cập tab Tư vấn
- Expected:
- NÚT "Cấu hình tư vấn" KHÔNG HIỆN (ẩn hoàn toàn, không disable)
- Tab Tư vấn vẫn hiện data (chỉ read-only)
Group 9: Empty State + Loading (FR-009, FR-010)
TC-009-01: Empty — chưa cấu hình commission
- FR: FR-009
- Priority: P0
- Precondition: DS-004 (order_commission rỗng)
- Steps:
- Truy cập đơn hàng DS-004
- Expected:
- Summary Bar: tất cả = 0đ
- Summary Cards: không hiện card nào
- Transaction List: "Chưa có giao dịch"
- Nút "Cấu hình tư vấn" hiện nổi bật
TC-009-02: Empty — có cấu hình, chưa có invoice
- FR: FR-009
- Priority: P0
- Precondition: Đơn mới tạo có order_commission nhưng chưa có invoice
- Steps:
- Truy cập đơn hàng
- Expected:
- Summary Bar: Phân bổ = {X}đ, Đã chi = 0đ, Thu hồi = 0đ, Đã nhận = 0đ
- Summary Cards: hiện cards với Phân bổ = {X}đ, Đã nhận = 0đ, trạng thái "(icon) Còn {X}đ"
- Transaction List: "Chưa có giao dịch"
TC-009-03: Empty — transaction list after filter no match
- FR: FR-009, FR-005
- Priority: P1
- Precondition: DS-001, search "ZZZZZ"
- Steps:
- Search keyword không match
- Expected:
- Transaction List hiện "Không tìm thấy giao dịch" hoặc empty state
- Summary Bar và Cards KHÔNG thay đổi (filter chỉ ảnh hưởng Transaction List)
TC-009-04: Empty — card filter, NV không có giao dịch trong list
- FR: FR-009, FR-003
- Priority: P2
- Precondition: Đơn có NV được cấu hình nhưng chưa có invoice (giao dịch = 0)
- Steps:
- Click card NV đó
- Expected:
- Transaction List: "Chưa có giao dịch của
{tên NV}" hoặc empty state
- Transaction List: "Chưa có giao dịch của
TC-010-01: Loading — skeleton cho Summary Bar + Cards
- FR: FR-010
- Priority: P1
- Precondition: Network slow (throttle 3G in DevTools)
- Steps:
- Truy cập tab Tư vấn với network throttled
- Expected:
- Summary Bar + Cards: skeleton loading (placeholder animated)
- Sau khi load xong: hiện data bình thường
TC-010-02: Loading — spinner cho Transaction List
- FR: FR-010
- Priority: P2
- Precondition: Network slow
- Steps:
- Truy cập tab Tư vấn với network throttled
- Quan sát Transaction List
- Expected:
- Transaction List: spinner (giữ nguyên pattern hiện tại)
- Cards có thể load xong trước bảng (độc lập)
Group 10: Sort Order (FR-011)
TC-011-01: Cards sort — Phân bổ DESC
- FR: FR-011
- Priority: P1
- Precondition: Đơn có 3+ NV với Phân bổ khác nhau
- Steps:
- Quan sát thứ tự cards
- Expected:
- NV có Phân bổ cao nhất hiện trước
- NV có Phân bổ thấp nhất hiện cuối
TC-011-02: Transaction groups sort — thời gian DESC
- FR: FR-011
- Priority: P1
- Precondition: DS-001 (2 groups: INV-001 10:00, INV-002 14:00)
- Steps:
- Quan sát thứ tự groups
- Expected:
- Group INV-002 (14:00) trên INV-001 (10:00)
TC-011-03: Transactions within group sort — thời gian DESC
- FR: FR-011
- Priority: P1
- Precondition: Group có 3+ giao dịch
- Steps:
- Quan sát thứ tự rows trong 1 group
- Expected:
- Giao dịch mới nhất ở trên, cũ nhất ở dưới
Group 11: Format Tiền (FR-012)
TC-012-01: Summary Bar format — X.XXXđ (không dấu +/-)
- FR: FR-012
- Priority: P0
- Precondition: DS-001
- Steps:
- Quan sát Summary Bar
- Expected:
- Hiện
60.000đ(không phải+60.000đhay-60.000đ) - Dấu phân cách hàng nghìn: dấu chấm
- Hiện
TC-012-02: Cards format — X.XXXđ (không dấu +/-)
- FR: FR-012
- Priority: P0
- Precondition: DS-001
- Steps:
- Quan sát cards
- Expected:
- Phân bổ và Đã nhận hiện
X.XXXđ(không dấu +/-)
- Phân bổ và Đã nhận hiện
TC-012-03: Transaction row — Chi tư vấn: +X.XXXđ màu xanh
- FR: FR-012
- Priority: P0
- Precondition: DS-001
- Steps:
- Quan sát cột Số tiền trong Transaction List
- Expected:
- Chi tư vấn:
+25.000đmàu xanh (positive)
- Chi tư vấn:
TC-012-04: Transaction row — Thu hồi: -X.XXXđ màu đỏ [PLANNED]
- FR: FR-012
- Priority: P1
- Precondition: DS-003 (có thu hồi)
- Steps:
- Quan sát dòng thu hồi trong Transaction List
- Expected:
- Thu hồi:
-5.000đmàu đỏ (negative) [PLANNED] Chỉ verify khi BE refund sẵn sàng
- Thu hồi:
TC-012-05: Boundary — số tiền lớn (> 1 triệu)
- FR: FR-012
- Priority: P1
- Precondition: Đơn có commission > 1.000.000đ
- Steps:
- Quan sát format tiền
- Expected:
- Hiện đúng:
1.500.000đ(3 dấu chấm), không bị tràn layout - Summary Bar, Cards, Transaction List đều format nhất quán
- Hiện đúng:
Group 12: Tooltip (FR-013)
TC-013-01: Happy path — hover tooltip hiện giải thích
- FR: FR-013
- Priority: P0
- Precondition: DS-001
- Steps:
- Hover icon
?bên cạnh "Phân bổ" trên Summary Bar - Hover icon
?bên cạnh "Đã chi" - Hover icon
?bên cạnh "Thu hồi" - Hover icon
?bên cạnh "Đã nhận"
- Hover icon
- Expected:
- Tooltip hiện với nội dung giải thích đúng theo B9 Tooltip Dictionary
- Phân bổ: "Tổng số tiền tư vấn được cấu hình cho các nhân viên trên đơn hàng này. Đây là số tiền dự kiến, chưa phải thực chi."
- Đã chi: "Tổng số tiền tư vấn đã được chuyển vào ví (wallet) của nhân viên thông qua các lần thanh toán đã hoàn tất."
- Thu hồi: "Số tiền tư vấn bị rút lại do hoàn đơn hoặc điều chỉnh."
- Đã nhận: "Số tiền nhân viên thực tế giữ được = Đã chi - Thu hồi. Đây là con số cuối cùng."
TC-013-02: Tooltip đóng khi di chuột ra
- FR: FR-013
- Priority: P1
- Precondition: Tooltip đang hiện
- Steps:
- Di chuột ra khỏi icon
?
- Di chuột ra khỏi icon
- Expected:
- Tooltip đóng (không bị treo)
TC-013-03: Tooltip trên Cards — "Phân bổ" và "Đã nhận"
- FR: FR-013
- Priority: P1
- Precondition: DS-001
- Steps:
- Hover icon
?bên cạnh "Phân bổ" trên card NV - Hover icon
?bên cạnh "Đã nhận" trên card NV
- Hover icon
- Expected:
- Tooltip hiện nội dung giải thích nhất quán với Summary Bar
Group 13: Cross — 3 Order Types
TC-OT-01: Service Order — tab Tư vấn hoạt động
- FR: All
- Priority: P0
- Precondition: DS-001 (Service Order)
- Steps:
- Truy cập
/e/service-order/{id}/commissions - Verify Summary Bar, Cards, Transaction List
- Truy cập
- Expected:
- Tab "Tư vấn" hiện đầy đủ 3 sections
- Data đúng theo DS-001
TC-OT-02: Cosmetic Order — tab Tư vấn hoạt động
- FR: All
- Priority: P0
- Precondition: DS-005 (Cosmetic Order)
- Steps:
- Truy cập
/e/product-order/{id}/commissions - Verify Summary Bar, Cards, Transaction List
- Truy cập
- Expected:
- Tab "Tư vấn" hiện đầy đủ 3 sections
- Nút "Cấu hình tư vấn" mở CosmeticOrderCommissionCreate dialog
TC-OT-03: Prepaid Order — tab Tư vấn hoạt động
- FR: All
- Priority: P0
- Precondition: DS-006 (Prepaid Order)
- Steps:
- Truy cập
/e/prepaid-order/{id}/commissions - Verify Summary Bar, Cards, Transaction List
- Truy cập
- Expected:
- Tab "Tư vấn" hiện đầy đủ 3 sections
- Nút "Cấu hình tư vấn" mở PrepaidOrderCommissionCreate dialog
Group 14: Cross — Permission / Roles
TC-PERM-01: IT Leader — full access
- FR: FR-008
- Priority: P0
- Precondition: Đăng nhập IT Leader
- Steps:
- Truy cập tab Tư vấn
- Click "Cấu hình tư vấn"
- Expected:
- Xem data: OK
- Nút "Cấu hình tư vấn": HIỆN, click mở dialog
- Không giới hạn thời gian
TC-PERM-02: POS Staff — time-limited
- FR: FR-008
- Priority: P0
- Precondition: Đăng nhập POS Staff
- Steps:
- Truy cập đơn hàng TRONG thời gian cho phép edit
- Truy cập đơn hàng NGOÀI thời gian cho phép edit
- Expected:
- Trong thời gian: nút "Cấu hình tư vấn" HIỆN
- Ngoài thời gian: nút "Cấu hình tư vấn" ẨN (không disable, không hiện)
TC-PERM-03: CRM Telesales — role + time limited
- FR: FR-008
- Priority: P0
- Precondition: Đăng nhập CRM Telesales
- Steps:
- Truy cập đơn hàng CRM trong thời gian edit
- Truy cập đơn hàng không phải CRM
- Expected:
- Đơn CRM trong thời gian: nút HIỆN
- Đơn không phải CRM hoặc ngoài thời gian: nút ẨN
TC-PERM-04: Staff no permission — read only
- FR: FR-008
- Priority: P0
- Precondition: Đăng nhập Staff không có quyền canEditCommission
- Steps:
- Truy cập tab Tư vấn
- Expected:
- Data hiện bình thường (read-only)
- Nút "Cấu hình tư vấn" KHÔNG HIỆN
TC-PERM-05: Regression — permission không thay đổi sau refactor
- FR: FR-008
- Priority: P0
- Precondition: 4 accounts (IT Leader, POS Staff, CRM Telesales, No-perm Staff)
- Steps:
- Đăng nhập từng account, truy cập cùng 1 đơn hàng
- Ghi lại trạng thái nút "Cấu hình tư vấn" cho mỗi account
- So sánh với trạng thái TRƯỚC refactor (nếu có)
- Expected:
- Trạng thái nút (hiện/ẩn) GIỐNG hệt trước refactor
- Logic canEditCommission không bị ảnh hưởng
TC-KEEP-01: Regression — customer commission / affiliate / referral không bị remove
- FR: Non-goal / Backlog Phase 2 scope guard
- Priority: P0
- Precondition: Đơn hàng có dữ liệu customer commission / affiliate / referral / người giới thiệu theo logic hiện tại
- Steps:
- Mở cùng đơn hàng trước và sau redesign tab Tư vấn
- Kiểm tra block/field customer commission / affiliate / referral / người giới thiệu
- Đối chiếu với UI Spec B0
SCR-01-BLK-03
- Expected:
- Block/field vẫn hiển thị theo đúng điều kiện và quyền hiện tại
- Không bị remove/hide do target wireframe thiếu block
- Nếu không thấy block dù dữ liệu/quyền đủ, log bug
UI Spec gap/drift hoặc FE regression, không confirm expected behavior
D5) Entry / Exit Criteria
Entry (bắt đầu test)
- [ ] FE deploy xong trên staging/test env (không cần BE deploy — FE-only refactor)
- [ ] Seed data (DS-001 đến DS-006) đã có trên test env
- [ ] 4 test accounts với quyền phù hợp:
- IT Leader (unlimited edit)
- POS Staff (time-limited edit)
- CRM Telesales (role + time limited)
- Staff no permission
- [ ] 3 loại đơn hàng (service, cosmetic, prepaid) có data trên test env
- [ ] Có ít nhất 1 đơn hàng test chứa customer commission / affiliate / referral / người giới thiệu để chạy TC-KEEP-01
- [ ] PRD + UI Spec v1.2 + Dev Spec đã approved
Exit (kết thúc test — QA PASS)
- [ ] Tất cả P0 test cases PASS (32 TC)
- [ ] Tất cả P1 test cases PASS hoặc có waiver từ PO (24 TC)
- [ ] P2 test cases: document known issues nếu FAIL (14 TC)
- [ ] Không còn critical/major bugs open
- [ ] 3 order types đều PASS
- [ ] 4 roles đều PASS
- [ ] Regression: tất cả chức năng cũ vẫn hoạt động (feature parity), bao gồm customer commission / affiliate / referral / người giới thiệu
- [ ] [PLANNED] test cases: document status (skip nếu BE chưa sẵn sàng, ghi note)
Test Report Template
| Hạng mục | Kết quả |
|---|---|
| Tổng TC | 70 |
| PASS | ___ |
| FAIL | ___ |
| SKIP ([PLANNED]) | ___ |
| BLOCK | ___ |
| Bugs found | ___ (critical: ___, major: ___, minor: ___) |
| QA Lead sign-off | ___ / DD/MM/YYYY |