// controller/processController.js
const hubsoftModel = require('../model/hubsoftModel.js');
const hubglpiModel = require('../model/hubglpiModel.js');
const glpiModel = require('../model/glpiModel.js');
const { logError, logInfo } = require('../utils/logger');
// ================================================================================
// Constantes e Configurações
// ================================================================================
const statusAtendimentoHubGlpi = {
1: 'Pendente',
2: 'Em atendimento',
3: 'Resolvido',
31: 'Pendente',
32: 'Pendente',
33: 'Novo'
};
const statusAtendimentoGLPI = {
'Novo': 1,
'Pendente': 4,
'Em atendimento': 2,
'Resolvido': 5
};
// ================================================================================
// Funções Utilitárias
// ================================================================================
// Formata a descrição do ticket em HTML
const formatDescription = (ticketData) => {
let htmlDescription = `
| Campo |
Valor |
| Nome: |
${ticketData.cliente_nome} |
| Codigo: |
${ticketData.codigo_cliente} |
| Serviço: |
${ticketData.servico_nome} |
| Ticket Mundiale |
${ticketData.ticket_mundiale} |
| Protocolo Hub: |
${ticketData.protocolo_hub || 'N/A'} |
`;
return htmlDescription;
};
// Formata os dados do ticket para o GLPI
const formatTicketDataForGlpi = async (ticketData) => {
const formattedData = {
...ticketData,
status_atendimento: statusAtendimentoGLPI[ticketData.status_atendimento] || 1,
date_mod: new Date(),
user_id_recipient: 971,
descricao_abertura: formatDescription(ticketData),
urgency: 3,
impact: 3,
priority: 3,
type: 1,
itilcategories_id: 1,
date_creation: new Date(),
// entidades_id: 0 //await glpiModel.selectEntityId() //TODO: Implementar a busca da entidade
};
return formattedData;
};
// ================================================================================
// Funções de Integração
// ================================================================================
const createGlpiTicket = async (ticketData) => {
try {
const formattedTicketData = await formatTicketDataForGlpi(ticketData);
const glpiTicket = await glpiModel.insertTicket(formattedTicketData);
logInfo(`Ticket criado no GLPI: ${glpiTicket.insertId} `);
//Atualiza que ticket foi criado
ticketData.status_sync = 'created_glpi';
ticketData.glpi_ticket_id = glpiTicket.insertId;
ticketData.created_at = new Date();
ticketData.updated_at = new Date();
const updateSyncData = await hubglpiModel.update_syncData(ticketData);
logInfo(`Sync Data atualizado com o ID do ticket do GLPI: ${updateSyncData.glpi_ticket_id}`);
try {
//Insetingo ao grupo Operacao NOC
await glpiModel.insertGroupTickets(glpiTicket.insertId);
logInfo(`Atribuido grupo Operação NOC ao ticket no GLPI: ${glpiTicket.insertId} `)
} catch (error) {
const updateSyncDataError = await hubglpiModel.update_syncaDataError(error.message, ticketData.id_atendimento)
logError(`Erro ao criar ticket no GLPI. Sync Data atualizado com a mensagem de erro: ${error}`);
}
} catch (error) {
const updateSyncDataError = await hubglpiModel.update_syncaDataError(error.message, ticketData.id_atendimento)
logError(`Erro ao criar ticket no GLPI. Sync Data atualizado com a mensagem de erro: ${error}`);
}
};
const processTicketFromHubSoft = async (atendimento) => {
const ticketData = {
id_atendimento: atendimento.id_atendimento,
id_atendimento_status: atendimento.id_atendimento_status,
codigo_servico: String(atendimento.id_cliente_servico || ''), // Garante que seja uma string
protocolo_hub: atendimento.protocolo,
servico_nome: atendimento.descricao,
descricao_abertura: atendimento.descricao_abertura,
data_cadastro: atendimento.data_cadastro,
cliente_nome: atendimento.nome_contato,
codigo_cliente: atendimento.codigo_cliente,
descricao: atendimento.descricao
};
ticketData.status_atendimento = statusAtendimentoHubGlpi[ticketData.id_atendimento_status] || ticketData.id_atendimento_status;
ticketData.descricao_abertura = ticketData.descricao_abertura.replace(/[^0-9]/g, '');
ticketData.ticket_mundiale = parseInt(ticketData.descricao_abertura) || null;
return ticketData;
};
const saveTicketToHubGlpi = async (ticketData) => {
try {
const insertedTicket = await hubglpiModel.insertTicket(ticketData);
logInfo(`Ticket inserido/atualizado na tabela hubsoft_tickets: ${insertedTicket.protocolo_hub}`);
await hubglpiModel.insertSyncData(ticketData.id_atendimento);
logInfo('Dados inseridos/atualizados na tabela sync_data');
return insertedTicket;
} catch (error) {
logError(`Erro ao salvar ticket no hubglpi: ${error}`);
throw error; // Rejeita a promise para que o erro seja tratado no nível superior
}
};
const processAtendimento = async (ticketData) => {
try {
const glpiTicketId = await hubglpiModel.getGlpiTicketIdByAtendimentoId(ticketData.id_atendimento);
if (glpiTicketId) {
logInfo(`Ticket já inserido no GLPI para id_atendimento ${ticketData.id_atendimento}, pulando criação.`);
ticketData.status_sync = 'created_glpi';
ticketData.glpi_ticket_id = glpiTicketId;
await hubglpiModel.update_syncData(ticketData);
return;
}
const titulo = `Mundiale - Protocolo: ${ticketData.ticket_mundiale} - ${ticketData.cliente_nome}`;
ticketData.titulo = titulo;
const selectedEntityCodServico = await glpiModel.selectEntityId(ticketData.codigo_servico);
if (!selectedEntityCodServico) {
const selectedEntityCodCliente = await glpiModel.selectEntityId(ticketData.codigo_cliente);
ticketData.entidades_id = selectedEntityCodCliente;
} else if (selectedEntityCodServico) {
ticketData.entidades_id = selectedEntityCodServico;
} else {
ticketData.entidades_id = 0;
}
await createGlpiTicket(ticketData);
} catch (error) {
console.error(`Erro ao processar atendimento ${ticketData.id_atendimento}:`, error);
}
};
// ================================================================================
// Função Principal (com opção de pular a etapa do HubSoft)
// ================================================================================
const processaAtendimentos = async (skipHubSoft = false) => {
try {
let atendimentosDB = [];
if (!skipHubSoft) {
// Esta parte depende da VPN
logInfo('Buscando atendimentos do HubSoft...');
atendimentosDB = await hubsoftModel.getAtendimentosFromDB();
logInfo(`Total de atendimentos obtidos do HubSoft: ${atendimentosDB.length}`);
for (const atendimento of atendimentosDB) {
try {
// Processa o ticket do HubSoft
const ticketData = await processTicketFromHubSoft(atendimento);
// Salva no banco intermediário (hubglpi)
await saveTicketToHubGlpi(ticketData);
}
catch (error) {
logError(`Erro ao processar atendimento ${atendimento.id_atendimento}:`, error);
}
}
} else {
logInfo('Pulando a busca de atendimentos do HubSoft (skipHubSoft = true)');
}
// Coletando atendimentos do banco intermediário (hubglpi)
atendimentosDB = await hubglpiModel.getTicketDataPending();
for (const atendimento of atendimentosDB) {
try {
// Processa o atendimento para o GLPI
await processAtendimento(atendimento);
} catch (error) {
logError(`Erro ao processar atendimento ${atendimento.id_atendimento}:, ${error}`);
}
}
} catch (error) {
logError(`Erro ao processar atendimentos: ${error}`);
}
};
module.exports = {
processaAtendimentos,
processAtendimento,
formatTicketDataForGlpi,
formatDescription
};