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. */