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; } }