Appearance
User Stories & Acceptance Criteria
Website Thương mại Điện tử — Công ty Máy tính TechVN
| Thông tin tài liệu | |
|---|---|
| Mã tài liệu | US-TECHVN-ECOM-2026-001 |
| Phiên bản | 1.0 |
| Ngày tạo | 09/05/2026 |
| Tác giả | Product Owner — TechVN |
| SRS tham chiếu | SRS-TECHVN-ECOM-2026-001 v1.0 |
| Trạng thái | Đã phê duyệt (Approved) |
Quy ước tài liệu
Cấu trúc User Story
Với vai trò <persona>,
Tôi muốn <hành động>,
Để <lợi ích / giá trị đạt được>.Mức ưu tiên (MoSCoW)
| Ký hiệu | Mức | Ý nghĩa |
|---|---|---|
| 🔴 | Must-have | Bắt buộc cho MVP, không thể thiếu |
| 🟡 | Should-have | Quan trọng, cần có trong phiên bản chính thức |
| 🟢 | Could-have | Nên có, nâng cao trải nghiệm |
| ⚪ | Won't-have (lần này) | Ghi nhận, chưa triển khai đợt này |
Thang điểm Story Points
| Points | Độ phức tạp | Ước lượng thời gian (tham khảo) |
|---|---|---|
| 1 | Rất đơn giản, thay đổi nhỏ | < 0.5 ngày |
| 2 | Đơn giản, logic rõ ràng | 0.5 — 1 ngày |
| 3 | Trung bình, có vài điều kiện | 1 — 2 ngày |
| 5 | Phức tạp, nhiều thành phần | 2 — 4 ngày |
| 8 | Rất phức tạp, cần nghiên cứu | 4 — 7 ngày |
| 13 | Cực phức tạp, nên tách nhỏ | > 1 tuần |
Mục lục
- Epic 1: Quản lý tài khoản
- Epic 2: Duyệt và Tìm kiếm sản phẩm
- Epic 3: Giỏ hàng và Đặt hàng
- Epic 4: Thanh toán
- Epic 5: Vận chuyển và Theo dõi đơn hàng
- Epic 6: Đánh giá và Nhận xét
- Epic 7: Khuyến mãi
- Epic 8: Quản trị sản phẩm
- Epic 9: Quản trị đơn hàng
- Epic 10: Báo cáo và Phân tích
Epic 1: Quản lý tài khoản
Mục tiêu Epic: Cho phép khách hàng tạo, quản lý tài khoản cá nhân và xác thực an toàn khi truy cập hệ thống.
SRS tham chiếu: FR-ACC-001 → FR-ACC-003
US-1.1: Đăng ký tài khoản bằng email
| Mã | US-1.1 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 5 |
| Sprint | Sprint 1 |
| SRS | FR-ACC-001 |
User Story:
Với vai trò khách vãng lai, Tôi muốn đăng ký tài khoản bằng địa chỉ email, Để có thể đặt hàng, theo dõi đơn hàng và tích lũy điểm thưởng.
Tiêu chí chấp nhận (Acceptance Criteria):
gherkin
Kịch bản 1: Đăng ký thành công
Cho biết tôi đang ở trang đăng ký
Khi tôi nhập Họ tên "Nguyễn Văn A", Email "[email protected]",
Số điện thoại "0901234567", Mật khẩu "MatKhau@123"
Và nhấn nút "Đăng ký"
Thì hệ thống gửi mã OTP đến email "[email protected]"
Và hiển thị form nhập OTP với đếm ngược 5 phút
Khi tôi nhập đúng mã OTP
Thì hệ thống tạo tài khoản thành công
Và tự động đăng nhập
Và chuyển hướng về trang chủ với thông báo "Chào mừng bạn đến với TechVN!"
Kịch bản 2: Email đã được sử dụng
Cho biết email "[email protected]" đã được đăng ký trong hệ thống
Khi tôi nhập email "[email protected]" và nhấn "Đăng ký"
Thì hệ thống hiển thị lỗi "Email này đã được đăng ký. Bạn có muốn đăng nhập?"
Và hiển thị link dẫn đến trang đăng nhập
Kịch bản 3: Mật khẩu không đủ mạnh
Khi tôi nhập mật khẩu "123456"
Thì hệ thống hiển thị realtime:
❌ Tối thiểu 8 ký tự
❌ Chứa ít nhất 1 chữ hoa
❌ Chứa ít nhất 1 số
Và nút "Đăng ký" bị vô hiệu hóa (disabled)
Kịch bản 4: OTP hết hạn
Cho biết tôi đã nhận OTP nhưng không nhập trong 5 phút
Khi tôi nhập OTP sau 5 phút
Thì hệ thống hiển thị "Mã OTP đã hết hạn"
Và hiển thị nút "Gửi lại mã OTP"
Và cho phép gửi lại tối đa 3 lần mỗi giờ
Kịch bản 5: Nhập OTP sai quá số lần cho phép
Khi tôi nhập sai OTP 5 lần liên tiếp
Thì hệ thống hiển thị "Bạn đã nhập sai quá nhiều lần. Vui lòng thử lại sau 30 phút."
Và khóa chức năng đăng ký cho IP hiện tại trong 30 phútGhi chú kỹ thuật:
- Sử dụng rate limiting cho endpoint gửi OTP (3 lần/giờ/email).
- Hash mật khẩu bằng bcrypt với cost factor = 12.
- Lưu OTP với TTL = 300s trong Redis.
- Validate email format phía client (regex) và server (MX record check).
Wireframe tham chiếu: designs/wireframes/registration-flow.fig
US-1.2: Đăng ký bằng số điện thoại
| Mã | US-1.2 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 3 |
| Sprint | Sprint 1 |
| SRS | FR-ACC-001 |
User Story:
Với vai trò khách vãng lai, Tôi muốn đăng ký tài khoản bằng số điện thoại, Để có thể tạo tài khoản nhanh mà không cần email.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Đăng ký thành công bằng SĐT
Cho biết tôi đang ở trang đăng ký
Khi tôi chọn tab "Số điện thoại"
Và nhập Họ tên, SĐT "0901234567", Mật khẩu
Và nhấn "Đăng ký"
Thì hệ thống gửi OTP qua SMS đến "0901234567"
Và hiển thị form nhập OTP
Kịch bản 2: Số điện thoại không hợp lệ
Khi tôi nhập SĐT "012345"
Thì hệ thống hiển thị "Số điện thoại không hợp lệ. Vui lòng nhập 10 số bắt đầu bằng 0."
Kịch bản 3: SĐT đã được liên kết tài khoản khác
Cho biết SĐT "0901234567" đã tồn tại trong hệ thống
Khi tôi nhập SĐT này
Thì hệ thống hiển thị "Số điện thoại đã được sử dụng. Bạn có muốn đăng nhập?"Quy tắc nghiệp vụ:
- Chấp nhận SĐT Việt Nam: 10 số, bắt đầu bằng 0 (03x, 05x, 07x, 08x, 09x).
- Mỗi SĐT chỉ liên kết với 1 tài khoản.
- Chi phí SMS OTP: ước tính 350 VNĐ/tin (Twilio / SpeedSMS).
US-1.3: Đăng nhập bằng email/SĐT
| Mã | US-1.3 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 3 |
| Sprint | Sprint 1 |
| SRS | FR-ACC-002 |
User Story:
Với vai trò khách hàng đã đăng ký, Tôi muốn đăng nhập bằng email hoặc số điện thoại và mật khẩu, Để truy cập tài khoản cá nhân, quản lý đơn hàng và sử dụng các tiện ích dành cho thành viên.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Đăng nhập thành công
Cho biết tôi có tài khoản hợp lệ
Khi tôi nhập email "[email protected]" và mật khẩu đúng
Và nhấn "Đăng nhập"
Thì hệ thống xác thực thành công
Và chuyển hướng về trang trước đó (hoặc trang chủ nếu truy cập trực tiếp)
Và hiển thị tên tài khoản trên header
Và giỏ hàng (nếu có) được đồng bộ từ server
Kịch bản 2: Đăng nhập từ trang checkout
Cho biết tôi đang ở bước checkout và được yêu cầu đăng nhập
Khi tôi đăng nhập thành công
Thì hệ thống chuyển tôi về trang checkout
Và giỏ hàng của tôi (guest) được merge với giỏ hàng trên server
Kịch bản 3: Sai thông tin đăng nhập
Khi tôi nhập sai email hoặc mật khẩu
Thì hệ thống hiển thị "Thông tin đăng nhập không chính xác"
Và KHÔNG chỉ rõ sai email hay sai mật khẩu
Kịch bản 4: Khóa tài khoản tạm thời
Cho biết tôi đã nhập sai mật khẩu 5 lần liên tiếp
Thì hệ thống hiển thị "Tài khoản bị khóa tạm thời. Vui lòng thử lại sau 15 phút
hoặc sử dụng chức năng Quên mật khẩu."
Và hệ thống gửi email cảnh báo đến địa chỉ email đã đăng ký
Kịch bản 5: Tùy chọn "Ghi nhớ đăng nhập"
Khi tôi tick "Ghi nhớ đăng nhập" và đăng nhập thành công
Thì session kéo dài 30 ngày (thay vì 30 phút mặc định)
Và khi tôi quay lại website, tôi vẫn ở trạng thái đăng nhậpUS-1.4: Đăng nhập bằng Google / Facebook
| Mã | US-1.4 |
| Ưu tiên | 🟡 Should-have |
| Story Points | 5 |
| Sprint | Sprint 2 |
| SRS | FR-ACC-002 |
User Story:
Với vai trò khách vãng lai hoặc khách hàng, Tôi muốn đăng nhập / đăng ký nhanh bằng tài khoản Google hoặc Facebook, Để không cần nhớ thêm một bộ mật khẩu mới và tiết kiệm thời gian đăng ký.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Đăng nhập Google lần đầu (tạo tài khoản mới)
Cho biết tôi chưa có tài khoản TechVN
Khi tôi nhấn "Đăng nhập bằng Google"
Và chọn tài khoản Google của tôi
Thì hệ thống tạo tài khoản mới với thông tin từ Google (tên, email, ảnh đại diện)
Và tự động đăng nhập
Và hiển thị popup yêu cầu bổ sung SĐT (không bắt buộc, có nút "Bỏ qua")
Kịch bản 2: Đăng nhập Google — email đã tồn tại
Cho biết email Google của tôi đã được dùng để đăng ký tài khoản thường
Khi tôi nhấn "Đăng nhập bằng Google"
Thì hệ thống hiển thị "Email này đã có tài khoản. Bạn có muốn liên kết với Google?"
Khi tôi xác nhận bằng cách nhập mật khẩu tài khoản hiện tại
Thì 2 tài khoản được liên kết
Và từ lần sau tôi có thể đăng nhập bằng cả 2 cách
Kịch bản 3: Đăng nhập Facebook
Tương tự Google, thay thế bằng Facebook OAuthUS-1.5: Khôi phục mật khẩu
| Mã | US-1.5 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 3 |
| Sprint | Sprint 1 |
| SRS | FR-ACC-003 |
User Story:
Với vai trò khách hàng quên mật khẩu, Tôi muốn đặt lại mật khẩu thông qua email hoặc SMS, Để lấy lại quyền truy cập tài khoản của mình.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Đặt lại mật khẩu qua email
Cho biết tôi đang ở trang "Quên mật khẩu"
Khi tôi nhập email "[email protected]"
Và nhấn "Gửi link đặt lại mật khẩu"
Thì hệ thống gửi email chứa link đặt lại mật khẩu (có hiệu lực 30 phút)
Và hiển thị "Chúng tôi đã gửi hướng dẫn đến email của bạn."
Khi tôi click link trong email
Thì hệ thống hiển thị form tạo mật khẩu mới
Khi tôi nhập mật khẩu mới hợp lệ
Thì mật khẩu được cập nhật
Và tất cả session đang hoạt động bị hủy
Và tôi được yêu cầu đăng nhập lại bằng mật khẩu mới
Kịch bản 2: Email không tồn tại trong hệ thống
Khi tôi nhập email chưa đăng ký
Thì hệ thống VẪN hiển thị "Chúng tôi đã gửi hướng dẫn đến email của bạn."
(Không tiết lộ email có tồn tại hay không — chống enumeration attack)
Kịch bản 3: Link đặt lại mật khẩu hết hạn
Cho biết link đặt lại mật khẩu đã quá 30 phút
Khi tôi click link
Thì hệ thống hiển thị "Link đã hết hạn. Vui lòng yêu cầu link mới."US-1.6: Quản lý thông tin cá nhân
| Mã | US-1.6 |
| Ưu tiên | 🟡 Should-have |
| Story Points | 3 |
| Sprint | Sprint 2 |
User Story:
Với vai trò khách hàng đã đăng nhập, Tôi muốn cập nhật thông tin cá nhân và quản lý sổ địa chỉ giao hàng, Để thông tin luôn chính xác và checkout nhanh hơn ở lần mua tiếp theo.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Cập nhật thông tin cơ bản
Khi tôi vào "Tài khoản của tôi" > "Thông tin cá nhân"
Thì tôi có thể chỉnh sửa: Họ tên, Ngày sinh, Giới tính
Và KHÔNG thể chỉnh sửa: Email (chỉ xem), SĐT (yêu cầu OTP để đổi)
Kịch bản 2: Quản lý sổ địa chỉ
Khi tôi vào "Sổ địa chỉ"
Thì tôi có thể thêm tối đa 5 địa chỉ giao hàng
Và mỗi địa chỉ gồm: Họ tên người nhận, SĐT, Tỉnh/Thành, Quận/Huyện,
Phường/Xã, Địa chỉ chi tiết
Và tôi có thể đặt 1 địa chỉ làm "Mặc định"
Và tôi có thể sửa / xóa địa chỉ (không xóa được nếu đang có đơn hàng sử dụng)
Kịch bản 3: Đổi mật khẩu
Khi tôi chọn "Đổi mật khẩu"
Thì tôi cần nhập: Mật khẩu hiện tại, Mật khẩu mới, Xác nhận mật khẩu mới
Và mật khẩu mới phải khác mật khẩu hiện tại
Và tuân thủ quy tắc độ mạnh mật khẩuEpic 2: Duyệt và Tìm kiếm sản phẩm
Mục tiêu Epic: Giúp khách hàng tìm kiếm, duyệt và so sánh sản phẩm máy tính một cách nhanh chóng và hiệu quả.
SRS tham chiếu: FR-PRD-001 → FR-PRD-004
US-2.1: Duyệt sản phẩm theo danh mục
| Mã | US-2.1 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 5 |
| Sprint | Sprint 1 |
| SRS | FR-PRD-001 |
User Story:
Với vai trò khách hàng muốn mua laptop, Tôi muốn duyệt sản phẩm theo danh mục phân cấp (VD: Laptop > Laptop Gaming > ASUS ROG), Để nhanh chóng tìm được nhóm sản phẩm phù hợp với nhu cầu.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Duyệt danh mục trên Desktop
Khi tôi hover vào "Danh mục sản phẩm" trên menu chính
Thì hiển thị mega menu với danh mục cấp 1, cấp 2, cấp 3
Và mỗi danh mục cấp 1 có icon đại diện
Và mỗi danh mục hiển thị số lượng sản phẩm bên cạnh (VD: "Laptop Gaming (156)")
Kịch bản 2: Duyệt danh mục trên Mobile
Khi tôi nhấn icon hamburger menu
Thì hiển thị danh mục dạng accordion (mở/đóng)
Và mỗi cấp có mũi tên chỉ báo có danh mục con
Kịch bản 3: Trang danh sách sản phẩm
Khi tôi chọn danh mục "Laptop Gaming"
Thì hệ thống hiển thị:
- Breadcrumb: Trang chủ > Laptop > Laptop Gaming
- Bộ lọc bên trái (Desktop) hoặc nút "Lọc" (Mobile)
- Danh sách sản phẩm dạng lưới (grid): 3 cột Desktop, 2 cột Mobile
- Phân trang: 20 sản phẩm/trang
- Thanh sắp xếp: Phổ biến, Giá tăng dần, Giá giảm dần, Mới nhất
Và URL thân thiện: /laptop-gaming
Kịch bản 4: Danh mục trống
Khi danh mục không có sản phẩm nào
Thì hiển thị "Chưa có sản phẩm trong danh mục này"
Và gợi ý danh mục tương tự hoặc sản phẩm bán chạyUS-2.2: Xem chi tiết sản phẩm
| Mã | US-2.2 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 8 |
| Sprint | Sprint 1-2 |
| SRS | FR-PRD-002 |
User Story:
Với vai trò khách hàng đang cân nhắc mua laptop, Tôi muốn xem đầy đủ thông tin chi tiết về sản phẩm bao gồm hình ảnh, thông số kỹ thuật, giá và đánh giá, Để đưa ra quyết định mua hàng chính xác.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Hiển thị thông tin sản phẩm
Khi tôi truy cập trang chi tiết sản phẩm "ASUS ROG Strix G16"
Thì hệ thống hiển thị:
- Gallery ảnh: ảnh chính + tối đa 10 ảnh phụ (click để phóng to)
- Tên sản phẩm, SKU, Thương hiệu
- Giá bán: hiển thị giá gốc (gạch ngang) và giá khuyến mãi (nổi bật)
- Phần trăm giảm giá: badge "-25%"
- Trạng thái tồn kho: "Còn hàng" (xanh) / "Hết hàng" (đỏ) / "Đặt trước" (cam)
- Mô tả ngắn (3-5 dòng)
- Tab: Thông số kỹ thuật | Mô tả chi tiết | Đánh giá (số)
- Nút: "Thêm vào giỏ hàng", "Mua ngay", "So sánh", "Yêu thích"
Và URL: /asus-rog-strix-g16-2026-i9-rtx4060
Kịch bản 2: Xem bảng thông số kỹ thuật
Khi tôi chọn tab "Thông số kỹ thuật"
Thì hệ thống hiển thị bảng gồm:
| CPU | Intel Core i9-14900HX |
| RAM | 16GB DDR5 5600MHz (2 khe, max 64) |
| Ổ cứng | 1TB NVMe PCIe 4.0 SSD |
| VGA | NVIDIA RTX 4060 8GB GDDR6 |
| Màn hình | 16" QHD+ 240Hz, 100% DCI-P3 |
| Pin | 90Wh, sạc nhanh 200W |
| Hệ điều hành | Windows 11 Home |
| Trọng lượng | 2.5 kg |
| Bảo hành | 24 tháng chính hãng |
Kịch bản 3: Sản phẩm có nhiều phiên bản (variant)
Cho biết sản phẩm có 2 cấu hình: i7/RTX4050 và i9/RTX4060
Thì hiển thị selector cho phép chọn phiên bản
Và khi chọn phiên bản khác, giá và thông số cập nhật tương ứng
Và URL giữ nguyên, thêm query param ?variant=xxx
Kịch bản 4: Sản phẩm hết hàng
Cho biết sản phẩm đang hết hàng
Thì nút "Thêm vào giỏ hàng" và "Mua ngay" bị vô hiệu hóa
Và hiển thị nút "Thông báo khi có hàng" (nhập email/SĐT)
Và vẫn hiển thị đầy đủ thông tin sản phẩm
Kịch bản 5: Sản phẩm liên quan
Ở cuối trang, hệ thống hiển thị:
- "Phụ kiện đi kèm" (chuột, balo, đế tản nhiệt phù hợp)
- "Sản phẩm tương tự" (cùng danh mục, cùng tầm giá)
- "Sản phẩm đã xem gần đây"US-2.3: Tìm kiếm sản phẩm
| Mã | US-2.3 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 8 |
| Sprint | Sprint 2 |
| SRS | FR-PRD-003 |
User Story:
Với vai trò khách hàng biết mình muốn gì, Tôi muốn tìm kiếm sản phẩm bằng từ khóa và nhận gợi ý nhanh, Để tìm được sản phẩm mong muốn mà không phải duyệt qua nhiều danh mục.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Gợi ý tìm kiếm (Autocomplete)
Khi tôi bắt đầu gõ "asus rog" vào ô tìm kiếm
Thì sau khi nhập ít nhất 2 ký tự, hệ thống hiển thị dropdown gợi ý:
- Gợi ý sản phẩm (tối đa 5): tên + ảnh nhỏ + giá
- Gợi ý danh mục (tối đa 3): "Laptop Gaming ASUS ROG"
- Gợi ý từ khóa (tối đa 3): "asus rog strix", "asus rog zephyrus"
Và thời gian phản hồi < 300ms
Và hỗ trợ tìm kiếm tiếng Việt có dấu lẫn không dấu
Kịch bản 2: Trang kết quả tìm kiếm
Khi tôi nhấn Enter hoặc chọn "Xem tất cả kết quả"
Thì hệ thống hiển thị trang kết quả với:
- Tổng số kết quả: "Tìm thấy 23 sản phẩm cho 'asus rog'"
- Danh sách sản phẩm (giống trang danh mục)
- Bộ lọc và sắp xếp
- Highlight từ khóa trong tên sản phẩm
Kịch bản 3: Không có kết quả
Khi tôi tìm kiếm "xyz123abc" (không khớp sản phẩm nào)
Thì hệ thống hiển thị "Không tìm thấy sản phẩm nào cho 'xyz123abc'"
Và gợi ý: "Thử tìm kiếm với từ khóa khác hoặc xem sản phẩm bán chạy"
Và hiển thị danh sách "Sản phẩm bán chạy"
Kịch bản 4: Tìm kiếm bằng SKU
Khi tôi nhập SKU "TV-LPT-ASUS-00123"
Thì hệ thống chuyển thẳng đến trang chi tiết sản phẩm tương ứng
Kịch bản 5: Focus ô tìm kiếm
Khi tôi click vào ô tìm kiếm (chưa gõ gì)
Thì hiển thị:
- "Từ khóa phổ biến": RTX 4060, Laptop gaming, MacBook Pro, RAM DDR5
- "Tìm kiếm gần đây" (nếu đã đăng nhập): lịch sử 5 từ khóa gần nhấtUS-2.4: Lọc sản phẩm nâng cao
| Mã | US-2.4 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 5 |
| Sprint | Sprint 2 |
| SRS | FR-PRD-003 |
User Story:
Với vai trò khách hàng đang tìm laptop trong ngân sách 15-20 triệu, Tôi muốn lọc sản phẩm theo nhiều tiêu chí cùng lúc (giá, CPU, RAM, VGA...), Để thu hẹp danh sách và nhanh chóng tìm được sản phẩm phù hợp.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Lọc theo khoảng giá
Cho biết tôi đang ở danh mục "Laptop"
Khi tôi chọn khoảng giá "15 - 20 triệu"
Thì danh sách sản phẩm cập nhật chỉ hiển thị sản phẩm trong khoảng giá
Và URL cập nhật: /laptop?price=15000000-20000000
Và bộ lọc hiển thị tag "15 - 20 triệu" có nút X để xóa
Kịch bản 2: Lọc đa tiêu chí
Khi tôi chọn: Giá "15-20tr" + CPU "Intel Core i7" + RAM "16GB"
Thì hệ thống áp dụng tất cả bộ lọc đồng thời (AND logic)
Và cập nhật số lượng kết quả realtime
Và hiển thị tất cả tag lọc đang áp dụng
Và có nút "Xóa tất cả bộ lọc"
Kịch bản 3: Lọc khoảng giá tùy chỉnh
Khi tôi nhập giá từ "14500000" đến "18000000" vào ô nhập tùy chỉnh
Và nhấn "Áp dụng"
Thì hệ thống lọc theo khoảng giá vừa nhập
Kịch bản 4: Bộ lọc trên Mobile
Khi tôi nhấn nút "Lọc" trên mobile
Thì hiển thị bottom sheet hoặc full-screen overlay chứa tất cả bộ lọc
Và có nút "Xem N kết quả" và "Đặt lại"
Kịch bản 5: Bộ lọc thông minh theo danh mục
Khi tôi vào danh mục "Màn hình"
Thì bộ lọc hiển thị tiêu chí phù hợp: Kích thước (24", 27", 32"),
Độ phân giải (FHD, QHD, 4K), Tần số quét (60Hz, 144Hz, 165Hz, 240Hz),
Tấm nền (IPS, VA, OLED)
Và KHÔNG hiển thị tiêu chí không liên quan (CPU, RAM)US-2.5: So sánh sản phẩm
| Mã | US-2.5 |
| Ưu tiên | 🟡 Should-have |
| Story Points | 5 |
| Sprint | Sprint 3 |
| SRS | FR-PRD-004 |
User Story:
Với vai trò khách hàng đang phân vân giữa 2-3 laptop, Tôi muốn so sánh thông số kỹ thuật các sản phẩm cạnh nhau, Để thấy rõ sự khác biệt và chọn được sản phẩm phù hợp nhất.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Thêm sản phẩm vào danh sách so sánh
Khi tôi nhấn nút "So sánh" trên card sản phẩm
Thì sản phẩm được thêm vào thanh so sánh (sticky bar ở dưới cùng màn hình)
Và thanh so sánh hiển thị: ảnh nhỏ sản phẩm + tên + nút X xóa
Và hiển thị "1/4 sản phẩm" (tối đa 4)
Kịch bản 2: Xem trang so sánh
Cho biết tôi đã thêm 3 laptop vào danh sách so sánh
Khi tôi nhấn "So sánh ngay"
Thì hệ thống hiển thị bảng so sánh:
- Hàng 1: Ảnh sản phẩm + Tên + Giá + Nút "Thêm vào giỏ"
- Các hàng tiếp: Thông số kỹ thuật (CPU, RAM, Ổ cứng, VGA, Màn hình...)
- Thông số khác nhau được tô sáng (highlight vàng)
- Thông số giống nhau hiển thị bình thường
Kịch bản 3: Giới hạn so sánh
Khi tôi đã thêm 4 sản phẩm và cố thêm sản phẩm thứ 5
Thì hệ thống hiển thị "Chỉ có thể so sánh tối đa 4 sản phẩm.
Vui lòng xóa bớt sản phẩm."
Kịch bản 4: So sánh khác danh mục
Khi tôi thêm 1 laptop và 1 màn hình vào so sánh
Thì hệ thống hiển thị cảnh báo "Các sản phẩm thuộc danh mục khác nhau.
Kết quả so sánh có thể không đầy đủ."
Và vẫn cho phép so sánh với các thông số chungEpic 3: Giỏ hàng và Đặt hàng
Mục tiêu Epic: Tạo trải nghiệm mua hàng mượt mà từ giỏ hàng đến đặt hàng thành công.
SRS tham chiếu: FR-ORD-001 → FR-ORD-002
US-3.1: Thêm sản phẩm vào giỏ hàng
| Mã | US-3.1 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 5 |
| Sprint | Sprint 2 |
| SRS | FR-ORD-001 |
User Story:
Với vai trò khách hàng đã chọn được sản phẩm, Tôi muốn thêm sản phẩm vào giỏ hàng với số lượng mong muốn, Để tiếp tục mua sắm hoặc tiến hành thanh toán khi sẵn sàng.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Thêm vào giỏ thành công
Cho biết sản phẩm "Chuột Logitech G502 X" còn hàng (tồn kho: 50)
Khi tôi chọn số lượng 2 và nhấn "Thêm vào giỏ hàng"
Thì hệ thống hiển thị mini popup xác nhận "Đã thêm vào giỏ hàng"
Và popup gồm: ảnh sản phẩm + tên + giá + nút "Xem giỏ hàng" + nút "Tiếp tục mua sắm"
Và badge số lượng trên icon giỏ hàng (header) cập nhật +2
Và tôi vẫn ở trang sản phẩm hiện tại
Kịch bản 2: Giới hạn số lượng
Cho biết sản phẩm là Laptop (giới hạn 1/đơn)
Khi tôi cố chọn số lượng > 1
Thì hiển thị "Mỗi khách hàng chỉ được mua tối đa 1 sản phẩm này"
Kịch bản 3: Sản phẩm đã trong giỏ
Cho biết tôi đã có 1 "Chuột Logitech G502 X" trong giỏ
Khi tôi thêm 1 cái nữa từ trang sản phẩm
Thì hệ thống cập nhật số lượng trong giỏ thành 2 (không tạo dòng mới)
Kịch bản 4: Vượt quá tồn kho
Cho biết tồn kho chỉ còn 3
Khi tôi chọn số lượng 5
Thì hiển thị "Chỉ còn 3 sản phẩm. Vui lòng giảm số lượng."
Kịch bản 5: Giỏ hàng guest
Cho biết tôi chưa đăng nhập
Khi tôi thêm sản phẩm vào giỏ
Thì giỏ hàng được lưu trong localStorage
Và khi tôi đăng nhập sau đó, giỏ hàng được merge với giỏ trên serverUS-3.2: Quản lý giỏ hàng
| Mã | US-3.2 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 5 |
| Sprint | Sprint 2 |
| SRS | FR-ORD-001 |
User Story:
Với vai trò khách hàng có sản phẩm trong giỏ, Tôi muốn xem, chỉnh sửa số lượng, xóa sản phẩm và áp dụng mã giảm giá, Để kiểm tra lại đơn hàng trước khi thanh toán.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Xem giỏ hàng
Khi tôi truy cập trang giỏ hàng
Thì hệ thống hiển thị danh sách sản phẩm gồm:
- Ảnh sản phẩm (thumbnail)
- Tên sản phẩm (link đến trang chi tiết)
- Phiên bản / Variant (nếu có)
- Đơn giá
- Bộ chọn số lượng (+/-)
- Thành tiền (đơn giá × số lượng)
- Nút xóa (icon thùng rác)
Và phía dưới hiển thị:
- Tạm tính (subtotal)
- Ô nhập mã giảm giá + nút "Áp dụng"
- Phí vận chuyển: "Tính khi checkout"
- Tổng cộng (tạm tính - giảm giá)
- Nút "Tiến hành đặt hàng" (CTA chính)
Kịch bản 2: Cập nhật số lượng
Khi tôi thay đổi số lượng sản phẩm bằng nút +/-
Thì thành tiền và tổng cộng cập nhật realtime (không reload trang)
Và hệ thống kiểm tra tồn kho trước khi cho phép tăng
Kịch bản 3: Áp dụng mã giảm giá
Khi tôi nhập mã "TECHVN10" và nhấn "Áp dụng"
Thì hệ thống kiểm tra: mã hợp lệ, chưa hết hạn, đủ điều kiện đơn hàng
Và hiển thị dòng giảm giá: "Mã TECHVN10: -200.000đ"
Và tổng cộng được cập nhật
Và chỉ áp dụng 1 mã giảm giá/đơn hàng
Kịch bản 4: Mã giảm giá không hợp lệ
Khi tôi nhập mã không tồn tại hoặc hết hạn
Thì hiển thị lỗi inline: "Mã giảm giá không hợp lệ hoặc đã hết hạn"
Kịch bản 5: Sản phẩm trong giỏ thay đổi giá
Cho biết sản phẩm trong giỏ vừa được cập nhật giá (tăng/giảm)
Thì hệ thống hiển thị badge "Giá đã thay đổi" bên cạnh sản phẩm
Và hiển thị giá cũ (gạch ngang) và giá mới
Kịch bản 6: Giỏ hàng trống
Khi giỏ hàng không có sản phẩm nào
Thì hiển thị illustration "Giỏ hàng trống"
Và nút "Khám phá sản phẩm" dẫn về trang chủUS-3.3: Đặt hàng (Checkout)
| Mã | US-3.3 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 13 |
| Sprint | Sprint 2-3 |
| SRS | FR-ORD-002 |
User Story:
Với vai trò khách hàng sẵn sàng mua, Tôi muốn hoàn tất đặt hàng qua quy trình 3 bước rõ ràng (Giao hàng → Thanh toán → Xác nhận), Để mua sản phẩm một cách nhanh chóng và yên tâm.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Bước 1 — Thông tin giao hàng
Cho biết tôi đã đăng nhập và có địa chỉ đã lưu
Khi tôi vào trang checkout
Thì hệ thống hiển thị:
- Địa chỉ mặc định được chọn sẵn
- Dropdown chọn địa chỉ khác hoặc "Thêm địa chỉ mới"
- Form địa chỉ mới: Họ tên, SĐT, Tỉnh/Thành (dropdown), Quận/Huyện
(dropdown phụ thuộc Tỉnh), Phường/Xã, Địa chỉ chi tiết
- Ô ghi chú đơn hàng (không bắt buộc)
Kịch bản 2: Chọn đơn vị vận chuyển
Sau khi nhập đầy đủ địa chỉ
Thì hệ thống gọi API GHTK/GHN để tính phí và thời gian dự kiến
Và hiển thị tối thiểu 2 lựa chọn:
- Giao tiêu chuẩn: 25.000đ — 3-5 ngày
- Giao nhanh: 45.000đ — 1-2 ngày
Và mặc định chọn "Giao tiêu chuẩn"
Kịch bản 3: Bước 2 — Phương thức thanh toán
Khi tôi nhấn "Tiếp tục"
Thì hệ thống hiển thị các phương thức thanh toán:
- COD (Thanh toán khi nhận hàng) — mặc định
- Chuyển khoản ngân hàng (hiển thị thông tin tài khoản)
- VNPAY (ATM nội địa / Visa / Mastercard / QR Code)
- Ví MoMo
- Trả góp (chỉ hiển thị khi đơn ≥ 3.000.000đ)
Kịch bản 4: Bước 3 — Xác nhận và đặt hàng
Khi tôi nhấn "Tiếp tục" từ bước thanh toán
Thì hệ thống hiển thị tóm tắt:
- Danh sách sản phẩm (tên + SL + đơn giá + thành tiền)
- Địa chỉ giao hàng
- Phương thức vận chuyển + phí
- Phương thức thanh toán
- Mã giảm giá đã áp dụng
- TỔNG THANH TOÁN (nổi bật, font lớn)
Khi tôi nhấn "Đặt hàng"
Thì hệ thống kiểm tra tồn kho lần cuối
Và tạo đơn hàng mã "TV-20260509-00001"
Và nếu thanh toán online: chuyển hướng đến cổng thanh toán
Và nếu COD: hiển thị trang xác nhận đặt hàng thành công
Kịch bản 5: Đặt hàng thành công
Sau khi đặt hàng hoàn tất
Thì hệ thống hiển thị trang "Đặt hàng thành công" gồm:
- Mã đơn hàng
- Thời gian giao hàng dự kiến
- Nút "Theo dõi đơn hàng"
- Nút "Tiếp tục mua sắm"
Và gửi email xác nhận đơn hàng
Và gửi SMS thông báo
Và trừ tồn kho
Kịch bản 6: Sản phẩm hết hàng khi checkout
Cho biết sản phẩm trong giỏ vừa hết hàng (người khác mua trước)
Khi tôi nhấn "Đặt hàng"
Thì hệ thống hiển thị "Sản phẩm X đã hết hàng. Vui lòng xóa khỏi giỏ để tiếp tục."
Và highlight sản phẩm hết hàng
Và KHÔNG tạo đơn hàngEpic 4: Thanh toán
Mục tiêu Epic: Cung cấp đa dạng phương thức thanh toán an toàn cho khách hàng Việt Nam.
SRS tham chiếu: FR-ORD-002, FR-ORD-003
US-4.1: Thanh toán qua VNPAY
| Mã | US-4.1 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 8 |
| Sprint | Sprint 3 |
User Story:
Với vai trò khách hàng muốn thanh toán trước khi nhận hàng, Tôi muốn thanh toán qua VNPAY bằng thẻ ATM nội địa, Visa/Mastercard hoặc QR Code, Để đơn hàng được xử lý nhanh hơn và không cần chuẩn bị tiền mặt.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Thanh toán VNPAY thành công
Cho biết tôi chọn thanh toán qua VNPAY
Khi tôi nhấn "Đặt hàng"
Thì hệ thống tạo đơn hàng trạng thái "Chờ thanh toán"
Và chuyển hướng tôi đến cổng VNPAY
Khi tôi hoàn tất thanh toán trên VNPAY
Thì VNPAY callback về hệ thống TechVN
Và hệ thống cập nhật đơn hàng thành "Đã thanh toán"
Và chuyển hướng tôi về trang "Đặt hàng thành công"
Và gửi email xác nhận thanh toán (kèm hóa đơn điện tử)
Kịch bản 2: Thanh toán thất bại
Khi thanh toán trên VNPAY thất bại (số dư không đủ, timeout...)
Thì hệ thống chuyển tôi về trang thông báo lỗi
Và đơn hàng giữ trạng thái "Chờ thanh toán" trong 30 phút
Và hiển thị nút "Thử thanh toán lại" và "Đổi phương thức thanh toán"
Và nếu không thanh toán trong 30 phút, đơn hàng tự động hủy, trả lại tồn kho
Kịch bản 3: Người dùng hủy thanh toán
Khi tôi nhấn "Quay lại" trên trang VNPAY
Thì hệ thống giữ đơn hàng "Chờ thanh toán"
Và cho phép tôi quay lại để thanh toán sau (trong 30 phút)US-4.2: Mua trả góp
| Mã | US-4.2 |
| Ưu tiên | 🟡 Should-have |
| Story Points | 8 |
| Sprint | Sprint 4 |
| SRS | FR-ORD-003 |
User Story:
Với vai trò khách hàng muốn mua laptop nhưng chưa đủ tiền trả 1 lần, Tôi muốn đăng ký mua trả góp qua công ty tài chính ngay trên website, Để sở hữu sản phẩm ngay và trả dần hàng tháng.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Xem bảng trả góp
Cho biết sản phẩm có giá 20.000.000đ
Khi tôi nhấn "Mua trả góp" trên trang sản phẩm hoặc checkout
Thì hệ thống hiển thị bảng tính trả góp:
| Kỳ hạn | Trả trước (30%) | Góp hàng tháng | Tổng trả |
| 6 tháng | 6.000.000đ | 2.450.000đ | 20.700.000đ |
| 12 tháng | 6.000.000đ | 1.280.000đ | 21.360.000đ |
| 18 tháng | 6.000.000đ | 890.000đ | 22.020.000đ |
Và hiển thị "Lãi suất 0% cho 6 tháng đầu" (nếu có chương trình)
Kịch bản 2: Đăng ký trả góp
Khi tôi chọn kỳ hạn 12 tháng và nhấn "Đăng ký trả góp"
Thì hệ thống yêu cầu upload:
- Ảnh CCCD mặt trước + mặt sau
- Ảnh selfie
Và nhập thông tin: Nghề nghiệp, Thu nhập, Nơi làm việc
Và hệ thống gửi hồ sơ đến đối tác tài chính (HD Saison/FE Credit)
Và hiển thị "Hồ sơ đang được xét duyệt. Kết quả trong 15 phút - 2 giờ."
Kịch bản 3: Hồ sơ trả góp được duyệt
Khi đối tác tài chính phê duyệt
Thì hệ thống gửi SMS + email thông báo
Và đơn hàng chuyển sang trạng thái "Đã xác nhận"
Và bắt đầu quy trình giao hàng
Kịch bản 4: Hồ sơ trả góp bị từ chối
Khi đối tác tài chính từ chối
Thì hệ thống gửi thông báo "Hồ sơ trả góp chưa được duyệt"
Và cho phép: Thanh toán bằng phương thức khác hoặc Hủy đơn hàngEpic 5: Vận chuyển và Theo dõi đơn hàng
Mục tiêu Epic: Cho phép khách hàng theo dõi trạng thái đơn hàng realtime từ lúc đặt đến khi nhận.
US-5.1: Theo dõi đơn hàng
| Mã | US-5.1 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 5 |
| Sprint | Sprint 3 |
User Story:
Với vai trò khách hàng đã đặt hàng, Tôi muốn theo dõi trạng thái đơn hàng theo thời gian thực, Để biết đơn hàng đang ở đâu và khi nào sẽ được giao.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Xem lịch sử đơn hàng
Khi tôi vào "Tài khoản" > "Đơn hàng của tôi"
Thì hệ thống hiển thị danh sách đơn hàng, sắp xếp theo ngày mới nhất
Và mỗi đơn gồm: Mã đơn, Ngày đặt, Tổng tiền, Trạng thái (badge màu)
Và có bộ lọc: Tất cả, Chờ xác nhận, Đang giao, Đã giao, Đã hủy
Kịch bản 2: Xem chi tiết đơn hàng
Khi tôi nhấn vào mã đơn hàng "TV-20260509-00001"
Thì hệ thống hiển thị:
- Timeline trạng thái (dạng stepper ngang):
✅ Đã đặt (09/05 10:30) → ✅ Đã xác nhận (09/05 11:00)
→ 🔄 Đang giao (10/05 08:00) → ⬜ Đã giao
- Mã vận đơn: "GHTK-123456789" (link tra cứu trên GHTK)
- Danh sách sản phẩm
- Thông tin giao hàng
- Lịch sử thanh toán
Kịch bản 3: Hủy đơn hàng
Cho biết đơn hàng đang ở trạng thái "Chờ xác nhận" hoặc "Đã xác nhận"
Khi tôi nhấn "Hủy đơn hàng"
Thì hệ thống hiển thị popup chọn lý do hủy:
- Đổi ý, không muốn mua nữa
- Muốn đổi sản phẩm / địa chỉ
- Tìm được giá tốt hơn
- Khác (nhập lý do)
Khi tôi chọn lý do và xác nhận
Thì đơn hàng chuyển sang "Đã hủy"
Và tồn kho được trả lại
Và nếu đã thanh toán online: hiển thị "Hoàn tiền trong 5-7 ngày làm việc"
Kịch bản 4: Không thể hủy
Cho biết đơn hàng đang ở trạng thái "Đang giao"
Thì nút "Hủy đơn hàng" bị ẩn
Và hiển thị thông báo "Đơn hàng đang được giao, không thể hủy.
Vui lòng liên hệ CSKH: 1900-xxxx"Epic 6: Đánh giá và Nhận xét
SRS tham chiếu: FR-REV-001
US-6.1: Viết đánh giá sản phẩm
| Mã | US-6.1 |
| Ưu tiên | 🟡 Should-have |
| Story Points | 5 |
| Sprint | Sprint 4 |
| SRS | FR-REV-001 |
User Story:
Với vai trò khách hàng đã nhận sản phẩm, Tôi muốn viết đánh giá và cho điểm sản phẩm kèm hình ảnh thực tế, Để chia sẻ trải nghiệm và giúp người mua khác tham khảo.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Viết đánh giá
Cho biết đơn hàng chứa sản phẩm X đã ở trạng thái "Đã giao" ≥ 1 ngày
Khi tôi vào trang sản phẩm X hoặc trang đơn hàng và nhấn "Viết đánh giá"
Thì hệ thống hiển thị form:
- Chọn số sao (1-5 sao, bắt buộc)
- Tiêu đề đánh giá (không bắt buộc, tối đa 100 ký tự)
- Nội dung (bắt buộc, tối thiểu 20 ký tự, tối đa 2000 ký tự)
- Upload ảnh (không bắt buộc, tối đa 5 ảnh, mỗi ảnh ≤ 5MB)
Khi tôi gửi đánh giá
Thì hiển thị "Đánh giá của bạn đang chờ duyệt. Cảm ơn bạn!"
Kịch bản 2: Điều kiện đánh giá
Cho biết tôi chưa mua sản phẩm Y
Khi tôi vào trang sản phẩm Y
Thì nút "Viết đánh giá" không hiển thị
Và chỉ có thể xem đánh giá của người khác
Kịch bản 3: Chỉ đánh giá 1 lần
Cho biết tôi đã đánh giá sản phẩm X
Khi tôi quay lại trang sản phẩm
Thì hiển thị "Bạn đã đánh giá sản phẩm này" kèm nội dung đã viết
Và cho phép "Chỉnh sửa đánh giá" (gửi duyệt lại)Epic 7: Khuyến mãi
SRS tham chiếu: FR-PRM-001
US-7.1: Sử dụng mã giảm giá
| Mã | US-7.1 |
| Ưu tiên | 🟡 Should-have |
| Story Points | 5 |
| Sprint | Sprint 3 |
| SRS | FR-PRM-001 |
User Story:
Với vai trò khách hàng có mã giảm giá, Tôi muốn áp dụng mã giảm giá khi mua hàng, Để được giảm giá hoặc miễn phí vận chuyển.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Áp dụng mã giảm giá thành công
Cho biết mã "WELCOME10" giảm 10% tối đa 500.000đ cho khách hàng mới
Và tôi là khách hàng mới, đơn hàng 5.000.000đ
Khi tôi nhập mã "WELCOME10" tại giỏ hàng
Thì hệ thống hiển thị: "Mã WELCOME10: -500.000đ"
Và tổng đơn hàng cập nhật thành 4.500.000đ
Kịch bản 2: Mã không đủ điều kiện đơn hàng tối thiểu
Cho biết mã "SALE50K" yêu cầu đơn tối thiểu 1.000.000đ
Và đơn hàng hiện tại chỉ 800.000đ
Khi tôi nhập mã
Thì hiển thị "Mã giảm giá yêu cầu đơn hàng tối thiểu 1.000.000đ.
Bạn cần mua thêm 200.000đ."
Kịch bản 3: Mã đã hết lượt sử dụng
Cho biết mã "FLASH100" giới hạn 500 lượt, đã dùng hết
Khi tôi nhập mã
Thì hiển thị "Mã giảm giá đã hết lượt sử dụng"
Kịch bản 4: Xem danh sách mã khả dụng
Khi tôi nhấn "Xem mã giảm giá" tại trang giỏ hàng
Thì hệ thống hiển thị danh sách mã mà tôi đủ điều kiện sử dụng
Và mỗi mã gồm: Tên, Mô tả, Điều kiện, Hạn sử dụng, Nút "Áp dụng"Epic 8: Quản trị sản phẩm
SRS tham chiếu: FR-ADM-002
US-8.1: Thêm sản phẩm mới (Admin)
| Mã | US-8.1 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 8 |
| Sprint | Sprint 1-2 |
| SRS | FR-ADM-002 |
User Story:
Với vai trò Quản lý sản phẩm (Admin), Tôi muốn thêm sản phẩm mới vào hệ thống với đầy đủ thông tin, hình ảnh và thông số kỹ thuật, Để sản phẩm được hiển thị trên website cho khách hàng mua.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Thêm sản phẩm thành công
Khi tôi vào "Quản lý sản phẩm" > "Thêm sản phẩm mới"
Thì hệ thống hiển thị form gồm các nhóm:
Thông tin cơ bản:
- Tên sản phẩm (bắt buộc, tự động sinh slug URL)
- SKU (bắt buộc, unique, gợi ý format: TV-[LOAI]-[HANG]-[XXXXX])
- Danh mục (bắt buộc, chọn cây danh mục)
- Thương hiệu (bắt buộc, dropdown)
- Trạng thái: Bản nháp / Công khai / Ẩn
Giá và tồn kho:
- Giá gốc (bắt buộc)
- Giá khuyến mãi (không bắt buộc, phải < giá gốc)
- Số lượng tồn kho (bắt buộc)
Hình ảnh:
- Ảnh chính (bắt buộc, kéo thả)
- Gallery (tối đa 10 ảnh)
- Video URL (YouTube/Vimeo)
Mô tả:
- Mô tả ngắn (text, tối đa 500 ký tự)
- Mô tả chi tiết (rich text editor WYSIWYG)
Thông số kỹ thuật:
- Bảng thông số động theo danh mục (VD: chọn "Laptop" → hiện form CPU, RAM...)
SEO:
- Meta title (tự động từ tên SP, cho phép sửa)
- Meta description
- Canonical URL
Khi tôi điền đủ thông tin bắt buộc và nhấn "Lưu"
Thì sản phẩm được tạo với trạng thái đã chọn
Và hiển thị thông báo "Tạo sản phẩm thành công"
Kịch bản 2: Upload hình ảnh
Khi tôi kéo thả ảnh vào vùng upload
Thì hệ thống tự động:
- Resize ảnh về kích thước chuẩn (800x800, 400x400, 200x200)
- Nén ảnh WebP (quality 85%)
- Upload lên CDN/S3
- Hiển thị preview thumbnail
Và chấp nhận định dạng: JPG, PNG, WebP (max 10MB/ảnh)
Kịch bản 3: Import sản phẩm hàng loạt
Khi tôi chọn "Import Excel"
Thì hệ thống cho tải template Excel mẫu
Khi tôi upload file Excel đã điền
Thì hệ thống validate từng dòng và hiển thị:
- Dòng hợp lệ: ✅ (sẵn sàng import)
- Dòng lỗi: ❌ kèm mô tả lỗi
Và cho phép import các dòng hợp lệ, bỏ qua dòng lỗi
Và hiển thị báo cáo: "Import thành công 45/50 sản phẩm. 5 lỗi."Epic 9: Quản trị đơn hàng
SRS tham chiếu: FR-ADM-003
US-9.1: Xử lý đơn hàng (Admin)
| Mã | US-9.1 |
| Ưu tiên | 🔴 Must-have |
| Story Points | 8 |
| Sprint | Sprint 3 |
| SRS | FR-ADM-003 |
User Story:
Với vai trò Nhân viên xử lý đơn hàng (Admin), Tôi muốn xem, xác nhận, xử lý và theo dõi đơn hàng trên một giao diện tập trung, Để đảm bảo đơn hàng được giao đến khách hàng nhanh chóng và chính xác.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Danh sách đơn hàng
Khi tôi vào "Quản lý đơn hàng"
Thì hệ thống hiển thị bảng đơn hàng với cột:
Mã đơn | Khách hàng | SĐT | Tổng tiền | Thanh toán | Trạng thái | Ngày đặt | Hành động
Và có bộ lọc: Trạng thái, Ngày (từ-đến), Kênh thanh toán, Nhân viên xử lý
Và có tìm kiếm: theo mã đơn, tên KH, SĐT
Và mặc định hiển thị đơn "Chờ xác nhận" trước
Kịch bản 2: Xác nhận đơn hàng
Khi tôi click vào đơn hàng "Chờ xác nhận"
Thì hệ thống hiển thị chi tiết đơn hàng
Và tôi có thể:
- Nhấn "Xác nhận đơn" → trạng thái chuyển "Đã xác nhận"
- Nhấn "Hủy đơn" → chọn lý do → trạng thái "Đã hủy"
- Thêm ghi chú nội bộ (khách hàng không nhìn thấy)
Kịch bản 3: Tạo đơn vận chuyển
Khi đơn hàng ở trạng thái "Đã xác nhận"
Và tôi nhấn "Tạo đơn vận chuyển"
Thì hệ thống gọi API GHTK/GHN tự động tạo vận đơn
Và hiển thị mã vận đơn
Và in phiếu giao hàng (PDF) + phiếu xuất kho
Kịch bản 4: Xử lý hoàn tiền
Khi khách hàng yêu cầu hoàn tiền (đã thanh toán online)
Và tôi phê duyệt yêu cầu
Thì hệ thống gọi API refund của VNPAY/MoMo
Và cập nhật trạng thái thanh toán "Đã hoàn tiền"
Và gửi email thông báo cho khách hàngEpic 10: Báo cáo và Phân tích
SRS tham chiếu: FR-ADM-001
US-10.1: Dashboard doanh thu
| Mã | US-10.1 |
| Ưu tiên | 🟡 Should-have |
| Story Points | 8 |
| Sprint | Sprint 4 |
| SRS | FR-ADM-001 |
User Story:
Với vai trò Quản lý hoặc Ban Giám đốc, Tôi muốn xem dashboard tổng quan doanh thu, đơn hàng và sản phẩm bán chạy, Để nắm bắt tình hình kinh doanh và đưa ra quyết định kịp thời.
Tiêu chí chấp nhận:
gherkin
Kịch bản 1: Xem dashboard
Khi tôi đăng nhập Admin và vào trang Dashboard
Thì hệ thống hiển thị:
KPI Cards (hôm nay):
- Doanh thu: 150.000.000đ (↑12% so với hôm qua)
- Số đơn hàng: 45 (↑8%)
- Giá trị trung bình/đơn: 3.333.333đ
- Khách hàng mới: 12
Biểu đồ:
- Doanh thu 30 ngày gần nhất (biểu đồ cột)
- Đơn hàng theo trạng thái (biểu đồ tròn)
Bảng xếp hạng:
- Top 10 sản phẩm bán chạy (tên + SL bán + doanh thu)
- Sản phẩm sắp hết hàng (tồn kho < 5)
Hoạt động gần đây:
- 5 đơn hàng mới nhất
- 5 đánh giá mới cần duyệt
Kịch bản 2: Lọc theo khoảng thời gian
Khi tôi chọn bộ lọc thời gian: Hôm nay / 7 ngày / 30 ngày / Tùy chỉnh
Thì tất cả KPI và biểu đồ cập nhật theo khoảng thời gian đã chọn
Và hiển thị so sánh với kỳ trước (VD: tháng này vs tháng trước)
Kịch bản 3: Export báo cáo
Khi tôi nhấn "Xuất báo cáo"
Thì hệ thống cho phép export ra Excel hoặc PDF
Và báo cáo gồm: KPI tổng hợp, Chi tiết đơn hàng, Doanh thu theo danh mụcTổng hợp Backlog
Bảng tổng hợp theo Sprint
| Sprint | User Stories | Tổng Story Points | Trọng tâm |
|---|---|---|---|
| Sprint 1 (2 tuần) | US-1.1, US-1.2, US-1.3, US-1.5, US-2.1, US-8.1 (phần 1) | 24 | Nền tảng: Đăng ký, Đăng nhập, Danh mục, CRUD sản phẩm |
| Sprint 2 (2 tuần) | US-1.4, US-1.6, US-2.2, US-2.3, US-2.4, US-3.1, US-3.2, US-8.1 (phần 2) | 37 | Catalog hoàn chỉnh, Giỏ hàng |
| Sprint 3 (2 tuần) | US-3.3, US-4.1, US-5.1, US-7.1, US-9.1 | 39 | Checkout, Thanh toán, Vận chuyển |
| Sprint 4 (2 tuần) | US-2.5, US-4.2, US-6.1, US-10.1 | 26 | So sánh, Trả góp, Đánh giá, Dashboard |
Bảng tổng hợp theo MoSCoW
| Mức ưu tiên | Số lượng | Story Points | Tỷ lệ |
|---|---|---|---|
| 🔴 Must-have | 14 | 89 | 71% |
| 🟡 Should-have | 7 | 37 | 29% |
| 🟢 Could-have | 0 | 0 | 0% |
| Tổng | 21 | 126 | 100% |
Definition of Done (DoD)
Mỗi User Story được coi là hoàn thành khi đáp ứng tất cả tiêu chí sau:
- [ ] Code đã được review bởi ít nhất 1 developer khác.
- [ ] Tất cả Acceptance Criteria đã được verify (manual hoặc automated test).
- [ ] Unit test coverage ≥ 80% cho logic nghiệp vụ.
- [ ] Integration test pass cho các luồng chính.
- [ ] Không có lỗi Severity 1, 2 (Critical, Major) chưa được fix.
- [ ] UI responsive trên Desktop, Tablet, Mobile.
- [ ] Cross-browser testing pass (Chrome, Firefox, Safari, Edge).
- [ ] Performance: API response time ≤ 500ms (P95).
- [ ] SEO checklist pass (meta tags, structured data, sitemap).
- [ ] Accessibility check pass (WCAG 2.1 AA cơ bản).
- [ ] Documentation cập nhật (API docs, changelog).
- [ ] Deploy thành công trên môi trường Staging.
- [ ] Product Owner đã review và chấp nhận trên Staging.
Ghi chú: Tài liệu User Stories là tài liệu sống, được cập nhật liên tục trong quá trình phát triển. Các story mới có thể được thêm vào backlog qua Sprint Planning. Mọi thay đổi về scope cần được Product Owner phê duyệt.