FEAT: Adição de distância na resposta da API.

This commit is contained in:
Gabriel Amancio 2026-01-07 09:16:42 -03:00
parent 673dd2acbc
commit 26fc47f989
2 changed files with 87 additions and 85 deletions

View File

@ -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};

View File

@ -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 })