Files
sys-analysis-design/ba-output/e-commerce/00-index/UICONV_e-commerce_v1.0.md
Leonard-ThindPad-P50 2c7bcde741 improve BA skill
2026-09-09 06:34:57 +07:00

266 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UICONV — Quy ước giao diện — e-commerce
| | |
|---|---|
| **Version** | 1.1 |
| **Date** | 2026-09-08 |
| **Author** | BA (qua skill ba-3-specification, activity `uiconv`) |
| **Status** | 🟡 Draft |
| **Approved by** | Designer: — · PO: — *(dự án chưa có Designer riêng — PO ký thay, xem `DEC-01`)* |
| **Source** | `e-commerce/docs/sections/07-giao-dien.md` (SAD §7 "Thiết kế giao diện", `status: approved`, `version: 1` — coi là **prototype tham chiếu dạng văn bản**, xem `DEC-01` đã sửa) · `e-commerce/docs/sections/02-phan-tich-yeu-cau.md` (NFR-01, NFR-06, NFR-07, FR-15, FR-16) · `02-analysis/BR_CartCheckout_v1.0.md` §3 (vòng đời trạng thái `CART`/`ORDER_SELLER`/`PAYMENT` — nguồn cho Badge trạng thái §11) · `00-index/DECISION_e-commerce.md` (`DEC-01`, `DEC-05`) · `00-index/PROFILE_e-commerce.md` |
| **Scope** | Toàn project — mọi `SRS` và `WF` có `PRODUCT = screen`. Lần chạy này **ưu tiên điền quy ước phục vụ nhóm màn hình Guest/Customer** (`SCR-01`…`SCR-10`, SAD §7.1.1); nhóm Seller/Admin/Ops/CSR (`SCR-16`…`SCR-32`) dùng chung khung §1–§10 nhưng phần điều hướng/menu riêng của họ **chưa được đối chiếu chi tiết** ở lần chạy này — xem ghi chú ở §1 và §12. |
| **Profile** | `screen · greenfield · standard` (xem `00-index/PROFILE_e-commerce.md`) |
## Change Log
| Version | Date | Người sửa | Thay đổi | CR |
|---|---|---|---|---|
| 1.0 | 2026-09-08 | BA (qua skill ba-3-specification, activity `uiconv`) | Bản đầu — sinh từ SAD §7 (prototype dạng văn bản, `SCR-01`…`SCR-32`), NFR-01/06/07, `BR_CartCheckout_v1.0.md` §3. 10 open question mới (`OQ-018`…`OQ-027`) cho các ô "chọn một" mà SAD §7 không nói | — |
| 1.1 | 2026-09-08 | BA (qua skill ba-3-specification, activity `srs`/`wf` — bổ sung §10/§12 theo `SRS_US002-003_v1.0.md`/`WF_US002-003_v1.0.md`) | §10: cập nhật số kế tiếp chưa dùng của dãy `E-CART-` từ `0002` lên `0007` (đã dùng `0002`…`0006` cho US-002/US-003). §12: thêm 2 dòng ngoại lệ đã duyệt — (1) `SCR-04` dùng text riêng "Giỏ hàng trống"/"Tiếp tục mua sắm" thay mẫu chung §6 (đã ghi chú trước, nay chính thức hoá); (2) `SCR-04` sửa số lượng theo mẫu inline auto-save (không có nút Lưu riêng), khác quy ước §4 mặc định | — |
> ⚠️ **Ngoại lệ gate G2** — tài liệu này được sinh trong khi Gate G2 (Solution sign-off) của
> module Giỏ hàng & Checkout **chưa được PO + Tech Lead ký chính thức** (xem `DEC-02`, `DEC-05`
> ở `00-index/DECISION_e-commerce.md`). Ngoại lệ được người điều phối xác nhận rõ ràng. Nếu
> `BACKLOG_CartCheckout`/`BR_CartCheckout` đổi khi G2 ký thật, phải rà lại §11 (từ vựng thành
> phần liên quan Guest checkout) — xem `OQ-027`.
> **Vai trò của tài liệu này.** Một project có nhiều `SRS`, mỗi lần chạy tối đa 3 US. Không có
> tài liệu này thì mỗi `SRS` tự đặt một kiểu phân trang, một vị trí toast, một định dạng ngày.
> `SRS` và `WF` **tham chiếu** mục ở đây thay vì định nghĩa lại; muốn lệch phải ghi vào §12.
>
> **Thứ tự ưu tiên khi lệch:** Design system của dự án (nếu có) > Prototype đã duyệt > `UICONV`
> > `SRS` từng US. `SRS` chỉ được ghi khác `UICONV` khi có dòng ở §12.
---
## 0. Nguồn
| | |
|---|---|
| **Design system** | Chưa có lựa chọn cụ thể. NFR-07 (SAD §2.2) ghi "sử dụng design system chuẩn (VD. Material Design hoặc Ant Design) làm nền tảng giao diện" — **dev chọn, chưa chốt** → `OQ-022`. Quy ước ở tài liệu này là **ràng buộc tối thiểu** (bố cục, trạng thái, text), không phụ thuộc design system cụ thể nào. |
| **Prototype tham chiếu** | `e-commerce/docs/sections/07-giao-dien.md` — SAD §7 "Thiết kế giao diện" (`status: approved`, `version: 1`, ngày duyệt không ghi rõ trong front-matter). Mô tả bố cục dạng văn bản có cấu trúc (mục đích, persona, FR phục vụ, bố cục, 3 trạng thái, validation) cho `SCR-01`…`SCR-32`. **Không phải** Figma/ảnh — không có màu sắc/typography/khoảng cách chính xác (SAD §7.0 xác nhận rõ: "không có brand guideline cố định"). |
| **Guideline sẵn có của dự án** | Không có `GLOBAL_UI_CONVENTION.md` trước đó — đây là bản đầu tiên. |
| **Ai sở hữu quy ước** | BA đề xuất · **Designer duyệt** (dự án không có Designer ⇒ **PO ký thay**, `DEC-01`) · PO duyệt phần text/giọng văn |
| **Nền tảng** | Web responsive (desktop, tablet, mobile-web) — theo SAD §7.0. **Không** có app di động native trong MVP (out-of-scope, xem SAD §1.1). |
## 1. Khung layout
| | |
|---|---|
| **Grid** | 🔴 Chưa chốt — SAD §7 không cho số cột/gutter/max-width cụ thể → `OQ-018` |
| **Header cố định** | **Có** — chứa: logo sàn, thanh tìm kiếm (autocomplete), `LanguageSwitcher` (FR-15), `CurrencyToggle` (FR-16, giá tham khảo), icon giỏ hàng (badge số lượng), icon tài khoản/đăng nhập. *(Nguồn: SCR-01)* |
| **Sidebar / menu** | Nhóm **Guest/Customer**: **Không có** sidebar/menu cố định toàn cục — điều hướng chính qua header (tìm kiếm, tài khoản, giỏ hàng) + mega-menu ngành hàng (SCR-01 Section 2 "điều hướng ngành hàng"). Sidebar/bottom-sheet chỉ xuất hiện **cục bộ** ở màn hình có bộ lọc (SCR-02 — xem §3), không phải điều hướng toàn cục. *(Nhóm Seller có header menu điều hướng riêng — SCR-17: "Sản phẩm, Đơn hàng, Báo cáo, Thông báo"; nhóm Admin tương tự SCR-22 — hai nhóm này **ngoài phạm vi ưu tiên** lần chạy này, chưa được điền chi tiết ở §1–§9, xem §12 khi có lần chạy `uiconv` bổ sung.)* |
| **Footer** | **Có** — chứa: thông tin sàn, chính sách đổi trả, liên kết ngôn ngữ, thông tin tuân thủ (thông báo Bộ Công Thương theo NĐ 52/2013, 85/2021 — NFR-05). *(Nguồn: SCR-01)* |
| Breakpoint | Khoảng (px) | Sidebar | Bảng dữ liệu | Form |
|---|---|---|---|---|
| Desktop | 🔴 `OQ-018` | Bộ lọc hiện cố định trái *(SCR-02)* | N/A cho Guest/Customer — luôn dùng lưới `ProductCard`/`CartItem`, không phải bảng dữ liệu kiểu bảng-hành-chính *(SCR-01, SCR-04)* | 🔴 Số cột form — `OQ-018` |
| Tablet | 🔴 `OQ-018` | 🔴 Chưa chốt — SAD chỉ nói "desktop, tablet, mobile-web" không mô tả riêng hành vi tablet cho bộ lọc → `OQ-018` | Như trên | 🔴 `OQ-018` |
| Mobile | 🔴 `OQ-018` | Bottom-sheet *(SCR-02, nguyên văn: "Sidebar trái (desktop) / bottom-sheet (mobile)")* | Như trên | 🔴 `OQ-018` |
*Ghi chú:* bảng `Bảng → Card` chuyển đổi theo breakpoint (mô tả ở template gốc) áp dụng cho các
màn hình **quản trị** (Seller/Admin, VD SCR-18, SCR-19, SCR-23) dùng bảng dữ liệu thật —
ngoài phạm vi ưu tiên Guest/Customer của lần chạy này.
## 2. Điều hướng
| Câu hỏi | Quy ước |
|---|---|
| Quay lại từ màn hình chi tiết/form | Nút Back **và** breadcrumb — cả hai. *(Nguồn một phần: SCR-02 có breadcrumb "Trang chủ > Ngành hàng > Từ khoá"; nút Back không nói rõ trong SAD — BA đề xuất theo thực hành chung, PO/Dev FE xác nhận ở G3)* |
| Quay lại có giữ trạng thái danh sách (trang, bộ lọc, sắp xếp)? | ✅ Giữ, qua query string — BA đề xuất (SAD không nói), không mâu thuẫn gì đã có |
| Vào bằng URL trực tiếp với id không tồn tại | Trang trạng thái "Không tìm thấy" + nút về danh sách. *(Nguồn: SCR-03 error = "Sản phẩm không tồn tại/đã bị gỡ" + link quay lại danh mục)* |
| Vào bằng URL trực tiếp không có quyền | Trang "Không có quyền" + nút về trang chủ; **không** lộ tên bản ghi — BA đề xuất theo W7, chưa có ví dụ cụ thể trong SAD §7.1.1–7.1.2 nhưng nhất quán với RBAC §4 (`RBAC_CartCheckout_v1.0.md`, che PII) |
| Rời màn hình khi form đang dở | Modal xác nhận "Rời trang? Thay đổi chưa lưu sẽ mất." — BA đề xuất (SAD không nói) |
| Menu với chức năng không có quyền | ❌ Ẩn (W7) |
| Mở chi tiết | Cùng tab, đổi URL. *(Nguồn: luồng 7.2.1 "Tìm kiếm/duyệt danh mục (SCR-02, SCR-03)" mô tả điều hướng tuần tự trong cùng phiên, không có nhắc mở tab mới)* |
## 3. Danh sách
| | |
|---|---|
| **Kiểu phân trang** | 🔴 Chưa chốt — SCR-02 nêu cả "phân trang **hoặc** infinite-scroll", chưa chọn 1 → `OQ-019` |
| **Số dòng mỗi trang** | 🔴 Chưa chốt → `OQ-019` |
| **Sắp xếp mặc định** | 🔴 Chưa chốt — SCR-02 liệt kê tuỳ chọn "giá tăng/giảm, mới nhất, bán chạy" nhưng không nói mặc định là gì → `OQ-019` |
| **Bấm vào dòng** | Bấm vào `ProductCard` → mở chi tiết sản phẩm (SCR-03). *(Nguồn: luồng 7.2.1)*. Không áp dụng khái niệm "dòng bảng" cho Guest/Customer — xem §1 |
| **Cột hành động** | N/A cho lưới `ProductCard` (Guest/Customer). Áp dụng cho bảng quản trị Seller/Admin (SCR-18, SCR-19, SCR-23…) — ngoài phạm vi ưu tiên lần này |
| **Chọn nhiều dòng** | Riêng SCR-04 (Giỏ hàng): checkbox chọn/bỏ chọn **từng `CartItem` hoặc cả nhóm seller** để tính tạm tính — đây là chọn-để-tính-tổng, **không phải** thanh hành động hàng loạt kiểu xoá/duyệt. *(Nguồn: SCR-04)* |
| **Tìm kiếm** | Autocomplete, tối thiểu 1 ký tự trước khi gợi ý; không cho submit tìm kiếm rỗng. *(Nguồn: SCR-01 validation)*. Độ trễ debounce (ms) 🔴 chưa chốt → `OQ-024` |
| **Bộ lọc** | Thanh ngang trên bảng (desktop) · nút "Lọc" mở bottom-sheet (mobile) — tổng hợp từ SCR-02: "Sidebar trái (desktop) / bottom-sheet (mobile): bộ lọc — ngành hàng, khoảng giá, seller, rating, tình trạng còn hàng" *(SAD gọi là sidebar chứ không phải "thanh ngang", đã điều chỉnh nhãn cho khớp — nội dung bộ lọc giữ nguyên theo SAD)* |
| **Cột trên mobile** | N/A — Guest/Customer dùng `ProductCard`/`CartItem` xuyên suốt mọi breakpoint, không có khái niệm "cột bảng → card" (đã là card từ đầu) |
## 4. Form
| | |
|---|---|
| **Vị trí nút** | Lưu/CTA chính (nút chính) **bên phải**, Huỷ (nút phụ) bên trái nút chính — BA đề xuất, SAD không mô tả vị trí nút cụ thể, không mâu thuẫn với các CTA đã liệt kê (VD SCR-05 "Tiếp tục đến thanh toán", SCR-06 "Xác nhận thanh toán") |
| **Đánh dấu bắt buộc** | Dấu `*` màu cảnh báo sau nhãn — BA đề xuất (SAD không mô tả) |
| **Thời điểm validate** | Khi rời field (blur) **và** khi bấm nút chính — BA đề xuất, nhất quán với các validation liệt kê theo từng SCR (VD SCR-08 email đúng định dạng, SCR-09 SĐT đúng định dạng VN) |
| **Vị trí message lỗi** | Ngay dưới field, thay chỗ hint; field viền cảnh báo — BA đề xuất, khớp với mô tả "thông báo inline" xuất hiện nhiều nơi (SCR-05 coupon không hợp lệ, SCR-18 xung đột SKU) |
| **Lỗi nhiều field** | Focus vào field lỗi đầu tiên, cuộn tới nó — BA đề xuất (SAD không mô tả cơ chế UI chi tiết) |
| **Lỗi từ server không gắn field** | Banner đầu form — BA đề xuất, khớp mẫu "banner lỗi" đã dùng ở SCR-01 |
| **Sau lỗi mạng/5xx** | 🔴 **Giữ nguyên dữ liệu đã nhập**, mở lại nút chính — quy tắc bắt buộc theo `writing-rules.md`, áp dụng toàn hệ thống trừ khi SRS ghi khác ở §12 |
| **Đang gửi** | Khoá toàn form, spinner trong nút chính, nhãn đổi "Đang xử lý…". *(Nguồn gần nhất: SCR-06 "Đang xử lý thanh toán..." — không cho thao tác khác, tránh double-submit; SCR-16 "spinner khi upload file (progress bar)")* |
| **Huỷ khi có thay đổi** | Modal xác nhận — BA đề xuất |
| **Nhãn field** | Trên field (không đặt cạnh trái) — BA đề xuất |
| **Nút CTA chính khi form chưa hợp lệ** | 🔴 Chưa chốt — SAD chỉ nói rõ ở cấp **wizard** (SCR-16: "wizard chặn 'Next' nếu bước hiện tại chưa hợp lệ"), không nói cho form thường (VD SCR-08 đăng ký, SCR-09 hồ sơ) → `OQ-021` |
## 5. Phản hồi hệ thống
| Loại | Dùng khi | Vị trí | Thời lượng | Có nút đóng |
|---|---|---|---|---|
| **Toast thành công** | Lưu/xoá thành công | 🔴 Chưa chốt — SAD §7 không dùng khái niệm "toast" ở bất kỳ SCR nào → `OQ-020` | 🔴 `OQ-020` | 🔴 `OQ-020` |
| **Toast lỗi** | Lỗi không gắn field, có thể thử lại | 🔴 `OQ-020` | 🔴 `OQ-020` | 🔴 `OQ-020` |
| **Modal xác nhận** | Hành động không hoàn tác được (huỷ đơn, xoá) | Giữa màn. *(Nguồn: SCR-10 "xác nhận (dialog) trước khi huỷ đơn")* | — | Nút chính bên **phải**; hành động nguy hiểm dùng nút nguy hiểm — BA đề xuất vị trí, hành vi "cần xác nhận" đã có nguồn |
| **Inline dưới field** | Lỗi validation | Dưới field | Tới khi sửa | — |
| **Banner trong vùng** | Lỗi tải một vùng dữ liệu | Trong vùng đó. *(Nguồn: SCR-01 "banner lỗi 'Không tải được dữ liệu, thử lại' + nút retry"; SCR-02, SCR-03, SCR-09, SCR-10, SCR-14, SCR-15 dùng mẫu "lỗi tải + retry" tương tự)* | Tới khi thử lại | Nút Thử lại |
| **Trang trạng thái** | 404 / 403 / lỗi toàn trang | Toàn trang. *(Nguồn: SCR-03 "Sản phẩm không tồn tại/đã bị gỡ" + link quay lại danh mục)* | — | Nút về danh sách/trang chủ |
## 6. Trạng thái chuẩn
| Trạng thái | Hiển thị | Text mặc định (VI) | Text (EN) | Nút |
|---|---|---|---|---|
| Đang tải danh sách | Skeleton lưới/bảng. *(Nguồn: dùng ở hầu hết SCR-01…SCR-15, VD "loading = skeleton lưới sản phẩm/banner")* | — | — | — |
| Đang tải chi tiết/form | Skeleton theo bố cục. *(Nguồn: SCR-03 "loading = skeleton toàn trang")* | — | — | — |
| Đang tải cục bộ (tính lại phí ship/khuyến mãi) | Spinner nhỏ tại chỗ. *(Nguồn: SCR-05 "loading = tính lại phí vận chuyển/khuyến mãi khi thay đổi địa chỉ (spinner cục bộ)")* | — | — | — |
| **Rỗng — chưa có dữ liệu nào** | Minh hoạ + câu dẫn + nút chính | "Chưa có \<đối tượng\> nào." — mẫu quan sát được lặp lại nhiều nơi trong SAD (SCR-03 "Chưa có đánh giá nào", SCR-09 "Chưa có địa chỉ nào", SCR-14 "Chưa có giao dịch điểm thưởng nào", SCR-15 "Không có thông báo nào"). **Hai ngoại lệ đã có text riêng trong SAD, không theo mẫu chung** — giữ nguyên khi viết SRS cho đúng US: SCR-04 "Giỏ hàng trống", SCR-10 "Bạn chưa có đơn hàng nào" | 🔴 Chưa dịch chính thức — BA có thể đề xuất bản dịch EN khi viết SRS, ZH/KO/JA cần biên dịch chuyên nghiệp, không tự dịch → `OQ-023` | Tạo mới / CTA tương ứng (VD "Tiếp tục mua sắm" — SCR-04; "Tạo mới" — SCR-09) |
| **Rỗng — bộ lọc không khớp** | Câu dẫn + nút phụ | "Không tìm thấy \<đối tượng\> phù hợp với bộ lọc." — dựa trên SCR-02 "Không tìm thấy sản phẩm phù hợp" + gợi ý bỏ bớt bộ lọc | 🔴 `OQ-023` | Xoá lọc |
| Lỗi tải | Banner trong vùng | "Không tải được dữ liệu, thử lại." — nguyên văn SCR-01 | 🔴 `OQ-023` | Thử lại |
| Không có quyền | Trang trạng thái | "Bạn không có quyền truy cập nội dung này." — BA đề xuất (SAD không có ví dụ SCR cụ thể cho Guest/Customer, RBAC xử lý ở tầng khác) | 🔴 `OQ-023` | Về trang chủ |
| Không tìm thấy | Trang trạng thái | "Sản phẩm không tồn tại hoặc đã bị gỡ." (mẫu chung: "Không tìm thấy nội dung yêu cầu.") — nguồn SCR-03 | 🔴 `OQ-023` | Về danh sách |
`SRS` §2.3.6 chỉ ghi **phần khác** với bảng này (vd: câu dẫn riêng cho đối tượng), còn lại tham chiếu.
## 7. Ẩn · khoá · read-only *(quy tắc W7)*
| Trạng thái | Trình bày | Bắt buộc kèm |
|---|---|---|
| `❌ ẩn` | Không render | — |
| `🔒 disable` | Mờ 45%, con trỏ mặc định | **Tooltip nêu lý do** khi hover/focus. *(Nguồn hành vi tương tự: SCR-03 "nút chuyển trạng thái 'Hết hàng', disabled" khi SKU hết hàng — SAD xác nhận có dùng disable, không cho chi tiết % mờ/tooltip, phần trình bày cụ thể là đề xuất BA)* |
| `👁 read-only` | Giá trị dạng text, không viền ô nhập, nhãn giữ nguyên. *(Nguồn: SCR-06 "tóm tắt đơn hàng (read-only, tham chiếu từ SCR-05)"; SCR-09 "email (read-only hoặc yêu cầu xác thực lại khi đổi)")* | — |
## 8. Định dạng hiển thị
*`SRS` §4.3 tham chiếu bảng này; chỉ ghi khác khi có dòng ở §12.*
| Loại | Định dạng | Ví dụ | Ghi chú |
|---|---|---|---|
| Ngày | `dd/MM/yyyy` | 30/08/2026 | BA đề xuất theo chuẩn VN, SAD không cho ví dụ cụ thể |
| Ngày giờ | `dd/MM/yyyy HH:mm` | 30/08/2026 14:05 | **Múi giờ hiển thị:** đề xuất UTC+7 cố định (thị trường Việt Nam, giao dịch VND, tuân thủ NĐ 52/2013 — SAD §7.0) — 🔴 **chưa được Tech Lead/PO xác nhận chính thức là không cần hiển thị theo múi giờ địa phương của người dùng nước ngoài dùng EN/ZH/KO/JA**; coi là giả định của lần chạy này, cần xác nhận trước khi SRS dùng |
| Lưu trữ thời gian | ISO-8601 UTC | | Khớp `API` §1 (khi viết) |
| Số | `#,##0` | 1.234.567 | Dấu phân cách: theo chuẩn VN (dấu chấm phân nghìn) — BA đề xuất, SAD không cho ví dụ |
| Tiền (VND — giao dịch chính) | `#,##0 ₫` | 1.234.567 ₫ | Làm tròn: không làm tròn thêm ở cấp hiển thị (VND không có phần thập phân) — theo `BR-CART-09` (`BR_CartCheckout_v1.0.md`) |
| Giá quy đổi tham khảo (đa tiền tệ) | 🔴 Chưa chốt | | Nguồn tỷ giá, tần suất cập nhật, quy tắc làm tròn cho `CurrencyToggle`/`PriceDisplay` (FR-16/NFR-06) — SAD chỉ xác nhận đây là "giá quy đổi tham khảo", không phải giá giao dịch → `OQ-025` |
| Phần trăm | `0,0 %` | 12,5 % | BA đề xuất — dùng cho % hoa hồng (SCR-25), ngoài phạm vi ưu tiên Guest/Customer nhưng dùng chung định dạng |
| Rỗng / null | `—` | | Thống nhất toàn hệ thống — BA đề xuất |
| Số lớn (id, mã đơn) | Hiển thị nguyên văn chuỗi | `order_number`/`sub_order_number` — theo `BR_CartCheckout_v1.0.md` §4.1, đây là khoá nghiệp vụ dạng chuỗi, không phải số kỹ thuật để tính toán | Không format |
## 9. Ngôn ngữ và giọng văn
| | |
|---|---|
| **Ngôn ngữ hỗ trợ** | VI (mặc định) · EN · ZH · KO · JA — theo FR-15/NFR-06 (SAD §2.2, §7.0). Thiếu bản dịch ⇒ hiện **khoá** hay **VI**? 🔴 Chưa chốt → `OQ-023` |
| **Xưng hô** | 🔴 Chưa chốt — SAD §7 không đề cập giọng văn → `OQ-026` |
| **Thông điệp lỗi** | Nói **vì sao** và **làm gì tiếp**; không mã kỹ thuật; kết thúc bằng dấu chấm. *(Nguồn nhất quán với các ví dụ SAD: SCR-01 "Không tải được dữ liệu, thử lại", SCR-06 "thông báo lý do + nút 'Thử lại' hoặc 'Chọn phương thức khác'")* |
| **Nhãn nút** | Động từ, viết hoa chữ đầu — khớp các CTA đã liệt kê trong SAD: "Thêm vào giỏ", "Tiến hành Checkout", "Xác nhận thanh toán", "Tiếp tục mua sắm" |
| **Tiêu đề màn hình** | Danh từ — khớp SCR-04 "Giỏ hàng của bạn" (có xưng "bạn" — mâu thuẫn tiềm ẩn với `OQ-026` chưa chốt, cần thống nhất khi trả lời) |
| **Độ dài nhãn tối đa** | 🔴 Chưa chốt (ký tự) — SAD chỉ cảnh báo định tính "ZH/KO/JA cần rà soát độ dài chuỗi dịch có thể dài hơn, layout co giãn được" → `OQ-023` |
| **Khoá i18n** | `<scr>.<thành phần>.<thuộc tính>` — vd `scr01.search.ph` — quy ước kỹ thuật do BA đề xuất, Dev FE áp dụng, không cần PO duyệt |
## 10. Dãy mã lỗi
| Dãy | Module / phạm vi | Số kế tiếp chưa dùng | Ai cấp |
|---|---|---|---|
| `E-CART-` | Giỏ hàng & Checkout (RQ-001…RQ-004) | `0007` — `E-CART-0001` đã dùng cho `BR-CART-02` (giữ tồn kho khi checkout, `BR_CartCheckout_v1.0.md` §2); `E-CART-0002`…`0006` đã dùng cho US-002/US-003 (`SRS_US002-003_v1.0.md` §4.1) | BA |
*Các module khác (Catalog, Seller, Admin, Payout, Khuyến mãi/Loyalty…) chưa có `SRS`/`BR` viết
tới ở GĐ3 — sẽ đăng ký dãy mã khi module đó chạy `ba-3-specification`.*
## 11. Từ vựng thành phần
*`WF` §3.x.2 cột "Kiểu trình bày" chỉ dùng từ ở cột đầu. Cột thứ hai map sang design system khi có (🔴 `OQ-022` — design system chưa chọn, để trống).*
| Kiểu trình bày | Component trong design system | Dùng khi |
|---|---|---|
| Nút chính | 🔴 `OQ-022` | Một hành động chính mỗi màn hình (VD "Tiến hành Checkout" — SCR-04) |
| Nút phụ | 🔴 `OQ-022` | Huỷ, hành động thứ cấp |
| Nút nguy hiểm | 🔴 `OQ-022` | Xoá, huỷ đơn — luôn kèm modal xác nhận (SCR-10) |
| Liên kết | 🔴 `OQ-022` | Điều hướng trong text (VD "Theo dõi đơn hàng" — SCR-07) |
| Ô nhập | 🔴 `OQ-022` | |
| Ô nhập số | 🔴 `OQ-022` | Số lượng sản phẩm (SCR-03, SCR-04) |
| Chọn 1 | 🔴 `OQ-022` | Phương thức thanh toán (SCR-06: "radio group") — ≤ 7 lựa chọn |
| Chọn nhiều | 🔴 `OQ-022` | Checkbox chọn `CartItem` (SCR-04) |
| Chọn ngày / khoảng ngày | 🔴 `OQ-022` | |
| Công tắc | 🔴 `OQ-022` | |
| Bảng | 🔴 `OQ-022` | Desktop — chủ yếu dùng ở màn hình quản trị Seller/Admin, ngoài ưu tiên lần này |
| Card | 🔴 `OQ-022` | `ProductCard` (SCR-01, SCR-02, SCR-03, SCR-12), `CartItem` (SCR-04) — dùng xuyên suốt mọi breakpoint cho Guest/Customer, không chỉ trên mobile |
| Badge trạng thái | 🔴 `OQ-022` | Trạng thái vòng đời — xem bảng ánh xạ chi tiết bên dưới |
| Tab | 🔴 `OQ-022` | Đăng nhập/Đăng ký (SCR-08); Thông tin cá nhân/Sổ địa chỉ (SCR-09) |
| Modal | 🔴 `OQ-022` | Xác nhận huỷ đơn (SCR-10) |
| Drawer | 🔴 `OQ-022` | |
| Bottom-sheet | 🔴 `OQ-022` | Bộ lọc trên mobile (SCR-02) |
| Toast | 🔴 `OQ-022` + `OQ-020` (vị trí/thời lượng chưa chốt) | §5 |
| Skeleton | 🔴 `OQ-022` | §6 |
| `LanguageSwitcher` | 🔴 `OQ-022` | Component riêng của dự án (FR-15) — cố định ở header, mọi màn hình |
| `CurrencyToggle` / `PriceDisplay` | 🔴 `OQ-022` | Component riêng của dự án (FR-16) — hiển thị giá VND + giá quy đổi tham khảo, mọi nơi có giá |
### 11.1 Badge trạng thái — ánh xạ theo vòng đời (nguồn: `BR_CartCheckout_v1.0.md` §3)
*Chỉ mô tả **nhãn hiển thị** và **nhóm ý nghĩa màu** (không có hex cụ thể — SAD §7.0 xác nhận
dự án không có brand guideline; hex/màu chính xác thuộc `OQ-022` khi chọn design system).*
| Thực thể | Trạng thái kỹ thuật | Nhãn hiển thị (VI, đề xuất) | Nhóm ý nghĩa màu | Nguồn |
|---|---|---|---|---|
| `CART` | `active` | "Đang hoạt động" | Trung tính | `BR_CartCheckout_v1.0.md` §3 |
| `CART` | `converted` | "Đã chuyển thành đơn" | Thành công | nt |
| `CART` | `abandoned` | "Bỏ quên" | Trung tính/cảnh báo nhẹ | nt |
| `ORDER_SELLER` *(đoạn khởi tạo)* | `pending` | "Chờ thanh toán" | Cảnh báo | nt |
| `ORDER_SELLER` *(đoạn khởi tạo)* | `confirmed` | "Đã xác nhận" | Thành công | nt |
| `ORDER_SELLER` *(đoạn khởi tạo)* | `cancelled` | "Đã huỷ" | Lỗi/trung tính | nt |
| `PAYMENT` | `pending` | "Chờ xử lý" | Cảnh báo | nt |
| `PAYMENT` | `success` | "Thành công" | Thành công | nt |
| `PAYMENT` | `failed` | "Thất bại" | Lỗi | nt |
🔴 **Chưa đầy đủ để SRS dùng trực tiếp:** vòng đời đầy đủ của `ORDER_SELLER` sau `confirmed`
(packed/shipped/delivered/returned…) thuộc module Quản lý đơn hàng (FR-08/FR-19), **ngoài
phạm vi** module Giỏ hàng & Checkout — SRS của module đó phải bổ sung nhãn cho các trạng thái
còn lại (khớp danh sách filter đã có ở SCR-10: "Chờ xác nhận, Đang xử lý, Đang giao, Đã giao,
Đã huỷ, Yêu cầu đổi trả" — **các nhãn này chưa được đối chiếu 1-1 với state machine `BR` ở GĐ2**,
cần rà khi viết SRS US-004 trở đi). `Payment.status` khi COD (ghi `success` ngay hay giữ
`pending`) **chưa chốt** — xem `OQ-013` (đã mở từ GĐ2, chưa đóng).
## 12. Ngoại lệ đã duyệt
*`SRS`/`WF` lệch quy ước ⇒ phải có dòng ở đây. Không có dòng ⇒ lệch là lỗi, không phải quyết định.*
| # | Tài liệu | Mục lệch | Quy ước | Thực tế | Vì sao | Ai duyệt | Ngày |
|---|---|---|---|---|---|---|---|
| 1 | `SRS_US002-003_v1.0.md` §2.A.3.6, `WF_US002-003_v1.0.md` §3.1.3 | §6 Trạng thái chuẩn — "Rỗng, chưa có dữ liệu nào" | "Chưa có \<đối tượng\> nào." | "Giỏ hàng trống" + nút "Tiếp tục mua sắm" | Text nguyên văn đã có sẵn trong SAD §7.1.1 SCR-04 (nguồn duyệt sẵn), giữ nguyên để không tạo hai phiên bản câu chữ cho cùng một khái niệm | PO (thay Designer, `DEC-01`) | 2026-09-08 |
| 2 | `SRS_US002-003_v1.0.md` §2.A.3.1 (F01), `UICONV` §4 | §4 Form — "Vị trí nút Lưu... Thời điểm validate: khi rời field và khi bấm Lưu" | Không có nút "Lưu" riêng — mỗi lần đổi số lượng (F01) gửi `PATCH` ngay lập tức (auto-save) | Số lượng trong giỏ hàng là thao tác tần suất cao, chỉ một field; mẫu "inline edit" tránh người dùng phải nhớ bấm Lưu cho từng dòng trong danh sách nhiều dòng | PO (thay Designer, `DEC-01`) | 2026-09-08 |
## 13. Open Questions
| ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì |
|---|---|---|---|---|
| OQ-018 | Ngưỡng breakpoint theo px cho desktop/tablet/mobile-web, và grid layout (số cột, gutter px, max-width px) toàn site | Dev FE / Tech Lead | 2026-09-08 | §1 |
| OQ-019 | Kiểu phân trang, số dòng/trang, tiêu chí sắp xếp mặc định cho danh sách sản phẩm (SCR-02) và lịch sử đơn hàng (SCR-10) | PO, Dev FE | 2026-09-08 | §3 |
| OQ-020 | Vị trí và thời lượng hiển thị toast thông báo | PO, Dev FE | 2026-09-08 | §5, §11 |
| OQ-021 | Nút CTA chính khi form chưa hợp lệ: bấm được rồi hiện lỗi, hay khoá (disable)? | PO, Dev FE | 2026-09-08 | §4 |
| OQ-022 | Chọn design system cụ thể (Material Design hay Ant Design) | Tech Lead | 2026-09-08 | §0, §11 |
| OQ-023 | Ngôn ngữ thiếu bản dịch: khoá hay fallback VI? Độ dài nhãn tối đa (ký tự)? Bản dịch EN/ZH/KO/JA cho các text mặc định ở §6 | PO, Dev FE (và cần đơn vị biên dịch cho ZH/KO/JA) | 2026-09-08 | §6, §9 |
| OQ-024 | Độ trễ debounce (ms) cho gợi ý autocomplete tìm kiếm | Dev FE | 2026-09-08 | §3 |
| OQ-025 | Quy tắc quy đổi tiền tệ tham khảo: nguồn tỷ giá, tần suất cập nhật, làm tròn | PO, Tech Lead | 2026-09-08 | §8 |
| OQ-026 | Xưng hô trong toàn bộ text hệ thống ("bạn" hay không xưng hô) | PO | 2026-09-08 | §9 |
| OQ-027 | 🔴 Ngoại lệ gate G2 chưa ký — ảnh hưởng tới §11 (Guest checkout) nếu `BACKLOG`/`BR` đổi khi ký G2 thật | PO, Tech Lead | 2026-09-08 | Baseline `UICONV` |
---
## Tự chấm
| # | Tiêu chí | ☐/✅ |
|---|---|---|
| 1 | Mọi ô "chọn một" đã chọn, không còn dấu `/` giữa các phương án | ☐ — 10 ô còn mở, mỗi ô có `OQ` tương ứng (§1, §3, §4, §5, §9), **không tự chọn** theo đúng chỉ đạo |
| 2 | §6 có hai trạng thái rỗng **trông khác nhau** | ✅ — "Rỗng — chưa có dữ liệu nào" (minh hoạ + nút chính, VD "Tạo mới"/"Tiếp tục mua sắm") khác "Rỗng — bộ lọc không khớp" (không minh hoạ, nút phụ "Xoá lọc"), theo đúng mẫu SCR-02 |
| 3 | §8 có múi giờ hiển thị và quy tắc làm tròn tiền | 🟡 — múi giờ đề xuất UTC+7 nhưng **chưa xác nhận chính thức** (đánh dấu 🔴 trong bảng); làm tròn VND đã có (không làm tròn thêm); làm tròn tiền quy đổi tham khảo **chưa chốt** (`OQ-025`) |
| 4 | §11 mọi kiểu trình bày dùng trong `WF` hiện có đều có dòng | ✅ — `WF_US002-003_v1.0.md` (SCR-04) chỉ dùng: Nhãn, Nút chính, Nút phụ, Nút nguy hiểm, Ô nhập số, Card, Modal, Badge trạng thái — cả 8 kiểu đều đã có dòng ở §11 |
| 5 | Có chữ ký Designer (hoặc ghi rõ dự án không có Designer ⇒ PO ký thay, `DEC-nn`) | ✅ — dự án không có Designer, PO ký thay theo `DEC-01` (đã sửa nội dung ở v1.2, giữ nguyên phần này); **chữ ký thật chưa có** — `Approved by` vẫn để trống, chờ PO ký ở G3 |