# 📡 Endpoints da API SIGEFP

## Base URL
```
http://localhost:8080
```

---

## 🔐 ADMIN - `/api/admin`

### Users
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/admin/users` | Listar utilizadores | `page`, `size`, `sortBy`, `sortDirection` |
| `GET` | `/api/admin/users/{id}` | Buscar utilizador | `id` (UUID) |
| `POST` | `/api/admin/users` | Criar utilizador | Body: `UserAccountDTO` |
| `PUT` | `/api/admin/users/{id}` | Atualizar utilizador | `id` (UUID), Body: `UserAccountDTO` |
| `POST` | `/api/admin/users/{id}/roles` | Atribuir perfis | `id` (UUID), Body: `AssignRolesDTO` |

### Roles
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/admin/roles` | Listar perfis | `page`, `size`, `sortBy`, `sortDirection` |
| `GET` | `/api/admin/roles/{id}` | Buscar perfil | `id` (UUID) |
| `POST` | `/api/admin/roles` | Criar perfil | Body: `RoleDTO` |
| `PUT` | `/api/admin/roles/{id}` | Atualizar perfil | `id` (UUID), Body: `RoleDTO` |

### Audit Logs
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/admin/audit-logs` | Consultar logs | `userId`, `module`, `startDate`, `endDate`, `page`, `size` |

---

## 🏛️ ORG - `/api/org`

### Ministries
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/org/ministries` | Listar ministérios | `page`, `size`, `sortBy`, `sortDirection` |
| `GET` | `/api/org/ministries/{id}` | Buscar ministério | `id` (UUID) |
| `POST` | `/api/org/ministries` | Criar ministério | Body: `MinistryDTO` |
| `PUT` | `/api/org/ministries/{id}` | Atualizar ministério | `id` (UUID), Body: `MinistryDTO` |

### Org Units
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/org/org-units` | Listar unidades | `ministryId`, `parentUnitId`, `page`, `size` |
| `GET` | `/api/org/org-units/tree/{ministryId}` | Árvore de unidades | `ministryId` (UUID) |
| `GET` | `/api/org/org-units/{id}` | Buscar unidade | `id` (UUID) |
| `POST` | `/api/org/org-units` | Criar unidade | Body: `OrgUnitDTO` |
| `PUT` | `/api/org/org-units/{id}` | Atualizar unidade | `id` (UUID), Body: `OrgUnitDTO` |

### Positions
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/org/positions` | Listar posições | `orgUnitId`, `page`, `size` |
| `GET` | `/api/org/positions/{id}` | Buscar posição | `id` (UUID) |
| `POST` | `/api/org/positions` | Criar posição | Body: `PositionDTO` |
| `PUT` | `/api/org/positions/{id}` | Atualizar posição | `id` (UUID), Body: `PositionDTO` |

---

## 👥 RH - `/api/rh`

### Agents
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/rh/agents` | Listar agentes | `page`, `size`, `sortBy`, `sortDirection` |
| `GET` | `/api/rh/agents/{id}` | Buscar agente | `id` (UUID) |
| `POST` | `/api/rh/agents` | Criar agente | Body: `AgentDTO` |
| `PUT` | `/api/rh/agents/{id}` | Atualizar agente | `id` (UUID), Body: `AgentDTO` |

### Payroll
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/rh/payroll-periods` | Listar períodos | - |
| `POST` | `/api/rh/payroll-periods` | Criar período | Body: `CreatePayrollPeriodDTO` |
| `POST` | `/api/rh/payroll-runs` | Criar execução de folha | Body: `CreatePayrollRunDTO` |
| `GET` | `/api/rh/payroll-runs/{id}` | Buscar execução com itens | `id` (UUID) |

---

## 💰 BUDGET - `/api/budget`

