fix: ya_usado no bloquea a otros usuarios con el mismo monto

Con return inmediato, si Usuario A usaba email_A ($20k), Usuario B
(también $20k) encontraba ese email ya_usado y se bloqueaba sin revisar
el email_B que le pertenecía.

Ahora: ya_usado → continue (sigue iterando); solo retorna ya_usado
al final del loop si todos los emails coincidentes estaban agotados
(caso real de comprobante reutilizado).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro
2026-07-19 15:18:08 +00:00
co-authored by Claude Sonnet 4.6
parent e42dd40d74
commit 65d4155f02
+10 -2
View File
@@ -38,6 +38,8 @@ class PagoValidadorService
Log::info('[PagoValidador] Buscando: valor=' . $valorIA . ' fecha=' . $fechaIA . ' hora=' . $horaIA . ' llave=' . $llaveIA);
$hayYaUsado = false; // email que coincide en todo pero ya fue usado
foreach ($correos as $i => $correo) {
$fuera = $correo['fuera_de_ventana'] ?? false;
$from = $correo['from'] ?? '';
@@ -103,8 +105,9 @@ class PagoValidadorService
try {
if (PagoConfirmado::yaUsado($emailHash)) {
Log::info("[PagoValidador] Correo #{$i}: ya usado (hash={$emailHash})");
return ['estado' => 'ya_usado', 'correo' => $datosCorreo, 'motivo' => 'correo_ya_aplicado'];
Log::info("[PagoValidador] Correo #{$i}: ya usado (hash={$emailHash}), buscando siguiente");
$hayYaUsado = true;
continue; // seguir buscando: otro usuario puede tener un email fresco del mismo monto
}
} catch (\Throwable $e) {
// Falla cerrado: si no se puede verificar el anti-duplicado, no confirmar
@@ -138,6 +141,11 @@ class PagoValidadorService
];
}
if ($hayYaUsado) {
Log::info('[PagoValidador] Todos los emails coincidentes ya fueron usados');
return ['estado' => 'ya_usado', 'correo' => null, 'motivo' => 'correo_ya_aplicado'];
}
Log::info('[PagoValidador] Ningún correo coincidió con los criterios');
return ['estado' => 'no_encontrado', 'correo' => null, 'motivo' => 'sin_coincidencia', 'emails_revisados' => count($correos)];
}