Skip to content

Production Issues Tracker — Sales-CSKH Debt Follow-up & Handover

v2.3 — 15/05/2026 — BUG-PROD-006 (mobile sub-label) + Format cleanup

Thay đổiSectionẢnh hưởng
Thêm BUG-PROD-006 (🟠 High — UI semantic): Sub-label ₍Thu 130M − HT 5M₎ mobile MOB-01 mơ hồ + mâu thuẫn DEC-022 + vi phạm rule line 858 + format dấu ,. Chốt Option 1: sub-label = Đã thu {value} ({%}) · Nợ {value} — phục vụ Sale CSKH thu nợBUG-PROD-006 · Action itemsFE, PO
Format VND cleanup: 26 chỗ dấu , ngàn → dấu . (chuẩn VN locale). Audit toàn package, fix ui-spec.md (25 chỗ) + _prod-issues.md (1 chỗ)Toàn packageFE, PO
ui-spec.md MOB-01 wireframe: 125 Triệu125.000.000đ (rule line 858) + sub-label theo Option 1ui-spec.md:1727-1731FE
ui-spec.md Sub-label rules section: thêm rule mobile cho "Doanh thu ròng" — sub-label thông tin thu nợ thay vì wording cảnh báoui-spec.md Sub-label KPI mobileFE

v2.2 — 15/05/2026 — Wave 1 Hotfix Scheduled

Thay đổiSectionẢnh hưởng
BUG-PROD-005: Resolution Plan APPROVED → status ⚠️ OPEN🟡 SCHEDULED Wave 1 (Day-0 deploy migration index)BUG-PROD-005BE/DBA
BUG-PROD-003: re-affirm — DEC-028 đã LOCKED nhưng FE code chưa migrate (verified 2026-05-15 review). Gộp với BUG-PROD-001 thành 1 hotfix FE; format chốt "DD/MM/YYYY HH:mm" (ngày + giờ)BUG-PROD-003FE
Cleanup drift action table: BUG-PROD-003 từ "Quyết định Option A/B/C" → "Dev fix per DEC-028 Option E" (Wave 1 owner assigned)Action itemsAll

v2.1 — 15/05/2026

Thay đổiSectionẢnh hưởng
Thêm BUG-PROD-005: Bảng "Hiệu suất Tư vấn" timeout do 3/4 critical indexes Day-1 chưa deployResolution Log · BUG-PROD-005 · Action itemsBE/DBA
Status tracker: từ "All resolved" → "OPEN — BUG-PROD-005"Header statusAll

Mục đích: Tracking các issues phát hiện khi QA check tính năng trên prod (dev-support). Status: 🟡 Wave 1 SCHEDULED — BUG-PROD-005 (BE migration) + BUG-PROD-003 (FE hotfix) + BUG-PROD-006 (mobile sub-label) đang queued cho hotfix. Format VND cleanup gộp v2.3. Các issue khác đã resolved. Created: 2026-05-14 Last updated: 2026-05-15 Source: Screenshot prod URL diva-admin-dev.web.app/dm/debt tab Hiệu suất Tư vấn, user Thu Trang - IT Leader (Admin), filter 01/05/2026 - 31/05/2026

📋 Resolution Log

