Skip to content

UI Spec — Báo cáo Đơn hàng Voucher/Quà tặng

Ref: PRD v1.0 | Date: 19/03/2026


B1) Screen Map

SCRTênRouteMô tả
SCR-01Tab Đơn hàng Voucher/Quà tặng/r/reports/revenue_report_group (tab mới)Bảng + summary bar + filter riêng

B2) SCR-01: Tab Đơn hàng Voucher/Quà tặng

Layout

┌─────────────────────────────────────────────────────────────────────────────────┐
│ Revenue Report Group                                                            │
│ ┌─────────┬─────────────┬──────────────┬──────────────┬────────────┬───────────┐│
│ │Tổng ĐH  │ĐH Dịch vụ  │GD Dịch vụ   │ĐH Sản phẩm  │ĐH Thẻ TT  │ Voucher/  ││
│ │         │             │             │              │            │ Quà tặng ◄││
│ └─────────┴─────────────┴──────────────┴──────────────┴────────────┴───────────┘│
├──────────────┬──────────────────────────────────────────────────────────────────┤
│              │                                                                  │
│  FILTER      │  SUMMARY BAR                                                    │
│  ┌────────┐  │  ┌──────────────┬──────────────┬──────────────┬──────────────┐   │
│  │Thời gian│  │  │ Tổng lượt    │ Tổng giá trị │ Tổng thực thu│ Tỷ lệ giảm  │   │
│  │01/01 -  │  │  │ dùng         │ giảm giá     │ (đơn có VC)  │ trung bình   │   │
│  │19/03/26 │  │  │   256 lượt   │ 45.200.000đ  │ 320.500.000đ │   12.4%      │   │
│  ├────────┤  │  │  (128 đơn)   │              │              │              │   │
│  │Chi nhánh│  │  └──────────────┴──────────────┴──────────────┴──────────────┘   │
│  │[Tất cả]│  │                                                                  │
│  ├────────┤  │  ┌──────────────────────────────────────────────────────────┐     │
│  │Nguồn quà│  │  │                                     [Xuất Excel]  │     │
│  │[Tất cả]│  │  └──────────────────────────────────────────────────────────┘     │
│  ├────────┤  │                                                                  │
│  │Chiến dịch│ │  TABLE                                                          │
│  │[Chọn   ]│ │  ┌──────┬────────┬─────────┬──────┬──────────────┬─────┬───────┐ │
│  │ nguồn  │  │  │Mã ĐH │Ngày tạo│Khách    │CN    │Voucher/Quà   │Loại │Số tiền│ │
│  │ trước  │  │  │      │        │hàng     │      │              │giảm │giảm   │ │
│  ├────────┤  │  ├──────┼────────┼─────────┼──────┼──────────────┼─────┼───────┤ │
│  │Loại giảm│  │  │DH-001│15/03/26│Nguyễn   │CN    │Giảm 20% DV   │% giảm│200.000│ │
│  │[Tất cả]│  │  │      │10:30   │Thị Mai  │Quận 1│VOC-ABC123    │     │      │ │
│  ├────────┤  │  │      │        │0901xxx  │      │              │     │      │ │
│  │Trạng   │  │  ├──────┼────────┼─────────┼──────┼──────────────┼─────┼───────┤ │
│  │thái đơn│  │  │  ↳   │        │         │      │Mua 1 tặng 1  │DV   │500.000│ │
│  │[Trừ ĐH │  │  │      │        │         │      │VOC-DEF456    │     │      │ │
│  │ đã hủy]│  │  ├──────┼────────┼─────────┼──────┼──────────────┼─────┼───────┤ │
│  └────────┘  │  │DH-002│14/03/26│Trần     │CN    │Giảm 100K     │VNĐ  │100.000│ │
│              │  │      │14:20   │Văn Hùng │Q.7   │VOC-GHI789    │     │      │ │
│              │  │      │        │0912xxx  │      │              │     │      │ │
│              │  └──────┴────────┴─────────┴──────┴──────────────┴─────┴───────┘ │
│              │  (tiếp: Nguồn quà | Campaign | Tổng ĐH | Thực thu | Trạng thái) │
│              │                                                                  │
│              │  ◄ 1 2 3 ... 10 ►   Hiển thị 1-20 / 256 lượt                    │
└──────────────┴──────────────────────────────────────────────────────────────────┘

