From 9b76f63aa0a9ff5ec8458394d1fae65ffe1ae432 Mon Sep 17 00:00:00 2001 From: Lizandro Date: Tue, 14 Jul 2026 01:16:51 +0000 Subject: [PATCH] feat(chat): recarga con transferencia bancaria, fix OTP y mejoras UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix: autocomplete="off" en campo OTP (evita que el correo aparezca ahí) - Recarga: nuevo paso elegir método (MercadoPago o Transferencia bancaria) - Transferencia: muestra card con banco/clave/titular/monto y aviso de comprobante - Validación automática al enviar foto del comprobante (flujo existente) - Config admin: nuevos campos banco/clave/titular para transferencia - UI: card de banco con estilo diferenciado (azul), aviso destacado en ámbar Co-Authored-By: Claude Sonnet 4.6 --- app/Http/Livewire/Chat/PublicChat.php | 57 ++++++++++++++++++- .../Livewire/Chat/ShowConfiguracionChat.php | 20 +++++-- .../views/livewire/chat/public-chat.blade.php | 47 ++++++++++++++- .../chat/show-configuracion-chat.blade.php | 28 +++++++++ 4 files changed, 145 insertions(+), 7 deletions(-) diff --git a/app/Http/Livewire/Chat/PublicChat.php b/app/Http/Livewire/Chat/PublicChat.php index ff86a39..7078d85 100644 --- a/app/Http/Livewire/Chat/PublicChat.php +++ b/app/Http/Livewire/Chat/PublicChat.php @@ -324,7 +324,9 @@ class PublicChat extends Component $action === 'promo.comprar.saldo' => $this->comprarPromoConSaldo((int) ($data['id'] ?? 0)), $action === 'promo.comprar.mp' => $this->comprarPromoConMP((int) ($data['id'] ?? 0)), $action === 'recarga.iniciar' => $this->mostrarFormRecarga(), + $action === 'recarga.elegir_metodo' => $this->elegirMetodoRecarga((int) ($data['monto'] ?? 0)), $action === 'recarga.mp' => $this->generarLinkRecargaMP((int) ($data['monto'] ?? 0)), + $action === 'recarga.transferencia' => $this->mostrarTransferencia((int) ($data['monto'] ?? 0)), $action === 'credenciales.listar' => $this->listarCredenciales(), $action === 'historial.ver' => $this->verHistorial(), $action === 'perfil.ver' => $this->verPerfil(), @@ -821,7 +823,7 @@ class PublicChat extends Component { $botones = []; foreach ([20000, 50000, 100000, 200000, 500000] as $m) { - $botones[] = ['label' => '$' . number_format($m), 'action' => 'recarga.mp', 'data' => ['monto' => $m]]; + $botones[] = ['label' => '$' . number_format($m), 'action' => 'recarga.elegir_metodo', 'data' => ['monto' => $m]]; } $botones[] = ['label' => 'Volver', 'action' => 'menu.principal', 'data' => []]; @@ -835,6 +837,59 @@ class PublicChat extends Component ]); } + private function elegirMetodoRecarga(int $monto): void + { + if ($monto <= 0) { + return; + } + + ChatMessage::create([ + 'conversation_id' => $this->convId, + 'tipo' => 'bot', + 'tipo_ui' => 'buttons', + 'contenido' => "Recarga de $" . number_format($monto) . "\n¿Como quieres pagar?", + 'payload' => ['botones' => [ + ['label' => 'MercadoPago', 'action' => 'recarga.mp', 'data' => ['monto' => $monto]], + ['label' => 'Transferencia bancaria', 'action' => 'recarga.transferencia', 'data' => ['monto' => $monto]], + ['label' => 'Volver', 'action' => 'recarga.iniciar', 'data' => []], + ]], + 'leido' => true, + ]); + } + + private function mostrarTransferencia(int $monto): void + { + if ($monto <= 0) { + return; + } + + $banco = \App\Models\ChatConfig::get('recarga_banco_nombre', ''); + $clave = \App\Models\ChatConfig::get('recarga_banco_clave', ''); + $titular = \App\Models\ChatConfig::get('recarga_banco_titular', ''); + + if (! $clave) { + $this->guardarMensajeBot($this->convId, "La transferencia bancaria no esta disponible en este momento. Usa MercadoPago o contacta a un asesor."); + return; + } + + ChatMessage::create([ + 'conversation_id' => $this->convId, + 'tipo' => 'bot', + 'tipo_ui' => 'banco', + 'contenido' => 'Datos para transferencia:', + 'payload' => [ + 'banco' => $banco, + 'clave' => $clave, + 'titular' => $titular, + 'monto' => $monto, + ], + 'leido' => true, + ]); + + $this->guardarMensajeBot($this->convId, "Cuando hayas transferido, envia el comprobante usando el icono de camara (📷) y el sistema lo validara automaticamente."); + $this->volver('menu.principal'); + } + private function generarLinkRecargaMP(int $monto): void { if ($monto <= 0) { diff --git a/app/Http/Livewire/Chat/ShowConfiguracionChat.php b/app/Http/Livewire/Chat/ShowConfiguracionChat.php index a6455af..7cca3b6 100644 --- a/app/Http/Livewire/Chat/ShowConfiguracionChat.php +++ b/app/Http/Livewire/Chat/ShowConfiguracionChat.php @@ -22,22 +22,28 @@ class ShowConfiguracionChat extends Component public string $gemini_prompt_extra = ''; // ── Validación de pago por foto + correo ────────────────── - public string $validacion_foto_habilitada = '0'; - public string $validacion_accion_auto = 'solo_notificar'; // recargar_saldo | solo_notificar + public string $validacion_foto_habilitada = '0'; + public string $validacion_accion_auto = 'solo_notificar'; public string $validacion_monto_tolerancia = '0'; + // ── Transferencia bancaria ───────────────────────────────── + public string $recarga_banco_nombre = ''; + public string $recarga_banco_clave = ''; + public string $recarga_banco_titular = ''; + public function mount(): void { $keys = [ 'telegram_token', 'mensaje_bienvenida', 'mensaje_transferencia', 'gemini_api_key', 'gemini_habilitado', 'gemini_prompt_extra', 'validacion_foto_habilitada', 'validacion_accion_auto', 'validacion_monto_tolerancia', + 'recarga_banco_nombre', 'recarga_banco_clave', 'recarga_banco_titular', ]; $defaults = [ - 'mensaje_bienvenida' => 'Hola! Bienvenido. Escribe tu consulta.', - 'mensaje_transferencia' => 'Un agente se comunicara contigo en breve. Por favor espera.', - 'validacion_accion_auto' => 'solo_notificar', + 'mensaje_bienvenida' => 'Hola! Bienvenido. Escribe tu consulta.', + 'mensaje_transferencia' => 'Un agente se comunicara contigo en breve. Por favor espera.', + 'validacion_accion_auto' => 'solo_notificar', 'validacion_monto_tolerancia' => '0', ]; @@ -52,12 +58,16 @@ class ShowConfiguracionChat extends Component 'mensaje_bienvenida' => 'required|string|max:500', 'mensaje_transferencia' => 'required|string|max:500', 'validacion_monto_tolerancia' => 'nullable|integer|min:0', + 'recarga_banco_nombre' => 'nullable|max:60', + 'recarga_banco_clave' => 'nullable|max:60', + 'recarga_banco_titular' => 'nullable|max:100', ]); $keys = [ 'telegram_token', 'mensaje_bienvenida', 'mensaje_transferencia', 'gemini_api_key', 'gemini_habilitado', 'gemini_prompt_extra', 'validacion_foto_habilitada', 'validacion_accion_auto', 'validacion_monto_tolerancia', + 'recarga_banco_nombre', 'recarga_banco_clave', 'recarga_banco_titular', ]; foreach ($keys as $key) { diff --git a/resources/views/livewire/chat/public-chat.blade.php b/resources/views/livewire/chat/public-chat.blade.php index 6c9ba98..ab8875a 100644 --- a/resources/views/livewire/chat/public-chat.blade.php +++ b/resources/views/livewire/chat/public-chat.blade.php @@ -124,7 +124,7 @@
@@ -390,6 +390,51 @@
+ {{-- BANCO: datos de transferencia bancaria --}} + @elseif ($tipoUi === 'banco') +
+
+ + + +

Transferencia bancaria

+
+
+ @if (!empty($payload['banco'])) +
+ Banco / Billetera + {{ $payload['banco'] }} +
+ @endif +
+

Número / Clave

+

{{ $payload['clave'] ?? '' }}

+
+ @if (!empty($payload['titular'])) +
+ Titular + {{ $payload['titular'] }} +
+ @endif +
+ Monto exacto + ${{ number_format($payload['monto'] ?? 0) }} +
+
+
+
+ + + + +

Envía el comprobante con el ícono 📷 de abajo y el sistema lo validará automáticamente

+
+
+
+ {{ $msg['created_at'] }} +
+
+ {{-- fallback --}} @else
diff --git a/resources/views/livewire/chat/show-configuracion-chat.blade.php b/resources/views/livewire/chat/show-configuracion-chat.blade.php index 0162c5f..5bf5d5a 100644 --- a/resources/views/livewire/chat/show-configuracion-chat.blade.php +++ b/resources/views/livewire/chat/show-configuracion-chat.blade.php @@ -114,6 +114,34 @@
+
+ + {{-- Transferencia bancaria --}} +
+

Transferencia bancaria

+

Datos que se muestran al cliente cuando elige pagar por transferencia. Deja vacío para deshabilitar esta opción.

+
+
+ + + @error('recarga_banco_nombre') {{ $message }} @enderror +
+
+ + + @error('recarga_banco_clave') {{ $message }} @enderror +
+
+ + + @error('recarga_banco_titular') {{ $message }} @enderror +
+
+
+ {{-- Guardar --}}