DateIssueResolutionSpec impact
2026-05-14BUG-PROD-001 (date format)✅ Confirmed bug — dev fix mmMM
2026-05-14BUG-PROD-003 (cột Cuộc gọi naming/data)✅ Chốt Option E: source = ecommerce_user.last_contacted_at (từ app mobile call)DEC-028 LOCKED
2026-05-14QUESTION-PROD-002 (% tham gia intent)✅ Confirmed: debt_owner_participation_percent (% phụ trách nợ). + Discovery GAP MỚI: multi-order cùng ngày chỉ pick 1 order → mất visibilityDEC-029 + FORMULA-008 (Option B weighted avg)
2026-05-15PD-001 (default role grants)✅ Chốt: roles admin + it_leader default; còn lại theo Dynamic Permission v2 per-tenantDEC-030 LOCKED
2026-05-15PD-002 (cron daily_debt_alert time)✅ Chốt: 7h00 sáng Asia/Ho_Chi_Minh, SLA delivered trước 8h00 (updated từ 8h30 → 7h00)DEC-031 LOCKED
2026-05-15QUESTION-PROD-001 (Doanh thu ròng tooltip "trừ nợ")✅ Chốt Option A — giữ formula, cải tooltip rõ "ghi nhận kế toán ≠ tiền thực thu"DEC-032 LOCKED
2026-05-15QUESTION-PROD-003 (Banner Ưu tiên as-of)✅ Chốt Scenario 2 — Banner LUÔN as-of NOW, không phụ thuộc filter date. Sub-label cảnh báo + visual cue camDEC-033 LOCKED + query mới get_priority_debt_banner
2026-05-15PD-004 (Materialized snapshot capacity)✅ Chốt Option D — Index optimization Day-1 (4 indexes critical) + gate Day-30 (snapshot Phase 2 nếu p95 > 1.5s 7 ngày). Snapshot scope (nếu trigger): chỉ tab Thống kêDEC-034 LOCKED
2026-05-15PD-003 (Hasura permission harden)⚠️ DEFERRED — chưa cần làm scope hiện tại. AUDIT phát hiện 9 bảng debt_* hiện chỉ có 1 role user với filter rỗng (cross-staff/branch/tenant leak). Risk accepted với mitigation FE+BE defense-in-depth. GATE BẮT BUỘC pen-test trước GA (GO-008)DEC-035 (Deferred — REVISIT before GA)
2026-05-15BUG-PROD-002 (đơn vị Triệu → đ)✅ Chốt: mọi KPI tiền hiển thị VND đầy đủ + suffix "đ", KHÔNG dùng Triệu/Tỷ/M/Bui-spec KPI Cards rule + format separator
2026-05-14BUG-PROD-004 (tooltip thiếu)✅ Update tooltip dictionary B9 với rule chi tiết "% tham gia" + drill-downui-spec B9 SCR-02
2026-05-15BUG-PROD-005 (table "Hiệu suất Tư vấn" timeout — "Lỗi kết nối")🟡 SCHEDULED Wave 1 (v2.2) — Resolution Plan approved: tạo migration add_debt_dashboard_indexes (SQL có sẵn ở dev-spec C9.2 line 796-810); deploy CONCURRENTLY Day-0; verify EXPLAIN ANALYZE; monitor Day-30 per DEC-034 gatedev-spec C7 migration mới
2026-05-15BUG-PROD-003 re-affirm (cột "Cuộc gọi" — FE chưa migrate per DEC-028)🟡 SCHEDULED Wave 1 (v2.2) — Verify 2026-05-15: code FE vẫn ở latest_consulted_at + format DD/mm/YYYY. Gộp với BUG-PROD-001 thành 1 hotfix FE. Format chốt "DD/MM/YYYY HH:mm"— (DEC-028 LOCKED v1.0, format updated v2.2)
2026-05-15BUG-PROD-006 (mobile MOB-01 sub-label ₍Thu 130M − HT 5M₎ mơ hồ vs DEC-022)🟡 SCHEDULED Wave 1 (v2.3) — Chốt Option 1: sub-label = Đã thu {value} ({%}) · Nợ {value} (Sale CSKH thu nợ first). Update wireframe MOB-01 + Sub-label rule section + format 125 Triệu125.000.000đ. DEC-032 web giữ nguyên "≠ tiền thực thu"ui-spec MOB-01 + Sub-label rules + format VND cleanup 26 chỗ

I) Danh sách Bug (đã confirm trong code)

BUG-PROD-001: Date format HH:mm DD/mm/YYYY SAI — tháng bị lowercase 🐞 CRITICAL

  • Triệu chứng: Cột "Cuộc gọi" hiển thị "Gần nhất: 15:44 14/44/2026" — tháng 44 không tồn tại
  • Root cause confirmed: DebtManagerConsultingPerformanceTable.tsx:165
    ts
    formatDateTime(row.latest_consulted_at, "HH:mm DD/mm/YYYY")
    //                                              ^^ lowercase mm = MINUTES
    //                                              Đáng lẽ MM (uppercase) = MONTH
  • Bug: mm trong moment/dayjs format = phút (00-59). Khách tư vấn lúc 15:44 → minute=44 → hiển thị thành "tháng 44"
  • Fix: Đổi "HH:mm DD/mm/YYYY""HH:mm DD/MM/YYYY"
  • Test seed cho QA: Tư vấn lúc bất kỳ phút nào (1-59) — bug reproduce 100%
  • Severity: 🔴 Critical (UI hiển thị data sai trong production)
  • Action: Dev fix + QA verify
  • Files cần check: Search toàn codebase pattern DD/mm/YYYY hoặc dd/mm/yyyy ở chỗ format date hiển thị — có thể có nhiều chỗ khác cũng sai

