diff --git a/src/Command/RegenerateFollowupsCommand.php b/src/Command/RegenerateFollowupsCommand.php new file mode 100644 index 00000000..512aac62 --- /dev/null +++ b/src/Command/RegenerateFollowupsCommand.php @@ -0,0 +1,109 @@ +addArgument('insee_code', InputArgument::REQUIRED, 'Code INSEE de la ville') + ->addOption('delete-existing', 'd', InputOption::VALUE_NONE, 'Supprimer les followups existants avant de régénérer') + ->addOption('disable-cleanup', 'c', InputOption::VALUE_NONE, 'Désactiver le nettoyage des followups redondants') + ->setHelp('Cette commande régénère les followups pour une ville avec les nouveaux critères de completion.') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + $inseeCode = $input->getArgument('insee_code'); + $deleteExisting = $input->getOption('delete-existing'); + $disableCleanup = $input->getOption('disable-cleanup'); + + $io->title('Régénération des followups pour ' . $inseeCode); + + // Vérifier que la ville existe + $stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $inseeCode]); + if (!$stats) { + $io->error('Aucune stats trouvée pour le code INSEE ' . $inseeCode); + return Command::FAILURE; + } + + $io->info('Ville trouvée : ' . $stats->getName()); + + // Supprimer les followups existants si demandé + if ($deleteExisting) { + $io->section('Suppression des followups existants'); + $followups = $stats->getCityFollowUps(); + $count = count($followups); + + foreach ($followups as $followup) { + $this->entityManager->remove($followup); + } + $this->entityManager->flush(); + + $io->success($count . ' followups supprimés'); + } + + // Régénérer les followups + $io->section('Régénération des followups'); + $io->note('Utilisation des nouveaux critères de completion plus réalistes'); + + try { + $this->followUpService->generateCityFollowUps( + $stats, + $this->motocultrice, + $this->entityManager, + $disableCleanup + ); + + $io->success('Followups régénérés avec succès'); + + // Afficher les résultats + $newFollowups = $stats->getCityFollowUps(); + $io->section('Résultats'); + + $table = []; + foreach ($newFollowups as $followup) { + $table[] = [ + $followup->getName(), + $followup->getMeasure(), + $followup->getDate()->format('Y-m-d H:i:s') + ]; + } + + $io->table(['Nom', 'Valeur', 'Date'], $table); + + } catch (\Exception $e) { + $io->error('Erreur lors de la régénération : ' . $e->getMessage()); + return Command::FAILURE; + } + + return Command::SUCCESS; + } +} \ No newline at end of file diff --git a/src/Service/FollowUpService.php b/src/Service/FollowUpService.php index 44564b79..6a472228 100644 --- a/src/Service/FollowUpService.php +++ b/src/Service/FollowUpService.php @@ -96,47 +96,93 @@ class FollowUpService $completed = []; if ($type === 'fire_hydrant') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['ref'] ?? null); + $tags = $el['tags'] ?? []; + // Considérer comme complet si au moins un critère supplémentaire est rempli + return !empty($tags['ref'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null) + || !empty($tags['colour'] ?? null); }); } elseif ($type === 'charging_station') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['charging_station:output'] ?? null) && !empty($el['tags']['capacity'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['charging_station:output'] ?? null) + || !empty($tags['capacity'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'toilets') { $completed = array_filter($data['objects'], function($el) { - return ($el['tags']['wheelchair'] ?? null) === 'yes'; + $tags = $el['tags'] ?? []; + return ($tags['wheelchair'] ?? null) === 'yes' + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null) + || !empty($tags['access'] ?? null); }); } elseif ($type === 'bus_stop') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['shelter'] ?? null); + $tags = $el['tags'] ?? []; + // Considérer comme complet si au moins un de ces critères est rempli + return !empty($tags['shelter'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null) + || !empty($tags['network'] ?? null); }); } elseif ($type === 'defibrillator') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['indoor'] ?? null); + $tags = $el['tags'] ?? []; + // Considérer comme complet si au moins un de ces critères est rempli + return !empty($tags['indoor'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null) + || !empty($tags['access'] ?? null); }); } elseif ($type === 'camera') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['surveillance:type'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['surveillance:type'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'recycling') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['recycling_type'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['recycling_type'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'substation') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['substation'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['substation'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'laboratory') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['website'] ?? null) || !empty($el['tags']['contact:website'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['website'] ?? null) + || !empty($tags['contact:website'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['phone'] ?? null); }); } elseif ($type === 'school') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['ref:UAI'] ?? null) && !empty($el['tags']['isced:level'] ?? null) && !empty($el['tags']['school:FR'] ?? null); + $tags = $el['tags'] ?? []; + // Considérer comme complet si au moins un de ces critères est rempli + return !empty($tags['ref:UAI'] ?? null) + || !empty($tags['isced:level'] ?? null) + || !empty($tags['school:FR'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'police') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['phone'] ?? null) || !empty($el['tags']['website'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['phone'] ?? null) + || !empty($tags['website'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'healthcare') { $completed = array_filter($data['objects'], function($el) { @@ -145,40 +191,69 @@ class FollowUpService || !empty($tags['contact:phone'] ?? null) || !empty($tags['phone'] ?? null) || !empty($tags['email'] ?? null) - || !empty($tags['contact:email'] ?? null); + || !empty($tags['contact:email'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'bicycle_parking') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['capacity'] ?? null) || !empty($el['tags']['covered'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['capacity'] ?? null) + || !empty($tags['covered'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'advertising_board') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['operator'] ?? null) || !empty($el['tags']['contact:phone'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['operator'] ?? null) + || !empty($tags['contact:phone'] ?? null) + || !empty($tags['name'] ?? null); }); } elseif ($type === 'building') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['name'] ?? null) || !empty($el['tags']['ref'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['name'] ?? null) + || !empty($tags['ref'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'email') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['name'] ?? null) || !empty($el['tags']['phone'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['name'] ?? null) + || !empty($tags['phone'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'bench') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['material'] ?? null) || !empty($el['tags']['backrest'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['material'] ?? null) + || !empty($tags['backrest'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'waste_basket') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['waste'] ?? null) || !empty($el['tags']['recycling_type'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['waste'] ?? null) + || !empty($tags['recycling_type'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'street_lamp') { $completed = array_filter($data['objects'], function($el) { - return !empty($el['tags']['lamp_type'] ?? null) || !empty($el['tags']['height'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['lamp_type'] ?? null) + || !empty($tags['height'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'drinking_water') { $completed = array_filter($data['objects'], function($el) { - // Complet si le tag "covered" ou "ref" est présent - return !empty($el['tags']['covered'] ?? null) || !empty($el['tags']['ref'] ?? null); + $tags = $el['tags'] ?? []; + return !empty($tags['covered'] ?? null) + || !empty($tags['ref'] ?? null) + || !empty($tags['name'] ?? null) + || !empty($tags['operator'] ?? null); }); } elseif ($type === 'tree') { $completed = array_filter($data['objects'], function($el) { diff --git a/templates/public/nav.html.twig b/templates/public/nav.html.twig index f2f729be..1c2d81bd 100644 --- a/templates/public/nav.html.twig +++ b/templates/public/nav.html.twig @@ -1,65 +1,46 @@ \ No newline at end of file +