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
+15 -11
View File
@@ -82,12 +82,11 @@ class PagoValidadorService
}
}
// ── 3. Hora (±2 min) — la hora del comprobante y del correo deben ser la misma
// El correo puede demorar en llegar al inbox, pero el timestamp interno registra
// el momento exacto de la transacción, igual que el comprobante.
// ── 3. Hora exacta — el timestamp del comprobante y del correo deben coincidir
// El correo llega tarde al inbox pero su contenido registra la hora exacta de la transacción.
if ($horaIA && ($datosCorreo['hora'] ?? '')) {
if (! $this->horaProxima($horaIA, $datosCorreo['hora'], 2)) {
Log::info("[PagoValidador] Correo #{$i}: hora fuera de rango (ia={$horaIA} correo={$datosCorreo['hora']})");
if (! $this->horaProxima($horaIA, $datosCorreo['hora'], 0)) {
Log::info("[PagoValidador] Correo #{$i}: hora no coincide (ia={$horaIA} correo={$datosCorreo['hora']})");
continue;
}
}
@@ -117,10 +116,16 @@ class PagoValidadorService
return ['estado' => 'no_encontrado', 'correo' => null, 'motivo' => 'error_sistema'];
}
// ── 6. Remitente (informativo, no bloquea) ──────────────
$coincideRemitente = $this->remitenteCoincide($datosCorreo['remitente'] ?? '', $nombreUsuario ?? '');
// ── 6. Remitente (bloquea si el correo trae el campo y no coincide) ──
$remitenteCorreo = $datosCorreo['remitente'] ?? '';
if ($remitenteCorreo && $nombreUsuario) {
if (! $this->remitenteCoincide($remitenteCorreo, $nombreUsuario)) {
Log::info("[PagoValidador] Correo #{$i}: remitente no coincide (correo={$remitenteCorreo} usuario={$nombreUsuario})");
continue;
}
}
Log::info("[PagoValidador] Correo #{$i}: CONFIRMADO (remitente_coincide=" . ($coincideRemitente ? 'SI' : 'NO') . ")");
Log::info("[PagoValidador] Correo #{$i}: CONFIRMADO (remitente={$remitenteCorreo})");
try {
PagoConfirmado::marcar($emailHash, [
@@ -137,9 +142,8 @@ class PagoValidadorService
}
return [
'estado' => 'confirmado',
'correo' => $datosCorreo,
'coincide_remitente' => $coincideRemitente,
'estado' => 'confirmado',
'correo' => $datosCorreo,
];
}