// 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 }; const categoriaGLPI = { 'Lan-to-Lan 100 Mbps' : 5708 , 'Link de Internet Dedicado 2 Gbps Full Duplex' : 5707 , 'Lan-to-Lan' : 5707 , 'Lan-to-Lan 500 Mbps' : 5708 , 'Link de internet - Banda Larga' : 5708 , 'Lan-to-Lan 700 Mbps' : 5708 , 'Link de Internet Dedicado 20 Mbps Full Duplex' : 5707 , 'Lan-to-Lan 300 Mbps' : 5708 , 'Link de Internet Dedicado 5Gbs + Burst 5Gbs Burs Full Duplex Anti DDOS' : 5707 , 'Link de Internet - Banda Larga - 500 Mbps' : 5708 , 'Link de Internet Dedicado 600Mbps Full Duplex' : 5707 , 'Link de Internet - Banda Larga - 1Gbps' : 5707 , 'Link de Internet Dedicado 1Gbps Full Duplex' : 5707 , 'Link de Internet Dedicado Full Duplex' : 5707 , 'Fibra Apagada' : 5706 , 'Link de Internet - Banda Larga - 100 Mbps' : 5708 , 'Canal de Voz IP' : 5715 , 'Link de Internet Dedicado 500Mbps Full Duplex' : 5707 , 'Lan-to-Lan 200 Mbps' : 5708 , 'Lan-to-Lan 50 Mbps' : 5708 , 'Linha IP - Limitado' : 5715 , 'PABX IP Cloud' : 5717 , 'Link de Internet Dedicado 100 Mbps Full Duplex' : 5707 , 'Link de Internet Dedicado 200 Mbps Full Duplex' : 5707 , 'Link de Internet - Banda Larga - 200 Mbps' : 5708 , 'Link de Internet - Banda Larga - 300 Mbps' : 5708 , 'Link de Internet - Banda Larga - 700 Mbps' : 5708 , 'Link de Internet Dedicado 300 Mbps Full Duplex' : 5707 , 'Link de Internet Dedicado 50Mbps Full Duplex' : 5707 , 'Link de Internet Dedicado 10 Mbps Full Duplex' : 5707 , 'Link de Internet Dedicado 30 Mbps Full Duplex' : 5707 , 'PABX IP - Até 30 ramais com telefones IPs (CAOA ESTADO DE SP)' : 5717 , 'Lan-to-Lan 1GB' : 5707 , 'PABX IP - Até 30 ramais com telefones IPs (CAOA OUTROS ESTADOS)' : 5717 , 'Link de Internet Dedicado 700MB Full Duplex' : 5707 , 'Link de Internet Dedicado - Temporário' : 5707 } // ================================================================================ // 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: categoriaGLPI[ticketData.servico_nome] || 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 };