From d30ce88f9ddde459bfabf144a5f90362a8786202 Mon Sep 17 00:00:00 2001 From: marsalva Date: Sun, 15 Mar 2026 11:10:44 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 115 +++++++++++++----------------------------------------- 1 file changed, 28 insertions(+), 87 deletions(-) diff --git a/server.js b/server.js index 45698d9..eaffb10 100644 --- a/server.js +++ b/server.js @@ -1812,97 +1812,38 @@ app.post("/providers/credentials", authMiddleware, async (req, res) => { }); // ========================================== -// đŸ“„ RECEPCIÓN DE SERVICIOS (EMBUDO INTELIGENTE DEFINITIVO) +// đŸ“€ OBTENER SERVICIOS PARA EL BUZÓN (ESTO ES LO QUE SE BORRÓ SIN QUERER) // ========================================== -app.post("/providers/scraped", authMiddleware, async (req, res) => { +app.get("/providers/scraped", authMiddleware, async (req, res) => { try { - const { provider, services } = req.body; + const q = await pool.query(` + SELECT + s.*, + ap.token as active_token, + EXTRACT(EPOCH FROM (ap.expires_at - CURRENT_TIMESTAMP)) as seconds_left, + u.full_name as current_worker_name, + (SELECT json_agg(json_build_object('name', u2.full_name, 'phone', u2.phone)) + FROM assignment_pings ap2 + JOIN users u2 ON ap2.user_id = u2.id + WHERE ap2.scraped_id = s.id AND ap2.status IN ('expired', 'rejected')) as attempted_workers_data + FROM scraped_services s + LEFT JOIN assignment_pings ap ON s.id = ap.scraped_id AND ap.status = 'pending' + LEFT JOIN users u ON ap.user_id = u.id + WHERE s.owner_id = $1 + ORDER BY s.created_at DESC + `, [req.user.accountId]); - if (!provider || !Array.isArray(services)) { - return res.status(400).json({ ok: false, error: "Formato de datos invĂĄlido" }); - } - - let count = 0; - - 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 REFERENCIA (ÂĄAQUÍ FALTABA 'SERVICIO'!) - const ref = svc['service_ref'] - || svc['SERVICIO'] - || svc['Referencia'] - || svc['NÂș Siniestro'] - || 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; - - // 2. DETECTOR DE URGENCIAS (SOLO VALORES, CERO FALSOS POSITIVOS) - let esUrgente = false; - - for (const key in svc) { - const nombreColumna = String(key).toLowerCase(); - const valor = String(svc[key]).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); - - // HomeServe: Frases exactas dentro de los valores - if (valor.includes('atencion presencial urgencias') || valor.includes('atencion de la urgencia')) { - esUrgente = true; - break; - } - - // Multiasistencia: Si la columna contiene "urgent" y el valor es "si" - if ((nombreColumna.includes('urgent') || nombreColumna === 'urgencia') && (valor === 'si' || valor === 'true')) { - esUrgente = true; - break; - } + const services = q.rows.map(row => { + if (row.seconds_left && row.seconds_left > 0) { + row.token_expires_at = new Date(Date.now() + (row.seconds_left * 1000)); + } else if (row.seconds_left <= 0) { + row.token_expires_at = new Date(Date.now() - 1000); } - - const guildId = svc.guild_id || svc['guild_id'] || (svc.raw_data && svc.raw_data.guild_id); - - // 3. GUARDAMOS EN LA BD (CON MEMORIA: 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) - ON CONFLICT (owner_id, provider, service_ref) - DO UPDATE SET - raw_data = scraped_services.raw_data || EXCLUDED.raw_data, - 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; - - // 4. AUTO-DESPACHO - 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"; - - 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 }, - body: JSON.stringify({ guild_id: guildId, cp: cpFinal, useDelay: false }) - }).catch(e => console.error("Error en auto-despacho:", e.message)); - } - - count++; - } - - res.json({ ok: true, inserted: count }); - - } catch (error) { - console.error("❌ Error recibiendo servicios:", error); - res.status(500).json({ ok: false, error: error.message }); - } + delete row.seconds_left; + return row; + }); + res.json({ ok: true, services }); + } catch (e) { res.status(500).json({ ok: false }); } }); // ==========================================