Files
help_desk/config/tareasHubService.js
T

140 lines
4.8 KiB
JavaScript

/**
* tareasHubService.js
* Servicio de integración con el sistema de Tareas y Gestión de Campo (FSM) de Telcotronics.
* Conecta con https://tareas.telcotronics.com/api/external
*/
const HUB_API_URL = process.env.HUB_API_URL || 'https://tareas.telcotronics.com/api/external';
const HUB_API_KEY = process.env.HUB_API_KEY || 'sigma_crm_test_key_123';
class TareasHubService {
/**
* Obtiene el listado de técnicos/usuarios disponibles en tareas.telcotronics.com
*/
static async obtenerTecnicos() {
try {
const url = `${HUB_API_URL}/users/list`;
const res = await fetch(url, {
method: 'GET',
headers: {
'Accept': 'application/json',
'x-api-key': HUB_API_KEY
}
});
if (!res.ok) {
throw new Error(`HTTP ${res.status}: Fallo al consultar técnicos en Hub`);
}
const data = await res.json();
return data.usuarios || [];
} catch (error) {
console.error('[TareasHubService.obtenerTecnicos]:', error.message);
return [];
}
}
/**
* Programa una visita técnica / tarea operativa con trazabilidad de campo (FSM)
*/
static async crearVisita({
ticketId,
titulo,
descripcion,
emailTecnico,
fechaVisita = null,
fechaFin = null,
ubicacion = '',
coordenadas = null,
referencia = '',
prioridad = 'Media',
checklist = []
}) {
try {
const url = `${HUB_API_URL}/tareas`;
let lat = null;
let lng = null;
if (coordenadas && typeof coordenadas === 'string' && coordenadas.includes(',')) {
const parts = coordenadas.split(',');
lat = parseFloat(parts[0].trim()) || null;
lng = parseFloat(parts[1].trim()) || null;
}
const payload = {
titulo: titulo || `Visita Técnica - Ticket #${ticketId}`,
descripcion: descripcion || `Visita técnica generada desde Help Desk para el Ticket #${ticketId}`,
emailTecnico: emailTecnico,
prioridad: prioridad,
ticket_id: String(ticketId),
origen: 'HELP_DESK',
origen_externo_id: String(ticketId),
fechaInicio: fechaVisita ? new Date(fechaVisita).toISOString() : new Date().toISOString(),
fechaLimite: fechaFin ? new Date(fechaFin).toISOString() : (fechaVisita ? new Date(fechaVisita).toISOString() : null),
ubicacion: ubicacion,
destino: {
direccion: ubicacion,
latitud: lat,
longitud: lng,
referencia: referencia
},
checklist_inicial: Array.isArray(checklist) && checklist.length > 0
? checklist
: [
'Revisión física de acometida y equipamiento',
'Verificación de conectividad y potencia',
'Pruebas operativas con el cliente y firma'
]
};
const res = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'x-api-key': HUB_API_KEY
},
body: JSON.stringify(payload)
});
const data = await res.json();
if (!res.ok || !data.success) {
throw new Error(data.mensaje || data.error || `HTTP ${res.status} al crear tarea en Hub`);
}
return data;
} catch (error) {
console.error('[TareasHubService.crearVisita]:', error.message);
throw error;
}
}
/**
* Consulta el estado en tiempo real y el timeline operativo de la tarea/visita en el Hub
*/
static async consultarEstadoVisita(externalIdOrTicketId) {
try {
const url = `${HUB_API_URL}/tareas/${externalIdOrTicketId}/status`;
const res = await fetch(url, {
method: 'GET',
headers: {
'Accept': 'application/json',
'x-api-key': HUB_API_KEY
}
});
if (!res.ok) {
throw new Error(`HTTP ${res.status}: No se pudo obtener el estado de la tarea`);
}
const data = await res.json();
return data;
} catch (error) {
console.error('[TareasHubService.consultarEstadoVisita]:', error.message);
throw error;
}
}
}
module.exports = TareasHubService;