BUG-PROD-002: KPI "Doanh thu ròng" hiển thị 19289999 Triệu — đơn vị format SAI 🐞 HIGH

  • Triệu chứng: Card "Doanh thu ròng" hiển thị giá trị 19289999 kèm label "Triệu". 19,289,999 thực ra là ~19.3 triệu VND, không phải "19 triệu × triệu = 19 nghìn tỷ"
  • Hypothesis: Logic format unit có thể đang:
    • (a) Lấy raw number ÷ 1 (sai) thay vì raw number ÷ 1,000,000 khi chọn unit "Triệu"
    • (b) Hardcode label "Triệu" mà không scale value tương ứng
    • (c) Demo seed data sai theo user note ("à value chỉ là số demo của ui ux")
  • Confirmed cần investigate: Component KPI card hiển thị "Doanh thu ròng" — verify formula làm tròn + unit selection (M / Tr / Tỷ / VND)
  • Tooltip prod: "Tổng doanh thu sau chiết khấu, chưa trừ nợ" — confusing với "trừ nợ" — xem QUESTION-PROD-001
  • Sub-text: "Thu 130M − HT 5M" cho thấy backend có data raw revenue/refund — ngụ ý formula đúng actual_revenue đã trừ refund
  • Severity: 🟠 High (nếu là logic bug; 🟡 Low nếu chỉ là seed data demo)
  • Action:
    1. Dev verify trong UAT/prod thực value vẫn 19289999 Triệu?
    2. Nếu reproduce trong UAT → tìm component KPI render unit logic
    3. Nếu chỉ trong dev seed → kéo seed đúng + QA test lại
  • Test seed cho QA: Set order.actual_revenue = 1,500,000,000 (1.5 tỷ) → expected "1.500.000.000đ" hoặc "1,5 Tỷ" — verify format

BUG-PROD-003: Cột "Cuộc gọi" — ✅ RESOLVED 2026-05-14 (Option E chốt) — 🟡 PENDING EXECUTION (Wave 1)

⚠️ Re-affirm 2026-05-15: DEC-028 LOCKED v1.0 nhưng FE code CHƯA migrate. Review prod 2026-05-15 verified DebtManagerConsultingPerformanceTable.tsx:162 vẫn ở pre-fix state (latest_consulted_at + format DD/mm/YYYY). Re-assign sang Wave 1 hotfix cùng đợt BUG-PROD-001.

  • Triệu chứng cũ: Cột tên "Cuộc gọi" nhưng data đang lấy từ row.latest_consulted_at (timestamp tư vấn bất kỳ, kể cả walk-in)
  • Root cause confirmed: DebtManagerConsultingPerformanceTable.tsx:164 dùng row.latest_consulted_at = all_customer_consultations.last_source_at
  • 🎯 Resolution — Option E chốt:
    • Source field mới: ecommerce_user.last_contacted_at — denormalized field được app mobile cập nhật khi Sale gọi qua click-to-call (action recordDebtFollowupContact)
    • Format: "Gần nhất: DD/MM/YYYY HH:mm" (ngày trước, giờ sau — confirmed PO 2026-05-15 v2.2; gộp fix BUG-PROD-001 lowercase mm luôn)
    • Icon: giữ phone xanh (giờ đúng nghĩa)
    • Scope: all-time, không filter theo dashboard period
    • Empty state: "Chưa gọi" nếu last_contacted_at IS NULL
    • Tooltip: "Cuộc gọi gần nhất từ app Diva Staff cho khách này"
  • Lý do chọn Option E:
    • Đúng intent business: track cuộc gọi đòi nợ
    • Reuse field denormalized hiện có (ecommerce_user.last_contacted_at đã có sẵn) → query nhanh
    • App mobile đã ghi sẵn vào debt_contact_log + update ecommerce_user.last_contacted_at qua action recordDebtFollowupContact (verify: services/ecommerce-api/action/record_debt_followup_contact.go:88-94)
  • Spec impact:
    • DEC-028 từ Pending → ✅ LOCKED v1.0
    • ui-spec.md SCR-02 schema updated
    • dev-spec.md C2 + C5.1 updated
  • Action dev cần làm (Wave 1 — Hotfix FE):
    1. Update GraphQL query GetDebtPerformanceConsultationList (diva-admin/.../debt_manager.graphql:73) thêm field customer.last_contacted_at
    2. Update DebtManagerConsultingPerformanceTable.tsx:162 đổi source từ row.latest_consulted_at sang row.customer.last_contacted_at
    3. Update format string "HH:mm DD/mm/YYYY""DD/MM/YYYY HH:mm" (ngày trước giờ sau — gộp fix BUG-PROD-001 lowercase mm luôn)
    4. Update empty state hiển thị "Chưa gọi"
    5. Update tooltip cột "Cuộc gọi" → "Cuộc gọi gần nhất từ app Diva Staff cho khách này"

