From 738f3eeb9d461ac4496af37bf8a7af512875a05c Mon Sep 17 00:00:00 2001 From: Tykayn Date: Wed, 26 Nov 2025 00:57:57 +0100 Subject: [PATCH] =?UTF-8?q?section=20zoneplaces=20sur=20infos=20g=C3=A9n?= =?UTF-8?q?=C3=A9rales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/AdminController.php | 101 ++++++++++++ src/Controller/PublicController.php | 52 +++++- templates/admin/stats.html.twig | 156 ++++++++++++++++++ .../public/zone_places_history.html.twig | 151 ++++++++++++++++- 4 files changed, 455 insertions(+), 5 deletions(-) diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index 9f8b8818..bb41981a 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/AdminController.php @@ -677,6 +677,103 @@ final class AdminController extends AbstractController } unset($points); + // Préparer les données pour le graphique d'activité récente (ZonePlaces) + $chartData = [ + 'dates' => [], + 'deletions' => [], + 'creations' => [], + 'completion' => [] + ]; + + $zonePlaces = $stats->getZonePlaces(); + $changesByDate = []; + $thirtyDaysAgo = new \DateTime('-30 days'); + + foreach ($zonePlaces as $zp) { + $theme = $zp->getTheme(); + + // Traiter les suppressions + $disappearedList = $zp->getDisappearedList() ?? []; + if (is_array($disappearedList)) { + foreach ($disappearedList as $obj) { + if (isset($obj['noticed_deleted_date'])) { + $date = substr($obj['noticed_deleted_date'], 0, 10); + if (!isset($changesByDate[$date])) { + $changesByDate[$date] = ['deletions' => [], 'creations' => []]; + } + if (!isset($changesByDate[$date]['deletions'][$theme])) { + $changesByDate[$date]['deletions'][$theme] = []; + } + $changesByDate[$date]['deletions'][$theme][] = $obj; + } + } + } + + // Traiter les créations/modifications récentes + $currentList = $zp->getCurrentList() ?? []; + if (is_array($currentList)) { + foreach ($currentList as $obj) { + if (isset($obj['timestamp'])) { + try { + $timestamp = new \DateTime($obj['timestamp']); + if ($timestamp >= $thirtyDaysAgo) { + $date = $timestamp->format('Y-m-d'); + if (!isset($changesByDate[$date])) { + $changesByDate[$date] = ['deletions' => [], 'creations' => []]; + } + if (!isset($changesByDate[$date]['creations'][$theme])) { + $changesByDate[$date]['creations'][$theme] = []; + } + $changesByDate[$date]['creations'][$theme][] = $obj; + } + } catch (\Exception $e) { + // Ignorer les timestamps invalides + } + } + } + } + } + + // Créer une copie triée par date croissante pour le graphique + $changesByDateSorted = $changesByDate; + ksort($changesByDateSorted); + + // Compter les créations et suppressions par jour + foreach ($changesByDateSorted as $date => $changes) { + $chartData['dates'][] = $date; + $deletionsCount = 0; + $creationsCount = 0; + + if (isset($changes['deletions'])) { + foreach ($changes['deletions'] as $theme => $objects) { + $deletionsCount += count($objects); + } + } + + if (isset($changes['creations'])) { + foreach ($changes['creations'] as $theme => $objects) { + $creationsCount += count($objects); + } + } + + $chartData['deletions'][] = $deletionsCount; + $chartData['creations'][] = $creationsCount; + } + + // Récupérer les données de complétion générale de la ville si disponibles + $completionByDate = []; + foreach ($followups as $fu) { + if ($fu->getName() === 'places_completion') { + $date = $fu->getDate()->format('Y-m-d'); + $completionByDate[$date] = $fu->getMeasure(); + } + } + + // Aligner les données de complétion avec les dates du graphique + foreach ($chartData['dates'] as $date) { + $chartData['completion'][] = $completionByDate[$date] ?? null; + } + return $this->render('admin/stats.html.twig', [ 'stats' => $stats, 'commerces' => $commerces, @@ -699,6 +796,7 @@ final class AdminController extends AbstractController 'averageUpdateDate' => $averageUpdateDate, 'daysSinceUpdate' => $daysSinceUpdate, 'theme_groups' => $theme_groups, + 'chart_data' => $chartData, ]); } @@ -1139,6 +1237,9 @@ final class AdminController extends AbstractController // Compléter le nom si manquant if (!$stats->getName()) { $cityName = $this->motocultrice->get_city_osm_from_zip_code($insee_code); + if($insee_code == '91477'){ + $cityName = 'Palaiseau'; + } if ($cityName) { $stats->setName($cityName); } diff --git a/src/Controller/PublicController.php b/src/Controller/PublicController.php index 727afea4..12d79003 100644 --- a/src/Controller/PublicController.php +++ b/src/Controller/PublicController.php @@ -1560,19 +1560,69 @@ class PublicController extends AbstractController } } - // Trier par date décroissante + // Trier par date décroissante pour l'affichage krsort($changesByDate); // Trier les utilisateurs uniques par ordre alphabétique $uniqueUsersList = array_keys($uniqueUsers); sort($uniqueUsersList); + // Préparer les données pour le graphique (groupées par jour, triées par ordre chronologique) + $chartData = [ + 'dates' => [], + 'deletions' => [], + 'creations' => [], + 'completion' => [] + ]; + + // Créer une copie triée par date croissante pour le graphique + $changesByDateSorted = $changesByDate; + ksort($changesByDateSorted); + + // Compter les créations et suppressions par jour + foreach ($changesByDateSorted as $date => $changes) { + $chartData['dates'][] = $date; + $deletionsCount = 0; + $creationsCount = 0; + + if (isset($changes['deletions'])) { + foreach ($changes['deletions'] as $theme => $objects) { + $deletionsCount += count($objects); + } + } + + if (isset($changes['creations'])) { + foreach ($changes['creations'] as $theme => $objects) { + $creationsCount += count($objects); + } + } + + $chartData['deletions'][] = $deletionsCount; + $chartData['creations'][] = $creationsCount; + } + + // Récupérer les données de complétion générale de la ville si disponibles + $followups = $stats->getCityFollowUps(); + $completionByDate = []; + foreach ($followups as $fu) { + if ($fu->getName() === 'places_completion') { + $date = $fu->getDate()->format('Y-m-d'); + $completionByDate[$date] = $fu->getMeasure(); + } + } + + // Aligner les données de complétion avec les dates du graphique + foreach ($chartData['dates'] as $date) { + $chartData['completion'][] = $completionByDate[$date] ?? null; + } + return $this->render('public/zone_places_history.html.twig', [ 'stats' => $stats, 'changesByDate' => $changesByDate, 'followup_labels' => $followupLabels, 'followup_icons' => $followupIcons, 'unique_users' => $uniqueUsersList, + 'chart_data' => $chartData, ]); } diff --git a/templates/admin/stats.html.twig b/templates/admin/stats.html.twig index ca7ef263..361573e5 100644 --- a/templates/admin/stats.html.twig +++ b/templates/admin/stats.html.twig @@ -210,6 +210,36 @@

Graphiques

+ + + + {# Graphique d'activité récente #} + {% if chart_data is defined and chart_data.dates|length > 0 %} +
+
+
Activité récente (créations et suppressions)
+
+
+ +
+
+ {% endif %} + +
Données OpenStreetMap
+ +
+ {% if stats.population %}
@@ -1417,4 +1450,127 @@ }); }); + {% endblock %} diff --git a/templates/public/zone_places_history.html.twig b/templates/public/zone_places_history.html.twig index e7ad6f6e..1959a31c 100644 --- a/templates/public/zone_places_history.html.twig +++ b/templates/public/zone_places_history.html.twig @@ -86,6 +86,18 @@
+ {# Graphique des créations et suppressions #} + {% if chart_data is defined and chart_data.dates|length > 0 %} +
+
+
Évolution des créations et suppressions
+
+
+ +
+
+ {% endif %} + {% for date, changes in changesByDate %}
@@ -281,6 +293,8 @@ {% block javascripts %} {{ parent() }} + +