Skip to content

Đặc tả Use Case (Use Case Specification)

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ệuUCS-TECHVN-ECOM-2026-001
Phiên bản1.0
Ngày tạo09/05/2026
Ngày cập nhật09/05/2026
Tác giảPhòng Phân tích Nghiệp vụ — TechVN
Người phê duyệtPhạm Minh Đức — Product Owner
Trạng tháiĐã phê duyệt (Approved)
Mức độ bảo mậtNội bộ (Internal)
SRS tham chiếuSRS-TECHVN-ECOM-2026-001 v1.0
PRD tham chiếuPRD-TECHVN-2026-001 v1.0

Lịch sử thay đổi

Phiên bảnNgàyNgười thay đổiMô tả
0.120/04/2026Nguyễn Văn AKhởi tạo, xác định Actors và Use Case Diagram
0.530/04/2026Trần Thị BĐặc tả chi tiết UC-01 → UC-08
0.805/05/2026Nguyễn Văn AĐặc tả UC-09 → UC-18, bổ sung Activity Diagram
1.009/05/2026Phạm Minh ĐứcPhê duyệt chính thức

Mục lục

  1. Tổng quan
  2. Định nghĩa Actor
  3. Sơ đồ Use Case tổng quan
  4. Danh sách Use Case
  5. Đặc tả Use Case chi tiết
  6. Ma trận truy vết
  7. Phụ lục

1. Tổng quan

1.1 Mục đích

Tài liệu này đặc tả chi tiết các Use Case của hệ thống Website Thương mại Điện tử TechVN. Mỗi Use Case mô tả một tương tác hoàn chỉnh giữa Actor và hệ thống, bao gồm luồng chính, luồng thay thế, luồng ngoại lệ, tiền điều kiện, hậu điều kiện và quy tắc nghiệp vụ liên quan.

1.2 Phạm vi

Tài liệu bao phủ toàn bộ các chức năng được mô tả trong SRS-TECHVN-ECOM-2026-001, chia thành 6 gói Use Case (Use Case Package):

GóiMô tảSố Use Case
PKG-01: Quản lý tài khoảnĐăng ký, đăng nhập, khôi phục mật khẩu, quản lý hồ sơ5
PKG-02: Catalog sản phẩmDuyệt danh mục, xem chi tiết, tìm kiếm, lọc, so sánh4
PKG-03: Mua hàngGiỏ hàng, đặt hàng, thanh toán, trả góp4
PKG-04: Sau mua hàngTheo dõi đơn, hủy đơn, đánh giá, hoàn trả3
PKG-05: Khuyến mãi & Thông báoMã giảm giá, thông báo đa kênh2
PKG-06: Quản trị hệ thốngQuản lý SP, đơn hàng, báo cáo, phân quyền5
Tổng23

1.3 Quy ước tài liệu

Mức ưu tiên:

Ký hiệuMứcÝ nghĩa
P1CriticalBắt buộc cho MVP, hệ thống không hoạt động nếu thiếu
P2HighCần có trong phiên bản chính thức
P3MediumNên có, nâng cao trải nghiệm
P4LowCó thể triển khai sau

Mức độ phức tạp:

Ký hiệuMô tả
★☆☆Đơn giản — CRUD cơ bản, ít logic nghiệp vụ
★★☆Trung bình — Logic nghiệp vụ vừa phải, tích hợp 1-2 hệ thống
★★★Phức tạp — Logic nghiệp vụ phức tạp, tích hợp nhiều hệ thống, xử lý đồng thời

2. Định nghĩa Actor

2.1 Actor chính (Primary Actors)

ActorMô tảXác thực
Khách vãng laiACT-GUESTNgười truy cập website chưa đăng ký hoặc chưa đăng nhập. Có thể duyệt sản phẩm, tìm kiếm, so sánh và thêm vào giỏ hàng. Không thể đặt hàng.Không
Khách hàngACT-CUSTOMERNgười dùng đã đăng ký tài khoản và đăng nhập. Có đầy đủ quyền mua sắm, quản lý đơn hàng, đánh giá sản phẩm.Email/SĐT + Mật khẩu, hoặc Google/Facebook OAuth
Quản trị viên — Quản lý sản phẩmACT-ADMIN-PRDNhân viên phụ trách quản lý catalog sản phẩm: thêm, sửa, xóa, import sản phẩm.Email nội bộ + Mật khẩu + MFA
Quản trị viên — Quản lý đơn hàngACT-ADMIN-ORDNhân viên phụ trách xử lý đơn hàng: xác nhận, tạo vận đơn, xử lý hoàn trả.Email nội bộ + Mật khẩu + MFA
Quản trị viên — MarketingACT-ADMIN-MKTNhân viên phụ trách khuyến mãi, banner, nội dung website.Email nội bộ + Mật khẩu + MFA
Super AdminACT-SUPER-ADMINQuản trị toàn quyền: phân quyền, cấu hình hệ thống, xem audit log.Email nội bộ + Mật khẩu + MFA

2.2 Actor phụ (Secondary / System Actors)

ActorMô tảLoại
Cổng thanh toánACT-PAYMENTVNPAY, MoMo — xử lý giao dịch thanh toán trực tuyến, gửi callback kết quả.Hệ thống bên ngoài
Đơn vị vận chuyểnACT-SHIPPINGGHTK, GHN — tính phí, tạo đơn vận chuyển, cập nhật trạng thái giao hàng qua webhook.Hệ thống bên ngoài
Hệ thống ERPACT-ERPSAP Business One — nguồn dữ liệu tồn kho, giá bán, thông tin sản phẩm gốc.Hệ thống nội bộ
Công ty tài chínhACT-FINANCEHD Saison, FE Credit — duyệt hồ sơ trả góp, thông báo kết quả.Hệ thống bên ngoài
Hệ thống emailACT-EMAILAWS SES — gửi email transactional và marketing.Hệ thống nội bộ
Hệ thống SMSACT-SMSSpeedSMS — gửi OTP, thông báo đơn hàng qua SMS.Hệ thống bên ngoài
Hệ thống lên lịchACT-SCHEDULERCron jobs — xử lý tác vụ định kỳ: dọn giỏ hàng, đồng bộ tồn kho, gửi email nhắc nhở.Hệ thống nội bộ

2.3 Sơ đồ phân cấp Actor

                        Người dùng
                       (User)
                      /          \
                     /            \
            Khách vãng lai    Người dùng
            (Guest)           đã xác thực
                              (Authenticated)
                             /              \
                            /                \
                     Khách hàng          Quản trị viên
                     (Customer)          (Admin)
                                        /    |    \      \
                                       /     |     \      \
                                 QL SP  QL ĐH  Marketing  Super
                                                           Admin

Quan hệ kế thừa: Khách hàng kế thừa toàn bộ quyền của Khách vãng lai. Super Admin kế thừa toàn bộ quyền của các Admin khác.


3. Sơ đồ Use Case tổng quan

3.1 PKG-01: Quản lý tài khoản

┌─────────────────────────────────────────────────────────┐
│                PKG-01: QUẢN LÝ TÀI KHOẢN               │
│                                                         │
│                                                         │
│   ┌─┐                                                  │
│   │G│──── UC-01: Đăng ký tài khoản                     │
│   │U│                  │                                │
│   │E│           <<include>>                             │
│   │S│                  ▼                                │
│   │T│      UC-02: Xác thực OTP ◄─── ACT-SMS            │
│   └─┘                                                  │
│                                                         │
│   ┌─┐                                                  │
│   │C│──── UC-03: Đăng nhập                             │
│   │U│          │                                        │
│   │S│    <<extend>>                                     │
│   │T│          ▼                                        │
│   │O│      UC-04: Đăng nhập OAuth ◄── Google/Facebook  │
│   │M│                                                  │
│   │E│──── UC-05: Khôi phục mật khẩu ──► ACT-EMAIL     │
│   │R│                                                  │
│   │ │──── UC-06: Quản lý hồ sơ cá nhân                │
│   └─┘                                                  │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.2 PKG-02: Catalog sản phẩm

