From e71177dee19db31652425fac972920e154e8e990 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Thu, 19 Jun 2025 01:04:44 +0200 Subject: [PATCH] =?UTF-8?q?ajout=20de=20pr=C3=A9cision=20float=20pour=20la?= =?UTF-8?q?t=20lon,=20labourage=20de=20tout=20possible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/AdminController.php | 140 +++++++++++++++++++++++++++-- src/Entity/Place.php | 6 +- 2 files changed, 137 insertions(+), 9 deletions(-) diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index dc2479a..c554415 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/AdminController.php @@ -23,6 +23,135 @@ final class AdminController extends AbstractController } + #[Route('/admin/labourer-toutes-les-zones', name: 'app_admin_labourer_tout')] + public function labourer_tout(): Response + { + + $updateExisting =true; + + $stats_all = $this->entityManager->getRepository(Stats::class)->findAll(); + + echo 'on a trouvé ' . count($stats_all) . ' zones à labourer
'; + + foreach($stats_all as $stats) { + + echo '
on laboure la zone '.$stats->getZone() . ' '; + + $processedCount = 0; + $updatedCount = 0; + $insee_code = $stats->getZone(); + // Vérifier si le code INSEE est un nombre valide + // Vérifier si les stats ont été modifiées il y a moins de 24h + if ($stats->getDateModified() !== null) { + $now = new \DateTime(); + $diff = $now->diff($stats->getDateModified()); + $hours = $diff->h + ($diff->days * 24); + + if ($hours < 24) { + echo 'Stats modifiées il y a moins de 24h - on passe au suivant
'; + continue; + } + } + if (!is_numeric($insee_code) || $insee_code == 'undefined' || $insee_code == '') { + echo 'Code INSEE invalide : ' . $insee_code . ' - on passe au suivant
'; + continue; + } + + $places_overpass = $this->motocultrice->labourer($stats->getZone()); + $places = $places_overpass; + foreach ($places as $placeData) { + + + // Vérifier si le lieu existe déjà + $existingPlace = $this->entityManager->getRepository(Place::class) + ->findOneBy(['osmId' => $placeData['id']]); + + if (!$existingPlace) { + $place = new Place(); + $place->setOsmId($placeData['id']) + ->setOsmKind($placeData['type']) + ->setZipCode($insee_code) + ->setUuidForUrl($this->motocultrice->uuid_create()) + ->setModifiedDate(new \DateTime()) + ->setStats($stats) + ->setDead(false) + ->setOptedOut(false) + ->setMainTag($this->motocultrice->find_main_tag($placeData['tags']) ?? '') + ->setStreet($this->motocultrice->find_street($placeData['tags']) ?? '') + ->setHousenumber($this->motocultrice->find_housenumber($placeData['tags']) ?? '') + ->setSiret($this->motocultrice->find_siret($placeData['tags']) ?? '') + ->setAskedHumainsSupport(false) + ->setLastContactAttemptDate(null) + ->setNote('') + ->setPlaceCount(0); + + // Mettre à jour les données depuis Overpass + $place->update_place_from_overpass_data($placeData); + + $this->entityManager->persist($place); + $stats->addPlace($place); + $processedCount++; + } elseif ($updateExisting) { + // Mettre à jour les données depuis Overpass uniquement si updateExisting est true + $existingPlace->update_place_from_overpass_data($placeData); + $this->entityManager->persist($existingPlace); + $updatedCount++; + } + } + // mettre à jour les stats + // Récupérer tous les commerces de la zone + $commerces = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $insee_code]); + + // Récupérer les stats existantes pour la zone + $stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $insee_code]); + if(!$stats) { + $stats = new Stats(); + $stats->setZone($insee_code); + } + + $urls = $stats->getAllCTCUrlsMap(); + + $statsHistory = $this->entityManager->getRepository(StatsHistory::class) + ->createQueryBuilder('sh') + ->where('sh.stats = :stats') + ->setParameter('stats', $stats) + ->orderBy('sh.id', 'DESC') + ->setMaxResults(365) + ->getQuery() + ->getResult(); + + // Calculer les statistiques + $calculatedStats = $this->motocultrice->calculateStats($commerces); + + // Mettre à jour les stats pour la zone donnée + $stats->setPlacesCount($calculatedStats['places_count']); + $stats->setAvecHoraires($calculatedStats['counters']['avec_horaires']); + $stats->setAvecAdresse($calculatedStats['counters']['avec_adresse']); + $stats->setAvecSite($calculatedStats['counters']['avec_site']); + $stats->setAvecAccessibilite($calculatedStats['counters']['avec_accessibilite']); + $stats->setAvecNote($calculatedStats['counters']['avec_note']); + $stats->setCompletionPercent($calculatedStats['completion_percent']); + + // Associer les stats à chaque commerce + foreach ($commerces as $commerce) { + $commerce->setStats($stats); + $this->entityManager->persist($commerce); + } + + $stats->computeCompletionPercent(); + $this->entityManager->persist($stats); + + } + + $this->entityManager->flush(); + + $this->entityManager->flush(); + + $this->addFlash('success', 'Labourage des ' . count($stats_all) . ' zones terminé avec succès.'); + return $this->redirectToRoute('app_public_dashboard'); + + } + #[Route('/admin', name: 'app_admin')] public function index(): Response { @@ -39,6 +168,11 @@ final class AdminController extends AbstractController // Récupérer les stats existantes pour la zone $stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $insee_code]); + if(!$stats) { + $stats = new Stats(); + $stats->setZone($insee_code); + } + $urls = $stats->getAllCTCUrlsMap(); $statsHistory = $this->entityManager->getRepository(StatsHistory::class) @@ -50,12 +184,6 @@ final class AdminController extends AbstractController ->getQuery() ->getResult(); - - if(!$stats) { - $stats = new Stats(); - $stats->setZone($insee_code); - } - // Calculer les statistiques $calculatedStats = $this->motocultrice->calculateStats($commerces); diff --git a/src/Entity/Place.php b/src/Entity/Place.php index a3d3328..f7b1c25 100644 --- a/src/Entity/Place.php +++ b/src/Entity/Place.php @@ -86,10 +86,10 @@ class Place private ?\DateTime $displayed_date = null; #[ORM\Column(nullable: true)] - private ?int $lat = null; + private ?float $lat = null; - #[ORM\Column(nullable: true)] - private ?int $lon = null; + #[ORM\Column(nullable: true, type: Types::FLOAT)] + private ?float $lon = null; #[ORM\Column(length: 255, nullable: true)] private ?string $street = null;