- Given một center mới được tạo qua onboarding
- When chủ trung tâm vào trang tổng quan
- Then một danh sách kiểm tra xuất hiện: thêm thông tin chi nhánh, mời nhân sự, tạo khoá học và gói học phí, thêm phòng học, kết nối tài khoản ngân hàng, kết nối Zalo, nhập học viên; mỗi mục liên kết đến trang cài đặt tương ứng và được đánh dấu hoàn thành khi xong.
PRD 10 · Cài đặt và quản trị
Hồ sơ trung tâm, chi nhánh, người dùng và lời mời, vai trò với danh mục quyền thống nhất, các danh mục (nhãn, nguồn, kênh, trình độ, phòng học, gói học phí, danh mục chi, chức danh), tích hợp (Zalo, SePay, hoá đơn điện tử), chính sách thông báo, và màn hình xem nhật ký hệ thống.
Xuất xứ / Prompt / Giới hạn
Tài liệu do trợ lý AI soạn trong một phiên làm việc ngày 10/09/2026, theo yêu cầu gốc được trích nguyên văn ở trang mục lục; mục Thiết kế đề xuất được bổ sung ngày 16/09/2026. Đây là bản đề xuất để đội thảo luận, chưa phải quyết định của đội sản phẩm.
Nguồn
- Nghiên cứu công khai về đối thủ cạnh tranh (PSE ONE, pse4.one), mã nguồn
center-crm-frontendvà đặc tả OpenAPI/v3trên staging (182 endpoint), tính đến ngày 10/09/2026. - Nhãn existing / extend / new trong trang được xác định bằng cách đối chiếu với đặc tả
/v3trên staging tại thời điểm trên.
Giới hạn
- Cần xác minh khi khảo sát trực tiếp trong ứng dụng, vì đăng nhập tự động vào sản phẩm tham chiếu chưa được cấp phép trong phiên soạn:
- Cây cài đặt của đối thủ, các vai trò mặc định ("quản lý, kế toán, giáo viên, tư vấn") và mức độ chi tiết của phân quyền ("phân quyền").
- Các chi nhánh dùng tài khoản đăng nhập riêng hay một tài khoản kèm bộ chuyển đổi.
- Những danh mục nào có thể cấu hình (nguồn, trạng thái, loại phí, danh mục chi).
- Các trường cấu hình gửi email tự động của họ.
Thiết kế đề xuất
Cài đặt là một khu vực riêng với thanh điều hướng con 220 px bên trái; mỗi trang là một danh sách hoặc biểu mẫu đơn giản theo Cloud theme, và điều quan trọng nhất người đọc nên nhìn thấy là ma trận quyền có phạm vi theo từng ô (none / own / branch / all) cùng nhật ký hệ thống chỉ xem với so sánh trước / sau.





<module>.<action> nhóm theo mô-đun (Tuyển sinh, Học vụ, Tài chính, Cài đặt), cột là tám vai trò; mỗi ô là checkbox kèm phạm vi own / branch / all và bộ chọn phạm vi bốn mức mở tại ô đang sửa. Cột Lễ tân đang được chỉnh: finance.payment.create vừa chuyển từ Chi nhánh sang Không (ô tô vàng), thanh dưới báo 1 thay đổi chưa lưu qua PUT /roles/{id}/permissions và hiệu lực ngay từ yêu cầu tiếp theo (SET-03).