BUG-PROD-005: Bảng "Hiệu suất Tư vấn" — "Lỗi kết nối" / Query timeout 🐞 CRITICAL 🟡 SCHEDULED WAVE 1

  • Triệu chứng: Mở tab Hiệu Suất Tư Vấn tại diva-admin-dev.web.app/dm/debt, filter 01/05/2026 - 31/05/2026, KHÔNG chọn branch, user IT Leader (Admin):

    • ✅ KPI cards (Khách đã tư vấn, Đã mua, Lượt tư vấn, Tỷ lệ chốt, Doanh thu ròng) load thành công
    • ✅ Banner "Ưu tiên xử lý nợ quá hạn (5)" load thành công
    • ❌ Bảng phía dưới (cột Khách hàng / Cuộc gọi / Dịch vụ / % Tham gia / Tư vấn ngày / Trạng thái) → hiển thị "Lỗi kết nối. Vui lòng kiểm tra đường truyền" sau vài giây loading
  • Phân tích symptom — tại sao KPI/Banner OK mà table FAIL:

    • KPI cards + Banner gọi rollup từ customer_debt_dashboard_order_scope (table đã có index sẵn từ migration 1776054869987_*)
    • Bảng gọi SQL function search_report_debt_performance_consultation — function 6 CTE + LATERAL join + jsonb_array_elements (FORMULA-008 weighted participation)
    • → Khi không có index trên order table + filter all-branches → Hasura timeout (~30-60s) → FE thấy "Lỗi kết nối"
  • Root cause confirmed — 3/4 critical indexes Day-1 chưa deploy:

    Index (theo dev-spec C7.2)Migration hiện tạiStatus
    idx_order_branch_status_paid❌ MISSING
    idx_order_debt_owner_created_at❌ MISSING
    idx_order_customer_paid_total❌ MISSING
    idx_order_commission_user_orderCó variant _positive1772300000000_optimize_search_kpi_staff_by_month/up.sql:13⚠️ PARTIAL (variant khác — WHERE paid > 0, KHÔNG cover hết cases)
  • Evidence files:

    • dev-spec quy định 4 indexes: docs/features/sales-cskh-debt-handover/dev-spec.md:432-435, 796-810
    • Task DB-02 trong C11 yêu cầu tạo migration add_debt_dashboard_indexes (dev-spec.md:913) — chưa được làm
    • Component query: diva-admin/src/modules/debt-manager/component/consulting-performance/DebtManagerConsultingPerformanceTable.tsx:72 dùng useGetDebtPerformanceConsultationListQuery
    • SQL function: diva-backend/services/controller/migrations/ecommerce/1775036505870_consolidate_debt_report_functions/up.sql:191-407 (search_report_debt_performance_consultation)
  • Severity: 🔴 Critical — feature key (CSKH dùng để xử lý nợ hàng ngày) đang không thể sử dụng trên prod. Trigger DEC-034 Day-1 obligation.

  • Resolution Plan — ✅ APPROVED Wave 1 (v2.2 — 2026-05-15):

    1. Day-0 (urgent): Tạo migration mới 1779XXXXXX_add_debt_dashboard_indexes/up.sql — copy SQL từ dev-spec C9.2 line 796-810 (CONCURRENTLY để không lock table):
      sql
      CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_order_branch_status_paid ON ...
      CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_order_debt_owner_created_at ON ...
      CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_order_customer_paid_total ON ...
      CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_order_commission_user_order ON ...
    2. Verify post-deploy: \di idx_order_* xác nhận 4 indexes tồn tại + EXPLAIN ANALYZE function với data thực
    3. Capacity test: Reproduce scenario (filter 1 tháng + all-branches + admin user) → kỳ vọng p95 < 1.5s sau khi index
    4. Monitor Day-30: Set Prometheus alert dashboard_query_duration_seconds{endpoint="consulting_performance"} p95 > 1500ms sustained 7d → trigger Phase 2 (snapshot, theo DEC-034 gate)
  • Test seed cho QA:

    • Seed ≥ 50k orders trong tháng test, ≥ 5 branches
    • Filter all-branches + 1 tháng → response < 3s (p99)
    • EXPLAIN ANALYZE function plan → KHÔNG thấy Seq Scan trên order hoặc order_commission
  • Action:

    • Dev (Day-0): Tạo migration add_debt_dashboard_indexes (4 indexes) + deploy hotfix
    • QA: Verify table load thành công sau deploy + chạy capacity test scenario
    • DBA: Monitor query time post-deploy + setup Prometheus alert per DEC-034 gate
  • Spec impact: KHÔNG thay đổi DEC-034 (decision đã LOCK đúng). Chỉ ghi nhận migration oversight — DB-02 task chưa được thực thi mặc dù LOCK.