Ghi chú wireframe:

  • Dòng "↳" biểu thị dòng thứ 2 cùng đơn DH-001 — dim các cột order-level, chỉ hiển thị cột item-level.
  • Layout khác các tab cũ (Ref: DEC-016): Summary bar 4 cards + Export button row riêng — khác pattern 1 BoxInfo + Export cùng row của các tab hiện có. Lý do: tab này cần 4 metrics.
  • Cột STT — đánh liên tục theo order_item (1, 2, 3...), không reset khi group. Consistent với các tab khác.
  • BoxInfo card 1 có sub-text "(128 đơn)" — component BoxInfo hiện tại chưa support sub-text. FE cần extend hoặc custom render slot.

Filter Bar

#ComponentTypeDefaultBehavior
1Thời gianDateRangePickerTháng hiện tạiThay đổi giá trị, bấm "Áp dụng" để reload
2Chi nhánhQSelect multiTất cả (theo RBAC)Staff: branch mình. Manager: branch quản lý. Admin: tất cả
3Nguồn quàQSelect multiTất cả5 giá trị. Chọn → enable + load dropdown Chiến dịch
4Chiến dịch/Chương trìnhQSelect multiDisabled + "Chọn nguồn quà trước" khi #3 chưa chọn. Loading state khi đang fetch. Reset khi #3 thay đổi
5Loại giảmQSelect multiTất cả6 giá trị (từ master_data). WHERE: gift: { gift_type: { _in: [...] } }
6Trạng thái đơnQSelect singleTrừ ĐH đã hủyOptions: Tất cả / Đang xử lý / Hoàn tất / Đã hủy / Trừ ĐH đã hủy
Nút "Áp dụng"XBtnClick → reload data + summary bar + reset page 1. KHÔNG auto-reload khi thay đổi filter (Ref: DEC-015, consistent với RevenueReportFilter pattern)

Table

CộtWidthAlignFormatSticky
STT50pxCenterSố thứ tự liên tục (1, 2, 3...), không reset khi groupNo
Mã đơn hàng100pxLeftLink (blue, underline on hover)No
Ngày tạo130pxLeftDD/MM/YYYY HH:MMNo
Khách hàng150pxLeftTên (dòng 1) + SĐT (dòng 2, grey)No
Chi nhánh100pxLeftTextNo
Voucher/Quà200pxLeftTên (dòng 1) + Mã voucher (dòng 2, grey). ellipsis + QTooltipNo
Loại giảm80pxLeftText abbreviated: "% giảm", "VNĐ", "DV", "SP", "Lời chúc", "Khác"No
Số tiền giảm120pxRightformatCurrency(value) + "đ"No
Nguồn quà90pxLeftText abbreviated: "Lắc xì", "Vòng quay", "Voucher", "Bạn bè", "Thủ công"No
Campaign180pxLeftText. ellipsis + QTooltip. Logic render theo gifted_fromNo
Tổng đơn hàng120pxRightformatCurrency(value) + "đ"No
Thực thu120pxRightformatCurrency(value) + "đ"No
Trạng thái90pxLeftTextNo

Permission Matrix

RoleXem tabFilter chi nhánhExport Excel
StaffBranch mình (nếu có quyền report)Chỉ branch mình
ManagerBranch quản lýBranches quản lý
Admin✅ Tất cảTất cả
Không có quyền report❌ Ẩn tab

State Matrix