┌─────────────────────────────────────────────────────────┐
│              PKG-02: CATALOG SẢN PHẨM                   │
│                                                         │
│   ┌─┐                                                  │
│   │G│──── UC-07: Duyệt sản phẩm theo danh mục         │
│   │U│                                                  │
│   │E│──── UC-08: Xem chi tiết sản phẩm                 │
│   │S│                                                  │
│   │T│──── UC-09: Tìm kiếm sản phẩm ──► Elasticsearch  │
│   │ │          │                                        │
│   │/│    <<extend>>                                     │
│   │ │          ▼                                        │
│   │C│      UC-10: Lọc sản phẩm nâng cao                │
│   │U│                                                  │
│   │S│──── UC-11: So sánh sản phẩm                      │
│   │T│                                                  │
│   └─┘                                                  │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.3 PKG-03: Mua hàng

┌─────────────────────────────────────────────────────────┐
│                 PKG-03: MUA HÀNG                        │
│                                                         │
│   ┌─┐                                                  │
│   │C│──── UC-12: Quản lý giỏ hàng                      │
│   │U│          │                                        │
│   │S│    <<include>>                                    │
│   │T│          ▼                                        │
│   │O│      UC-13: Áp dụng mã giảm giá                  │
│   │M│                                                  │
│   │E│──── UC-14: Đặt hàng (Checkout)                   │
│   │R│          │              │                         │
│   │ │    <<include>>    <<include>>                     │
│   └─┘          ▼              ▼                         │
│         UC-15: Thanh toán   UC-16: Chọn                │
│         trực tuyến          vận chuyển                  │
│              │                    │                      │
│              ▼                    ▼                      │
│         ACT-PAYMENT          ACT-SHIPPING               │
│                                                         │
│   ┌─┐                                                  │
│   │C│──── UC-17: Mua trả góp ──► ACT-FINANCE           │
│   │U│                                                  │
│   └─┘                                                  │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.4 PKG-04: Sau mua hàng

┌─────────────────────────────────────────────────────────┐
│               PKG-04: SAU MUA HÀNG                      │
│                                                         │
│   ┌─┐                                                  │
│   │C│──── UC-18: Theo dõi đơn hàng                     │
│   │U│                                                  │
│   │S│──── UC-19: Hủy đơn hàng                          │
│   │T│                                                  │
│   │O│──── UC-20: Đánh giá sản phẩm                     │
│   │M│                                                  │
│   │E│──── UC-21: Yêu cầu hoàn trả                      │
│   │R│                                                  │
│   └─┘                                                  │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.5 PKG-05 & PKG-06: Quản trị

┌─────────────────────────────────────────────────────────┐
│        PKG-06: QUẢN TRỊ HỆ THỐNG                       │
│                                                         │
│   ┌────┐                                               │
│   │ADM │──── UC-22: Quản lý sản phẩm (CRUD)            │
│   │PRD │          │                                     │
│   └────┘    <<extend>>                                  │
│                  ▼                                       │
│            UC-23: Import sản phẩm hàng loạt             │
│                                                         │
│   ┌────┐                                               │
│   │ADM │──── UC-24: Xử lý đơn hàng                     │
│   │ORD │          │              │                      │
│   └────┘    <<include>>    <<include>>                  │
│                  ▼              ▼                        │
│           UC-25: Tạo đơn   UC-26: Xử lý                │
│           vận chuyển       hoàn tiền                    │
│                │                │                        │
│                ▼                ▼                        │
│           ACT-SHIPPING     ACT-PAYMENT                  │
│                                                         │
│   ┌────┐                                               │
│   │SUP │──── UC-27: Quản lý phân quyền                 │
│   │ADM │                                               │
│   │    │──── UC-28: Xem Dashboard báo cáo              │
│   └────┘                                               │
│                                                         │
└─────────────────────────────────────────────────────────┘

4. Danh sách Use Case

Tên Use CaseActor chínhƯu tiênPhức tạpSRS RefRelease
PKG-01: Quản lý tài khoản
UC-01Đăng ký tài khoảnKhách vãng laiP1★★☆FR-ACC-001R1
UC-02Xác thực OTPKhách vãng laiP1★☆☆FR-ACC-001R1
UC-03Đăng nhậpKhách hàngP1★☆☆FR-ACC-002R1
UC-04Đăng nhập qua OAuthKhách hàngP2★★☆FR-ACC-002R3
UC-05Khôi phục mật khẩuKhách hàngP1★★☆FR-ACC-003R1
UC-06Quản lý hồ sơ cá nhânKhách hàngP2★☆☆FR-ACC-001R2
PKG-02: Catalog sản phẩm
UC-07Duyệt sản phẩm theo danh mụcTất cảP1★★☆FR-PRD-001R1
UC-08Xem chi tiết sản phẩmTất cảP1★★☆FR-PRD-002R1
UC-09Tìm kiếm sản phẩmTất cảP1★★★FR-PRD-003R2
UC-10Lọc sản phẩm nâng caoTất cảP1★★☆FR-PRD-003R2
UC-11So sánh sản phẩmTất cảP3★★☆FR-PRD-004R3
PKG-03: Mua hàng
UC-12Quản lý giỏ hàngTất cảP1★★☆FR-ORD-001R1
UC-13Áp dụng mã giảm giáKhách hàngP2★★☆FR-PRM-001R3
UC-14Đặt hàng (Checkout)Khách hàngP1★★★FR-ORD-002R1
UC-15Thanh toán trực tuyếnKhách hàngP1★★★FR-ORD-002R2
UC-16Chọn phương thức vận chuyểnKhách hàngP1★★☆FR-ORD-002R2
UC-17Mua trả gópKhách hàngP2★★★FR-ORD-003R2
PKG-04: Sau mua hàng
UC-18Theo dõi đơn hàngKhách hàngP1★★☆FR-ORD-002R1
UC-19Hủy đơn hàngKhách hàngP1★★☆FR-ORD-002R1
UC-20Đánh giá sản phẩmKhách hàngP3★★☆FR-REV-001R3
UC-21Yêu cầu hoàn trảKhách hàngP2★★☆FR-ORD-002R2
PKG-05: Khuyến mãi
UC-13(đã liệt kê trong PKG-03)
UC-22Quản lý chương trình khuyến mãiAdmin MarketingP2★★☆FR-PRM-001R3
PKG-06: Quản trị
UC-23Quản lý sản phẩm (Admin)Admin SPP1★★★FR-ADM-002R1
UC-24Import sản phẩm hàng loạtAdmin SPP2★★☆FR-ADM-002R2
UC-25Xử lý đơn hàng (Admin)Admin ĐHP1★★★FR-ADM-003R1
UC-26Quản lý phân quyềnSuper AdminP1★★☆FR-ADM-004R1
UC-27Xem Dashboard báo cáoAdminP2★★☆FR-ADM-001R3

5. Đặc tả Use Case chi tiết


UC-01: Đăng ký tài khoản

Thuộc tínhChi tiết
Mã Use CaseUC-01
TênĐăng ký tài khoản khách hàng
Mô tảCho phép khách vãng lai tạo tài khoản mới bằng email hoặc số điện thoại để sử dụng các tính năng dành cho thành viên (đặt hàng, tích điểm, theo dõi đơn).
Actor chínhACT-GUEST (Khách vãng lai)
Actor phụACT-SMS (Hệ thống SMS), ACT-EMAIL (Hệ thống Email)
Mức ưu tiênP1 — Critical
Độ phức tạp★★☆
Tần suất sử dụng~200 lần/ngày (dự kiến sau go-live 3 tháng)
SRS tham chiếuFR-ACC-001
User StoryUS-1.1, US-1.2
ReleaseR1 — MVP

Tiền điều kiện (Pre-conditions):

