Skip to content

Redesign Tab Tư vấn (Commission → Advisory Fee)

Version: 1.0 Date: 23/03/2026 Author: PO/BA Type: Enhancement Complexity: M Module: ecommerce


Changelog

VersionDateAuthorThay đổi
1.023/03/2026PO/BAInitial — redesign UX tab Hoa hồng thành Tư vấn
1.107/04/2026PO/BALoại bỏ trạng thái "Chờ duyệt" — codebase confirm commission tự động vào wallet khi thanh toán, không có bước duyệt. Xóa FR-004d, cập nhật FR-001/002/006. Luôn hiện group header (bỏ adaptive ẩn khi 1 lần TT). Xóa nút "Bỏ filter" trong card — toggle click card là đủ.

Hướng dẫn đọc (RACI)

AudienceDoc sectionsTrách nhiệm
PO/BAZ, A, BApprove requirements, UX flows
Tech LeadZ, A, CApprove architecture, review dev spec
FE DevB, C (C1-C6)Implement UI
BE DevC (C1-C12)Implement backend
QAA (A5), D (D4 = traceability)Write + execute test cases

Executive Summary (TL;DR)

Redesign tab "Hoa hồng" trong chi tiết đơn hàng thành tab "Tư vấn" với giao diện mới gồm Summary Bar + Summary Cards + Flat Transaction List. Đổi thuật ngữ toàn bộ UI từ "Hoa hồng" sang "Tư vấn" (advisory fee) cho đúng bản chất nghiệp vụ. Áp dụng cho cả 3 loại đơn hàng: dịch vụ, mỹ phẩm, nạp tiền.

Milestones

MilestoneTargetOwnerĐiều kiện
PRD + Spec approvedT+2 ngàyPO-
FE ImplementationT+5 ngàyFE DevSpec approved
QA TestingT+7 ngàyQAFE deploy staging
Go-LiveT+8 ngàyTech LeadQA pass

Trạng thái Sign-off

DomainNgườiStatus
BusinessPOPending
TechTech LeadPending
QAQA LeadPending

Pending Decisions

PDQuestionOptions / AssumptionOwnerDeadlineStatusResolution
PD-001Backend thu hồi: khi nào dev xong? Có cần API mới?A) Dùng API hiện có B) API mới. Khuyến nghị: ATech Lead30/03/2026Open-
PD-002Notification template đổi "hoa hồng" -> "tư vấn"?Đã resolved -> DEC-007PO-Resolved-> DEC-007

Backlog Phase 2 (Out-of-scope)

#Tính năngLý do defer
1Customer commission (affiliate/referral) trong tab Tư vấnGiữ logic cũ, redesign riêng nếu cần
2Notification template migration "hoa hồng" -> "tư vấn"Tách task riêng, ship sau 1 sprint (DEC-007)
3Backend: nhập số tiền thu hồi cụ thể khi duyệt hoàn tiềnĐang phát triển, đánh dấu [PLANNED] trong spec

Z) Decision Log

