# API: Get Customer Revenue Permissions

## Mô Tả

API `GET /api/RevenueReport/CustomerRevenue/Permissions` trả về thông tin quyền của user hiện tại đối với báo cáo doanh thu theo khách hàng. Frontend sử dụng API này để biết user có được phép chọn sale filter hay không.

## API Endpoint

**URL:** `GET /api/RevenueReport/CustomerRevenue/Permissions`

**Method:** GET

**Authorization:** Requires `Report.CustomerRevenueStatistics` role

## Tham Số Đầu Vào

Không có tham số. API tự động lấy thông tin từ user đang đăng nhập.

## Dữ Liệu Trả Về

Response trả về object `CustomerRevenuePermissionsResult` kế thừa từ `BaseResult`:

```json
{
  "Result": 0,
  "Message": null,
  "CanSelectSale": true,
  "CanSelectMultipleCustomers": true
}
```

### CustomerRevenuePermissionsResult

| Field | Kiểu dữ liệu | Mô tả |
|-------|--------------|-------|
| Result | int | Mã kết quả: 0 = Success, 2 = Failed, 3 = SystemError |
| Message | string | Thông báo lỗi (nếu có) |
| CanSelectSale | bool | User có thể chọn sale để lọc hay không |
| CanSelectMultipleCustomers | bool | User có thể chọn nhiều khách hàng hay không |

## Logic Phân Quyền

### Founder / Accountant
- `CanSelectSale`: **true** - Được phép chọn sale để lọc dữ liệu
- `CanSelectMultipleCustomers`: **true** - Được phép chọn nhiều khách hàng

### Sale
- `CanSelectSale`: **false** - Không được chọn sale (chỉ xem khách hàng của mình)
- `CanSelectMultipleCustomers`: **false** - Không được chọn nhiều khách hàng

## Cách Sử Dụng

### Ví dụ Request

```bash
GET /api/RevenueReport/CustomerRevenue/Permissions
Authorization: Bearer {token}
```

### Ví dụ Response - Founder/Accountant

```json
{
  "result": 0,
  "message": null,
  "canSelectSale": true,
  "canSelectMultipleCustomers": true
}
```

### Ví dụ Response - Sale

```json
{
  "result": 0,
  "message": null,
  "canSelectSale": false,
  "canSelectMultipleCustomers": false
}
```

## Frontend Integration

Frontend nên gọi API này khi load trang báo cáo để:

1. **Hiển thị/Ẩn Sale Filter:**
   ```javascript
   if (permissions.canSelectSale) {
     // Hiển thị dropdown chọn sale
     showSaleFilter();
   } else {
     // Ẩn dropdown chọn sale
     hideSaleFilter();
   }
   ```

2. **Hiển thị/Ẩn Multiple Customer Selection:**
   ```javascript
   if (permissions.canSelectMultipleCustomers) {
     // Cho phép chọn nhiều khách hàng
     enableMultipleCustomerSelection();
   } else {
     // Chỉ cho phép chọn 1 khách hàng
     disableMultipleCustomerSelection();
   }
   ```

## Xử Lý Lỗi

### Lỗi thường gặp

1. **Không xác định được người dùng**
   ```json
   {
     "result": 2,
     "message": "Không xác định được người dùng",
     "canSelectSale": false,
     "canSelectMultipleCustomers": false
   }
   ```

2. **Không có quyền truy cập**
   - HTTP Status: 403 Forbidden
   - Response: Unauthorized

3. **Lỗi hệ thống**
   ```json
   {
     "result": 3,
     "message": "Lỗi hệ thống: {chi tiết lỗi}",
     "canSelectSale": false,
     "canSelectMultipleCustomers": false
   }
   ```

## Tích Hợp

### Controller

```csharp
[HttpGet("CustomerRevenue/Permissions")]
[Authorize(Roles = "Report.CustomerRevenueStatistics")]
public async Task<IActionResult> GetCustomerRevenuePermissions()
{
    var currentUser = User.GetCurrentUser();
    var permissions = await _saleReportService.GetCustomerRevenuePermissionsAsync(currentUser.UserId);
    return Ok(permissions);
}
```

### Service

```csharp
public async Task<CustomerRevenuePermissionsResult> GetCustomerRevenuePermissionsAsync(int userId)
{
    var result = new CustomerRevenuePermissionsResult();
    
    var roles = await _userService.GetRolesAsync(userId);
    
    var isFounder = roles.Any(r => r.Equals("Founder", StringComparison.OrdinalIgnoreCase));
    var isAccountant = roles.Any(r => r.Equals("Accountant", StringComparison.OrdinalIgnoreCase));
    
    result.CanSelectSale = isFounder || isAccountant;
    result.CanSelectMultipleCustomers = isFounder || isAccountant;
    
    return result;
}
```

## Performance

- API rất nhẹ, chỉ kiểm tra roles của user
- Không truy vấn database phức tạp
- Response time < 100ms

## Security

- Chỉ users có role `Report.CustomerRevenueStatistics` mới có thể gọi API
- API tự động lấy userId từ token, không cho phép truyền userId từ client
- Không trả về thông tin nhạy cảm về role cụ thể của user

## Related APIs

- [Customer Revenue Statistics API](./API_CustomerRevenueStatistics.md)

## Changelog

| Ngày | Phiên bản | Mô tả |
|------|-----------|-------|
| 2026-01-20 | 1.0 | Phiên bản đầu tiên - API lấy thông tin quyền cho báo cáo doanh thu theo khách hàng |