BUG-PROD-004: Tooltip cột "% tham gia" KHÔNG có chi tiết thực 🐞 LOW

  • Triệu chứng: Hover icon ⓘ cạnh "% tham gia" → tooltip chỉ hiển thị "{percent}% {customer_name}" — không có rule giải thích
  • Root cause confirmed: DebtManagerConsultingPerformanceTable.tsx:195-197
    ts
    innerHTML={`${formatPercent(
      row.debt_owner_participation_percent || 0
    )} ${row.customer.display_name}`}
  • Spec ui-spec B9 Tooltip Dictionary quy định: tooltip cột "% Của tôi" phải hiện "Phần trăm hoa hồng. Tooltip hiện chi tiết chia % khi < 100%"
  • Bug: Tooltip prod thiếu giải thích nghĩa, không có chi tiết chia % cho case multi-owner
  • Fix: Update tooltip text để giải thích formula (Ref FORMULA-007 nếu chọn theo % commission, hoặc Ref debt_owner_participation_percent nếu giữ logic hiện tại)
  • Severity: 🟡 Low (UX nhỏ, không sai logic)

BUG-PROD-006: Mobile MOB-01 sub-label "Doanh thu ròng" mơ hồ + mâu thuẫn DEC-022 🐞 HIGH

  • Triệu chứng: ui-spec.md:1727-1731 MOB-01 wireframe card "Doanh thu ròng":
    ┌───────────────────────────────┐
    │ Doanh thu ròng                │
    │ 125 Triệu                     │
    │ ₍Thu 130M − HT 5M₎            │  ← Sub-label đang có vấn đề
    └───────────────────────────────┘
  • 5 issues phát hiện 2026-05-15:
    1. Semantic conflict với DEC-022 LOCKED: Sub-label gợi ý công thức Thu − HT (legacy DEC-009 đã superseded). DEC-022 nói rõ Doanh thu ròng = SUM(actual_revenue) pre-computed, KHÔNG tính bằng paid − refund. Dev đọc sẽ confuse.
    2. "Thu" không khớp định nghĩa nào: Nếu hiểu "Thu" = "Thực thu" → trùng nghĩa với KPI "Đã thu trong kỳ" khác. Nếu hiểu "Thu" = paid_amount → vi phạm DEC-022.
    3. "HT" chưa định nghĩa trong A9 Glossary / B9 Tooltip Dictionary (vi phạm Quality Bar).
    4. DEC-032 tooltip wording mâu thuẫn: Tooltip nói "Doanh thu ròng = Tổng đơn − Chiết khấu − Hoàn trả" (3 thành phần), nhưng sub-label chỉ có 2 thành phần (Thu − HT).
    5. Vi phạm rule line 858 (BUG-PROD-002 LOCKED): Hiển thị 125 Triệu thay vì 125.000.000đ đầy đủ.
  • Phân tích góc vận hành thu hồi công nợ: KPI "Doanh thu ròng" là chỉ số kế toán (booked revenue) — phục vụ BOD/Manager. Sale/CSKH làm việc thu nợ quan tâm 3 thứ khác:
    • Tiền đã thu thực tế trong kỳ (cash inflow)
    • Khách còn nợ bao nhiêu (outstanding)
    • Tỷ lệ thu (collected / booked × 100)
    • → Sub-label Thu − HT lặp lại thành phần của primary value → vô nghĩa với Sale CSKH
  • 🎯 Resolution — Option 1 chốt (2026-05-15 PO confirm):
    • Sub-label mới: ₍Đã thu {collected} ({rate}%) · Nợ {outstanding}₎ — 3 chỉ số vận hành thu nợ
    • Primary giữ nguyên: actual_revenue value đầy đủ format VND (vd: 125.000.000đ)
    • Lý do chọn Option 1:
      • Khớp intent DEC-032 đã LOCKED: tách "ghi nhận kế toán" (primary) vs "tiền thực thu" (sub-label dẫn đến KPI khác)
      • Phục vụ vai trò Sale CSKH thực tế — 3 con số cần mỗi ngày: thu được, %, còn nợ
      • Không phá card layout — vẫn 1 card / KPI như wireframe gốc
      • Tránh duplicate với KPI "Đã thu trong kỳ" ở tab Công nợ — tab Hiệu suất tư vấn chưa có KPI thu nợ → chỗ tự nhiên để hiện
    • DEC-032 (web sub-label "≠ tiền thực thu") GIỮ NGUYÊN: chỉ áp dụng Option 1 cho mobile MOB-01. Web vẫn dùng wording cảnh báo ngắn (theo DEC-032 LOCKED). Nếu sau cần align web → PR riêng.
  • Spec impact:
    • ui-spec.md MOB-01 wireframe lines 1727-1731 — update card "Doanh thu ròng"
    • ui-spec.md Sub-label KPI mobile section (sau line 1745) — thêm rule cho "Doanh thu ròng"
    • DEC-022/DEC-032 KHÔNG đổi (đã LOCKED đúng)
  • Bonus cleanup gộp luôn v2.3 — Format VND dấu phẩy → chấm:
    • Audit: 26 chỗ VND dùng dấu , ngàn (US format) trong package — vi phạm convention VN locale
    • Files: ui-spec.md (25 chỗ), _prod-issues.md (1 chỗ — line 221)
    • Fix: bulk replace [0-9]+(,[0-9]{3})+đ[0-9]+(.[0-9]{3})+đ
    • Note: Lint Vietnamese đã flag warnings cho 3 chỗ; bulk fix toàn bộ để tránh repeat
  • Severity: 🟠 High (semantic conflict + business value loss cho mobile Sale CSKH)
  • Action:
    • FE: Update mobile MOB-01 sub-label theo Option 1 + format 125.000.000đ (rule line 858)
    • PO/BA (em — v2.3): Update _prod-issues.md + ui-spec.md MOB-01 wireframe + Sub-label rules section + format cleanup
    • QA: Verify mobile card hiển thị 3 chỉ số đúng (Đã thu, %, Nợ) + format VND dấu chấm

