feat(chat): recarga con transferencia bancaria, fix OTP y mejoras UI

- 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 <noreply@anthropic.com>
This commit is contained in:
Lizandro
2026-07-14 01:16:51 +00:00
co-authored by Claude Sonnet 4.6
parent 9d0940873d
commit 9b76f63aa0
4 changed files with 145 additions and 7 deletions
+56 -1
View File
@@ -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) {
@@ -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) {