IDCategoryQuyết địnhLý do (Option A vs B)NgàyStatus
DEC-001UXLayout: Summary Bar + Summary Cards + Flat Transaction ListA) Layout mới (chọn) — sếp nhìn 2 giây hiểu. B) Fix grouping bảng cũ — chỉ fix 1 vấn đề, còn thuật ngữ vẫn mơ hồ23/03/2026Locked
DEC-002UXCard chỉ hiện 2 số: Phân bổ / Đã nhận + trạng thái 1 dòngA) 2 số (chọn) — gọn, đủ info. B) 4 số (Phân bổ/Đã chi/Thu hồi/Đã nhận) — quá nhiều, nhầm lẫn23/03/2026Locked
DEC-003UXBảng adaptive: sub-section theo context. Group header luôn hiện (v1.1: bỏ adaptive ẩn group header, mỗi NV có mã GD riêng nên cần group header để hiện mã TT)A) Luôn hiện group header (chọn v1.1) — mỗi NV có transaction_request riêng với mã GD riêng, group header hiện mã TT giúp user biết thuộc cùng 1 lần thanh toán. B) Ẩn khi 1 lần TT (v1.0) — nhiều mã GD khác nhau gây confuse07/04/2026Locked
DEC-004BusinessĐổi thuật ngữ: Hoa hồng -> Tư vấn (chỉ UI labels, không đổi DB/API)A) UI only (chọn) — effort thấp, không breaking change. B) Đổi cả DB/API — effort cao, risk cao, lợi ích thấp23/03/2026Locked
DEC-005UXEmpty state: hiện cards (phân bổ) + bảng trống "Chưa có giao dịch"A) Hiện cards + bảng trống (chọn) — POS có thể cấu hình phân bổ trước khi thanh toán. B) Ẩn tab khi chưa có data — mất khả năng cấu hình sớm23/03/2026Locked
DEC-006TechnicalThu hồi đánh dấu [PLANNED], mô tả UI đầy đủ nhưng note backend đang phát triểnA) PLANNED tag (chọn) — PRD hoàn chỉnh, dev có spec sẵn. B) Không đề cập — PRD thiếu, phải viết lại sau23/03/2026Locked
DEC-007BusinessNotification template đổi "hoa hồng" -> "tư vấn" — tách task riêng, ship sau 1 sprintA) Tách riêng (chọn) — giảm risk, không delay UI. B) Gộp cùng — tăng scope, cần QA notification riêng23/03/2026Locked
DEC-008BusinessReport module label "Báo cáo hoa hồng" -> "Báo cáo tư vấn" — đổi cùng đợtA) Đổi cùng (chọn) — chỉ i18n, zero risk. B) Defer — inconsistent UX23/03/2026Locked

A) PRD

A1) Blueprint

FieldValue
FeatureRedesign Tab Tư vấn (Commission -> Advisory Fee)
TypeEnhancement
PlatformWeb Admin (diva-admin) — Admin, POS, CRM
Module ảnh hưởngFE: ecommerce (OrderCommissions, OrderCommissionTable, OrderCommissionItem), report (i18n). BE: không đổi logic

A2) Context

As-Is

  • Tab "Hoa hồng" trong chi tiết đơn hàng hiển thị 2 bảng:
    • Bảng 1 "Mã thanh toán": Nested expandable table, group theo invoiceCode x userId. Cùng 1 mã thanh toán lặp N lần (1 dòng/NV). Expand ra bảng con chỉ có 1 dòng, thông tin gần giống dòng cha. Nested header lặp lại mỗi expand.
    • Bảng 2 "Thông tin hoa hồng": Matrix table NV x Dịch vụ với cột "Cấu hình / Thực nhận" — thuật ngữ mơ hồ.
  • Thuật ngữ "Hoa hồng" không đúng bản chất — đây là tiền tư vấn dịch vụ.
  • 100% Manager được hỏi không hiểu tab này -> bỏ qua không kiểm soát.

To-Be

  • Tab đổi tên thành "Tư vấn" với 3 section rõ ràng:
    • Summary Bar: Tổng quan đơn hàng (Phân bổ / Đã chi / Thu hồi / Đã nhận)
    • Summary Cards: Tổng quan per NV (Phân bổ / Đã nhận + trạng thái + expand dịch vụ)
    • Flat Transaction List: Lịch sử giao dịch (group by mã thanh toán, không nested)
  • Thuật ngữ mới nhất quán: Phân bổ, Đã nhận, Chi tư vấn, Thu hồi.
  • Tooltip giải thích cho mỗi thuật ngữ.

A3) Goals & Success Metrics

GoalMetricTarget
Manager hiểu tab trong < 5 giâyUser test: hỏi "NV A nhận bao nhiêu?"90% trả lời đúng trong 5 giây
Giảm câu hỏi hỗ trợ về tab nàySố lượng ticket/câu hỏi về HHGiảm 80% sau 1 tháng
Không làm mất tính năng hiện cóFeature parity check100% chức năng cũ vẫn hoạt động

A4) Personas

PersonaVai tròJTBDFrequency
Manager/AdminXem báo cáo, kiểm soát chi phí"Tôi muốn biết nhanh ai nhận bao nhiêu tư vấn, đã chi chưa"Hàng ngày
POS StaffNhập commission khi tạo đơn"Tôi muốn cấu hình tư vấn cho NV nhanh, không nhầm"Mỗi đơn hàng
CRM StaffXem commission đơn hàng CRM"Tôi muốn kiểm tra NV nhận đúng số tiền tư vấn"Hàng tuần

A5) Functional Requirements

FR-001: Summary Bar tổng quan đơn hàng (Ref: DEC-001, DEC-004)