StateHiển thị
LoadingSummary bar: 4 BoxInfo với loading={true} (QSkeleton). Table: XTable loading={true} spinner
Empty"Không có đơn hàng voucher/quà tặng trong khoảng thời gian này" centered. Summary bar: 0 / 0đ / 0đ / —
ErrorError message từ getNoDataMessage(error) + nút Retry. Summary bar: hiển thị "—"
No PermissionẨn tab hoàn toàn (không disable)

B3) User Flows

Flow 1: Happy path — Xem báo cáo

Vào Revenue Report Group → Click tab "Voucher/Quà tặng"
→ Filter tự load tháng hiện tại + branch theo RBAC
→ Summary bar hiển thị 4 metrics
→ Bảng hiển thị 20 items đầu tiên
→ Scroll/phân trang để xem thêm

Flow 2: Drill-down theo nguồn quà → chiến dịch

Chọn Nguồn quà = "Lắc xì"
→ Dropdown Chiến dịch enable + loading
→ Danh sách chương trình lắc xì hiện ra
→ Chọn "Lắc xì Tết 2026"
→ Data reload: chỉ hiện đơn từ chương trình đó
→ Summary bar cập nhật theo filter

Flow 3: Export Excel

Áp dụng filter → Bấm "Áp dụng" → Data load xong
→ Click "Xuất Excel"
→ Kiểm tra aggregate count từ summary bar (đã có sẵn, không query thêm):
  → Nếu > 10,000 dòng:
    → Hiện confirmation dialog:
      "Dữ liệu có hơn 10,000 dòng, quá trình export có thể mất vài phút. Tiếp tục?"
    → [Tiếp tục]: bắt đầu fetch toàn bộ data → build Excel → download
    → [Hủy]: abort, không fetch
  → Nếu ≤ 10,000 dòng: fetch toàn bộ → build Excel → download ngay
→ Hiện loading spinner trên nút export trong suốt quá trình fetch + build

Flow 4: Xem đơn hủy (audit)

Chọn filter Trạng thái đơn = "Đã hủy"
→ Bảng hiển thị đơn đã hủy có voucher
→ Summary bar tính trên đơn hủy
→ PO kiểm tra voucher đã được restored chưa

B4) Notification Spec

Không có notification — feature chỉ đọc dữ liệu (read-only report).


B5) Export Spec

ColumnHeader textFormatWidth
Mã đơn hàngMã đơn hàngtextauto
Ngày tạoNgày tạoDD/MM/YYYY HH:MM18
Khách hàngKhách hàngtextauto
SĐTSố điện thoạitext15
Chi nhánhChi nhánhtextauto
Tên voucher/quàTên voucher/quàtextauto
Mã voucherMã vouchertext15
Loại giảm giáLoại giảm giátext15
Số tiền giảmSố tiền giảm (VNĐ)number (#,##0)15
Nguồn quàNguồn quàtext15
Campaign/Chương trìnhCampaign/Chương trìnhtextauto
Tổng đơn hàngTổng đơn hàng (VNĐ)number (#,##0)15
Thực thuThực thu (VNĐ)number (#,##0)15
Trạng tháiTrạng tháitext12
  • File name: don-hang-voucher-qua-tang_DD-MM-YYYY.xlsx
  • Row cap: Không giới hạn (follow pattern các tab hiện có)
  • Warning > 10,000 dòng: Hiển thị confirmation dialog "Dữ liệu có hơn 10,000 dòng, quá trình export có thể mất vài phút. Tiếp tục?" → [Tiếp tục] / [Hủy]
  • Header style: Bold, background color (giống pattern hiện có)

B6) Copy Text Dictionary

KeyVietnameseEnglish (i18n)Context
tab_voucher_gift_orderĐơn hàng Voucher/Quà tặngVoucher/Gift OrdersTab label
summary_total_usageTổng lượt dùngTotal UsageSummary card 1
summary_total_discountTổng giá trị giảm giáTotal Discount ValueSummary card 2
summary_total_revenueTổng thực thuTotal Net RevenueSummary card 3
summary_avg_rateTỷ lệ giảm trung bìnhAverage Discount RateSummary card 4
filter_gift_sourceNguồn quàGift SourceFilter label
filter_campaignChiến dịch/Chương trìnhCampaign/ProgramFilter label
filter_gift_typeLoại giảmDiscount TypeFilter label
filter_order_statusTrạng thái đơnOrder StatusFilter label
filter_campaign_placeholderChọn nguồn quà trướcSelect gift source firstDisabled placeholder
filter_campaign_naKhông áp dụngNot applicableWhen source has no campaign
empty_textKhông có đơn hàng voucher/quà tặng trong khoảng thời gian nàyNo voucher/gift orders foundEmpty state
unit_usagelượtusage(s)Count unit
unit_orderđơnorder(s)Count unit

B7) Analytics Events

EventTriggerPropertiesKPI Link
report_voucher_gift_tab_viewClick tabbranch_id, user_roleUser adoption
report_voucher_gift_filterApply filterfilter_type, filter_valueMost used filters
report_voucher_gift_exportClick exportrow_count, filter_appliedExport usage

B8) Responsive Rules

