140 lines
4.8 KiB
JavaScript
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;
|