# API Documentation - Truck Management (Part 2: Bảo trì)

## Mục lục
3. [Quản lý Thuộc tính Bảo trì](#3-quản-lý-thuộc-tính-bảo-trì)
4. [Quản lý Bảo trì & Sửa chữa](#4-quản-lý-bảo-trì--sửa-chữa)
5. [Models - Bảo trì](#5-models---bảo-trì)

---

## 3. Quản lý Thuộc tính Bảo trì
Các thuộc tính bảo trì định nghĩa các hạng mục công việc (ví dụ: "Thay nhớt", "Thay lốp", "Bảo dưỡng phanh").

### 3.1. Tìm kiếm thuộc tính bảo trì
**Endpoint:** `POST /api/Truck/TruckMaintAttrSearch`
**Authorization:** `Truck.TruckMaintAttrSearch`
**Mô tả:** Tìm kiếm danh sách thuộc tính bảo trì theo từ khóa.

**Request (JSON):**
```json
{
  "Search": {
    "PredicateObject": {
      "Keyword": "nhớt"
    }
  },
  "Pagination": {
    "Start": 0,
    "Number": 10
  },
  "Sort": {
    "Predicate": "Id",
    "Reverse": true
  }
}
```

**Response:**
Returns `SmartTableResult<TruckMaintAttributeItem>`

### 3.2. Lấy tất cả thuộc tính bảo trì
**Endpoint:** `GET /api/Truck/TruckMaintAttrGetAll`
**Authorization:** `Truck.TruckMaintAttrGetAll`
**Mô tả:** Lấy danh sách toàn bộ thuộc tính bảo trì (dùng cho dropdown/combobox).

**Response:**
```json
[
  {
    "Id": 1,
    "Name": "Thay nhớt động cơ"
  },
  {
    "Id": 2,
    "Name": "Thay lọc gió"
  }
]
```

### 3.3. Tạo hoặc cập nhật thuộc tính
**Endpoint:** `POST /api/Truck/TruckMaintAttrCreateOrUpdate`
**Authorization:** `Truck.TruckMaintAttrCreateOrUpdate`

**Request:**
```json
{
  "Id": 0, // 0 để tạo mới, >0 để cập nhật
  "Name": "Thay lốp trước"
}
```

### 3.4. Xóa thuộc tính
**Endpoint:** `POST /api/Truck/TruckMaintAttrDelete`
**Authorization:** `Truck.TruckMaintAttrDelete`

**Request:**
```json
{
  "Id": 5,
  "Name": "Deleted Item" // Name không bắt buộc khi xóa, nhưng model yêu cầu object
}
```

---

## 4. Quản lý Bảo trì & Sửa chữa
Quản lý các đợt bảo trì của xe, bao gồm thông tin gara, chi phí, và các hạng mục chi tiết.

### 4.1. Tìm kiếm lịch sử bảo trì
**Endpoint:** `POST /api/Truck/TruckMaintSearch`
**Authorization:** `Truck.TruckMaintSearch`

**Request (JSON):**
```json
{
  "Search": {
    "PredicateObject": {
      "TruckId": 10,
      "FromDate": "2023-01-01",
      "ToDate": "2023-12-31"
    }
  },
  "Pagination": {
    "Start": 0,
    "Number": 10
  },
  "Sort": {
    "Predicate": "StartTime",
    "Reverse": true
  }
}
```

### 4.2. Tạo mới hoặc Cập nhật đợt bảo trì
**Endpoint:** `POST /api/Truck/TruckMaintCreateOrUpdate`
**Authorization:** `Truck.TruckMaintCreateOrUpdate`
**Mô tả:** Tạo mới phiếu bảo trì cùng với các hạng mục chi tiết (Link).

**Request:**
```json
{
  "Id": 0,
  "TruckId": 10,
  "AgencyId": 1,
  "Title": "Bảo dưỡng định kỳ 5000km",
  "Description": "Thay nhớt, kiểm tra phanh",
  "GarageName": "Gara Ô tô Sài Gòn",
  "GarageAddress": "123 QL1A, TP.HCM",
  "GaragePhone": "0909123456",
  "Cost": 1500000,
  "HasInvoice": true,
  "InvoiceUrl": "https://example.com/invoice123.jpg",
  "StartTime": "2023-10-25T08:00:00+07:00",
  "EndTime": "2023-10-25T17:00:00+07:00",
  "NextTime": "2024-04-25T08:00:00+07:00",
  "TruckMaintLinkModels": [
    {
      "Id": 0,
      "TruckMaintAttributeId": 1, // Thay nhớt
      "TruckMaintenanceValue": "5",
      "TruckMaintenanceUnit": 1 // Lit
    },
    {
      "Id": 0,
      "TruckMaintAttributeId": 2, // Thay lọc gió
      "TruckMaintenanceValue": "1",
      "TruckMaintenanceUnit": 2 // Cai/Chiec
    }
  ]
}
```

### 4.3. Xóa đợt bảo trì
**Endpoint:** `POST /api/Truck/TruckMaintDelete`
**Authorization:** `Truck.TruckMaintDelete`

**Request:**
```json
{
  "Id": 100
}
```

### 4.4. Lấy chi tiết các hạng mục của một đợt bảo trì
**Endpoint:** `GET /api/Truck/TruckMaintLinkGetAll?truckMaintId={id}`
**Authorization:** `Truck.TruckMaintLinkGetAll`
**Mô tả:** Lấy danh sách các hạng mục chi tiết (đã làm gì, bao nhiêu, đơn vị nào) của một phiếu bảo trì.

---

## 5. Models - Bảo trì

### TruckMaintAttributeModel
```csharp
public class TruckMaintAttributeModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}
```

### TruckMaintenanceModel
```csharp
public class TruckMaintenanceModel
{
    public int Id { get; set; }
    public int AgencyId { get; set; }
    public int TruckId { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string GarageName { get; set; }
    public string GarageAddress { get; set; }
    public string GaragePhone { get; set; }
    public decimal Cost { get; set; }
    public bool HasInvoice { get; set; }
    public string InvoiceUrl { get; set; }
    public DateTimeOffset StartTime { get; set; }
    public DateTimeOffset EndTime { get; set; }
    public DateTimeOffset NextTime { get; set; }
    
    // Danh sách hạng mục chi tiết
    public List<TruckMaintLinkModel> TruckMaintLinkModels { get; set; }
}
```

### TruckMaintLinkModel
```csharp
public class TruckMaintLinkModel
{
    public int Id { get; set; }
    public int TruckMaintenanceId { get; set; } // Tự động gán khi tạo cùng Maintenance
    public int TruckMaintAttributeId { get; set; } // ID của thuộc tính (vd: Thay nhớt)
    public string TruckMaintenanceValue { get; set; } // Giá trị (vd: "5")
    public Units TruckMaintenanceUnit { get; set; } // Đơn vị tính
}
```

### Units Enum
| Value | Name | Description |
|-------|------|-------------|
| 1 | Centimeter | cm |
| 2 | Meter | m |
| 3 | Kilometre | km |
| 4 | Kilogram | kg |
| 5 | CubicMetre | m3 |

> [!WARNING]
> **Lưu ý về Đơn vị tính**:
> Hiện tại enum `Units` chỉ hỗ trợ các đơn vị đo lường vật lý (Length, Weight, Volume).
> Đối với các hạng mục bảo trì dùng đơn vị khác (Lít, Cái, Chiếc...), Backend có thể cần cập nhật thêm vào Enum này hoặc xử lý quy đổi.
