diff --git a/server.js b/server.js index c8c4a74..d6752f9 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 FINAL Y DEFINITIVO) +// 📥 RECEPCIÓN DE SERVICIOS (EMBUDO INTELIGENTE CON MEMORIA DE URGENCIA) // ========================================== app.post("/providers/scraped", authMiddleware, async (req, res) => { try { @@ -1824,7 +1824,6 @@ app.post("/providers/scraped", authMiddleware, async (req, res) => { let count = 0; - // 🛑 1. CARGAMOS LA CONFIGURACIÓN DE AUTO-DESPACHO DE ESTE PROVEEDOR const credsQ = await pool.query( "SELECT auto_dispatch FROM provider_credentials WHERE owner_id = $1 AND provider = $2", [req.user.accountId, provider] @@ -1833,7 +1832,6 @@ app.post("/providers/scraped", authMiddleware, async (req, res) => { for (const svc of services) { - // 2. EXTRAER REFERENCIA (¡AQUÍ ESTABA EL FALLO! HomeServe lo llama "SERVICIO") const ref = svc['service_ref'] || svc['SERVICIO'] || svc['Referencia'] @@ -1841,43 +1839,47 @@ app.post("/providers/scraped", authMiddleware, async (req, res) => { || svc['Expediente'] || (svc.raw_data && (svc.raw_data['SERVICIO'] || svc.raw_data['Referencia'] || svc.raw_data['Nº Siniestro'] || svc.raw_data['Expediente'])); - if (!ref) continue; // Si no hay referencia, lo salta. ¡Por eso no actualizaba! + if (!ref) continue; - // 🔥 3. DETECTOR DE URGENCIAS ANTI-FALLOS (APLASTAMIENTO TOTAL) 🔥 + // 🔥 3. DETECTOR DE URGENCIAS (SOLO VALORES, CERO FALSOS POSITIVOS) 🔥 let esUrgente = false; - // Convertimos TODO el expediente (esté donde esté el dato) a un texto gigante - const todoElTexto = JSON.stringify(svc).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); - - if ( - todoElTexto.includes('atencion presencial urgencias') || - todoElTexto.includes('urgencia') || - todoElTexto.includes('urgente') - ) { - esUrgente = true; + for (const key in svc) { + const nombreColumna = key.toLowerCase(); + const valor = String(svc[key]).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); + + // 1. Caso HomeServe (Frases exactas en cualquier valor) + if (valor.includes('atencion presencial urgencias') || valor.includes('atencion de la urgencia')) { + esUrgente = true; + break; + } + + // 2. Caso Multiasistencia u otros (Columna "Urgente" = Sí) + if ((nombreColumna.includes('urgent') || nombreColumna === 'urgencia') && (valor === 'si' || valor === 'true')) { + esUrgente = true; + break; + } } - // 🕵️ 4. EXTRAER GREMIO const guildId = svc.guild_id || svc['guild_id'] || (svc.raw_data && svc.raw_data.guild_id); - // 5. GUARDAMOS EN LA BASE DE DATOS const insertRes = await pool.query(` INSERT INTO scraped_services (owner_id, provider, service_ref, raw_data, is_urgent) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (owner_id, provider, service_ref) DO UPDATE SET raw_data = scraped_services.raw_data || EXCLUDED.raw_data, - is_urgent = EXCLUDED.is_urgent + is_urgent = scraped_services.is_urgent OR EXCLUDED.is_urgent RETURNING id, automation_status `, [req.user.accountId, provider, ref, JSON.stringify(svc), esUrgente]); const newSvcId = insertRes.rows[0].id; const autoStatus = insertRes.rows[0].automation_status; - // 🚀 6. ¡DISPARADOR AUTOMÁTICO DE URGENCIAS! if (esUrgente && guildId && autoDispatchEnabled && (autoStatus === 'manual' || autoStatus === 'pending')) { console.log(`⚡ [AUTO-DISPATCH] Lanzando urgencia ${ref} de ${provider} a la bolsa...`); + const todoElTexto = JSON.stringify(svc).toLowerCase(); const cpMatch = todoElTexto.match(/\b\d{5}\b/); const cpFinal = cpMatch ? cpMatch[0] : "00000"; @@ -1892,7 +1894,6 @@ app.post("/providers/scraped", authMiddleware, async (req, res) => { count++; } - console.log(`📥 [CAPTURA] Procesados ${count} servicios de ${provider}. Auto-Despacho: ${autoDispatchEnabled ? 'ON' : 'OFF'}`); res.json({ ok: true, inserted: count }); } catch (error) {