#Điều kiện
PRE-01Người dùng chưa đăng nhập (trạng thái Guest).
PRE-02Hệ thống SMS/Email gateway hoạt động bình thường.
PRE-03Người dùng có thiết bị kết nối Internet và trình duyệt tương thích.

Hậu điều kiện (Post-conditions):

#Điều kiệnLoại
POST-01Tài khoản mới được tạo trong cơ sở dữ liệu với trạng thái ACTIVE.Thành công
POST-02Người dùng được tự động đăng nhập (JWT token được tạo).Thành công
POST-03Email chào mừng được gửi đến người dùng.Thành công
POST-04Không có tài khoản nào được tạo nếu quá trình thất bại.Thất bại

Luồng chính (Main Flow / Basic Flow):

BướcActorHệ thống
1Người dùng truy cập trang Đăng ký (từ header hoặc khi được yêu cầu đăng nhập).Hiển thị form đăng ký với 2 tab: "Email" (mặc định) và "Số điện thoại".
2Người dùng chọn tab đăng ký (Email hoặc SĐT).Hiển thị form tương ứng.
3Người dùng nhập thông tin: Họ tên, Email (hoặc SĐT), Mật khẩu, Xác nhận mật khẩu.Validate realtime từng trường khi blur: - Họ tên: 2-50 ký tự. - Email: format hợp lệ (RFC 5322). - SĐT: 10 số, bắt đầu bằng 0 (03x, 05x, 07x, 08x, 09x). - Mật khẩu: ≥ 8 ký tự, chứa chữ hoa, chữ thường, số. - Xác nhận mật khẩu: khớp với mật khẩu. Hiển thị indicator độ mạnh mật khẩu (Yếu/Trung bình/Mạnh).
4Người dùng nhấn nút "Đăng ký".4.1. Kiểm tra Email/SĐT chưa tồn tại trong DB. 4.2. Tạo mã OTP 6 số ngẫu nhiên. 4.3. Lưu OTP vào Redis (TTL = 300 giây). 4.4. Gửi OTP qua kênh tương ứng: - Email: "Mã xác thực TechVN: 123456. Hiệu lực 5 phút." - SMS: "Ma xac thuc TechVN: 123456. Hieu luc 5 phut." 4.5. Hiển thị form nhập OTP với đồng hồ đếm ngược 5:00.
5Người dùng nhập mã OTP 6 số.Hiển thị auto-focus vào 6 ô input riêng biệt.
6Người dùng nhấn "Xác nhận" (hoặc tự động submit khi nhập đủ 6 số).6.1. So khớp OTP nhập với OTP lưu trong Redis. 6.2. Tạo bản ghi users trong PostgreSQL: - id: UUID v4. - email / phone: giá trị đã nhập. - password_hash: bcrypt(password, cost=12). - full_name: giá trị đã nhập. - status: ACTIVE. - role: CUSTOMER. - loyalty_points: 0. - created_at: timestamp hiện tại. 6.3. Xóa OTP khỏi Redis. 6.4. Tạo JWT access token (TTL 15 phút) và refresh token (TTL 30 ngày). 6.5. Đưa email chào mừng vào hàng đợi SQS notifications. 6.6. Trả về response chứa tokens + user profile.
7Chuyển hướng về trang chủ (hoặc trang trước đó nếu có redirect_url). Hiển thị toast: "Chào mừng bạn đến với TechVN!" và tên người dùng trên header.

Luồng thay thế (Alternative Flows):

TênPhân nhánh tạiMô tả
AF-01Đăng ký bằng SĐT thay vì EmailBước 2Người dùng chọn tab "Số điện thoại". Form hiển thị trường SĐT thay vì Email. OTP được gửi qua SMS thay vì Email. Các bước còn lại tương tự.
AF-02Gửi lại OTPBước 5Người dùng nhấn "Gửi lại mã" (hiển thị sau khi đếm ngược 60 giây). Hệ thống tạo OTP mới, hủy OTP cũ, gửi lại. Tối đa 3 lần gửi lại mỗi giờ cho cùng email/SĐT. Sau 3 lần: hiển thị "Bạn đã yêu cầu quá nhiều lần. Vui lòng thử lại sau 1 giờ."
AF-03Chuyển sang Đăng nhậpBước 1Người dùng nhấn link "Đã có tài khoản? Đăng nhập". Hệ thống chuyển đến trang Đăng nhập (UC-03).

Luồng ngoại lệ (Exception Flows):

TênPhân nhánh tạiĐiều kiệnXử lý
EX-01Email/SĐT đã tồn tạiBước 4.1SELECT trả về bản ghi tồn tạiHiển thị inline error: "Email này đã được đăng ký." Hiển thị link: "Đăng nhập" và "Quên mật khẩu?". Không tiết lộ thông tin tài khoản hiện có. Luồng dừng lại, người dùng có thể sửa hoặc chuyển sang đăng nhập.
EX-02Mật khẩu không đủ mạnhBước 3Mật khẩu < 8 ký tự hoặc thiếu chữ hoa/thường/sốHiển thị realtime bên dưới trường mật khẩu: ❌ Tối thiểu 8 ký tự / ✅ Chứa chữ hoa / ❌ Chứa số. Nút "Đăng ký" bị disable cho đến khi tất cả điều kiện đạt ✅.
EX-03OTP hết hạnBước 6.1OTP không tồn tại trong Redis (TTL hết)Hiển thị: "Mã xác thực đã hết hạn." Hiển thị nút "Gửi mã mới" (quay về AF-02).
EX-04OTP saiBước 6.1OTP nhập ≠ OTP lưuHiển thị: "Mã xác thực không đúng. Còn X lần thử." Tăng bộ đếm otp_attempts trong Redis. Tối đa 5 lần sai.
EX-05OTP sai quá 5 lầnBước 6.1otp_attempts ≥ 5Xóa OTP khỏi Redis. Hiển thị: "Bạn đã nhập sai quá nhiều lần. Vui lòng thử lại sau 30 phút." Lưu IP vào Redis blacklist (TTL = 1800 giây). Luồng dừng.
EX-06SMS/Email gateway lỗiBước 4.4API trả về lỗi hoặc timeoutRetry tự động 2 lần (khoảng cách 3 giây). Nếu vẫn thất bại: "Không thể gửi mã xác thực. Vui lòng thử lại sau hoặc chọn phương thức khác (Email ↔ SMS)." Log error để ops team xử lý.
EX-07Lỗi server nội bộBước 6.2Exception khi tạo user trong DBRollback transaction. Hiển thị: "Đã có lỗi xảy ra. Vui lòng thử lại sau." Log error chi tiết (không hiển thị cho người dùng).

Quy tắc nghiệp vụ (Business Rules):

Quy tắcChi tiết
BR-ACC-01Một email chỉ liên kết 1 tài khoảnUnique constraint trên cột email.
BR-ACC-02Một SĐT chỉ liên kết 1 tài khoảnUnique constraint trên cột phone.
BR-ACC-03Mật khẩu tối thiểu 8 ký tựChứa ít nhất: 1 chữ hoa, 1 chữ thường, 1 số.
BR-ACC-04OTP hiệu lực 5 phútLưu trong Redis với TTL = 300s.
BR-ACC-05Giới hạn gửi OTPTối đa 3 lần/giờ cho cùng email/SĐT.
BR-ACC-06Khóa đăng ký khi nhập sai OTP quá 5 lầnKhóa theo IP trong 30 phút.
BR-ACC-07SĐT Việt Nam hợp lệ10 số, bắt đầu 0, đầu số: 03x, 05x, 07x, 08x, 09x.