Priority: Must | SCR: SCR-01

AC:

  • [ ] Hiển thị 4 chỉ số: Phân bổ | Đã chi | Thu hồi | Đã nhận với giá trị VND format X.XXXđ
  • [ ] Mỗi chỉ số có icon ? bên cạnh — hover hiện tooltip giải thích (xem B9 Tooltip Dictionary)
  • [ ] Khi Phân bổ > Đã chi → hiện dòng context: "(icon) {X}đ chờ thanh toán đợt tiếp theo"
  • [ ] Khi Phân bổ == Đã nhận và không có thu hồi → hiện "(icon) Đã chi đủ"
  • [ ] VD: Phân bổ = 40.000đ, Đã chi = 30.000đ, Thu hồi = 3.000đ → Đã nhận = 27.000đ + context "10.000đ chờ thanh toán đợt tiếp theo"

FR-002: Summary Cards per NV (Ref: DEC-001, DEC-002)

Priority: Must | SCR: SCR-01

AC:

  • [ ] Mỗi NV 1 card hiển thị: Avatar + Tên + Role + Phân bổ (VND) + Đã nhận (VND)
  • [ ] Trạng thái 1 dòng theo quy tắc:
    • Đã nhận == Phân bổ → "(icon) Đã chi đủ"
    • Đã nhận < Phân bổ, không thu hồi → "(icon) Còn {X}đ"
    • Có thu hồi → "(icon) Thu hồi {X}đ"
    • Đã nhận == 0 và có thu hồi → "(icon) Đã thu hồi hết"
  • [ ] "Phân bổ" và "Đã nhận" có icon ? với tooltip
  • [ ] Click "> Chi tiết" → expand breakdown theo dịch vụ: table DV | Phân bổ
  • [ ] Cards sort theo Phân bổ giảm dần
  • [ ] Scale: max 5 cards/hàng, wrap xuống hàng mới khi > 5 NV

FR-003: Click card filter bảng dưới (Ref: DEC-001)

Priority: Should | SCR: SCR-01

AC:

  • [ ] Click card NV → filter Lịch sử giao dịch chỉ hiện giao dịch của NV đó
  • [ ] Card được click có visual highlight (border/background khác)
  • [ ] Click lại card đang active → bỏ filter (toggle)
  • [ ] Filter là client-side (JavaScript filter trên data đã fetch)
  • [ ] Group headers bị ẩn nếu group đó không có giao dịch của NV được filter

FR-004a: Flat Transaction List — 1 lần TT, không thu hồi (Ref: DEC-001, DEC-003)

Priority: Must | SCR: SCR-02

AC:

  • [ ] Luôn hiện group header dạng divider: -- #MaTT . DD/MM/YYYY -- (icon) Đã chi . X.XXXđ --
  • [ ] 5 cột: # | Mã GD | Nhân viên | Số tiền | Thời gian
  • [ ] Không hiện cột "Hành động" và "Trạng thái" (tất cả là Chi tư vấn + Thành công)
  • [ ] Số tiền hiện +X.XXXđ màu xanh
  • [ ] Sort theo thời gian DESC (mới nhất trên)

FR-004b: Flat Transaction List — nhiều lần TT, không thu hồi (Ref: DEC-001, DEC-003)

Priority: Must | SCR: SCR-02

AC:

  • [ ] Hiện group header dạng divider (giống FR-004a)
  • [ ] Vẫn 5 cột như FR-004a
  • [ ] Group sort theo thời gian DESC (lần TT mới nhất trên)

FR-004c: Flat Transaction List — có thu hồi [PLANNED] (Ref: DEC-003, DEC-006)

Priority: Must | SCR: SCR-02

AC:

  • [ ] Group bị ảnh hưởng tách 2 sub-section: "Chi tư vấn" (subtotal) và "Thu hồi" (subtotal)
  • [ ] Sub-section "Chi tư vấn": các dòng +X.XXXđ màu xanh
  • [ ] Sub-section "Thu hồi": các dòng -X.XXXđ màu đỏ + sub-text "bởi: {Admin name}"
  • [ ] Group header trạng thái theo tỷ lệ thu hồi:
    • 0% → "(icon) Đã chi"
    • 1-99% → "(icon) Thu hồi {X}%" (X = Sum thu hồi / Sum chi tư vấn * 100, làm tròn)
    • 100% → "(icon) Đã hoàn tiền"
  • [ ] Group header số tiền = Sum chi - Sum thu hồi
  • [ ] [PLANNED] — UI sẵn sàng, backend thu hồi đang phát triển

