Skip to content

PRD: Quản lý khách hàng

ModuleQuản lý Người dùng (CORE-01)PRD IDPRD-CUS-001
StatusIn-progressOwnerIdentity squad
Date2026-03-15Versionv0.1
Packages@nx/identity · @nx/sale · @nx/coreURDCUS

TL;DR

Mang đến cho merchant một Customer hạng nhất để sale order gắn vào, cùng một đường nâng cấp khách hàng được ghi nhận lúc bán thành tài khoản user đầy đủ mang role Customer. Kết quả: đơn hàng ghi nhận được khách là ai, và người đứng sau đơn có thể trở thành user đã xác thực, gắn với organization, mà không sinh ra danh tính trùng lặp.

1. Bối cảnh & Vấn đề

Sale order cần một khách hàng thực để gắn vào. Trước đợt này chưa có thực thể Customer do một organization sở hữu, nên đơn hàng không thể ghi nhận khách là ai, và một khách hàng được ghi nhận tại điểm bán không bao giờ trở thành user đã xác thực được. Merchant mất đi mối liên kết giữa đơn hàng và người đứng sau nó, và cùng một khách hàng có thể bị nhập lại qua nhiều lần bán mà không có danh tính dùng chung.

Đợt này giới thiệu một thực thể Customer được tập trung trong @nx/core, đấu nối quản lý khách hàng vào package sale cho sale order, và thêm một đường registration trong identity để nâng cấp một khách hàng cấp sale đang tồn tại thành tài khoản user đầy đủ mang role Customer - được bảo vệ bằng kiểm tra trùng identifier để cùng một email/phone/username không bao giờ bị chiếm hai lần. Nó hiện thực vùng tính năng CUS được định nghĩa trong URD Quản lý Người dùng.

2. Mục tiêu & Không phải mục tiêu

Mục tiêu

  • Một thực thể Customer (model + schema + repository) cho khách hàng gắn với organization, dùng lại xuyên suốt saleidentity.
  • CRUD khách hàng theo phạm vi sale order trong package sale, kèm việc gắn khách hàng vào một SaleOrder.
  • Nâng cấp một khách hàng cấp sale thành tài khoản user đầy đủ mang role Customer, qua một CustomerRegistrationService chuyên trách trong identity.
  • Kiểm tra trùng identifier (username / email / phone) trước khi việc nâng cấp tạo ra user.

Không phải mục tiêu

  • Tạo role tùy biến hay quản lý permission động → Permissions.
  • Khách hàng tự đăng ký / đăng nhập OAuth.
  • Truy cập khách hàng đa organization cho một user duy nhất.
  • Tích điểm loyalty và gắn kết khách hàng (thuộc về sau, nằm ngoài đợt này).

3. Success Metrics

MetricMục tiêu / tín hiệu
Gán đơn cho kháchSale order mang tham chiếu Customer khi đã biết khách
Khử trùng danh tínhViệc nâng cấp không bao giờ tạo identifier trùng; xung đột bị chặn, không âm thầm gộp
Nâng cấp thành côngKhách đã nâng cấp đăng nhập được (sau khi có credential) và phân giải đúng role Customer + scope organization
Tái sử dụngMột model Customer duy nhất phục vụ cả saleidentity - không có bảng khách hàng song song

4. Personas & Use Cases

PersonaMục tiêu
OwnerTạo và duy trì khách hàng dưới organization của mình; nâng cấp một người mua đã biết thành tài khoản đầy đủ
Cashier / EmployeeGắn một khách hàng vào sale order tại điểm bán
CustomerĐược gắn với một organization và (sau khi nâng cấp) giữ một tài khoản mang role Customer

Kịch bản cốt lõi: tạo một khách hàng dưới một organization → gắn khách hàng vào một sale order → về sau, nâng cấp khách hàng cấp sale đó thành user mang role Customer, với kiểm tra trùng identifier chặn các bản trùng.

5. User Stories

  • Là một owner, tôi muốn tạo tài khoản khách hàng dưới organization của mình, để đơn hàng được gán cho một người mua đã biết.
  • Là một owner, tôi muốn một khách hàng vừa tạo tự động nhận role Customer và được gắn với organization của tôi, để scope đúng mà không cần bước thừa.
  • Là một cashier, tôi muốn gắn một khách hàng vào sale order, để đơn ghi nhận được khách là ai.
  • Là một owner, tôi muốn cập nhật hoặc soft-delete thông tin khách hàng, để dữ liệu luôn chính xác và không mất gì vĩnh viễn.
  • Là một owner, tôi muốn nâng cấp một khách hàng cấp sale thành tài khoản user đầy đủ, để một người mua thường xuyên trở thành user đã xác thực.
  • Là một owner, tôi muốn việc nâng cấp kiểm tra trùng identifier trước, để cùng một email / phone / username không bao giờ bị chiếm hai lần.

6. Functional Requirements