Activity Diagram:

        ┌─────────┐
        │  Bắt đầu │
        └────┬────┘

    ┌────────────────┐
    │ Hiển thị form  │
    │ đăng ký        │
    └────────┬───────┘

    ┌────────────────┐
    │ Nhập thông tin │
    │ (Tên, Email/   │
    │  SĐT, MK)     │
    └────────┬───────┘

    ┌────────────────┐     Không hợp lệ     ┌──────────────┐
    │ Validate       │─────────────────────>│ Hiển thị lỗi │
    │ client-side    │                       │ inline       │
    └────────┬───────┘                       └──────┬───────┘
             │ Hợp lệ                               │
             ▼                                       │ Sửa
    ┌────────────────┐                               │
    │ Gửi request    │<──────────────────────────────┘
    │ đăng ký        │
    └────────┬───────┘

       ┌───────────┐      Đã tồn tại     ┌───────────────┐
       │ Email/SĐT │────────────────────>│ Thông báo +   │
       │ tồn tại?  │                      │ link Đăng nhập│
       └─────┬─────┘                      └───────────────┘
             │ Chưa

    ┌────────────────┐
    │ Tạo OTP       │
    │ Gửi SMS/Email │
    └────────┬───────┘

    ┌────────────────┐
    │ Nhập OTP       │
    └────────┬───────┘

       ┌───────────┐       Sai           ┌───────────────┐
       │ OTP đúng? │────────────────────>│ Hiển thị lỗi  │
       └─────┬─────┘                     │ ≤5 lần: thử   │
             │ Đúng                       │ lại           │
             ▼                            │ >5 lần: khóa  │
    ┌────────────────┐                    └───────────────┘
    │ Tạo tài khoản  │
    │ Tạo JWT token  │
    │ Gửi email      │
    │ chào mừng      │
    └────────┬───────┘

    ┌────────────────┐
    │ Chuyển hướng   │
    │ trang chủ      │
    └────────┬───────┘

        ┌─────────┐
        │ Kết thúc │
        └─────────┘

Yêu cầu giao diện (UI Notes):

#Yêu cầu
UI-01Form nằm giữa trang, max-width 480px (Desktop), full-width padding 16px (Mobile).
UI-02Tab Email/SĐT chuyển đổi mượt mà (không reload trang).
UI-03Indicator độ mạnh mật khẩu: thanh progress bar (đỏ → vàng → xanh).
UI-04OTP input: 6 ô riêng biệt, auto-focus sang ô tiếp theo, hỗ trợ paste.
UI-05Đồng hồ đếm ngược OTP: format "MM:SS", đổi màu đỏ khi < 1 phút.
UI-06Nút "Đăng ký" trạng thái: disabled (xám) → enabled (xanh primary) khi form hợp lệ.
UI-07Hiển thị link: "Đã có tài khoản? Đăng nhập" và "Đăng ký bằng Google / Facebook".

Yêu cầu phi chức năng:

#Yêu cầuTarget
NF-01Thời gian phản hồi submit form≤ 2 giây
NF-02Thời gian gửi OTP (từ lúc request đến lúc user nhận)≤ 10 giây (Email), ≤ 5 giây (SMS)
NF-03Mật khẩu phải được hash trước khi lưubcrypt, cost = 12
NF-04OTP phải được tạo bằng CSPRNGcrypto.randomInt()
NF-05Chống brute force OTPRate limit + IP blacklist

UC-03: Đăng nhập

Thuộc tínhChi tiết
Mã Use CaseUC-03
TênĐăng nhập tài khoản khách hàng
Mô tảCho phép người dùng đã có tài khoản xác thực danh tính bằng email/SĐT + mật khẩu để truy cập các tính năng thành viên.
Actor chínhACT-CUSTOMER
Mức ưu tiênP1 — Critical
Độ phức tạp★☆☆
SRS tham chiếuFR-ACC-002
User StoryUS-1.3, US-1.4

Tiền điều kiện:

#Điều kiện
PRE-01Người dùng chưa đăng nhập (trạng thái Guest).
PRE-02Người dùng có tài khoản hợp lệ (status = ACTIVE).

Hậu điều kiện:

#Điều kiệnLoại
POST-01Session được tạo, JWT tokens được phát hành.Thành công
POST-02Giỏ hàng guest (localStorage) được merge với giỏ hàng server.Thành công
POST-03Bản ghi last_login_at được cập nhật.Thành công
POST-04Không có thay đổi trạng thái nếu đăng nhập thất bại.Thất bại

Luồng chính:

BướcActorHệ thống
1Người dùng truy cập trang Đăng nhập.Hiển thị form đăng nhập: Email/SĐT, Mật khẩu, checkbox "Ghi nhớ đăng nhập", nút "Đăng nhập", link "Quên mật khẩu?", nút "Đăng nhập bằng Google / Facebook".
2Người dùng nhập Email (hoặc SĐT) và Mật khẩu.Validate realtime: Email/SĐT không để trống, Mật khẩu không để trống.
3Người dùng nhấn "Đăng nhập".3.1. Tìm user bằng email hoặc phone trong DB. 3.2. So sánh mật khẩu nhập với password_hash (bcrypt.compare). 3.3. Kiểm tra status = ACTIVE. 3.4. Kiểm tra bộ đếm login_attempts trong Redis. 3.5. Reset login_attempts về 0. 3.6. Cập nhật last_login_at. 3.7. Tạo JWT access token (TTL 15 phút) và refresh token. - Nếu "Ghi nhớ đăng nhập": refresh token TTL = 30 ngày. - Nếu không: refresh token TTL = 24 giờ. 3.8. Kiểm tra giỏ hàng guest (từ request body nếu có) và merge với giỏ server.
4Chuyển hướng: - Nếu có redirect_url (VD: từ checkout): về trang đó. - Nếu không: về trang chủ. Hiển thị tên + avatar trên header.

Luồng thay thế:

TênMô tả
AF-01Đăng nhập bằng GoogleBước 1: Người dùng nhấn "Đăng nhập bằng Google". Hệ thống redirect đến Google OAuth consent screen. Google callback với authorization code. Hệ thống exchange code lấy user info (email, name, avatar). Nếu email đã tồn tại → đăng nhập (hoặc đề xuất liên kết tài khoản). Nếu email chưa tồn tại → tạo tài khoản mới (không cần mật khẩu), trạng thái ACTIVE.
AF-02Đăng nhập bằng FacebookTương tự AF-01, sử dụng Facebook OAuth.

Luồng ngoại lệ:

Điều kiệnXử lý
EX-01Email/SĐT không tồn tại trong DBHiển thị: "Thông tin đăng nhập không chính xác." (Không phân biệt sai email hay sai mật khẩu — chống enumeration).
EX-02Mật khẩu saiTăng login_attempts trong Redis (TTL 15 phút). Hiển thị: "Thông tin đăng nhập không chính xác. Còn X lần thử."
EX-03Sai mật khẩu 5 lần liên tiếpĐặt account_locked trong Redis (TTL = 900 giây / 15 phút). Hiển thị: "Tài khoản bị khóa tạm thời 15 phút. Sử dụng 'Quên mật khẩu' để đặt lại." Gửi email cảnh báo đến email tài khoản (qua SQS).
EX-04Tài khoản bị vô hiệu hóa (status ≠ ACTIVE)Hiển thị: "Tài khoản đã bị vô hiệu hóa. Vui lòng liên hệ CSKH: 1900-xxxx."

Quy tắc nghiệp vụ:

Quy tắc
BR-LGN-01Không phân biệt lỗi sai email hay sai mật khẩu trong thông báo (chống enumeration attack).
BR-LGN-02Khóa tạm thời 15 phút sau 5 lần sai mật khẩu liên tiếp.
BR-LGN-03"Ghi nhớ đăng nhập" kéo dài session 30 ngày (refresh token), mặc định 24 giờ.
BR-LGN-04Merge giỏ hàng: nếu SP đã tồn tại ở cả guest và server, lấy số lượng lớn hơn.

UC-08: Xem chi tiết sản phẩm

Thuộc tínhChi tiết
Mã Use CaseUC-08
TênXem chi tiết sản phẩm
Mô tảHiển thị đầy đủ thông tin sản phẩm (hình ảnh, giá, thông số kỹ thuật, đánh giá, sản phẩm liên quan) giúp khách hàng đưa ra quyết định mua hàng.
Actor chínhACT-GUEST, ACT-CUSTOMER
Mức ưu tiênP1 — Critical
Độ phức tạp★★☆
SRS tham chiếuFR-PRD-002
User StoryUS-2.2