FR-005: Search (Ref: DEC-003)

Priority: Should | SCR: SCR-02

AC:

  • [ ] Placeholder: "Tìm theo mã thanh toán, mã giao dịch, tên nhân viên..."
  • [ ] Debounce 300ms, nút clear
  • [ ] Client-side filter trên data đã fetch
  • [ ] Match: invoice.code (mã TT) HOẶC transaction_request.code (mã GD) HOẶC user.display_name (tên NV)

FR-006: Dropdown filter (Ref: DEC-003)

Priority: Should | SCR: SCR-02

AC:

  • [ ] Dropdown bên cạnh search: "Tất cả" | "Chi tư vấn" | "Thu hồi"
  • [ ] "Chi tư vấn" → filter behavior_id = 'transaction_commission'
  • [ ] "Thu hồi" → filter behavior_id = 'refund_commission'
  • [ ] Client-side filter

FR-007: Đổi thuật ngữ UI (Ref: DEC-004, DEC-008)

Priority: Must | SCR: All

AC:

  • [ ] Tab label: "Hoa hồng" → "Tư vấn" (i18n vi.ts + 2 hardcode files)
  • [ ] Section title: "THÔNG TIN HOA HỒNG" → "PHÂN BỔ TƯ VẤN"
  • [ ] Nút: "Thêm người nhận HH" / "Cấu hình hoa hồng" → "Cấu hình tư vấn"
  • [ ] Message: "người nhận hoa hồng" → "người tư vấn"
  • [ ] Report label: "Báo cáo hoa hồng" → "Báo cáo tư vấn" (report/i18n/vi.ts)
  • [ ] Route URL path giữ nguyên (không breaking change)
  • [ ] Backend constants, DB columns, GraphQL fields: KHÔNG ĐỔI

FR-008: Nút "Cấu hình tư vấn" (Ref: DEC-004)

Priority: Must | SCR: SCR-01

AC:

  • [ ] Giữ vị trí hiện tại (bên cạnh section title)
  • [ ] Đổi label theo FR-007
  • [ ] Logic permission giữ nguyên: canEditCommission (IT/HR unlimited, POS time-limited, CRM role+time)
  • [ ] Click → mở dialog cấu hình như hiện tại (ServiceOrderCommissionCreate / CosmeticOrderCommissionCreate / PrepaidOrderCommissionCreate)

FR-009: Empty state (Ref: DEC-005)

Priority: Must | SCR: SCR-01, SCR-02

AC:

  • [ ] Khi chưa có invoice (đơn mới tạo):
    • Summary Bar: Phân bổ = {X}đ (từ order_commission), Đã 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: hiện "Chưa có giao dịch"
  • [ ] Khi chưa cấu hình commission (order_commission rỗng):
    • Summary Bar: tất cả = 0đ
    • Summary Cards: không hiện card nào
    • Transaction List: "Chưa có giao dịch"
    • Hiện nút "Cấu hình tư vấn" nổi bật

FR-010: Loading state (Ref: DEC-003)

Priority: Should | SCR: SCR-01, SCR-02

AC:

  • [ ] Summary Bar + Cards: skeleton loading (placeholder animated)
  • [ ] Transaction List: spinner (giữ nguyên pattern hiện tại)
  • [ ] Loading độc lập: cards có thể load xong trước bảng

FR-011: Sort order (Ref: DEC-003)

Priority: Must | SCR: SCR-01, SCR-02

AC:

  • [ ] Summary Cards: sort theo Phân bổ DESC (NV được phân bổ nhiều nhất lên trước)
  • [ ] Transaction List: groups sort theo thời gian DESC, trong mỗi group transactions sort theo thời gian DESC

FR-012: Format tiền (Ref: DEC-004)

Priority: Must | SCR: All

AC:

  • [ ] Summary Bar, Cards: X.XXXđ (không dấu +/-)
  • [ ] Transaction List — Chi tư vấn: +X.XXXđ màu xanh (positive)
  • [ ] Transaction List — Thu hồi: -X.XXXđ màu đỏ (negative)
  • [ ] Group header, Sub-section total: X.XXXđ (không dấu +/-)
  • [ ] Dấu phân cách hàng nghìn: dấu chấm (VD: 10.000đ, 1.500.000đ)