II) Câu hỏi nghiệp vụ cần PO / Dev confirm

QUESTION-PROD-001: "Doanh thu ròng" tooltip mâu thuẫn với spec — định nghĩa nào canonical?

  • Tooltip prod: "Tổng doanh thu sau chiết khấu, chưa trừ nợ"
  • Spec hiện tại (DEC-022 + FORMULA-003): net_revenue = SUM(order.actual_revenue) đã pre-computed (trừ refund + discount); KHÔNG nhắc đến "nợ"
  • Câu hỏi cho PO:
    • "Trừ nợ" có nghĩa là actual_revenue - total_debt (subtract debt from revenue)? Hay chỉ là wording cảnh báo user rằng số này KHÔNG đại diện "đã thu thực tế"?
    • Nếu là wording → tooltip cần rewrite cho rõ. Nếu là formula → DEC-022 + FORMULA-003 sai, cần update
  • Status user note: User confirmed 19289999 Triệu chỉ là seed demo, không phải logic bug → tooltip có thể vẫn đúng intent, chỉ là display sai
  • Action: PO clarify wording "trừ nợ" trong tooltip + check formula thực tế trong backend

QUESTION-PROD-002: "% tham gia" — ✅ RESOLVED 2026-05-14 (% phụ trách nợ + Option B weighted avg)

  • Code thực tế: Dùng field debt_owner_participation_percent (% phụ trách nợ)
  • PO confirm: Intent ĐÚNG là % phụ trách nợ (debt_owner_participation_percent)
  • 🔍 Discovery GAP MỚI khi đọc SQL function:
    • Function search_report_debt_performance_consultation (migration 1775036505870_consolidate_debt_report_functions/up.sql:160-200) chỉ pick 1 đơn duy nhất làm reference_order_id:
      sql
      -- evidence_logs → filter source_type → ORDER BY event_at DESC → LIMIT 1
    • → Nếu KH có nhiều đơn cùng ngày tư vấn, function chỉ tính % của 1 đơn (đơn liên kết appointment gần nhất), các đơn khác bị ẨN
    • → Sale mất visibility các đơn khác mình tham gia
  • 🎯 Resolution — Option B (weighted avg) chốt:
    • Công thức: weighted_pct = SUM(per_order_pct × order.total) / SUM(order.total)
    • Grain row giữ nguyên: 1 row / (customer_id, branch_id, consulted_date) — vì Sale gọi cho KH (không gọi đơn)
    • Tooltip drill-down: Hover icon ⓘ → liệt kê chi tiết per-order với % và total
  • Lý do chọn Option B (không phải split rows):
    • Sale gọi cho KH, không gọi cho đơn → 1 row/KH hợp lý
    • Weighted avg theo order.total cho Sale biết exposure tổng → ưu tiên gọi đúng
    • Tooltip cho visibility chi tiết khi cần drill-down
  • Spec impact:
    • DEC-029 LOCKED v1.0
    • FORMULA-008 mới trong PRD A10
    • SQL implementation chi tiết trong dev-spec C3 FORMULA-008
  • Action dev cần làm:
    1. Tạo migration mới: DROP + RECREATE function search_report_debt_performance_consultation với CTE weighted_participation (xem dev-spec C3 FORMULA-008 SQL canonical)
    2. Thêm field participation_breakdown JSONB vào type report_debt_performance_consultation_result
    3. Reload Hasura metadata
    4. Update GraphQL query GetDebtPerformanceConsultationList thêm field participation_breakdown
    5. Update FE tooltip để render drill-down từ participation_breakdown array
  • Test cases bắt buộc cho QA:
    • Seed KH có 1 đơn: % = % của đơn (no-op)
    • Seed KH có 2 đơn cùng ngày, % khác nhau: verify weighted formula correct
    • Seed KH có đơn cancelled: exclude khỏi tính
    • Seed KH có đơn total = 0: skip, denominator > 0
    • Verify tooltip hiển thị breakdown per-order đầy đủ

