89 lines
2.9 KiB
PHP
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;
|
|
}
|
|
}
|