FR-013: Tooltip giải thích thuật ngữ (Ref: DEC-004)

Priority: Must | SCR: SCR-01, SCR-02

AC:

  • [ ] Icon ? (hoặc icon info) bên cạnh các thuật ngữ: Phân bổ, Đã chi, Thu hồi, Đã nhận, Chi tư vấn
  • [ ] Hover icon → hiện tooltip với nội dung theo B9 Tooltip Dictionary
  • [ ] Tooltip đóng khi di chuột ra ngoài
  • [ ] Style nhất quán với tooltip pattern hiện có trong hệ thống (nếu có)

A6) Assumptions

IDAssumptionOwner xác nhận
ASM-001Permission logic (canEditCommission) giữ nguyên, không thay đổiTech Lead
ASM-002GraphQL queries hiện có (ServiceOrderDetail + TransactionsOfOrder) đủ data, không cần API mớiTech Lead
ASM-0033 loại đơn hàng (service/cosmetic/prepaid) dùng chung UI redesign, chỉ khác commission formPO
ASM-004Backend thu hồi (nhập số tiền cụ thể) sẽ có API tương thích với UI đã thiết kếTech Lead

A7) Risks

IDRiskImpactProbabilityMitigation
RSK-001Backend thu hồi chưa sẵn sàng khi FE deployTrung bìnhCaoĐánh dấu [PLANNED], UI sẵn sàng nhưng data thu hồi = 0 cho đến khi BE xong
RSK-002GraphQL query hiện có thiếu field cần thiếtTrung bìnhThấpPhase 3 discovery đã confirm 2 query đủ data. Fallback: thêm computed field trong Hasura
RSK-003User quen thuật ngữ cũ "hoa hồng", không hiểu "tư vấn"ThấpTrung bìnhTooltip giải thích (FR-013), thông báo nội bộ trước khi deploy

A8) Metrics (Post-launch)

MetricCách đoTargetKhi nào đo
User comprehensionUser test: hỏi Manager xem tab, trả lời 3 câu hỏi90% đúngT+7 ngày
Support ticketsĐếm ticket liên quan "hoa hồng" / "tư vấn"Giảm 80%T+30 ngày
Tab usageAnalytics: số lần vào tab Tư vấnTăng 20%T+30 ngày

A9) Glossary

Thuật ngữ (VI)Thuật ngữ (EN)Định nghĩaPhân biệt với
Tư vấnAdvisory feeKhoản tiền NV nhận được từ việc tư vấn dịch vụ cho khách!= Hoa hồng (commission % — thuật ngữ cũ)
Phân bổAllocationSố tiền tư vấn được gán cho NV từ đơn hàng (từ order_commission)!= Đã nhận (chưa chắc đã chi)
Đã chiDisbursedTổng tiền đã chuyển vào wallet NV (từ invoice_commission với status completed)!= Phân bổ (phân bổ là cấu hình, đã chi là thực tế)
Đã nhậnReceived (net)Số tiền NV thực tế giữ = Đã chi - Thu hồi!= Đã chi (có thể bị thu hồi 1 phần)
Thu hồiRevoke / ClawbackRút lại tiền tư vấn đã chi (do hoàn đơn, sửa sai)!= Đã chi
Chi tư vấnDisburse advisoryHành động chuyển tiền tư vấn vào wallet NV (behavior_id = transaction_commission)!= Thu hồi
Cấu hình tư vấnConfigure advisoryGán số tiền / % tư vấn cho NV trên 1 đơn hàng!= Phân bổ (cấu hình là hành động, phân bổ là kết quả)

Non-goals

  • Không đổi DB schema (table names, column names, GraphQL field names)
  • Không đổi backend commission calculation logic
  • Không redesign customer commission (affiliate/referral)
  • Không đổi commission setting (role_commission master data)
  • Không đổi commission report module (chỉ đổi label i18n)
  • Không đổi notification template (tách task riêng — DEC-007)

A10) Business Formulas

