diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php
index dc2479ae..c5544155 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 a3d33280..f7b1c258 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;