Skip to content

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 viChi tiết
Moduleecommerce (diva-admin)
Order typesService Order, Cosmetic Order, Prepaid Order
RolesIT Leader, POS Staff, CRM Telesales, Staff (no permission)
BrowsersChrome (primary), Firefox, Safari (smoke)
DevicesDesktop (primary), Tablet (responsive check)
BE/DBKhông test — FE-only refactor, không đổi API/DB
Scope guardCustomer 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

FRMô tảPrioritySố TC
FR-001Summary Bar: 4 chỉ số + tooltip + context lineMust6
FR-002Summary Cards: per NV, 2 số + trạng thái + expand DVMust7
FR-003Click card filter bảng dướiShould4
FR-004aFlat list: 1 lần TT, không thu hồi (5 cột + group header)Must4
FR-004bFlat list: nhiều lần TT (+ group header)Must4
FR-004cFlat list: có thu hồi [PLANNED]Must5
FR-005Search: mã TT, mã GD, tên NVShould5
FR-006Dropdown filterShould3
FR-007Đổi thuật ngữ UI (7 locations)Must3
FR-008Nút "Cấu hình tư vấn"Must3
FR-009Empty stateMust4
FR-010Loading stateShould2
FR-011Sort orderMust3
FR-012Format tiềnMust5
FR-013Tooltip giải thíchMust3
Cross3 Order Types + Permission + feature parity guard9
Tổng:70 TC

D2) Requirements Matrix (FR -> TC Mapping)

FRTC IDsCoverageGhi chú
FR-001TC-001-01 .. TC-001-07 (excl TC-001-03)6 TC (1 happy + 5 beyond)Formula verify + context lines
FR-002TC-002-01 .. TC-002-08 (excl TC-002-06)7 TC (1 happy + 6 beyond)Card states + expand + scale
FR-003TC-003-01 .. TC-003-044 TC (1 happy + 3 beyond)Click/toggle filter
FR-004aTC-004a-01 .. TC-004a-044 TCSimple case, 5 columns
FR-004bTC-004b-01 .. TC-004b-044 TCGroup headers, multi-payment
FR-004cTC-004c-01 .. TC-004c-055 TCRevoke sub-sections [PLANNED]
FR-005TC-005-01 .. TC-005-055 TCSearch debounce + 3 match types
FR-006TC-006-01 .. TC-006-03 (excl TC-006-03 cũ)3 TCDropdown filter options
FR-007TC-007-01 .. TC-007-033 TCi18n + hardcode locations
FR-008TC-008-01 .. TC-008-033 TCButton label + permission + dialog
FR-009TC-009-01 .. TC-009-044 TCEmpty: no config + no invoice
FR-010TC-010-01 .. TC-010-022 TCSkeleton + spinner
FR-011TC-011-01 .. TC-011-033 TCCard sort + group sort
FR-012TC-012-01 .. TC-012-055 TCVND format per section
FR-013TC-013-01 .. TC-013-033 TCTooltip content + behavior
CrossTC-OT-01 .. TC-OT-03, TC-PERM-01 .. TC-PERM-05, TC-KEEP-019 TC3 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.

EntityData
OrderService Order #SO-20260301-001, branch_id = {test_branch}, status = completed
Order ItemsOI-1: "BTX thiết kế" 500.000đ, OI-2: "Gội đầu" 200.000đ
order_commissionNV Lan: OI-1 = 30.000đ (vnd), OI-2 = 10.000đ (vnd). NV Hoa: OI-1 = 20.000đ (vnd)
invoice #1INV-001, status = invoice_completed, paid_at = 2026-03-01 10:00
invoice_commission #1NV Lan: 25.000đ (completed), NV Hoa: 15.000đ (completed)
invoice #2INV-002, status = invoice_completed, paid_at = 2026-03-01 14:00
invoice_commission #2NV Lan: 15.000đ (completed), NV Hoa: 5.000đ (completed)
transaction_request4 records, behavior_id = transaction_commission, status = S

Expected values:

Chỉ sốNV LanNV HoaTổng đơn
Phân bổ40.000đ20.000đ60.000đ
Đã chi40.000đ20.000đ60.000đ
Thu hồi
Đã nhận40.000đ20.000đ60.000đ

Dataset: DS-002 — Đơn dịch vụ, chi trả 1 phần (Phân bổ > Đã chi)

EntityData
OrderService Order #SO-20260302-001
order_commissionNV Lan: 40.000đ
invoice #1INV-003, status = invoice_completed
invoice_commission #1NV 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]

EntityData
OrderService Order #SO-20260303-001
order_commissionNV Lan: 40.000đ
invoice #1INV-004, status = invoice_completed
invoice_commission #1NV 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)

EntityData
OrderService 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)

EntityData
OrderCosmetic Order #CO-20260305-001
order_commissionNV Mai: 15.000đ
invoice #1INV-005, status = invoice_completed
invoice_commission #1NV 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)

