Skip to main content

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âmetroTipoObrigatórioDescrição
codigostringNãoFiltrar por código da análise
tipo_analise_iduuidNãoFiltrar por tipo de análise
data_entrada_iniciodateNãoData inicial para filtro (formato: YYYY-MM-DD)
data_entrada_fimdateNãoData final para filtro (formato: YYYY-MM-DD)
prioritarias_primeirobooleanNãoOrdenar análises prioritárias primeiro (padrão: true)
sla_primeirobooleanNãoOrdenar por SLA mais próximo de vencer (padrão: false)
pageintegerNãoNúmero da página (padrão: 1)
limitintegerNãoItens 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âmetroTipoObrigatórioDescrição
iduuidSimID 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));

Exemplo de Requisição (Node.js - Axios)

const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
const fluxoId = '550e8400-e29b-41d4-a716-446655440010';

axios.put(`http://localhost:3000/api/aprovacoes-alcada/${fluxoId}/responsavel`, {
usuario_id: '550e8400-e29b-41d4-a716-446655440003'
}, {
headers: {
'Content-Type': 'application/json',
'x-api-key': token
}
})
.then(response => {
console.log('Responsável atribuído:', response.data);
})
.catch(error => console.error('Erro ao atribuir responsável:', error));

Resposta de Sucesso (200 OK)

{
"id": "550e8400-e29b-41d4-a716-446655440010",
"responsavel": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva",
"email": "[email protected]"
},
"mensagem": "Responsável atribuído com sucesso"
}

Resposta de Erro (403 Forbidden)

{
"error": {
"message": "Usuário não tem permissão para este nível de alçada",
"code": "UNAUTHORIZED_ALCADA_LEVEL",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}

4. Registrar Decisão

Registra uma decisão (aprovar, reprovar, encaminhar ou devolver) para um fluxo de alçada.

POST /api/aprovacoes-alcada/{id}/decisao

Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
iduuidSimID do fluxo de alçada

Corpo da Requisição (Aprovação)

{
"decisao": "aprovar",
"parecer_texto": "Análise aprovada conforme política de crédito. Cliente com bom histórico e garantias adequadas."
}

Corpo da Requisição (Reprovação)

{
"decisao": "reprovar",
"parecer_texto": "Análise reprovada devido a inconsistências na documentação.",
"motivo_declinio_id": "550e8400-e29b-41d4-a716-446655440020",
"detalhamento_motivo_declinio": "Documentação fiscal apresenta divergências significativas."
}

Corpo da Requisição (Encaminhamento)

{
"decisao": "encaminhar",
"parecer_texto": "Encaminhando para nível superior devido ao valor da operação.",
"nivel_destino_id": "550e8400-e29b-41d4-a716-446655440030",
"justificativa_encaminhamento": "Valor excede alçada do nível atual."
}

Corpo da Requisição (Devolução)

{
"decisao": "devolver",
"parecer_texto": "Devolvendo para complementação de informações.",
"instrucoes_analista": "Favor incluir demonstrações financeiras dos últimos 3 anos.",
"prazo_retorno_devolucao": "2025-06-10"
}

Exemplo de Requisição (cURL - Aprovação)

curl -X POST \
'http://localhost:3000/api/aprovacoes-alcada/550e8400-e29b-41d4-a716-446655440010/decisao' \
-H 'Content-Type: application/json' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
-d '{
"decisao": "aprovar",
"parecer_texto": "Análise aprovada conforme política de crédito. Cliente com bom histórico e garantias adequadas."
}'

Exemplo de Requisição (JavaScript - Fetch API - Encaminhamento)

const token = localStorage.getItem('token');
const fluxoId = '550e8400-e29b-41d4-a716-446655440010';

const requestOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': token
},
body: JSON.stringify({
decisao: 'encaminhar',
parecer_texto: 'Encaminhando para nível superior devido ao valor da operação.',
nivel_destino_id: '550e8400-e29b-41d4-a716-446655440030',
justificativa_encaminhamento: 'Valor excede alçada do nível atual.'
})
};

fetch(`http://localhost:3000/api/aprovacoes-alcada/${fluxoId}/decisao`, requestOptions)
.then(response => response.json())
.then(data => console.log('Decisão registrada:', data))
.catch(error => console.error('Erro ao registrar decisão:', error));

Exemplo de Requisição (Node.js - Axios - Reprovação)

const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
const fluxoId = '550e8400-e29b-41d4-a716-446655440010';

axios.post(`http://localhost:3000/api/aprovacoes-alcada/${fluxoId}/decisao`, {
decisao: 'reprovar',
parecer_texto: 'Análise reprovada devido a inconsistências na documentação.',
motivo_declinio_id: '550e8400-e29b-41d4-a716-446655440020',
detalhamento_motivo_declinio: 'Documentação fiscal apresenta divergências significativas.'
}, {
headers: {
'Content-Type': 'application/json',
'x-api-key': token
}
})
.then(response => {
console.log('Decisão registrada:', response.data);
})
.catch(error => console.error('Erro ao registrar decisão:', error));

