From 26fc47f9894e4a3074c8efbea509fa81bce4e6ba Mon Sep 17 00:00:00 2001 From: "gabriel.amancio" Date: Wed, 7 Jan 2026 09:16:42 -0300 Subject: [PATCH] =?UTF-8?q?FEAT:=20Adi=C3=A7=C3=A3o=20de=20dist=C3=A2ncia?= =?UTF-8?q?=20na=20resposta=20da=20API.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/contratacao/contratacao.model.js | 35 ++++- .../contratacao/contratacao.service.js | 137 ++++++++---------- 2 files changed, 87 insertions(+), 85 deletions(-) diff --git a/src/modules/contratacao/contratacao.model.js b/src/modules/contratacao/contratacao.model.js index 85dfc08..186185c 100644 --- a/src/modules/contratacao/contratacao.model.js +++ b/src/modules/contratacao/contratacao.model.js @@ -1,6 +1,6 @@ // classe construtor para o modelo de viabilidade class ViabilidadeModel { - constructor(nome, email, telefone, logradouro, numero, bairro, city, state, cep, naoDedicado, dedicado) { + constructor(nome, email, telefone, logradouro, numero, bairro, city, state, cep, naoDedicado, dedicado, distancia) { // Inicialização de propriedades do modelo pode ser feita aqui this.nome = nome; this.email = email; @@ -13,6 +13,7 @@ class ViabilidadeModel { this.cep = cep; this.naoDedicado = naoDedicado; this.dedicado = dedicado; + this.distancia = distancia; } } @@ -72,7 +73,7 @@ class ClientModelPj { } class ProspectModel { - constructor(cep, servico, nomeRazaoSocial, cpfCnpj, telefone, email, tipoPessoa, bairro, endereco, numero, nomeMae) { + constructor(cep, servico, nomeRazaoSocial, cpfCnpj, telefone, email, tipoPessoa, bairro, endereco, numero, nomeMae, idCrm, complemento, dataNascimento) { this.cep = cep; this.servico = servico; this.cpf_cnpj = cpfCnpj; @@ -84,9 +85,12 @@ class ProspectModel { this.numero = numero; this.email = email; this.nomeMae = nomeMae; + this.id_crm = idCrm; + this.complemento = complemento; + this.dataNascimento = dataNascimento; } - toJSON() { + pfToJSON() { return { cep: this.cep, servico: (this.servico && typeof this.servico === 'object') ? { @@ -101,13 +105,32 @@ class ProspectModel { numero: this.numero, endereco: this.endereco, email: this.email, - // nomeMae não está no exemplo esperado; remova ou deixe se necessário + nome_mae: this.nomeMae, + id_crm: this.id_crm, + complemento: this.complemento, + data_nascimento: this.dataNascimento + }; + } + pjToJSON() { + return { + cep: this.cep, + servico: (this.servico && typeof this.servico === 'object') ? { + id_servico: this.servico.id_servico ?? this.servico.id ?? null, + valor: this.servico.valor ?? null + } : null, + nome_razaosocial: this.nome_razaosocial, + cpf_cnpj: this.cpf_cnpj, + telefone: this.telefone, + email: this.email, + tipo_pessoa: this.tipoPessoa, + bairro: this.bairro, + endereco: this.endereco, + numero: this.numero, + complemento: this.complemento }; } } - - module.exports = {ViabilidadeModel, ClientModelPf, ClientModelPj, ProspectModel}; diff --git a/src/modules/contratacao/contratacao.service.js b/src/modules/contratacao/contratacao.service.js index 36f395b..2416bde 100644 --- a/src/modules/contratacao/contratacao.service.js +++ b/src/modules/contratacao/contratacao.service.js @@ -1,10 +1,10 @@ const geogridService = require("../../shared/apis/geogridService.js"); const googleService = require("../../shared/apis/googleService.js"); -const cepRestService = require("../../shared/apis/cepRestService.js"); +// const cepRestService = require("../../shared/apis/cepRestService.js"); const hubsoftService = require("../../shared/apis/hubsoftService.js"); const logger = require('../../shared/utils/logger.js'); const repository = require('./contratacao.repository.js'); -// const viaCepService = require("../../shared/apis/viaCepService.js"); +const viaCepService = require("../../shared/apis/viaCepService.js"); const {ViabilidadeModel, ClientModelPf, ClientModelPj, ProspectModel} = require('./contratacao.model'); // utilitário para ler chaves do payload tolerante a ":" e espaços @@ -43,30 +43,30 @@ async function verificarViabilidade(rawViabilidadeData) { throw new ServiceError('CEP e número são obrigatórios.', 400); } - // // Consulta o endereço completo usando a API externa de CEP - // const addressData = await viaCepService.getConsultaCep(rawCep); - // if (!addressData) { - // logger.warn('Endereço não encontrado ou resposta inválida do serviço de CEP', { cep: rawCep, response: addressData }); - // throw new ServiceError('Endereço não encontrado para o CEP fornecido.', 404); - // } - // logger.info('Endereço obtido com sucesso via CEP', { data: addressData }); - - // const { logradouro, bairro, localidade: city, uf: state, cep } = addressData; // FIX: Usar address.data para desestruturar - // const addressString = `${logradouro}, ${rawNumero}, ${bairro}, ${city}, ${state}, ${cep}`; - // logger.info('String de endereço montada para geocodificação', { addressString }); - - - const address = await cepRestService.getConsultaCep(rawCep); - // FIX: Revertendo para a verificação correta da resposta do cepRestService - if (!address) { - logger.warn('Endereço não encontrado ou resposta inválida do serviço de CEP', { cep: rawCep, response: address }); + // Consulta o endereço completo usando a API externa de CEP + const addressData = await viaCepService.getConsultaCep(rawCep); + if (!addressData) { + logger.warn('Endereço não encontrado ou resposta inválida do serviço de CEP', { cep: rawCep, response: addressData }); throw new ServiceError('Endereço não encontrado para o CEP fornecido.', 404); } - logger.info('Endereço obtido com sucesso via CEP', { data: address }); + logger.info('Endereço obtido com sucesso via CEP', { data: addressData }); - const { logradouro, bairro, localidade: city, uf: state, cep } = address; // FIX: Usar address.data para desestruturar + const { logradouro, bairro, localidade: city, uf: state, cep } = addressData; // FIX: Usar address.data para desestruturar const addressString = `${logradouro}, ${rawNumero}, ${bairro}, ${city}, ${state}, ${cep}`; logger.info('String de endereço montada para geocodificação', { addressString }); + + + // const address = await cepRestService.getConsultaCep(rawCep); + // // FIX: Revertendo para a verificação correta da resposta do cepRestService + // if (!address) { + // logger.warn('Endereço não encontrado ou resposta inválida do serviço de CEP', { cep: rawCep, response: address }); + // throw new ServiceError('Endereço não encontrado para o CEP fornecido.', 404); + // } + // logger.info('Endereço obtido com sucesso via CEP', { data: address }); + + // const { logradouro, bairro, localidade: city, uf: state, cep } = address; // FIX: Usar address.data para desestruturar + // const addressString = `${logradouro}, ${rawNumero}, ${bairro}, ${city}, ${state}, ${cep}`; + // logger.info('String de endereço montada para geocodificação', { addressString }); const coords = await googleService.geocodeWithGoogle(addressString); if (!coords) { @@ -80,8 +80,8 @@ async function verificarViabilidade(rawViabilidadeData) { let naoDedicado = false; let dedicado = false; - if (viabilidade.data) { - const distancia = viabilidade.data.distancia; + if (viabilidade.data && viabilidade.data.distancia !== undefined) { + var distancia = viabilidade.data.distancia; logger.info(`Distância para o ponto de presença: ${distancia}m`); if (distancia <= 500) { naoDedicado = true; @@ -91,10 +91,13 @@ async function verificarViabilidade(rawViabilidadeData) { dedicado = true; } } else { - logger.warn('Resposta do GeoGrid não continha dados de viabilidade.', { cep: rawCep, numero: rawNumero }); + naoDedicado = false; + dedicado = false; + var distancia = "5KM+"; + logger.warn('Dados de viabilidade não contêm informação de distância', { viabilidadeData: viabilidade.data }); } - const viabilidadeResult = new ViabilidadeModel(rawViabilidadeData.nome, rawViabilidadeData.email, rawViabilidadeData.telefone, logradouro, rawNumero, bairro, city, state, cep, naoDedicado, dedicado); + const viabilidadeResult = new ViabilidadeModel(rawViabilidadeData.nome, rawViabilidadeData.email, rawViabilidadeData.telefone, logradouro, rawNumero, bairro, city, state, cep, naoDedicado, dedicado, distancia || null); await repository.insertViabilidadeData(viabilidadeResult) .then(() => { @@ -116,6 +119,7 @@ async function criarProspecto(rawProspectData) { '200 Mega + Super WiFi': { id_servico: '94'}, '500 Mega + Super WiFi': { id_servico: '96'}, '700 Mega + Super WiFi': { id_servico: '97'}, + '1 Gb + Super WiFi': { id_servico: '32'}, }; const planoKey = getPayloadValue(payload, 'Descrição'); @@ -142,58 +146,30 @@ async function criarProspecto(rawProspectData) { if (payload["CPF:"] === "") { // Pessoa Jurídica - const clientData = new ClientModelPj( - payload["Razão Social:"], - payload["E-mail:"], - payload["CEP:"], - payload["Número:"], - payload["Logradouro:"], - payload["Bairro:"], - payload["Cidade:"], - payload["Estado:"], - servico, - payload["Telefone:"], - "pj", - payload["Endereço de cobrança"], - payload["CNPJ:"], - payload["Selecione o dia de vencimento:"], - payload["Escolha a forma de pagamento:"], - payload["Banco:"], - `${payload["Agência:"]}-${payload["Dígito (agência):"]}`, - payload["Conta:"], - payload["E-mail de cobrança:"], - ); - logger.info('Criando prospecto PJ no Hubsoft', { clientData }); - const resultado = await hubsoftService.criarProspectoHubsoft(clientData); - logger.info('Prospecto PJ criado com sucesso no Hubsoft', { resultado }); - return resultado; - } else { - // Pessoa Física - const clientData = new ClientModelPf( - payload["Nome completo:"], - payload["E-mail:"], - payload["CEP:"], - payload["Número:"], - payload["Logradouro:"], - payload["Bairro:"], - payload["Cidade:"], - payload["Estado:"], - servico, - payload["Plano:"], - payload["CPF:"], + const prospectData = new ProspectModel( + getPayloadValue(payload, 'CEP'), + servico, // passa o objeto { id_servico, valor } + getPayloadValue(payload, 'Razão Social'), + getPayloadValue(payload, 'CNPJ'), celular, - "pf", - payload["Endereço de cobrança"], - payload["Nome da mãe:"], - payload["Data de nascimento:"], - payload["Selecione o dia de vencimento:"], - payload["Escolha a forma de pagamento:"], - payload["Banco:"], - `${payload["Agência:"]}-${payload["Dígito (agência):"]}`, - payload["Conta:"], - payload["E-mail de cobrança:"], + getPayloadValue(payload, 'E-mail'), + "pj", + getPayloadValue(payload, 'Bairro'), + getPayloadValue(payload, 'Logradouro'), + getPayloadValue(payload, 'Número'), + 4, // ID fixo do CRM Vendas + getPayloadValue(payload, 'Complemento') || "" ); - + console.log(prospectData); + // serializa para JSON plano conforme toJSON() + const prospectPayload = (typeof prospectData.pjToJSON === 'function') + ? prospectData.pjToJSON() + : JSON.parse(JSON.stringify(prospectData)); + + await hubsoftService.criarProspectHubsoft(prospectPayload); + return prospectPayload; + } else { + // clientData não sendo usado, pois o e-mail está sendo enviado pelo frontend. const prospectData = new ProspectModel( getPayloadValue(payload, 'CEP'), servico, // passa o objeto { id_servico, valor } @@ -205,12 +181,15 @@ async function criarProspecto(rawProspectData) { getPayloadValue(payload, 'Bairro'), getPayloadValue(payload, 'Logradouro'), getPayloadValue(payload, 'Número'), - getPayloadValue(payload, 'Nome da mãe') || "" + getPayloadValue(payload, 'Nome da mãe') || "", + 4, // ID fixo do CRM Vendas + getPayloadValue(payload, 'Complemento') || "", + getPayloadValue(payload, 'Data de nascimento') || "" ); - + console.log(prospectData); // serializa para JSON plano conforme toJSON() - const prospectPayload = (typeof prospectData.toJSON === 'function') - ? prospectData.toJSON() + const prospectPayload = (typeof prospectData.pfToJSON === 'function') + ? prospectData.pfToJSON() : JSON.parse(JSON.stringify(prospectData)); // envia objeto plano ao hubsoft (o hubsoftService já monta { prospectData })