# 📚 Documentação da API SIGEFP

## 🌐 Acesso ao Swagger UI

Após iniciar a aplicação, acesse a documentação interativa do Swagger:

- **Swagger UI**: http://localhost:8081/swagger-ui.html
- **OpenAPI JSON**: http://localhost:8081/api-docs
- **OpenAPI YAML**: http://localhost:8081/api-docs.yaml

## 🔐 Autenticação

A API utiliza autenticação JWT (JSON Web Token). Para acessar os endpoints protegidos:

1. **Fazer login** em `/api/auth/login` para obter o token
2. **Incluir o token** no header `Authorization: Bearer {token}` em todas as requisições

### Exemplo de Login

```bash
POST /api/auth/login
Content-Type: application/json

{
  "username": "usuario",
  "password": "senha"
}
```

**Resposta:**
```json
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "type": "Bearer",
  "username": "usuario",
  "fullName": "Nome Completo",
  "email": "usuario@example.com",
  "roles": ["ADMIN", "USER"]
}
```

### Usar o Token

```bash
GET /api/admin/users
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```

## 📋 Endpoints Principais

### 🔑 Autenticação (`/api/auth`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| POST | `/api/auth/login` | Autenticar usuário | Não |
| POST | `/api/auth/refresh` | Renovar tokens | Não |
| POST | `/api/auth/logout` | Logout | Não |

### 👥 Administração (`/api/admin`)

#### Usuários (`/api/admin/users`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/admin/users` | Listar usuários (paginado) | Sim |
| GET | `/api/admin/users/{id}` | Buscar usuário por ID | Sim |
| POST | `/api/admin/users` | Criar usuário | Sim |
| PUT | `/api/admin/users/{id}` | Atualizar usuário | Sim |
| POST | `/api/admin/users/{id}/roles` | Associar roles ao usuário | Sim |

#### Roles (`/api/admin/roles`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/admin/roles` | Listar roles | Sim |
| GET | `/api/admin/roles/{id}` | Buscar role por ID | Sim |
| POST | `/api/admin/roles` | Criar role | Sim |
| PUT | `/api/admin/roles/{id}` | Atualizar role | Sim |

#### Auditoria (`/api/admin/audit-logs`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/admin/audit-logs` | Listar logs de auditoria (com filtros) | Sim |

### 🏛️ Organização (`/api/org`)

#### Ministérios (`/api/org/ministries`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/org/ministries` | Listar ministérios | Sim |
| GET | `/api/org/ministries/{id}` | Buscar ministério por ID | Sim |
| POST | `/api/org/ministries` | Criar ministério | Sim |
| PUT | `/api/org/ministries/{id}` | Atualizar ministério | Sim |

#### Unidades Organizacionais (`/api/org/org-units`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/org/org-units` | Listar unidades (com filtros) | Sim |
| GET | `/api/org/org-units/{id}` | Buscar unidade por ID | Sim |
| GET | `/api/org/org-units/tree/{ministryId}` | Árvore de unidades por ministério | Sim |
| POST | `/api/org/org-units` | Criar unidade | Sim |
| PUT | `/api/org/org-units/{id}` | Atualizar unidade | Sim |

#### Posições (`/api/org/positions`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/org/positions` | Listar posições (com filtros) | Sim |
| GET | `/api/org/positions/{id}` | Buscar posição por ID | Sim |
| POST | `/api/org/positions` | Criar posição | Sim |
| PUT | `/api/org/positions/{id}` | Atualizar posição | Sim |

### 👨‍💼 Recursos Humanos (`/api/rh`)

#### Agentes (`/api/rh/agents`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/rh/agents` | Listar agentes (paginado) | Sim |
| GET | `/api/rh/agents/{id}` | Buscar agente por ID | Sim |
| POST | `/api/rh/agents` | Criar agente | Sim |
| PUT | `/api/rh/agents/{id}` | Atualizar agente | Sim |

#### Folha de Pagamento (`/api/rh`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/rh/payroll-periods` | Listar períodos de folha | Sim |
| POST | `/api/rh/payroll-periods` | Criar período de folha | Sim |
| POST | `/api/rh/payroll-runs` | Criar execução de folha | Sim |
| GET | `/api/rh/payroll-runs/{id}` | Buscar execução de folha | Sim |

#### Transparência e Vida Laboral

A partir da versão de Dezembro/2024, o histórico de agentes foi substituído por uma **Linha do Tempo de Carreira** estruturada, conforme o Decreto 12-A/94.

| Método | Endpoint | Descrição | DTO de Resposta |
|--------|----------|-----------|-----------------|
| GET | `/api/rh/agents/{id}/history` | Linha do tempo profissional | `List<CareerTimelineDTO>` |

> [!NOTE]
> Para detalhes sobre a lógica de snapshots salariais (5/6 e 1/6) e regras de promoção, consulte a [Documentação Técnica da Vida Laboral](./DOCUMENTACAO_VIDA_LABORAL.md).

### 💰 Orçamento (`/api/budget`)

