Files
sirpremiumv2/app/Console/Commands/NormalizeEmails.php
T

89 lines
2.9 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use App\Models\User;
class NormalizeEmails extends Command
{
protected $signature = 'users:normalize-emails {--dry-run : Solo mostrar los correos que serían afectados, sin modificar nada}';
protected $description = 'Normaliza los correos de usuarios: elimina espacios y convierte a minúsculas';
public function handle()
{
$dryRun = $this->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;
}
}