2025-08-30 19:04:35 -03:00
|
|
|
// src/services/glpiService.js
|
2025-09-15 20:55:19 -03:00
|
|
|
const TicketSnModel = require('../models/ticketSnModel');
|
|
|
|
|
const TicketGlpiModel = require('../models/ticketGlpiModel');
|
2025-09-17 20:56:32 -03:00
|
|
|
const TicketSyncModel = require('../models/ticketSyncModel');
|
2025-09-11 20:57:43 -03:00
|
|
|
const { logInfo, logError } = require('../utils/logger');
|
2025-08-30 19:04:35 -03:00
|
|
|
|
2025-09-15 20:55:19 -03:00
|
|
|
// Método principal que o controller vai chamar
|
|
|
|
|
const syncTicketsToGlpi = async () => {
|
|
|
|
|
try {
|
|
|
|
|
logInfo('🔄 Iniciando sincronização para GLPI...');
|
2025-09-17 20:56:32 -03:00
|
|
|
// 1. Buscar tickets pendentes
|
2025-09-15 20:55:19 -03:00
|
|
|
const pendingTickets = await TicketSnModel.getPendingTickets();
|
|
|
|
|
|
|
|
|
|
if (pendingTickets.length === 0) {
|
|
|
|
|
logInfo('✅ Nenhum ticket pendente para sincronizar');
|
|
|
|
|
return;
|
2025-09-11 20:57:43 -03:00
|
|
|
}
|
2025-09-15 20:55:19 -03:00
|
|
|
|
|
|
|
|
logInfo(`📋 Encontrados ${pendingTickets.length} tickets para sincronizar`);
|
2025-10-13 06:06:52 -03:00
|
|
|
|
2025-09-15 20:55:19 -03:00
|
|
|
// 2. Processar cada ticket
|
|
|
|
|
for (const ticket of pendingTickets) {
|
|
|
|
|
await processSingleTicket(ticket);
|
2025-09-11 20:57:43 -03:00
|
|
|
}
|
2025-09-15 20:55:19 -03:00
|
|
|
|
|
|
|
|
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
|
|
|
}
|
2025-09-15 20:55:19 -03:00
|
|
|
};
|
2025-09-11 20:57:43 -03:00
|
|
|
|
2025-09-15 20:55:19 -03:00
|
|
|
// Processar um ticket individual
|
|
|
|
|
const processSingleTicket = async (ticket) => {
|
2025-09-17 20:56:32 -03:00
|
|
|
|
2025-09-15 20:55:19 -03:00
|
|
|
try {
|
|
|
|
|
logInfo(`🔍 Processando ticket: ${ticket.ticket_number}`);
|
|
|
|
|
|
2025-10-17 16:58:14 -03:00
|
|
|
// 1. Verifica se o ticket já possui um ID do GLPI no nosso banco de sincronização.
|
|
|
|
|
if (ticket.glpi_ticket_id) {
|
|
|
|
|
logInfo(`✅ Ticket ${ticket.ticket_number} já possui GLPI ID (${ticket.glpi_ticket_id}) registrado. Apenas atualizando status.`);
|
|
|
|
|
await TicketSyncModel.updateStatus(ticket.id, 'synced', 'synced');
|
|
|
|
|
return;
|
|
|
|
|
}
|
2025-10-13 06:06:52 -03:00
|
|
|
|
2025-10-17 16:58:14 -03:00
|
|
|
// 2. Se não tem ID local, verifica se o ticket existe no GLPI (buscando pelo número).
|
|
|
|
|
const existingTicket = await TicketGlpiModel.ticketExists(ticket.ticket_number);
|
2025-10-13 06:06:52 -03:00
|
|
|
|
2025-10-17 16:58:14 -03:00
|
|
|
if (existingTicket) {
|
|
|
|
|
logInfo(`✅ Ticket ${ticket.ticket_number} encontrado no GLPI. Atualizando registro local com o ID: ${existingTicket}`);
|
|
|
|
|
// Atualiza nosso registro de sincronização com o ID do GLPI encontrado.
|
|
|
|
|
await TicketSyncModel.updateStatusAndGlpiTicket(ticket.id, 'synced', 'synced', existingTicket);
|
|
|
|
|
logInfo(`✅ Ticket ${ticket.ticket_number} já existe no GLPI! GLPI ID: ${existingTicket}`);
|
2025-10-13 06:06:52 -03:00
|
|
|
return;
|
2025-09-15 20:55:19 -03:00
|
|
|
}
|
2025-09-17 20:56:32 -03:00
|
|
|
|
2025-10-17 16:58:14 -03:00
|
|
|
// 3. Converter dados para formato GLPI
|
2025-09-15 20:55:19 -03:00
|
|
|
const glpiData = {
|
|
|
|
|
ticket_number: ticket.ticket_number,
|
|
|
|
|
short_description: ticket.short_description,
|
|
|
|
|
description: ticket.description,
|
2025-09-17 20:56:32 -03:00
|
|
|
caller_id: ticket.caller_id,
|
2025-09-15 20:55:19 -03:00
|
|
|
caller_email: ticket.caller_email,
|
|
|
|
|
caller_phone: ticket.telefone,
|
|
|
|
|
caller_ramal: ticket.ramal,
|
2025-09-17 20:56:32 -03:00
|
|
|
type: ticket.tipo,
|
|
|
|
|
state: ticket.status,
|
|
|
|
|
priority: '3',
|
|
|
|
|
location_id: ticket.location_id,
|
2025-09-15 20:55:19 -03:00
|
|
|
location_name: ticket.location_name,
|
|
|
|
|
opened_at: ticket.opened_at,
|
|
|
|
|
updated_at: ticket.updated_at
|
|
|
|
|
};
|
|
|
|
|
|
2025-09-17 20:56:32 -03:00
|
|
|
// 3. Inserir no GLPI
|
2025-09-15 20:55:19 -03:00
|
|
|
const glpiTicketId = await TicketGlpiModel.createTicket(glpiData);
|
|
|
|
|
|
2025-10-17 16:58:14 -03:00
|
|
|
// 4. Atualizar registro de sincronização
|
|
|
|
|
await TicketSyncModel.updateStatus(ticket.id, 'synced', 'synced');
|
2025-09-15 20:55:19 -03:00
|
|
|
|
|
|
|
|
logInfo(`✅ Ticket ${ticket.ticket_number} sincronizado! GLPI ID: ${glpiTicketId}`);
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logError(error, `❌ Erro no ticket ${ticket.ticket_number}`);
|
2025-09-17 20:56:32 -03:00
|
|
|
|
|
|
|
|
// Se temos um registro de sync, atualizar o status para error
|
2025-10-17 16:58:14 -03:00
|
|
|
try {
|
|
|
|
|
await TicketSyncModel.updateStatus(idSyncRecord.id, 'error', 'synced');
|
|
|
|
|
} catch (innerError) {
|
2025-09-17 20:56:32 -03:00
|
|
|
logError(innerError, `❌ Erro ao registrar falha de sincronização para ticket ${ticket.id}`);
|
|
|
|
|
}
|
2025-09-15 20:55:19 -03:00
|
|
|
}
|
2025-08-30 19:04:35 -03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
2025-09-15 20:55:19 -03:00
|
|
|
syncTicketsToGlpi
|
2025-08-30 19:04:35 -03:00
|
|
|
};
|