PRD: Quản trị Người dùng Merchant (Back Office)
| Module | Quản lý User | PRD ID | PRD-EMP-002 |
| Trạng thái | Sẵn sàng dev | FEAT | EMP · BANA-1435 |
| Epic | BANA-1336 | Plane | BANA-1737 |
| Ngày | 2026-06-30 | Phiên bản | v1.0 |
| Gói | @nx/identity | URD | EMP |
| Surface | BO · Vận hành | ||
| Phụ trách | Phát Nguyễn | ||
Quản trị Người dùng Merchant (Back Office) là gì
Chủ merchant có thể quản lý nhân viên của mình từ app Client (Quản lý nhân viên). Nhưng đội vận hành cũng cần quản lý người dùng merchant xuyên mọi merchant từ Back Office - để cấp nhân viên cho một client lúc onboarding, sửa một phân công, reset truy cập, hay khóa ai đó - mà không phải là chủ và không sửa database.
Tăng tiến này là bề mặt vận hành đó: một màn quản trị merchant-user xuyên merchant làm điều chủ làm cho nhân viên của họ, nhưng cho đội vận hành, gói theo vai trò của họ. Nó nằm cạnh quản trị nhân viên vận hành nội bộ (vốn quản lý đội nội bộ của chúng ta); màn này quản lý người dùng của merchant.
Một merchant user, từ tạo tới khóa
| Bước | Việc xảy ra |
|---|---|
| 1. Tìm | Ops mở danh sách xuyên merchant, tìm hoặc lọc theo organizer/merchant/vai trò/trạng thái |
| 2. Tạo | Tạo một merchant user với credential đăng nhập riêng |
| 3. Gán | Gán user vào một organizer và một merchant, kèm một hoặc nhiều vai trò |
| 4. Vận hành | Sửa hồ sơ; khóa hoặc mở khóa tài khoản khi cần |
| 5. Hướng tới | Gán nhiều merchant cho một user, gán lại trọn bộ, và xóa hẳn (🚧, xem §5) |
Chỗ dễ sai nhất
Tạo user hiện chưa là một giao dịch trọn vẹn
Thao tác tạo gồm nhiều bước nối tiếp - tạo tài khoản rồi mới gán organizer/merchant. Nếu lỗi giữa chừng và ops đổi merchant rồi thử lại, user có thể dính cả hai merchant; rời trang giữa chừng rồi tạo lại có thể sinh user trùng.
1. Mục tiêu & Loại trừ
Mục tiêu
- Một danh sách xuyên merchant của người dùng merchant ops tìm và lọc được.
- Tạo một merchant user.
- Gán một merchant user vào một organizer và merchant, kèm một hoặc nhiều vai trò; hướng tới gán nhiều merchant cho một user.
- Sửa và gán lại - thay bộ phân công merchant của một user (🚧).
- Khóa/mở khóa; hướng tới xóa một merchant user (🚧).
Loại trừ
- Chủ merchant tự quản lý nhân viên của mình trong app Client (Quản lý nhân viên) - cùng năng lực, khác surface.
- Tài khoản đội nội bộ của chúng ta (Quản trị nhân viên vận hành).
- Định nghĩa vai trò và quyền (Permissions).
2. Thước đo thành công
| Thước đo | Mục tiêu / tín hiệu |
|---|---|
| Ops tự làm | Ops cấp hoặc sửa người dùng của một merchant mà không sửa database |
| Gói phạm vi đúng | Một merchant user chỉ thấy các merchant họ được gán |
| Tầm với xuyên merchant | Ops quản lý người dùng cho bất kỳ merchant nào trong phạm vi vai trò |
3. Persona & Tình huống
| Persona | Mục tiêu ở tính năng này |
|---|---|
| Đội vận hành | Cấp và duy trì tài khoản nhân viên merchant xuyên nền tảng |
| Nhân viên onboarding / hỗ trợ | Lập người dùng đầu cho một merchant mới, hoặc sửa một vấn đề truy cập |
Tình huống chính: ops mở danh sách merchant-user, tạo một user cho một merchant, gán họ vào merchant đó kèm vai trò; sau đó khóa user khi họ rời đi. Mục tiêu kế tiếp: sửa phân công để thêm một merchant thứ hai hoặc chuyển hẳn sang merchant khác (🚧). Mọi hành động được kiểm tra để ops chỉ quản lý merchant trong phạm vi của mình.
4. User Stories
| # | Là một | Tôi muốn | Để |
|---|---|---|---|
| 01 | ops | một danh sách xuyên merchant của người dùng merchant | tìm và quản lý nhân viên của bất kỳ merchant nào |
| 02 | ops | tạo một merchant user và gán họ vào merchant kèm vai trò | một nhân viên mới đăng nhập được với phạm vi đúng |
| 03 | ops | gán lại merchant của một user | truy cập của họ phản ánh nơi họ thực sự làm |
| 04 | ops | khóa một merchant user | nhân viên đã rời mất truy cập |
| 05 | ops | phân công được kiểm tra theo phạm vi của tôi | tôi không bao giờ đụng merchant tôi không quản lý |
5. Yêu cầu chức năng
| # | Yêu cầu | Trạng thái | URD ref |
|---|---|---|---|
FR-001 | Một danh sách merchant-user xuyên merchant, tìm và lọc được, tách biệt khỏi tài khoản vận hành nội bộ. • 9 cột: Họ · Tên · Số điện thoại · Username · Email · Organizer · Merchant · Vai trò · Trạng thái; Organizer/Merchant/Vai trò hiển thị dạng nhãn, tối đa 3 nhãn mỗi ô, phần dư gộp thành nhãn "+n" - rê chuột để xem đủ. • Nhãn vai trò phân biệt vai trò hệ thống và vai trò tự tạo bằng màu và biểu tượng khác nhau. • Một ô tìm kiếm toàn cục, cộng 4 bộ lọc: Organizer (chọn một), Merchant (chọn một, thu theo Organizer đã chọn - đổi Organizer thì Merchant bị xóa để chọn lại), Vai trò (chọn một), Trạng thái (chọn nhiều - Đang hoạt động / Ngưng hoạt động / Khóa, màn này không có Lưu trữ). • Phân trang mặc định 50 dòng/trang (tùy chọn 25 / 50 / 75 / 100). | ✅ | URD-EMP-002 · URD-EMP-005 |
FR-002 | Form tạo một merchant user gồm 9 field: thông tin cá nhân, đăng nhập, trạng thái và phân quyền. • Họ, Tên: bắt buộc, văn bản tự do. • Username: bắt buộc khi tạo, 4-32 ký tự; chữ thường và số, cho phép dấu chấm / gạch dưới / gạch nối chen giữa; chữ hoa tự chuyển thành thường, khoảng trắng bị loại bỏ. • Email: tùy chọn, đúng định dạng email nếu nhập. • Số điện thoại: tùy chọn, nhiều số, thêm/bớt được, không yêu cầu xác minh khi tạo. • Mật khẩu: bắt buộc khi tạo, 8-80 ký tự, ít nhất 1 chữ hoa, 1 chữ thường và 1 chữ số, ô để trống phải tự nhập. • Trạng thái: bắt buộc, mặc định Đang hoạt động, bộ giá trị Đang hoạt động / Ngưng hoạt động / Khóa. • Organizer: bắt buộc, chọn một. • Merchant: bắt buộc, chọn một, danh sách thu theo Organizer đã chọn. • Vai trò: bắt buộc ≥ 1, chọn được nhiều vai trò cùng lúc của merchant đã chọn; chưa chọn Merchant thì ô Vai trò bị khóa; đổi Merchant thì mọi vai trò đã chọn bị xóa, phải chọn lại; vai trò không Đang hoạt động hiển thị nhưng không chọn được; merchant chưa có vai trò nào hiện thông báo rõ ràng; một thẻ xem trước cập nhật realtime theo các lựa chọn. | ✅ | URD-EMP-001 · URD-EMP-004 |
FR-003 | Gán một merchant user vào đúng một organizer và một merchant, kèm một hoặc nhiều vai trò trong merchant đó. • Khi tạo, cặp organizer-merchant nhất quán vì danh sách merchant thu theo organizer đã chọn. • Mục tiêu kế tiếp: gán một user vào nhiều merchant của cùng organizer, mỗi merchant kèm bộ vai trò riêng - thêm/bớt merchant ngay trên form, vai trò luôn chọn theo từng merchant, danh sách hiển thị đủ mọi merchant user thuộc về. | 🔶 | URD-EMP-002 · URD-ROLE-001 |
FR-004 | Gán lại bộ phân công merchant của một user - bộ mới thay TRỌN bộ cũ trong một thao tác. • Ở màn sửa, ops đổi được bộ phân công: chuyển sang merchant khác, thêm merchant, bớt merchant; không bao giờ để user "dính" merchant cũ ngoài ý muốn. • UI nói rõ trước khi lưu rằng bộ phân công cũ sẽ bị thay thế. • Hiện tại ở màn sửa, ô Organizer và Merchant hiển thị nhưng bị khóa - chỉ hồ sơ, trạng thái và bộ vai trò trong merchant hiện tại sửa được. | 🚧 | URD-EMP-006 |
FR-005 | Khóa/mở khóa một merchant user theo đúng trạng thái hiện tại; xóa hẳn là mục tiêu kế tiếp. • Hành động dòng trên danh sách: user Đang hoạt động → nút Khóa; user Khóa → nút Mở khóa; trạng thái khác (Ngưng hoạt động) → không hiện nút. • Cả hai chiều qua hộp thoại xác nhận trước khi thực hiện; user bị khóa không đăng nhập được cho tới khi được mở khóa. • Xóa (mục tiêu kế tiếp): một hành động xóa hẳn một merchant user, kèm xác nhận nêu rõ tài khoản sắp xóa. | 🔶 | URD-EMP-007 |
FR-006 | Mọi hành động được kiểm tra theo phạm vi ops và gác cho vai trò ops. • Màn chỉ truy cập được bằng tài khoản vận hành nội bộ trong Back Office. • Mục tiêu kế tiếp: từng thao tác gán/sửa được kiểm tra theo phạm vi merchant của vai trò ops - ops không gán được user vào merchant ngoài phạm vi mình quản lý, kể cả khi gửi yêu cầu thẳng lên. | 🔶 | URD-EMP-008 |
FR-007 | Hiển thị trạng thái xác minh định danh của từng merchant user; đổi thủ công không gửi SMS hay email. • Số điện thoại nhập lúc tạo user không cần xác minh - tài khoản dùng được ngay. • Danh sách và màn sửa hiển thị rõ từng email / số điện thoại đã xác minh hay chưa. • Nhân viên vận hành được ủy quyền bật/tắt trạng thái xác minh ngay trên Back Office - không gửi SMS hay email nào. | 🚧 | URD-USR-023 |
5.1 Tiêu chí nghiệm thu
- Tạo một merchant user với đủ field hợp lệ → user xuất hiện trong danh sách với đúng nhãn organizer, merchant và vai trò đã gán.
- Trong form tạo, chưa chọn merchant → ô vai trò khóa; chọn merchant xong đổi sang merchant khác → các vai trò đã chọn bị xóa hết.
- Bỏ trống organizer, merchant, hoặc không chọn vai trò nào khi tạo → không lưu được, field lỗi được chỉ rõ.
- Mật khẩu
abcdefgh(không hoa, không số) bị từ chối kèm thông báo. - Mở màn sửa → username và mật khẩu không xuất hiện; organizer và merchant hiển thị nhưng không đổi được.
- Nhấn Khóa trên một user Đang hoạt động → hộp thoại xác nhận → trạng thái thành Khóa, nút chuyển thành Mở khóa; user đó không đăng nhập được.
- Một user Ngưng hoạt động → không hiện nút khóa/mở khóa.
- Lọc Organizer A → danh sách chỉ còn user thuộc A; bộ lọc Merchant lúc này chỉ liệt kê merchant của A.
- Gán lại: đổi bộ merchant của một user và lưu → user chỉ còn thuộc bộ merchant mới, không còn dấu vết bộ cũ.
- Ops có phạm vi giới hạn gán user vào merchant ngoài phạm vi → bị từ chối kèm thông báo.
- Mở màn sửa một user có email / số điện thoại → thấy rõ từng định danh đã xác minh hay chưa.
- Ops được ủy quyền bật xác minh cho một số điện thoại → trạng thái chuyển thành đã xác minh ngay, không có SMS hay email nào được gửi.
6. Yêu cầu phi chức năng
| Khía cạnh | Yêu cầu |
|---|---|
| Phạm vi & phân quyền | Xuyên merchant trong phạm vi ops; gác cho vai trò ops |
| Gói truy cập | Truy cập dữ liệu của một merchant user lọc theo merchant họ được gán |
| Toàn vẹn tạo & gán | Tạo user và gán organizer/merchant là một giao dịch trọn vẹn về nghiệp vụ: không bao giờ tồn tại trạng thái dở dang - user không có membership, hoặc thuộc merchant ngoài ý muốn (xem §Hỏi đáp Rủi ro) |
| Toàn vẹn gán lại | Cập nhật phân công thay trọn bộ cũ, không để sót phân công cũ |
| Kiểm tra | Ops chỉ được gán merchant trong phạm vi của mình |
| i18n | Nhãn song ngữ (EN/VI) |
7. UX & Luồng
Ops quản lý một merchant user như thế nào:
Màn cho ops làm những gì:
Màn nằm trong mục "Phân quyền và Tài khoản" của Back Office, cạnh quản lý user nội bộ và vai trò.
8. Dữ liệu & Miền nghiệp vụ
| Khái niệm | Vai trò trong màn này |
|---|---|
| Merchant user | Một tài khoản nhân viên thuộc merchant và đăng nhập bằng credential riêng (mục tiêu: thuộc được nhiều merchant) |
| Phân công | Liên kết giữa một merchant user và organizer + merchant họ được truy cập |
| Vai trò | Cái user được làm trong merchant được gán; vai trò thuộc về merchant |
Chỉ ở mức khái niệm - một merchant user là một user liên kết với merchant; mô hình dữ liệu ở identity domain model.
9. Phụ thuộc & Giả định
Phụ thuộc vào
| # | Feature | Phụ thuộc điều gì |
|---|---|---|
| 01 | Merchant (Commerce) | đơn vị một merchant user được gán vào. |
| 02 | Vai trò & phạm vi (URD-ROLE - Phân quyền) | vai trò gán cho một merchant user, theo merchant. |
| 03 | Tài khoản người dùng | danh tính và credential một merchant user đăng nhập. |
Giả định
| # | Giả định | Sai thì sao |
|---|---|---|
| 01 | Ops đã đăng nhập với vai trò gói phạm vi merchant họ quản lý. | Không có cơ sở để giới hạn ops chỉ thao tác trên merchant mình quản lý - FR-006 mất căn cứ để thực thi. |
| 02 | Merchant được chọn đã có vai trò để gán. | Ô Vai trò hiện danh sách trống, ops không tạo được merchant user cho merchant đó cho tới khi có vai trò. |
10. Kế hoạch phát hành & Tiêu chí
| Khía cạnh | Kế hoạch |
|---|---|
| Phase | P1 - phần lõi (danh sách, tạo, gán 1 merchant, khóa/mở khóa) đã có cho ops trong Back Office |
| Rollout | User ops; không feature flag |
| Migration | Không - nó quản lý merchant user hiện có |
| Tiêu chí ra mắt (lõi, ✅) | Ops tạo một merchant user, gán họ vào một merchant kèm vai trò, và khóa/mở khóa - theo tiêu chí nghiệm thu §5.1 |
| Tiêu chí đợt kế tiếp (🚧) | Gán nhiều merchant (FR-003), gán lại trọn bộ (FR-004), xóa (FR-005), kiểm tra phạm vi ops (FR-006), trạng thái xác minh định danh (FR-007) |
| Theo dõi | Lượng tạo/sửa merchant-user; tỷ lệ khóa |
Tham chiếu
- URD: User Management -
EMP(Employee Management) ·ROLE- Phân quyền ·USR - Liên quan: PRD-OPS-001 - Operations staff & access administration · Permissions
- Module: User Management - URD · Lộ trình: Phase 2 - Theo tháng
- Developer: @nx/identity
Rủi ro & Câu hỏi mở
| # | Rủi ro / câu hỏi | Giảm thiểu / trạng thái |
|---|---|---|
| 01 | Tạo user gồm nhiều bước, chưa trọn vẹn: thao tác tạo gồm nhiều bước nối tiếp (tạo tài khoản rồi mới gán organizer/merchant); nếu lỗi giữa chừng và ops đổi merchant rồi thử lại, user có thể dính cả hai merchant; rời trang giữa chừng rồi tạo lại có thể sinh user trùng | Liên quan NFR "một giao dịch trọn vẹn" (§6); UI hiện cảnh báo khi rời trang còn dở |
| 02 | Ops quản lý một merchant ngoài phạm vi | FR-006 (🚧): mọi phân công được kiểm tra theo phạm vi ops |
| 03 | Gán lại thay toàn bộ phân công | FR-004: bộ mới thay trọn bộ cũ; UI nói rõ điều này trước khi lưu |
| 04 | User đang thuộc nhiều merchant (do lỗi bước tạo) mở ở màn sửa | Màn sửa hiện chỉ hiển thị phân công đầu tiên - hiển thị đủ thuộc phạm vi FR-003/FR-004 |
| 05 | Trùng với nhân viên do chủ quản lý | Cùng năng lực nền; đây là surface ops (BO), chủ dùng app Client |
Câu hỏi thường gặp
| # | Câu hỏi | Trả lời |
|---|---|---|
| 01 | Khác gì với chủ quản lý nhân viên của họ? | Cùng năng lực - nhưng đây là surface ops (back office) xuyên merchant; chủ quản lý nhân viên của mình trong app Client. |
| 02 | Khác gì với quản trị nhân viên vận hành? | Cái đó quản lý đội nội bộ của chúng ta; cái này quản lý người dùng của merchant. |
| 03 | Gán lại merchant thì xảy ra gì? | (FR-004) Bộ merchant mới thay trọn các phân công trước của user - không bao giờ để sót merchant cũ. Organizer/merchant hiện khóa ở màn sửa. |
| 04 | Một user thuộc được mấy merchant? | Hiện tại: đúng một merchant, gán lúc tạo. Mục tiêu (FR-003): một hoặc nhiều merchant của cùng organizer, vai trò theo từng merchant. |
| 05 | Ops quản lý được mọi merchant không? | Mục tiêu là chỉ merchant trong phạm vi vai trò của ops (FR-006); hiện màn mở cho tài khoản vận hành nội bộ. |