PRD: Nhóm quản lý agent
| Module | Helpdesk | PRD ID | PRD-AGT-001 |
| Trạng thái | Sẵn sàng dev | FEAT | AGT |
| Epic | — | Plane | BANA-1501 |
| Ngày | 2026-06-03 | Phiên bản | v1.1 |
| Gói | @nx/helpdesk | URD | AGT |
| Surface | BO · Vận hành | ||
| Phụ trách | Phát Nguyễn | ||
TL;DR
Một cụm màn back office để Đội vận hành (NEXPANDO & VNPAY) quản lý agent hỗ trợ và định tuyến ticket: danh sách và hồ sơ agent (kèm lịch làm việc), quản lý membership group của một agent ngay tại màn hình agent, chỉnh sửa thành viên group trong một luồng hợp nhất, và cấu hình các assignment rule theo thứ tự ưu tiên - tất cả scope theo organizer, tên group không được trùng trong cùng một organizer. Gom nhóm và tự động định tuyến trở thành tự phục vụ, thay cho các chỉnh sửa rời rạc ở mức thấp.
1. Context & Problem
Mô hình agent của Helpdesk đã có sẵn agent, agent group và assignment rule - nhưng bề mặt back office để quản lý chúng còn dang dở. Membership chỉ chỉnh sửa được rời rạc, tên group chưa bị ràng buộc duy nhất, và assignment rule chưa có màn hình quản lý. Đội vận hành không thể sắp xếp ai thuộc group nào hay ticket định tuyến ra sao nếu không dùng tới các thay đổi ad-hoc ở mức thấp.
Gói này dựng phần bề mặt còn thiếu đó trên nền domain agent-group và assignment-rule sẵn có. Cả cụm màn hiện đang phát triển: chúng ẩn khỏi menu của Back Office và chỉ truy cập được bằng đường dẫn trực tiếp cho tới khi đạt tiêu chí ra mắt.
2. Goals & Non-Goals
Goals
- Danh sách và hồ sơ agent: xem trạng thái làm việc, tải ticket hiện tại, và sửa thông tin agent - bao gồm lịch làm việc (lịch tuần, ngày ngoại lệ, ghi đè tạm thời).
- Quản lý membership group của một agent từ màn hình agent (thêm/xóa qua dialog "Manage groups").
- Chỉnh sửa thành viên của một group từ màn hình group qua một luồng chỉnh sửa thành viên hợp nhất (một lần lưu áp toàn bộ thay đổi).
- Bắt buộc tên agent-group là duy nhất trong một organizer.
- Mang scope organizer xuyên suốt các luồng chọn agent/group.
- Màn hình quản lý assignment rule, gồm cả thứ tự ưu tiên giữa các rule.
Non-Goals
- Bản thân logic tự động phân công (worker đánh giá rule) - đã có sẵn; xem URD-AGT-006…007.
- Theo dõi hiệu suất agent (URD-AGT-008).
3. Success Metrics
| Metric | Target / signal |
|---|---|
| Tự phục vụ gom nhóm | Membership group được quản lý hoàn toàn từ back office (không chỉnh sửa ở mức thấp) |
| Tên duy nhất | Không có tên agent-group trùng trong cùng một organizer |
| Phủ định tuyến | Assignment rule theo organizer được tạo và quản lý qua màn hình quản lý |
| Đơn giản hóa luồng | Chỉnh sửa thành viên đi qua một luồng hợp nhất, không qua các đường thêm/xóa riêng |
4. Personas & Use Cases
| Persona | Mục tiêu trong tính năng này |
|---|---|
| Quản lý hỗ trợ - Đội vận hành (NEXPANDO & VNPAY) | Quản lý agent, lịch làm việc, agent group, membership và cấu hình assignment rule |
| Agent hỗ trợ | Được đặt vào đúng group, đúng lịch làm việc để các ticket liên quan định tuyến tới mình |
Core scenarios: mở một agent → sửa hồ sơ và lịch làm việc → quản lý membership group trong dialog → mở một group → chỉnh sửa thành viên trong một lần lưu → tạo assignment rule và sắp thứ tự ưu tiên để ticket mới định tuyến tới đúng nơi.
5. User Stories
- Là quản lý hỗ trợ, tôi muốn thêm hoặc xóa membership group của một agent từ màn hình agent, để tôi quản lý việc gom nhóm ngay nơi mình đang làm việc.
- Là quản lý hỗ trợ, tôi muốn đặt lịch làm việc cho agent (lịch tuần, ngày nghỉ ngoại lệ, ghi đè tạm thời), để hệ thống chỉ định tuyến ticket khi agent thực sự làm việc.
- Là quản lý hỗ trợ, tôi muốn chỉnh sửa thành viên của một group trong một luồng duy nhất, để không phải xoay xở giữa các action thêm và xóa riêng biệt.
- Là quản lý hỗ trợ, tôi muốn tên agent-group là duy nhất trong organizer của mình, để các group không trùng tên giữa các merchant.
- Là quản lý hỗ trợ, tôi muốn một màn hình để tạo và sắp thứ tự ưu tiên các assignment rule, để tôi kiểm soát cách ticket mới được định tuyến.
- Là agent hỗ trợ, tôi muốn membership group của mình phản ánh đúng kỹ năng/đội nhóm thực tế, để đúng ticket đến tay tôi.
6. Functional Requirements
| # | Yêu cầu | Trạng thái | URD ref |
|---|---|---|---|
| FR-1 | Danh sách + form agent: hồ sơ, giới hạn tải, múi giờ, nhóm | ✅ đã dựng | URD-AGT-001 |
| FR-2 | Cấu hình lịch làm việc của agent trong form agent | ✅ đã dựng | URD-AGT-009 |
| FR-3 | Quản lý membership group từ màn hình agent qua dialog "Manage groups" | ✅ đã dựng | URD-AGT-004 |
| FR-4 | Vai trò thành viên trong group (Thành viên / Trưởng nhóm / Quản lý) | 🔶 một phần | URD-AGT-004 |
| FR-5 | Danh sách + form agent group; sửa thành viên qua một luồng hợp nhất | ✅ đã dựng | URD-AGT-004 |
| FR-6 | Tên agent-group duy nhất trong một organizer | 🚧 chưa dựng | URD-AGT-004 |
| FR-7 | Scope organizer xuyên suốt các bộ chọn agent/group | 🔶 một phần | URD-AGT-001 · URD-AGT-005 |
| FR-8 | Danh sách + form assignment rule (tên, kích hoạt, agent đích, chiến lược) | ✅ đã dựng | URD-AGT-005 |
| FR-9 | Thứ tự ưu tiên giữa các assignment rule, sắp xếp lại được | 🚧 chưa dựng | URD-AGT-005 |
| FR-10 | Điều kiện áp dụng cho một assignment rule | 🚧 chưa dựng | URD-AGT-005 |
FR-1 - Danh sách + form agent ✅
Bảng danh sách (không cột nào lọc được):
| Cột | Hiển thị |
|---|---|
| Tên | Song ngữ, hiện theo ngôn ngữ đang chọn |
| Người dùng | Họ tên của user được liên kết |
| Sẵn sàng nhận ticket | Dấu tích có/không |
| Trạng thái | Badge, một trong 4 giá trị: Trực tuyến (Online), Tạm vắng (Away), Ngoại tuyến (Offline), Bận (Busy) - chỉ hiển thị, không đặt tay từ form |
| Số ticket tối đa | Số |
| Số ticket đang xử lý | Số |
Action trên mỗi dòng: Sửa · Xóa (có hộp thoại xác nhận) · "Manage groups" (mở dialog - xem FR-3).
Form tạo/sửa:
| Field | Ràng buộc |
|---|---|
| Tên | Song ngữ EN/VI, bắt buộc, tối đa 200 ký tự |
| Người dùng | Chọn từ danh sách user của organizer, bắt buộc; chỉ chọn được khi tạo mới - khi sửa, liên kết user bị khóa |
| Số ticket tối đa đồng thời | Số, bắt buộc, tối thiểu 1 |
| Nhóm | Chọn nhiều từ các group của organizer, bắt buộc ít nhất 1 nhóm |
| Múi giờ | Chọn từ danh sách múi giờ chuẩn, mặc định Asia/Ho_Chi_Minh |
Khi sửa, form hiển thị thêm (chỉ đọc): tên đăng nhập, email, số điện thoại của user liên kết.
FR-2 - Lịch làm việc của agent ✅
Nằm trong form agent, gồm ba phần:
- Lịch tuần: từng ngày trong tuần (Thứ 2 → Chủ nhật), mỗi ngày khai báo các khung giờ làm việc bắt đầu-kết thúc trong ngày, chính xác tới phút.
- Ngày ngoại lệ: khai báo theo từng ngày cụ thể (nghỉ lễ, nghỉ đột xuất) - ghi đè lịch tuần cho ngày đó.
- Ghi đè tạm thời: một khoảng thời gian có ngày bắt đầu và ngày kết thúc; ngày bắt đầu phải trước ngày kết thúc, vi phạm thì form báo lỗi và không lưu.
FR-3 - Dialog "Manage groups" ✅
Từ dòng agent trong danh sách, action "Manage groups" mở dialog với một bộ chọn nhiều nhóm (giới hạn các group của organizer). Lưu dialog thay thế toàn bộ danh sách membership của agent theo lựa chọn mới.
FR-4 - Vai trò thành viên 🔶
Mỗi membership mang một vai trò. Hiện mọi membership được gán vai trò Thành viên (✅). Việc chọn vai trò Trưởng nhóm hoặc Quản lý cho một thành viên chưa có trên giao diện (🚧) - khi dựng, cả dialog "Manage groups" và luồng sửa thành viên phải cho chọn vai trò cho từng agent.
FR-5 - Danh sách + form agent group; sửa thành viên hợp nhất ✅
Bảng danh sách (không cột nào lọc được): Tên (song ngữ) · Mô tả (song ngữ) · Kích hoạt (dấu tích).
Action trên mỗi dòng: Sửa · Xóa · "Edit member" (mở dialog sửa thành viên).
Form tạo/sửa:
| Field | Ràng buộc |
|---|---|
| Tên | Song ngữ EN/VI, bắt buộc, tối đa 200 ký tự |
| Mô tả | Song ngữ EN/VI, tùy chọn, tối đa 400 ký tự |
| Kích hoạt | Bật/tắt, mặc định bật |
Luồng sửa thành viên hợp nhất: dialog "Edit member" có một bộ chọn nhiều agent; một lần lưu áp toàn bộ thay đổi (thêm và bớt cùng lúc). Lưu thất bại thì không thay đổi nào được áp - không để group ở trạng thái sửa dở.
FR-6 - Tên group duy nhất theo organizer 🚧
Trong cùng một organizer, không được tồn tại hai agent group cùng tên. Kiểm tra ở server khi lưu; nếu trùng, form báo lỗi ngay tại field Tên và không lưu. Trước khi bật quy tắc, tên group trùng lặp hiện có phải được khử trùng lặp theo organizer. Hiện form chưa chặn tên trùng.
FR-7 - Scope organizer 🔶
Mọi bộ chọn agent/group/user trong cụm màn này chỉ hiện dữ liệu của organizer đang thao tác. Đã áp cho: bộ chọn user và nhóm trong form agent, dialog "Manage groups", bộ chọn agent đích trong form assignment rule (✅). Chưa áp cho: bộ chọn agent trong dialog "Edit member" của màn group (🚧) - cần lọc theo organizer như các bộ chọn còn lại.
FR-8 - Danh sách + form assignment rule ✅
Bảng danh sách (không cột nào lọc được): Tên (song ngữ) · Kích hoạt (dấu tích) · Chiến lược phân công (badge).
Action trên mỗi dòng: Sửa · Xóa.
Form tạo/sửa:
| Field | Ràng buộc |
|---|---|
| Tên | Song ngữ EN/VI, bắt buộc, tối đa 200 ký tự |
| Kích hoạt | Bật/tắt, mặc định bật |
| Agent đích | Chọn một agent của organizer |
| Chiến lược phân công | Chọn một trong 7 giá trị, mặc định Thủ công |
Bộ chiến lược phân công (đủ 7): Thủ công (Manual) · Xoay vòng (Round-robin) · Theo kỹ năng (Skill-based) · Cân bằng tải (Load-balanced) · Kinh nghiệm tốt nhất (Best experience) · Xử lý nhanh nhất (Fastest resolution) · Kỹ năng + xoay vòng (Skill-based round-robin).
FR-9 - Thứ tự ưu tiên giữa các rule 🚧
Mỗi assignment rule có một thứ tự ưu tiên trong organizer; khi định tuyến, rule đứng trước được xét trước, rule đầu tiên khớp sẽ thắng. Đội vận hành sắp xếp lại được thứ tự này từ màn danh sách. Hiện màn danh sách là CRUD phẳng - chưa có cột thứ tự và chưa có thao tác sắp xếp.
FR-10 - Điều kiện áp dụng rule 🚧
Một rule khai báo được điều kiện áp dụng (ví dụ theo danh mục ticket) để chỉ những ticket khớp điều kiện mới đi qua rule đó. Chưa có trên giao diện.
Tiêu chí nghiệm thu
- Tạo agent bỏ trống Tên, Người dùng, Số ticket tối đa, hoặc không chọn nhóm nào → form báo lỗi từng field, không lưu.
- Số ticket tối đa nhập 0 hoặc số âm → form báo lỗi "tối thiểu 1".
- Sửa một agent → field Người dùng bị khóa, không đổi được liên kết user.
- Thêm ghi đè tạm thời trong lịch làm việc với ngày bắt đầu ≥ ngày kết thúc → form báo lỗi, không lưu.
- "Manage groups": bỏ chọn một nhóm và thêm một nhóm khác, lưu → mở lại dialog thấy đúng danh sách mới; vai trò của mọi membership là Thành viên.
- "Edit member" ở màn group: thêm 2 agent và bớt 1 agent trong cùng một lần lưu → danh sách thành viên phản ánh đủ cả ba thay đổi.
- (Khi FR-6 dựng xong) Tạo group trùng tên với group sẵn có trong cùng organizer → bị từ chối khi lưu, lỗi hiện tại field Tên.
- Tạo assignment rule chỉ nhập Tên → lưu thành công với chiến lược mặc định Thủ công, trạng thái kích hoạt bật; badge chiến lược hiện đúng trên bảng.
- Mỗi bộ chọn agent/group/user trong cụm màn chỉ liệt kê dữ liệu của organizer đang thao tác (khi FR-7 hoàn tất, gồm cả dialog "Edit member").
- (Khi FR-9 dựng xong) Đổi thứ tự hai rule → thứ tự mới giữ nguyên sau khi tải lại, và ticket mới được xét theo thứ tự mới.
7. Non-Functional Requirements
| Area | Requirement |
|---|---|
| Data integrity | Một agent xuất hiện tối đa một lần trong một group (không membership trùng lặp); xóa agent/group không để lại membership mồ côi |
| Tenancy & authz | Thao tác agent-group và assignment-rule được scope theo organizer; được kiểm soát bởi permission quản lý helpdesk |
| Consistency | Một lần lưu sửa-thành-viên áp toàn bộ thay đổi hoặc không áp gì; lưu thất bại không để group ở trạng thái sửa dở |
| i18n | Nhãn/trạng thái hiển thị cho người dùng là song ngữ (Anh/Việt) |
8. UX & Flows
Các màn hình chính (trong back office): danh sách + form agent (kèm lịch làm việc), dialog "Manage groups", danh sách + form group với dialog "Edit member", và màn quản lý assignment rule. Cả cụm hiện ẩn khỏi menu (đang phát triển) - truy cập bằng đường dẫn trực tiếp.
9. Data & Domain
| Khái niệm | Vai trò |
|---|---|
| Agent | Một user của organizer xử lý ticket; mang trạng thái làm việc (Trực tuyến/Tạm vắng/Ngoại tuyến/Bận), giới hạn ticket đồng thời, múi giờ, lịch làm việc, và các membership group |
| Agent group | Một group agent có tên (duy nhất theo organizer khi FR-6 bật), mô tả, trạng thái kích hoạt |
| Membership group | Liên kết agent ↔ group kèm vai trò (hiện luôn Thành viên) |
| Assignment rule | Một rule định tuyến của organizer: chiến lược phân công (7 lựa chọn), agent đích, trạng thái kích hoạt; thứ tự ưu tiên và điều kiện áp dụng đang dựng |
Chỉ ở mức khái niệm - schema chi tiết nằm trong domain model helpdesk.
10. Dependencies & Assumptions
Depends on
- Liên kết agent ↔ user (URD-AGT-001) - một agent tồn tại trong merchant trước khi có thể gom nhóm.
- Assignment strategy & worker (URD-AGT-006…007) - màn hình quản lý cấu hình các rule mà phân công tự động sẵn có sẽ đánh giá.
- Quản lý người dùng (CORE-01) - agent là user được liên kết với một merchant.
Assumptions
- Organizer có sẵn agent để gom nhóm và ít nhất một group để định tuyến tới.
- Domain agent-group và assignment-rule có trước gói này.
11. Risks & Open Questions
| Risk / question | Mitigation / status |
|---|---|
| Cụm màn đang phát triển, ẩn khỏi menu | Coi là đang làm; nghiệm thu theo bảng trạng thái FR trước khi mở menu |
| Thứ tự ưu tiên rule (FR-9) chưa dựng - worker cần thứ tự để xét rule | Dựng cột thứ tự + thao tác sắp xếp trước khi ra mắt; tạm thời rule xét không theo thứ tự người dùng kiểm soát |
| Bộ chọn agent trong "Edit member" chưa lọc theo organizer | Hoàn tất FR-7 trước khi ra mắt; kiểm tra không rò rỉ dữ liệu chéo organizer |
| Quy tắc tên duy nhất có thể đụng độ với tên group trùng lặp cũ | Khử trùng lặp tên group hiện có theo organizer trước khi áp quy tắc |
12. Release Plan & Launch Criteria
| Aspect | Plan |
|---|---|
| Phase | P1 - AGT là P1 (xem danh mục tính năng Helpdesk) |
| Rollout | Tất cả organizer; cụm màn hiện ẩn khỏi menu (đang phát triển), mở menu khi đạt tiêu chí ra mắt |
| Migration | Khử trùng lặp mọi tên group hiện có theo organizer trước khi áp quy tắc tên duy nhất |
| Launch criteria | Toàn bộ Tiêu chí nghiệm thu ở §6 đạt, bao gồm các FR 🚧 (tên duy nhất, thứ tự ưu tiên rule, scope organizer cho "Edit member") |
| Monitoring | Thay đổi membership group, chỉnh sửa assignment rule, và tỷ lệ từ chối tên trùng lặp |
13. FAQ
Tôi quản lý group của một agent ở đâu? Từ màn hình agent - action "Manage groups" mở dialog thêm/xóa membership tại chỗ.
Vì sao một luồng hợp nhất thay vì thêm/xóa riêng? Một lần lưu áp toàn bộ thay đổi thành viên, tránh các thao tác rời rạc và trạng thái sửa dở.
Vì sao tên group scope theo organizer chứ không phải từng merchant? Tên group không được trùng giữa các merchant của một organizer, nên tính duy nhất và scoping assignment đặt ở cấp organizer.
Điều này có đổi hành vi tự động phân công không? Không - logic tự động phân công và các strategy đã có sẵn; gói này chỉ thêm màn hình để cấu hình rule.
Lịch làm việc của agent đặt ở đâu? Ngay trong form agent: lịch tuần theo từng ngày, ngày ngoại lệ, và ghi đè tạm thời.
References
- URD: Helpdesk - Agent Management (
AGT) - yêu cầu (URD-AGT-001, URD-AGT-004, URD-AGT-005, URD-AGT-009) - Module: Hỗ trợ khách hàng - URD
- Developer: @nx/helpdesk · domain model