# Module `rfcard` — Thẻ RFID

> 07/7/2026 · Giai đoạn: **MVP (hạ tầng nhỏ)** · Bản HTML: [rfcard.html](rfcard.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 code: **đã scaffold** (port legacy).

## 1. Vai trò
Quản lý **kho thẻ RFID** dùng cho điểm danh/xác thực trên xe (DAT) và phòng học. Module nhỏ, dùng chung cho cả giáo viên lẫn học viên — vì vậy không nhét vào `student` hay `teacher`.

## 2. Feature / BO / Action

| Feature | BO chính | Action |
|---|---|---|
| `card` | Thẻ RFID | view·create·edit·delete·**assign** |

## 3. Dữ liệu chính
Mã thẻ, số thẻ, ghi chú, cơ sở (`ma_csdt`), ngày tạo, trạng thái. Việc **gán thẻ ↔ người** lưu ở phía người dùng thẻ (`student.rfid`, `teacher.ma_the_rfid`) — rfcard giữ kho thẻ + trạng thái cấp phát.

## 4. Quy tắc nghiệp vụ
1. Một thẻ chỉ gán cho **một người tại một thời điểm** — thu hồi trước khi cấp lại.
2. Lịch sử cấp/thu thẻ giữ lại (đối chiếu phiên DAT cũ theo thẻ).
3. Thẻ mất/hỏng → khóa trạng thái, không xóa.

## 5. Liên kết chéo module
| Module | Khóa | Ghi chú |
|---|---|---|
| student / teacher | `rfid` / `ma_the_rfid` | người đang giữ thẻ |
| dat | thẻ quẹt trong phiên | xác thực người trên xe |
| lms (v1.5) | thẻ điểm danh phòng học | kết hợp khuôn mặt |

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

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

```json
[
  {
    "group": "main",
    "feature": "card",
    "label": "Thẻ RFID",
    "actions": [
      "view",
      "create",
      "edit",
      "delete",
      "assign"
    ]
  }
]
```


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

| Feature | `QTHT` | `GIAM_DOC` | `KY_THUAT` | `GIAO_VU` |
|---|:--:|:--:|:--:|:--:|
| `card` | R | R | W | R |

> **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 đủ: `rfcard.main.<feature>.<action>`.
> Đặc thù: card +assign (KY_THUAT, GIAO_VU)
