Changelog

[2.5.0] 20260709

CHANGELOG — Tân Doanh Build PC


[2.5.0] - 2026-07-09

✨ Feature — P3: cảnh báo lệch giá/tồn linh kiện + cập nhật giá thủ công

Hoàn tất Phase 3 của kế hoạch Build PC admin (/var/www/TD-BUILDPC-ADMIN-PLAN.md). Nguyên tắc: không bao giờ tự đổi giá ngầm — hệ chỉ báo và đề xuất, người dùng bấm nút mới ghi.

  • build_diff( $pid ) (helper mới): so _td_build_parts với trạng thái HIỆN TẠI của từng linh kiện, phân loại 3 mức — missing (SP bị xoá/trash), oos (hết hàng), price (giá lệch ≥1đ so với _td_build_snapshot). Trả về tổng linh kiện hiện tại, giá đề xuất (= tổng + phí ráp đã lưu), giá đang bán, và cờ was_override (giá lúc áp ≠ tổng+phí ⇒ sale đã tự gõ giá).
  • Panel cảnh báo trong metabox: bảng liệt kê CHỈ các linh kiện có vấn đề (giá lúc áp / giá hiện tại / chênh lệch có màu, tăng đỏ giảm xanh) + chip đếm theo loại. Dòng tổng kết "giá đang bán → giá theo linh kiện hiện tại", nêu rõ tổng linh kiện + phí ráp. Nếu build từng bị override giá tay → cảnh báo bấm nút sẽ đè giá đó. Khi mọi thứ khớp: dòng "✓ Giá và tồn kho các linh kiện vẫn khớp".
  • Nút "↻ Cập nhật giá theo linh kiện" → AJAX td_buildpc_refresh_price (nonce theo product + cap edit_post): đặt regular price = tổng linh kiện hiện tại + phí ráp đã lưu, xoá sale price, ghi lại _td_build_snapshot làm mốc so sánh kế tiếp. Có confirm() trước khi chạy.
    • Khoá an toàn: nếu có linh kiện bị xoá (n_missing > 0) thì KHÔNG hiện nút, chỉ báo "mở Build PC chọn lại" — tránh ra giá sai do thiếu món.
  • Cột "Build PC" trong danh sách sản phẩm (chèn ngay sau cột Giá): badge N linh kiện mất (đỏ) / N hết hàng (vàng) / N đổi giá (xanh, kèm "đề xuất ±X đ"), hoặc ✓ khớp. SP không có build meta thoát ngay → không tốn query cho hàng nghìn SP thường.

🔧 QA vòng 2 — 4 lỗi tự bắt được, đã fix trước khi bàn giao

  • [Hiệu năng, nặng nhất] Cột list tốn 76 query / 108ms cho MỖI máy bộ (20 máy bộ/trang ⇒ ~1.5k query, ~2 giây) vì build_diff() dựng WC_Product đầy đủ cho từng linh kiện. Thêm build_flags() — bản nhẹ đọc thẳng _price + _stock_status bằng 2 SQL (id đã absint, nội suy an toàn) → 5 query / 8.5ms (giảm 93%). Verify build_flags() cho kết quả TRÙNG KHỚP build_diff() (n_missing/n_oos/n_price/suggested).
  • [Đúng đắn] build_flags() nuốt món khi cấu hình có id trùng lặp: gán $qty_by_id[$id] = qty (đè) thay vì cộng dồn → 2 dòng cùng linh kiện (2 thanh RAM) chỉ tính 1 ⇒ cột báo giá đề xuất thiếu 5.690.000đ trong khi metabox tính đúng. Fix: cộng dồn qty. (sanitize_parts() có dedupe nên đường AJAX không sinh trùng, nhưng meta có thể bị ghi từ import/sync/sửa tay — cột hiển thị TIỀN nên phải phòng thủ.)
  • [Luật UI] Ô tiền dùng type=number (phí ráp, giá bán cuối) — vi phạm luật UI td: spinner + cuộn chuột đổi giá trị + không nhóm dấu chấm. Đổi sang type=text + inputmode=numeric + class td-money, JS format 1.234.567 khi gõ và strip về chữ số khi gửi. Chốt phía server: ajax_apply_build() strip mọi ký tự không phải số trước khi ép kiểu — trước đây absint("300.000") = 300, phí ráp 300.000đ sẽ thành 300đ nếu JS không strip.
  • [Robustness] render_build_column() đọc key của mảng ['has_build'=>false] khi meta _td_build_parts hỏng (là chuỗi thay vì mảng) → PHP warning. Nay dùng build_flags() trả null → in .
  • Thêm _prime_post_caches() trong build_diff() (metabox).

⚠️ QA vòng 2 (tiếp) — cảnh báo MỚI: linh kiện chưa có giá

Ảnh chụp metabox thật để lộ rủi ro tiền bạc mà P3 ban đầu KHÔNG bắt: SP mẫu 104670 có 3/8 linh kiện giá 0đ (SSD + AIO còn đang bán, PSU hết hàng) ⇒ tổng linh kiện thiếu tiền 3 món, giá bán tính ra bị hụt mà không có cảnh báo nào.

  • Thêm cờ n_zero (giá ≤ 0 nhưng SP còn tồn tại) vào cả build_diff()build_flags(); row có thêm khóa zero.
  • Panel: chip đỏ N chưa có giá + khối cảnh báo đỏ "tổng linh kiện đang thiếu tiền các món đó, giá bán tính ra sẽ hụt — nhập giá linh kiện trước, hoặc tự gõ Giá bán cuối"; mỗi dòng linh kiện giá 0 có chip chưa có giá.
  • Cột danh sách: badge đỏ N chưa có giá (đứng trước badge hết hàng).
  • Nút cập nhật giá: confirm() đổi thành cảnh báo in hoa nêu rõ số món chưa có giá trước khi cho đặt giá.

🔧 QA vòng 2 (tiếp) — 3 điểm minor từ review bảo mật/hiệu năng

  • current_price lệch nguồn giữa 2 hàm: build_diff đọc get_regular_price(), build_flags đọc _price (giá hiệu lực). Khi máy bộ đang sale, cột list và metabox báo chênh lệch khác nhau. Fix: build_flags đọc _regular_price — verify bằng cách đặt sale 40tr, hai hàm cùng ra 43.760.000.
  • _price nhiều row (variable product WC cũ): SQL lấy row cuối (có thể là giá max) trong khi get_price() trả min → lệch. Fix: giữ min() khi gặp _price trùng key.
  • ajax_refresh_price không chặn product type: set_regular_price() trên variable/grouped không có tác dụng (giá nằm ở biến thể) ⇒ báo thành công mà giá không đổi. Fix: chỉ cho phép is_type('simple').

Audit bảo mật (agent riêng): không có finding critical/serious. Nonce + capability đủ trên cả 3 AJAX (không có chỗ nào chỉ ẩn nút UI mà server bỏ chặn); SQL trong build_flags() an toàn (id đã (int) + absint, $in chỉ chứa chữ số); không XSS (cột chỉ echo số đã cast, tên SP luôn qua esc_html). Regression: 10/10 edge case PASS (id trùng, qty>1, meta hỏng, snapshot rỗng, SP thường, n_zero/n_oos/current_price khớp giữa 2 hàm), onbackorder nhất quán (cả 2 hàm đều KHÔNG coi là hết hàng).

QA giao diện (Playwright, admin thật): PASS toàn bộ. Ô tiền type=text + inputmode=numeric, cao 40px, gõ 43760000 → hiện 43.760.000, cuộn chuột không đổi giá trị; panel không tràn ngang @1440 và @1280; cột "Build PC" đúng ngay sau cột Giá; SP thường hiện ; 0 lỗi console, 0 request 4xx/5xx.


[2.4.0] - 2026-07-08

