Files
sys-analysis-design/ba-output/e-commerce/03-specification/NFR_US002-003_v1.0.md
Leonard-ThindPad-P50 2c7bcde741 improve BA skill
2026-09-09 06:34:57 +07:00

125 lines
9.7 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.

# NFR — Yêu cầu phi chức năng — US-002, US-003 (SCR-04 Giỏ hàng)
| | |
|---|---|
| **Version** | 1.0 |
| **Date** | 2026-09-08 |
| **Author** | BA (qua skill ba-3-specification) |
| **Status** | 🟡 Draft |
| **Approved by** | Tech Lead: — |
| **Source** | `SRS_US002-003_v1.0.md` · `e-commerce/docs/sections/02-phan-tich-yeu-cau.md` (NFR-01…08) · `e-commerce/docs/sections/04-api-design.md` §4.1.1, §4.2 (ownership, rate limit, Guest session) · `RBAC_CartCheckout_v1.0.md` §5 |
| **Scope** | US-002, US-003 — màn hình `SCR-04` Giỏ hàng |
---
## Quy tắc
Mỗi NFR bắt buộc ba thứ: **con số đo được** · **điều kiện đo** · **cách verify**. Con số chưa
có nguồn ⇒ ghi 🔴 + `OQ-nnn`, không tự đặt.
---
## 1. Hiệu năng — `NFR-PERF-nn`
| ID | Yêu cầu | Ngưỡng | Điều kiện đo | Cách verify | Ai chốt |
|---|---|---|---|---|---|
| NFR-PERF-01 | Thời gian tải giỏ hàng (`GET /v1/cart`) | 🔴 chưa chốt riêng cho US-002/003 — SAD NFR-01 chỉ có ngưỡng cho danh mục/tìm kiếm (<2s) và checkout (<3s); BA đề xuất áp cùng ngưỡng danh mục (≤2s p95) vì cùng là thao tác đọc — xem `OQ-033` | 🔴 chưa xác nhận số `CartItem` tối đa/giỏ để đo (đề xuất ≤50 dòng, chưa có số liệu vận hành — `greenfield`) | k6 kịch bản tải `GET /v1/cart` | Tech Lech (chờ xác nhận) |
| NFR-PERF-02 | Thời gian phản hồi sửa số lượng / xoá (`PATCH`/`DELETE /v1/cart/items`) | 🔴 chưa chốt — BA đề xuất ≤1s p95 (thao tác ghi 1 dòng, đơn giản hơn checkout) — xem `OQ-033` | 1 người dùng, 1 request | k6 kịch bản `PATCH`/`DELETE` đơn lẻ | Tech Lead (chờ xác nhận) |
🔴 **Không tự đặt số khi PO/Tech Lead chưa xác nhận** — hai dòng trên chỉ là **đề xuất** của BA
dựa trên phép loại suy từ NFR-01 của SAD, không phải giá trị đã chốt. Xem `OQ-033`.
## 2. Dung lượng & tăng trưởng — `NFR-CAP-nn`
| Đại lượng | Hiện tại | Sau 1 năm | Sau 3 năm | Nguồn số liệu |
|---|---|---|---|---|
| Số `CartItem` trung bình/tối đa mỗi giỏ hàng | N/A — `greenfield`, chưa vận hành | 🔴 chưa có số liệu | 🔴 chưa có số liệu | Chưa có — cần đo sau go-live (không phải việc của GĐ3) |
| Số giỏ hàng đồng thời (giờ cao điểm) | N/A | 🔴 chưa có | 🔴 chưa có | Tham chiếu `BRIEF_CartCheckout_v1.0.md` §2 quy mô "large" — chưa có con số cụ thể cho riêng module Giỏ hàng |
**N/A theo `LIFECYCLE = greenfield`** — không có dữ liệu vận hành cũ để ước lượng tăng trưởng
(nhất quán với `IMPACT_CartCheckout_v1.0.md` §1.6). Ghi nhận, không bỏ trống im lặng.
| Giờ cao điểm | Khi nào | Vì sao |
|---|---|---|
| 🔴 chưa xác nhận | *(đề xuất tham khảo: giờ tối, cuối tuần, mùa sale — theo mô hình marketplace bán lẻ thông thường, chưa có số liệu thật)* | Chưa vận hành để có dữ liệu thật |
## 3. Bảo mật & quyền riêng tư — `NFR-SEC-nn`
| ID | Yêu cầu | Chi tiết | Căn cứ | Cách verify |
|---|---|---|---|---|
| NFR-SEC-01 | Mọi `PATCH`/`DELETE` cart item kiểm tra quyền sở hữu (chống IDOR) | Đối chiếu `customerId`/`sellerId` trong JWT (Customer) hoặc `session_id` (Guest — cơ chế cụ thể chờ `OQ-032`) với chủ sở hữu `CartItem`; không khớp → `403 ERR_FORBIDDEN_OWNERSHIP` | `e-commerce/docs/sections/04-api-design.md` §4.1.1 | Test gọi thẳng API với token/session không phải chủ sở hữu — `AC-US003-12`, `13` |
| NFR-SEC-02 | Định danh Guest (`X-Guest-Session-Id`) không lộ qua kênh không an toàn | Cookie `HttpOnly; Secure; SameSite=Lax` (theo SAD §4.1.1) — SRS này chỉ tham chiếu, không định nghĩa lại thiết kế kỹ thuật | `e-commerce/docs/sections/04-api-design.md` §4.1.1 | Kiểm tra thuộc tính cookie trên môi trường staging |
| NFR-SEC-03 | Giới hạn tần suất gọi (rate limit) cho `PATCH`/`DELETE /v1/cart/items` của Guest | Theo IP nguồn, ngưỡng cụ thể do SAD định nghĩa ở tầng kỹ thuật (không phải quyết định của SRS này) | `e-commerce/docs/sections/04-api-design.md` §4.2 | Tham chiếu, không kiểm thử ở phạm vi BA |
**Rà bốn câu:**
| Câu hỏi | Trả lời |
|---|---|
| Có thông tin cá nhân không? Loại nào? | Không — `CartItem` chỉ chứa `product_variant_id`, `seller_id`, `quantity`; không có PII của khách trong phạm vi US-002/US-003 |
| Lưu bao lâu? Xoá thế nào khi hết hạn? | Theo vòng đời `Cart` — `BR_CartCheckout_v1.0.md` §3 (Guest 7 ngày, Customer 30 ngày theo `05-thiet-ke-du-lieu.md` §5.3, **chưa được Tech Lead xác nhận áp dụng đúng số này cho module**, xem `BACKLOG` US-001) |
| Ai được xuất ra ngoài hệ thống? | Không áp dụng — không có chức năng xuất dữ liệu giỏ hàng trong US-002/US-003 |
| Có quy định pháp luật nào áp dụng không? | Không trực tiếp — dữ liệu giỏ hàng chưa phải giao dịch tài chính (khác `Order`/`Payment`, thuộc NFR-05) |
## 4. Lưu vết — `NFR-AUD-nn`
| Nhóm | N/A vì |
|---|---|
| Lưu vết (audit log) cho sửa/xoá `CartItem` | Đây là thao tác tự phục vụ trên dữ liệu **tạm thời** trước khi đặt hàng, không phải giao dịch tài chính — theo `RBAC_CartCheckout_v1.0.md` §5, yêu cầu ghi vết chỉ bắt buộc từ bước tạo `Order`/`Payment` trở đi (US-004 trở lên). Sửa/xoá `CartItem` không cần audit log riêng ở US-002/US-003 |
## 5. Khả dụng & xử lý sự cố — `NFR-AVL-nn`
| ID | Yêu cầu | Ngưỡng | Ghi chú |
|---|---|---|---|
| NFR-AVL-01 | Hành vi khi Cart & Order Service lỗi/chậm khi tải giỏ hàng | Banner lỗi + nút "Thử lại" (không tự động retry lặp lại) | Đã có AC — `AC-US002-03` |
| NFR-AVL-02 | Hành vi khi Cart & Order Service lỗi/chậm khi sửa/xoá | Banner lỗi tại dòng, giữ nguyên dữ liệu trước đó, mở lại nút | Đã có AC — `AC-US003-09`, `10` |
**Hệ thống ngoài lỗi thì nghiệp vụ này làm gì?**
| Hệ thống ngoài | Nếu lỗi/chậm | Người dùng thấy gì | Dữ liệu xử lý sao |
|---|---|---|---|
| Catalog & Inventory (nội bộ — cung cấp tên/ảnh/biến thể sản phẩm hiển thị ở C03–C06) | Chậm/không phản hồi khi tải giỏ hàng | 🔴 chưa xác nhận: chặn hoàn toàn tải giỏ hàng, hay hiển thị giỏ hàng với các trường thiếu (VD ảnh trống, tên "—")? | Chưa xác định — cần Tech Lead xác nhận SLA nội bộ giữa Cart & Order Service và Catalog Service (tương tự khoảng trống đã ghi ở `IMPACT_CartCheckout_v1.0.md` §1.5). Ghi nhận là khoảng trống, không tạo `OQ` mới trùng lặp — thuộc phạm vi `IMPACT` đã có |
## 6. Đa ngữ & định dạng — `NFR-I18N-nn`
| Khía cạnh | Yêu cầu | Ghi chú |
|---|---|---|
| Ngôn ngữ hỗ trợ | VI (mặc định), EN đầy đủ ở SRS §4.2; ZH/KO/JA để trống — `OQ-023` (đã mở ở `UICONV`) | Tham chiếu `UICONV` §9 |
| Múi giờ hiển thị | N/A — SCR-04 không hiển thị trường thời gian nào | — |
| Định dạng ngày | N/A — không áp dụng cho SCR-04 | — |
| Dấu phân cách số | Theo `UICONV` §8 (`#,##0 ₫`) | — |
| Đơn vị tiền | VND, không đổi tiền tệ giao dịch; giá quy đổi tham khảo (`CurrencyToggle`) — chưa xác nhận có hiển thị ở SCR-04 hay không, mức độ thấp, không chặn G3, ghi nhận cho Dev FE tham khảo `UICONV` §0 | — |
| Sắp xếp chuỗi có dấu | N/A — không có sắp xếp theo tên trên SCR-04 (chỉ nhóm theo seller, thứ tự nhóm — xem `SRS` §2.A.3.2) | — |
| Độ dài text sau khi dịch | Tên sản phẩm/seller dài hơn ở ZH/KO/JA so với VI — layout co giãn theo `UICONV` §0, không fix-width | Tham chiếu `UICONV` §0 |
## 7. Khả năng truy cập & thiết bị — `NFR-ACC-nn`
| Khía cạnh | Yêu cầu |
|---|---|
| Trình duyệt hỗ trợ | Tham chiếu `UICONV` — chưa có bảng ma trận trình duyệt riêng, N/A ở mức SRS này |
| Kích thước màn hình nhỏ nhất | Tham chiếu `UICONV` §1 — breakpoint mobile < 768px (giá trị cụ thể `OQ-018`, đã mở) |
| Dùng trên điện thoại không | Có — web responsive (theo SAD §7.0) |
| Thao tác bằng bàn phím | 🔴 chưa xác nhận thứ tự focus cho F01/C07 — mức độ thấp ở `RIGOR = standard` (chỉ bắt buộc đủ ở `strict`), không chặn G3, ghi nhận cho Dev FE |
| Tương phản màu | N/A ở mức BA — thuộc thiết kế visual (`OQ-022`, design system chưa chọn) |
---
## 8. Nhóm không áp dụng
| Nhóm | N/A vì |
|---|---|
| Lưu vết (`NFR-AUD`) | Xem §4 — thao tác tự phục vụ trên dữ liệu tạm thời, không phải giao dịch tài chính |
## 9. Open Questions
| ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì |
|---|---|---|---|---|
| OQ-033 | Ngưỡng thời gian phản hồi (p95) cho `GET /v1/cart` và cho `PATCH`/`DELETE /v1/cart/items` là bao nhiêu giây? | PO, Tech Lead | 2026-09-08 | NFR-PERF-01, NFR-PERF-02 |
## 10. Xác nhận
| Vai trò | Người | Nội dung xác nhận | Ngày |
|---|---|---|---|
| Tech Lead | *(chưa có)* | ☐ Ngưỡng khả thi với kiến trúc hiện tại (chờ chốt số ở `OQ-033`) | — |
| QA | *(chưa có)* | ☐ Mọi NFR đều có cách verify chạy được | — |
| PO | *(chưa có)* | ☐ Ngưỡng khớp kỳ vọng người dùng đã trao đổi | — |