role.permissions_changed: khối thông tin (thời gian, người thực hiện, hành động, đối tượng, chi nhánh, IP và thiết bị) và bảng so sánh Trường · Trước · Sau với giá trị cũ gạch ngang màu đỏ, giá trị mới màu xanh. Callout liên kết tới sự kiện cùng phiên (role.created); chân drawer chỉ có Đóng, Mở vai trò và Sao chép JSON, không có nút sửa (SET-06).1Mục đích
Cài đặt là nơi chủ trung tâm định hình sản phẩm theo trung tâm của mình: có những chi nhánh nào, ai được làm gì, các danh sách trong biểu mẫu gồm những gì, và những dịch vụ bên ngoài nào được kết nối. Ứng dụng hiện tại có các trang cài đặt cho người dùng, vai trò, quyền bán hàng, nhãn, nguồn, kênh và trung tâm, trong đó ba trang chưa được lưu trữ thật. PRD này thay thế các bản giả (mock), gộp toàn bộ cài đặt vào một route với thanh điều hướng con bên trái, và bổ sung những gì các mô-đun mới cần.
2Hiện trạng
| Trang | Trạng thái | Hành động |
|---|---|---|
| /crm/settings/users (danh sách sale profile, gán vai trò, modal cấp quyền truy cập school gọi một endpoint không theo đặc tả) | hoạt động một phần | xây dựng lại thành Người dùng kèm lời mời và phạm vi chi nhánh |
| /crm/settings/roles (danh sách, drawer có ma trận; tạo mới chỉ là toast giả; cập nhật hoạt động) | hoạt động một phần | triển khai tạo mới qua POST /v3/crm/roles; thống nhất từ vựng phạm vi |
| /crm/settings/sale-permissions | hoạt động | gộp vào Người dùng |
| /crm/settings/tags | hoạt động (API) | giữ nguyên |
| /crm/settings/sources, /channels | bản giả lưu trong localStorage | chuyển sang dùng API (PRD 01) |
| /crm/settings/tenant (tên, logo, ngôn ngữ, múi giờ, giờ làm việc) | chưa được lưu trữ thật | lưu trữ thật qua school-config và cập nhật center |
| Trường tuỳ chỉnh (hộp thoại tạo mới trong biểu mẫu khách hàng) | hoạt động | hiển thị trong Cài đặt → Trường tuỳ chỉnh |
| Danh mục gói (gói bán hàng CRM) | hoạt động trong tab chi tiết | hiển thị trong Cài đặt → Gói tư vấn (khác với gói học phí) |
| Trình chỉnh sửa quy trình và giai đoạn (trong bộ chọn quy trình) | hoạt động | cũng có thể truy cập từ Cài đặt → Quy trình |
3Điều hướng cài đặt
Thanh điều hướng con bên trái rộng 220 px trong khu vực nội dung; mỗi trang là một danh sách hoặc biểu mẫu đơn giản theo Cloud theme. /crm/settings/* chuyển hướng sang route mới tương ứng.
4Vai trò và phân quyền
Từ vựng
- Mã quyền:
<module>.<action>, viết thường, theo quy định trong từng PRD. Endpoint danh mục trả về code, module, label (vi/en qua X-Locale), description. - Phạm vi, theo từng quyền trong từng vai trò:
own(bản ghi do người dùng sở hữu hoặc được gán),branch(bản ghi trong các chi nhánh của người dùng),all(toàn tenant). Thay thế cách trộn own/team/all và none/read/write/manage hiện tại.teamhiện có được ánh xạ sangbranch. - Quy tắc sở hữu theo từng mô-đun: lead theo người được gán; lớp học và buổi học theo giáo viên chính hoặc dạy thay; học viên theo việc thuộc lớp học đối với giáo viên; hoá đơn không theo quy tắc sở hữu nào (chỉ theo phạm vi chi nhánh).
Vai trò mặc định
| Mã vai trò | Tên tiếng Việt | Vai trò School tương ứng | Tóm tắt |
|---|---|---|---|
| owner | Chủ trung tâm | OWNER | toàn quyền, tất cả chi nhánh |
| branch_manager | Quản lý chi nhánh | ADMIN | tất cả mô-đun trong phạm vi chi nhánh được gán; phê duyệt |
| admissions | Tư vấn tuyển sinh | none (hoặc TEACHER nếu cũng đang dạy) | lead của mình, học thử, kiểm tra xếp lớp, chuyển đổi |
| academic_admin | Giáo vụ | ADMIN | học viên, lớp học, điểm danh, liên lạc, phát tài liệu |
| accountant | Kế toán | ADMIN (finance) | tài chính, quản lý kho, hợp đồng và lương nhân sự |
| teacher | Giáo viên | TEACHER | lớp của mình, điểm danh, ghi chú buổi học, bảng công của bản thân |
| viewer | Chỉ xem | none | dashboard và danh sách chỉ xem (nhà đầu tư, kiểm toán) |
Ma trận tổng hợp là hợp của các bảng theo từng PRD (từ 01 đến 09). Vai trò có thể được nhân bản và chỉnh sửa; vai trò mặc định bị khoá về mã và tên nhưng quyền của vai trò đó vẫn có thể được chủ trung tâm điều chỉnh; nút "Khôi phục mặc định" sẽ đặt lại.
Người dùng và phạm vi chi nhánh
- Người dùng là một bản ghi nhân sự (PRD 06) có tài khoản; trang Người dùng liệt kê nhân sự có quyền truy cập, vai trò, chi nhánh, lần đăng nhập gần nhất, trạng thái (Đã kích hoạt, Chờ mời, Vô hiệu).
- Lời mời được gửi qua email hoặc số điện thoại; người được mời đăng nhập bằng tài khoản FLYER đã có hoặc đăng ký mới; khi chấp nhận, sale profile và tư cách thành viên trường được tạo cho các chi nhánh được gán.
- Phạm vi chi nhánh là danh sách school id theo từng người dùng; thay thế endpoint school-access không theo đặc tả.
- Vô hiệu hoá sẽ thu hồi phiên đăng nhập, giữ lại lịch sử; có thể kích hoạt lại.
5User story và tiêu chí chấp nhận
- Given quyền
settings.users - When mời theo tên, email hoặc số điện thoại, vai trò, chi nhánh
- Then một lời mời được gửi kèm link có hiệu lực 7 ngày; danh sách Người dùng hiển thị Chờ mời; có thể gửi lại hoặc thu hồi; khi được chấp nhận, người dùng xuất hiện ở trạng thái hoạt động kèm tư cách thành viên đã được tạo.
- Given trang vai trò
- When nhân bản vai trò Giáo vụ, đổi tên thành "Lễ tân", và bỏ chọn finance.payment.create
- Then vai trò được tạo qua
POST /v3/crm/rolesvàPUT /roles/{id}/permissions, và người dùng được gán vai trò này sẽ thấy hiệu lực ngay từ yêu cầu tiếp theo.
- Given một school thuộc center
- When chỉnh sửa địa chỉ, số điện thoại, link bản đồ, giờ mở cửa, tài khoản nhận tiền mặc định, tên quỹ tiền mặt, logo riêng
- Then hồ sơ được lưu lại và dùng trên phiếu thu, tin nhắn ({chi_nhanh}, {sdt}) và cổng phụ huynh.
- Given chủ trung tâm
- When thêm một chi nhánh kèm tên và mã
- Then một school FLYER được tạo trực thuộc center, chủ trung tâm là thành viên, và chi nhánh xuất hiện trong bộ chuyển đổi chi nhánh.
- Given quyền
settings.audit - When lọc theo người thực hiện, hành động, đối tượng, ngày
- Then hiển thị các dòng kèm so sánh trước/sau (diff) và có thể xuất CSV; các dòng chỉ được xem, không thể sửa.
- Given trang tích hợp
- When kết nối SePay (luồng link-token đã có sẵn), Zalo OA (PRD 07), hoặc một nhà cung cấp hoá đơn điện tử (biểu mẫu thông tin đăng nhập)
- Then mỗi thẻ hiển thị trạng thái, lần đồng bộ gần nhất, lỗi, và một hành động ngắt kết nối; các secret được ẩn sau khi lưu.
6Màn hình (danh sách trường)
| Trang | Trường / cột | Kiểm tra dữ liệu |
|---|---|---|
| Trung tâm | Tên trung tâm; Mã; Logo (tải lên); Pháp nhân (legal_name, type, tax_id hoặc citizen_id, address, issued_date, issued_by từ SchoolCompany); Ngôn ngữ mặc định; Múi giờ; Giờ làm việc theo từng ngày trong tuần; Ngày nghỉ (danh sách) | mã số thuế 10 hoặc 13 số; số CCCD 12 số |
| Chi nhánh list | Tên, Mã, Địa chỉ, SĐT, Học viên, Lớp, Người dùng, Trạng thái; + Thêm chi nhánh | mã duy nhất |
| Người dùng list | Họ tên, Email/SĐT, Vai trò (chip), Chi nhánh (chip), Đăng nhập gần nhất, Trạng thái; hành động Sửa, Vô hiệu, Gửi lại lời mời | không thể xoá owner cuối cùng |
| Vai trò | danh sách: Tên, Mã, Số quyền, Người dùng, Mặc định; ma trận: dòng = quyền được nhóm theo mô-đun, cột = radio phạm vi (Không / Của mình / Chi nhánh / Tất cả) | ít nhất một vai trò owner có phạm vi tất cả |
| Nguồn, Kênh, Nhãn, Trình độ, Phòng, Chức danh, Danh mục chi | MasterDataPage dùng chung: name, code (nếu áp dụng), colour, position (kéo thả), active; tạo mới ngay trên danh sách; vô hiệu hoá thay vì xoá khi đang được sử dụng | name duy nhất theo từng tenant |
| Tài chính | Tiền tố và phạm vi số phiếu thu; Hạn mức giảm giá theo từng vai trò; Ngưỡng phê duyệt (giảm giá, hoàn tiền, chi phí, điều chỉnh kho); VAT mặc định theo từng loại dòng; Thời điểm cấp buổi (khi tạo / khi thanh toán đủ); Chính sách hoàn tiền (phần trăm phí xử lý, cách làm tròn); Tài khoản ngân hàng (danh sách hiện có kèm trạng thái SePay) | phần trăm 0–100 |
| Thông báo | Bảng: loại tin nhắn × checkbox kênh, áp dụng giờ yên tĩnh; Giờ yên tĩnh; Hạn mức ZNS theo tháng; Cài đặt bản tin tổng hợp | |
| Tích hợp | Thẻ: SePay (tài khoản đã liên kết), Zalo OA (tên, mẫu tin đã duyệt x/y), Hoá đơn điện tử (chọn nhà cung cấp, thông tin đăng nhập, kiểm tra thử), Webhook (URL đầu ra và secret cho các sự kiện) | |
| Nhật ký | Thời gian, Người thực hiện, Hành động, Đối tượng, Chi nhánh, IP; mở rộng xem diff |
7Mô hình dữ liệu
| Thực thể | Trường | Ghi chú |
|---|---|---|
| center (Center hiện có) | + logo_file_id; default_locale; timezone; business_hours jsonb; settings jsonb | extend |
| branch_profile | school_id PK; center_id; address; phone; map_url; opening_hours jsonb; default_bank_account_id; cash_account_id; logo_file_id; is_active | new |
| invitation | id; center_id; email; phone; role_id; school_ids; token; expires_at; accepted_at; created_by | new |
| user_branch_scope | sale_profile_id; school_id | new (thay cho accessible_schools ngầm định trước đây) |
| crm_role (đã có sẵn) | + is_locked; cloned_from; scope per permission stored as {code, scope} | extend (quyền có kèm scope) |
| audit_log | PRD 12 mục 6 | new |
| integration | id; center_id; type enum(sepay, zalo, einvoice, webhook); config jsonb (encrypted secrets); status; last_sync_at; last_error | new |
| onboarding_checklist | center_id; items jsonb {key: done_at} | new |
8Hợp đồng API
| Method | Path | Request / response | Status |
|---|---|---|---|
| GET | /v3/crm/permissions-catalog | mở rộng thêm mã mô-đun mới | extend |
| GET/POST | /v3/crm/roles; GET /roles/{id}; PUT /roles/{id}/permissions | body permissions trở thành [{code, scope}]; POST /roles/{id}/clone; POST /roles/{id}/reset | extend |
| GET | /v3/crm/me/permissions | giá trị scope là own|branch|all; accessible_schools = phạm vi branch | extend |
| GET/POST/PUT | /v3/crm/sale-profiles[...]; POST /{id}/roles | không thay đổi | existing |
| PUT | /v3/crm/sale-profiles/{id}/branches | {school_ids[]} thay thế users/{id}/school-access không theo đặc tả | new |
| GET/POST/DELETE | /v3/crm/invitations; POST /{id}/resend; POST /v3/crm/invitations/accept | {email|phone, role_id, school_ids} / {token} | new |
| POST | /v3/crm/sale-profiles/{id}/deactivate | /reactivate | new | |
| GET/PATCH | /v3/crm/centers/{id} | trường hồ sơ tenant | extend (GET danh sách đã có sẵn) |
| GET/POST | /v3/school/branches; GET/PATCH /branches/{school_id} | tạo school FLYER trực thuộc center | new |
| GET/PUT | /v3/teacher/school-config | khối cài đặt: điểm danh, tài chính, thông báo | extend |
| GET/PUT | /v3/teacher/school-finance/company | hồ sơ pháp nhân | existing |
| GET/POST/PATCH/DELETE | /v3/crm/sources, /channels, /tags, /custom-fields, /packages, /pipelines, /stages, /statuses (+reorder) | không thay đổi | existing |
| GET/POST/PATCH | /v3/school/levels, /rooms, /job-titles, /expense-categories, /fee-plans, /holidays | xem các PRD mô-đun | new |
| GET | /v3/school/audit-logs | actor_id, action, entity_type, entity_id, school_id, from, to, page; format=csv | new (tổng quát hoá từ customers/{id}/audit-logs) |
| GET/POST/DELETE | /v3/school/integrations[/{type}]; POST /{type}/test | new | |
| GET/PATCH | /v3/school/onboarding-checklist | new | |
| POST | /v3/school/exports/full | job xuất dữ liệu toàn tenant (PRD 12) | new |
9Phân quyền
| Mã quyền | owner | branch_manager | accountant | academic_admin |
|---|---|---|---|---|
settings.tenant | có | không | thông tin pháp nhân | không |
settings.branches | có | hồ sơ chi nhánh của mình | không | không |
settings.users | có | chi nhánh (mời các vai trò không phải owner) | không | không |
settings.roles | có | không | không | không |
settings.catalogs (nguồn, kênh, nhãn, trình độ, phòng học, chức danh, khoá học) | có | phòng học | danh mục chi, gói học phí | trình độ, phòng học, khoá học |
settings.finance | có | không | có | không |
settings.notifications, settings.templates | có | không | không | không |
settings.integrations | có | không | sepay, einvoice | không |
settings.audit | có | branch | hành động tài chính | không |
settings.data (nhập liệu, xuất dữ liệu, ẩn danh hoá) | có | nhập liệu | nhập liệu (tài chính) | nhập liệu (học viên, lớp học) |
10Sự kiện phân tích và trường hợp biên
| Sự kiện | Thuộc tính |
|---|---|
| onboarding_checklist_item_done | key, days_since_signup |
| user_invited / invitation_accepted | role, branches |
| role_created / role_permissions_changed | cloned_from, changes |
| branch_created | count_after |
| integration_connected / integration_failed | type |
| audit_log_viewed / exported | filters |
- Người được mời đã là thành viên của center: lời mời chuyển thành một thay đổi vai trò.
- Xoá chi nhánh cuối cùng của người dùng: bị từ chối; vô hiệu hoá thay vào đó.
- Xoá vai trò khi vẫn đang được gán: bị từ chối; cần gán lại trước.
- Zalo OA được kết nối với hai center: bị Zalo từ chối; hiển thị hướng dẫn.
Trường Số (truongso.net) · Nội bộ FLYER