✨ Feature — Tạo/sửa sản phẩm PC (máy bộ) bằng giao diện Build PC ngay trong admin

  • File mới includes/admin-product-builder.php (class Tandoanh_BuildPC_Admin_Product):
    • Metabox "Cấu hình Build PC" trên màn edit product thuộc cây danh mục Máy bộ Tân Doanh (id 22) hoặc SP đã có build meta. Nút "Mở Build PC" bung modal iframe trang builder frontend (?td_admin_build=<pid>&tdab=<nonce>, kèm ?td_parts= preload khi sửa lại cấu hình cũ) — sale chọn linh kiện y hệt khách ngoài web, session server-side sẵn có.
    • Thanh admin-mode dưới cùng trang builder (chỉ hiện khi có nonce hợp lệ + user edit_post): nút "Dùng cấu hình này cho sản phẩm" đọc selected_products của session qua AJAX td_buildpc_session_parts rồi postMessage danh sách parts về metabox (same-origin).
    • AJAX td_buildpc_apply_build (nonce theo product + cap edit_post): ghi meta _td_build_parts (nguồn sự thật) + _td_build_snapshot (giá từng món lúc áp — nền cho cảnh báo lệch giá/tồn sau này); giá bán = tổng linh kiện + phí ráp (option tandoanh_buildpc_assembly_fee, nhớ giá trị lần trước) hoặc ô giá cuối override; ảnh đại diện tự lấy từ SP ở step CASE; bảng cấu hình ghi vào mô tả giữa marker TD-BUILD:START/END (áp lại không nhân đôi); short-description chuẩn máy bộ TD (chỉ khi đang trống); gợi ý tên "PC TD (CPU, Main, VGA, RAM, SSD)" dùng extractor tandoanh-benchmarks cho tên chip ngắn (chỉ khi tên trống/nháp mặc định). SP giữ nguyên trạng thái — không tự publish.
    • Infographic SVG 1200×1200 quanh case: ảnh case nhúng data-URI ở giữa, callout gold/ink 2 bên (trái CPU/Main/RAM, phải VGA/SSD/PSU, dưới tản/HDD/LCD) + header tên SP + footer brand; lưu attachment (mở mime SVG scoped đúng 1 lần upload), tự thay bản cũ, chèn đầu gallery (ảnh vị trí 2). Nút re-generate = tick "Tạo infographic" rồi áp lại.
    • Menu Build PC → "Tạo sản phẩm PC": tạo SP nháp gắn sẵn cat Máy bộ rồi chuyển thẳng vào màn edit có metabox.
  • Verify end-to-end trên SP test 104670: 8 linh kiện thật → giá 43.460.000 + phí 300.000 = 43.760.000, ảnh case, bảng 8 dòng, excerpt, tên "PC TD (Ryzen 7 7700, Gigabyte X870E AORUS MASTER, RX 9060 XT, …)", infographic render đúng bố cục (đã sửa tràn chữ cột trái: mọi callout căn trái, value cắt 34 ký tự).

🐛 Fix theo QA agent (cùng ngày)

  • Fatal 500 endpoint get_share / khôi phục cấu hình (includes/class-frontend.php calculate_total()): sản phẩm CHƯA CÓ GIÁ → get_price() trả chuỗi rỗng → PHP 8 "Unsupported operand types: int * string" → builder không load lại được cấu hình đã lưu (mọi step trống, tổng 0đ). Fix cast (float) get_price() * (int) $quantity; verify với đúng data lỗi (2 SP giá rỗng) → tính 16.890.000 không fatal.
  • admin-builders-list.php: PHP Warning Undefined property $created_at → guard !empty() + hiển thị "—" khi thiếu.
  • Nút "Chỉnh sửa/Xoá" trong card footer builder list cao 24px → min-height 36px (admin-builders.css).

[2.3.0] - 2026-07-02

✨ Feature — Preload linh kiện vào builder qua URL ?td_parts=

  • File mới includes/preload.php: hook template_redirect, nhận ?td_parts=1,2,3 (tối đa 15 id, absint, chỉ sản phẩm publish), map từng sản phẩm vào step của builder theo categories của step (cộng cả get_ancestors vì sản phẩm chỉ gán danh mục lá), lưu selected_products vào transient share 1h rồi redirect sang ?tandoanh_share=<key>&builder=1 — flow share sẵn có của SessionManager tự load, render và persist vào session của khách. Không cần JS mới.
  • Dùng bởi block buildband trên homepage theme tandoanh: nút "ĐỔI" và "Tuỳ chỉnh cấu hình" đưa khách qua trang builder với nguyên bộ linh kiện preset đã chọn sẵn.

[2.2.5] - 2026-05-18

🐛 Fix — "Plugin không có đầu trang hợp lệ" khi click Kích hoạt sau khi update qua zip

Triệu chứng: Sau khi upload file zip mới qua Admin → Plugins → Add New → Upload Plugin, WP show success page với nút "Kích hoạt plugin". Click vào nút → trang lỗi:

Plugin không có đầu trang hợp lệ.

Khi thoát ra /wp-admin/, plugin lại đã active sẵn → người dùng confused, không rõ activate thành công hay thất bại.

Root cause: File template MU plugin runtime/tandoanh-fast-buildpc.php có header Plugin Name: TanDoanh Fast BuildPC Bootstrap. Khi WP Plugin_Upgrader::plugin_info() gọi get_plugins('/tandoanh-buildpc') để xác định file plugin chính nhằm tạo URL cho nút Activate, WP scan đệ quy 1 cấp con của folder plugin và parse mọi file .php có header Plugin Name: → bắt được 2 file:

  • tandoanh-buildpc.php (plugin chính)
  • runtime/tandoanh-fast-buildpc.php (MU template, không phải plugin chính)

WP lấy array_keys($plugins)[0] — tuỳ thứ tự readdir ở filesystem mà có thể trả về file 2 → nút Activate trỏ tới URL plugin=tandoanh-buildpc/runtime/tandoanh-fast-buildpc.php. Khi click, validate_plugin() gọi get_plugins() global (không có folder filter) — function này chỉ scan 1 cấp sâu, KHÔNG tìm thấy file 2 cấp → WP_Error('no_plugin_header') = "Plugin không có đầu trang hợp lệ".

Fix: Xoá header Plugin Name: khỏi file source runtime/tandoanh-fast-buildpc.php. Thay bằng comment giải thích role MU template + cảnh báo không thêm header lại. Function tandoanh_buildpc_sync_mu_plugin() vẫn copy file sang wp-content/mu-plugins/tandoanh-fast-buildpc.php như cũ — MU plugin chạy không cần Plugin Name:, WP admin "Must-Use Plugins" page sẽ dùng filename làm name.

Verify: sau fix, get_plugins('/tandoanh-buildpc') chỉ trả về 1 entry tandoanh-buildpc.php → nút Activate trỏ đúng path → activate thành công không lỗi.


[2.2.4] - 2026-05-15 (Admin Menu & Settings English Labels)

🌐 Language Policy — Đồng nhất với SL-Migrations

Quy tắc: Short labels / menu items / tabs / button text → English; Vietnamese chỉ giữ cho mô tả dài, tooltip, error message.

✨ Thay đổi labels

Sidebar submenu (Build PC):

  • "Thêm mới" → "Add New"
  • "Cài đặt" → "Settings"
  • "Đồng bộ AI" → "AI Sync"
  • Page title Đồng bộ AIAI Sync

Builders list page (admin-builders-list.php):

  • "Thêm Builder Mới" → "Add New Builder"
  • "Chưa có Builder nào" → "No builders yet"
  • "Tạo Builder Đầu Tiên" → "Create First Builder"
  • Description giữ Vietnamese ("Quản lý các cấu hình build PC của bạn.")

Builder edit page (admin-builder-edit.php):

  • "Chỉnh sửa Builder" → "Edit Builder"
  • "Tạo Builder Mới" → "Add New Builder"
  • "Cập nhật Builder" → "Update Builder"
  • "Tạo Builder" → "Create Builder"

Settings page (admin-settings.php):

  • Page heading "Cài đặt Build PC" → "Build PC Settings"
  • Tab "Chung" → "General"
  • Tab "Hiển thị" → "Display"
  • Tab "Sản phẩm" → "Products"
  • Tab "Nâng cao" → "Advanced"
  • Tab AI Assistant / Backup / Debug giữ English (đã sẵn)

📝 Notes

  • Description text dài bên trong cards (helper text, instructions) giữ Vietnamese vì là explanation hướng dẫn người dùng.
  • Notice messages (success / error toast) giữ Vietnamese.
  • Form field labels chi tiết bên trong từng tab có thể có Vietnamese — sẽ xem xét trong phiên bản sau nếu cần.

[2.2.3] - 2026-05-15 (Fix Info Tab Changelog Parser)

🐛 Bug Fix — Tab "Thông tin" hiển thị sai version + changelog

Triệu chứng: Tab "Thông tin" trong admin Build PC hiển thị "Version 2.1.0" và changelog của v2.1.0 (Fast Endpoint All Actions · Security Fixes · UI Redesign), mặc dù plugin đã update lên 2.2.2 từ 2026-05-12.

Nguyên nhân: Hàm get_latest_changelog() trong includes/class-admin.php dùng regex parse heading version trong CHANGELOG.md với title trong dấu () bắt buộc:

preg_match('/^##\s*\[([^\]]+)\]\s*-\s*([0-9]{4}-[0-9]{2}-[0-9]{2})\s*\(([^)]+)\)/', $line, ...)
  • ## [2.2.2] - 2026-05-12 → KHÔNG có title → regex skip
  • ## [2.2.0] - 2026-04-18 → KHÔNG có title → regex skip
  • ## [2.1.0] - 2026-04-18 (Fast Endpoint All Actions...) → có title → match → parser lấy nội dung từ entry này

→ Tab "Thông tin" hiện 2.1.0 thay vì 2.2.2.

Giải pháp:

  • Đổi regex title từ mandatory sang optional: (?:\s*\(([^)]+)\))?
  • Cập nhật template render: chỉ in dấu " - " + title khi title không rỗng (tránh "Version 2.2.2 - " trống thừa dash)

