Código
// Extrai dados da oferta
const inputOferta = $json;
const contentOferta = inputOferta.content;
const opportunityType = $json.opportunity_type;
// Função para formatar valores monetários no padrão brasileiro
function formatarValorMonetario(valor) {
if (valor === null || valor === undefined || valor === '' || isNaN(valor)) {
return null;
}
const numeroValor = typeof valor === 'string' ? parseFloat(valor) : valor;
if (isNaN(numeroValor)) {
return null;
}
return numeroValor.toFixed(2).replace('.', ',');
}
// Funções auxiliares para buscar operações
function getOperacoesFromProposta(proposta, opportunityType) {
return opportunityType === "saque_beneficio"
? proposta.Propostas
: proposta.Operacoes;
}
function findOperacaoWithHighestValue(propostas, opportunityType) {
let maiorOperacao = null;
let maiorValorLiberado = 0;
for (const proposta of propostas) {
const operacoes = getOperacoesFromProposta(proposta, opportunityType);
for (const operacao of operacoes) {
if (operacao.ValorLiberado > maiorValorLiberado) {
maiorValorLiberado = operacao.ValorLiberado;
maiorOperacao = operacao;
}
}
}
return maiorOperacao;
}
// Funções para extrair propriedades da operação
function getOperacaoData(operacao) {
return {
valor_liberado: formatarValorMonetario(operacao.ValorLiberado),
valor_comissao: formatarValorMonetario(operacao.ValorComissao),
valor_parcela: formatarValorMonetario(operacao.ValorParcela),
quantidade_parcelas: operacao.QuantidadeParcelas,
codigo_banco_destino: operacao.CodigoBancoDestino,
taxa_emprestimo: formatarValorMonetario(operacao.TaxaEmprestimo),
taxa_comissao: formatarValorMonetario(operacao.TaxaComissao),
taxa_juros_efetiva_mensal: formatarValorMonetario(operacao.TaxaJurosEfetivaMensal),
taxa_juros_efetiva_anual: formatarValorMonetario(operacao.TaxaJurosEfetivaAnual),
cet_mensal: formatarValorMonetario(operacao.CETMensal),
cet_anual: formatarValorMonetario(operacao.CETAnual),
valor_iof: formatarValorMonetario(operacao.ValorIOF),
taxa_iof: formatarValorMonetario(operacao.TaxaIOF),
montante: formatarValorMonetario(operacao.Montante),
descricao_tabela_banco: operacao.DescricaoTabelaBanco,
codigo_tabela_juros: operacao.CodigoTabelaJuros,
prioridade: operacao.Prioridade,
tipo_operacao: operacao.Tipo,
status_operacao: operacao.Status
};
}
function extractOperacaoProperties(maiorOperacao, opportunityType) {
if (!maiorOperacao) return {};
if (opportunityType === "saque_beneficio") {
const operacaoPrincipal = maiorOperacao.Operacoes?.[0];
return operacaoPrincipal ? getOperacaoData(operacaoPrincipal) : {};
}
return getOperacaoData(maiorOperacao);
}
// Funções para extrair propriedades da proposta
function findPropostaPrincipal(contentOferta, maiorOperacao, opportunityType) {
if (!maiorOperacao) return null;
if (opportunityType === "saque_beneficio") {
return maiorOperacao;
}
return contentOferta.find(p => p.Operacoes?.includes(maiorOperacao));
}
function extractPropostaProperties(proposta) {
if (!proposta) return {};
return {
salario: formatarValorMonetario(proposta.Salario),
margem_total: formatarValorMonetario(proposta.MargemTotal),
margem_disponivel: formatarValorMonetario(proposta.MargemDisponivel),
margem_total_cartao_beneficio: formatarValorMonetario(proposta.MargemTotalCartaoBeneficio),
margem_disponivel_cartao_beneficio: formatarValorMonetario(proposta.MargemDisponivelCartaoBeneficio),
margem_total_saque_cartao_beneficios: formatarValorMonetario(proposta.MargemTotalSaqueCartaoBeneficios),
margem_disponivel_saque_cartao_beneficios: formatarValorMonetario(proposta.MargemDisponivelSaqueCartaoBeneficios),
margem_total_cartao_consignado: formatarValorMonetario(proposta.MargemTotalCartaoConsignado),
margem_disponivel_cartao_consignado: formatarValorMonetario(proposta.MargemDisponivelCartaoConsignado),
id_simulacao: proposta.IdSimulacao
};
}
function extractMatriculaProperties(matricula) {
if (!matricula) return {};
return {
numero_matricula: matricula.Numero,
covenant_code: $json.covenant_code,
descricao_vinculo_servidor: matricula.DescricaoVinculoServidor,
lotacao: matricula.Lotacao,
elegivel_emprestimo: matricula.ElegivelEmprestimo,
liberado_emprestimo: matricula.LiberadoEmprestimo,
possui_representante_legal: matricula.PossuiRepresentanteLegal,
possui_pensao_alimenticia: matricula.PossuiPensaoAlimenticia,
codigo_especie_beneficio: matricula.CodigoEspecieBeneficio,
descricao_especie_beneficio: matricula.DescricaoEspecieBeneficio,
numero_provimento: matricula.NumeroProvimento,
data_admissao: matricula.DataAdmissao,
cnpj_empresa: matricula.CNPJEmpresa
};
}
function buildProperties(maiorOperacao, contentOferta, opportunityType) {
const propostaPrincipal = findPropostaPrincipal(contentOferta, maiorOperacao, opportunityType);
const operacaoProperties = extractOperacaoProperties(maiorOperacao, opportunityType);
const propostaProperties = extractPropostaProperties(propostaPrincipal);
const matriculaProperties = extractMatriculaProperties(propostaPrincipal?.Matricula);
return {
...operacaoProperties,
...propostaProperties,
...matriculaProperties,
data_hora_processamento: new Date().toISOString()
};
}
// Encontra a operação com maior valor liberado
const maiorOperacao = findOperacaoWithHighestValue(contentOferta, opportunityType);
// Constrói e retorna as propriedades
const properties = buildProperties(maiorOperacao, contentOferta, opportunityType);
return { properties, opportunityType };Saídas
properties: Objeto contendo todas as propriedades formatadas da melhor oferta- Valores monetários no formato brasileiro (vírgula como separador decimal)
- Dados da operação, proposta e matrícula consolidados
opportunityType: Tipo da oportunidade processada
Descrição adicional
Código JavaScript complexo que:
- Identifica a melhor operação (maior valor liberado) entre todas as propostas
- Extrai e formata todas as propriedades relevantes
- Consolida dados de operação, proposta e matrícula
- Formata valores monetários para padrão brasileiro (vírgula)
Relações
← Recebe de: 10 -flow-variable---set-content → Envia para: 12-execute-workflow---subworkflow-id-covenant
Observações
- Tratamento especial para saque_beneficio que tem estrutura diferente