96 lines
4.2 KiB
JavaScript
96 lines
4.2 KiB
JavaScript
|
|
const geogridService = require("../../shared/apis/geogridService.js");
|
||
|
|
const googleService = require("../../shared/apis/googleService.js");
|
||
|
|
const cepRestService = require("../../shared/apis/cepRestService.js");
|
||
|
|
const hubsoftService = require("../../shared/apis/hubsoftService.js");
|
||
|
|
|
||
|
|
class ServiceError extends Error {
|
||
|
|
constructor(message, statusCode = 500) {
|
||
|
|
super(message);
|
||
|
|
this.name = 'ServiceError';
|
||
|
|
this.statusCode = statusCode;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function verificarViabilidade(rawCep, rawNumero) {
|
||
|
|
if (!rawCep || !rawNumero) {
|
||
|
|
throw new ServiceError('CEP e número são obrigatórios.', 400);
|
||
|
|
}
|
||
|
|
|
||
|
|
const address = await cepRestService.getConsultaCep(rawCep, rawNumero);
|
||
|
|
if (!address || !address.success || !address.data) {
|
||
|
|
throw new ServiceError('Endereço não encontrado para o CEP fornecido.', 404);
|
||
|
|
}
|
||
|
|
|
||
|
|
const { logradouro, bairro, localidade: city, uf: state, cep } = address.data;
|
||
|
|
const addressString = `${logradouro}, ${rawNumero}, ${bairro}, ${city}, ${state}, ${cep}`;
|
||
|
|
|
||
|
|
const coords = await googleService.geocodeWithGoogle(addressString);
|
||
|
|
if (!coords) {
|
||
|
|
throw new ServiceError('Não foi possível obter as coordenadas do endereço.', 500);
|
||
|
|
}
|
||
|
|
|
||
|
|
const viabilidade = await geogridService.consultaViabilidade(coords.lat, coords.lon);
|
||
|
|
|
||
|
|
let naoDedicado = false;
|
||
|
|
let dedicado = false;
|
||
|
|
|
||
|
|
if (viabilidade.data) {
|
||
|
|
const distancia = viabilidade.data.distancia;
|
||
|
|
if (distancia <= 500) {
|
||
|
|
naoDedicado = true;
|
||
|
|
dedicado = true;
|
||
|
|
} else if (distancia <= 1000) {
|
||
|
|
naoDedicado = true;
|
||
|
|
dedicado = false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
bairro,
|
||
|
|
cidade: city,
|
||
|
|
estado: state,
|
||
|
|
logradouro,
|
||
|
|
naoDedicado,
|
||
|
|
dedicado,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
async function criarProspecto(prospectData) {
|
||
|
|
try {
|
||
|
|
console.log("Service: Dados recebidos para criação de prospecto:", prospectData);
|
||
|
|
const resultado = await hubsoftService.criarProspectHubsoft(prospectData);
|
||
|
|
return resultado;
|
||
|
|
} catch (error) {
|
||
|
|
throw new ServiceError(error.message || 'Erro ao comunicar com o serviço de prospectos.', 500);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = {
|
||
|
|
verificarViabilidade,
|
||
|
|
criarProspecto
|
||
|
|
};
|
||
|
|
|
||
|
|
/*
|
||
|
|
DESCRIÇÃO:
|
||
|
|
Este arquivo é a camada de "Serviço" para o módulo de contratação. Ele contém a lógica de negócio principal da aplicação, orquestrando chamadas a diferentes APIs externas e processando os dados para atender às solicitações do `contratacao.controller.js`.
|
||
|
|
|
||
|
|
A classe `ServiceError` é uma classe de erro personalizada para permitir que os serviços lancem exceções com `status codes` HTTP específicos, que podem ser capturados e tratados pelo controller.
|
||
|
|
|
||
|
|
FUNÇÕES:
|
||
|
|
- verificarViabilidade(rawCep, rawNumero):
|
||
|
|
1. É chamado pelo `contratacao.controller.js` com o CEP e o número do endereço.
|
||
|
|
2. Valida se o CEP e o número foram fornecidos, lançando um `ServiceError` (400) se não forem.
|
||
|
|
3. Chama o `cepRestService` para obter os dados do endereço a partir do CEP. Se não encontrar, lança um `ServiceError` (404).
|
||
|
|
4. Monta uma string de endereço completo e a utiliza para obter as coordenadas geográficas (latitude e longitude) através do `googleService`. Lança um erro (500) se não conseguir obter as coordenadas.
|
||
|
|
5. Com as coordenadas, chama o `geogridService` para consultar a viabilidade do serviço, que retorna a distância de um ponto de presença.
|
||
|
|
6. Com base na distância retornada pelo GeoGrid, define as flags `naoDedicado` e `dedicado` (ex: se a distância for menor que 500m, ambos são `true`).
|
||
|
|
7. Retorna um objeto contendo os dados do endereço e as flags de viabilidade para o controller.
|
||
|
|
|
||
|
|
- criarProspecto(prospectData):
|
||
|
|
1. Recebe os dados do prospecto do `contratacao.controller.js`.
|
||
|
|
2. Chama o `hubsoftService` para criar o prospecto no sistema Hubsoft.
|
||
|
|
3. Retorna o resultado da criação.
|
||
|
|
4. Em caso de erro na comunicação com o Hubsoft, lança um `ServiceError` (500).
|
||
|
|
|
||
|
|
Este serviço é o cérebro do módulo, conectando múltiplas fontes de dados externas para fornecer uma resposta unificada sobre a viabilidade e para registrar novos clientes.
|
||
|
|
*/
|