### Fiscal Years
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/budget/fiscal-years` | Listar anos fiscais | `page`, `size`, `sortBy`, `sortDirection` |
| `GET` | `/api/budget/fiscal-years/current` | Obter exercício corrente | - |
| `GET` | `/api/budget/fiscal-years/{id}` | Buscar ano fiscal | `id` (UUID) |
| `POST` | `/api/budget/fiscal-years` | Criar exercício fiscal | Body: `FiscalYearDTO` |
| `POST` | `/api/budget/fiscal-years/{id}/open` | Abrir exercício | `id` (UUID) |
| `POST` | `/api/budget/fiscal-years/{id}/close` | Fechar exercício | `id` (UUID) |

### Budget Lines
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/budget/lines` | Listar linhas | `fiscalYearId`, `ministryId`, `orgUnitId`, `page`, `size` |
| `GET` | `/api/budget/lines/{id}` | Buscar linha (com cálculos) | `id` (UUID) |
| `POST` | `/api/budget/lines` | Criar linha | Body: `BudgetLineDTO` |
| `PUT` | `/api/budget/lines/{id}` | Atualizar linha | `id` (UUID), Body: `BudgetLineDTO` |

### Budget Execution
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/budget/execution` | Listar execuções | `budgetLineId`, `periodId`, `movementType`, `page`, `size` |
| `POST` | `/api/budget/execution` | Registrar movimento | Body: `BudgetExecutionDTO` |

---

## 💳 TREASURY - `/api/treasury`

### Payment Batches
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/treasury/payment-batches` | Listar lotes | `periodId`, `ministryId`, `status`, `page`, `size` |
| `GET` | `/api/treasury/payment-batches/{id}` | Buscar lote | `id` (UUID) |
| `POST` | `/api/treasury/payment-batches` | Criar lote | Body: `CreatePaymentBatchDTO` |
| `POST` | `/api/treasury/payment-batches/{id}/status` | Alterar status | `id` (UUID), Body: `UpdateStatusDTO` |

### Payment Orders
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/treasury/payment-orders` | Listar ordens | `batchId`, `status`, `page`, `size` |
| `GET` | `/api/treasury/payment-orders/{id}` | Buscar ordem | `id` (UUID) |
| `POST` | `/api/treasury/payment-orders` | Criar ordem | Body: `CreatePaymentOrderDTO` |
| `POST` | `/api/treasury/payment-orders/{id}/status` | Atualizar status | `id` (UUID), Body: `UpdateStatusDTO` |

### Treasury Payments
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/treasury/payments` | Consultar pagamentos | `paymentOrderId`, `status`, `page`, `size` |
| `POST` | `/api/treasury/payments` | Registrar pagamento efetivo | Body: `CreateTreasuryPaymentDTO` |

---

## 🏦 COMMON - `/api/common`

### Banks
| Método | Endpoint | Descrição | Parâmetros |
|--------|----------|-----------|------------|
| `GET` | `/api/common/banks` | Listar bancos | `page`, `size`, `sortBy`, `sortDirection` |
| `GET` | `/api/common/banks/{id}` | Buscar banco | `id` (UUID) |
| `POST` | `/api/common/banks` | Criar banco | Body: `BankDTO` |
| `PUT` | `/api/common/banks/{id}` | Atualizar banco | `id` (UUID), Body: `BankDTO` |

---

## 📊 Estatísticas

- **Total de Endpoints:** 50+
- **Módulos:** 6
- **Controllers:** 16
- **Métodos HTTP:** GET, POST, PUT

---

## 🔍 Parâmetros Comuns

### Paginação
- `page` (int, default: 0) - Número da página
- `size` (int, default: 20) - Tamanho da página
- `sortBy` (String, optional) - Campo para ordenação
- `sortDirection` (String, default: ASC) - Direção (ASC/DESC)

### Filtros de Data
- `startDate` (Instant, ISO format) - Data inicial
- `endDate` (Instant, ISO format) - Data final

---

## 📝 Exemplos de Requisição

### Criar Banco
```bash
POST /api/common/banks
Content-Type: application/json

{
  "code": "001",
  "name": "Banco do Brasil",
  "swiftCode": "BRASBRRJ"
}
```

### Criar Utilizador
```bash
POST /api/admin/users
Content-Type: application/json

{
  "username": "joao.silva",
  "fullName": "João Silva",
  "email": "joao.silva@example.com",
  "password": "senha123",
  "isActive": true
}
```

### Criar Período de Folha
```bash
POST /api/rh/payroll-periods
Content-Type: application/json

{
  "fiscalYear": 2024,
  "month": 12,
  "startDate": "2024-12-01",
  "endDate": "2024-12-31"
}
```

---

**Nota:** Todos os endpoints retornam JSON e esperam `Content-Type: application/json` nas requisições POST/PUT.

