Appearance
Production Issues Tracker — Sales-CSKH Debt Follow-up & Handover
v2.3 — 15/05/2026 — BUG-PROD-006 (mobile sub-label) + Format cleanup
| Thay đổi | Section | Ả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 items | FE, 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 package | FE, PO |
ui-spec.md MOB-01 wireframe: 125 Triệu → 125.000.000đ (rule line 858) + sub-label theo Option 1 | ui-spec.md:1727-1731 | FE |
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áo | ui-spec.md Sub-label KPI mobile | FE |
v2.2 — 15/05/2026 — Wave 1 Hotfix Scheduled
| Thay đổi | Section | Ảnh hưởng |
|---|---|---|
BUG-PROD-005: Resolution Plan APPROVED → status ⚠️ OPEN → 🟡 SCHEDULED Wave 1 (Day-0 deploy migration index) | BUG-PROD-005 | BE/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-003 | FE |
| 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 items | All |
v2.1 — 15/05/2026
| Thay đổi | Section | Ả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 deploy | Resolution Log · BUG-PROD-005 · Action items | BE/DBA |
| Status tracker: từ "All resolved" → "OPEN — BUG-PROD-005" | Header status | All |
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/debttabHiệu suất Tư vấn, userThu Trang - IT Leader (Admin), filter01/05/2026 - 31/05/2026
📋 Resolution Log
| Date | Issue | Resolution | Spec impact |
|---|---|---|---|
| 2026-05-14 | BUG-PROD-001 (date format) | ✅ Confirmed bug — dev fix mm → MM | — |
| 2026-05-14 | BUG-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-14 | QUESTION-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 visibility | DEC-029 + FORMULA-008 (Option B weighted avg) |
| 2026-05-15 | PD-001 (default role grants) | ✅ Chốt: roles admin + it_leader default; còn lại theo Dynamic Permission v2 per-tenant | DEC-030 LOCKED |
| 2026-05-15 | PD-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-15 | QUESTION-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-15 | QUESTION-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 cam | DEC-033 LOCKED + query mới get_priority_debt_banner |
| 2026-05-15 | PD-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-15 | PD-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-15 | BUG-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/B | ui-spec KPI Cards rule + format separator |
| 2026-05-14 | BUG-PROD-004 (tooltip thiếu) | ✅ Update tooltip dictionary B9 với rule chi tiết "% tham gia" + drill-down | ui-spec B9 SCR-02 |
| 2026-05-15 | BUG-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 gate | dev-spec C7 migration mới |
| 2026-05-15 | BUG-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-15 | BUG-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ệu → 125.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:165tsformatDateTime(row.latest_consulted_at, "HH:mm DD/mm/YYYY") // ^^ lowercase mm = MINUTES // Đáng lẽ MM (uppercase) = MONTH - Bug:
mmtrong 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/YYYYhoặcdd/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ị
19289999kèm label "Triệu".19,289,999thự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:
- Dev verify trong UAT/prod thực value vẫn
19289999 Triệu? - Nếu reproduce trong UAT → tìm component KPI render unit logic
- Nếu chỉ trong dev seed → kéo seed đúng + QA test lại
- Dev verify trong UAT/prod thực value vẫn
- 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:162vẫn ở pre-fix state (latest_consulted_at+ formatDD/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:164dùngrow.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 (actionrecordDebtFollowupContact) - 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 lowercasemmluô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"
- Source field mới:
- 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+ updateecommerce_user.last_contacted_atqua actionrecordDebtFollowupContact(verify:services/ecommerce-api/action/record_debt_followup_contact.go:88-94)
- Spec impact:
- DEC-028 từ Pending → ✅ LOCKED v1.0
ui-spec.mdSCR-02 schema updateddev-spec.mdC2 + C5.1 updated
- Action dev cần làm (Wave 1 — Hotfix FE):
- Update GraphQL query
GetDebtPerformanceConsultationList(diva-admin/.../debt_manager.graphql:73) thêm fieldcustomer.last_contacted_at - Update
DebtManagerConsultingPerformanceTable.tsx:162đổi source từrow.latest_consulted_atsangrow.customer.last_contacted_at - 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 lowercasemmluôn) - Update empty state hiển thị "Chưa gọi"
- 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"
- Update GraphQL query
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ấntạidiva-admin-dev.web.app/dm/debt, filter01/05/2026 - 31/05/2026, KHÔNG chọn branch, userIT 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ừ migration1776054869987_*) - 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
ordertable + filter all-branches → Hasura timeout (~30-60s) → FE thấy "Lỗi kết nối"
- KPI cards + Banner gọi rollup từ
Root cause confirmed — 3/4 critical indexes Day-1 chưa deploy:
Index (theo dev-spec C7.2) Migration hiện tại Status 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 _positiveở1772300000000_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-02trong C11 yêu cầu tạo migrationadd_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:72dùnguseGetDebtPerformanceConsultationListQuery - SQL function:
diva-backend/services/controller/migrations/ecommerce/1775036505870_consolidate_debt_report_functions/up.sql:191-407(search_report_debt_performance_consultation)
- dev-spec quy định 4 indexes:
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):
- 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):sqlCREATE 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 ... - Verify post-deploy:
\di idx_order_*xác nhận 4 indexes tồn tại + EXPLAIN ANALYZE function với data thực - Capacity test: Reproduce scenario (filter 1 tháng + all-branches + admin user) → kỳ vọng p95 < 1.5s sau khi index
- Monitor Day-30: Set Prometheus alert
dashboard_query_duration_seconds{endpoint="consulting_performance"} p95 > 1500mssustained 7d → trigger Phase 2 (snapshot, theo DEC-034 gate)
- Day-0 (urgent): Tạo migration mới
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 Scantrênorderhoặcorder_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
- Dev (Day-0): Tạo migration
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-197tsinnerHTML={`${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_percentnế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-1731MOB-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:
- 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ằngpaid − refund. Dev đọc sẽ confuse. - "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. - "HT" chưa định nghĩa trong A9 Glossary / B9 Tooltip Dictionary (vi phạm Quality Bar).
- 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).
- Vi phạm rule line 858 (BUG-PROD-002 LOCKED): Hiển thị
125 Triệuthay vì125.000.000đđầy đủ.
- Semantic conflict với DEC-022 LOCKED: Sub-label gợi ý công thức
- 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 − HTlặ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_revenuevalue đầ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.
- Sub-label mới:
- Spec impact:
ui-spec.mdMOB-01 wireframe lines 1727-1731 — update card "Doanh thu ròng"ui-spec.mdSub-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
- Audit: 26 chỗ VND dùng dấu
- 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.mdMOB-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
- FE: Update mobile MOB-01 sub-label theo Option 1 + format
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
- "Trừ nợ" có nghĩa là
- Status user note: User confirmed
19289999 Triệuchỉ 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(migration1775036505870_consolidate_debt_report_functions/up.sql:160-200) chỉ pick 1 đơn duy nhất làmreference_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
- Function
- 🎯 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
- Công thức:
- 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.totalcho 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:
- Tạo migration mới: DROP + RECREATE function
search_report_debt_performance_consultationvới CTEweighted_participation(xem dev-spec C3 FORMULA-008 SQL canonical) - Thêm field
participation_breakdown JSONBvào typereport_debt_performance_consultation_result - Reload Hasura metadata
- Update GraphQL query
GetDebtPerformanceConsultationListthêm fieldparticipation_breakdown - Update FE tooltip để render drill-down từ
participation_breakdownarray
- Tạo migration mới: DROP + RECREATE function
- 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
| ID | Type | Severity | Owner | Action | Status | Deadline |
|---|---|---|---|---|---|---|
| BUG-PROD-001 + BUG-PROD-003 (gộp) | FE Hotfix per DEC-028 Option E | 🔴 Critical | FE Dev | (1) GraphQL thêm customer.last_contacted_at; (2) FE đổi source latest_consulted_at → customer.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 1 | Day-0 (Wave 1) |
| BUG-PROD-005 | Perf / Migration miss | 🔴 Critical | BE Dev + DBA | Tạ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 1 | Day-0 (Wave 1) |
| BUG-PROD-006 | UI Semantic + Format | 🟠 High | FE Dev | Mobile 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 1 | Day-0 (Wave 1) |
| BUG-PROD-002 | Bug / Seed | 🟠 High | Dev + QA | Verify unit format KPI "Doanh thu ròng" trong UAT | ⏳ Wave 2 backlog | Trước UAT |
| BUG-PROD-004 | UX | 🟡 Low | Dev | Update tooltip "% tham gia" với rule chi tiết | ⏳ Wave 2 backlog | Phase 2 OK |
| QUESTION-PROD-001 | Spec clarify | — | PO | Clarify wording "trừ nợ" trong tooltip Doanh thu ròng | ⏳ Wave 2 backlog | Trước UAT |
| QUESTION-PROD-002 | Spec clarify | 🟠 High | PO | Chốt intent "% tham gia" — commission hay debt owner participation | ✅ Resolved (DEC-029) | — |
| QUESTION-PROD-003 | Spec clarify | 🟡 Medium | PO | Banner Ưu tiên: as-of TODAY hay theo filter | ✅ Resolved (DEC-033) | — |
IV) Sau khi resolve — sẽ update spec ở những chỗ nào
| Issue | File spec sẽ update | Section |
|---|---|---|
| BUG-PROD-001 | — (chỉ fix code) | — |
| BUG-PROD-002 | ui-spec.md B9 Tooltip Dictionary | Card "Doanh thu ròng" — format unit |
| BUG-PROD-003 (Option A/B/C) | prd.md Z1 DEC-028 (lock) + ui-spec.md SCR-02 schema | DEC-028 + cột "Cuộc gọi"/"Tư vấn gần nhất" |
| BUG-PROD-004 | ui-spec.md B9 Tooltip | Tooltip "% tham gia" |
| QUESTION-PROD-001 | prd.md A10 FORMULA-003 + Z1 DEC-022 + ui-spec.md tooltip | FORMULA-003 wording |
| QUESTION-PROD-002 | prd.md Z1 DEC mới + A10 FORMULA mới + ui-spec.md SCR-02 cột | "% tham gia" canonical |
| QUESTION-PROD-003 | prd.md Z1 DEC mới + ui-spec.md SCR-01 banner | Banner as-of date logic |
V) Test cases mới cần thêm vào qa-test-plan sau khi resolve
| Test case | Mô tả | Liên quan |
|---|---|---|
| TC-CP-DATE-FMT | Tư vấn vào các phút khác nhau (1-59) → date hiển thị đúng tháng | BUG-PROD-001 |
| TC-CP-KPI-UNIT | KPI Doanh thu ròng với value khác nhau (1k, 1M, 1B, 1T) → unit display đúng | BUG-PROD-002 |
| TC-CP-CALL-VS-CONSULTATION | Khá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-COMMISSION | Khá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-DATE | Filter date quá khứ vs hiện tại → banner thay đổi không? | QUESTION-PROD-003 |
VI) Liên kết
- Spec gốc liên quan:
prd.mdZ1 DEC-022, DEC-028 +ui-spec.md§0 + SCR-02 +dev-spec.mdC3 FORMULA-003 - Consistency tracking:
_consistency-matrix.mdsection 10 - Code evidence:
diva-admin/src/modules/debt-manager/component/consulting-performance/DebtManagerConsultingPerformanceTable.tsx:51,164,178
- Test plan:
qa-test-plan.md