Skip to content

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ệuUS-TECHVN-ECOM-2026-001
Phiên bản1.0
Ngày tạo09/05/2026
Tác giảProduct Owner — TechVN
SRS tham chiếuSRS-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ệuMứcÝ nghĩa
🔴Must-haveBắt buộc cho MVP, không thể thiếu
🟡Should-haveQuan trọng, cần có trong phiên bản chính thức
🟢Could-haveNê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)
1Rất đơn giản, thay đổi nhỏ< 0.5 ngày
2Đơn giản, logic rõ ràng0.5 — 1 ngày
3Trung bình, có vài điều kiện1 — 2 ngày
5Phức tạp, nhiều thành phần2 — 4 ngày
8Rất phức tạp, cần nghiên cứu4 — 7 ngày
13Cực phức tạp, nên tách nhỏ> 1 tuần

Mục lục

  1. Epic 1: Quản lý tài khoản
  2. Epic 2: Duyệt và Tìm kiếm sản phẩm
  3. Epic 3: Giỏ hàng và Đặt hàng
  4. Epic 4: Thanh toán
  5. Epic 5: Vận chuyển và Theo dõi đơn hàng
  6. Epic 6: Đánh giá và Nhận xét
  7. Epic 7: Khuyến mãi
  8. Epic 8: Quản trị sản phẩm
  9. Epic 9: Quản trị đơn hàng
  10. 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

US-1.1
Ưu tiên🔴 Must-have
Story Points5
SprintSprint 1
SRSFR-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"
nhấn nút "Đăng ký"
  Thì hệ thống gửi mã OTP đến email "[email protected]"
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
tự động đăng nhập
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?"
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ố
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"
hiển thị nút "Gửi lại mã OTP"
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."
khóa chức năng đăng ký cho IP hiện tại trong 30 phút

Ghi 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

US-1.2
Ưu tiên🔴 Must-have
Story Points3
SprintSprint 1
SRSFR-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"
nhập Họ tên, SĐT "0901234567", Mật khẩu
nhấn "Đăng ký"
  Thì hệ thống gửi OTP qua SMS đến "0901234567"
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

US-1.3
Ưu tiên🔴 Must-have
Story Points3
SprintSprint 1
SRSFR-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
nhấn "Đăng nhập"
  Thì hệ thống xác thực thành công
chuyển hướng về trang trước đó (hoặc trang chủ nếu truy cập trực tiếp)
hiển thị tên tài khoản trên header
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
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"
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."
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)
khi tôi quay lại website, tôi vẫn ở trạng thái đăng nhập

US-1.4: Đăng nhập bằng Google / Facebook

US-1.4
Ưu tiên🟡 Should-have
Story Points5
SprintSprint 2
SRSFR-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"
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)
tự động đăng nhập
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
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 OAuth

US-1.5: Khôi phục mật khẩu

US-1.5
Ưu tiên🔴 Must-have
Story Points3
SprintSprint 1
SRSFR-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]"
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)
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
tất cả session đang hoạt động bị hủy
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

US-1.6
Ưu tiên🟡 Should-have
Story Points3
SprintSprint 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
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
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
tôi có thể đặt 1 địa chỉ làm "Mặc định"
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
mật khẩu mới phải khác mật khẩu hiện tại
tuân thủ quy tắc độ mạnh mật khẩu

Epic 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

US-2.1
Ưu tiên🔴 Must-have
Story Points5
SprintSprint 1
SRSFR-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
mỗi danh mục cấp 1 có icon đại diện
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)
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
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"
gợi ý danh mục tương tự hoặc sản phẩm bán chạy

US-2.2: Xem chi tiết sản phẩm

US-2.2
Ưu tiên🔴 Must-have
Story Points8
SprintSprint 1-2
SRSFR-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"
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
khi chọn phiên bản khác, giá và thông số cập nhật tương ứng
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""Mua ngay" bị vô hiệu hóa
hiển thị nút "Thông báo khi có hàng" (nhập email/SĐT)
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

US-2.3
Ưu tiên🔴 Must-have
Story Points8
SprintSprint 2
SRSFR-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"
thời gian phản hồi < 300ms
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'"
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"
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ất

US-2.4: Lọc sản phẩm nâng cao

US-2.4
Ưu tiên🔴 Must-have
Story Points5
SprintSprint 2
SRSFR-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á
URL cập nhật: /laptop?price=15000000-20000000
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)
cập nhật số lượng kết quả realtime
hiển thị tất cả tag lọc đang áp dụng
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
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
có nút "Xem N kết quả""Đặ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)
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