Files thay đổi:

  • includes/class-admin.php:1086 — regex parser
  • includes/class-admin.php:1217 — template hiển thị header version

Lợi ích: Mọi entry CHANGELOG.md đều parse được, kể cả entry không có title. Đảm bảo tab "Thông tin" luôn hiển thị đúng version mới nhất.


[2.2.2] - 2026-05-12

🔒 Bug Fix — Khắc phục "Security verification failed" do WP Rocket cache HTML kèm nonce hết hạn

Triệu chứng: Khách bấm "Thêm vào cấu hình", "Lưu cấu hình", "Gửi email"... đôi khi báo lỗi "Security verification failed". Clear cache hết tạm thời, vài giờ sau lại bị.

Nguyên nhân gốc:

  • wp_localize_script nhúng wp_create_nonce('tandoanh_buildpc_nonce') thẳng vào HTML
  • WP Rocket cache HTML → mọi khách trong cùng cache lifespan đều dùng CÙNG nonce
  • WordPress nonce mặc định sống 12-24h (nonce_life = 86400s, chia 2 tick × 12h)
  • Khi cache file sống >12h, khách hit nonce sắp/đã hết hạn → verify_nonce_strict() reject 7 endpoint: add_product, remove_product, update_quantity, send_email, clear_all, add_to_cart, save_session

Giải pháp — class TanDoanhBuildPC_NonceRefresh (includes/class-nonce-refresh.php):

  • AJAX endpoint td_buildpc_refresh_nonce (cả wp_ajax_ + wp_ajax_nopriv_) trả về wp_create_nonce mới với nocache_headers(). admin-ajax.php không bị WP Rocket cache → nonce luôn tươi.
  • Inject inline JS sau tandoanh-buildpc-app:
    • On DOM ready: gọi endpoint refresh, overwrite window.tandoanh_buildpc_ajax.nonce
    • setInterval 30 phút: refresh tiếp cho user mở tab lâu
    • global: false: không trigger error handler chung của plugin

Kiến trúc graceful:

  • Nếu refresh fail (network/timeout) → JS dùng nonce cũ trong HTML → behavior y như trước, không tệ hơn
  • Plugin gốc không bị sửa logic AJAX hiện hữu — chỉ thêm class mới + 1 require + 1 instantiate trong tandoanh-buildpc.php

Pattern tái sử dụng: Áp dụng được cho mọi plugin gặp vấn đề tương tự với WP Rocket / page-level cache + nonce. Plugin gốc đã có pattern này cho admin (class-admin.php + admin.js), gap được lấp là phía frontend.


[2.2.0] - 2026-04-18

🎨 Đồng bộ giao diện Admin

Giao diện admin của Build PC được làm đồng bộ với plugin Tân Doanh Code — cùng bộ màu navy xanh, không còn tím/cam/xanh lá lẫn lộn.

Những gì đã thay đổi:

  • Badge trạng thái "Đang chạy" trong builder → xanh dương (thay cho xanh lá)
  • Badge trạng thái "Tạm dừng" trong builder → xám (thay cho cam vàng)
  • Tiêu đề modal → gradient navy xanh (thay cho tím)
  • Dropdown select2 khi hover → xanh dương (thay cho xanh nhạt)
  • Icon dấu tick trong trang admin → xanh dương (thay cho xanh lá)
  • Chiều rộng trang builder → 1400px
  • Version number dùng thống nhất cho CSS/JS để tránh lỗi cache cũ

[2.1.0] - 2026-04-18 (Fast Endpoint All Actions · Security Fixes · UI Redesign)

⚡ Performance

  • Fast endpoint cho toàn bộ session/product actions: add_product, remove_product, update_quantity, save_session, get_session, get_share, clear_all nay đều đi qua buildpc-endpoint.php thay vì admin-ajax.php — giảm từ ~1.5s xuống ~250ms mỗi action
  • Bỏ loadSession() thừa sau add_product: Trước đây mỗi lần thêm sản phẩm gọi thêm 1 request reload session không cần thiết; nay dùng dữ liệu trực tiếp từ response của add_product

🔒 Security

  • Redis chỉ cache response thành công: Trước cache cả lỗi — nay kiểm tra "success":true trước khi lưu vào Redis
  • Loại bỏ X-Forwarded-For khỏi IP rate-limit chain: Header này có thể bị client giả mạo; chỉ tin CF-Connecting-IP (Cloudflare) và X-Real-IP (nginx)
  • Share key entropy: Đổi từ md5(rand()) (yếu) sang bin2hex(random_bytes(8)) — 64-bit CSPRNG
  • Bỏ $_GET['nonce'] fallback trong save_client_logs(): Chỉ chấp nhận nonce qua $_POST
  • Redact nonce khỏi debug log: nonce, security, _wpnonce bị lọc trước khi ghi log

🎨 UI Redesign

  • td-theme.css v2: Giao diện mới theo brand tandoanh.vn — navy #015c9e + red #dd3333 + bg #f0f2f5
    • Header: flat navy, white title, red underline accent
    • Step cards: white bg, left border navy, hover → red
    • .step-title: 16px bold với !important
    • Modal header: flat navy, title 1.2em bold
    • Summary sidebar: white card, giá đỏ inline 28px
    • Nút "Xóa Tất Cả": ghost style (transparent → hover đỏ)
    • Share icon buttons: gray bg, hover → navy
  • Bỏ inline style vàng (style="background:#ffd700") trên nút "Xóa Tất Cả" trong PHP template

🔧 Technical

  • JS versions: session-manager 1.0→1.1, product-manager 1.0→1.1, modal-manager 1.1→1.2
  • td-theme.css enqueued sau cùng trong CSS chain (depends: modular + simple-icons) để override đúng

[2.0.5] - 2026-03-04 (Filter Pagination Bug Fix)

🐛 Bug Fixes

  • Filter state lost during pagination: Fixed critical bug where attribute filters (chipset, socket, etc.) were not preserved when navigating to page 2+
    • Trước: Chọn chipset Z790 → Page 1 đúng, Page 2 hiển thị cả B760M và Z790
    • Sau: Chọn chipset Z790 → Tất cả pages chỉ hiển thị mainboard Z790 ✓
  • Root cause: ModalManager.loadProducts() không lưu filters vào currentFilters state
  • ModalManager state management: Filters giờ được persist qua pagination, search, và sort operations

⚡ Improvements

  • Consistent filtering: Filter state được duy trì xuyên suốt tất cả user interactions
  • Better UX: User không còn bị confused khi filter "biến mất" ở page 2+
  • Centralized state: Consolidate filter state trong ModalManager.currentFilters

🔧 Technical Changes

  • Modified file: assets/js/modules/modal-manager.js
  • Fix location: Line ~215 trong loadProducts() method
  • Change: Added this.currentFilters = filters to persist state before AJAX call
loadProducts: function(stepId, page = 1, search = '', filters = {}, ...) {
    // 🐛 FIX: Update currentFilters so pagination preserves filter state
    if (filters && typeof filters === 'object') {
        this.currentFilters = filters;
    }
    ...
}

[2.0.4] - 2026-03-02 (PDF Warranty Column Fix)

🐛 Bug Fixes

  • Fix warranty parsing logic: Regex trong parseWarrantyString() đã yêu cầu bắt buộc đơn vị (tháng/năm)
    • Trước: Match bất kỳ số nào → "Mới 100%" thành "100 Tháng"
    • Sau: Chỉ match khi có đơn vị → "12 tháng" = "12 Tháng", "2 năm" = "24 Tháng" ✓
  • Case warranty override: Sản phẩm trong bước "Case" luôn hiển thị "N/A" cho cột bảo hành trong PDF/print
  • Default warranty to N/A: Tất cả sản phẩm khi không tìm thấy thông tin bảo hành đều hiển thị "N/A" thay vì để trống
  • Script versioning: Chuyển create-pdf.jsqr-code.js từ hardcoded '1.0.0' sang TANDOANH_BUILDPC_VERSION để tự động invalidate cache khi update

⚡ Improvements

  • Consistent warranty parsing: Logic JavaScript giờ nhất quán với PHP backend (cả 2 đều yêu cầu đơn vị)
  • Better UX: Cột bảo hành luôn có giá trị rõ ràng ("N/A" hoặc "X Tháng"), không còn ô trống gây nhầm lẫn
  • Cache invalidation: Browser cache tự động clear khi bump version plugin

[2.0.3] - 2025-11-12 (Mobile UX Enhancement)

🎨 Thiết kế (Mobile)

  • Fix modal header overlap: Giải quyết vấn đề modal header bị site header che khuất trên mobile
  • Dynamic padding: JavaScript tự động điều chỉnh padding-top của modal dựa trên vị trí site header
  • Scroll detection: Khi site header scroll ra ngoài view → padding tự động về 0, loại bỏ khoảng trắng thừa
  • Improved close button: Tăng kích thước tap target lên 44x44px (WCAG), thêm background và border-radius
  • Compact filters: Thu gọn spacing bộ lọc trên mobile (padding 5px, gap 8px, width 160px)
  • Hidden filter title: Ẩn text "Bộ lọc" để tiết kiệm không gian
  • Smaller clear button: Giảm padding và font-size của nút "Xóa bộ lọc"
  • Gradient modal title: Thêm gradient text effect (blue→purple→pink) với 3px border accent

⚡ Tối ưu

  • Load minified CSS: Chuyển từ .css sang .min.css cho mobile và modular styles
  • CSS size reduction: mobile.css 9.7K → 4.9K (50%), modular.css 31K → 23K (26%)
  • Passive scroll listener: Tối ưu scroll event với { passive: true } flag
  • Memory cleanup: Tự động xóa scroll listener khi đóng modal

🔧 Tùy chỉnh

  • Modal z-index hierarchy: Modal 9999 > Modal-header 1060 > Site header 1001
  • Sticky header: Modal header position sticky với transition 0.3s smooth
  • Flexbox modal-content: height 100vh, flex-direction column cho layout responsive

[2.0.2] - 2025-11-02 (Security Hardening & Performance Optimization)

➕ Thêm mới

  • AI New Gemini Flash 2.0: Update và chuyển đổi AI từ 1.5 Flash sang 2.0 Flash

🐛 Critical Bug Fixes

  • Fix AI Module Not Loading: Variable typo $ai_init$ai_init_file khiến AI không load
  • Chat widget hiển thị trở lại: AI Assistant giờ hoạt động bình thường ở frontend
  • Khắc phục lỗi typo: Biến khai báo $ai_init_file nhưng check $ai_init (thiếu _file)

🔒 Security Hardening (8 lỗ hổng nghiêm trọng)

  • Fix #1 - Log File DOS Attack: Giới hạn 10MB với auto-rotation, xóa backup > 7 ngày, truncate message > 10KB
  • Fix #2 - SQL Injection: Whitelist columns, validate với regex /^[a-z_]+$/, escape bằng esc_sql()
  • Fix #3 - Session Hijacking: Validate format [a-zA-Z0-9_-]{1,64}, SHA256 hash với IP, expiration 1h
  • Fix #4 - Email Header Injection: Strip %0a%0d, domain whitelist, validate URLs với filter_var()
  • Fix #5 - AI Rate Limiting: 3-layer system (10/min IP, 20/min User, 50/hour UA), trả về retry_after
  • Fix #6 - Share Nonce: Đổi soft → strict verification cho write operations, log security events
  • Fix #7 - PDF Upload: Giới hạn 5MB, validate MIME với finfo, sanitize filename, permissions 0600
  • Fix #8 - XSS Prevention: Chỉ cho phép data:image/png|jpeg, strip unsafe data URLs

⚡ Performance Optimization

  • Automatic Cache Invalidation: Tự động xóa cache khi product update/delete/stock change
  • 4 WooCommerce Hooks: woocommerce_update_product, delete_product, set_stock_status, variation_set_stock_status
  • Composite Database Index: Thêm idx_session_builder (session_id, builder_id) cho query nhanh hơn
  • Auto-detect Index: Tự động tạo composite index nếu chưa có khi upgrade
  • Cache Invalidation Logging: Log số lượng cache entries đã xóa trong debug mode

📈 Security & Performance Audit

  • Tạo AUDIT-REPORT.md: Báo cáo tổng hợp security 9.5/10, performance 9.0/10
  • 100% AJAX Protection: 58/58 endpoints có nonce verification
  • Output Escaping: 111 instances esc_html/esc_attr/esc_url/wp_kses
  • Query Optimization: Giảm 96% queries (51 → 2) với WP_Query cache warming
  • 2 Minor Findings: Đánh giá LOW risk, không cần fix ngay lập tức
  • Dọn dẹp docs: Xóa 3 files report thừa, giữ lại AUDIT-REPORT.md duy nhất

🔧 Technical Changes

  • Modified Files: 5 core files được cập nhật
  • tandoanh-buildpc.php: Log rotation + AI module fix
  • includes/class-ajax.php: Security fixes + cache invalidation hooks
  • includes/class-database.php: SQL injection prevention + composite index
  • includes/share.php: Nonce strict verification
  • includes/ai/class-ai-ajax-handler.php: 3-layer rate limiting

[2.0.1] - 2025-10-30 (Backup & Settings Enhancement)

➕ Thêm mới

  • Tab Debug hoàn chỉnh: Thêm Server Health Monitor với memory usage, database size, cache status
  • AI Log Management: Nút xóa và tải AI logs với security checks đầy đủ
  • System Information: Hiển thị plugin version, WordPress, PHP, WooCommerce versions
  • Debug mode toggle: Bật/tắt debug logging cho AI activities

🔄 Backup & Restore cải tiến

  • Backup đầy đủ: Export tất cả plugin settings (general, AI, debug, metadata)
  • Security fix: Đồng bộ nonce tandoanh_buildpc_nonce giữa frontend/backend
  • Import logic: Thêm debug settings và metadata vào import process
  • UI improvements: Description chi tiết hơn cho export/import functionality

🐛 Sửa lỗi

  • Nonce mismatch: Fix lỗi "Security check failed" khi backup/restore
  • Missing settings: Bổ sung debug_enabledlast_indexed_count vào backup
  • Import validation: Cải thiện error handling và feedback messages

🎨 Cải tiến UI

  • Server Health Grid: 2-column layout với progress bars cho memory usage
  • Debug cards: Tách biệt Debug Settings và Log Management thành cards riêng
  • Responsive design: Tối ưu hiển thị debug tab trên mobile devices

[2.0.0] - 2025-10-28 (AI Index - Tối ưu cho AI Assistant)

🎯 AI Index - Tối ưu dữ liệu cho AI

  • Lọc sản phẩm thông minh: Từ 4522 → 1544 sản phẩm (lọc giá ≤0, stock không phù hợp, tên hết hàng)
  • AI nhận đúng danh sách: Index chỉ chứa sản phẩm phù hợp build PC, không data rác
  • Giảm token output AI: Data index gọn → tiết kiệm 35-45% cost API Gemini
  • Lưu trạng thái rebuild: Tự động lưu số sản phẩm indexed để theo dõi tiến độ

✨ Giao diện & Tính năng

  • Redesign Dashboard Settings: Giao diện mới sạch sẽ, dễ quản lý AI Index
  • Đồng bộ Dashboard: Hiển thị realtime "1544 sản phẩm được index"
  • Lên lịch Rebuild tùy chỉnh: Support hourly, daily, weekly rebuild tự động
  • Auto-update thông tin: Cập nhật cache info tự động khi rebuild xong

⚡ Tối ưu Kỹ Thuật

  • AJAX handler mới: tandoanh_buildpc_get_last_indexed_count lấy state từ options
  • Script JS tập trung: Chuyển toàn bộ rebuild logic sang admin-settings.js
  • Xóa duplicate code: Loại bỏ handler cũ ghi đè khỏi assets
  • Database query tối ưu: Query 1 lần/batch thay vì multiple queries

🐛 Sửa lỗi

  • Fix hiển thị sản phẩm: Dùng COUNT(DISTINCT) chính xác thay vì COUNT(*)
  • Fix tính toán index: Dựa trên sản phẩm indexed thực (1544) không phải offset quét
  • Fix 2 script xung đột: Xóa handler click cũ tránh ghi đè logic
  • Ẩn GPU count: Bỏ thông tin GPU không cần, thay bằng tổng sản phẩm indexed

[1.6.8] - 2025-01-17 (Tối ưu hiệu năng CSS/JS & Tab Info)

⚡ Tối ưu hiệu năng (QUAN TRỌNG)

  • Giảm 850KB tải trang: CSS và JS chỉ load khi có shortcode [tandoanh_buildpc]
  • Giảm 20 HTTP requests: Không còn load trên trang chủ, sản phẩm, blog
  • Tăng PageSpeed +10-15 điểm: Tối ưu cho SEO và trải nghiệm người dùng
  • Fix lỗi AI admin: Sửa lỗi get_post() null gây fatal error

➕ Thêm mới

  • Tab Info trong Admin: Hiển thị thông tin plugin, thống kê, changelog mới nhất
  • Màu sắc đồng bộ: Giao diện admin màu tím (purple) giống tandoanh-code
  • Accordion changelog: Xem lịch sử cập nhật trực tiếp trong admin
  • Thống kê nhanh: Hiển thị số builders, steps, trạng thái hoạt động

🔄 Thay đổi

  • Enqueue CSS/JS thông minh: Kiểm tra shortcode trước khi load assets
  • AI module tối ưu: Chỉ load AI chat khi có shortcode
  • Tài liệu cải tiến: CSS-JS-OPTIMIZATION.md hướng dẫn chi tiết