Tiền điều kiện:

#Điều kiện
PRE-01Sản phẩm tồn tại trong DB với status = PUBLISHED.
PRE-02URL hợp lệ: /[category-slug]/[product-slug].

Luồng chính:

BướcActorHệ thống
1Người dùng truy cập URL sản phẩm (từ danh mục, tìm kiếm, hoặc link trực tiếp).1.1. Truy vấn sản phẩm theo slug (cache Redis → DB fallback). 1.2. Truy vấn đánh giá (top 5, sắp xếp mới nhất). 1.3. Truy vấn sản phẩm liên quan (cùng danh mục, cùng tầm giá, limit 8). 1.4. Ghi nhận lượt xem (increment view_count, async). 1.5. Lưu vào "Sản phẩm đã xem" (Redis / localStorage).
2Hiển thị trang chi tiết sản phẩm với layout: Khu vực trên (above the fold): - Bên trái (60%): Gallery ảnh (ảnh chính + thumbnail phụ). - Bên phải (40%): Tên SP, Rating, SKU, Giá, Trạng thái tồn kho, Bộ chọn variant (nếu có), Số lượng, Nút CTA. Khu vực dưới (tabbed content): - Tab "Thông số kỹ thuật": Bảng spec. - Tab "Mô tả chi tiết": HTML content. - Tab "Đánh giá (N)": Danh sách review + form viết review. Khu vực cuối: - Phụ kiện đi kèm, SP tương tự, SP đã xem.
3Người dùng tương tác với gallery ảnh (click thumbnail, zoom).Click thumbnail: ảnh chính thay đổi. Click ảnh chính (Desktop): mở lightbox zoom. Swipe (Mobile): chuyển ảnh theo gesture.
4Người dùng chọn variant (nếu sản phẩm có nhiều phiên bản).Cập nhật realtime: giá, thông số, trạng thái tồn kho, ảnh sản phẩm tương ứng variant. URL thêm ?variant=xxx (không reload trang).
5Người dùng chọn số lượng và nhấn "Thêm vào giỏ hàng" hoặc "Mua ngay".→ Chuyển sang UC-12 (Quản lý giỏ hàng).

Luồng thay thế:

TênMô tả
AF-01Thêm vào danh sách so sánhNgười dùng nhấn "So sánh". Hệ thống thêm SP vào thanh so sánh (sticky bar dưới cùng). Nếu đã có 4 SP → thông báo "Tối đa 4 sản phẩm".
AF-02Thêm vào WishlistNgười dùng nhấn icon ♡. Nếu đã đăng nhập: lưu vào wishlist trong DB. Nếu chưa đăng nhập: popup yêu cầu đăng nhập.
AF-03Chia sẻ sản phẩmNgười dùng nhấn "Chia sẻ". Hiển thị popup: Copy link, Facebook, Zalo, Messenger.

Luồng ngoại lệ:

Điều kiệnXử lý
EX-01Sản phẩm không tồn tại hoặc status ≠ PUBLISHEDTrả về trang 404 với gợi ý sản phẩm phổ biến.
EX-02Sản phẩm hết hàng (stock_quantity = 0)Hiển thị badge "Hết hàng" (đỏ). Disable nút "Thêm vào giỏ" và "Mua ngay". 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 SP.
EX-03Variant đã chọn hết hàngHiển thị "(Hết hàng)" bên cạnh tên variant. Disable variant đó (không chọn được). Tự động chọn variant còn hàng gần nhất.

Quy tắc nghiệp vụ:

Quy tắc
BR-PDP-01Giá hiển thị: Nếu có sale_price → hiển thị giá KM (đỏ, lớn) + giá gốc (gạch ngang) + badge "−X%".
BR-PDP-02Badge sản phẩm: "Mới" nếu created_at < 14 ngày. "Bán chạy" nếu sold_count top 10 danh mục.
BR-PDP-03Bảo hành: hiển thị theo brand (VD: ASUS 24 tháng, Dell 12 tháng Premium Support).
BR-PDP-04Trả góp: hiển thị "Trả góp 0%" nếu giá ≥ 3.000.000 VNĐ và có chương trình đang chạy.
BR-PDP-05SEO: title = "Tên SP — TechVN", description từ seo_description, canonical URL, Schema.org Product markup.

UC-14: Đặt hàng (Checkout)

Thuộc tínhChi tiết
Mã Use CaseUC-14
TênĐặt hàng — Quy trình Checkout
Mô tảCho phép khách hàng hoàn tất đặt hàng qua quy trình 3 bước: nhập thông tin giao hàng, chọn phương thức thanh toán và xác nhận đơn hàng.
Actor chínhACT-CUSTOMER
Actor phụACT-PAYMENT, ACT-SHIPPING, ACT-ERP, ACT-EMAIL, ACT-SMS
Mức ưu tiênP1 — Critical
Độ phức tạp★★★
SRS tham chiếuFR-ORD-002
User StoryUS-3.3, US-4.1

Tiền điều kiện:

#Điều kiện
PRE-01Người dùng đã đăng nhập (hoặc chuyển sang đăng nhập/đăng ký tại bước checkout).
PRE-02Giỏ hàng có ít nhất 1 sản phẩm.
PRE-03Tất cả sản phẩm trong giỏ hàng còn tồn kho.

Hậu điều kiện (thành công):

#Điều kiện
POST-01Đơn hàng mới được tạo trong DB với mã format TV-YYYYMMDD-XXXXX.
POST-02Trạng thái đơn hàng: "Chờ xác nhận" (COD) hoặc "Chờ thanh toán" (online).
POST-03Tồn kho bị trừ (tạm giữ 30 phút cho thanh toán online).
POST-04Giỏ hàng được xóa.
POST-05Email + SMS xác nhận đơn hàng được gửi cho khách.
POST-06Thông báo đơn hàng mới được gửi cho Admin.

Luồng chính:

