From 6569464979f04bd3cbeb6c90fb91775fe57a0c17 Mon Sep 17 00:00:00 2001 From: marsalva Date: Wed, 4 Mar 2026 20:13:17 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 55 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/server.js b/server.js index e68fb74..7c4da94 100644 --- a/server.js +++ b/server.js @@ -852,6 +852,45 @@ app.post("/whatsapp/settings", authMiddleware, async (req, res) => { } catch (e) { res.status(500).json({ ok: false }); } }); +// ========================================== +// 💬 NÚCLEO DE ENVÍO WHATSAPP (EVOLUTION API) +// ========================================== +async function sendWhatsAppAuto(phone, message, instanceName, useDelay = false) { + if (!EVOLUTION_BASE_URL || !EVOLUTION_API_KEY) { + console.error("⚠ WhatsApp omitido: Servidor Evolution no configurado."); + return false; + } + try { + const baseUrl = EVOLUTION_BASE_URL.replace(/\/$/, ""); + const url = `${baseUrl}/message/sendText/${instanceName}`; + + const response = await fetch(url, { + method: 'POST', + headers: { + "Content-Type": "application/json", + "apikey": EVOLUTION_API_KEY.trim() + }, + body: JSON.stringify({ + number: phone, + text: message, + delay: useDelay ? 2000 : 0 + }) + }); + + if (!response.ok) { + console.error("❌ Fallo enviando WhatsApp. Estado Evolution:", response.status); + return false; + } + return true; + } catch (error) { + console.error("❌ Error de red conectando con Evolution API:", error.message); + return false; + } +} + +// ========================================== +// 🔔 DISPARADOR DE EVENTOS DE WHATSAPP +// ========================================== async function triggerWhatsAppEvent(ownerId, serviceId, eventType) { try { const userQ = await pool.query("SELECT wa_settings FROM users WHERE id=$1", [ownerId]); @@ -913,22 +952,20 @@ async function triggerWhatsAppEvent(ownerId, serviceId, eventType) { text = text.replace(/{{FECHA}}/g, fechaLimpia); text = text.replace(/{{HORA}}/g, raw["scheduled_time"] || "la hora acordada"); text = text.replace(/{{COMPANIA}}/g, raw["Compañía"] || raw["COMPAÑIA"] || "su Aseguradora"); - text = text.replace(/{{REFERENCIA}}/g, s.service_ref || raw["Referencia"] || raw["NÂș Siniestro"] || id); text = text.replace(/{{ENLACE}}/g, linkMagico); + text = text.replace(/{{REFERENCIA}}/g, s.service_ref || raw["Referencia"] || raw["NÂș Siniestro"] || serviceId); + text = text.replace(/{{ENLACE}}/g, linkMagico); const useDelay = settings.wa_delay_enabled !== false; + // RETORNAMOS EL ÉXITO O FRACASO DEL ENVÍO return await sendWhatsAppAuto(phone, text, `cliente_${ownerId}`, useDelay); - } catch (e) { console.error("Error Motor WA:", e.message); return false; } + } catch (e) { + console.error("Error Motor WA:", e.message); + return false; + } } -app.get("/providers/credentials", authMiddleware, async (req, res) => { - try { - const q = await pool.query("SELECT provider, username, last_sync, status FROM provider_credentials WHERE owner_id=$1", [req.user.accountId]); - res.json({ ok: true, credentials: q.rows }); - } catch (e) { res.status(500).json({ ok: false }); } -}); - app.post("/providers/credentials", authMiddleware, async (req, res) => { try { const { provider, username, password } = req.body;