diff --git a/src/Command/CleanDuplicateStatsCommand.php b/src/Command/CleanDuplicateStatsCommand.php index 10522f95..bae9116c 100644 --- a/src/Command/CleanDuplicateStatsCommand.php +++ b/src/Command/CleanDuplicateStatsCommand.php @@ -47,6 +47,7 @@ class CleanDuplicateStatsCommand extends Command } $toDelete = []; + $toKeep = []; foreach ($statsByZone as $zone => $statsList) { if (count($statsList) > 1) { // Trier par date_created (le plus ancien d'abord), puis par id si date absente @@ -64,35 +65,48 @@ class CleanDuplicateStatsCommand extends Command } }); // Garder le premier, supprimer les autres - $toDelete = array_merge($toDelete, array_slice($statsList, 1)); + $toKeep[$zone] = $statsList[0]; + $toDelete[$zone] = array_slice($statsList, 1); } } - if (empty($toDelete)) { + $totalToDelete = array_sum(array_map('count', $toDelete)); + if ($totalToDelete === 0) { $io->success('Aucun doublon trouvé.'); return Command::SUCCESS; } - $io->warning(count($toDelete) . ' objet(s) Stats seraient supprimés.'); - foreach ($toDelete as $stat) { - $io->text(sprintf('Zone: %s | ID: %d | Nom: %s | Créé: %s', - $stat->getZone(), - $stat->getId(), - $stat->getName(), - $stat->getDateCreated() ? $stat->getDateCreated()->format('Y-m-d H:i:s') : 'N/A' + $io->section('Résumé des actions par code INSEE :'); + foreach ($toDelete as $zone => $statsList) { + $io->writeln("Zone INSEE : $zone"); + $statKept = $toKeep[$zone]; + $io->writeln(sprintf(" Gardé : [ID %d] %s | Créé: %s", + $statKept->getId(), + $statKept->getName(), + $statKept->getDateCreated() ? $statKept->getDateCreated()->format('Y-m-d H:i:s') : 'N/A' )); + foreach ($statsList as $stat) { + $io->writeln(sprintf(" Supprimé: [ID %d] %s | Créé: %s", + $stat->getId(), + $stat->getName(), + $stat->getDateCreated() ? $stat->getDateCreated()->format('Y-m-d H:i:s') : 'N/A' + )); + } } + $io->warning($totalToDelete . ' objet(s) Stats seraient supprimés.'); if ($dryRun) { $io->note('Mode dry-run : aucune suppression effectuée.'); return Command::SUCCESS; } - foreach ($toDelete as $stat) { - $this->entityManager->remove($stat); + foreach ($toDelete as $statsList) { + foreach ($statsList as $stat) { + $this->entityManager->remove($stat); + } } $this->entityManager->flush(); - $io->success(count($toDelete) . ' doublon(s) supprimé(s) !'); + $io->success($totalToDelete . ' doublon(s) supprimé(s) !'); return Command::SUCCESS; } } \ No newline at end of file diff --git a/src/Entity/Stats.php b/src/Entity/Stats.php index 21f71e15..a2235e77 100644 --- a/src/Entity/Stats.php +++ b/src/Entity/Stats.php @@ -9,6 +9,8 @@ use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: StatsRepository::class)] +#[ORM\Table(name: 'stats')] +#[ORM\UniqueConstraint(name: 'uniq_stats_zone', columns: ['zone'])] class Stats { #[ORM\Id]