Fluxo de Aprovação por Alçada
Visão Geral
O fluxo de aprovação por alçada é a funcionalidade central do RiskFlow, permitindo que análises passem por diferentes níveis hierárquicos (Analista, Gestor, Diretor) para aprovação. Este módulo gerencia todo o ciclo de vida de uma análise no processo de aprovação, incluindo inicialização do fluxo, atribuição de responsáveis, registro de decisões, encaminhamentos e histórico completo.
Endpoints
1. Listar Análises Pendentes
Retorna a lista de análises pendentes para aprovação pelo usuário logado, de acordo com seus níveis de alçada.
GET /api/aprovacoes-alcada/pendentes
Parâmetros de Consulta
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| codigo | string | Não | Filtrar por código da análise |
| tipo_analise_id | uuid | Não | Filtrar por tipo de análise |
| data_entrada_inicio | date | Não | Data inicial para filtro (formato: YYYY-MM-DD) |
| data_entrada_fim | date | Não | Data final para filtro (formato: YYYY-MM-DD) |
| prioritarias_primeiro | boolean | Não | Ordenar análises prioritárias primeiro (padrão: true) |
| sla_primeiro | boolean | Não | Ordenar por SLA mais próximo de vencer (padrão: false) |
| page | integer | Não | Número da página (padrão: 1) |
| limit | integer | Não | Itens por página (padrão: 10, máx: 100) |
Exemplo de Requisição (cURL)
curl -X GET \
'http://localhost:3000/api/aprovacoes-alcada/pendentes?prioritarias_primeiro=true&sla_primeiro=true&page=1&limit=10' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
Exemplo de Requisição (JavaScript - Fetch API)
const token = localStorage.getItem('token');
fetch('http://localhost:3000/api/aprovacoes-alcada/pendentes?prioritarias_primeiro=true&sla_primeiro=true&page=1&limit=10', {
method: 'GET',
headers: {
'x-api-key': token
}
})
.then(response => response.json())
.then(data => console.log('Análises pendentes:', data))
.catch(error => console.error('Erro ao buscar análises pendentes:', error));
Exemplo de Requisição (Node.js - Axios)
const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
axios.get('http://localhost:3000/api/aprovacoes-alcada/pendentes', {
params: {
prioritarias_primeiro: true,
sla_primeiro: true,
page: 1,
limit: 10
},
headers: {
'x-api-key': token
}
})
.then(response => {
console.log('Análises pendentes:', response.data);
})
.catch(error => console.error('Erro ao buscar análises pendentes:', error));
Resposta de Sucesso (200 OK)
{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"codigo": "ANL-2025-0001",
"tipo_analise": "Análise de Crédito",
"cliente": {
"id": "550e8400-e29b-41d4-a716-446655440001",
"nome": "Empresa ABC Ltda",
"documento": "12.345.678/0001-90"
},
"valor": 500000.00,
"moeda": "BRL",
"data_entrada": "2025-05-30T14:30:00Z",
"prazo_sla": "2025-06-05T14:30:00Z",
"dias_restantes_sla": 3,
"prioritaria": true,
"nivel_atual": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Gestor",
"ordem": 2
},
"responsavel": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"status": "EM_ANALISE"
},
// ... outros itens
],
"pagination": {
"total": 45,
"page": 1,
"limit": 10,
"pages": 5
}
}
Resposta de Erro (401 Unauthorized)
{
"error": {
"message": "API Key não fornecida",
"code": "API_KEY_REQUIRED",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}
Resposta de Erro (403 Forbidden)
{
"error": {
"message": "Usuário não possui níveis de alçada atribuídos",
"code": "NO_ALCADA_LEVELS",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}
2. Iniciar Fluxo de Aprovação
Inicia o fluxo de aprovação por alçada para uma análise existente.
POST /api/aprovacoes-alcada/iniciar
Corpo da Requisição
{
"analise_id": "550e8400-e29b-41d4-a716-446655440000"
}
Exemplo de Requisição (cURL)
curl -X POST \
'http://localhost:3000/api/aprovacoes-alcada/iniciar' \
-H 'Content-Type: application/json' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
-d '{
"analise_id": "550e8400-e29b-41d4-a716-446655440000"
}'
Exemplo de Requisição (JavaScript - Fetch API)
const token = localStorage.getItem('token');
const requestOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': token
},
body: JSON.stringify({
analise_id: '550e8400-e29b-41d4-a716-446655440000'
})
};
fetch('http://localhost:3000/api/aprovacoes-alcada/iniciar', requestOptions)
.then(response => response.json())
.then(data => console.log('Fluxo iniciado:', data))
.catch(error => console.error('Erro ao iniciar fluxo:', error));
Exemplo de Requisição (Node.js - Axios)
const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
axios.post('http://localhost:3000/api/aprovacoes-alcada/iniciar', {
analise_id: '550e8400-e29b-41d4-a716-446655440000'
}, {
headers: {
'Content-Type': 'application/json',
'x-api-key': token
}
})
.then(response => {
console.log('Fluxo iniciado:', response.data);
})
.catch(error => console.error('Erro ao iniciar fluxo:', error));
Resposta de Sucesso (200 OK)
{
"id": "550e8400-e29b-41d4-a716-446655440010",
"analise_id": "550e8400-e29b-41d4-a716-446655440000",
"nivel_atual": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"data_inicio": "2025-06-03T14:30:00Z",
"prazo_sla": "2025-06-06T14:30:00Z",
"status": "EM_ANALISE",
"mensagem": "Fluxo de aprovação iniciado com sucesso"
}
Resposta de Erro (400 Bad Request)
{
"error": {
"message": "Análise já possui um fluxo de aprovação ativo",
"code": "ACTIVE_FLOW_EXISTS",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}
Resposta de Erro (404 Not Found)
{
"error": {
"message": "Análise não encontrada",
"code": "ANALYSIS_NOT_FOUND",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}
3. Atribuir Responsável
Atribui um responsável para um fluxo de alçada específico.
PUT /api/aprovacoes-alcada/{id}/responsavel
Parâmetros de URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| id | uuid | Sim | ID do fluxo de alçada |
Corpo da Requisição
{
"usuario_id": "550e8400-e29b-41d4-a716-446655440003"
}
Exemplo de Requisição (cURL)
curl -X PUT \
'http://localhost:3000/api/aprovacoes-alcada/550e8400-e29b-41d4-a716-446655440010/responsavel' \
-H 'Content-Type: application/json' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
-d '{
"usuario_id": "550e8400-e29b-41d4-a716-446655440003"
}'
Exemplo de Requisição (JavaScript - Fetch API)
const token = localStorage.getItem('token');
const fluxoId = '550e8400-e29b-41d4-a716-446655440010';
const requestOptions = {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'x-api-key': token
},
body: JSON.stringify({
usuario_id: '550e8400-e29b-41d4-a716-446655440003'
})
};
fetch(`http://localhost:3000/api/aprovacoes-alcada/${fluxoId}/responsavel`, requestOptions)
.then(response => response.json())
.then(data => console.log('Responsável atribuído:', data))
.catch(error => console.error('Erro ao atribuir responsável:', error));