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 <noreply@anthropic.com>
This commit is contained in:
Lizandro
2026-08-11 01:21:14 +00:00
co-authored by Claude Sonnet 5
parent f5e746abcd
commit 7b21cd9773
2 changed files with 23 additions and 2 deletions
+22 -2
View File
@@ -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)) {
+1
View File
@@ -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;
}