From 7b21cd9773040837bdfd8038bed815e54b018332 Mon Sep 17 00:00:00 2001 From: Lizandro Date: Tue, 11 Aug 2026 01:21:14 +0000 Subject: [PATCH] fix: chat web - mensaje al cancelar validacion, doble job, e intencion de compra - ValidarPagoWebJob: avisa al usuario si la solicitud ya no esta pendiente en vez de saltar en silencio a "Menu principal". - PublicChat: guard para no despachar dos jobs de validacion del mismo comprobante si Livewire dispara updatedFotoComprobante() dos veces (causaba que apareciera "Menu principal" y luego se corrigiera solo). - PublicChat: "comprar hbo" caia en historial.ver porque compra(s)? sin \b matcheaba dentro de "comprar". Agregado limite de palabra. - PublicChat: "comprar plan de netflix" caia en el listado generico de servicios por la palabra "plan". Ahora, si el mensaje nombra un servicio concreto, se abre ese servicio directo en vez del listado. Co-Authored-By: Claude Sonnet 5 --- app/Http/Livewire/Chat/PublicChat.php | 24 ++++++++++++++++++++++-- app/Jobs/ValidarPagoWebJob.php | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/Http/Livewire/Chat/PublicChat.php b/app/Http/Livewire/Chat/PublicChat.php index d9c7fbc..721f9cf 100755 --- a/app/Http/Livewire/Chat/PublicChat.php +++ b/app/Http/Livewire/Chat/PublicChat.php @@ -545,6 +545,14 @@ class PublicChat extends Component return; } + // Guard contra doble disparo (Livewire a veces llama este hook 2 veces + // en la misma subida): si ya hay una validacion en curso, no lances otro + // job para el mismo comprobante o vas a tener dos jobs pisandose. + if ($this->flujo === 'pago.procesando') { + $this->dispatchBrowserEvent('comprobante-listo'); + return; + } + try { if (\App\Models\ChatConfig::get('validacion_foto_habilitada', '0') !== '1') { $this->guardarMensajeBot($this->convId, "El analisis de comprobantes no esta habilitado. Contacta a un asesor."); @@ -1633,8 +1641,10 @@ class PublicChat extends Component 'servicios.listar' => '/servicio|plan(es)?|cat[aá]logo|qu[eé]\s*(hay|tienen|tienes)|ver\s*plan|streaming|aplicacion|aplicaci[oó]n/', // Promociones 'promo.listar' => '/promo(ci[oó]n)?|oferta|descuento|especial/', - // Historial de compras - 'historial.ver' => '/historial|compra(s)?|pedido(s)?|lo\s*que\s*(compr[eé]|he\s*comprado)|mis\s*compras/', + // Historial de compras. \b es clave: sin el limite de palabra, + // "compra(s)?" hacia match dentro de "comprar" y "no puedo entrar + // a comprar hbo" caia aqui en vez de abrir el servicio. + 'historial.ver' => '/historial|\bcompra(s)?\b|pedido(s)?|lo\s*que\s*(compr[eé]|he\s*comprado)|mis\s*compras/', // Perfil 'perfil.ver' => '/perfil|mis\s*datos|mi\s*informaci[oó]n|mis\s*datos\s*personales/', // Asesor humano @@ -1645,6 +1655,16 @@ class PublicChat extends Component foreach ($patrones as $action => $pattern) { if (preg_match($pattern, $t)) { + // "comprar plan de netflix" matchea aqui por la palabra "plan", + // pero si el mensaje ademas nombra un servicio concreto hay que + // abrir ese servicio directo, no el listado generico. + if ($action === 'servicios.listar') { + $porNombre = $this->detectarServicioPorNombre($texto); + if ($porNombre) { + return $porNombre; + } + } + $data = []; if ($action === 'recarga.iniciar') { if (preg_match('/\$?\s*(\d{1,3}(?:[.,]\d{3})+|\d{4,})\b/', $t, $m)) { diff --git a/app/Jobs/ValidarPagoWebJob.php b/app/Jobs/ValidarPagoWebJob.php index 1a0542e..2340998 100644 --- a/app/Jobs/ValidarPagoWebJob.php +++ b/app/Jobs/ValidarPagoWebJob.php @@ -67,6 +67,7 @@ class ValidarPagoWebJob implements ShouldQueue if (! $solicitud || $solicitud->id !== $this->solicitudId) { Log::info("[ValidarPagoWebJob] conv={$this->convId}: la solicitud ya no está pendiente, abortando."); + $this->bot("Tu solicitud de recarga ya no está activa (puede que hayas iniciado una nueva). Si ya transferiste, escribe a un asesor para confirmar tu pago manualmente."); $this->resolver('cancelado'); return; }