// src/services/glpiCommentService.js const TicketSnModel = require('../models/ticketSnModel'); const TicketGlpiModel = require('../models/ticketGlpiModel'); const TicketSyncModel = require('../models/ticketSyncModel'); const TicketUpdateModel = require('../models/ticketUpdateModel'); const { logInfo, logError } = require('../utils/logger'); const { existingCommentInServiceNow, syncCommentToServiceNow } = require('./servicenowService'); // Sincroniza comentários do GLPI para o Banco de Dados local const syncCommentsGlpi = async () => { try { logInfo('🔄 Iniciando sincronização de comments do GLPI para o Service Now...'); const effectiveTickets = await TicketSyncModel.getTicketsToSync(); logInfo(`🔍 ${effectiveTickets.length} tickets encontrados para sincronização de comentários`, { step: 1 }); for (const ticket of effectiveTickets) { logInfo(`Buscando comentários para o ticket GLPI ID: ${ticket.glpi_ticket_id}`); const comments = await TicketGlpiModel.getFollowupsByItemId(ticket.glpi_ticket_id); logInfo(`📝 ${comments.length} comentários encontrados para o ticket GLPI ID: ${ticket.glpi_ticket_id}`, { step: 2 }); for (const comment of comments) { const existingComment = await TicketUpdateModel.getCommentSync(ticket.glpi_ticket_id, comment.id); const commentExistsInSN = await existingCommentInServiceNow( ticket.sn_ticket_id, comment.content ) if (existingComment && commentExistsInSN) { logInfo(`Comentário ID ${comment.id} já sincronizado no banco de dados e no ServiceNow`, { step: 3 }); continue; } if (!existingComment && commentExistsInSN) { // Só insere no banco, pois já está no ServiceNow const sync_id = await TicketSyncModel.getIdSyncByGlpiId(ticket.glpi_ticket_id); const commentData = { ticket_sync_id: sync_id, source_system: 'glpi', content: comment.content, created_at: new Date(comment.date_creation), updated_at: new Date(comment.date_mod), source_id: comment.id, destiny_id: commentExistsInSN.destiny_id }; const insertResult = await TicketUpdateModel.insert(commentData); if (insertResult.success) { logInfo(`✅ Comentário ID ${comment.id} inserido no banco! Novo ID: ${insertResult.newId}`, { step: 4 }); } else { logError(`❌ Erro ao inserir comentário ID ${comment.id} no banco: ${insertResult.error}`, { step: 4 }); } continue; } if (existingComment && !commentExistsInSN) { logInfo(`Comentário ID ${comment.id} já existe no banco, mas não no ServiceNow. Sincronizando...`, { step: 3 }); // Só sincroniza no ServiceNow const snCommentId = await syncCommentToServiceNow(ticket.sn_ticket_id, comment.content); // Se quiser, pode atualizar o registro no banco com o id do ServiceNow aqui logInfo(`✅ Comentário ID ${comment.id} sincronizado no ServiceNow!`, { step: 4 }); const updateData = await TicketUpdateModel.updateDestinyId(comment.id, snCommentId); if (updateData && updateData.success) { logInfo(`✅ ID do comentário de destino atualizado no banco: ${snCommentId}`, { step: 4 }); } continue; } // Se não existe em nenhum dos dois, sincroniza nos dois normalmente const snCommentId = await syncCommentToServiceNow(ticket.sn_ticket_id, comment); const sync_id = await TicketSyncModel.getIdSyncByGlpiId(ticket.glpi_ticket_id); const commentData = { ticket_sync_id: sync_id, source_system: 'glpi', content: comment.content, created_at: new Date(comment.date_creation), updated_at: new Date(comment.date_mod), source_id: comment.id, destiny_id: snCommentId }; const insertResult = await TicketUpdateModel.insert(commentData); if (insertResult.success) { logInfo(`✅ Comentário ID ${comment.id} sincronizado no banco e no ServiceNow! Novo ID: ${insertResult.newId}`, { step: 4 }); } else { logError(`❌ Erro ao sincronizar comentário ID ${comment.id}: ${insertResult.error}`, { step: 4 }); } const hasError = !insertResult.success; const snStatus = 'pending'; const glpiStatus = hasError ? 'Error' :'updated'; await TicketSyncModel.updateStatus(ticket.id, glpiStatus, snStatus); logInfo(`Status de sincronização para o ticket ID ${ticket.id} atualizado para GLPI: '${glpiStatus}', SN: '${snStatus}'.`); } } logInfo('✅ Sincronização de comentários do GLPI -> ServiceNow concluída!'); }catch (error) { logError(error, 'GLPI Tickets'); } } /** * @module glpiCommentService * @description Este módulo fornece serviços para sincronizar comentários do GLPI para o banco de dados local. * A função syncCommentsGlpi busca tickets que foram criados com sucesso e sincroniza seus comentários, * garantindo que apenas novos comentários sejam inseridos no banco de dados. * Utiliza os modelos TicketSnModel, TicketGlpiModel, TicketSyncModel e TicketUpdateModel para interagir com o banco de dados. * Atualiza o status de sincronização após cada comentário processado. * Inclui logging detalhado para monitorar o progresso e identificar erros durante o processo de sincronização. */ module.exports = { syncCommentsGlpi };