fix: correcciones de seguridad pre-producción identificadas en code review

- autoAplicarRecarga: null-check en User::find + DB::transaction atómico
- pagarConSaldo: $cuenta->update('ocupado') dentro de la transacción (evita doble venta)
- comprarPromoConSaldo: Historiale::create movido dentro de la transacción (evita registros huérfanos)
- mostrarTransferencia: array_merge en lugar de asignación directa (preserva pending_purchase)
- Blade copiarTodo: lee valores desde x-ref del DOM en vez de escapado PHP→JS
- ValidarPagoTelegramJob: eliminado import App\Models\User no utilizado

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro
2026-07-29 19:24:36 +00:00
co-authored by Claude Sonnet 4.6
parent 1245d255bb
commit 16315da176
4 changed files with 44 additions and 39 deletions
+21 -13
View File
@@ -309,22 +309,30 @@ class TelegramBotService
public function autoAplicarRecarga(string $chatId, array $state, SolicitudRecarga $solicitud, int $monto): void
{
$usuarioId = $state['user_id'];
$user = User::with('saldo')->find($usuarioId);
$usuarioId = $state['user_id'];
$user = User::with('saldo')->find($usuarioId);
if (! $user) {
Log::warning("[TelegramBot] autoAplicarRecarga: usuario {$usuarioId} no encontrado.");
$this->send($chatId, "⚠️ Error al aplicar la recarga. Por favor contacta a un asesor.");
return;
}
$saldo = $user->saldo ?? Saldo::create(['usuario_id' => $usuarioId, 'valor' => 0]);
$nuevoSaldo = $saldo->valor + $monto;
$saldo->update(['valor' => $nuevoSaldo]);
\App\Models\recarga::create([
'usuario_id' => $usuarioId,
'saldo_id' => $saldo->id,
'monto' => $monto,
'valor_recarga'=> $monto,
'status' => 'Confirmado',
'reference' => 'breb-bot-' . $solicitud->id,
]);
$solicitud->confirmar();
DB::transaction(function () use ($saldo, $nuevoSaldo, $usuarioId, $monto, $solicitud) {
$saldo->update(['valor' => $nuevoSaldo]);
\App\Models\recarga::create([
'usuario_id' => $usuarioId,
'saldo_id' => $saldo->id,
'monto' => $monto,
'valor_recarga' => $monto,
'status' => 'Confirmado',
'reference' => 'breb-bot-' . $solicitud->id,
]);
$solicitud->confirmar();
});
$pp = $state['data']['pending_purchase'] ?? null;
unset($state['data']['pago_pendiente'], $state['data']['solicitud_recarga_id'], $state['data']['pending_purchase']);