BướcActorHệ thống
Bước 1 — Thông tin giao hàng
1.1Người dùng nhấn "Tiến hành đặt hàng" từ giỏ hàng.Kiểm tra đăng nhập. Nếu chưa → redirect đến trang đăng nhập (với redirect_url=/thanh-toan). Nếu đã đăng nhập → tiếp tục.
1.2Hiển thị bước 1 "Thông tin giao hàng": - Danh sách địa chỉ đã lưu (radio button, mặc định chọn địa chỉ default). - Nút "+ Thêm địa chỉ mới". - Ô "Ghi chú đơn hàng" (textarea, không bắt buộc). - Sidebar phải: Tóm tắt giỏ hàng (ảnh, tên, SL, giá).
1.3Người dùng chọn địa chỉ giao hàng (hoặc nhập mới).Validate địa chỉ: Họ tên, SĐT, Tỉnh/Thành, Quận/Huyện, Phường/Xã, Địa chỉ chi tiết (tất cả bắt buộc). Dropdown Tỉnh/Thành → auto-load Quận/Huyện → auto-load Phường/Xã (cascade).
1.4Gọi API tính phí vận chuyển (song song GHTK + GHN): Request: địa chỉ nhận, tổng trọng lượng, kích thước kiện hàng. Response: danh sách phương thức + phí + thời gian giao dự kiến.
1.5Hiển thị phương thức vận chuyển: ○ Giao tiêu chuẩn — 25.000đ — Dự kiến: Thứ 4, 14/05/2026 (3-5 ngày) ● Giao nhanh — 45.000đ — Dự kiến: Thứ 2, 12/05/2026 (1-2 ngày) (Mặc định chọn "Giao tiêu chuẩn").
1.6Người dùng chọn phương thức vận chuyển.Cập nhật phí ship và tổng cộng trên sidebar.
1.7Người dùng nhấn "Tiếp tục".Validate bước 1 hoàn tất. Lưu thông tin giao hàng vào session. Chuyển sang Bước 2. Progress bar cập nhật: ● Giao hàng ── ● Thanh toán ── ○ Xác nhận.
Bước 2 — Phương thức thanh toán
2.1Hiển thị danh sách 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 ○ VNPAY (ATM / Visa / Mastercard / QR Pay) ○ Ví MoMo ○ Trả góp (chỉ hiển thị khi tổng đơn ≥ 3.000.000đ)
2.2Người dùng chọn phương thức thanh toán.Nếu chọn "Chuyển khoản": hiển thị thông tin tài khoản NH (Vietcombank, BIDV). Nếu chọn "Trả góp": hiển thị bảng tính góp (→ extend UC-17).
2.3Người dùng nhấn "Tiếp tục".Lưu phương thức thanh toán vào session. Chuyển sang Bước 3.
Bước 3 — Xác nhận và Đặt hàng
3.1Hiển thị trang xác nhận tổng hợp: Sản phẩm: bảng (ảnh, tên, phiên bản, đơn giá, SL, thành tiền). Giao hàng: tên người nhận, SĐT, địa chỉ, phương thức, phí ship. Thanh toán: phương thức đã chọn. Tổng: - Tạm tính: 25.990.000đ - Mã giảm giá (WELCOME10): −500.000đ - Phí vận chuyển: 25.000đ - TỔNG THANH TOÁN: 25.515.000đ (font lớn, đỏ, đậm) Checkbox: "Tôi đã đọc và đồng ý với Điều khoản sử dụng và Chính sách mua hàng" (bắt buộc tick). Nút "Đặt hàng".
3.2Người dùng tick checkbox và nhấn "Đặt hàng".Xử lý đặt hàng (trong transaction DB): 3.2.1. Kiểm tra tồn kho lần cuối cho tất cả SP (SELECT FOR UPDATE). 3.2.2. Kiểm tra mã giảm giá còn hiệu lực. 3.2.3. Tạo bản ghi orders: - order_code: generate TV-YYYYMMDD-XXXXX. - status: PENDING_CONFIRM (COD) / PENDING_PAYMENT (online). - Các trường khác theo thông tin đã nhập. 3.2.4. Tạo bản ghi order_items cho từng SP. 3.2.5. Trừ stock_quantity trong products / product_variants. 3.2.6. Nếu có mã giảm giá: tăng used_count trong coupons. 3.2.7. Tạo bản ghi payments (status = PENDING nếu online). 3.2.8. Xóa giỏ hàng của user. 3.2.9. Commit transaction.
3.3Xử lý sau đặt hàng (async qua SQS): 3.3.1. Gửi email xác nhận đơn hàng cho khách. 3.3.2. Gửi SMS: "Đơn hàng TV-20260509-00001 đã được đặt thành công." 3.3.3. Gửi thông báo cho Admin (push notification / Slack). 3.3.4. Ghi log audit.
3.4Phân luồng theo phương thức thanh toán: - COD: Hiển thị trang "Đặt hàng thành công" (→ bước 4). - VNPAY/MoMo: Redirect đến cổng thanh toán (→ UC-15). - Chuyển khoản: Hiển thị thông tin CK + mã đơn hàng làm nội dung CK.
Bước 4 — Đặt hàng thành công (COD)
4.1Hiển thị trang xác nhận: - ✅ "Đặt hàng thành công!" - Mã đơn hàng: TV-20260509-00001 (copy-able). - Phương thức thanh toán: COD. - Thời gian giao dự kiến: Thứ 4, 14/05/2026. - Nút: "Theo dõi đơn hàng" → UC-18. - Nút: "Tiếp tục mua sắm" → Trang chủ.

Luồng ngoại lệ:

Điều kiệnBướcXử lý
EX-01SP trong giỏ hết hàng khi checkout3.2.1Rollback transaction. Hiển thị: "Sản phẩm [tên] đã hết hàng." Highlight SP hết hàng. Nút: "Xóa và tiếp tục" hoặc "Quay lại giỏ hàng".
EX-02SP thay đổi giá khi checkout3.2Hiển thị warning: "Giá sản phẩm [tên] đã thay đổi từ X → Y." Yêu cầu xác nhận lại đơn hàng với giá mới.
EX-03Mã giảm giá hết hạn / hết lượt3.2.2Xóa mã giảm giá khỏi đơn. Hiển thị: "Mã giảm giá [code] không còn hiệu lực." Cập nhật tổng thanh toán. Yêu cầu xác nhận lại.
EX-04Thanh toán online timeout (30 phút)Sau 3.4Scheduler: sau 30 phút đơn PENDING_PAYMENT chưa nhận callback → tự động hủy đơn, trả tồn kho. Gửi email: "Đơn hàng [mã] đã hết hạn thanh toán."
EX-05Lỗi hệ thống khi tạo đơn3.2Rollback transaction. Hiển thị: "Đã có lỗi xảy ra. Vui lòng thử lại." Giỏ hàng giữ nguyên. Log error.
EX-06API vận chuyển lỗi1.4Retry 2 lần. Nếu thất bại: hiển thị "Tạm thời không tính được phí vận chuyển. Vui lòng thử lại sau." Cho phép đặt hàng COD với phí ship cố định 30.000đ (fallback).

Quy tắc nghiệp vụ:

Quy tắc
BR-CHK-01Mã đơn hàng: TV-YYYYMMDD-XXXXX (X = số tự tăng trong ngày, padding 5 chữ số).
BR-CHK-02Tồn kho tạm giữ (hold) 30 phút cho đơn thanh toán online. Hết 30 phút không thanh toán → tự hủy + trả tồn kho.
BR-CHK-03Mỗi đơn hàng chỉ áp dụng 1 mã giảm giá.
BR-CHK-04Trả góp chỉ hiển thị khi tổng đơn ≥ 3.000.000 VNĐ.
BR-CHK-05COD giới hạn 20.000.000 VNĐ cho khách hàng mới (< 2 đơn hoàn thành). Khách quen không giới hạn.
BR-CHK-06Freeship cho đơn hàng ≥ 5.000.000 VNĐ (nội thành HCM, HN, ĐN).
BR-CHK-07Checkbox đồng ý điều khoản bắt buộc tick trước khi nhấn "Đặt hàng".

Sequence Diagram (tóm tắt):

Customer    Frontend    Backend     DB        Redis    GHTK/GHN   VNPAY     SQS
   │           │          │         │          │          │          │        │
   │──Checkout─>│          │         │          │          │          │        │
   │           │──────────>│         │          │          │          │        │
   │           │           │──Check stock──>│  │          │          │        │
   │           │           │<───────────────┤  │          │          │        │
   │           │           │                │  │          │          │        │
   │           │           │──Calc shipping────────────>│ │          │        │
   │           │           │<──────────────────────────┤  │          │        │
   │           │<──────────│         │          │          │          │        │
   │<──────────│           │         │          │          │          │        │
   │           │           │         │          │          │          │        │
   │──Place Order──>│      │         │          │          │          │        │
   │           │──────────>│         │          │          │          │        │
   │           │           │══BEGIN TX══>│     │          │          │        │
   │           │           │──Lock stock─>│    │          │          │        │
   │           │           │──Insert order>│   │          │          │        │
   │           │           │──Insert items>│   │          │          │        │
   │           │           │──Deduct stock>│   │          │          │        │
   │           │           │──Delete cart──────────────>│  │          │        │
   │           │           │══COMMIT════>│     │          │          │        │
   │           │           │             │     │          │          │        │
   │           │           │ (if VNPAY)  │     │          │          │        │
   │           │           │──Create payment URL──────────────────>│ │        │
   │           │           │<─────────────────────────────────────┤  │        │
   │           │<──────────│             │     │          │          │        │
   │<─Redirect─│           │             │     │          │          │        │
   │           │           │             │     │          │          │        │
   │           │           │──Emit events──────────────────────────────────>│
   │           │           │             │     │          │          │  (async)
   │           │           │             │     │          │          │  email
   │           │           │             │     │          │          │  sms
   │           │           │             │     │          │          │  notify