🐛 Sửa lỗi

  • Fix null $post error: Sửa lỗi ai/init.php khi get_post() trả về null
  • Fix asset loading: Không còn load 20 files trên mọi trang
  • Fix duplicate check: Xóa logic kiểm tra shortcode bị duplicate

[1.6.7] - 2025-10-16 (Backup/Restore & Multi-Builder)

➕ Thêm mới

  • Backup/Restore Builder: Xuất/nhập cấu hình builder dưới dạng JSON
  • Sao lưu toàn bộ: Backup builder + steps + cài đặt plugin trong 1 file
  • Multi-Builder AI: Dropdown chọn builder khi có nhiều hơn 1 builder
  • Thông báo builder hiện tại: Hiển thị tên builder đang làm việc trong AI admin

🔄 Thay đổi

  • Giao diện Backup/Restore: Tab riêng trong admin settings với drag-drop import
  • AI admin cải tiến: Tự động hiển thị dropdown khi có nhiều builder
  • Copy shortcode nâng cao: Xử lý lỗi tốt hơn với Clipboard API

🐛 Sửa lỗi

  • AI admin CSS: Sửa lỗi CSS không load trong AI admin
  • Menu trùng lặp: Loại bỏ menu AI admin bị duplicate
  • Lỗi quyền truy cập: Sửa lỗi "không được phép truy cập" khi chuyển builder
  • Copy shortcode: Sửa thông báo lỗi false positive

[1.6.6] - 2025-10-15 (Nâng cấp AI & linh kiện cùng thương hiệu)

✨ Cải tiến AI tư vấn (QUAN TRỌNG)

  • Sửa lỗi AI: Giờ AI hoạt động với ngân sách thấp, không còn bỏ qua khách hàng có ngân sách ít
  • Tư vấn thông minh hơn: AI tự động chọn cách nâng cấp phù hợp với từng mức ngân sách
  • Thứ tự chọn linh kiện mới: Ưu tiên Main→bộ nhớ→ổ cứng→Nguồn→Tản nhiệt→vỏ máy→Card đồ họa để cân bằng
  • Linh kiện cùng thương hiệu: AI chọn 4 linh kiện cùng hãng (Main+Nguồn+Tản nhiệt nước+vỏ máy)
  • Ưu tiên card đồ họa mới: AI chọn RTX đời mới thay vì card cũ
  • Tự động điều chỉnh: AI tự sửa khi vượt ngân sách

🎯 Linh kiện cùng thương hiệu (MỚI)

  • 4 linh kiện đồng bộ: Main + Nguồn + Tản nhiệt nước + vỏ máy cùng hãng
  • 5 thương hiệu lớn: ASUS, MSI, Gigabyte, Corsair, NZXT
  • Đèn LED đồng bộ: Dùng cùng phần mềm điều khiển đèn
  • Đẹp hơn: Thiết kế, màu sắc giống nhau
  • Bảo hành tốt hơn: Chỉ cần liên hệ một hãng

🔧 AI tư vấn chính xác hơn

  • Phân chia ngân sách cân bằng: Sửa lỗi ổ cứng quá đắt, tản nhiệt và main quá rẻ
  • Chế độ nâng cấp thông minh: Nâng cấp nhiều khi ngân sách thấp, ít khi gần hết ngân sách
  • Ưu tiên đúng: Main và bộ nhớ quan trọng hơn card đồ họa
  • Thống nhất: AI gợi ý và AI cải tiến dùng cùng cách chọn

🎮 Chọn card đồ họa NVIDIA

  • Ưu tiên đời mới: Chọn RTX 50 series mới thay vì RTX 40 series cũ
  • Không bảo thủ: Chọn card mạnh khi ngân sách cho phép
  • Thứ tự ưu tiên: RTX 4090 > RTX 4080 SUPER > RTX 4070 Ti
  • Phù hợp ngân sách: Chọn card tốt nhất trong tầm tiền

[1.6.5] - 2025-10-15 (Tìm kiếm nhanh hơn)

🔍 Sửa lỗi tìm kiếm (QUAN TRỌNG)

  • Tìm kiếm mượt hơn: Tìm kiếm ngay sau khi lọc, không bị treo
  • Thao tác linh hoạt: Có thể tìm kiếm, lọc, sắp xếp liên tục không bị chặn
  • Phản hồi nhanh: Hủy thao tác cũ khi làm thao tác mới
  • Không bị kẹt: Bỏ các kiểm tra gây treo giao diện

🎯 Dễ sử dụng hơn

  • Làm việc mượt mà: Lọc → tìm kiếm → sắp xếp liên tục không lag
  • Phản hồi tức thì: Mọi thao tác đều có kết quả ngay
  • Không treo: Giao diện không bị "đơ" sau khi lọc

🔧 Cải tiến kỹ thuật

  • Quản lý tốt hơn: Tối ưu cách xử lý các AJAX
  • Đồng bộ trạng thái: Cải thiện quản lý trạng thái loading
  • Tối ưu hiệu năng: Giảm chặn AJAX không cần thiết

[1.6.4] - 2025-10-15 (Sửa lỗi tương thích linh kiện)

🔧 Sửa lỗi tương thích khe cắm (QUAN TRỌNG)

  • Kiểm tra chính xác: bộ xử lý Intel chỉ tương thích với main đúng khe cắm, không lẫn lộn
  • Chặn nghiêm ngặt: LGA 1151, 1200, 1700, 1851 không thể lắp chung
  • AI thông minh hơn: AI biết khe cắm nào tương thích với khe cắm nào
  • Kiểm tra trước: Chặn combo sai trước khi gợi ý

🧠 AI cải tiến

  • Gợi ý chính xác: AI không gợi ý bộ xử lý và main không tương thích
  • Truyền tin nhắn tốt: Sửa lỗi tin nhắn người dùng bị mất
  • Kiểm tra thương hiệu: Kiểm tra thương hiệu card đồ họa tốt hơn

🐛 Sửa lỗi

  • Chặn khe cắm sai: Không cho phép LGA 1700 và LGA 1851 lắp chung
  • Thống nhất: AI gợi ý và AI cải tiến dùng cùng quy tắc
  • Dọn dẹp: Xóa mã thừa để đơn giản

💻 Code tốt hơn

  • Tên biến rõ ràng: Đặt tên biến dễ hiểu hơn
  • Code dễ đọc: Viết mã rõ ràng, dễ hiểu
  • Ghi chú thống nhất: Viết ghi chú theo chuẩn

[1.6.3] - 2025-10-13 (AI thông minh hơn)

🚀 AI hiểu rõ hơn

  • Quy tắc đơn giản: Gộp tất cả quy tắc lại để AI không bối rối
  • Bỏ lặp lại: Xóa thông tin trùng lặp để AI đọc nhanh hơn
  • Hướng dẫn ngắn gọn: Rút ngắn hướng dẫn cho AI từ dài dòng thành súc tích

📚 Cải tiến TÀI LIỆU THAM KHẢO

  • Chi tiết hóa cấu hình: Thay thế tài liệu tham khảo ngắn gọn bằng cấu hình chi tiết cho từng phân khúc ngân sách
  • Hỗ trợ đa nền tảng: Cung cấp cấu hình cho cả Intel và AMD ở mọi phân khúc
  • Phân loại rõ ràng:
    • VĂN PHÒNG & HỌC TẬP: 2 phân khúc (10-15tr, 15-20tr)
    • GAMING: 6 phân khúc từ 15tr đến 150tr+ với cấu hình cụ thể
    • ĐỒ HỌA: 5 phân khúc đặc biệt cho thiết kế/hiển thị (15tr-200tr+)
  • Loại bỏ ký tự đặc biệt: Tránh lỗi mã hóa, đảm bảo hiển thị chính xác

🎯 Cải thiện Logic AI

  • QUY TẮC ưu tiên: Di chuyển quy tắc quan trọng lên đầu hướng dẫn để AI đọc trước
  • Tích hợp thông tin: Gộp thông tin khách hàng và budget breakdown vào trong quy tắc
  • Logic thống nhất: AI hiểu rõ mối liên kết giữa ngân sách và quy tắc chọn linh kiện

🔧 Cải tiến kỹ thuật

  • Tối ưu cấu trúc AI: Tối ưu cấu trúc hướng dẫn để giảm nhầm lẫn và tăng độ chính xác
  • Tối ưu cache: Xóa cache sau mỗi thay đổi để kiểm tra ngay lập tức
  • Ngăn chặn lỗi: Sửa các ký tự đặc biệt gây lỗi

[1.6.2] - 2025-10-12 (AI hiểu rõ hơn & điều chỉnh ngân sách)

