← Quay lại Dashboard
Changelog
[2026-04-07]Session 4
Tính năng mới
- Target vs Actual — lazy load — Section "Target vs Actual" không còn load cùng dashboard nữa. Thay bằng nút toggle "📊 Target vs Actual T4/2026 ▶" — nhấn vào mới fetch và hiển thị bảng (loading state "⏳ Đang tải dữ liệu brand..."). Lần 2 toggle chỉ ẩn/hiện, không fetch lại. Reset state mỗi khi dashboard reload.
- Route
/api/brand-targets — API riêng cho brand targets, tách khỏi /api/dashboard. Gọi getBrandTargets(platform, shop, dateFrom, dateTo) song song queryBrandRevByProduct + queryEcomTargets.
Sửa lỗi
- Actual DT brand tính sai — Query cũ dùng
detail_days_all (dữ liệu bán hàng offline ThinkPro — laptop Lenovo, ASUS) → không phải ecom revenue. Fix: dùng Shopee item_list UNNEST + TikTok product_name để phân loại brand theo keyword tên sản phẩm trong từng đơn. Mỗi đơn assign cho brand của sản phẩm có giá trị cao nhất → sum total_amount order-level → khớp với queryOrderMetrics.
- Formula Actual DT theo brand:
- Partnership = đơn có item_name chứa
"arzopa" (Shopee/TikTok)
- NiceDesign = đơn có item_name chứa
"nicedesign" hoặc "nice design"
- Leaf = đơn có item_name chứa
"leaf"
- ThinkPro = các đơn còn lại từ shop ThinkPro
- Dashboard load chậm do
queryBrandRevByProduct — Query UNNEST item_list nặng, trước đây chạy cùng Promise.all của dashboard. Đã tách ra route riêng, dashboard không còn chờ query này nữa.
[2026-04-07]Session 3
Tính năng mới
- Cột CVR trong tree table campaigns-v2 — Thêm cột CVR (Conversion Rate = conversions/clicks × 100%) vào giữa cột Conv và ROAS trong bảng tree table Alpine path (real data). Màu theo benchmark sàn (xanh = trên sàn, đỏ = dưới sàn), tooltip hiện CVR benchmark. Có thể sort theo CVR.
- Bộ lọc bảng nguồn nội dung đạt chuẩn — Panel "Nguồn nội dung đạt chuẩn" có 3 nút filter:
Tất cả / ✓ Đạt chuẩn / ✗ Chưa đạt. Badge dòng cập nhật thành "X/Tổng" khi đang lọc. Reset về "Tất cả" khi đóng panel.
- Brand Leaf trong campaigns-v2 — Badge brand trong bảng nguồn nội dung hiện đúng màu: NDS → indigo, Leaf → xanh lá (#F0FDF4/#16A34A), ThinkPro → đỏ.
- Panel "📊 Chỉ số sàn" — Nút mới (xanh dương) cạnh nút nội dung đạt chuẩn. Nhấn vào hiện bảng so sánh Actual vs Benchmark theo Platform × Brand với 4 chỉ số: CTR / CPC / CPM / CVR. Màu: xanh ≥90% sàn, vàng 70–90%, đỏ <70%. Legend giải thích chiều so sánh (CTR/CVR cao hơn tốt hơn; CPC/CPM thấp hơn tốt hơn).
- Route
/changelog.md — Server.js serve CHANGELOG.md từ root project → /changelog.html hiển thị đúng nội dung changelog thực tế.
[2026-04-06]Session 2
Tính năng mới
- Section A "Chỉ số Marketing" trên campaigns-v2 — Chuyển 5 KPI cards (Chi phí QC / ROAS / CPC / CTR / CVR) từ trang marketing sang đầu trang campaigns-v2. Data lấy trực tiếp từ
/api/campaigns — không cần fetch thêm. Thêm field avgCVR vào campaigns kpi object (conversions / clicks). Các section cũ shift: A→B (Tổng quan), B→C (Kênh), C→D (Bảng chi tiết).
- Filter chính xác theo ngày (YYYY-MM-DD) — Bỏ hoàn toàn logic "expand month" ở frontend. Tất cả preset giờ gửi ngày chính xác:
Tháng này = 01/04/2026 → 06/04/2026 (đầu tháng → hôm nay, không phải cuối tháng)
Tháng trước = 01/03/2026 → 31/03/2026 (tháng hoàn chỉnh)
Năm 2025 = 2025-01-01 → 2025-12-31
Năm 2026 = 2026-01-01 → hôm nay
- Smart label filter dropdown — Tự động nhận dạng range và hiển thị label thân thiện: tháng đầy đủ → "T4/2026", tháng partial → "T4/2026 (6/30 ngày)", năm đầy đủ → "Năm 2025", range khác → "06/04/2026 → …". Backwards compat: URL cũ có YYYY-MM format tự động expand.
- Client là source of truth cho date state — Bỏ logic sync
currentMonth/currentMonthFrom từ backend response về frontend (tránh overwrite state bằng YYYY-MM format cũ).
Sửa lỗi
- So sánh cùng tiêu chí (apples-to-apples) — Doanh thu KPI card và % tăng trưởng per-shop giờ dùng
completedRevenue (COMPLETED/DELIVERED only) thay vì revenue (bao gồm pending) làm cơ sở so sánh.
- +8324.7% growth % bug — Root cause:
queryOrderMetrics(dateFrom='2026-04-01') không có data tháng 3 → prevAgg = 0 hoặc stale cache → % sai. Fix: tính extendedFrom (mở rộng query window về trước rangeLen tháng).
dayRatio tính theo server today thay vì filter range — Fix: dayRatio = actualDays / totalDaysInTargetPeriod. Ví dụ: filter 01/04→06/04 → 6/30 = 0.200; filter 01/03→22/03 → 22/31 = 0.710.
wallet-detail API không có data — Fix: .slice(0,7) để chỉ lấy YYYY-MM từ full date string.
prevCompletedRev không được tính vào prevShopMetrics — Fix: thêm completedRevenue: toM(prevCompletedRev) và thêm vào scaleKeys.
Cải tiến
completedRevenue và pendingRevenue trong buildMonthlyData — Thêm completedRev, pendingRev, completedOrd, pendingOrd.
- GMV chart tách 2 stack — "Doanh thu (HT)" =
completedRevenue (màu đậm), "Chờ Hoàn Thành" = pendingRevenue (màu nhạt).
- Section A ecom-finance gom 5 mục 1 hàng —
kpi-grid-5: 3 KPI cards + 2 stat boxes. Bỏ chart canvas khỏi 2 stat boxes, bỏ "so sánh kỳ" dropdown.
- Label chuẩn — Hoàn huỷ → Trả hàng, Chờ giao → Chờ Hoàn Thành.
- Backwards compat URL — URL cũ có
YYYY-MM tự động expand thành YYYY-MM-DD đầu/cuối tháng.
avgCVR campaigns kpi — Thêm avgCVR = conversions / clicks * 100 vào object kpi trả về từ /api/campaigns.
[2026-04-06]Session 1
Breaking change
- Bỏ hoàn toàn bộ lọc
monthFrom/monthTo — Toàn bộ filter tháng được thay bằng dateFrom/dateTo (YYYY-MM-DD). Ảnh hưởng: server.js (21 routes), data/bq.js (29 hàm export + 4 query helper), public/js/app.js, public/js/render.js.
Sửa lỗi
- Filter ngày không hoạt động — vẫn lấy cả tháng — Root cause:
queryOrderMetrics(), queryReturns(), queryAdsSpend(), queryTiktokFees() không có WHERE clause. Fix: thêm WHERE clause trực tiếp vào SQL dựa trên dateFrom/dateTo.
Cải tiến
appendDateParams — luôn gửi YYYY-MM-DD — Nay chỉ gửi dateFrom/dateTo, tự động mở rộng YYYY-MM thành ngày đầu/cuối tháng.
- Preset tháng → date-level — "Năm 2025", "Năm 2026", "Quý này", "Tất cả" vẫn hoạt động đúng.
- Modal fee & KPI detail —
fetchFeesForModal và fetchDashboardForModal cũng chuyển sang dateFrom/dateTo.
[2026-04-03]
Tính năng mới
- Server-side API cache 5 phút — Tất cả GET
/api/* được cache in-memory (Map) TTL 5 phút. Bypass cho /auth/, /cache/, /ai/. Header X-Cache: HIT khi cache hit.
- Nút "Làm mới cache" sidebar — Click gọi
POST /api/cache/clear và reload trang. Feedback icon: ⏳ → ✅/❌ → 🔄.
- Instant tooltip (
data-tip) — Thay native title= bằng custom JS tooltip — hiển thị ngay lập tức, event delegation toàn document.
Cải tiến
- Tổng đơn hàng — status breakdown — KPI card hiển thị phân loại đầy đủ: ✅ Hoàn thành · ⏳ Chờ giao · ❌ Đã hủy · ↩ Trả hàng · 🔄 Đổi hàng + tỷ lệ hoàn.
- campaigns-v2 quay lại tree table — Bỏ tab view (3 tab), khôi phục tree table 3 cấp campaign → adset → ad.
- CTR gộp 1 cột — Hai cột CTR(ALL) + CTR(CLICK) → 1 cột hiển thị
X.X%/Y.Y%. Màu benchmark theo CTR ALL.
- Font size fix cứng — Tất cả row set
font-size: 10px trực tiếp.
- Column gap 10px — Thêm
column-gap: 10px vào .cv2-grid-cols kèm border-right phân cách.
- Name column max-width 44% — Dùng
minmax(160px, 44%) thay 1fr.
- Căn giữa metric columns — Tất cả
.mono cell căn giữa. Name column giữ nguyên left-align.
[2026-03-31]
Sửa lỗi
- Timezone filter tháng/ngày — Fix lỗi lọc tháng 2 nhưng ra đơn hàng ngày 1/3 (lúc 1-7h sáng). Nguyên nhân: BigQuery lưu UTC → đổi sang timezone
'Asia/Ho_Chi_Minh' trong WHERE clause. Ảnh hưởng: buildDateClause, queryOrdersByStatus, queryOrderLevelDetails.
- Popup filter luôn hiển thị — Fix CSS:
.filter-dd-panel.open.date-dd-panel { display: flex; }.
- Event listener leak — Xoá per-element binding cho shop dropdown, gộp vào event delegation chung.
Tính năng mới
- Ngày đặt & ngày nhận trong bảng đơn hàng — Bổ sung 2 cột: Ngày đặt (
create_time) và Ngày nhận (escrow_release_time, màu xanh). Format DD/MM HH:MM.
- Preset lọc ngày mới — Thêm "7 ngày qua", "30 ngày qua", "Năm 2025", "Năm 2026".
- Popup lọc gộp chung — Gộp bộ lọc thời gian và shop/sàn vào một popup duy nhất 3 cột.
Cải tiến
- Timezone VN cho BQ display — Toàn bộ
FORMAT_TIMESTAMP trong SELECT đổi sang 'Asia/Ho_Chi_Minh'.
- payout_date —
escrow_release_time từ bảng escrow_listing_* được trả về và hiển thị trong chi tiết đơn.
- Label rõ ràng — Đổi "Ngày TT" → "Ngày nhận" (bảng), "Ngày ghi nhận TT" (modal).
Tài liệu
- Tạo
HANDOVER.md — mô tả dự án, giao diện, hướng dẫn vibecoding với AI.
- Tạo
README.md — tài liệu kỹ thuật đầy đủ.