#### Exercícios Fiscais (`/api/budget/fiscal-years`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/budget/fiscal-years` | Listar exercícios fiscais | Sim |
| GET | `/api/budget/fiscal-years/{id}` | Buscar exercício por ID | Sim |
| GET | `/api/budget/fiscal-years/current` | Buscar exercício atual | Sim |
| POST | `/api/budget/fiscal-years` | Criar exercício fiscal | Sim |
| POST | `/api/budget/fiscal-years/{id}/open` | Abrir exercício fiscal | Sim |
| POST | `/api/budget/fiscal-years/{id}/close` | Fechar exercício fiscal | Sim |

#### Linhas Orçamentárias (`/api/budget/lines`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/budget/lines` | Listar linhas (com filtros) | Sim |
| GET | `/api/budget/lines/{id}` | Buscar linha por ID | Sim |
| POST | `/api/budget/lines` | Criar linha orçamentária | Sim |
| PUT | `/api/budget/lines/{id}` | Atualizar linha | Sim |

#### Execução Orçamentária (`/api/budget/execution`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/budget/execution` | Listar execuções (com filtros) | Sim |
| POST | `/api/budget/execution` | Registrar execução orçamentária | Sim |

### 💳 Tesouraria (`/api/treasury`)

#### Lotes de Pagamento (`/api/treasury/payment-batches`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/treasury/payment-batches` | Listar lotes (com filtros) | Sim |
| GET | `/api/treasury/payment-batches/{id}` | Buscar lote por ID | Sim |
| POST | `/api/treasury/payment-batches` | Criar lote | Sim |
| POST | `/api/treasury/payment-batches/{id}/status` | Atualizar status do lote | Sim |

#### Ordens de Pagamento (`/api/treasury/payment-orders`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/treasury/payment-orders` | Listar ordens (com filtros) | Sim |
| GET | `/api/treasury/payment-orders/{id}` | Buscar ordem por ID | Sim |
| POST | `/api/treasury/payment-orders` | Criar ordem de pagamento | Sim |
| POST | `/api/treasury/payment-orders/{id}/status` | Atualizar status da ordem | Sim |

#### Pagamentos (`/api/treasury/payments`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/treasury/payments` | Listar pagamentos (com filtros) | Sim |
| POST | `/api/treasury/payments` | Registrar pagamento | Sim |

### 🏦 Comum (`/api/common`)

#### Bancos (`/api/common/banks`)

| Método | Endpoint | Descrição | Autenticação |
|--------|----------|-----------|--------------|
| GET | `/api/common/banks` | Listar bancos (paginado) | Sim |
| GET | `/api/common/banks/{id}` | Buscar banco por ID | Sim |
| POST | `/api/common/banks` | Criar banco | Sim |
| PUT | `/api/common/banks/{id}` | Atualizar banco | Sim |

## 📦 Exemplos de Requisições

### Criar Usuário

```bash
POST /api/admin/users
Authorization: Bearer {token}
Content-Type: application/json

{
  "username": "novousuario",
  "fullName": "Novo Usuário",
  "email": "novo@example.com",
  "password": "senha123",
  "isActive": true,
  "roleIds": ["role-uuid-1", "role-uuid-2"]
}
```

### Criar Agente

```bash
POST /api/rh/agents
Authorization: Bearer {token}
Content-Type: application/json

{
  "nationalId": "12345678901",
  "fullName": "João Silva",
  "email": "joao@example.com",
  "hireDate": "2024-01-15",
  "status": "ACTIVE",
  "orgUnitId": "org-unit-uuid",
  "positionId": "position-uuid"
}
```

### Criar Período de Folha

```bash
POST /api/rh/payroll-periods
Authorization: Bearer {token}
Content-Type: application/json

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

## 🔄 Refresh Token

Quando o token de acesso expirar, use o refresh token para obter novos tokens:

```bash
POST /api/auth/refresh
Content-Type: application/json

{
  "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
```

## 📥 Exportar Coleção Postman

1. Acesse o Swagger UI: http://localhost:8081/swagger-ui.html
2. Clique em "Download" no topo da página
3. Selecione "OpenAPI 3.0 (JSON)"
4. Importe o arquivo no Postman ou Insomnia

## ⚠️ Códigos de Status HTTP

| Código | Descrição |
|--------|-----------|
| 200 | Sucesso |
| 201 | Criado com sucesso |
| 400 | Requisição inválida (validação falhou) |
| 401 | Não autenticado (token inválido ou ausente) |
| 403 | Não autorizado (sem permissão) |
| 404 | Recurso não encontrado |
| 500 | Erro interno do servidor |

## 🔒 Segurança

- Todos os endpoints (exceto `/api/auth/**` e `/actuator/**`) requerem autenticação JWT
- Tokens expiram em 24 horas
- Refresh tokens expiram em 7 dias
- Use HTTPS em produção
- Mantenha a chave secreta JWT segura

## 📝 Notas

- A paginação usa parâmetros `page` (padrão: 0) e `size` (padrão: 20)
- Ordenação usa `sortBy` e `sortDirection` (ASC/DESC)
- Datas devem estar no formato ISO 8601: `YYYY-MM-DD` ou `YYYY-MM-DDTHH:mm:ss`
- UUIDs devem estar no formato padrão UUID