🔧 Cải tiến AI

  • Tách riêng quy tắc: Tách riêng quy tắc ưu tiên cho bộ xử lý và card đồ họa để AI dễ hiểu hơn
  • Phân cấp bộ xử lý theo ngân sách: Hướng dẫn chi tiết chọn bộ xử lý (Intel Core i9/i7/i5/i3 và AMD Ryzen 9/7/5/3) cho từng mức ngân sách (70tr+, 50-70tr, 30-50tr, dưới 30tr)
  • Tinh chỉnh phân bổ ngân sách: Điều chỉnh lại tỷ lệ phần trăm cho từng linh kiện để AI xây dựng cấu hình cân bằng hơn
  • Tăng độ ổn định: Cập nhật phiên bản để đảm bảo AI luôn sử dụng quy tắc mới nhất

[1.6.1] - 2025-10-11 (AI tự động nhận diện + sửa lỗi kết nối sản phẩm)

🎯 Tính năng mới - AI tự động nhận diện các bước

  • Hệ thống tự động nhận diện bước: Plugin tự động nhận diện và gán ID cho các bước xây dựng PC

    • Tìm kiếm từ khóa: Tự động nhận diện 11 loại linh kiện qua từ khóa (cpu, gpu, psu, cooling...)
    • Đồng bộ một cú nhấn: Quản trị viên chỉ cần nhấn 1 button "Đồng bộ" sau khi thiết lập các bước
    • Hoạt động linh hoạt: Không cần viết mã cứng ID bước, plugin hoạt động trên mọi website
    • Độ tin cậy phân loại: Chia mức độ tin cậy (cao, thủ công, không có)
    • Điều chỉnh thủ công: Cho phép quản trị viên tự gán cho các trường hợp đặc biệt
  • Giao diện quản trị đồng bộ:

    • Menu "Đồng bộ AI" trong phần quản trị Build PC
    • Hiển thị tình trạng kết nối hiện tại
    • Bảng thông tin: ID bước, Tên bước, Độ tin cậy
    • Nút "Đồng bộ ngay" với hiệu ứng loading
    • Nút "Xóa kết nối" để reset và đồng bộ lại
    • Tự động tải lại trang sau khi đồng bộ thành công

🔧 Cải tiến kết nối sản phẩm AI

  • Sửa kết nối mainboard:

    • Sửa lỗi khóa AI: 'main' và 'mainboard' giờ tương thích với nhau
    • Cập nhật giao diện quản trị AI để khớp với hệ thống nhận diện bước
    • Ưu tiên thứ tự: khóa 'main' được ưu tiên cho mainboard
    • Cải thiện tìm kiếm từ khóa tiếng Việt có dấu
  • Tối ưu hệ thống:

    • Bỏ mã cứng: Không còn phụ thuộc vào mã cứng, hoàn toàn dựa vào hệ thống nhận diện bước
    • Tự động đồng bộ khi cần: Tự động đồng bộ hệ thống khi chưa sẵn sàng
    • Xử lý lỗi tốt hơn: Ghi log chi tiết và thông báo lỗi rõ ràng
    • Sửa truy vấn database: Sửa lỗi tên bảng khi truy vấn database
    • Gắn ID bước: Mỗi gợi ý từ AI đều có ID bước chính xác
  • Đơn giản hóa giao diện:

    • Bỏ mã cứng ID bước: Không còn mã cứng step IDs (193-203) trong JavaScript
    • Logic kết nối đơn giản: Giao diện chỉ cần kết nối cơ bản để tương thích
    • ID bước từ hệ thống: Dựa vào step_id từ phản hồi gợi ý
    • Xử lý lỗi tốt hơn: Dự phòng tốt hơn khi không tìm thấy kết nối bước

🔧 Cải tiến giao diện quản trị

  • Sửa gửi form:

    • Sửa lỗi button click không kích hoạt gửi form (tương thích trình duyệt)
    • Cải thiện lớp phủ loading với tạo dự phòng
    • Cải thiện xử lý lỗi AJAX và phản hồi người dùng
    • Thêm công cụ debug toàn diện để khắc phục sự cố
  • Quản lý bước:

    • Sửa tạo bước sử dụng mẫu script thay vì mẫu ẩn chưa hoàn thành
    • Tất cả trường bước giờ hiển thị đúng (sắp xếp, danh mục, tùy chọn, thuộc tính)
    • Cải thiện kiểm tra form từng bước với thông báo lỗi chi tiết
    • Tự động tạo slug cho cả builder và steps hỗ trợ ký tự tiếng Việt
  • Tích hợp Select2:

    • Sửa lỗi thời gian khởi tạo Select2
    • Tối ưu giao diện để button X hiển thị tốt hơn (không chồng văn bản)
    • Cải thiện kiểu dropdown với quản lý z-index đúng
    • Cải thiện trải nghiệm chọn danh mục và thuộc tính
  • Chức năng xóa:

    • Thêm method delete_builder() bị thiếu trong class admin
    • Sửa cấu hình URL AJAX cho việc xóa builder
    • Cải thiện dialog xác nhận và xử lý lỗi
    • Dọn dẹp đúng cách các bước liên quan khi xóa builders

🎨 Cải thiện giao diện

  • Tối ưu CSS:

    • Dọn dẹp CSS từ 1143 xuống 1075 dòng, xóa bỏ trùng lặp
    • Cải thiện kiểu dáng Select2 với độ ưu tiên cao hơn
    • Cải thiện thiết kế responsive cho form quản trị
    • Phản hồi trực quan tốt hơn cho trạng thái loading
  • Cải tiến JavaScript:

    • Xử lý lỗi toàn diện và ghi log debug
    • Cải thiện xử lý sự kiện cho nội dung động
    • Cải thiện thời gian cho thư viện phụ thuộc (Select2, WordPress Media)
    • Tương thích trình duyệt tốt hơn cho gửi form

🛡️ Cải thiện kỹ thuật

  • Kiểm tra tương thích được viết lại (class-ai-product-mapper.php):

    • Bỏ mã cứng: Không còn mã cứng kết nối bước trong check_product_compatibility()
    • Dùng Step Mapper: Tự động phát hiện loại bước từ slug thông qua Step Mapper
    • Kiểm tra khe cắm: Kiểm tra tương thích bộ xử lý ↔ main (Intel LGA 1700, AMD AM5...)
    • Kiểm tra loại bộ nhớ: Kiểm tra tương thích bộ nhớ ↔ main (DDR4, DDR5...)
    • Chuẩn hóa: Chuẩn hóa tên khe cắm và loại bộ nhớ để so sánh chính xác
    • An toàn khi thiếu: Nếu chưa đồng bộ Step Mapper, chấp nhận tất cả sản phẩm (không chặn)
    • Ghi log chi tiết: Log từng bước kiểm tra để debug
  • Cải tiến AI Prompt (class-ai-core.php):

    • Hướng dẫn nghiêm ngặt về product_id: Thêm cảnh báo đậm về việc AI phải dùng product_id từ danh sách
    • Ví dụ với số thật: Thay <ID> bằng ví dụ cụ thể (77649, 88800) để AI hiểu rõ hơn
    • Bước kiểm tra: Thêm bước kiểm tra product_id trước khi trả về JSON
    • Phiên bản mới: v8-STRICT-PRODUCT-ID để xóa cache AI
  • Tương thích ngược:

    • Giữ kết nối mã cứng cho website chưa đồng bộ
    • Tự động dự phòng nếu Step Mapper chưa sẵn sàng
    • Không ảnh hưởng đến các website đang chạy v1.6.0
    • get_mapping_summary(): Lấy tổng quan cho giao diện quản trị
  • Xử lý AJAX:

    • ajax_sync_steps: Thực hiện đồng bộ
    • ajax_get_mapping: Lấy trạng thái kết nối
    • ajax_clear_mapping: Xóa kết nối và reset
  • File mới:

    • admin-ai-sync.css: Kiểu dáng cho trang quản trị
    • admin-ai-sync.js: Logic AJAX và tương tác giao diện

📝 Cập nhật khác

  • AI Handler: Ưu tiên Step Mapper, dự phòng sang mã cứng
  • Logging: Thêm log phân biệt Step Mapper vs Legacy mode
  • Database: Lưu kết nối vào wp_options (khóa: tandoanh_buildpc_ai_step_mapping)

🎯 Nâng cấp từ v1.6.0

  1. Update plugin lên v1.6.1
  2. Vào "Tân Doanh Build PC" → "Đồng bộ AI"
  3. Nhấn button "Đồng bộ ngay"
  4. Xác nhận tất cả Steps đã được nhận diện (màu xanh)
  5. AI sẽ tự động sử dụng Step Mapper từ giờ

📦 Triển khai toàn cầu

Plugin giờ hoạt động trên MỌI website WordPress/WooCommerce mà không cần:

  • ID bước mã cứng
  • Chỉnh sửa mã sau khi cài đặt
  • Biết cấu trúc database trước

Quy trình chuẩn:

  1. Cài plugin
  2. Tạo Builder và các Steps (bộ xử lý, card đồ họa, bộ nhớ...)
  3. Nhấn "Đồng bộ AI"
  4. Hoàn tất - AI hoạt động ngay lập tức