QUESTION-PROD-003: Banner "Ưu tiên xử lý nợ quá hạn" — có theo filter date không?

  • Screenshot: Filter date 01/05/2026 - 31/05/2026 (tháng 5). Banner hiển thị 5 khách nợ 1.238.853.080đ
  • Câu hỏi:
    • Banner tính khách nợ as-of TODAY (snapshot hiện tại), hay theo filter date period?
    • Nếu user chọn filter quay về Q1/2024 → banner phải hiển thị nợ quá hạn TẠI THỜI ĐIỂM ĐÓ hay TODAY?
  • Spec hiện tại không nói rõ. SCR-01 spec có "As-of Date cho dữ liệu nợ" nhưng chỉ áp dụng cho KPI tab Công nợ, không nói cho banner
  • Action: PO clarify behavior + dev test reproduce filter date thay đổi → banner update không

QUESTION-PROD-004: Cột "Cuộc gọi" — naming vs data mismatch (xem BUG-PROD-003)

Đã ghi ở section I. PO/Dev cần quyết định Option A/B/C.


III) Bảng action items

IDTypeSeverityOwnerActionStatusDeadline
BUG-PROD-001 + BUG-PROD-003 (gộp)FE Hotfix per DEC-028 Option E🔴 CriticalFE Dev(1) GraphQL thêm customer.last_contacted_at; (2) FE đổi source latest_consulted_atcustomer.last_contacted_at (DebtManagerConsultingPerformanceTable.tsx:162); (3) format "DD/MM/YYYY HH:mm" (fix luôn mm lowercase bug); (4) empty state "Chưa gọi"; (5) tooltip mới🟡 SCHEDULED Wave 1Day-0 (Wave 1)
BUG-PROD-005Perf / Migration miss🔴 CriticalBE Dev + DBATạo migration add_debt_dashboard_indexes (4 indexes — SQL có sẵn ở dev-spec C9.2 line 796-810) + deploy CONCURRENTLY + verify EXPLAIN ANALYZE🟡 SCHEDULED Wave 1Day-0 (Wave 1)
BUG-PROD-006UI Semantic + Format🟠 HighFE DevMobile MOB-01: sub-label "Doanh thu ròng" đổi sang Option 1 Đã thu {value} ({%}) · Nợ {value} + format 125.000.000đ (không "Triệu"). Spec update đã có sẵn ở ui-spec.md MOB-01 v2.3🟡 SCHEDULED Wave 1Day-0 (Wave 1)
BUG-PROD-002Bug / Seed🟠 HighDev + QAVerify unit format KPI "Doanh thu ròng" trong UAT⏳ Wave 2 backlogTrước UAT
BUG-PROD-004UX🟡 LowDevUpdate tooltip "% tham gia" với rule chi tiết⏳ Wave 2 backlogPhase 2 OK
QUESTION-PROD-001Spec clarifyPOClarify wording "trừ nợ" trong tooltip Doanh thu ròng⏳ Wave 2 backlogTrước UAT
QUESTION-PROD-002Spec clarify🟠 HighPOChốt intent "% tham gia" — commission hay debt owner participation✅ Resolved (DEC-029)
QUESTION-PROD-003Spec clarify🟡 MediumPOBanner Ưu tiên: as-of TODAY hay theo filter✅ Resolved (DEC-033)