BreakpointLayout Behavior
Desktop (≥1024px)Full layout: sidebar filter 350px + content area
Tablet (768-1023px)Sidebar collapse thành drawer. Bảng horizontal scroll
Mobile (<768px)Không hỗ trợ — admin report chỉ dùng trên desktop

B9) Tooltip Dictionary

Màn hìnhField/IconTooltip TextĐiều kiện hiện
SCR-01Tổng lượt dùngSố lượt sử dụng voucher/quà tặng trong đơn hàng. Một đơn có thể có nhiều lượt.Hover icon ℹ️
SCR-01Tỷ lệ giảm TBTổng giá trị giảm ÷ (Tổng thực thu + Tổng giá trị giảm) × 100%. Chỉ tính phần voucher/gift.Hover icon ℹ️
SCR-01Cột Voucher/Quà (ellipsis)Hiển thị full tên + mã voucherHover cell bị cắt
SCR-01Cột Campaign (ellipsis)Hiển thị full tên campaign/chương trìnhHover cell bị cắt
SCR-01Filter Chiến dịch (disabled)Vui lòng chọn Nguồn quà trước để lọc theo chiến dịchHover khi disabled

B-Edge Cases

#CaseExpected Behavior
11 đơn có 5 order_item dùng voucher5 dòng, dim repeated order-level cells ở dòng 2-5. Pagination đếm 5 items
2Voucher không còn liên kết campaignCột Campaign hiển thị "—"
3Gift type "Lời chúc"Hiển thị bình thường, Số tiền giảm = 0đ
4Filter "Bạn bè" + "Thủ công" (không có campaign)Dropdown Chiến dịch disabled + "Không áp dụng"
5Chọn nhiều nguồn quà cùng lúcGộp tất cả campaigns của các nguồn đã chọn vào dropdown
6Date range 1 năm → dữ liệu rất nhiềuPagination bảo vệ. Summary bar có thể chậm → loading skeleton
7Tất cả đơn trong range đều đã hủyBảng empty state. Summary bar: 0 / 0đ / 0đ / —
8Export > 10,000 dòngCheck aggregate count TRƯỚC khi fetch. Hiện confirmation dialog. "Tiếp tục" → fetch all + export. "Hủy" → abort
9Đổi nguồn quà khi đã chọn campaignReset campaign dropdown + clear selected values
10User Staff không có quyền reportẨn toàn bộ tab (không disable)
11Chọn nguồn hỗn hợp (có campaign + không campaign), VD: "Lắc xì" + "Bạn bè"Dropdown Chiến dịch enable, load campaigns của Lắc xì. Items từ "Bạn bè" vẫn hiện trong bảng bất kể filter campaign