UC-25: Xử lý đơn hàng (Admin)

Thuộc tínhChi tiết
Mã Use CaseUC-25
TênXử lý đơn hàng — Quản trị viên
Mô tảCho phép nhân viên xem danh sách, xác nhận, tạo vận đơn, xử lý hoàn tiền và quản lý trạng thái đơn hàng.
Actor chínhACT-ADMIN-ORD (Quản lý đơn hàng)
Actor phụACT-SHIPPING, ACT-PAYMENT, ACT-EMAIL
Mức ưu tiênP1 — Critical
Độ phức tạp★★★
SRS tham chiếuFR-ADM-003
User StoryUS-9.1

Tiền điều kiện:

#Điều kiện
PRE-01Admin đã đăng nhập với role có quyền manage_orders.
PRE-02Đơn hàng tồn tại trong hệ thống.

Luồng chính — Xác nhận và giao hàng:

BướcActorHệ thống
1Admin truy cập "Quản lý đơn hàng".Hiển thị bảng đơn hàng: 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. Mặc định lọc: trạng thái "Chờ xác nhận", sắp xếp "Mới nhất". Hiển thị badge đếm số đơn "Chờ xác nhận" trên tab.
2Admin click vào đơn hàng cần xử lý.Hiển thị trang chi tiết đơn hàng gồm: Thông tin đơn: mã, ngày đặt, trạng thái, kênh thanh toán, trạng thái thanh toán. Khách hàng: tên, SĐT (click-to-call), email, số đơn đã mua, điểm thành viên. Sản phẩm: bảng (ảnh, tên, SKU, đơn giá, SL, thành tiền). Giao hàng: địa chỉ, phương thức, phí, thời gian dự kiến. Thanh toán: phương thức, trạng thái, transaction ID (nếu online). Ghi chú khách hàng: nội dung ghi chú của khách. Ghi chú nội bộ: textarea cho admin (khách hàng không nhìn thấy). Timeline: lịch sử trạng thái đơn hàng (timestamp + người thao tác). Hành động: nút theo trạng thái hiện tại.
3Admin review đơn hàng, thêm ghi chú nội bộ (nếu cần).Lưu ghi chú nội bộ vào orders.internal_note.
4Admin nhấn "Xác nhận đơn hàng".4.1. Kiểm tra tồn kho lần cuối. 4.2. Cập nhật orders.status = CONFIRMED, confirmed_at = now(). 4.3. Ghi log audit: {action: "ORDER_CONFIRMED", admin_id, order_id, timestamp}. 4.4. Gửi email + push notification cho khách: "Đơn hàng [mã] đã được xác nhận." 4.5. Hiển thị nút mới: "Tạo đơn vận chuyển".
5Admin nhấn "Tạo đơn vận chuyển".5.1. Gọi API GHTK/GHN: createShipment(order_info). 5.2. Nhận mã vận đơn: tracking_code. 5.3. Cập nhật orders.tracking_code, orders.shipping_provider. 5.4. Cập nhật orders.status = SHIPPING, shipped_at = now(). 5.5. Hiển thị nút: "In phiếu giao hàng" + "In phiếu xuất kho". 5.6. Gửi SMS cho khách: "Đơn hàng [mã] đang được giao. Mã vận đơn: [tracking]."
6Admin nhấn "In phiếu giao hàng".Generate PDF phiếu giao hàng gồm: barcode, thông tin người gửi/nhận, danh sách SP, ghi chú. Mở print dialog.
7(Hệ thống tự động)Đơn vị vận chuyển callback webhook khi trạng thái thay đổi: - "Đã lấy hàng" → cập nhật status. - "Đang giao" → cập nhật status. - "Đã giao" → cập nhật status = DELIVERED, delivered_at = now(). Gửi email + push cho khách: "Đơn hàng [mã] đã được giao thành công." - "Giao thất bại" → cập nhật status, thông báo cho Admin xử lý.

Luồng thay thế:

TênMô tả
AF-01Hủy đơn hàng (Admin)Admin nhấn "Hủy đơn hàng". Hệ thống hiển thị dialog chọn lý do: "Hết hàng", "Khách yêu cầu hủy", "Thông tin không xác thực", "Khác". Admin chọn lý do, xác nhận hủy. Hệ thống: cập nhật status = CANCELLED, trả lại tồn kho, trả lại mã giảm giá (nếu có). Nếu đã thanh toán online → kích hoạt refund (→ AF-02). Gửi email/SMS thông báo hủy cho khách.
AF-02Xử lý hoàn tiềnÁp dụng khi đơn đã thanh toán online bị hủy hoặc khách yêu cầu hoàn trả. Admin nhấn "Hoàn tiền". Hệ thống hiển thị: số tiền hoàn (mặc định = tổng đơn, cho phép hoàn 1 phần). Admin nhập số tiền, lý do, xác nhận. Hệ thống gọi API refund (VNPAY/MoMo). Cập nhật payments.status = REFUNDED. Gửi email cho khách: "Hoàn tiền [số tiền] cho đơn [mã]. Dự kiến nhận trong 5-7 ngày làm việc."
AF-03Tìm kiếm đơn hàngAdmin nhập mã đơn hàng, tên KH hoặc SĐT vào ô tìm kiếm. Hệ thống tìm kiếm realtime (debounce 300ms). Hiển thị kết quả khớp.

Luồng ngoại lệ:

Điều kiệnXử lý
EX-01Tồn kho không đủ khi xác nhậnHiển thị warning: "Sản phẩm [tên] chỉ còn X trong kho (đơn yêu cầu Y)." Cho phép Admin: "Xác nhận với SL khả dụng" hoặc "Liên hệ khách hàng" hoặc "Hủy đơn".
EX-02API vận chuyển lỗi khi tạo đơnHiển thị: "Không thể tạo đơn vận chuyển qua [GHTK/GHN]. Lỗi: [mô tả]." Nút: "Thử lại" hoặc "Chuyển sang [đơn vị khác]" hoặc "Tạo thủ công (nhập mã vận đơn)".
EX-03API refund lỗiHiển thị: "Hoàn tiền thất bại. Mã lỗi: [code]." Tạo ticket nội bộ cho bộ phận tài chính xử lý thủ công. Ghi log chi tiết.

State Diagram — Trạng thái đơn hàng:

                                ┌──────────────┐
                                │  PENDING_     │
                   ┌───────────>│  PAYMENT      │──── Timeout 30 min ────┐
                   │            │  (Chờ TT)     │                        │
                   │            └───────┬───────┘                        │
                   │                    │                                 │
                   │              Payment                                │
                   │              callback                               │
                   │              (success)                               │
                   │                    │                                 │
┌─────────┐   Online payment     ┌──────▼───────┐                        │
│ Created │────────────────────>│  PENDING_     │                        │
│ (Tạo    │                     │  CONFIRM      │                        │
│  đơn)   │────── COD ────────>│  (Chờ XN)     │                        │
└─────────┘                     └───────┬───────┘                        │
                                        │                                │
                                  Admin confirm                          │
                                        │                                │
                                ┌───────▼───────┐                        │
                                │  CONFIRMED    │                        │
                                │  (Đã XN)      │                        │
                                └───────┬───────┘                        │
                                        │                                │
                                  Create shipment                        │
                                        │                                │
                                ┌───────▼───────┐                        │
                                │  SHIPPING     │                        │
                                │  (Đang giao)  │                        │
                                └───────┬───────┘                        │
                                        │                                │
                                  Delivery callback                      │
                                   /          \                          │
                                  /            \                         │
                         ┌───────▼──┐    ┌──────▼───────┐               │
                         │ DELIVERED│    │  DELIVERY_   │               │
                         │ (Đã giao)│    │  FAILED      │               │
                         └─────┬────┘    │  (Giao TB)   │               │
                               │         └──────────────┘               │
                          After 7 days                                   │
                          (auto)                                         │
                               │                                         │
                         ┌─────▼────┐                                    │
                         │COMPLETED │                                    │
                         │(Hoàn     │                                    │
                         │ thành)   │                                    │
                         └──────────┘                                    │


                         ┌──────────┐                                    │
    (Hủy tại bất kỳ     │CANCELLED │<───────────────────────────────────┘
     bước nào trước      │(Đã hủy) │
     SHIPPING)           └──────────┘

                          (if paid)

                         ┌─────▼────┐
                         │ REFUNDED │
                         │(Đã hoàn  │
                         │ tiền)    │
                         └──────────┘


    DELIVERED ──── (Khách yêu cầu trong 7 ngày) ───> RETURN_REQUESTED

                                                     Admin approve

                                                      RETURNED

                                                      REFUNDED