EntityData
OrderPrepaid Order #PO-20260306-001
order_commissionNV Trang: 10.000đ
invoice #1INV-006, status = invoice_completed
invoice_commission #1NV 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:
    1. Đăng nhập role IT Leader
    2. Truy cập /e/service-order/{SO-20260301-001}/commissions
    3. 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:
    1. Truy cập đơn hàng DS-002
    2. 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:
    1. Truy cập đơn hàng DS-001
    2. 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:
    1. Truy cập đơn hàng DS-001
    2. 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:
    1. Truy cập đơn hàng DS-003
    2. 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:
    1. Truy cập đơn hàng DS-004
    2. 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:
    1. Truy cập đơn hàng DS-001
    2. 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:
    1. Truy cập đơn hàng DS-002
    2. 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:
    1. Truy cập đơn hàng DS-003
    2. 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:
    1. 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

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:
    1. 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:
    1. Truy cập đơn hàng có 7 NV
    2. 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:
    1. Truy cập đơn hàng DS-001
    2. 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:
    1. Click card NV Lan
    2. 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:
    1. 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:
    1. 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:
    1. 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:
    1. Truy cập đơn hàng
    2. 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

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:
    1. 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:
    1. 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:
    1. 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đ)

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:
    1. Truy cập đơn hàng DS-001
    2. 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

TC-004b-02: Group sort — thời gian DESC

  • FR: FR-004b, FR-011
  • Priority: P1
  • Precondition: DS-001
  • Steps:
    1. 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:
    1. 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

TC-004b-04: Boundary — đơn có 5+ lần thanh toán

  • FR: FR-004b
  • Priority: P2
  • Precondition: Đơn có 5 invoices
  • Steps:
    1. 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:
    1. Truy cập đơn hàng DS-003
    2. 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:
    1. 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:
    1. 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:
    1. Tạo dữ liệu: chi tư vấn = 10.000đ, thu hồi = 10.000đ (cùng group)
    2. 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:
    1. 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:
    1. Nhập "INV-001" vào ô search
    2. 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:
    1. 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:
    1. Nhập "Lan" vào search
  • Expected:
    • Chỉ hiện giao dịch của NV Lan
  • FR: FR-005
  • Priority: P1
  • Precondition: Đã search (TC-005-01)
  • Steps:
    1. 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:
    1. 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:
    1. 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:
    1. 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:
    1. Click card NV Lan (FR-003 filter)
    2. Chọn dropdown "Chi tư vấn" (FR-006 filter)
    3. 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:
    1. Kiểm tra tab label
    2. Kiểm tra section title
    3. Kiểm tra button label
    4. Kiểm tra message text
    5. Kiểm tra report label tại /r/reports/
    6. 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:
    1. Tìm tất cả text hiển thị trên màn hình tab Tư vấn
    2. 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:
    1. Truy cập /e/service-order/:id/commissions (URL cũ)
    2. Truy cập /e/product-order/:id/commissions
    3. Truy cập /e/prepaid-order/:id/commissions
  • 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:
    1. 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:
    1. 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:
    1. 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:
    1. 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:
    1. 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:
    1. 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:
    1. Click card NV đó
  • Expected:
    • Transaction List: "Chưa có giao dịch của {tên NV}" hoặc empty state

TC-010-01: Loading — skeleton cho Summary Bar + Cards

  • FR: FR-010
  • Priority: P1
  • Precondition: Network slow (throttle 3G in DevTools)
  • Steps:
    1. 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:
    1. Truy cập tab Tư vấn với network throttled
    2. 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:
    1. 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:
    1. 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:
    1. 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:
    1. 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

TC-012-02: Cards format — X.XXXđ (không dấu +/-)

  • FR: FR-012
  • Priority: P0
  • Precondition: DS-001
  • Steps:
    1. Quan sát cards
  • Expected:
    • Phân bổ và Đã nhận hiện X.XXXđ (không dấu +/-)

TC-012-03: Transaction row — Chi tư vấn: +X.XXXđ màu xanh

  • FR: FR-012
  • Priority: P0
  • Precondition: DS-001
  • Steps:
    1. Quan sát cột Số tiền trong Transaction List
  • Expected:
    • Chi tư vấn: +25.000đ màu xanh (positive)

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:
    1. 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

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:
    1. 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

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:
    1. Hover icon ? bên cạnh "Phân bổ" trên Summary Bar
    2. Hover icon ? bên cạnh "Đã chi"
    3. Hover icon ? bên cạnh "Thu hồi"
    4. Hover icon ? bên cạnh "Đã nhận"
  • 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:
    1. 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:
    1. Hover icon ? bên cạnh "Phân bổ" trên card NV
    2. Hover icon ? bên cạnh "Đã nhận" trên card NV
  • 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:
    1. Truy cập /e/service-order/{id}/commissions
    2. Verify Summary Bar, Cards, Transaction List
  • 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:
    1. Truy cập /e/product-order/{id}/commissions
    2. Verify Summary Bar, Cards, Transaction List
  • 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:
    1. Truy cập /e/prepaid-order/{id}/commissions
    2. Verify Summary Bar, Cards, Transaction List
  • 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:
    1. Truy cập tab Tư vấn
    2. 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:
    1. Truy cập đơn hàng TRONG thời gian cho phép edit
    2. 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:
    1. Truy cập đơn hàng CRM trong thời gian edit
    2. 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:
    1. 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:
    1. Đăng nhập từng account, truy cập cùng 1 đơn hàng
    2. Ghi lại trạng thái nút "Cấu hình tư vấn" cho mỗi account
    3. 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:
    1. Mở cùng đơn hàng trước và sau redesign tab Tư vấn
    2. Kiểm tra block/field customer commission / affiliate / referral / người giới thiệu
    3. Đố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ụcKết quả
Tổng TC70
PASS___
FAIL___
SKIP ([PLANNED])___
BLOCK___
Bugs found___ (critical: ___, major: ___, minor: ___)
QA Lead sign-off___ / DD/MM/YYYY