US-2.5
Ưu tiên🟡 Should-have
Story Points5
SprintSprint 3
SRSFR-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)
thanh so sánh hiển thị: ảnh nhỏ sản phẩm + tên + nút X xóa
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ẫn cho phép so sánh với các thông số chung

Epic 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

US-3.1
Ưu tiên🔴 Must-have
Story Points5
SprintSprint 2
SRSFR-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"
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"
badge số lượng trên icon giỏ hàng (header) cập nhật +2
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
khi tôi đăng nhập sau đó, giỏ hàng được merge với giỏ trên server

US-3.2: Quản lý giỏ hàng

US-3.2
Ưu tiên🔴 Must-have
Story Points5
SprintSprint 2
SRSFR-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)
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)
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
hiển thị dòng giảm giá: "Mã TECHVN10: -200.000đ"
tổng cộng được cập nhật
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
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"
nút "Khám phá sản phẩm" dẫn về trang chủ

US-3.3: Đặt hàng (Checkout)

US-3.3
Ưu tiên🔴 Must-have
Story Points13
SprintSprint 2-3
SRSFR-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
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
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
tạo đơn hàng mã "TV-20260509-00001"
nếu thanh toán online: chuyển hướng đến cổng thanh toán
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"
gửi email xác nhận đơn hàng
gửi SMS thông báo
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."
highlight sản phẩm hết hàng
KHÔNG tạo đơn hàng

Epic 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

US-4.1
Ưu tiên🔴 Must-have
Story Points8
SprintSprint 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"
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
hệ thống cập nhật đơn hàng thành "Đã thanh toán"
chuyển hướng tôi về trang "Đặt hàng thành công"
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
đơn hàng giữ trạng thái "Chờ thanh toán" trong 30 phút
hiển thị nút "Thử thanh toán lại""Đổi phương thức thanh toán"
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"
cho phép tôi quay lại để thanh toán sau (trong 30 phút)

US-4.2: Mua trả góp

US-4.2
Ưu tiên🟡 Should-have
Story Points8
SprintSprint 4
SRSFR-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đ |
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
nhập thông tin: Nghề nghiệp, Thu nhập, Nơi làm việc
hệ thống gửi hồ sơ đến đối tác tài chính (HD Saison/FE Credit)
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
đơn hàng chuyển sang trạng thái "Đã xác nhận"
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"
cho phép: Thanh toán bằng phương thức khác hoặc Hủy đơn hàng

Epic 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

US-5.1
Ưu tiên🔴 Must-have
Story Points5
SprintSprint 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
mỗi đơn gồm: Mã đơn, Ngày đặt, Tổng tiền, Trạng thái (badge màu)
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"
tồn kho được trả lại
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
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

US-6.1
Ưu tiên🟡 Should-have
Story Points5
SprintSprint 4
SRSFR-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ị
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
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á

US-7.1
Ưu tiên🟡 Should-have
Story Points5
SprintSprint 3
SRSFR-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
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đ"
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đ
đơ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
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)

US-8.1
Ưu tiên🔴 Must-have
Story Points8
SprintSprint 1-2
SRSFR-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
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
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
cho phép import các dòng hợp lệ, bỏ qua dòng lỗi
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)

US-9.1
Ưu tiên🔴 Must-have
Story Points8
SprintSprint 3
SRSFR-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
có bộ lọc: Trạng thái, Ngày (từ-đến), Kênh thanh toán, Nhân viên xử lý
có tìm kiếm: theo mã đơn, tên KH, SĐT
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
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"
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
hiển thị mã vận đơn
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)
tôi phê duyệt yêu cầu
  Thì hệ thống gọi API refund của VNPAY/MoMo
cập nhật trạng thái thanh toán "Đã hoàn tiền"
gửi email thông báo cho khách hàng

Epic 10: Báo cáo và Phân tích

SRS tham chiếu: FR-ADM-001


US-10.1: Dashboard doanh thu

US-10.1
Ưu tiên🟡 Should-have
Story Points8
SprintSprint 4
SRSFR-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
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
báo cáo gồm: KPI tổng hợp, Chi tiết đơn hàng, Doanh thu theo danh mục

Tổng hợp Backlog

Bảng tổng hợp theo Sprint

SprintUser StoriesTổng Story PointsTrọ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)24Nề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)37Catalog 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.139Checkout, Thanh toán, Vận chuyển
Sprint 4 (2 tuần)US-2.5, US-4.2, US-6.1, US-10.126So sánh, Trả góp, Đánh giá, Dashboard

Bảng tổng hợp theo MoSCoW

Mức ưu tiênSố lượngStory PointsTỷ lệ
🔴 Must-have148971%
🟡 Should-have73729%
🟢 Could-have000%
Tổng21126100%

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.

Last updated: