// 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) => { const { cliente_nome, codigo_cliente, servico_nome, ticket_mundiale, protocolo_hub, description } = ticketData; const tableRows = ` Nome do Cliente:${cliente_nome} Codigo Cliente:${codigo_cliente} Serviço:${servico_nome} Ticket Number (Mundiale):${ticket_mundiale || 'N/A'} Protocolo Hub:${protocolo_hub || 'N/A'} `; const htmlDescription = ` ${tableRows}
Campo Valor

Descrição:
${description || 'N/A'} `; console.log(htmlDescription); return htmlDescription; }; // Gera o entity_Name baseado nos campos do ticket const generateEntityName = (ticketData) => { const codigoClienteParts = (ticketData.codigo_cliente || '').split('-'); const codigoServicoFirstPart = (ticketData.codigo_servico || '').split('-')[0]?.trim() || ''; const clienteNome = ticketData.cliente_nome || ''; return [...codigoClienteParts, codigoServicoFirstPart, clienteNome].join(''); }; // 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: toString(formatDescription(ticketData)), urgency: 3, impact: 3, priority: 3, type: 1, itilcategories_id: 1, date_creation: new Date(), entidades_id: 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); console.log('Dados do ticket formatados para GLPI:', formattedTicketData); // const glpiTicket = await glpiModel.insertTicket(formattedTicketData); // console.log('Ticket criado no GLPI:', glpiTicket); // const updateSyncData = await hubglpiModel.update_syncData(glpiTicket.id, ticketData.id_atendimento); // logInfo('Sync Data atualizado com o ID do ticket do GLPI:', updateSyncData); } catch (error) { console.error('Erro ao criar ticket no GLPI:', 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: ', /*updateSyncDataError*/ 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; console.log(typeof ticketData.descricao_abertura) console.log(ticketData.descricao_abertura) 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); console.log('Ticket inserido/atualizado na tabela hubsoft_tickets:', insertedTicket); const insertSyncData = await hubglpiModel.insertSyncData(ticketData.id_atendimento); console.log('Dados inseridos/atualizados na tabela sync_data:', insertSyncData); return insertedTicket; } catch (error) { console.error('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 { await createGlpiTicket(ticketData); } catch (error) { console.error(`Erro ao processar atendimento ${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 console.log('Buscando atendimentos do HubSoft...'); atendimentosDB = await hubsoftModel.getAtendimentosFromDB(); console.log(`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) { console.error(`Erro ao processar atendimento ${atendimento.id_atendimento}:`, error); } } } else { console.log('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 console.log(atendimento.id_atendimento) console.log(atendimento) await processAtendimento(atendimento); } catch (error) { console.error(`Erro ao processar atendimento ${atendimento.id_atendimento}:`, error); } } } catch (error) { console.error('Erro ao processar atendimentos:', error); } }; module.exports = { processaAtendimentos, processAtendimento, formatTicketDataForGlpi, formatDescription };