## API: Chuẩn bị dữ liệu bộ lọc danh sách đơn hàng

- Service: IOrderService.PrepareOrderListFilterAsync(OrderListFilter filter)
- Controller: OrderController
- Route: POST /api/Order/PrepareOrderListFilter
- Authorization: [Authorize(Roles = "Order.Search")]
- Mục đích: Trả về các danh sách tuỳ chọn (options) phục vụ UI lọc danh sách đơn hàng.

### Mô tả tổng quan

Endpoint này cung cấp sẵn các danh sách lựa chọn cho bộ lọc:

- StatusOptions: Danh sách trạng thái đơn hàng (theo OrderStatus)
- PhysicalStatusOptions: Danh sách trạng thái vật lý của đơn (theo OrderPhysicalStatus)
- PayFeeTypeOptions: Danh sách phương thức thanh toán phí (theo OrderFinEnum.PayFeeType)

- CustomerOptions: Danh sách khách hàng (chỉ trả về khi truyền CustomerId > 0),
  mỗi phần tử có dạng CustomerOption { Id, FullName, PhoneNumber, UserName }

Các danh sách được trả về ở dạng FilterOption { Id, Name } (PascalCase), trong đó:

- Id: giá trị số của enum
- Name: tên hiển thị đã được lấy từ [Description] của enum (nếu có), hoặc tên enum

### Request

- Method: POST
- URL: /api/Order/PrepareOrderListFilter
- Body (PascalCase):

```
{
  "CustomerId": 0 // hoặc > 0 để lấy sẵn thông tin khách hàng
}
```

- Header: Authorization: Bearer <jwt-token> (yêu cầu quyền Order.Search)

### Response

- HTTP 200 OK
- Content-Type: application/json

Ví dụ:

```
{
  "StatusOptions": [
    { "Id": 1, "Name": "Tạo mới" },
    { "Id": 8, "Name": "Hủy" },
    { "Id": 3, "Name": "Đã nhận hàng" },
    { "Id": 11, "Name": "Lấy thất bại" },
    { "Id": 55, "Name": "Đã giao hàng" },
    { "Id": 51, "Name": "Giao thất bại" },
    { "Id": 63, "Name": "Đã trả về" },
    { "Id": 61, "Name": "Trả vể thất bại" },
    { "Id": 16, "Name": "Chờ trả về" },
    { "Id": 99, "Name": "Không xác định" }
  ],
  "PhysicalStatusOptions": [
    { "Id": 1, "Name": "Chờ lấy hàng" },
    { "Id": 8, "Name": "Đã hủy" },
    { "Id": 11, "Name": "Triển khai lấy hàng" },
    { "Id": 12, "Name": "Đang đi lấy hàng" },
    { "Id": 13, "Name": "Lấy hàng thành công" },
    { "Id": 14, "Name": "Lấy hàng thành công" },
    { "Id": 20, "Name": "Nhập vào kho" },
    { "Id": 30, "Name": "Xuất khỏi kho" },
    { "Id": 51, "Name": "Triển khai giao hàng" },
    { "Id": 53, "Name": "Đang giao hàng" },
    { "Id": 55, "Name": "Giao thành công" },
    { "Id": 61, "Name": "Triển khai trả hàng" },
    { "Id": 62, "Name": "Đang trả hàng" },
    { "Id": 63, "Name": "Đã trả về đối tác" },
    { "Id": 77, "Name": "Thất lạc" },
    { "Id": 78, "Name": "Hàng hỏng" },
    { "Id": 79, "Name": "Lưu kho" },
    { "Id": 99, "Name": "Không xác định" }
  ],
  "PayFeeTypeOptions": [
    { "Id": 1, "Name": "Người gửi thanh toán" },
    { "Id": 2, "Name": "Người nhận thanh toán" },
    { "Id": 3, "Name": "Chuyển khoản cho kế toán" },
    { "Id": 4, "Name": "Thu cước 2 đầu" },
    { "Id": 5, "Name": "Cấn trừ COD" }
  ],
  "CustomerOptions": [ // Chỉ có nếu gửi CustomerId > 0
    {
      "Id": 2122,
      "FullName": "Huy Vietvalue",
      "PhoneNumber": "0982917136",
      "UserName": ""
    }
  ]
}
```

Ghi chú: Danh sách thực tế phụ thuộc định nghĩa enum trong `Lada.Framework/Data/Enums/` và sẽ trả theo thứ tự Id tăng dần.

### Phụ thuộc & Liên quan

- Enums:
  - Lada.Framework.Data.Enums.OrderStatus
  - Lada.Framework.Data.Enums.OrderPhysicalStatus
  - Lada.Framework.Data.Enums.OrderFinEnum.PayFeeType
- DTO:
  - Ladaer.BackEnd/Infrastructures/DTO/Filters/Shared/FilterOption.cs
  - Ladaer.BackEnd/Infrastructures/DTO/Filters/Orders/OrderListFilter.cs
- Service & Controller:
  - Ladaer.BackEnd/Infrastructures/Services/Orders/OrderService.cs
  - Ladaer.BackEnd/Controllers/Orders/OrderController.cs

### Thay đổi gần đây

- 2025-10-13: Thêm endpoint PrepareOrderListFilter, chuẩn hóa sử dụng FilterOption và DTO OrderListFilter.
