**Incident API — Thay Đổi & Lưu Ý cho Frontend**

- **Tổng quan:**
  - Backend đã di chuyển thông tin liên hệ của kỹ thuật viên (`full_name`, `phone`, `email`) từ bảng `technicians` sang bảng `users` (qua `technician.user_id`).
  - Đã thêm hai trường trả về ở endpoint danh sách: `technician_phone` và `technician_email`.

**Endpoints & khác biệt chính**

- **GET /api/v1/incidents** (list) :
  - Mục đích: trả về danh sách rút gọn (table/list view).
  - Trường liên quan (quan trọng cho FE):
    - `id`, `title`, `code`, `type_name`, `room_name`, `apartment_name`, `building_name`
    - `reporter_name` (chuỗi), `technician_name` (chuỗi)
    - `technician_phone` (string|null)
    - `technician_email` (string|null)
    - `priority`, `status`, `deadline`, `created_at`, `updated_at`
  - Lưu ý: **Không có** trường `description` trong kết quả của endpoint này.
  - Ví dụ (tóm tắt một item):

```json
{
  "id": "...",
  "title": "Bóng đèn hỏng",
  "code": "INC-0001",
  "technician_name": "Nguyễn Văn A",
  "technician_phone": "0912345678",
  "technician_email": "a@example.com",
  "reporter_name": "Trần Thị B",
  "priority": "high",
  "status": "open"
}
```

- **GET /api/v1/incidents/:id** (detail) :
  - Mục đích: trả về chi tiết đầy đủ của một incident.
  - Trả về `description` (mô tả chi tiết) — đây là điểm khác biệt chính so với `GET /api/v1/incidents`.
  - `technician` là đối tượng lồng (object) với cấu trúc:
    - `technician.id`, `technician.name`, `technician.phone`, `technician.email` (tất cả có thể là `null` nếu không có user liên kết).
  - `reporter` cũng trả về như một object: `id`, `name`, `phone`, `email`.
  - Ví dụ (tóm tắt):

```json
{
  "id": "...",
  "title": "Bóng đèn hỏng",
  "code": "INC-0001",
  "description": "Đèn hành lang tầng 3 cháy",
  "technician": {
    "id": "tech-uuid",
    "name": "Nguyễn Văn A",
    "phone": "0912345678",
    "email": "a@example.com"
  },
  "reporter": {
    "id": "user-uuid",
    "name": "Trần Thị B",
    "phone": "0987654321",
    "email": "b@example.com"
  }
}
```

**Nguồn dữ liệu & mapping**

- Technician contact data hiện lấy từ bảng `users` thông qua quan hệ `technician.user_id`.
- Mapping FE cần cập nhật:
  - List view: dùng `row.technician_name`, `row.technician_phone`, `row.technician_email`.
  - Detail view: dùng `response.technician.name`, `response.technician.phone`, `response.technician.email`.
  - Nếu giá trị là `null`, FE nên hiển thị fallback (ví dụ: `-` hoặc `Chưa có`).

**Tương thích ngược / Ghi chú triển khai**

- Trước đây một số code backend trả `technician.full_name`, `technician.phone`, `technician.email` trực tiếp từ bảng `technicians`. Hiện trường `full_name/phone/email` đã bị xóa khỏi bảng `technicians`.
- Đã giữ tên trường `technician_name` cho list (kết quả xây bằng CONCAT của `user.first_name` + `user.last_name`) để giảm tác động tới FE. Tuy nhiên:
  - List: `technician_name` (chuỗi), `technician_phone`, `technician_email` (hai trường bổ sung mới).
  - Detail: `technician` là object, **có cấu trúc khác** so với list — FE cần đọc theo object.

**Tham chiếu mã nguồn**

- Logic lấy dữ liệu và tên/trường mới ở: [src/providers/IncidentProvider.ts](src/providers/IncidentProvider.ts)
- Route list tạo ở: [src/controllers/api/v1/incidents/index.ts](src/controllers/api/v1/incidents/index.ts)

Nếu FE cần mình viết helper mapping (ví dụ: `normalizeIncidentForList` / `normalizeIncidentForDetail`) hoặc muốn ví dụ TypeScript interfaces, mình có thể thêm nhanh. Nếu có chỗ FE đang bị lỗi hiển thị, gửi ví dụ response hiện tại, mình sẽ kiểm tra.