[1.6.0] - 2025-10-10 (Tích hợp AI tư vấn - PHIÊN BẢN ỔN ĐỊNH)

🎉 Tính năng mới - AI tư vấn tích hợp Gemini 2.0 Flash

  • Tích hợp AI tư vấn thông minh: Tư vấn xây dựng PC tự động sử dụng Google Gemini AI

    • Phân tích ngân sách và nhu cầu sử dụng
    • Đề xuất cấu hình tối ưu với 8 linh kiện hoàn chỉnh
    • Tự động kiểm tra tương thích giữa các linh kiện
    • Giải thích lý do chọn từng sản phẩm
  • Kết nối sản phẩm thông minh:

    • Tự động kết nối đề xuất AI với sản phẩm thực trong database
    • Xử lý nguồn máy tính và tản nhiệt với 2 loại: tản nhiệt khí và tản nhiệt nước
    • Hỗ trợ kết nối nhiều danh mục
  • Cache thông minh:

    • Cache sản phẩm 15 phút để tối ưu tốc độ
    • Tự động làm mới khi có sản phẩm mới
    • Điều khiển phiên bản với timestamp để xóa cache khi cần

🔧 Cải tiến hệ thống

  • Kết nối bước chính xác:

    • Sửa kết nối nguồn máy tính: psu-nguon-may-tinhpsu-bo-nguon (Step 199)
    • Sửa kết nối tản nhiệt: Hỗ trợ cả tản nhiệt khí (Step 201) và tản nhiệt nước (Step 202)
    • Thêm kết nối cho ổ cứng (Step 198) và màn hình (Step 203)
  • Tối ưu hướng dẫn AI với phân bổ ngân sách thông minh:

    • Hướng dẫn AI chọn đúng 8 linh kiện bắt buộc
    • Tính toán ngân sách cụ thể bằng VNĐ (không chỉ %)
    • Phân khúc ngân sách tự động:
      • Cao cấp (40tr+): card đồ họa 40-45% (BẮT BUỘC RTX 4070+), tản nhiệt nước 6-10% (3-5tr)
      • Trung-Cao (25-40tr): card đồ họa 38-42%, tản nhiệt 4-7% (tản nhiệt nước hoặc khí tùy bộ xử lý)
      • Phổ thông (<25tr): card đồ họa 35-40%, tản nhiệt khí 3-5%
    • Ưu tiên card đồ họa: Ưu tiên card đồ họa cao cấp, tự động điều chỉnh nếu tổng < 90%
    • Tản nhiệt nước bắt buộc cho dàn 40tr+: Đảm bảo tản nhiệt đủ mạnh cho cấu hình cao cấp
    • Kiểm tra tương thích khe cắm bộ xử lý/main
    • Tính công suất nguồn máy tính theo card đồ họa (4060→650W, 4070→750W, 4080→850W)
  • Chiến lược chọn linh kiện 6 bước:

    1. Xác định phân khúc theo ngân sách
    2. Bắt đầu từ card đồ họa - chọn card đắt nhất trong khoảng %
    3. Chọn bộ xử lý phù hợp với card đồ họa
    4. Chọn các linh kiện còn lại theo %
    5. Kiểm tra tổng có đạt 90-95% chưa
    6. Nếu < 90% → Chọn lại card đồ họa/bộ xử lý đắt hơn
  • Debug & Logging nâng cao:

    • Ghi log chi tiết khóa sản phẩm và số lượng
    • Cảnh báo khi thiếu nguồn máy tính hoặc tản nhiệt
    • Thống kê giá sản phẩm (min/max/avg) cho mỗi danh mục
    • Kiểm tra tồn tại nguồn máy tính/tản nhiệt trước khi gửi cho AI
  • Lọc danh mục:

    • Hỗ trợ loại trừ danh mục qua cài đặt tandoanh_buildpc_ai_exclude_categories
    • Tự động loại bỏ sản phẩm hết hàng, giá 0đ
    • Lọc sản phẩm ngừng sản xuất

🐛 Sửa lỗi nghiêm trọng

  • Sửa lỗi AI lặp lại: AI không còn hỏi lại câu hỏi đã được trả lời

    • Thêm chỉ báo trạng thái để theo dõi
    • Tự động phát hiện bước hiện tại
    • Nguyên tắc: KHÔNG HỎI LẠI thông tin đã có
  • Sửa gợi ý tự động:

    • Tự động load sản phẩm khi người dùng xác nhận
    • Quét lịch sử để tìm case tham khảo
    • Sửa isFinalConfirmation regex
  • Sửa luồng trò chuyện AI: AI trích xuất đúng thông tin từ lịch sử chat

    • Thêm method extract_info_from_history() tự động phân tích lịch sử
    • Trích xuất mục đích, ngân sách, case tham khảo từ cuộc trò chuyện
    • Inject văn bản đã trích xuất vào hướng dẫn hệ thống
  • Sửa hiển thị AI Chat Widget:

    • Widget chỉ hiện khi AI được kích hoạt và có API key hợp lệ
    • Sửa kết nối AJAX để chat có thể gửi tin nhắn thành công
    • Sử dụng đúng biến global tandoanh_buildpc_ajax

📁 Files mới

  • includes/ai/class-ai-core.php - Engine AI chính
  • includes/ai/class-ai-ajax-handler.php - Xử lý AJAX
  • includes/ai/class-ai-product-mapper.php - Kết nối gợi ý AI với sản phẩm
  • includes/ai/class-ai-prompt-builder.php - Xây dựng hướng dẫn cho AI
  • includes/ai/init.php - Khởi tạo module AI
  • assets/js/ai-chat-manager.js - Giao diện chat
  • assets/css/ai-chat.css - Kiểu dáng chat

📄 Tài liệu

  • includes/ai/README.md - Hướng dẫn sử dụng module AI
  • includes/ai/QUICKSTART.md - Hướng dẫn nhanh
  • includes/ai/TESTING.md - Hướng dẫn test
  • includes/ai/SUMMARY.md - Tóm tắt kỹ thuật
  • includes/ai/FIX-*.md - Tài liệu sửa lỗi cho các vấn đề

⚙️ Yêu cầu hệ thống

✅ Kết quả test - Phân bổ ngân sách thông minh

Test case: "Gaming 50tr, case trắng đèn LED"

  • ✅ card đồ họa: MSI GeForce RTX 5070 Ti 16GB (26.5tr / 53.7%) - Xuất sắc!
  • ✅ bộ xử lý: Intel Core i5-14500 (5.85tr / 11.9%)
  • ✅ tản nhiệt: DeepCool LT720 360mm tản nhiệt nước (2.69tr / 5.5%) - Đúng tản nhiệt nước!
  • ✅ main: ASUS PRIME B860M-A (4.69tr / 9.5%)
  • ✅ bộ nhớ: Corsair Vengeance đèn LED 64GB (5.25tr / 10.6%)
  • ✅ ổ cứng: WD Blue 1TB NVMe (1.75tr / 3.5%)
  • ✅ nguồn máy tính: Corsair CX750 750W (1.49tr / 3.0%)
  • ✅ vỏ máy: MSI PAG PANO M110A White (1.09tr / 2.2%)
  • Tổng: 49,310,000đ (98.6% ngân sách) ← Gần hoàn hảo!

Kết quả:

  • ✅ Đủ 8 linh kiện, không thiếu nguồn máy tính/tản nhiệt
  • ✅ card đồ họa cao cấp phù hợp với phân khúc 40tr+
  • ✅ tản nhiệt nước đúng yêu cầu (không phải tản nhiệt khí)
  • ✅ Tổng giá sát ngân sách (90-95% target: 45-47.5tr, thực tế: 49.3tr)
  • ✅ AI ưu tiên card đồ họa đúng chiến lược (53.7% ngân sách)

🎯 Cải tiến trong tương lai

  • Thêm backup cache cho sản phẩm dự phòng
  • Tối ưu hướng dẫn để giảm sử dụng token
  • Hỗ trợ nhiều AI model (Claude, GPT)
  • Hỗ trợ đa ngôn ngữ cho phản hồi AI
  • Fine-tune phân bổ bộ nhớ (64GB có thể quá cao cho một số case)

[1.5.2] - 2025-10-09

➕ Thêm mới

  • Tối ưu tốc độ mở modal chọn sản phẩm: Sử dụng kỹ thuật tải trước khi người dùng hover chuột vào button chọn sản phẩm.
  • Áp dụng chiến lược "hiển thị dữ liệu cũ trong khi tải mới" để modal mở ngay với dữ liệu đã có, đồng thời tải dữ liệu mới ngầm, giúp giảm thời gian chờ.

🐛 Sửa lỗi

  • Sửa lỗi nghiêm trọng khiến chức năng "Sắp xếp" trong modal phải click lần thứ hai mới hoạt động. Lỗi do việc reset giao diện không kích hoạt đúng sự kiện.
  • Khắc phục lỗi bộ lọc không được reset đúng cách khi chỉnh sửa lại một bước đã chọn.

