snglpi/src/services/glpiTicketService.js

108 lines
3.8 KiB
JavaScript
Raw Normal View History

2025-08-30 19:04:35 -03:00
// src/services/glpiService.js
const TicketSnModel = require('../models/ticketSnModel');
const TicketGlpiModel = require('../models/ticketGlpiModel');
const TicketSyncModel = require('../models/ticketSyncModel');
const { logInfo, logError } = require('../utils/logger');
2025-08-30 19:04:35 -03:00
// Método principal que o controller vai chamar
const syncTicketsToGlpi = async () => {
try {
logInfo('🔄 Iniciando sincronização para GLPI...');
// 1. Buscar tickets pendentes
const pendingTickets = await TicketSnModel.getPendingTickets();
if (pendingTickets.length === 0) {
logInfo('✅ Nenhum ticket pendente para sincronizar');
return;
}
logInfo(`📋 Encontrados ${pendingTickets.length} tickets para sincronizar`);
2025-10-13 06:06:52 -03:00
// 2. Processar cada ticket
for (const ticket of pendingTickets) {
await processSingleTicket(ticket);
}
logInfo('🎉 Sincronização com GLPI concluída!');
} catch (error) {
logError(error, '❌ Erro na sincronização GLPI');
throw error;
2025-08-30 19:04:35 -03:00
}
};
// Processar um ticket individual
const processSingleTicket = async (ticket) => {
try {
logInfo(`🔍 Processando ticket: ${ticket.ticket_number}`);
2025-10-13 06:06:52 -03:00
// 1. Verificar se já existe no GLPI
const existingTicket = await TicketGlpiModel.ticketExists(ticket.ticket_number);
2025-10-13 06:06:52 -03:00
const idSyncRecord = await TicketSyncModel.getByTicketNumber(ticket.ticket_number);
if (existingTicket && idSyncRecord) {
await TicketSyncModel.updateGlpiSyncStatus(idSyncRecord.id, 'synced', existingTicket);
await TicketSyncModel.updateSnSyncStatus(idSyncRecord.id, 'synced');
return;
}else if (existingTicket && !idSyncRecord) {
await TicketSyncModel.createSyncRecord({
sn_ticket_id: ticket.id,
glpi_ticket_id: existingTicket,
sn_sync_status: 'synced',
glpi_sync_status: 'synced',
last_glpi_sync: new Date()
});
return;
2025-10-13 06:06:52 -03:00
}
2025-10-13 06:06:52 -03:00
// 2. Converter dados para formato GLPI
const glpiData = {
ticket_number: ticket.ticket_number,
short_description: ticket.short_description,
description: ticket.description,
caller_id: ticket.caller_id,
caller_email: ticket.caller_email,
caller_phone: ticket.telefone,
caller_ramal: ticket.ramal,
type: ticket.tipo,
state: ticket.status,
priority: '3',
location_id: ticket.location_id,
location_name: ticket.location_name,
opened_at: ticket.opened_at,
updated_at: ticket.updated_at
};
// 3. Inserir no GLPI
const glpiTicketId = await TicketGlpiModel.createTicket(glpiData);
// 4. Criar registro de sincronização
2025-10-13 06:06:52 -03:00
await TicketSyncModel.updateGlpiSyncStatus(idSyncRecord.id, 'synced', glpiTicketId);
logInfo(`✅ Ticket ${ticket.ticket_number} sincronizado! GLPI ID: ${glpiTicketId}`);
} catch (error) {
logError(error, `❌ Erro no ticket ${ticket.ticket_number}`);
// Se temos um registro de sync, atualizar o status para error
if (syncRecord) {
2025-10-13 06:06:52 -03:00
await TicketSyncModel.updateGlpiSyncStatus(idSyncRecord.id, 'error');
} else {
// Se não temos um registro, criar um com status error
try {
syncRecord = await TicketSyncModel.createSyncRecord(ticket.id);
2025-10-13 06:06:52 -03:00
await TicketSyncModel.updateGlpiSyncStatus(idSyncRecord.id, 'error');
} catch (innerError) {
logError(innerError, `❌ Erro ao registrar falha de sincronização para ticket ${ticket.id}`);
}
}
}
2025-08-30 19:04:35 -03:00
};
module.exports = {
syncTicketsToGlpi
2025-08-30 19:04:35 -03:00
};