diff --git a/server.js b/server.js index c13595e..6ead68b 100644 --- a/server.js +++ b/server.js @@ -1808,7 +1808,7 @@ app.post("/providers/credentials", authMiddleware, async (req, res) => { }); // ========================================== -// 📥 RECEPCIÓN DE SERVICIOS (EMBUDO DIRECTO) +// 📥 RECEPCIÓN DE SERVICIOS (EMBUDO INTELIGENTE CON AUTO-DESPACHO) // ========================================== app.post("/providers/scraped", authMiddleware, async (req, res) => { try { @@ -1819,42 +1819,80 @@ 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] + ); + const autoDispatchEnabled = credsQ.rowCount > 0 && credsQ.rows[0].auto_dispatch === true; + for (const svc of services) { - // 1. Extraer la referencia + // 2. Extraer la referencia const ref = svc['Referencia'] || svc['Nº Siniestro'] || svc['Expediente'] || svc['service_ref']; if (!ref) continue; - // 🔥 2. DETECTOR DIRECTO DE URGENCIAS 🔥 + // 🔥 3. DETECTOR DIRECTO DE URGENCIAS let esUrgente = false; - - // Leemos el estado venga en la columna que venga (HomeServe suele usar 'ACTUALMENTE EN' o 'Estado') const estadoSvc = String(svc['ACTUALMENTE EN'] || svc['Estado'] || svc['ESTADO'] || "").toLowerCase(); - // Si el estado contiene la frase exacta de HomeServe o la palabra urgencia if (estadoSvc.includes('atencion presencial urgencias') || estadoSvc.includes('urgencia')) { esUrgente = true; } - // Por si acaso algún otro proveedor (como Multi) envía una columna literal llamada "Urgente" if (String(svc['Urgente']).toLowerCase() === 'sí' || String(svc['URGENTE']).toLowerCase() === 'si' || String(svc['Urgente']).toLowerCase() === 'true') { esUrgente = true; } - // 3. Guardamos en la Base de Datos - await pool.query(` + // 🕵️ 4. EXTRAER GREMIO (Ya viene en el objeto enviado) + const guildId = svc.guild_id || svc['guild_id']; + + // 5. Guardamos en la Base de Datos + // Usamos RETURNING para saber el ID generado y el estado de automatización actual + 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 + 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! + // Solo si: Es urgente + Tiene Gremio + Botón ON + No se ha enviado ya (status manual/pending) + if (esUrgente && guildId && autoDispatchEnabled && (autoStatus === 'manual' || autoStatus === 'pending')) { + console.log(`⚡ [AUTO-DISPATCH] Lanzando urgencia ${ref} de ${provider} a la bolsa...`); + + // Extraemos CP para afinar la búsqueda si es posible + const cpMatch = String(svc['Código Postal'] || svc['C.P.'] || "").match(/\b\d{5}\b/); + const cpFinal = cpMatch ? cpMatch[0] : "00000"; + + // Llamamos a tu lógica de automatización interna + // Usamos fetch local para reutilizar la lógica de asignación aleatoria y pings + const port = process.env.PORT || 3000; + fetch(`http://127.0.0.1:${port}/providers/automate/${newSvcId}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': req.headers.authorization // Reutilizamos el token del scraper + }, + body: JSON.stringify({ + guild_id: guildId, + cp: cpFinal, + useDelay: false + }) + }).catch(e => console.error("Error en auto-despacho fetch:", e.message)); + } + count++; } - console.log(`📥 [CAPTURA] Recibidos ${count} servicios de ${provider}.`); + console.log(`📥 [CAPTURA] Procesados ${count} servicios de ${provider}. Auto-Despacho: ${autoDispatchEnabled ? 'ON' : 'OFF'}`); res.json({ ok: true, inserted: count }); } catch (error) {