From d80baf95b88a0315423f564614992a35fddb61ed Mon Sep 17 00:00:00 2001 From: marsalva Date: Sun, 15 Mar 2026 12:50:29 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 50 ++++++++++++++++++-------------------------------- 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/server.js b/server.js index 03573b3..d0b8bd8 100644 --- a/server.js +++ b/server.js @@ -1812,7 +1812,7 @@ app.post("/providers/credentials", authMiddleware, async (req, res) => { }); // ========================================== -// 📥 RECEPCIÓN DE SERVICIOS (EMBUDO INTELIGENTE DEFINITIVO) +// 📥 RECEPCIÓN DE SERVICIOS (EL DETECTOR DEFINITIVO Y MÁS LIMPIO) // ========================================== app.post("/providers/scraped", authMiddleware, async (req, res) => { try { @@ -1846,43 +1846,30 @@ app.post("/providers/scraped", authMiddleware, async (req, res) => { continue; } - // 🔥 2. DETECTOR DEFINITIVO Y A PRUEBA DE BALAS 🔥 + // 🔥 2. DETECTOR DE URGENCIAS MODO DIOS 🔥 let esUrgente = false; - const checkUrgencia = (obj) => { - for (const key in obj) { - if (typeof obj[key] === 'object') continue; - - const col = String(key).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); - const val = String(obj[key]).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); - - // Caso 1: Multiasistencia (La columna se llama "urgencia" y el valor es "si") - if ((col.includes('urgent') || col.includes('urgencia')) && (val === 'si' || val === 'true')) { - return true; - } - - // Caso 2: HomeServe (Buscamos en Descripción, Estado, etc.) - // Para no caer en el falso positivo (Nivel de urgencia: Normal), ignoramos la caja si se llama "urgencia" - if (!col.includes('urgent') && !col.includes('urgencia')) { - // Si en la descripción o el estado pone urgente, urgencia o el texto cortado "por atencion" - if (val.includes('urgente') || val.includes('urgencia') || val.includes('por atencion')) { - return true; - } - } - } - return false; - }; - - // Comprobamos en la raíz y en los datos anidados - if (checkUrgencia(svc)) { + // Convertimos todo a un texto gigante, minúsculas, sin acentos ni símbolos raros + const todoElTexto = JSON.stringify(svc) + .toLowerCase() + .normalize("NFD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/\n/g, " "); // Quitamos saltos de línea por si acaso + + // 1. Detección HomeServe: Busca la frase clave de la Bandeja de Entrada o del Interior + if (todoElTexto.includes("atencion presencial urgencias") || todoElTexto.includes("atencion de la urgencia") || todoElTexto.includes("por atencion")) { esUrgente = true; - } else if (svc.raw_data && checkUrgencia(svc.raw_data)) { + } + + // 2. Detección Multiasistencia: Busca el combo "urgente":"si" literal en el JSON + if (todoElTexto.includes('"urgente":"si"') || todoElTexto.includes('"urgencia":"si"')) { esUrgente = true; } + // 3. Extracción de Gremio const guildId = svc.guild_id || svc['guild_id'] || (svc.raw_data && svc.raw_data.guild_id); - // 3. GUARDAMOS EN LA BD (CON MEMORIA ETERNA: OR EXCLUDED.is_urgent) + // 4. GUARDAMOS EN LA BD (CON MEMORIA ETERNA: OR EXCLUDED.is_urgent) const insertRes = await pool.query(` INSERT INTO scraped_services (owner_id, provider, service_ref, raw_data, is_urgent) VALUES ($1, $2, $3, $4, $5) @@ -1896,11 +1883,10 @@ app.post("/providers/scraped", authMiddleware, async (req, res) => { const newSvcId = insertRes.rows[0].id; const autoStatus = insertRes.rows[0].automation_status; - // 4. AUTO-DESPACHO + // 5. AUTO-DESPACHO if (esUrgente && guildId && autoDispatchEnabled && (autoStatus === 'manual' || autoStatus === 'pending')) { console.log(`⚡ [AUTO-DISPATCH] Lanzando urgencia ${ref} a la bolsa...`); - const todoElTexto = JSON.stringify(svc).toLowerCase(); const cpMatch = todoElTexto.match(/\b\d{5}\b/); const cpFinal = cpMatch ? cpMatch[0] : "00000";