up wiki compare

This commit is contained in:
Tykayn 2025-08-31 17:57:28 +02:00 committed by tykayn
parent d2936d5730
commit 1535cf8ee3
8 changed files with 1036 additions and 79 deletions

View file

@ -2334,8 +2334,74 @@ final class AdminController extends AbstractController
$city = $statsRepo->findOneBy(['zone' => $inseeCode]);
if (!$city) {
$this->addFlash('error', 'Ville non trouvée pour le code INSEE ' . $inseeCode);
return $this->redirectToRoute('app_admin');
// Si aucune stats n'existe, rechercher dans l'API geo.api.gouv.fr
$apiUrl = "https://geo.api.gouv.fr/communes/{$inseeCode}";
$response = @file_get_contents($apiUrl);
if ($response === false) {
$this->addFlash('error', 'Ville non trouvée pour le code INSEE ' . $inseeCode . ' et impossible de récupérer les informations depuis l\'API geo.api.gouv.fr.');
return $this->redirectToRoute('app_admin');
}
$communeData = json_decode($response, true);
if (!$communeData || !isset($communeData['nom'])) {
$this->addFlash('error', 'Aucune commune trouvée avec ce code INSEE dans l\'API geo.api.gouv.fr.');
return $this->redirectToRoute('app_admin');
}
// Créer un nouvel objet Stats avec les données de l'API
$city = new Stats();
$city->setZone($inseeCode)
->setName($communeData['nom'])
->setDateCreated(new \DateTime())
->setDateModified(new \DateTime())
->setKind('osmose_request');
// Ajouter la population si disponible
if (isset($communeData['population'])) {
$city->setPopulation($communeData['population']);
}
// Ajouter les coordonnées si disponibles
if (isset($communeData['centre']) && isset($communeData['centre']['coordinates'])) {
$city->setLon((string)$communeData['centre']['coordinates'][0]);
$city->setLat((string)$communeData['centre']['coordinates'][1]);
} else {
// Si les coordonnées ne sont pas dans la réponse initiale, faire une requête spécifique
try {
$apiUrl = 'https://geo.api.gouv.fr/communes/' . $inseeCode . '?fields=centre';
$response = @file_get_contents($apiUrl);
if ($response !== false) {
$data = json_decode($response, true);
if (isset($data['centre']['coordinates']) && count($data['centre']['coordinates']) === 2) {
$city->setLon((string)$data['centre']['coordinates'][0]);
$city->setLat((string)$data['centre']['coordinates'][1]);
}
}
} catch (\Exception $e) {
// Ignorer les erreurs lors de la récupération des coordonnées
}
}
// Ajouter les codes postaux si disponibles
if (isset($communeData['codesPostaux']) && !empty($communeData['codesPostaux'])) {
$city->setCodesPostaux(implode(',', $communeData['codesPostaux']));
}
// Ajouter le code EPCI si disponible
if (isset($communeData['codeEpci'])) {
$city->setCodeEpci((int)$communeData['codeEpci']);
}
// Ajouter le SIREN si disponible
if (isset($communeData['siren'])) {
$city->setSiren((int)$communeData['siren']);
}
// Ne pas faire de labourage des Places pour cette ville
// Persister l'objet Stats
$this->entityManager->persist($city);
$this->entityManager->flush();
}
// Récupérer le thème sélectionné (par défaut: tous)
@ -2347,11 +2413,86 @@ final class AdminController extends AbstractController
// Récupérer les problèmes Osmose pour cette ville
$osmoseIssues = $this->getOsmoseIssuesForCity($city, $theme);
// Créer un mapping inverse des items Osmose vers les thèmes
$itemToThemeMapping = [];
$themeToItemsMapping = [
'charging_station' => [8410, 8411],
'school' => [8031],
'healthcare' => [8211, 7220, 8331],
'laboratory' => [7240, 8351],
'police' => [8190, 8191],
'defibrillator' => [8370],
'places' => [7240, 8351, 8211, 7220, 8331, 8031],
'restaurants' => [8030, 8031, 8032],
'hotels' => [8040, 8041, 8042],
'tourism' => [8010, 8011, 8012, 8013],
'leisure' => [8050, 8051, 8052],
'transportation' => [4010, 4020, 4030, 4040],
'amenities' => [8080, 8081, 8082],
];
foreach ($themeToItemsMapping as $themeName => $itemIds) {
foreach ($itemIds as $itemId) {
if (!isset($itemToThemeMapping[$itemId])) {
$itemToThemeMapping[$itemId] = [];
}
$itemToThemeMapping[$itemId][] = $themeName;
}
}
// Compter les problèmes par thème
$issuesByTheme = [];
foreach ($themes as $themeKey => $themeLabel) {
$issuesByTheme[$themeKey] = 0;
}
// Ajouter un compteur pour "Autres" (problèmes qui ne correspondent à aucun thème)
$issuesByTheme['other'] = 0;
// Compter les problèmes par niveau de sévérité
$issuesByLevel = [
1 => 0, // Critique
2 => 0, // Important
3 => 0, // Avertissement
];
foreach ($osmoseIssues as $issue) {
// Compter par niveau de sévérité
$level = (int)$issue['level'];
if (isset($issuesByLevel[$level])) {
$issuesByLevel[$level]++;
}
// Compter par thème
$itemId = (int)$issue['item'];
$counted = false;
if (isset($itemToThemeMapping[$itemId])) {
foreach ($itemToThemeMapping[$itemId] as $themeName) {
if (isset($issuesByTheme[$themeName])) {
$issuesByTheme[$themeName]++;
$counted = true;
}
}
}
// Si le problème n'a été compté dans aucun thème, l'ajouter à "Autres"
if (!$counted) {
$issuesByTheme['other']++;
}
}
// Ajouter le libellé pour "Autres"
$themes['other'] = 'Autres problèmes';
return $this->render('admin/osmose_issues_map.html.twig', [
'city' => $city,
'theme' => $theme,
'themes' => $themes,
'osmoseIssues' => $osmoseIssues
'osmoseIssues' => $osmoseIssues,
'issuesByTheme' => $issuesByTheme,
'issuesByLevel' => $issuesByLevel,
'osmoseApiUrl' => 'https://osmose.openstreetmap.fr/fr/map/#zoom=14&lat=' . $city->getLat() . '&lon=' . $city->getLon()
]);
}
@ -2478,20 +2619,33 @@ final class AdminController extends AbstractController
{
// Mapping des thèmes vers les items Osmose
$themeToItemsMapping = [
'places' => [8230, 8240, 8250, 8260], // Commerces et services
'charging_station' => [8410, 8411],
'school' => [8031],
'healthcare' => [8211, 7220, 8331],
'laboratory' => [7240, 8351],
'police' => [8190, 8191],
'defibrillator' => [8370],
'places' => [7240, 8351, 8211, 7220, 8331, 8031],
'restaurants' => [8030, 8031, 8032], // Restaurants et cafés
'hotels' => [8040, 8041, 8042], // Hébergements
'tourism' => [8010, 8011, 8012, 8013], // Tourisme
'leisure' => [8050, 8051, 8052], // Loisirs
'healthcare' => [8060, 8061, 8062], // Santé
'education' => [8070, 8071, 8072], // Éducation
'transportation' => [4010, 4020, 4030, 4040], // Transport
'amenities' => [8080, 8081, 8082], // Équipements
// Si d'autres thèmes sont nécessaires, ajoutez-les ici
];
// Si le thème est 'all' ou n'existe pas dans le mapping, retourner un tableau vide
if ($theme === 'all' || !isset($themeToItemsMapping[$theme])) {
// Si le thème est 'all', retourner tous les items uniques de tous les thèmes
if ($theme === 'all') {
$allItems = [];
foreach ($themeToItemsMapping as $items) {
$allItems = array_merge($allItems, $items);
}
return array_unique($allItems);
}
// Si le thème n'existe pas dans le mapping, retourner un tableau vide
if (!isset($themeToItemsMapping[$theme])) {
return [];
}