2025-09-23 21:01:01 -03:00
|
|
|
// src/services/glpiCommentService.js
|
|
|
|
|
const TicketSnModel = require('../models/ticketSnModel');
|
|
|
|
|
const TicketGlpiModel = require('../models/ticketGlpiModel');
|
|
|
|
|
const TicketSyncModel = require('../models/ticketSyncModel');
|
2025-09-24 20:34:34 -03:00
|
|
|
const TicketUpdateModel = require('../models/ticketUpdateModel');
|
2025-09-23 21:01:01 -03:00
|
|
|
const { logInfo, logError } = require('../utils/logger');
|
2025-09-25 15:59:52 -03:00
|
|
|
const { getTicketSysId, createCommentInServiceNow } = require('./servicenowService');
|
2025-09-23 21:01:01 -03:00
|
|
|
|
|
|
|
|
|
2025-09-24 20:34:34 -03:00
|
|
|
// Sincroniza comentários do GLPI para o Banco de Dados local
|
2025-09-23 21:01:01 -03:00
|
|
|
const syncCommentsGlpi = async () => {
|
|
|
|
|
try {
|
2025-09-25 15:59:52 -03:00
|
|
|
|
|
|
|
|
// Função interna para sincronizar comentário no ServiceNow
|
|
|
|
|
const syncCommentToServiceNow = async (ticketNumber, comment) => {
|
|
|
|
|
const snSysId = await getTicketSysId(ticketNumber);
|
|
|
|
|
if (!snSysId) {
|
|
|
|
|
logError(`❌ sys_id do ServiceNow não encontrado para o ticket SN Ticket: ${ticketNumber}`);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
return await createCommentInServiceNow(snSysId, comment.content);
|
|
|
|
|
};
|
2025-09-24 20:34:34 -03:00
|
|
|
|
2025-09-23 21:01:01 -03:00
|
|
|
logInfo('🔄 Iniciando sincronização de comments do GLPI para o Service Now iniciada...');
|
2025-09-24 20:34:34 -03:00
|
|
|
const effectiveTickets = await TicketSyncModel.getTicketsToSync();
|
2025-09-23 21:01:01 -03:00
|
|
|
logInfo(`🔍 ${effectiveTickets.length} tickets encontrados para sincronização de comentários`, { step: 1 });
|
2025-09-24 20:34:34 -03:00
|
|
|
|
2025-09-23 21:01:01 -03:00
|
|
|
for (const ticket of effectiveTickets) {
|
|
|
|
|
|
2025-09-24 20:34:34 -03:00
|
|
|
logInfo(`Buscando comentários para o ticket GLPI ID: ${ticket.glpi_ticket_id}`);
|
2025-09-23 21:01:01 -03:00
|
|
|
const comments = await TicketGlpiModel.getFollowupsByItemId(ticket.glpi_ticket_id);
|
2025-09-24 20:34:34 -03:00
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
if (existingComment) {
|
|
|
|
|
logInfo(`Comentário ID ${comment.id} já sincronizado, pulando...`, { step: 3 });
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-25 15:59:52 -03:00
|
|
|
const snCommentId = await syncCommentToServiceNow(ticket.sn_ticket_id, comment);
|
|
|
|
|
|
2025-09-24 20:34:34 -03:00
|
|
|
const sync_id = await TicketSyncModel.getIdSyncByGlpiId(ticket.glpi_ticket_id);
|
2025-09-23 21:01:01 -03:00
|
|
|
|
2025-09-24 20:34:34 -03:00
|
|
|
const commentData = {
|
|
|
|
|
ticket_sync_id: sync_id,
|
2025-09-25 15:59:52 -03:00
|
|
|
source_system: 'glpi',
|
2025-09-24 20:34:34 -03:00
|
|
|
content: comment.content,
|
|
|
|
|
created_at: new Date(comment.date_creation),
|
|
|
|
|
updated_at: new Date(comment.date_mod),
|
|
|
|
|
source_id: comment.id,
|
2025-09-30 15:23:20 -03:00
|
|
|
destiny_id: snCommentId
|
2025-09-24 20:34:34 -03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const insertResult = await TicketUpdateModel.insert(commentData);
|
|
|
|
|
if (insertResult.success) {
|
|
|
|
|
logInfo(`✅ Comentário ID ${comment.id} sincronizado com sucesso! 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}'.`);
|
|
|
|
|
}
|
2025-09-23 21:01:01 -03:00
|
|
|
}
|
|
|
|
|
}catch (error) {
|
|
|
|
|
logError(error, 'GLPI Tickets');
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-09-24 20:34:34 -03:00
|
|
|
|
2025-09-25 15:59:52 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-09-24 20:34:34 -03:00
|
|
|
/**
|
|
|
|
|
* @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.
|
|
|
|
|
*/
|
2025-09-23 21:01:01 -03:00
|
|
|
module.exports = {
|
|
|
|
|
syncCommentsGlpi
|
2025-09-24 20:34:34 -03:00
|
|
|
};
|
|
|
|
|
|