From 514ffe8611a339521af9c1d968187f4d2ea1aed4 Mon Sep 17 00:00:00 2001 From: marsalva Date: Sat, 14 Mar 2026 20:09:24 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 54 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/server.js b/server.js index 6d755d1..9899599 100644 --- a/server.js +++ b/server.js @@ -991,8 +991,6 @@ app.post("/public/new-request", async (req, res) => { if (!phone || !guild_id) return res.status(400).json({ ok: false, error: "Faltan datos clave" }); - // Por ahora, como es público, asumiremos que entra a la instancia principal (owner_id = 1), - // a menos que uses subdominios por empresa. Lo forzamos a 1 para este ejemplo. const targetOwnerId = owner_id || 1; const cleanPhone = phone.replace(/\D/g, ""); if (cleanPhone.length < 9) return res.status(400).json({ ok: false, error: "Teléfono inválido" }); @@ -1018,7 +1016,6 @@ app.post("/public/new-request", async (req, res) => { // 2. BUSCAR OPERARIO AL AZAR (Si es NORMAL) let assignedWorkerId = null; if (!is_urgent) { - // Buscamos un operario activo de ese gremio al azar const qWorker = await clientDb.query(` SELECT u.id FROM users u JOIN user_guilds ug ON u.id = ug.user_id @@ -1029,7 +1026,6 @@ app.post("/public/new-request", async (req, res) => { if (qWorker.rowCount > 0) { assignedWorkerId = qWorker.rows[0].id; } else { - // Si no hay operarios para asignar calendario, lo forzamos a manual/bolsa return res.status(400).json({ ok: false, error: "No hay técnicos disponibles para cita normal en este gremio. Llama a la oficina." }); } } @@ -1053,28 +1049,54 @@ app.post("/public/new-request", async (req, res) => { `, [ targetOwnerId, ref, - is_urgent ? 'in_progress' : 'manual', // Si es urgente, va a la bolsa - assignedWorkerId, // Solo tendrá id si NO es urgente + is_urgent ? 'in_progress' : 'manual', + assignedWorkerId, is_urgent, JSON.stringify(rawData) ]); const newServiceId = qSvc.rows[0].id; - await clientDb.query('COMMIT'); - // 4. BIFURCACIÓN DE RUTAS + // 4. SI ES URGENTE, DISPARAMOS EL WHATSAPP DIRECTAMENTE if (is_urgent) { - // Mandamos a la cola automáticamente para que suene a los técnicos - // Lo ejecutamos en segundo plano llamando a tu propio endpoint - const port = process.env.PORT || 3000; - fetch(`http://127.0.0.1:${port}/providers/automate/${newServiceId}`, { - method: 'POST', - headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.ADMIN_TOKEN || 'hack_interno'}` }, // Necesitarás un token interno para esto - body: JSON.stringify({ guild_id, cp: "00000", useDelay: false }) - }).catch(e => console.error("Error lanzando bolsa urgente:", e)); + // Buscamos un operario activo de ese gremio + const workersQ = await clientDb.query(` + SELECT u.id, u.full_name, u.phone FROM users u + JOIN user_guilds ug ON u.id = ug.user_id + WHERE u.owner_id = $1 AND u.role = 'operario' AND u.status = 'active' AND ug.guild_id = $2 + ORDER BY RANDOM() LIMIT 1 + `, [targetOwnerId, guild_id]); + if (workersQ.rowCount > 0) { + const worker = workersQ.rows[0]; + const token = crypto.randomBytes(16).toString('hex'); + + // Creamos la alerta + await clientDb.query(` + INSERT INTO assignment_pings (scraped_id, user_id, token, expires_at) + VALUES ($1, $2, $3, CURRENT_TIMESTAMP + INTERVAL '5 minutes') + `, [newServiceId, worker.id, token]); + + // Enviamos el WA al operario + const msg = `🚨 *URGENCIA PARTICULAR (WEB)*\n📍 Zona: Asignada\n🔗 https://portal.integrarepara.es/aceptar.html?t=${token}`; + + // NOTA: Usamos `cliente_${targetOwnerId}` para que use la sesión de la empresa correcta + sendWhatsAppAuto(worker.phone, msg, `cliente_${targetOwnerId}`, false).catch(console.error); + + // Dejamos huella + await clientDb.query( + "INSERT INTO scraped_service_logs (scraped_id, user_name, action, details) VALUES ($1, 'Sistema Automático', 'Bolsa de Urgencias', $2)", + [newServiceId, `Notificación enviada a: ${worker.full_name}`] + ); + } else { + // Si no hay operarios en ese gremio, lo marcamos como fallido en la bolsa + await clientDb.query("UPDATE scraped_services SET automation_status = 'failed' WHERE id = $1", [newServiceId]); + } + + await clientDb.query('COMMIT'); res.json({ ok: true, action: 'queued', message: "Aviso urgente en cola." }); } else { + await clientDb.query('COMMIT'); // Devolvemos el token del cliente y el ID del servicio para redirigirlo al calendario res.json({ ok: true,