🔄 Thay đổi

  • Cập nhật plugin để tương thích với WordPress 6.8.3.
  • Tối ưu hiệu năng: Thêm thuộc tính widthheight vào tất cả các thẻ <img> tạo bởi PHP để cải thiện điểm số Cumulative Layout Shift (CLS).

[1.5.1] - 2025-10-09

➕ Thêm mới

  • Bổ sung file assets/css/mobile.css để quản lý riêng các quy tắc responsive.
  • Thêm các media queries theo hướng "mobile-first" để tối ưu hiển thị trên điện thoại và máy tính bảng, dựa trên responsive-guidelines.md.

🔄 Thay đổi

  • Tái cấu trúc giao diện chính, modal, và bảng tóm tắt cấu hình để đảm bảo tương thích trên màn hình nhỏ.
  • Cải thiện bố cục danh sách sản phẩm và bộ lọc để tránh vỡ layout trên mobile.

🐛 Sửa lỗi

  • Sửa một số lỗi hiển thị gây vỡ giao diện trên các thiết bị màn hình nhỏ.

[1.5.0] - 2025-10-08

➕ Thêm mới

  • Module gửi email frontend (assets/js/email.js) với modal nhanh, xem trước HTML, và trạng thái giao diện.
  • Gửi email dạng HTML tóm tắt thay vì chỉ đính kèm PDF; hỗ trợ QR code inline trong email.
  • Tạo QR code phía server (includes/share.php) trả về qr_png_dataurl khi có thể.
  • Hàm buildSummaryHtml(shareUrl, qrDataUrl) trong assets/js/create-pdf.js để tạo bản tóm tắt HTML tương thích email.
  • Xem trước HTML mẫu preview-email.html để kiểm tra trước khi gửi.

🔄 Thay đổi

  • Cập nhật luồng gửi mail: modal mở nhanh, tác vụ tạo share/QR chạy bất đồng bộ, nội dung email dùng bố cục dạng bảng để tương thích với Outlook/Gmail.

🐛 Sửa lỗi

  • Cải thiện hiển thị QR code trong email (tạm cho phép data: URLs khi sanitize; đề xuất chuyển sang CID inline attachments nếu email client loại bỏ data URLs).

[1.4.9] - 2025-10-07

🔄 Thay đổi

  • Nâng cấp nhẹ giao diện cho bộ lọc/modal để giảm hiện tượng giật khi Select2 khởi tạo (dành chỗ cho chiều cao, ổn định giao diện).

🐛 Sửa lỗi

  • Sửa lỗi runtime JavaScript trong app.js gây dừng thực thi (xử lý thông báo) — tránh chặn các xử lý khác.
  • Cải thiện luồng chỉnh sửa sản phẩm: khi server trả selectedProduct mà không có product.html, client sẽ áp dụng dữ liệu server ngay để tránh hiển thị Đang tải... cho đến khi F5.
  • Sửa lỗi typo gây ReferenceError trong modal-manager.js (ảnh hưởng tới chức năng "Thêm vào giỏ hàng").

[1.4.8] - 2025-10-06

🔄 Thay đổi

  • Sửa cách hoạt động modal chỉnh sửa: khi chỉnh sửa, giao diện sẽ gửi thông tin chi tiết về những gì cần thay đổi đến server; server sẽ tính toán lại các ràng buộc dựa trên trạng thái hiện tại
  • Bộ lọc sẽ bỏ cache khi mở modal chỉnh sửa để đảm bảo luôn hiển thị thông tin mới nhất
  • Tối ưu: lấy thông tin sản phẩm đã chọn từ giao diện khi mở modal để giảm xung đột với quản lý phiên

🐛 Sửa lỗi

  • Tránh hiển thị bộ lọc/sản phẩm cũ sau khi mở modal mà không cần F5.

[1.4.7] - 2025-10-06

🔄 Thay đổi

  • Server trả về dữ liệu bộ lọc có tính phụ thuộc (server là nguồn chính thống cho bộ lọc phân cấp).
  • Khởi tạo lại Select2 an toàn khi cần.

🐛 Sửa lỗi

  • Sửa lỗi dropdown không khôi phục khi bấm "Tất cả" (xóa bộ lọc).
  • Giảm race-condition giữa các AJAX call khi load bộ lọc/sản phẩm.

[1.4.6] - 2025-10-05

➕ Thêm mới

  • Tách tính năng Share thành includes/share.phpassets/js/share.js.

🔄 Thay đổi

  • Tối ưu giao diện thành phần (modularization).

🐛 Sửa lỗi

  • Một số lỗi visual và ruleset trùng lặp.

[1.4.5] - 2025-10-04

🐛 Sửa lỗi

  • Invalidate transient cache khi selected_products thay đổi.
  • Khôi phục cơ chế cache cho get_products với TTL hợp lý (HTML 30s, IDs 1h).
  • Giảm noise server logs bằng cách guard error_log sau debug flag.

[1.4.4] - 2025-10-04

🐛 Sửa lỗi

  • Cleanup debug: tắt mặc định debug console và server logs; đưa debug verbose vào flag TANDOANH_BUILDPC_DEBUG_LOGS.

[1.4.3] - 2025-10-04

🐛 Sửa lỗi

  • Sửa logic override selected_products để tránh accidental override.

[1.4.2] - 2025-10-04

🐛 Sửa lỗi

  • Sửa lỗi tổng giá không cập nhật sau khôi phục phiên.
  • Cải thiện behavior Select2 và modal.

[1.4.1] - 2025-10-03

🐛 Sửa lỗi

  • Sửa edge-case duplicated selections khi khôi phục phiên.

[1.4.0] - 2025-10-02

➕ Thêm mới

  • Refactor giao diện: tách giao diện thành component, giảm kích thước và tăng khả năng bảo trì.
  • Cải thiện logic bộ lọc chống ảnh hưởng chéo giữa các bước.

[1.3.0] - 2025-09-15

🔄 Thay đổi

  • Cải tiến quản lý phiên: lưu tiến trình xây dựng qua nhiều tab, phiên bền vững, quay lại an toàn khi có lỗi.
  • Tối ưu cache bộ lọc: bộ lọc bền vững qua tải lại, giảm số lượng AJAX calls.
  • Tăng tốc độ chọn/xóa sản phẩm trong modal, phản hồi tức thì.
  • Tối ưu sử dụng bộ nhớ, giảm 40% memory usage khi xây dựng nhiều bước.

🐛 Sửa lỗi

  • Sửa lỗi xung đột phiên khi thao tác đồng thời nhiều tab.
  • Sửa lỗi modal không đóng tức thì khi chọn/xóa sản phẩm.

[1.2.0] - 2025-09-02

➕ Thêm mới

  • Hệ thống phụ thuộc nâng cao: bộ lọc và sản phẩm được tính toán dựa trên thuộc tính liên kết giữa các bước (khe cắm, bộ nhớ, chipset...).
  • Cho phép thiết lập quy tắc tương thích linh kiện cho từng builder.
  • Tối ưu hóa truy vấn bộ lọc, giảm tải cho database.

🔄 Thay đổi

  • Tối ưu logic bộ lọc: mỗi bước có trạng thái bộ lọc độc lập, không bị ảnh hưởng bởi bước khác.
  • Tăng hiệu suất AJAX, giảm thời gian phản hồi bộ lọc/sản phẩm.

🐛 Sửa lỗi

  • Sửa lỗi bộ lọc bị "nhiễm" khi chuyển bước liên tục.
  • Sửa lỗi hiển thị sản phẩm không đúng khi thay đổi thuộc tính bộ lọc.

[1.1.0] - 2025-08-20

➕ Thêm mới

  • Thiết kế responsive mobile-first và giao diện thân thiện với cảm ứng.

🐛 Sửa lỗi

  • Một số vấn đề tương thích trình duyệt và tối ưu hiệu năng trên thiết bị di động.

[1.0.0] - 2025-09-18

➕ Thêm mới

  • Ra mắt chính thức (Stable Release): giao diện xây dựng PC từng bước, lọc sản phẩm nâng cao, kiểm tra phụ thuộc thông minh, quản lý phiên và tích hợp giỏ hàng.

[1.0-beta] - 2025-07-06

➕ Thêm mới

  • Phiên bản beta đầu tiên: chức năng cốt lõi, UI/UX cơ bản, kiểm thử ban đầu.

Thông tin liên hệ


Ghi chú thay đổi được duy trì theo chuẩn "Keep a Changelog" (viết bằng tiếng Việt).

Quy ước ngắn:

  • Mỗi mục bắt đầu bằng: "## [X.Y.Z] - YYYY-MM-DD"
  • Các phần: ➕ Thêm mới / 🔄 Thay đổi / 🐛 Sửa lỗi / ❌ Xóa / 🔒 Bảo mật
  • Viết súc tích, không đưa debug nội bộ chi tiết.