From d87c85f5eadf76beaf445491a9929b70806ec243 Mon Sep 17 00:00:00 2001 From: marsalva Date: Sat, 12 Sep 2026 17:34:33 +0000 Subject: [PATCH] Fix: no tratar como comando de admin la respuesta del cliente si el admin usa su propio numero como --- server.js | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 275ebe0..3d345de 100644 --- a/server.js +++ b/server.js @@ -5991,8 +5991,32 @@ app.post("/webhook/evolution", async (req, res) => { const adminPhoneQ = await pool.query("SELECT phone FROM users WHERE id = $1", [ownerId]); const adminPhoneClean = (adminPhoneQ.rows[0]?.phone || "").replace(/\D/g, "").slice(-9); if (adminPhoneClean && adminPhoneClean === cleanPhone) { - await manejarComandoAdmin({ ownerId, mensajeTexto, esAudioSinTexto, telefonoAdmin: telefonoCliente, instanceName }); - return; + const pendingAdmin = adminIntakeState.get(ownerId); + const pareceComandoNuevo = /\b(escribe|escr[íi]bele|manda|mand[aá]le|env[íi]a|env[íi]ale|contacta)\b/i.test((mensajeTexto || "").trim()); + + // 🆕 Si el admin usa su propio número también como "cliente" (p.ej. para + // probar el flujo escribiéndose a sí mismo) y ya hay un expediente abierto + // con ese mismo teléfono, dejamos que el mensaje siga el flujo normal de + // cliente en vez de tratarlo siempre como comando — si no, cualquier + // respuesta suya como "cliente" se la comía este bloque en silencio. + // Seguimos tratándolo como comando de admin si está en medio del diálogo + // de alta (esperando el motivo) o si el texto parece un comando nuevo. + let hayExpedienteAbierto = false; + if (!pendingAdmin && !pareceComandoNuevo) { + const abiertoQ = await pool.query(` + SELECT 1 FROM scraped_services + WHERE owner_id = $1 AND status != 'archived' + AND RIGHT(REGEXP_REPLACE(COALESCE(raw_data->>'Teléfono', raw_data->>'TELEFONO', raw_data->>'TELEFONOS', ''), '\\D', '', 'g'), 9) = $2 + LIMIT 1 + `, [ownerId, cleanPhone]); + hayExpedienteAbierto = abiertoQ.rowCount > 0; + } + + if (pendingAdmin || pareceComandoNuevo || !hayExpedienteAbierto) { + await manejarComandoAdmin({ ownerId, mensajeTexto, esAudioSinTexto, telefonoAdmin: telefonoCliente, instanceName }); + return; + } + // Si no: no hacemos return, dejamos caer al flujo normal de cliente de abajo. } } catch (eAdmin) { console.error("❌ Error comprobando comando de admin:", eAdmin.message);