IV) Sau khi resolve — sẽ update spec ở những chỗ nào

IssueFile spec sẽ updateSection
BUG-PROD-001— (chỉ fix code)
BUG-PROD-002ui-spec.md B9 Tooltip DictionaryCard "Doanh thu ròng" — format unit
BUG-PROD-003 (Option A/B/C)prd.md Z1 DEC-028 (lock) + ui-spec.md SCR-02 schemaDEC-028 + cột "Cuộc gọi"/"Tư vấn gần nhất"
BUG-PROD-004ui-spec.md B9 TooltipTooltip "% tham gia"
QUESTION-PROD-001prd.md A10 FORMULA-003 + Z1 DEC-022 + ui-spec.md tooltipFORMULA-003 wording
QUESTION-PROD-002prd.md Z1 DEC mới + A10 FORMULA mới + ui-spec.md SCR-02 cột"% tham gia" canonical
QUESTION-PROD-003prd.md Z1 DEC mới + ui-spec.md SCR-01 bannerBanner as-of date logic

V) Test cases mới cần thêm vào qa-test-plan sau khi resolve

Test caseMô tảLiên quan
TC-CP-DATE-FMTTư vấn vào các phút khác nhau (1-59) → date hiển thị đúng thángBUG-PROD-001
TC-CP-KPI-UNITKPI Doanh thu ròng với value khác nhau (1k, 1M, 1B, 1T) → unit display đúngBUG-PROD-002
TC-CP-CALL-VS-CONSULTATIONKhách tư vấn không qua điện thoại → cột "Cuộc gọi" hiển thị gì?BUG-PROD-003
TC-CP-PERCENT-COMMISSIONKhách Admin xem có % tham gia là gì? Sale xem chính khách của mình → % bao nhiêu?QUESTION-PROD-002
TC-CP-BANNER-DATEFilter date quá khứ vs hiện tại → banner thay đổi không?QUESTION-PROD-003

VI) Liên kết