From 95d07269f2470ad82347dd3357932697842dddec Mon Sep 17 00:00:00 2001 From: Juan Felipe Duarte Date: Mon, 2 Mar 2026 14:31:42 -0500 Subject: [PATCH] Comando para normalizar correos --- app/Console/Commands/NormalizeEmails.php | 88 ++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 app/Console/Commands/NormalizeEmails.php diff --git a/app/Console/Commands/NormalizeEmails.php b/app/Console/Commands/NormalizeEmails.php new file mode 100644 index 0000000..5a9c31b --- /dev/null +++ b/app/Console/Commands/NormalizeEmails.php @@ -0,0 +1,88 @@ +option('dry-run'); + + if ($dryRun) { + $this->warn('MODO DRY-RUN: No se harán cambios en la base de datos.'); + $this->newLine(); + } + + // Buscar usuarios cuyo email tenga espacios o mayúsculas + $users = User::all()->filter(function ($user) { + $normalized = strtolower(trim($user->email)); + return $normalized !== $user->email; + }); + + if ($users->isEmpty()) { + $this->info('No se encontraron correos que necesiten normalización.'); + return Command::SUCCESS; + } + + $this->info("Se encontraron {$users->count()} correo(s) para normalizar:"); + $this->newLine(); + + $headers = ['ID', 'Nombre', 'Email actual', 'Email normalizado']; + $rows = []; + + foreach ($users as $user) { + $normalized = strtolower(trim($user->email)); + $rows[] = [$user->id, $user->name, "'{$user->email}'", $normalized]; + } + + $this->table($headers, $rows); + $this->newLine(); + + if ($dryRun) { + $this->warn('Dry-run completado. Corre sin --dry-run para aplicar los cambios.'); + return Command::SUCCESS; + } + + if (!$this->confirm("¿Deseas aplicar estos cambios?", false)) { + $this->info('Operación cancelada.'); + return Command::SUCCESS; + } + + $updated = 0; + $skipped = 0; + + DB::transaction(function () use ($users, &$updated, &$skipped) { + foreach ($users as $user) { + $normalized = strtolower(trim($user->email)); + + // Verificar que no exista ya otro usuario con ese email normalizado + $conflict = User::where('email', $normalized) + ->where('id', '!=', $user->id) + ->first(); + + if ($conflict) { + $this->error(" OMITIDO - ID {$user->id} ({$user->email}): ya existe otro usuario con '{$normalized}' (ID {$conflict->id})"); + $skipped++; + continue; + } + + $user->email = $normalized; + $user->save(); + $this->line(" Actualizado ID {$user->id}: → {$normalized}"); + $updated++; + } + }); + + $this->newLine(); + $this->info("Completado: {$updated} actualizado(s), {$skipped} omitido(s) por conflicto."); + + return Command::SUCCESS; + } +}