ajout de ville sans labourage par défaut

This commit is contained in:
Tykayn 2025-08-21 11:56:02 +02:00 committed by tykayn
parent 6f4e6a6810
commit 359d4ba6b8
5 changed files with 201 additions and 4 deletions

View file

@ -859,6 +859,84 @@ class PublicController extends AbstractController
'controller_name' => 'PublicController',
]);
}
/**
* Ajoute une ville sans déclencher le labourage et redirige vers la page thématique des lieux
*/
#[Route('/add-city-without-labourage/{insee_code}', name: 'app_public_add_city_without_labourage')]
public function addCityWithoutLabourage(string $insee_code): Response
{
$this->actionLogger->log('add_city_without_labourage', ['insee_code' => $insee_code]);
// Vérifier si le code INSEE est valide (composé uniquement de chiffres)
if (!ctype_digit($insee_code) || $insee_code == 'undefined' || $insee_code == '') {
$this->addFlash('error', 'Code INSEE invalide : il doit être composé uniquement de chiffres.');
$this->actionLogger->log('ERROR_add_city_without_labourage_bad_insee', ['insee_code' => $insee_code]);
return $this->redirectToRoute('app_public_index');
}
// Récupérer ou créer l'objet Stats
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $insee_code]);
if (!$stats) {
$stats = new Stats();
$stats->setZone($insee_code);
$stats->setKind('request'); // Set the kind to 'request' as it's created from a user request
}
// Compléter le nom si manquant
if (!$stats->getName()) {
$cityName = $this->motocultrice->get_city_osm_from_zip_code($insee_code);
if ($cityName) {
$stats->setName($cityName);
}
}
// Compléter la population si manquante
if (!$stats->getPopulation()) {
try {
$apiUrl = 'https://geo.api.gouv.fr/communes/' . $insee_code;
$response = @file_get_contents($apiUrl);
if ($response !== false) {
$data = json_decode($response, true);
if (isset($data['population'])) {
$stats->setPopulation((int)$data['population']);
}
}
} catch (\Exception $e) {
// Ignorer les erreurs
}
}
// Compléter les lieux d'intérêt si manquants (lat/lon)
if (!$stats->getLat() || !$stats->getLon()) {
// On tente de récupérer le centre de la ville via l'API geo.gouv.fr
try {
$apiUrl = 'https://geo.api.gouv.fr/communes/' . $insee_code . '?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) {
$stats->setLon((string)$data['centre']['coordinates'][0]);
$stats->setLat((string)$data['centre']['coordinates'][1]);
}
}
} catch (\Exception $e) {
// Ignorer les erreurs
}
}
// Sauvegarder l'objet Stats
$stats->computeCompletionPercent();
$this->entityManager->persist($stats);
$this->entityManager->flush();
// Rediriger vers la page thématique des lieux
return $this->redirectToRoute('admin_followup_theme_graph', [
'insee_code' => $insee_code,
'theme' => 'places'
]);
}
#[Route('/stats/{insee_code}/followup-graph/{theme}', name: 'app_public_followup_graph', requirements: ['insee_code' => '\\d+', 'theme' => '[a-zA-Z0-9_]+'])]
public function publicFollowupGraph(string $insee_code, string $theme): Response
@ -875,6 +953,37 @@ class PublicController extends AbstractController
return $this->redirectToRoute('app_public_index');
}
// Vérifier si des mesures ont été enregistrées aujourd'hui
$today = new \DateTime();
$today->setTime(0, 0, 0); // Début de la journée
$hasRecentMeasurements = false;
foreach ($stats->getCityFollowUps() as $fu) {
if ($fu->getName() === $theme . '_count' || $fu->getName() === $theme . '_completion') {
$measureDate = clone $fu->getDate();
$measureDate->setTime(0, 0, 0);
if ($measureDate >= $today) {
$hasRecentMeasurements = true;
break;
}
}
}
// Si aucune mesure récente n'existe, générer de nouvelles mesures
if (!$hasRecentMeasurements) {
$this->actionLogger->log('generate_measurements_on_graph_view', [
'insee_code' => $insee_code,
'theme' => $theme
]);
// Générer les mesures pour tous les thèmes
$this->followUpService->generateCityFollowUps($stats, $this->motocultrice, $this->entityManager, true);
$this->entityManager->flush();
// Re-fetch the Stats entity to ensure it's managed by the EntityManager
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $insee_code]);
}
// Récupérer toutes les données de followup pour ce thème
$followups = $stats->getCityFollowUps();
$countData = [];