From 0796d1409823ce4c6bac1066b4db207e66377d19 Mon Sep 17 00:00:00 2001 From: marsalva Date: Sat, 21 Feb 2026 11:37:47 +0000 Subject: [PATCH] Actualizar servicios.html --- servicios.html | 82 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 15 deletions(-) diff --git a/servicios.html b/servicios.html index 7417ea3..866d72a 100644 --- a/servicios.html +++ b/servicios.html @@ -260,6 +260,24 @@ + + @@ -379,7 +397,7 @@ // 1. Prioridad Máxima: Bolsa de Trabajo / Robot WhatsApp if (!s.assigned_name && (s.automation_status === 'in_progress' || s.automation_status === 'failed')) { - return { id: 'bolsa', name: s.automation_status === 'in_progress' ? 'Buscando Operario' : 'Fallo en Bolsa', color: s.automation_status === 'in_progress' ? 'amber' : 'red', isBlocked: true, is_final: false }; + return { id: 'bolsa', name: s.automation_status === 'in_progress' ? 'Buscando Operario' : 'Fallo en Bolsa', color: s.automation_status === 'in_progress' ? 'amber' : 'red', isBlocked: false, is_final: false }; } // 2. Si viene limpio del scraper sin estado -> Pendiente de Asignar @@ -513,17 +531,15 @@ if(stateInfo.name.toLowerCase().includes('reparaci') || stateInfo.name.toLowerCase().includes('trabaja')) iconEstado = 'wrench'; if(stateInfo.name.toLowerCase().includes('incidencia') || stateInfo.name.toLowerCase().includes('pausado')) iconEstado = 'alert-triangle'; - const isBlocked = stateInfo.isBlocked; - const clickAction = isBlocked ? `shakeCard(this, '${s.automation_status}'); event.stopPropagation();` : `openDetail(${s.id})`; - const cursorStyle = isBlocked ? 'cursor-not-allowed' : 'cursor-pointer'; + const inProgressBadge = s.automation_status === 'in_progress' ? ` En Bolsa` : ''; return ` -
- +
+ ${inProgressBadge}
- ${isBlocked ? `` : `
`} +
${stateInfo.name}
${isUrgent ? `🔥 URGENTE` : `#${s.service_ref}`} @@ -546,7 +562,7 @@
${s.assigned_name || 'Sin asignar'}
- ${raw.scheduled_date && !isBlocked ? ` + ${raw.scheduled_date ? `
${cita} @@ -616,17 +632,23 @@ const stateInfo = s._stateInfo; - // Mostrar u ocultar paneles de asignación dependiendo del estado - if (s.assigned_name && stateInfo.id !== 'bolsa' && !stateInfo.name.toLowerCase().includes('asignar') && !stateInfo.name.toLowerCase().includes('desasignado')) { + // --- LÓGICA DE VISIBILIDAD DE PANELES MODIFICADA --- + if (s.automation_status === 'in_progress') { + document.getElementById('panelEnBolsa').classList.remove('hidden'); + document.getElementById('panelAsignado').classList.add('hidden'); + document.getElementById('panelSinAsignar').classList.add('hidden'); + } + else if (s.assigned_name && stateInfo.id !== 'bolsa' && !stateInfo.name.toLowerCase().includes('asignar') && !stateInfo.name.toLowerCase().includes('desasignado')) { + document.getElementById('panelEnBolsa').classList.add('hidden'); document.getElementById('panelAsignado').classList.remove('hidden'); document.getElementById('panelSinAsignar').classList.add('hidden'); document.getElementById('detWorker').innerText = s.assigned_name; document.getElementById('dateInput').value = raw.scheduled_date || ""; document.getElementById('timeInput').value = raw.scheduled_time || ""; - document.getElementById('detStatusMap').value = stateInfo.id; } else { + document.getElementById('panelEnBolsa').classList.add('hidden'); document.getElementById('panelAsignado').classList.add('hidden'); document.getElementById('panelSinAsignar').classList.remove('hidden'); @@ -644,6 +666,24 @@ lucide.createIcons(); } + async function stopAutomation() { + const id = document.getElementById('detId').value; + if(!confirm("¿Deseas cancelar la búsqueda del robot para asignar este servicio manualmente?")) return; + + try { + await fetch(`${API_URL}/providers/scraped/${id}`, { + method: 'PUT', + headers: { "Content-Type": "application/json", "Authorization": `Bearer ${localStorage.getItem("token")}` }, + body: JSON.stringify({ automation_status: 'manual' }) + }); + showToast("Bolsa detenida. Ya puedes asignar el servicio."); + closeDetailModal(); + refreshPanel(); + } catch (e) { + alert("Error al detener el automatismo."); + } + } + async function saveAppointment() { const id = document.getElementById('detId').value; const date = document.getElementById('dateInput').value; @@ -711,19 +751,31 @@ const name = select.options[select.selectedIndex].text; const estadoAsignado = systemStatuses.find(st => st.name.toLowerCase() === 'asignado') || systemStatuses[1]; + // 1. PRIMERA LLAMADA: Detenemos la bolsa de trabajo automática + await fetch(`${API_URL}/providers/scraped/${id}`, { + method: 'PUT', + headers: { "Content-Type": "application/json", "Authorization": `Bearer ${localStorage.getItem("token")}` }, + body: JSON.stringify({ automation_status: 'completed' }) + }); + + // 2. SEGUNDA LLAMADA: Guardamos el operario y el estado "Asignado" await fetch(`${API_URL}/providers/scraped/${id}`, { method: 'PUT', headers: { "Content-Type": "application/json", "Authorization": `Bearer ${localStorage.getItem("token")}` }, body: JSON.stringify({ - automation_status: 'completed', assigned_to: assigned_to, - assigned_name: name, + assigned_to_name: name, guild_id: guild_id, status_operativo: estadoAsignado ? String(estadoAsignado.id) : 'asignado_operario' }) }); - closeDetailModal(); showToast("Asignado correctamente"); refreshPanel(); - } catch (e) { alert("Error"); } + + closeDetailModal(); + showToast("Asignado y notificado correctamente"); + refreshPanel(); + } catch (e) { + alert("Error en la asignación manual"); + } } async function saveNewService(e) {