FORMULA-001: Phân bổ (Allocation)

  • Mô tả: Tổng số tiền tư vấn được gán cho 1 NV trên 1 đơn hàng
  • Công thức: phan_bo = SUM(order_commission.amount) WHERE user_id = {NV} AND order_id = {đơn}
  • Biến số:
    • order_commission.amount: số tiền cấu hình (VND hoặc %) — nguồn: ecommerce.order_commission.amount
    • order_commission.unit: đơn vị — commission_percent hoặc commission_vnd
  • Đơn vị: VND
  • Ví dụ: NV A được cấu hình 10.000đ cho DV "BTX thiết kế" → Phân bổ = 10.000đ
  • Edge cases:
    • Chưa cấu hình commission → Phân bổ = 0
    • Unit = percent: hiển thị "10%" trong card chi tiết, nhưng Phân bổ tổng = SUM VND tương đương

FORMULA-002: Đã chi (Disbursed)

  • Mô tả: Tổng tiền tư vấn đã chuyển vào wallet NV từ đơn hàng này
  • Công thức: da_chi = SUM(invoice_commission.amount) WHERE user_id = {NV} AND order_id = {đơn} AND invoice_status = 'invoice_completed'
  • Biến số:
    • invoice_commission.amount: số tiền commission đã tính (luôn VND) — nguồn: ecommerce.invoice_commission.amount
    • invoice_commission.invoice_status: trạng thái invoice — nguồn: ecommerce.invoice_commission.invoice_status
  • Đơn vị: VND
  • Ví dụ: Đơn hàng có 2 lần thanh toán. Lần 1: 100.000đ x 10% = 10.000đ (completed). Lần 2: 50.000đ x 10% = 5.000đ (completed) → Đã chi = 15.000đ
  • Edge cases:
    • Invoice chưa completed → không tính vào Đã chi
    • Đơn mới tạo chưa có invoice → Đã chi = 0

FORMULA-003: Thu hồi (Revoked) [PLANNED]

  • Mô tả: Tổng tiền tư vấn bị rút lại do hoàn đơn
  • Công thức: thu_hoi = SUM(transaction_request.amount) WHERE behavior_id = 'refund_commission' AND order_id = {đơn} AND user_id = {NV}
  • Biến số:
    • transaction_request.amount: số tiền thu hồi — nguồn: wallet.transaction_request.amount
    • transaction_request.behavior_id: loại giao dịch — filter = refund_commission
  • Đơn vị: VND
  • Ví dụ: NV A đã nhận 15.000đ, hoàn 1 lần TT → thu hồi 5.000đ
  • Edge cases:
    • Chưa có hoàn tiền → Thu hồi = 0
    • [PLANNED] Khi duyệt hoàn tiền, nhập số tiền cụ thể. Nếu không nhập → không trừ

FORMULA-004: Đã nhận (Net Received)

  • Mô tả: Số tiền NV thực tế giữ sau khi trừ thu hồi
  • Công thức: da_nhan = da_chi - thu_hoi
  • Biến số:
    • da_chi: FORMULA-002
    • thu_hoi: FORMULA-003
  • Đơn vị: VND
  • Ví dụ: Đã chi = 15.000đ, Thu hồi = 5.000đ → Đã nhận = 10.000đ
  • Edge cases:
    • Thu hồi > Đã chi → Đã nhận = số âm (hiện màu đỏ, trường hợp bất thường)
    • Chưa có thu hồi → Đã nhận = Đã chi

FORMULA-005: Tỷ lệ thu hồi group (Group Revoke Ratio)

  • Mô tả: Tỷ lệ thu hồi trong 1 lần thanh toán (group)
  • Công thức: ratio = (SUM_thu_hoi_group / SUM_chi_tv_group) * 100
  • Biến số:
    • SUM_thu_hoi_group: tổng thu hồi trong group (cùng invoice_id)
    • SUM_chi_tv_group: tổng chi tư vấn trong group (cùng invoice_id)
  • Đơn vị: % (làm tròn số nguyên)
  • Ví dụ: Chi tư vấn group = 10.000đ, Thu hồi = 3.000đ → 30%
  • Edge cases:
    • SUM_chi_tv_group = 0 → không hiện tỷ lệ (hiện "–")
    • ratio = 100% → hiện "(icon) Đã hoàn tiền"

RACI

DeliverablePOTLFE DevBE DevQA
PRD (file này)ACIII
UI SpecCIRII
Dev SpecIACRI
QA Test PlanCIIIR