From 65d4155f02848047f782c1502d6235adb91efdb2 Mon Sep 17 00:00:00 2001 From: Lizandro Date: Sun, 19 Jul 2026 15:18:08 +0000 Subject: [PATCH] fix: ya_usado no bloquea a otros usuarios con el mismo monto MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- app/Services/PagoValidadorService.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/Services/PagoValidadorService.php b/app/Services/PagoValidadorService.php index f46014b..e56abf5 100755 --- a/app/Services/PagoValidadorService.php +++ b/app/Services/PagoValidadorService.php @@ -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)]; }