feat: validación exacta de hora + remitente obligatorio + nombres guardados

- Hora exacta: tolerancia 0 (timestamp comprobante = timestamp email)
- Remitente bloquea: si el email trae el nombre del remitente y no coincide, rechaza
- Nuevo paso antes de mostrar datos bancarios: bot pide nombre completo del titular
- Nombres aceptados se guardan en solicitudes_recarga.nombre_remitente
- Próxima recarga: muestra botones con nombres anteriores confirmados o ingresa uno nuevo
- Funciona igual en Telegram y web chat

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro
2026-07-19 15:27:31 +00:00
co-authored by Claude Sonnet 4.6
parent b66b828ded
commit bb311e7dcd
5 changed files with 225 additions and 30 deletions
+20 -7
View File
@@ -10,22 +10,22 @@ class SolicitudRecarga extends Model
public $timestamps = false;
protected $fillable = ['user_id', 'monto', 'canal', 'estado'];
protected $fillable = ['user_id', 'monto', 'canal', 'estado', 'nombre_remitente'];
protected $casts = ['created_at' => 'datetime'];
public static function crear(int $userId, int $monto, string $canal): static
public static function crear(int $userId, int $monto, string $canal, ?string $nombreRemitente = null): static
{
// Expirar cualquier solicitud pendiente anterior del mismo usuario
static::where('user_id', $userId)
->where('estado', 'pendiente')
->update(['estado' => 'expirada']);
return static::create([
'user_id' => $userId,
'monto' => $monto,
'canal' => $canal,
'estado' => 'pendiente',
'user_id' => $userId,
'monto' => $monto,
'canal' => $canal,
'estado' => 'pendiente',
'nombre_remitente' => $nombreRemitente,
]);
}
@@ -38,6 +38,19 @@ class SolicitudRecarga extends Model
->first();
}
public static function nombresPrevios(int $userId): array
{
return static::where('user_id', $userId)
->where('estado', 'confirmada')
->whereNotNull('nombre_remitente')
->orderByDesc('id')
->limit(10)
->pluck('nombre_remitente')
->unique()
->values()
->toArray();
}
public function confirmar(): void
{
$this->update(['estado' => 'confirmada']);