Appearance
Prepaid Card Analytics Tab
Tab báo cáo phân tích thẻ trả trước mới, thay thế tab cũ (
/r/reports/prepaid-card-report), phục vụ 3 nhóm: Kế toán, Marketing, Quản lý — trên quy mô 70 chi nhánh.
Thông tin chung
| Thuộc tính | Giá trị |
|---|---|
| Module | Report — Prepaid Card |
| Phiên bản | v1.0 |
| Ngày tạo | 2026-03-13 |
| Complexity | Large |
| Feature flag | FEATURE_PREPAID_ANALYTICS_V2 |
Tài liệu
| File | Nội dung | Audience |
|---|---|---|
| PRD | Bối cảnh, mục tiêu, US/AC, Schema Mapping, RBAC v2, Risks, Phase split | PO, Tech Lead |
| Dev Spec | Kiến trúc, Section 0 Schema Mapping, SQL (3 MVs P1), component tree, API, performance | Dev |
| UI Spec | Layout, wireframes, filter bar, states, interactions, tooltips | Designer, FE Dev |
| Plan | Implementation plan chi tiết — phase tag per task, deferred MVs marked SKIP | Dev |
| QA Test Plan | Coverage matrix, US→TC mapping, seed data, exit criteria | QA Lead |
| Go-Live Checklist | Pre-deploy, Day-0, Day-1, rollback runbook | DevOps, Tech Lead, PO |
| Handoff | RACI, contact list, timeline, escalation, DoD | All team |
| Decision Brief | Architecture/business/calculation decisions + lý do | All team onboarding |
Tính năng chính
Phase 1 (MVP — 4 sub-tabs):
- 4 sub-tabs: Tổng quan · Giao dịch · Khách hàng · Tài chính
- Shared filter (3 element): Chọn chi nhánh · Khoảng thời gian (gộp presets) · Tìm kiếm trong sub-tab
- KPI Dashboard: 8 KPI cards tài chính + vận hành với so sánh kỳ trước
- Alert System: 3 mức cảnh báo (Khẩn cấp / Cảnh báo / Theo dõi)
- Phân khúc KH tự động: KH Hoạt động / Ngủ đông / Rủi ro mất / Mới
- Chỉ số hành vi KH: 3 chỉ số (Giá trị đơn TB / AOV · Tỷ lệ tái nạp · Chu kỳ trung bình)
- Export Excel server-side: 5 loại báo cáo, xử lý 50K+ dòng
Phase 2 (sau MVP):
- Global Search: Tìm kiếm xuyên sub-tab (
pg_trgm)
Phase 3+ (TBD):
- Sub-tab Marketing: Chiến dịch · Affiliate · Nguồn KH · So sánh kênh
- Sub-tab Nhân viên: Xếp hạng · Chi tiết NV · So sánh CN
Lịch sử thay đổi
| Version | Ngày | Thay đổi | File | Ảnh hưởng |
|---|---|---|---|---|
| v3.16 | 2026-05-16 | ROI thresholds canonical (FORMULA-020): Thêm canonical FORMULA-020 trong PRD A10 định nghĩa 3 ngưỡng đầy đủ cho cột "Trạng thái" bảng Chiến dịch + ROI KPI card: 🟢 Hiệu quả > 200% / 🟡 Trung bình 100% ≤ ROI ≤ 200% / 🔴 Kém < 100%. Edge case marketing_cost = 0 → hiển thị "—" + tag "Chưa có budget" (KHÔNG gán Kém). Trước đó chỉ định nghĩa nửa vời > 200% (Hiệu quả), bỏ trống cutoff Trung bình/Kém → ambiguous. Đồng bộ tooltip ROI (dev-spec §16.4), column "Trạng thái" (dev-spec §16.12), tab Chiến dịch status line (dev-spec §7.2), ROI card highlight (ui-spec §7.1). Phase 3+ deferred (theo DEC-B05) — Marketing sub-tab chưa implement Phase 1 | PRD A10 FORMULA-020, dev-spec §7.2/§16.4/§16.12, ui-spec §7.1 | FE, BE, QA, UI/UX |
| v3.15 | 2026-05-14 | DEC-T09 + wallet balance split: (1) FORMULA-013 Chu kỳ trung bình = Customer-weighted mean (Option 2), không phải interval-weighted; scope cycle-closes-in-period, cap khoảng > 180 ngày, dev-spec thêm CTE per_customer_cycle, fields avg_cycle_days, cycle_count, last_cycle_closing_at, aggregate query canonical, QA thêm TC-CT-CYCLE-01..05. (2) Sub-tab Khách hàng tách cột Dư ví thành Dư ví DIVA + Dư ví KM, bảng KH 12 → 13 cột; risk highlight theo Dư ví DIVA + Dư ví KM > 5tr. (3) V5 blocker expanded: BE phải confirm source exact cho 2 field balance split trong wallet_balance_result/wallet_balance và reconcile với total balance. Defer (Phase 3+): đổi MEAN → MEDIAN (PERCENTILE_CONT(0.5)) nếu reconciliation phát hiện skew lớn | PRD A10 FORMULA-013, Z3 DEC-T09, Dev Spec §9.2, QA D4 TC-CT-CYCLE, UI Spec §5.5, handoff, plan, index | BE, FE, QA |
| v3.14 | 2026-05-12 | 3 finding nghiệp vụ + UX: (A) DEC-T07 — Bỏ tab "Lịch sử sử dụng" khỏi expanded row đơn nạp. Wallet là pool chung per-customer, không attribute được usage per-card. (B) DEC-T08 — Commission source rewrite: Codebase chỉ có 1 status thực tế (invoice_commission.invoice_status='invoice_completed'). Source đúng = invoice_commission (ecommerce). Refund = transaction_request behavior_id='refund_commission' amount âm. Tab Hoa hồng bỏ cột Trạng thái. (C) DEC-U13 — Alert Box rich context: UI cũ chỉ có nút [Xem] generic + 1 dòng metric → user fail context. Redesign 4 lớp (SLA label / metric+trend / suggested action / primary verb-button), hover tooltip preview, banner top mandatory sau navigate, sort override per alert, summary highlight nhóm tương ứng. Backend compute_prepaid_alerts mở rộng payload 5 field mới. Action consolidated: (1) PRD Z3 thêm DEC-T07 + T08, Z2 thêm DEC-U13. (2) PRD US-1.2 alert AC rewritten 4 lớp + click behavior. (3) PRD US-2.2 + FORMULA-008. (4) UI-spec §3.3 Alert Box redesign rich context. (5) UI-spec §6.4 Công nợ thêm landing-from-alert state. (6) UI-spec §10.1.3 thêm 3 cột (primary action label / sort override / banner top template). (7) Dev-spec §3.3 alert payload schema TypeScript + i18n keys + label templates. (8) Dev-spec §4.3 + §6 + §9 + §10 + §16.x commission source. (9) Plan Task 12 expanded row. Defer Phase 3+: FIFO lot accounting, bulk action secondary | prd, ui-spec, dev-spec, plan, index | FE, BE, QA, UI/UX |
| v1.0 | 2026-03-13 | Tạo mới toàn bộ tài liệu | Tất cả | All |
| v1.1 | 2026-05-04 | Chuẩn hóa terminology (A9 Glossary), chuẩn label cột/KPI, tooltip 3 phần | prd, ui-spec, dev-spec | All |
| v1.2 | 2026-05-04 | Bỏ Compare Mode toggle (DEC-U04), gộp date presets vào dropdown (DEC-U05) — filter bar còn 3 element | prd, ui-spec, dev-spec | All |
| v1.3 | 2026-05-04 | Phase split mới: Phase 1 = 4 sub-tab (TQ+GD+KH+TC); Marketing+NV defer Phase 3+ TBD; Global Search defer Phase 2; rename "DT&Công nợ"→"Tài chính", "Marketing&CD"→"Marketing" (DEC-B05, DEC-U06, DEC-U07) | prd, ui-spec, dev-spec, index | All |
| v1.4 | 2026-05-04 | Sub-tab Giao dịch: 7 sum cards (+ Ví Diva + Ví KM), bảng 10 cột (gộp Loại+Tên thẻ với badge inline), 3 cột multi-line. Khách hàng: đổi CLV Bar (4 metrics) → Chỉ số hành vi KH (3 metrics AOV-based) | ui-spec, dev-spec, prd, plan | Sub-tab GD + KH |
| v2.0 | 2026-05-04 | Post 3-round review: Schema field corrections (Section 0 Schema Mapping) — prepaid_value_into_wallet, product_id JOIN prepaid_card_view, order.total, dùng region_branch existing thay vì tạo branch_region. Plan defer thực sự 3 MVs P3+ (skip steps). Fix segment CASE order (new đầu). Fix Finance MV double count. Bỏ dependency Overview→Staff. Search local 3-element trong Transactions. Disable nav đến deferred sub-tabs. RBAC v2 module-level. Tạo 3 file governance: qa-test-plan, go-live-checklist, handoff | All files | Foundation |
| v3.0 | 2026-05-04 | Post review L4 — calculation correctness fixes: (1) Bỏ × quantity cho prepaid_value_into_wallet (đã là line total — phóng đại N lần khi quantity > 1) ở mọi formula/SQL. (2) Tách MV summary_daily → 2 MVs: mv_prepaid_order_daily (order-level KPIs) + mv_prepaid_card_daily (card-level chart) để fix double-count total_collected. (3) Đổi customer table → 🔍 verify (codebase dùng ecommerce_user/default account). (4) PRD A10 FORMULA-001..018 single source. (5) Defer write actions Phase 1.x (Bulk SMS/ZNS/Gán NV/Xác nhận TT cần API+audit+RBAC). (6) RBAC fine-grained: thêm action export + view_full_phone (PII compliance). (7) Sweep router-view → QTabPanels (DEC-T06). (8) Alert function: filter balance > 0 + đổi wallet_balance → wallet_balance_result. (9) Tạo 3 file governance Mode B: SOURCE_OF_TRUTH, decision-brief, EVIDENCE_PACK | All files | Foundation + Sub-tab GD/KH |
| v3.1 | 2026-05-04 | Post review L5 — propagation fixes + UX simplification: (1) Customer SQL FROM customer c → FROM ecommerce_user eu (đặt placeholder filter). (2) RBAC consistency sweep — đồng bộ 3 actions fine-grained ở SOURCE_OF_TRUTH/decision-brief/dev-spec với prd. (3) Plan Task 4: skip search_prepaid_global (defer P2). (4) Hasura metadata: track 4 MVs P1 (order_daily + card_daily). (5) FinanceKpiCards: query KM đã nạp từ order_daily. (6) Go-live: 4 MVs topology v3. (7) FE plan: bỏ ROUTE_..._MARKETING/STAFF, bỏ CompareMode. (8) DEC-U08: Bỏ toggle Ngày/Tuần/Tháng. (9) DEC-U09: Sub-tab KH pure read-only. (10) DEC-U10: Hợp nhất 1 permission export + label tiếng Việt | All files | Foundation + UX |
| v3.2 | 2026-05-04 | Post review L6 — HOLD gate + final propagation: (1) SOT gate: TẤT CẢ V1-V7 đều BLOCKER (không phân biệt P0/P1) — implementation HOLD đến khi cả 7 confirmed. (2) V1 fix: Bỏ hardcode account_type = 'customer' (codebase chưa có evidence) — dùng INNER JOIN với prepaid orders + comment placeholder; QA seed cũng bỏ account_type. (3) Plan Task 6 Hasura: track 4 MVs P1 + 1 function compute_prepaid_alerts only (KHÔNG track search_prepaid_global / staff_stats / campaign_stats). (4) Handoff v3.1: update 4 MVs · 7 V points · 3 RBAC actions · HOLD policy. (5) QA scope: đồng bộ v3 — bỏ bulk SMS/ZNS/multi-select khỏi P0; thêm out-of-scope list rõ ràng. (6) Go-live E2.5: RBAC v2 fine-grained 3 actions seed verification + BE enforce check. (7) G4 gate: wording 3 actions thay vì module-level. (8) Plan store: bỏ CompareMode type/import/getters. (9) Dev-spec 2.5: đổi hasModulePermission → hasActionPermission (V6 BLOCKER); đổi customer.view_full_phone → report.prepaid_analytics.view_full_phone. (10) UI 6.4 Công nợ: [TT] write action → [Xem] navigate read-only. (11) Query path: KM đã nạp từ order_daily (cùng MV) thay vì cross-MV summary/finance | All files | Foundation + Governance |
| v3.3 | 2026-05-04 | Post review L7 — invoice canonical + DT ghi nhận accounting + Tổng quan UX cleanup: (1) DEC-B06 + FORMULA-005: DT ghi nhận chỉ tính ví chính (payment_method='wallet'), KHÔNG tính ví KM (lý do business: ví KM = chi phí marketing, không phải DT thực thu; tránh trừ trùng với LN gộp). (2) FORMULA-005b mới: "KM đã sử dụng" = tách metric phụ cho ví KM. (3) MV order_daily SQL: wallet_used filter payment_method='wallet', wallet_promo_used filter payment_method='wallet_promotion'. (4) MV customer_stats: thêm 2 fields total_used_main + total_used_promo tách 2 ví. (5) Section 0.2 Rule 0: invoice canonical parent_id IS NULL áp dụng cho mọi MV/SQL. (6) V8 BLOCKER mới: BE confirm field parent_id schema. (7) Section "Dòng chảy KH" xóa hoàn toàn (đã từ v3.0 — confirm L7). (8) DEC-U11 Tổng quan UX: thêm [🔄 Tải lại], KHÔNG có button tải xuống tổng, KHÔNG có banner auto-insight (defer P3+), giữ Tổng dư ví 1 metric, format VND nhất quán, trend dynamic theo filter. (9) Tab Công nợ: chỉ 1 nút [📞 Gọi] (write actions out-of-scope P1) | All files | Calculation + Governance + UX |
| v3.4 | 2026-05-04 | Post review L8 — REVERT formulas pending codebase evidence: Spec đang derive Ví Diva/Ví KM/DT/KM-used theo giả định KHÔNG khớp codebase. Phải REVERT về PROVISIONAL chờ BE evidence: (1) FORMULA-003 Ví Diva PROVISIONAL — codebase tính divaWallet = quantity × prepaid_card_base_value rồi gửi parent_invoice.reference_amount, KHÔNG phải total_collected (sai khi giá bán ≠ base). (2) FORMULA-004 Ví KM PROVISIONAL — phải lấy từ parent_invoice.wallet_promotion_amount, KHÔNG derive từ trừ. (3) FORMULA-005 DT PROVISIONAL — DEC-B06 (chỉ ví chính) TẠM HOÃN khóa vì conflict với report cũ split wallet/wallet_promotion thành 2 bucket; PO + Kế toán phải reconcile. (4) FORMULA-005b KM đã sử dụng PROVISIONAL — wallet_promotion_amount thực ra lưu KM lúc bán thẻ, KHÔNG phải KM đã dùng → BE clarify field đúng. (5) FORMULA-014 % Đã dùng ví: bỏ cộng wallet_promotion_amount (avoid double count), chỉ dùng reference_amount. (6) 5 V points mới (V9-V13): Ví Diva top-up rule · Ví KM top-up · DT semantics reconcile với report cũ · Wallet usage field rule · Invoice status filter (status = 'invoice_completed' OR status IS NULL) per codebase pattern. (7) HOLD gate: TẤT CẢ V1-V13 đều BLOCKER (8 → 13). (8) DEC-B06 status: PROVISIONAL — chờ V11 reconcile | prd, dev-spec, SOT, index | Calculation correctness + Governance |
| v3.5 | 2026-05-04 | Add FORMULA-019 Period Comparison — dev hỏi cách tính "kỳ trước" cho trend ↑↓%. Lock rule canonical: (1) Sliding N ngày cho rolling preset (today/yesterday/7d/30d/custom). (2) Cùng độ dài, calendar trước cho this_month/this_quarter partial (vd 1-15/4 vs 1-15/3, KHÔNG full tháng 3). (3) Full calendar trước cho last_month/last_quarter (đã đóng). (4) Edge cases: previous = 0 → display "—"; timezone Asia/Ho_Chi_Minh; inclusive endpoints. (5) Composable usePrepaidAnalyticsFilter expose previousPeriod + trendLabel computed (pseudo-code trong plan.md). (6) DEC-U08 ref FORMULA-019 | PRD · UI Spec · Plan | FE + BE |
| v3.13 | 2026-05-04 | Wave 21 — Review L15 sweep (2 implementability gap): Click Action Matrix v3.12 đã đủ structure nhưng 2 row có target chưa tồn tại Phase 1: (1) Top thẻ [Xem thêm] — tab=transactions&group=card chưa có surface (Giao dịch group theo đơn, Tài chính → Tổng hợp DT group theo ngày không có cột Tên thẻ). FIX: disable Phase 1 + tooltip "Xem đầy đủ Top thẻ ra mắt Phase 1.x" theo Section 10.1.7 unified disabled rule. Phase 1.x roadmap: thêm route ?tab=transactions&view=top-cards full table card-level. (2) Alert "Thẻ giảm bán" filter card=<id> — Local Filter Sub-tab Giao dịch chỉ có Loại thẻ + Trạng thái TT (DEC-U12 2-element), không có card filter. FIX: dùng shared q={prepaid_card.code} (DEC-U12 — scope shared search đã include prepaid_card.code per §4.2). Plan Task 4 thêm spec alert payload schema: compute_prepaid_alerts PHẢI return prepaid_card.code (string) cho alert "Thẻ giảm bán" — KHÔNG return UUID. Sửa Section 3.4 Mini Rankings note + Section 4.4 column note để phản ánh disable Top thẻ Phase 1 | ui-spec, plan, index | FE, BE, QA |
| v3.12 | 2026-05-04 | Wave 20 — Review L14 sweep (Click Action Matrix canonical): 4 navigation/click contract gap đều là FE/QA blocker (dead click, không có oracle test). Build Section 10.1 Click Action Matrix mới — 7 sub-section với 5 cột canonical (source · target route · filter params payload · disabled rule · empty/error state): (1) 10.1.1 KPI Cards 8/8 (bù 4 thiếu: DT ghi nhận ⏳V11 · Tổng dư ví ⏳V5 · Công nợ · Tỷ lệ KH tái nạp). (2) 10.1.2 Mini Rankings 3/3 — đặc biệt "Top NV giỏi" navigate Tài chính → Hoa hồng (KHÔNG sub-tab Nhân viên defer P3+). (3) 10.1.3 Alert List 5/5 (bù 3 thiếu: Doanh thu giảm · KH VIP không hoạt động · Thẻ giảm bán + override date range rule cho lũy kế). (4) 10.1.4 Sub-tab Giao dịch cell click (Mã đơn / KH / NV disabled). (5) 10.1.5 Sub-tab Khách hàng cell click (KH / SĐT mask copy). (6) 10.1.6 Sub-tab Tài chính cell click (Mã đơn / Gọi / expand). (7) 10.1.7 Disabled controls unified rule — visual + tooltip + aria + KHÔNG render <a href> ngay cả khi href="". Sửa cột Nhân viên L535 (text plain, KHÔNG link) + Mini Rankings L418 ref Click Action Matrix | ui-spec, index | FE, QA, UX |
| v3.11 | 2026-05-04 | Wave 19 — Review L13 sweep (3 user-facing/executable gap cuối): (1) PRD A9 Glossary "KM đã nạp" REVERTED Nạp ví − Tiền thu → parent_invoice.wallet_promotion_amount (V10 — FORMULA-004 alias) + ví dụ discount minh họa. A9 là bảng "bắt buộc hiểu trước khi implement" → drift ở đây ảnh hưởng dev/QA. (2) dev-spec L621 Công thức dòng tiền sample REVERTED Nạp ví (920tr) − Tiền thu vào (850tr) = 70tr → canonical SUM(parent_invoice.wallet_promotion_amount) + ví dụ discount + ⏳ V10 marker. Note rõ giá trị 70tr là INPUT đã verify từ V10. (3) plan.md Task 13 Step 1 FinanceKpiCards REVERTED critical formula SUM(total_wallet_topup) − SUM(total_collected) → canonical SQL + 🔒 PROVISIONAL DO-NOT-IMPLEMENT block cho 2 card "KM đã nạp" + "Lợi nhuận gộp" đến khi V10 unlock. Source mapped vào mv_prepaid_order_daily.total_vi_km_napped alias TBD | prd, dev-spec, plan, index | All |
| v3.10 | 2026-05-04 | Wave 18 — Review L12 sweep (2 cascade gap cuối cùng + assumption): (1) dev-spec §16.7 Customer table cột "Đã dùng ví" REVERTED SUM(reference_amount + wallet_promotion_amount) → SUM(invoice.reference_amount) FILTER (payment_method_id IN ('wallet','wallet_promotion')) (V11+V12). Cột "% Đã dùng ví" cập nhật numerator dùng reference_amount filter. (2) dev-spec §16.8 Revenue table cột "KM đã nạp" REVERTED total_wallet_topup − total_collected → SUM(parent_invoice.wallet_promotion_amount) (V10 — FORMULA-004 alias). Cột "Hoa hồng" REVERTED dùng transaction_request_user.amount (KHÔNG aggregate từ mv_prepaid_staff_stats — MV này defer P3+). Cột "Lợi nhuận gộp" depends V10. (3) Assumption fix L1822 — clarify invoice.reference_amount + wallet_promotion_amount semantics rõ ràng (NẠP vs ĐÃ DÙNG, V-ref markers, enum đầy đủ payment_method_id, parent_id Rule 0, status Rule 0a) | dev-spec, index | All |
| v3.9 | 2026-05-04 | Wave 17 — Review L11 sweep (2 cascade gap còn lại): (1) dev-spec §16.3 Tooltip KPI Sub-tab Tài chính sweep — sửa "KM đã sử dụng" REVERTED wallet_promotion_amount → reference_amount filter payment_method_id='wallet_promotion' (V12), "KM đã nạp" REVERTED Nạp ví − Tiền thu vào → SUM(parent_invoice.wallet_promotion_amount) (V10 — FORMULA-004 alias). Bổ sung warning forbidden derivation inline trong tooltip "Nạp ví" + ví dụ discount cho "KM đã nạp". Tất cả tooltip có V-ref ⏳ markers + Rule 0a status filter. (2) SOURCE_OF_TRUTH §4 HOLD policy — "7 V points" → "13 V points", "8 V points" → "13 V points (V1-V13)". Thêm V9-V13 critical path note + sign-off matrix per V (BE/Security/DBA/PO/Kế toán) + bump version protocol khi unlock (v3.x → v4.0 semantic break) | dev-spec, SOURCE_OF_TRUTH, index | All |
| v3.8 | 2026-05-04 | Wave 16 — Review L10 sweep (5 cascade gap + lint): (1) dev-spec §9 LATERAL invoice aggregate — wallet_promo_used REVERTED wallet_promotion_amount → reference_amount filter payment_method_id='wallet_promotion' (V12). Thêm Rule 0a status filter (status='invoice_completed' OR status IS NULL) cho 3 SUM (V13). Thêm cảnh báo PROVISIONAL inline. (2) dev-spec §16.1 Tooltip dictionary sweep — sửa "DT ghi nhận" (bỏ + wallet_promotion_amount), "KM đã nạp" (REVERTED topup−collected → SUM(parent_invoice.wallet_promotion_amount)), "KM đã sử dụng" (REVERTED wallet_promotion_amount → reference_amount filter). Thêm "Ví Diva nạp" + "Ví KM nạp" hàng riêng + V-ref ⏳ markers. (3) handoff F2 RACI — "7 V points" → "13 V points" + V9-V13 wallet semantics critical path. (4) handoff F3 timeline W1 — "5 🔍 points" → "13 V points" + 5 spike F4.3 + scaffold note (KHÔNG enable PROVISIONAL block). (5) plan.md Task 23 E2E walkthrough — sweep 7 sub-tab cũ (Marketing/Staff/Compare Mode/Global search) → 4 sub-tab P1 + thêm OUT OF SCOPE list rõ + Empty State v2 + FORMULA-019 trend test. (6) Lint: sửa 14 heading English-only trong qa-test-plan + go-live-checklist (D1/D3/D5/D6/E1-E6) sang VN/song ngữ. (7) B-QUALITY mới — 23-criteria compliance check, 21/23 ✅ + 2 ⚠️ parked với reason, sign-off matrix spec-level | dev-spec, handoff, plan, qa, go-live, ui-spec, index | All |
| v3.7 | 2026-05-04 | Wave 15 — Review L9 sweep (6 finding): (1) PRD FORMULA-009 km_da_nap → PROVISIONAL V10 + đánh dấu công thức cũ topup − collected SAI khi discount/base≠sell, ref canonical SUM(parent_invoice.wallet_promotion_amount). (2) PRD FORMULA-010 Lợi nhuận gộp PROVISIONAL depends V10. (3) dev-spec §6 KPI table (L605-606) — sửa "KM đã sử dụng" + "KM đã nạp" REVERTED dùng đúng field theo PRD A10.0 (V10/V12), thêm cột V-ref + cảnh báo BE. (4) PRD L263 + dev-spec §4.1 + qa TC-TX-04 — single search drift: 3 element → 2 element + DEC-U12, sweep all residual local search references (decision-brief P1, prd risk table, plan tree comment, ui-spec). (5) handoff stale numbers fix: "5 verify points" → "13", "3 MVs" → "4 MVs P1 + 1 function", bulk actions defer note (DEC-U09). (6) plan.md L48 architecture fix: "lazy-loaded child route" → "QTabPanels (DEC-T06)", "6 MVs + 2 functions" → "4 MVs P1 + 1 function". (7) ui-spec M/L compliance: thêm B-PRE Discovery & Pattern Reuse + B0.4 Field × Surface Matrix + B0.5 State × Screen Matrix + B-POST Verification — pass M/L gate. (8) _consistency-matrix.md mới (internal — không sync) — cross-doc index DEC × FORMULA × V-point × Surface, drift detection protocol | prd, dev-spec, ui-spec, plan, qa, handoff, decision-brief, _consistency-matrix | All |
| v3.6 | 2026-05-04 | Wave 14 — Cascade fix V9-V13 + DEC-U12 single search source + Empty State v2: Post review (Tech Lead + PO + Vận hành) phát hiện cascade chưa sạch: V9-V13 BLOCKER mới khóa ở PRD A10 + SOT nhưng dev-spec/plan/QA/handoff/evidence vẫn để công thức cũ ở phần executable. Sweep toàn bộ: (1) PRD A10.0 Canonical Wallet Table mới — bảng 5 hàng (Tiền thu / Ví Diva nạp / Ví KM nạp / Ví Diva dùng / Ví KM dùng) với cột Trạng thái/V-ref/Evidence + 4 forbidden derivations đã chứng minh SAI Review L8. (2) PRD L268-272 narrative fix — bỏ "Tiền thu = Ví Diva" sai. (3) dev-spec §0 mapping reference_amount + wallet_promotion_amount → PROVISIONAL V11/V12 với cảnh báo rõ. (4) dev-spec L861-872 wrap SQL vi_diva = total_collected vào PROVISIONAL DO-NOT-IMPLEMENT block, ref canonical table. (5) dev-spec L949-968 + L1027-1042 wrap customer + finance MV blocks PROVISIONAL — fix bug wallet_promotion_amount dùng làm "ví KM đã dùng" (Review L8 chứng minh SAI: field này là KM NẠP, không phải usage). (6) dev-spec L461-470 UI data contract tighten: bỏ "default formula" fallback, ref canonical table only. (7) plan.md Task 9 thêm 4 GraphQL aliases TBD (total_vi_diva_napped · total_vi_km_napped · total_vi_diva_used · total_vi_km_used) — chờ V9-V12. (8) plan.md Task 12 Step 1 — bỏ TransactionLocalFilter search input, wire shared q (DEC-U12). (9) plan.md Task 19b mới — EmptyState.vue component + useFilterChips composable + 2-query pattern (count_filtered + count_base) cho 3 sub-tab có table. (10) qa V1-V8 → V1-V13 entry gate; thêm test seed mở rộng cho discount/base≠sell/parent-sub invoice/wallet vs wallet_promotion bucket. (11) handoff "7 V" → "13 V" + V8-V13 detail per owner (BE Lead + Security + DBA + PO + Kế toán). (12) EVIDENCE_PACK E7 mới — 5 sections V9-V13 placeholders (BE/Kế toán fill code path + verification SQL + reconciliation table). (13) DEC-U12 mới — Single search source: bỏ HẲN local search input ở mọi sub-tab (Giao dịch sẽ là 2 element), placeholder dynamic theo tab, URL ?q= ở root. (14) Empty State v2 — 3 case detect priority (loading/error/no-data/filter-narrow), counter sub-message, active filter chips clickable, primary [Đặt lại tất cả] + secondary link, accessibility WCAG 2.1 AA full | prd, ui-spec, dev-spec, plan, qa-test-plan, handoff, EVIDENCE_PACK, index | Calculation correctness + UX |