Resposta de Sucesso (200 OK - Aprovação)

{
"id": "550e8400-e29b-41d4-a716-446655440050",
"fluxo_id": "550e8400-e29b-41d4-a716-446655440010",
"analise_id": "550e8400-e29b-41d4-a716-446655440000",
"decisao": "aprovar",
"nivel_alcada": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"data_decisao": "2025-06-03T15:45:00Z",
"status_fluxo": "APROVADO",
"mensagem": "Decisão registrada com sucesso"
}

Resposta de Sucesso (200 OK - Encaminhamento)

{
"id": "550e8400-e29b-41d4-a716-446655440051",
"fluxo_id": "550e8400-e29b-41d4-a716-446655440010",
"analise_id": "550e8400-e29b-41d4-a716-446655440000",
"decisao": "encaminhar",
"nivel_alcada": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"nivel_destino": {
"id": "550e8400-e29b-41d4-a716-446655440030",
"nome": "Gestor",
"ordem": 2
},
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"data_decisao": "2025-06-03T15:45:00Z",
"status_fluxo": "EM_ANALISE",
"mensagem": "Decisão registrada com sucesso"
}

Resposta de Erro (400 Bad Request)

{
"error": {
"message": "Dados de decisão inválidos",
"code": "INVALID_DECISION_DATA",
"details": [
"Parecer é obrigatório",
"Decisão deve ser aprovar, reprovar, encaminhar ou devolver"
],
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}

5. Buscar Histórico de Fluxo

Retorna o histórico completo do fluxo de aprovação para uma análise.

GET /api/aprovacoes-alcada/analises/{analiseId}/historico

Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
analiseIduuidSimID da análise

Exemplo de Requisição (cURL)

curl -X GET \
'http://localhost:3000/api/aprovacoes-alcada/analises/550e8400-e29b-41d4-a716-446655440000/historico' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'

Exemplo de Requisição (JavaScript - Fetch API)

const token = localStorage.getItem('token');
const analiseId = '550e8400-e29b-41d4-a716-446655440000';

fetch(`http://localhost:3000/api/aprovacoes-alcada/analises/${analiseId}/historico`, {
method: 'GET',
headers: {
'x-api-key': token
}
})
.then(response => response.json())
.then(data => console.log('Histórico do fluxo:', data))
.catch(error => console.error('Erro ao buscar histórico:', error));

Exemplo de Requisição (Node.js - Axios)

const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
const analiseId = '550e8400-e29b-41d4-a716-446655440000';

axios.get(`http://localhost:3000/api/aprovacoes-alcada/analises/${analiseId}/historico`, {
headers: {
'x-api-key': token
}
})
.then(response => {
console.log('Histórico do fluxo:', response.data);
})
.catch(error => console.error('Erro ao buscar histórico:', error));

Resposta de Sucesso (200 OK)

{
"analise_id": "550e8400-e29b-41d4-a716-446655440000",
"codigo_analise": "ANL-2025-0001",
"status_atual": "APROVADO",
"data_inicio": "2025-06-01T10:30:00Z",
"data_conclusao": "2025-06-03T15:45:00Z",
"tempo_total": "2 dias, 5 horas, 15 minutos",
"eventos": [
{
"id": "550e8400-e29b-41d4-a716-446655440060",
"tipo": "INICIO_FLUXO",
"data": "2025-06-01T10:30:00Z",
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"descricao": "Fluxo de aprovação iniciado"
},
{
"id": "550e8400-e29b-41d4-a716-446655440061",
"tipo": "ATRIBUICAO_RESPONSAVEL",
"data": "2025-06-01T11:15:00Z",
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"responsavel": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"descricao": "Responsável atribuído"
},
{
"id": "550e8400-e29b-41d4-a716-446655440062",
"tipo": "ENCAMINHAMENTO",
"data": "2025-06-02T09:30:00Z",
"nivel_origem": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"nome": "Analista",
"ordem": 1
},
"nivel_destino": {
"id": "550e8400-e29b-41d4-a716-446655440030",
"nome": "Gestor",
"ordem": 2
},
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"descricao": "Encaminhado para nível superior",
"justificativa": "Valor excede alçada do nível atual."
},
{
"id": "550e8400-e29b-41d4-a716-446655440063",
"tipo": "ATRIBUICAO_RESPONSAVEL",
"data": "2025-06-02T10:45:00Z",
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440030",
"nome": "Gestor",
"ordem": 2
},
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440004",
"nome": "Maria Oliveira"
},
"responsavel": {
"id": "550e8400-e29b-41d4-a716-446655440004",
"nome": "Maria Oliveira"
},
"descricao": "Responsável atribuído"
},
{
"id": "550e8400-e29b-41d4-a716-446655440064",
"tipo": "APROVACAO",
"data": "2025-06-03T15:45:00Z",
"nivel": {
"id": "550e8400-e29b-41d4-a716-446655440030",
"nome": "Gestor",
"ordem": 2
},
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440004",
"nome": "Maria Oliveira"
},
"descricao": "Análise aprovada",
"parecer": "Análise aprovada conforme política de crédito. Cliente com bom histórico e garantias adequadas."
}
]
}

Resposta de Erro (404 Not Found)

{
"error": {
"message": "Análise não encontrada",
"code": "ANALYSIS_NOT_FOUND",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}

6. Cancelar Fluxo de Aprovação

Cancela o fluxo de aprovação ativo para uma análise.

POST /api/aprovacoes-alcada/{analiseId}/cancelar

Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
analiseIduuidSimID da análise

Corpo da Requisição

{
"motivo": "Cancelado devido a informações incorretas na análise inicial."
}

Exemplo de Requisição (cURL)

curl -X POST \
'http://localhost:3000/api/aprovacoes-alcada/550e8400-e29b-41d4-a716-446655440000/cancelar' \
-H 'Content-Type: application/json' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
-d '{
"motivo": "Cancelado devido a informações incorretas na análise inicial."
}'

Exemplo de Requisição (JavaScript - Fetch API)

const token = localStorage.getItem('token');
const analiseId = '550e8400-e29b-41d4-a716-446655440000';

const requestOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': token
},
body: JSON.stringify({
motivo: 'Cancelado devido a informações incorretas na análise inicial.'
})
};

fetch(`http://localhost:3000/api/aprovacoes-alcada/${analiseId}/cancelar`, requestOptions)
.then(response => response.json())
.then(data => console.log('Fluxo cancelado:', data))
.catch(error => console.error('Erro ao cancelar fluxo:', error));

Exemplo de Requisição (Node.js - Axios)

const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
const analiseId = '550e8400-e29b-41d4-a716-446655440000';

axios.post(`http://localhost:3000/api/aprovacoes-alcada/${analiseId}/cancelar`, {
motivo: 'Cancelado devido a informações incorretas na análise inicial.'
}, {
headers: {
'Content-Type': 'application/json',
'x-api-key': token
}
})
.then(response => {
console.log('Fluxo cancelado:', response.data);
})
.catch(error => console.error('Erro ao cancelar fluxo:', error));

Resposta de Sucesso (200 OK)

{
"analise_id": "550e8400-e29b-41d4-a716-446655440000",
"fluxo_id": "550e8400-e29b-41d4-a716-446655440010",
"status": "CANCELADO",
"data_cancelamento": "2025-06-03T16:30:00Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"motivo": "Cancelado devido a informações incorretas na análise inicial.",
"mensagem": "Fluxo de aprovação cancelado com sucesso"
}

Resposta de Erro (400 Bad Request)

{
"error": {
"message": "Não há fluxo de aprovação ativo para esta análise",
"code": "NO_ACTIVE_FLOW",
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}

Fluxo Completo de Uso

Abaixo está um exemplo de fluxo completo de uso do módulo de aprovação por alçada:

  1. Iniciar o fluxo de aprovação:

    • Chamar POST /api/aprovacoes-alcada/iniciar com o ID da análise
    • O fluxo é iniciado no primeiro nível de alçada (geralmente Analista)
  2. Atribuir um responsável:

    • Chamar PUT /api/aprovacoes-alcada/{id}/responsavel com o ID do usuário responsável
    • O responsável deve ter permissão para o nível de alçada atual
  3. Registrar uma decisão:

    • Chamar POST /api/aprovacoes-alcada/{id}/decisao com a decisão (aprovar, reprovar, encaminhar, devolver)
    • Se a decisão for "encaminhar", o fluxo avança para o próximo nível
    • Se a decisão for "aprovar" ou "reprovar", o fluxo é concluído
    • Se a decisão for "devolver", o fluxo retorna para o nível anterior
  4. Consultar o histórico:

    • Chamar GET /api/aprovacoes-alcada/analises/{analiseId}/historico para ver todo o histórico do fluxo
  5. Cancelar o fluxo (se necessário):

    • Chamar POST /api/aprovacoes-alcada/{analiseId}/cancelar com o motivo do cancelamento

Melhores Práticas

  1. Verificar pendências: Sempre verifique as análises pendentes para o usuário antes de iniciar novas ações.
  2. Validar permissões: Certifique-se de que o usuário tem permissão para o nível de alçada antes de atribuir responsabilidades.
  3. Documentar decisões: Forneça pareceres detalhados e justificativas claras para todas as decisões.
  4. Monitorar SLAs: Fique atento aos prazos de SLA para evitar atrasos no fluxo de aprovação.
  5. Consultar histórico: Sempre consulte o histórico completo antes de tomar decisões para entender o contexto da análise.

Próximos Passos

Agora que você entende como utilizar o fluxo de aprovação por alçada, pode explorar outros módulos relacionados: