120 lines
4.3 KiB
JavaScript
120 lines
4.3 KiB
JavaScript
|
|
// src/models/ticketSyncModel.js
|
||
|
|
const pool = require('../data/database');
|
||
|
|
const { logInfo, logError } = require('../utils/logger');
|
||
|
|
|
||
|
|
class TicketSyncModel {
|
||
|
|
|
||
|
|
// Cria um registro de sincronização
|
||
|
|
static async createSyncRecord(snTicketId, glpiTicketId = null) {
|
||
|
|
try {
|
||
|
|
const query = `
|
||
|
|
INSERT INTO ticket_sync (sn_ticket_id, glpi_ticket_id)
|
||
|
|
VALUES ($1, $2)
|
||
|
|
RETURNING *
|
||
|
|
`;
|
||
|
|
const result = await pool.query(query, [snTicketId, glpiTicketId]);
|
||
|
|
logInfo(`✅ Registro de sincronização criado para ticket SN: ${snTicketId}, GLPI: ${glpiTicketId || 'null'}`);
|
||
|
|
return result.rows[0];
|
||
|
|
} catch (error) {
|
||
|
|
logError(error, `❌ Erro ao criar registro de sincronização para ticket ${snTicketId}`);
|
||
|
|
throw error;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Atualiza o status de sincronização com o GLPI
|
||
|
|
static async updateGlpiSyncStatus(syncId, status, glpiTicketId = null) {
|
||
|
|
try {
|
||
|
|
const query = `
|
||
|
|
UPDATE ticket_sync
|
||
|
|
SET glpi_sync_status = $1,
|
||
|
|
glpi_ticket_id = COALESCE($2, glpi_ticket_id),
|
||
|
|
last_glpi_sync = NOW()
|
||
|
|
WHERE id = $3
|
||
|
|
RETURNING *
|
||
|
|
`;
|
||
|
|
const result = await pool.query(query, [status, glpiTicketId, syncId]);
|
||
|
|
logInfo(`✅ Status GLPI atualizado para: ${status}, sync ID: ${syncId}`);
|
||
|
|
return result.rows[0];
|
||
|
|
} catch (error) {
|
||
|
|
logError(error, `❌ Erro ao atualizar status GLPI para sync ${syncId}`);
|
||
|
|
throw error;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Atualiza o status de sincronização com o ServiceNow
|
||
|
|
static async updateSnSyncStatus(syncId, status) {
|
||
|
|
try {
|
||
|
|
const query = `
|
||
|
|
UPDATE ticket_sync
|
||
|
|
SET sn_sync_status = $1,
|
||
|
|
last_sn_sync = NOW()
|
||
|
|
WHERE id = $2
|
||
|
|
RETURNING *
|
||
|
|
`;
|
||
|
|
const result = await pool.query(query, [status, syncId]);
|
||
|
|
logInfo(`✅ Status SN atualizado para: ${status}, sync ID: ${syncId}`);
|
||
|
|
return result.rows[0];
|
||
|
|
} catch (error) {
|
||
|
|
logError(error, `❌ Erro ao atualizar status SN para sync ${syncId}`);
|
||
|
|
throw error;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Busca registro de sincronização por ticket SN
|
||
|
|
static async findBySnTicketId(snTicketId) {
|
||
|
|
try {
|
||
|
|
const query = `SELECT * FROM ticket_sync WHERE sn_ticket_id = $1`;
|
||
|
|
const result = await pool.query(query, [snTicketId]);
|
||
|
|
return result.rows[0];
|
||
|
|
} catch (error) {
|
||
|
|
logError(error, `❌ Erro ao buscar sync por SN ticket ID: ${snTicketId}`);
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Busca registro de sincronização por ticket GLPI
|
||
|
|
static async findByGlpiTicketId(glpiTicketId) {
|
||
|
|
try {
|
||
|
|
const query = `SELECT * FROM ticket_sync WHERE glpi_ticket_id = $1`;
|
||
|
|
const result = await pool.query(query, [glpiTicketId]);
|
||
|
|
return result.rows[0];
|
||
|
|
} catch (error) {
|
||
|
|
logError(error, `❌ Erro ao buscar sync por GLPI ticket ID: ${glpiTicketId}`);
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Busca todos os registros de sincronização com status pendente para GLPI
|
||
|
|
static async findPendingGlpiSync() {
|
||
|
|
try {
|
||
|
|
const query = `
|
||
|
|
SELECT * FROM ticket_sync
|
||
|
|
WHERE glpi_sync_status = 'pending'
|
||
|
|
ORDER BY created_at
|
||
|
|
`;
|
||
|
|
const result = await pool.query(query);
|
||
|
|
return result.rows;
|
||
|
|
} catch (error) {
|
||
|
|
logError(error, '❌ Erro ao buscar sincronizações pendentes para GLPI');
|
||
|
|
return [];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Busca todos os registros de sincronização com status pendente para ServiceNow
|
||
|
|
static async findPendingSnSync() {
|
||
|
|
try {
|
||
|
|
const query = `
|
||
|
|
SELECT * FROM ticket_sync
|
||
|
|
WHERE sn_sync_status = 'pending'
|
||
|
|
ORDER BY created_at
|
||
|
|
`;
|
||
|
|
const result = await pool.query(query);
|
||
|
|
return result.rows;
|
||
|
|
} catch (error) {
|
||
|
|
logError(error, '❌ Erro ao buscar sincronizações pendentes para ServiceNow');
|
||
|
|
return [];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = TicketSyncModel;
|