# 06. QUẢN TRỊ HỆ THỐNG & PHÂN QUYỀN (RBAC)

Hệ thống EMS Testsite sử dụng mô hình **Phân quyền dựa trên vai trò (Role-Based Access Control - RBAC)** kết hợp với kiểm tra quyền theo từng **Route Name**.

---

## 1. Bản Đồ Tính Năng Quản Trị Hệ Thống

| Tên Tính năng (Menu) | Route Name | Controller | Blade View |
|---|---|---|---|
| **Danh sách vai trò** | `role.index` | `RoleController@index` | `resources/views/role/index.blade.php` |
| **Quản lý người dùng** | `user-management.index` | `UserManagementController@index` | `resources/views/user-management/index.blade.php` |
| **Phân tài khoản tenant** | `tenant-assignment.index` | `TenantAssignmentController@index` | `resources/views/tenant-assignment/index.blade.php` |
| **Quản lý Tenant** | `tenant-management.index` | `TenantController@index` | `resources/views/tenant/index.blade.php` |
| **Quản lý Tenant Domain** | `tenant-domain.index` | `TenantDomainController@index` | `resources/views/tenant-domain/index.blade.php` |
| **Công cụ hệ thống** | `tools.index` | `ToolController@index` | `resources/views/tools/index.blade.php` |

---

## 2. Mô Hình Phân Quyền RBAC 4 Bảng (Database Schema)

```mermaid
erDiagram
    USERS ||--o{ USER_ROLES : "sở hữu"
    ROLES ||--o{ USER_ROLES : "gán cho"
    ROLES ||--o{ ROLE_PERMISSIONS : "có quyền"
    PERMISSIONS ||--o{ ROLE_PERMISSIONS : "được cấp"

    USERS {
        int id PK
        string name
        string email
    }
    ROLES {
        int id PK
        string name
        string short_name
    }
    PERMISSIONS {
        int id PK
        string route_name
        string label
    }
    ROLE_PERMISSIONS {
        int role_id FK
        int permission_id FK
    }
    USER_ROLES {
        int user_id FK
        int role_id FK
    }
```

### 🔐 Cách Thức Hoạt Động Của Quyền Hạn:
1. Mỗi URL/API trong hệ thống được định danh bởi một `route_name` (ví dụ: `student-exam-histories.TeacherSpeakingReceiveGrading`).
2. Quản trị viên tạo các `Role` (Admin, Tester, Giáo viên, QA, Sale).
3. Mỗi `Role` được tích chọn danh sách các `Permission` (Route Name) được phép thực thi.
4. Gán một hoặc nhiều `Role` cho `User`.
5. Khi người dùng gửi request, Middleware sẽ kiểm tra quyền thông qua hàm `checkPermissionUser($routeName)`.

---

## 3. Danh Mục Permissions Trọng Yếu Trong Hệ Thống

| Permission Route Name | Ý nghĩa & Nghiệp vụ áp dụng |
|---|---|
| **`student-exam-histories.TeacherSpeakingReceiveGrading`** | Dành cho Giáo viên chấm Speaking (được hiển thị trong danh sách phân công modal Speaking). |
| **`student-exam-histories.TesterEasyPassReceiveGrading`** | Dành cho Tester chấm bài Writing theo Formula 2 hoặc 5 (EasyPass). |
| **`student-exam-histories.TesterEasyIeltsReceiveGrading`** | Dành cho Tester chấm bài Writing theo Formula 3 hoặc 4 (EasyIELTS). |
| **`student-exam-histories.QAEasyPassReceiveGrading`** | Dành cho QA nhận chấm/duyệt bài EasyPass. |
| **`student-exam-histories.QAEasyIeltsReceiveGrading`** | Dành cho QA nhận chấm/duyệt bài EasyIELTS. |
| **`student-exam-histories.QACanRescore`** | Quyền cho phép QA chấm lại và phúc khảo bài thi. |
| **`student-exam-histories.VHRescoreAll`** | Quyền cho phép Vận hành (Admin/Lead) can thiệp sửa toàn bộ điểm bài thi. |
| **`student-exam-history.assignTeacher`** | Quyền thực hiện gán giáo viên chấm bài trên giao diện. |
| **`student-exam-history.canViewAllStudentExamHistories`** | Quyền xem toàn bộ bài làm của học sinh ở mọi chiến dịch (vượt qua giới hạn phân quyền Campaign). |
