# Thư mục Reports - DTO cho Báo cáo và Thống kê

## Mô tả

Thư mục này chứa tất cả các DTO (Data Transfer Objects) liên quan đến báo cáo, thống kê và phân tích dữ liệu trong hệ thống Ladaer.

## Cấu trúc thư mục

```
Reports/
├── Orders/                    # Báo cáo liên quan đến đơn hàng
│   ├── OrderStatisticsByDateRequest.cs      # Tham số đầu vào cho thống kê đơn hàng theo ngày
│   ├── OrderStatisticsByDateResult.cs       # Kết quả thống kê đơn hàng theo ngày
│   └── OrderStatisticsByDateListResult.cs   # Danh sách kết quả thống kê đơn hàng theo ngày
├── Customers/                 # Báo cáo liên quan đến khách hàng
├── Finances/                  # Báo cáo tài chính
├── Logistics/                 # Báo cáo logistics và vận chuyển
├── Sales/                     # Báo cáo bán hàng
├── Inventory/                 # Báo cáo kho hàng
├── Performance/               # Báo cáo hiệu suất
└── README.md                  # File này
```

## Quy ước đặt tên

### **Request DTOs:**

- Sử dụng hậu tố `Request`
- Ví dụ: `OrderStatisticsByDateRequest`

### **Result DTOs:**

- Sử dụng hậu tố `Result` cho kết quả đơn lẻ
- Sử dụng hậu tố `ListResult` cho danh sách kết quả
- Ví dụ: `OrderStatisticsByDateResult`, `OrderStatisticsByDateListResult`

### **Namespace:**

- Tất cả DTO trong Reports đều sử dụng namespace: `Ladaer.BackEnd.Infrastructures.DTO.Reports.{ModuleName}`

## Các loại báo cáo chính

### **1. Báo cáo đơn hàng (Orders)**

- Thống kê theo ngày
- Thống kê theo trạng thái
- Thống kê theo chi nhánh
- Thống kê theo nhân viên

### **2. Báo cáo khách hàng (Customers)**

- Thống kê khách hàng mới
- Phân tích hành vi khách hàng
- Báo cáo chăm sóc khách hàng

### **3. Báo cáo tài chính (Finances)**

- Báo cáo doanh thu
- Báo cáo chi phí
- Báo cáo lợi nhuận
- Báo cáo dòng tiền

### **4. Báo cáo logistics (Logistics)**

- Thống kê vận chuyển
- Báo cáo hiệu suất giao hàng
- Phân tích tuyến đường

### **5. Báo cáo bán hàng (Sales)**

- Báo cáo doanh số
- Phân tích sản phẩm
- Báo cáo khu vực

### **6. Báo cáo kho hàng (Inventory)**

- Thống kê tồn kho
- Báo cáo xuất nhập kho
- Phân tích vòng quay kho

### **7. Báo cáo hiệu suất (Performance)**

- KPI tổng thể
- Báo cáo nhân viên
- Phân tích hiệu suất hệ thống

## Tính năng chung

### **Thuộc tính tính toán:**

- Các DTO thường có các thuộc tính tính toán (computed properties)
- Ví dụ: `TotalInProgress`, `SuccessRate`, `OverallSuccessRate`

### **Phương thức tiện ích:**

- Các Request DTO thường có các phương thức tạo sẵn
- Ví dụ: `Last7Days()`, `CurrentMonth()`, `CurrentYear()`

### **Validation:**

- Các Request DTO có thể chứa logic validation
- Kiểm tra tính hợp lệ của tham số đầu vào

## Sử dụng

### **1. Trong Controllers:**

```csharp
[HttpGet("statistics")]
public async Task<ActionResult<OrderStatisticsByDateListResult>> GetOrderStatistics(
    [FromQuery] OrderStatisticsByDateRequest request)
{
    // Xử lý logic
}
```

### **2. Trong Services:**

```csharp
public async Task<OrderStatisticsByDateListResult> GetOrderStatisticsAsync(
    OrderStatisticsByDateRequest request)
{
    // Gọi stored procedure và map kết quả
}
```

### **3. Trong AutoMapper:**

```csharp
CreateMap<SqlDataReader, OrderStatisticsByDateResult>()
    .ForMember(dest => dest.OrderDate, opt => opt.MapFrom(src => src["OrderDate"]))
    .ForMember(dest => dest.TotalOrders, opt => opt.MapFrom(src => src["TotalOrders"]));
```

## Mở rộng

Khi cần thêm báo cáo mới:

1. **Tạo thư mục con** nếu cần thiết
2. **Tạo các DTO** theo quy ước đặt tên
3. **Cập nhật README** này
4. **Thêm vào AutoMapper** nếu cần
5. **Tạo unit tests** cho DTO mới

## Lưu ý

- Tất cả DTO phải có XML documentation đầy đủ
- Sử dụng kiểu dữ liệu phù hợp (int, decimal, DateTime, etc.)
- Các thuộc tính tính toán nên sử dụng expression-bodied members
- Đảm bảo tính nhất quán trong cách đặt tên và cấu trúc
