Métricas do Fluxo de Aprovação
Visão Geral
O módulo de métricas fornece indicadores e estatísticas sobre o desempenho do fluxo de aprovação por alçada. Estas métricas permitem monitorar tempos de aprovação, taxas de aprovação/reprovação, análises pendentes e cumprimento de SLAs, oferecendo insights valiosos para otimização do processo.
Endpoints
1. Dashboard Completo de Métricas
Retorna todas as métricas básicas consolidadas em um único endpoint.
GET /api/metricas/dashboard
Parâmetros de Consulta
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| data_inicio | string (date-time) | Não | Data inicial para filtro (formato: YYYY-MM-DDThh:mm:ssZ) |
| data_fim | string (date-time) | Não | Data final para filtro (formato: YYYY-MM-DDThh:mm:ssZ) |
| tipo_analise_id | uuid | Não | Filtrar por tipo de análise |
| nivel_alcada_id | uuid | Não | Filtrar por nível de alçada |
Exemplo de Requisição (cURL)
curl -X GET \
'http://localhost:3000/api/metricas/dashboard?data_inicio=2025-05-01T00:00:00Z&data_fim=2025-05-31T23:59:59Z' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
Exemplo de Requisição (JavaScript - Fetch API)
const token = localStorage.getItem('token');
fetch('http://localhost:3000/api/metricas/dashboard?data_inicio=2025-05-01T00:00:00Z&data_fim=2025-05-31T23:59:59Z', {
method: 'GET',
headers: {
'x-api-key': token
}
})
.then(response => response.json())
.then(data => console.log('Dashboard de métricas:', data))
.catch(error => console.error('Erro ao buscar dashboard de métricas:', error));
Exemplo de Requisição (Node.js - Axios)
const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
axios.get('http://localhost:3000/api/metricas/dashboard', {
params: {
data_inicio: '2025-05-01T00:00:00Z',
data_fim: '2025-05-31T23:59:59Z'
},
headers: {
'x-api-key': token
}
})
.then(response => {
console.log('Dashboard de métricas:', response.data);
})
.catch(error => console.error('Erro ao buscar dashboard de métricas:', error));
Resposta de Sucesso (200 OK)
{
"periodo": {
"inicio": "2025-05-01T00:00:00Z",
"fim": "2025-05-31T23:59:59Z"
},
"tempo_medio": {
"geral": {
"tempo_medio_dias": 3.2,
"tempo_medio_horas": 76.8
},
"por_nivel": [
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"tempo_medio_dias": 1.5,
"tempo_medio_horas": 36.0
},
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440030",
"nome": "Gestor",
"ordem": 2
},
"tempo_medio_dias": 1.2,
"tempo_medio_horas": 28.8
},
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440031",
"nome": "Diretor",
"ordem": 3
},
"tempo_medio_dias": 0.5,
"tempo_medio_horas": 12.0
}
]
},
"taxa_aprovacao": {
"geral": {
"total_analises": 120,
"aprovadas": 85,
"reprovadas": 25,
"canceladas": 10,
"taxa_aprovacao_percentual": 70.83,
"taxa_reprovacao_percentual": 20.83
},
"por_nivel": [
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"total_analises": 120,
"aprovadas": 90,
"reprovadas": 20,
"encaminhadas": 10,
"taxa_aprovacao_percentual": 75.0,
"taxa_reprovacao_percentual": 16.67,
"taxa_encaminhamento_percentual": 8.33
},
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440030",
"nome": "Gestor",
"ordem": 2
},
"total_analises": 10,
"aprovadas": 8,
"reprovadas": 1,
"encaminhadas": 1,
"taxa_aprovacao_percentual": 80.0,
"taxa_reprovacao_percentual": 10.0,
"taxa_encaminhamento_percentual": 10.0
},
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440031",
"nome": "Diretor",
"ordem": 3
},
"total_analises": 1,
"aprovadas": 1,
"reprovadas": 0,
"encaminhadas": 0,
"taxa_aprovacao_percentual": 100.0,
"taxa_reprovacao_percentual": 0.0,
"taxa_encaminhamento_percentual": 0.0
}
]
},
"analises_pendentes": {
"total": 45,
"por_nivel": [
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"quantidade": 30,
"percentual": 66.67
},
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440030",
"nome": "Gestor",
"ordem": 2
},
"quantidade": 12,
"percentual": 26.67
},
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440031",
"nome": "Diretor",
"ordem": 3
},
"quantidade": 3,
"percentual": 6.66
}
],
"sem_responsavel": 15,
"percentual_sem_responsavel": 33.33
},
"sla": {
"cumprimento": {
"total_analises_concluidas": 110,
"dentro_sla": 95,
"fora_sla": 15,
"percentual_cumprimento": 86.36
},
"pendentes_por_status": [
{
"status": "DENTRO_PRAZO",
"quantidade": 35,
"percentual": 77.78
},
{
"status": "PROXIMO_VENCIMENTO",
"quantidade": 7,
"percentual": 15.56
},
{
"status": "VENCIDO",
"quantidade": 3,
"percentual": 6.66
}
]
}
}
2. Tempo Médio de Aprovação
Retorna métricas de tempo médio de aprovação por nível de alçada.
GET /api/metricas/tempo-medio
Parâmetros de Consulta
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| data_inicio | string (date-time) | Não | Data inicial para filtro (formato: YYYY-MM-DDThh:mm:ssZ) |
| data_fim | string (date-time) | Não | Data final para filtro (formato: YYYY-MM-DDThh:mm:ssZ) |
| tipo_analise_id | uuid | Não | Filtrar por tipo de análise |
| nivel_alcada_id | uuid | Não | Filtrar por nível de alçada |
Exemplo de Requisição (cURL)
curl -X GET \
'http://localhost:3000/api/metricas/tempo-medio?nivel_alcada_id=550e8400-e29b-41d4-a716-446655440002' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
Exemplo de Requisição (JavaScript - Fetch API)
const token = localStorage.getItem('token');
const nivelAlcadaId = '550e8400-e29b-41d4-a716-446655440002';
fetch(`http://localhost:3000/api/metricas/tempo-medio?nivel_alcada_id=${nivelAlcadaId}`, {
method: 'GET',
headers: {
'x-api-key': token
}
})
.then(response => response.json())
.then(data => console.log('Tempo médio de aprovação:', data))
.catch(error => console.error('Erro ao buscar tempo médio:', error));
Resposta de Sucesso (200 OK)
{
"periodo": {
"inicio": "2025-01-01T00:00:00Z",
"fim": "2025-05-31T23:59:59Z"
},
"geral": {
"tempo_medio_dias": 3.2,
"tempo_medio_horas": 76.8
},
"por_nivel": [
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"tempo_medio_dias": 1.5,
"tempo_medio_horas": 36.0
}
],
"por_tipo_analise": [
{
"tipo_analise": {
"id": "550e8400-e29b-41d4-a716-446655440040",
"nome": "Análise de Crédito"
},
"tempo_medio_dias": 1.3,
"tempo_medio_horas": 31.2
},
{
"tipo_analise": {
"id": "550e8400-e29b-41d4-a716-446655440041",
"nome": "Análise de Garantias"
},
"tempo_medio_dias": 1.8,
"tempo_medio_horas": 43.2
}
]
}
3. Taxa de Aprovação/Reprovação
Retorna métricas de taxa de aprovação, reprovação e encaminhamento por nível e usuário.
GET /api/metricas/taxa-aprovacao
Parâmetros de Consulta
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| data_inicio | string (date-time) | Não | Data inicial para filtro (formato: YYYY-MM-DDThh:mm:ssZ) |
| data_fim | string (date-time) | Não | Data final para filtro (formato: YYYY-MM-DDThh:mm:ssZ) |
| tipo_analise_id | uuid | Não | Filtrar por tipo de análise |
| nivel_alcada_id | uuid | Não | Filtrar por nível de alçada |
| usuario_id | uuid | Não | Filtrar por usuário |
Exemplo de Requisição (cURL)
curl -X GET \
'http://localhost:3000/api/metricas/taxa-aprovacao?usuario_id=550e8400-e29b-41d4-a716-446655440003' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
Exemplo de Requisição (Node.js - Axios)
const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
const usuarioId = '550e8400-e29b-41d4-a716-446655440003';
axios.get('http://localhost:3000/api/metricas/taxa-aprovacao', {
params: {
usuario_id: usuarioId
},
headers: {
'x-api-key': token
}
})
.then(response => {
console.log('Taxa de aprovação:', response.data);
})
.catch(error => console.error('Erro ao buscar taxa de aprovação:', error));
Resposta de Sucesso (200 OK)
{
"periodo": {
"inicio": "2025-01-01T00:00:00Z",
"fim": "2025-05-31T23:59:59Z"
},
"geral": {
"total_analises": 50,
"aprovadas": 35,
"reprovadas": 10,
"canceladas": 5,
"taxa_aprovacao_percentual": 70.0,
"taxa_reprovacao_percentual": 20.0
},
"por_usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva",
"total_analises": 50,
"aprovadas": 35,
"reprovadas": 10,
"encaminhadas": 5,
"taxa_aprovacao_percentual": 70.0,
"taxa_reprovacao_percentual": 20.0,
"taxa_encaminhamento_percentual": 10.0
},
"por_tipo_analise": [
{
"tipo_analise": {
"id": "550e8400-e29b-41d4-a716-446655440040",
"nome": "Análise de Crédito"
},
"total_analises": 30,
"aprovadas": 22,
"reprovadas": 5,
"encaminhadas": 3,
"taxa_aprovacao_percentual": 73.33,
"taxa_reprovacao_percentual": 16.67,
"taxa_encaminhamento_percentual": 10.0
},
{
"tipo_analise": {
"id": "550e8400-e29b-41d4-a716-446655440041",
"nome": "Análise de Garantias"
},
"total_analises": 20,
"aprovadas": 13,
"reprovadas": 5,
"encaminhadas": 2,
"taxa_aprovacao_percentual": 65.0,
"taxa_reprovacao_percentual": 25.0,
"taxa_encaminhamento_percentual": 10.0
}
]
}
4. Análises Pendentes
Retorna métricas de análises pendentes por nível e responsável.
GET /api/metricas/analises-pendentes
Parâmetros de Consulta
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| tipo_analise_id | uuid | Não | Filtrar por tipo de análise |
| nivel_alcada_id | uuid | Não | Filtrar por nível de alçada |
| usuario_id | uuid | Não | Filtrar por usuário responsável |
Exemplo de Requisição (cURL)
curl -X GET \
'http://localhost:3000/api/metricas/analises-pendentes?nivel_alcada_id=550e8400-e29b-41d4-a716-446655440002' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
Exemplo de Requisição (JavaScript - Fetch API)
const token = localStorage.getItem('token');
const nivelAlcadaId = '550e8400-e29b-41d4-a716-446655440002';
fetch(`http://localhost:3000/api/metricas/analises-pendentes?nivel_alcada_id=${nivelAlcadaId}`, {
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));
Resposta de Sucesso (200 OK)
{
"total": 30,
"por_nivel": [
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"quantidade": 30,
"percentual": 100.0,
"por_responsavel": [
{
"responsavel": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"quantidade": 12,
"percentual": 40.0
},
{
"responsavel": {
"id": "550e8400-e29b-41d4-a716-446655440005",
"nome": "Carlos Santos"
},
"quantidade": 8,
"percentual": 26.67
},
{
"responsavel": null,
"quantidade": 10,
"percentual": 33.33
}
]
}
],
"por_tipo_analise": [
{
"tipo_analise": {
"id": "550e8400-e29b-41d4-a716-446655440040",
"nome": "Análise de Crédito"
},
"quantidade": 18,
"percentual": 60.0
},
{
"tipo_analise": {
"id": "550e8400-e29b-41d4-a716-446655440041",
"nome": "Análise de Garantias"
},
"quantidade": 12,
"percentual": 40.0
}
],
"por_status_sla": [
{
"status": "DENTRO_PRAZO",
"quantidade": 22,
"percentual": 73.33
},
{
"status": "PROXIMO_VENCIMENTO",
"quantidade": 6,
"percentual": 20.0
},
{
"status": "VENCIDO",
"quantidade": 2,
"percentual": 6.67
}
],
"sem_responsavel": {
"quantidade": 10,
"percentual": 33.33
}
}
5. Métricas de SLA
Retorna métricas de cumprimento de SLA (Service Level Agreement).
GET /api/metricas/sla
Parâmetros de Consulta
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| data_inicio | string (date-time) | Não | Data inicial para filtro (formato: YYYY-MM-DDThh:mm:ssZ) |
| data_fim | string (date-time) | Não | Data final para filtro (formato: YYYY-MM-DDThh:mm:ssZ) |
| tipo_analise_id | uuid | Não | Filtrar por tipo de análise |
| nivel_alcada_id | uuid | Não | Filtrar por nível de alçada |
Exemplo de Requisição (cURL)
curl -X GET \
'http://localhost:3000/api/metricas/sla?data_inicio=2025-05-01T00:00:00Z&data_fim=2025-05-31T23:59:59Z' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
Exemplo de Requisição (Node.js - Axios)
const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
axios.get('http://localhost:3000/api/metricas/sla', {
params: {
data_inicio: '2025-05-01T00:00:00Z',
data_fim: '2025-05-31T23:59:59Z'
},
headers: {
'x-api-key': token
}
})
.then(response => {
console.log('Métricas de SLA:', response.data);
})
.catch(error => console.error('Erro ao buscar métricas de SLA:', error));
Resposta de Sucesso (200 OK)
{
"periodo": {
"inicio": "2025-05-01T00:00:00Z",
"fim": "2025-05-31T23:59:59Z"
},
"cumprimento": {
"total_analises_concluidas": 110,
"dentro_sla": 95,
"fora_sla": 15,
"percentual_cumprimento": 86.36
},
"por_nivel": [
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"total_analises": 80,
"dentro_sla": 70,
"fora_sla": 10,
"percentual_cumprimento": 87.5
},
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440030",
"nome": "Gestor",
"ordem": 2
},
"total_analises": 25,
"dentro_sla": 22,
"fora_sla": 3,
"percentual_cumprimento": 88.0
},
{
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440031",
"nome": "Diretor",
"ordem": 3
},
"total_analises": 5,
"dentro_sla": 3,
"fora_sla": 2,
"percentual_cumprimento": 60.0
}
],
"pendentes_por_status": [
{
"status": "DENTRO_PRAZO",
"quantidade": 35,
"percentual": 77.78
},
{
"status": "PROXIMO_VENCIMENTO",
"quantidade": 7,
"percentual": 15.56
},
{
"status": "VENCIDO",
"quantidade": 3,
"percentual": 6.66
}
],
"tendencia": {
"media_dias_antes_vencimento": 2.5,
"percentual_concluido_ultimo_dia": 35.0
}
}
Visualização de Dados
As métricas fornecidas por estes endpoints podem ser visualizadas de várias formas:
1. Gráficos de Tempo Médio
// Exemplo usando Chart.js
const ctx = document.getElementById('tempoMedioChart').getContext('2d');
const chart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Analista', 'Gestor', 'Diretor'],
datasets: [{
label: 'Tempo Médio (dias)',
data: [1.5, 1.2, 0.5],
backgroundColor: [
'rgba(75, 192, 192, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(153, 102, 255, 0.2)'
],
borderColor: [
'rgba(75, 192, 192, 1)',
'rgba(54, 162, 235, 1)',
'rgba(153, 102, 255, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Dias'
}
}
}
}
});
2. Gráficos de Taxa de Aprovação
// Exemplo usando Chart.js
const ctx = document.getElementById('taxaAprovacaoChart').getContext('2d');
const chart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['Aprovadas', 'Reprovadas', 'Canceladas'],
datasets: [{
data: [70.83, 20.83, 8.34],
backgroundColor: [
'rgba(75, 192, 192, 0.2)',
'rgba(255, 99, 132, 0.2)',
'rgba(255, 206, 86, 0.2)'
],
borderColor: [
'rgba(75, 192, 192, 1)',
'rgba(255, 99, 132, 1)',
'rgba(255, 206, 86, 1)'
],
borderWidth: 1
}]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'top',
},
title: {
display: true,
text: 'Taxa de Aprovação (%)'
}
}
}
});
3. Gráficos de SLA
// Exemplo usando Chart.js
const ctx = document.getElementById('slaChart').getContext('2d');
const chart = new Chart(ctx, {
type: 'doughnut',
data: {
labels: ['Dentro do SLA', 'Fora do SLA'],
datasets: [{
data: [86.36, 13.64],
backgroundColor: [
'rgba(75, 192, 192, 0.2)',
'rgba(255, 99, 132, 0.2)'
],
borderColor: [
'rgba(75, 192, 192, 1)',
'rgba(255, 99, 132, 1)'
],
borderWidth: 1
}]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'top',
},
title: {
display: true,
text: 'Cumprimento de SLA (%)'
}
}
}
});
Melhores Práticas
- Filtros Adequados: Utilize os parâmetros de filtro para obter métricas mais específicas e relevantes.
- Período de Análise: Sempre defina um período de análise adequado para evitar sobrecarga de dados.
- Visualização Eficiente: Utilize gráficos e dashboards para visualizar as métricas de forma mais intuitiva.
- Monitoramento Regular: Verifique as métricas regularmente para identificar tendências e problemas.
- Comparação de Períodos: Compare métricas entre diferentes períodos para identificar melhorias ou deteriorações no processo.
Próximos Passos
Agora que você entende como utilizar as métricas básicas, pode explorar:
- Métricas Avançadas - Para análises comparativas e preditivas
- Dashboards - Para criação de painéis personalizados
- Exportação - Para exportar relatórios em diferentes formatos