# 📄 Leave Management API Documentation
## Flutter App Integrated with Odoo
---
## 1. Overview
This document describes the **Leave Request API** used by a **Flutter mobile application** integrated with **:Odoo**.
> Authentication and employee profile are handled in a **separate existing document**.
The API allows employees to:
- View leave types with balances
- Submit leave requests (days or hours)
- Track request status
- Cancel requests when allowed
---
## 2. Business Rules
1. Each employee has a dedicated leave record.
2. Each employee may have multiple leave types.
3. Leave types can be:
- Limited by balance
- Unlimited
4. Leave requests can be submitted:
- By days
- By hours
5. Leave requests follow a predefined approval workflow.
---
## 3. Core Entities
---
### 3.1 Leave Type (With Balance)
Leave balance is returned **directly with leave types**.
| Field | Type | Description |
|----|----|----|
| id | Integer | Leave type ID |
| name | String | Leave type name |
| request_unit | Enum | `day` or `hour` |
| has_limit | Boolean | Balance limited or not |
| remaining | Float | Remaining balance |
> If `has_limit = false`, balance fields will be `null`.
---
### 3.2 Leave Request
| Field | Type |
|----|----|
| id | Integer |
| leave_type_id | Integer |
| date_from | Date |
| date_to | Date |
| hour_from | Time |
| hour_to | Time |
| duration | Float |
| state | Enum |
| reason | String |
| create_date | Datetime |
---
## 4. Leave Request States
The leave request follows the below workflow states:
| State Key | Label | Description |
|---------|-------|------------|
| draft | To Submit | Request is created but not yet submitted |
| confirm | To Approve | Request has been submitted and is waiting for approval |
| cto_approve | First Approval | First-level approval (e.g. Direct Manager) |
| validate1 | Second Approval | Second-level approval (e.g. HR) |
| validate | Approved | Final approved state |
| refuse | Refused | Request has been rejected |
---
### Workflow Notes
- Requests start in `draft`
- After submission, state becomes `confirm`
- Multi-level approval is supported:
- `cto_approve` → First approval
- `validate1` → Second approval
- Final approval state is `validate`
- Rejected requests move to `refuse`
---
## 5. API Endpoints
> All endpoints require a valid Authorization token
> (Defined in the authentication document)
| # | API | Method | Description |
|--|----|------|------------|
| 1 | /api/leaves/types | GET | Get leave types with balances |
| 2 | /api/leaves/request | POST | Create leave request (day/hour) |
| 3 | /api/leaves/my_requests | GET | Get leave requests list (pagination + search) |
| 4 | /api/leaves/cancel | POST | Cancel leave request |
---
### 5.1 Get Leave Types With Balances
#### Response
```json
[
{
"id": 1,
"name": "Annual Leave",
"request_unit": "day",
"has_limit": true,
"remaining": 12
},
{
"id": 2,
"name": "Hourly Permission",
"request_unit": "hour",
"has_limit": false,
"remaining": null
}
]
```
### 5.2 Create Leave Request (Unified Endpoint)
POST /api/leaves/request
This endpoint supports day-based and hour-based leave requests.
#### Request – Day Based
```json
{
"leave_type_id": 1,
"date_from": "2026-03-01",
"date_to": "2026-03-03",
"hour_from": null,
"hour_to": null,
"reason": "Family vacation"
}
```
#### Request – Hour Based
```json
{
"leave_type_id": 1,
"date_from": "2026-03-01",
"date_to": null,
"hour_from": "09:00",
"hour_to": "12:00",
"reason": "Personal permission",
}
```
#### Response
```json
{
"success": true,
"request_id": 88,
"state": "confirm"
}
```
### 5.3 Get Leave Requests List (With Pagination & Search)
GET /api/leaves/my_requests?skip=0&take=10&search=annual
#### Response
```json
{
"success": true,
"count": 1,
"data": [
{
"id": 88,
"leave_type": "Annual Leave",
"request_unit": "day",
"date_from": "2026-03-01",
"date_to": "2026-03-03",
"hour_from": "09:00",
"hour_to": "12:00",
"duration": 3,
"state": "validate",
"state_label": "Approved"
}
]
}
```
### 5.3 Cancel Leave Request
POST /api/leaves/cancel
#### Request
```json
{
"request_id": 88
}
```
#### Response
```json
{
"success": true,
"message": "Leave request cancelled successfully"
}
```
## 6. Validation Rules
- Leave type must exist
- Date range must be valid
- If leave has limited balance → remaining balance must be sufficient
- Approved or refused requests cannot be cancelled
- Hour-based requests must respect working hours
---
## 7. Error Response Format
```json
{
"success": false,
"message": "Insufficient leave balance"
}
```
## 8. HTTP Status Codes
| Code | Description |
|------|-------------|
| 200 | Success |
| 400 | Validation error |
| 401 | Unauthorized |
| 403 | Forbidden |
| 500 | Server error |
---
## 9. Notes
- Pagination is handled using `skip` and `take`
- Search is applied on leave type name, state, and reason
- Leave balances are calculated dynamically from Odoo
- API responses are optimized for Flutter consumption