6. Ma trận truy vết

6.1 Use Case → SRS Requirement

Use CaseFR-ACC-001FR-ACC-002FR-ACC-003FR-PRD-001FR-PRD-002FR-PRD-003FR-PRD-004FR-ORD-001FR-ORD-002FR-ORD-003FR-PRM-001FR-REV-001FR-NTF-001FR-ADM-001FR-ADM-002FR-ADM-003FR-ADM-004
UC-01
UC-02
UC-03
UC-04
UC-05
UC-06
UC-07
UC-08
UC-09
UC-10
UC-11
UC-12
UC-13
UC-14
UC-15
UC-16
UC-17
UC-18
UC-19
UC-20
UC-21
UC-22
UC-23
UC-24
UC-25
UC-26
UC-27

6.2 Use Case → User Story

Use CaseUser Stories
UC-01US-1.1, US-1.2
UC-03US-1.3
UC-04US-1.4
UC-05US-1.5
UC-06US-1.6
UC-07US-2.1
UC-08US-2.2
UC-09US-2.3
UC-10US-2.4
UC-11US-2.5
UC-12US-3.1, US-3.2
UC-13US-7.1
UC-14US-3.3
UC-15US-4.1
UC-17US-4.2
UC-18, UC-19US-5.1
UC-20US-6.1
UC-23, UC-24US-8.1
UC-25US-9.1
UC-27US-10.1

6.3 Use Case → Test Coverage (kế hoạch)

Use CaseSố Test Case ước tínhLoại test
UC-0112Unit + Integration + E2E
UC-038Unit + Integration + E2E
UC-0810Unit + Integration + E2E
UC-1215Unit + Integration + E2E
UC-1425Unit + Integration + E2E + Performance
UC-1512Integration + E2E (sandbox)
UC-2518Unit + Integration + E2E
Tổng ước tính~180

7. Phụ lục

7.1 Bảng mã trạng thái đơn hàng

Tên hiển thịMô tảCho phép hủyCho phép hoàn trả
PENDING_PAYMENTChờ thanh toánĐơn online chưa thanh toán, timeout 30 phútKhông
PENDING_CONFIRMChờ xác nhậnĐơn mới, chưa được Admin xử lýCó (KH + Admin)Không
CONFIRMEDĐã xác nhậnAdmin đã xác nhận, chờ đóng góiCó (Admin)Không
SHIPPINGĐang giao hàngĐơn đã được bàn giao cho đơn vị vận chuyểnKhôngKhông
DELIVEREDĐã giaoKhách đã nhận hàng thành côngKhôngCó (trong 7 ngày)
COMPLETEDHoàn thànhĐơn hàng hoàn tất (sau 7 ngày không khiếu nại)KhôngKhông
CANCELLEDĐã hủyĐơn hàng bị hủy bởi KH hoặc AdminN/AKhông
RETURN_REQUESTEDYêu cầu hoàn trảKhách yêu cầu trả hàng, chờ Admin duyệtKhôngĐang xử lý
RETURNEDĐã hoàn trảHàng đã được trả lại khoKhôngHoàn tất
REFUNDEDĐã hoàn tiềnTiền đã được hoàn cho khách (online)N/AN/A
DELIVERY_FAILEDGiao thất bạiĐơn vị vận chuyển không giao đượcCó (Admin)Không

7.2 Bảng mã lỗi API

HTTP CodeError CodeMô tảUse Case liên quan
400INVALID_INPUTDữ liệu đầu vào không hợp lệTất cả
400INVALID_OTPMã OTP không đúng hoặc hết hạnUC-01, UC-05
400WEAK_PASSWORDMật khẩu không đủ mạnhUC-01, UC-05
400INVALID_COUPONMã giảm giá không hợp lệUC-13
400INSUFFICIENT_STOCKTồn kho không đủUC-12, UC-14
401UNAUTHORIZEDChưa đăng nhập hoặc token hết hạnCác UC yêu cầu auth
401INVALID_CREDENTIALSSai email/SĐT hoặc mật khẩuUC-03
403FORBIDDENKhông có quyền thực hiện thao tácUC-23 → UC-27
403ACCOUNT_LOCKEDTài khoản bị khóa tạm thờiUC-03
404PRODUCT_NOT_FOUNDSản phẩm không tồn tạiUC-08
404ORDER_NOT_FOUNDĐơn hàng không tồn tạiUC-18, UC-19
409EMAIL_EXISTSEmail đã được đăng kýUC-01
409PHONE_EXISTSSĐT đã được đăng kýUC-01
422ORDER_CANNOT_CANCELĐơn hàng không thể hủy ở trạng thái hiện tạiUC-19
429RATE_LIMITEDVượt quá số lần request cho phépUC-01, UC-03, UC-09
500INTERNAL_ERRORLỗi server nội bộTất cả
502PAYMENT_GATEWAY_ERRORCổng thanh toán lỗiUC-15
502SHIPPING_API_ERRORAPI vận chuyển lỗiUC-14, UC-25

7.3 Tài liệu liên quan

Tên tài liệuMối quan hệ
BRD-TECHVN-2026-001Business Requirements DocumentYêu cầu kinh doanh gốc
PRD-TECHVN-2026-001Product Requirements DocumentYêu cầu sản phẩm
SRS-TECHVN-ECOM-2026-001Software Requirements SpecificationYêu cầu phần mềm (input chính)
US-TECHVN-ECOM-2026-001User Stories & Acceptance CriteriaUser Stories tương ứng
SA-TECHVN-2026-001Solution Architecture DocumentKiến trúc kỹ thuật
TC-TECHVN-2026-001Test Case DocumentTest cases (output từ Use Case)

7.4 Glossary

Thuật ngữĐịnh nghĩa
Use CaseMô tả tương tác hoàn chỉnh giữa Actor và hệ thống để đạt được một mục tiêu cụ thể
ActorThực thể bên ngoài tương tác với hệ thống (người dùng hoặc hệ thống khác)
Main FlowLuồng chính — kịch bản thành công (happy path)
Alternative FlowLuồng thay thế — cách khác để đạt cùng mục tiêu
Exception FlowLuồng ngoại lệ — xử lý lỗi, trường hợp bất thường
Pre-conditionĐiều kiện phải đúng trước khi Use Case bắt đầu
Post-conditionTrạng thái hệ thống sau khi Use Case hoàn tất
<<include>>Quan hệ bắt buộc: UC A luôn gọi UC B
<<extend>>Quan hệ tùy chọn: UC B mở rộng UC A trong điều kiện nhất định
CSPRNGCryptographically Secure Pseudo-Random Number Generator

Ghi chú: Tài liệu này đặc tả 4 Use Case đại diện ở mức chi tiết đầy đủ (UC-01, UC-03, UC-08, UC-14, UC-25). Các Use Case còn lại sẽ được đặc tả theo cùng format trong quá trình phát triển từng Sprint. Mọi thay đổi cần được Product Owner phê duyệt và ghi nhận trong phần Lịch sử thay đổi.

Last updated: