# Module `sh-schedule` — Kỳ sát hạch & ca thi

> 07/7/2026 · Giai đoạn: **WS sát hạch · v3** · WS sát hạch · Bản HTML: [sh-schedule.html](sh-schedule.html) · Sơ đồ tổng thể: [../so-do-ws-module-feature-2026-07-06.md](../so-do-ws-module-feature-2026-07-06.md)
> Trạng thái: v3 — thuộc hệ thẩm định BCA, release theo phiên bản kiểm chuẩn.

## 1. Vai trò
Quản lý **kỳ sát hạch**: hội đồng, ca thi, danh sách thí sinh — xương sống điều phối của trung tâm sát hạch.

## 2. Feature / BO / Action

| Feature | BO chính | Action |
|---|---|---|
| `exam` | Kỳ sát hạch · hội đồng | view·create·edit |
| `shift` | Ca thi · phân bổ thí sinh | view·assign·**lock** |

## 3. Dữ liệu chính

| BO | Trường chính |
|---|---|
| **Kỳ thi** | Ngày · hội đồng (quyết định, thành viên) · hạng thi · nội dung (LT/sa hình/đường trường/mô tô) |
| **Thí sinh** | DS từ hội đồng (import) · số báo danh · ca thi · trạng thái từng nội dung |

## 4. Quy tắc nghiệp vụ
1. DS thí sinh **chốt (lock)** trước giờ thi — sau lock không thêm/bớt, chỉ hội đồng mở
2. Mọi thao tác sau lock ghi log bất biến
3. Số báo danh sinh theo quy tắc, không trùng trong kỳ

## 5. Liên kết chéo
- **sh-kiosk** — check-in theo DS
- **sh-theory/yard/road/moto** — nhận DS ca thi
- **sh-gateway** — truyền hồ sơ kỳ thi

## 6. Câu hỏi mở
- Định dạng DS thí sinh hội đồng cung cấp (file/cổng)?

## 7. Ma trận phân quyền (→ manifest & seed role)

### 7.1 Khai báo `permissions[]` trong `manifest.json`

```json
[
  {
    "group": "main",
    "feature": "exam",
    "label": "Kỳ sát hạch & hội đồng",
    "actions": [
      "view",
      "create",
      "edit"
    ]
  },
  {
    "group": "main",
    "feature": "shift",
    "label": "Ca thi & thí sinh",
    "actions": [
      "view",
      "assign",
      "lock"
    ]
  }
]
```

> ⚠️ Action đặc thù (`lock`) cần bổ sung vào validator manifest — xem [plan data-scope P1](../giai-doan-1-mvp/plan-data-scope-2026-07-06.md).

### 7.2 Ma trận vai trò × feature (seed `rt_role`)

| Feature | `QTHT` | `GIAM_DOC` | `SAT_HACH` |
|---|:--:|:--:|:--:|
| `exam` | R | R | W |
| `shift` | R | R | W |

> **R** xem · **W** tạo/sửa · **A** duyệt · **—** không có quyền · ¹ dữ liệu **phân công** · ² **của chính mình** · ³ **theo trạng thái** hồ sơ. Vai trò không liệt kê = không có quyền. Permission key đầy đủ: `sh-schedule.main.<feature>.<action>`.
> Đặc thù: shift +lock (GIAM_DOC) · +assign (SAT_HACH)
