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 @@