/** * 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;