// src/modules/createTickets/services/mundiale.service.js
const repositoryHubGlpi = require('../../../shared/repositories/hubglpi.repository.js');
const repositoryGlpi = require('../../../shared/repositories/glpi.repository.js');
const repositoryHubsoft = require('../../../shared/repositories/hubsoft.repository.js');
const modelHubGlpi = require('../../../shared/model/hubglpi.model.js');
const modelGlpi = require('../../../shared/model/glpi.model.js');
const ticketShared = require('./createTickets.service.js');
const { logInfo, logWarning } = require('../../../utils/logger.js');
// --------------------------------------
// Funções principais do serviço
// --------------------------------------
async function fetchNew() {
return repositoryHubsoft.getImplantacaoTickets();
}
async function saveHubGlpi(tickets) {
if (!tickets.length) return;
const ticketsFormatted = tickets.map(ticket =>
modelHubGlpi.mapHubsoftToHubglpi(ticket, 'IMPLANTACAO')
);
const inserted = await repositoryHubGlpi.insertTickets(ticketsFormatted);
if (inserted) {
await repositoryHubGlpi.insertSyncData(
ticketsFormatted.map(ticket => ticket.id_atendimento)
);
}
return inserted;
}
async function sendToGlpi(ticket) {
const ticketsResolved = await ticketShared.resolveEntityId(ticket);
if (ticketsResolved.entities_id === 0) {
logWarning(`Entidade não encontrada para o ticket id=${ticket.id_atendimento}.`);
}
formatGlpiPayload(ticketsResolved);
const payload = modelGlpi.mapHubGlpiToGlpi(ticketsResolved);
const glpiId = await repositoryGlpi.insertTicket(payload);
logInfo(`Ticket GLPI criado com ID=${glpiId} para o ticket id=${ticket.id_atendimento}.`);
await repositoryGlpi.insertGroupTicket(glpiId);
await repositoryHubGlpi.updateSyncDataCreated(ticket.id_atendimento, glpiId);
}
// --------------------------------------
// Formatar dados antes de enviar para o GLPI
// --------------------------------------
function formatGlpiPayload(ticket) {
const title = `IMPLANTAÇÃO - ${ticket.codigo_cliente}-${ticket.codigo_servico}-${ticket.cliente_nome} - ${ticket.servico_nome}`;
const description = formatDescription(ticket);
ticket.name = title;
ticket.content = description;
return;
}
// --------------------------------------
// Dicionário de Serviços
// --------------------------------------
const serviceDictionary = {
// ---------- LAN-TO-LAN ----------
"Lan-to-Lan 50 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "50 Mbps" },
"Lan-to-Lan 100 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "100 Mbps" },
"Lan-to-Lan 200 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "200 Mbps" },
"Lan-to-Lan 300 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "300 Mbps" },
"Lan-to-Lan 500 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "500 Mbps" },
"Lan-to-Lan 700 Mbps": { produto: "Lan-to-Lan", qtd: 1, descricao: "700 Mbps" },
"Lan-to-Lan": { produto: "Lan-to-Lan", qtd: 1, descricao: null },
// ---------- LINK DEDICADO ----------
"Link de Internet Dedicado 20 Mbps Full Duplex":
{ produto: "Link de Internet Dedicado", qtd: 1, descricao: "20 Mbps Full Duplex" },
"Link de Internet Dedicado 100 Mbps Full Duplex":
{ produto: "Link de Internet Dedicado", qtd: 1, descricao: "100 Mbps Full Duplex" },
"Link de Internet Dedicado 1Gbps Full Duplex":
{ produto: "Link de Internet Dedicado", qtd: 1, descricao: "1 Gbps Full Duplex" },
"Link de Internet Dedicado 2 Gbps Full Duplex":
{ produto: "Link de Internet Dedicado", qtd: 1, descricao: "2 Gbps Full Duplex" },
// Default genérico caso venha coisa nova
};
// --------------------------------------
// Tabela HTML da descrição
// --------------------------------------
const formatDescription = (ticket) => {
const documentoFormatado = formatDocument(ticket.cpf_cnpj, ticket.tipo_pessoa);
const docLabel = ticket.tipo_pessoa === "pf" ? "CPF" : "CNPJ";
const servico = resolveService(ticket.servico_nome);
return `
|
Dados Comercial
|
| Nº de Operação |
${ticket.protocolo_hub || "N/A"} |
| Gerente Responsável |
${ticket.usuario_que_abriu || "N/A"} |
| Código do Cliente |
${ticket.codigo_cliente} |
|
Dados Cliente
|
| Cliente |
${ticket.cliente_nome} |
| ${docLabel} |
${documentoFormatado} |
| Nome Contato |
${ticket.nome_razaosocial || "N/A"} |
| Email Contato |
${ticket.email || "N/A"} |
| Telefone Contato |
${ticket.telefone || "N/A"} |
| Endereço Instalação |
${ticket.endereco || "N/A"} |
|
Dados do Serviço Contratado
|
| Produto |
Quantidade |
Descrição |
| ${servico.produto} |
${servico.qtd} |
${servico.descricao || ""} |
|
|
Observações
|
| ${ticket.descricao_abertura || "N/A"} |
`;
};
// --------------------------------------
// Formatadores de Documento
// --------------------------------------
function formatCPF(cpf) {
cpf = cpf.replace(/\D/g, "");
return cpf.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, "$1.$2.$3-$4");
}
function formatCNPJ(cnpj) {
cnpj = cnpj.replace(/\D/g, "");
return cnpj.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, "$1.$2.$3/$4-$5");
}
function formatDocument(doc, tipo) {
if (!doc) return "N/A";
return tipo === "pf" ? formatCPF(doc) : formatCNPJ(doc);
}
// --------------------------------------
// Resolve Serviço
// --------------------------------------
function resolveService(servicoNome) {
return serviceDictionary[servicoNome] || {
produto: servicoNome,
qtd: 1,
descricao: null
};
}
// --------------------------------------
// Exportação
// --------------------------------------
module.exports = {
fetchNew,
saveHubGlpi,
sendToGlpi
};