#Yêu cầuURD ref
FR-1Owner có thể tạo tài khoản khách hàng theo phạm vi một organizationURD-CUS-001
FR-2Một khách hàng được gắn với một organization và tự động nhận role CustomerURD-CUS-002
FR-3Hồ sơ khách hàng giữ tên và thông tin liên hệURD-CUS-003
FR-4Thông tin khách hàng có thể được cập nhật và soft-deleteURD-CUS-004
FR-5Một khách hàng có thể được gắn vào một SaleOrder (CRUD khách hàng nằm trong package sale)URD-CUS-001..004
FR-6Một khách hàng cấp sale có thể được nâng cấp thành tài khoản user đầy đủ qua CustomerRegistrationServiceURD-CUS-005
FR-7Việc nâng cấp kiểm tra trùng identifier (username / email / phone) trước khi tạo userURD-CUS-006

Toàn văn yêu cầu và tiêu chí chấp nhận nằm trong URD Quản lý Người dùng. PRD này tham chiếu chúng thay vì lặp lại.

7. Non-Functional Requirements

Khía cạnhYêu cầu
Toàn vẹn dữ liệuTạo / nâng cấp khách hàng là một thao tác duy nhất - nâng cấp dở dang không bao giờ để lại một user tạo nửa chừng
Tính duy nhất danh tínhMỗi loại identifier là duy nhất toàn cục; nâng cấp ép kiểm tra xung đột trước khi ghi
Tái sử dụngMột model Customer duy nhất trong @nx/core được saleidentity dùng chung - không có schema trùng
Tenancy & authzKhách hàng được scope theo một organization; các thao tác được gác bằng permission
Soft-deleteBản ghi khách hàng dùng soft-delete; dữ liệu không bao giờ bị xóa vật lý
i18nNhãn hiển thị cho người dùng là song ngữ ({ en, vi })

8. UX & Flows

Màn hình chính (trong apps/client): quản lý khách hàng trên sale order, tạo/sửa khách hàng, và điều khiển gắn-vào-đơn.

9. Data & Domain

Thực thểVai trò
CustomerKhách hàng gắn với organization (model + schema + repository) trong @nx/core, dùng lại bởi saleidentity
SaleOrderMang tham chiếu khách hàng; việc gắn khách hàng nằm trong aggregate sale
User + role CustomerTài khoản đầy đủ được tạo bởi CustomerRegistrationService
IdentifierUsername / email / phone được kiểm tra xung đột trước khi nâng cấp

Chỉ ở mức khái niệm - schema đầy đủ và các bất biến nằm trong domain model của identity.

10. Dependencies & Assumptions

Phụ thuộc vào

  • User Account & Roles (URD-USR · URD-ROLE) - việc nâng cấp tạo một user và gán role Customer.
  • Organization (@nx/core / Commerce) - một khách hàng được gắn với một organization.
  • Sale order (@nx/sale) - CRUD khách hàng được scope theo sale order, và một khách hàng gắn vào một SaleOrder.

Giả định

  • Merchant vận hành dưới một organization sở hữu khách hàng.
  • Tám role cố định (gồm Customer) được seed sẵn và sẵn sàng để gán.

11. Risks & Open Questions

Rủi ro / câu hỏiGiảm thiểu / trạng thái
Nâng cấp có thể tạo một danh tính trùngKiểm tra trùng identifier chặn trước khi tạo user
Khách đã nâng cấp chưa có credentialKhoảng trống đã biết - tài khoản khách hàng được tạo không kèm credential, nên chưa thể đăng nhập
Nâng cấp dở dang khi lỗiTạo / nâng cấp là một thao tác duy nhất; không có user ghi nửa chừng
Khách hàng đa organizationNgoài phạm vi; một khách hàng gắn với một organization

12. Release Plan & Launch Criteria

Khía cạnhKế hoạch
PhaseP2 - xem catalog tính năng URD (CUS đang In-progress; giao một phần của vùng này)
RolloutMọi merchant; không feature flag
MigrationThực thể mới (Customer); không migration dữ liệu
Launch criteriaTạo khách hàng → gắn vào sale order đã kiểm; nâng cấp tạo một user mang role Customer kèm kiểm tra xung đột; một model Customer dùng chung giữa sale + identity
MonitoringTỷ lệ lỗi tạo / nâng cấp khách hàng, số lần từ chối do trùng identifier, tỷ lệ đơn có khách hàng

13. FAQ

Thực thể Customer nằm ở đâu? Trong @nx/core (models/schemas/sale/customer), nên cả saleidentity dùng lại một model - không có bảng khách hàng song song.

Tạo một khách hàng có tạo một tài khoản đăng nhập không? Không - một khách hàng vừa tạo là một bản ghi gắn với organization. Việc nâng cấp biến một khách hàng cấp sale thành một user đầy đủ mang role Customer; credential (và đăng nhập) là một mối quan tâm riêng, đến sau.

Chuyện gì xảy ra nếu email hoặc phone đã bị dùng? Việc nâng cấp bị chặn với lỗi xung đột. Identifier là duy nhất toàn cục theo từng loại và được kiểm tra trước khi user được tạo.

Một khách hàng có thể thuộc nhiều organization không? Không - truy cập đa organization cho một khách hàng duy nhất nằm ngoài phạm vi.

Loyalty / tích điểm có nằm trong phần này không? Không - gắn kết khách hàng và loyalty được xử lý sau, ngoài đợt này.

References

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.