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:

  1. Identifica a melhor operação (maior valor liberado) entre todas as propostas
  2. Extrai e formata todas as propriedades relevantes
  3. Consolida dados de operação, proposta e matrícula
  4. 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