diff --git a/servicios.html b/servicios.html index 08cda22..b58ab42 100644 --- a/servicios.html +++ b/servicios.html @@ -570,52 +570,54 @@ const searchTerm = document.getElementById('searchFilter').value.toLowerCase(); const selectedOp = document.getElementById('opFilter').value; - const weekValue = document.getElementById('weekFilter').value; - // Inicializamos contadores reales - let kpiUnassigned = 0; - let kpiScheduled = 0; - let kpiWaiting = 0; - let kpiIncident = 0; + // 1. Añadimos la variable para el nuevo KPI + let kpiUnassigned = 0, kpiAssignedNoDate = 0, kpiScheduled = 0, kpiWaiting = 0, kpiIncident = 0; const filteredData = localData.filter(s => { const raw = s.raw_data || {}; const stateInfo = getServiceStateInfo(s); s._stateInfo = stateInfo; - const stName = stateInfo.name.toLowerCase(); - if (!s.assigned_name || stateInfo.id === 'bolsa' || stName.includes('asignar')) { + // --- LÓGICA REVISADA DE CONTADORES --- + + if (!s.assigned_name || stateInfo.id === 'bolsa' || stName.includes('asignar') || stName.includes('desasignado')) { + // Si no tiene operario, o está en bolsa, o el estado dice explícitamente sin asignar kpiUnassigned++; } else if (stName.includes('incidencia') || stName.includes('pausa')) { + // Si hay un problema kpiIncident++; } + else if (stName.includes('espera')) { + // SOLUCIONADO: Ahora solo cuenta aquí si el estado se llama literalmente "Esperando al cliente" + kpiWaiting++; + } else if (raw.scheduled_date && raw.scheduled_date !== "" && !stateInfo.is_final) { + // Citados: Tiene operario (ya pasó el primer filtro) y SÍ tiene fecha kpiScheduled++; } - else if (!stateInfo.is_final && !raw.scheduled_date) { - kpiWaiting++; + else if (!stateInfo.is_final && (!raw.scheduled_date || raw.scheduled_date === "")) { + // Asignado sin cita: Tiene operario, no es incidencia, no es espera, y NO tiene fecha + kpiAssignedNoDate++; } - const name = (raw["Nombre Cliente"] || raw["CLIENTE"] || "").toLowerCase(); - const ref = (s.service_ref || "").toLowerCase(); - const matchesSearch = searchTerm === "" || name.includes(searchTerm) || ref.includes(searchTerm); + // Filtro de búsqueda visual (esto no cambia) + const matchesSearch = searchTerm === "" || + (raw["Nombre Cliente"] || "").toLowerCase().includes(searchTerm) || + (s.service_ref || "").toLowerCase().includes(searchTerm) || + (raw["Teléfono"] || "").toLowerCase().includes(searchTerm); + const matchesOp = selectedOp === "ALL" || s.assigned_name === selectedOp; - - let matchesWeek = true; - if (weekValue !== "" && raw.scheduled_date) { - matchesWeek = isDateInWeekString(raw.scheduled_date, weekValue); - } else if (weekValue !== "") { - matchesWeek = false; - } - - let matchesStatus = (activeStatusFilter === "ALL") ? true : String(stateInfo.id) === activeStatusFilter; + const matchesStatus = (activeStatusFilter === "ALL") ? true : String(stateInfo.id) === activeStatusFilter; - return matchesSearch && matchesOp && matchesWeek && matchesStatus; + return matchesSearch && matchesOp && matchesStatus; }); + // 2. Mandamos los números calculados a los círculos del HTML document.getElementById('kpi-unassigned').innerText = kpiUnassigned; + document.getElementById('kpi-assigned-no-date').innerText = kpiAssignedNoDate; // <- NUEVO document.getElementById('kpi-scheduled').innerText = kpiScheduled; document.getElementById('kpi-waiting').innerText = kpiWaiting; document.getElementById('kpi-incident').innerText = kpiIncident; @@ -623,10 +625,7 @@ const grid = document.getElementById('servicesGrid'); grid.innerHTML = filteredData.length > 0 ? filteredData.map(s => buildGridCard(s)).join('') - : `
No hay servicios que coincidan
-