src/Controller/Api/AdresseIncomming/AdresseIncommingHierarchyController.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api\AdresseIncomming;
  3. use DateTime;
  4. use App\Service\HierarchyService;
  5. use App\Repository\UserRepository;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Symfony\Component\HttpKernel\KernelInterface;
  9. use App\Repository\NmdAdressesIncommingRepository;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. class AdresseIncommingHierarchyController extends AbstractController
  13. {
  14.     private $adresseRepository;
  15.     private $userRepository;
  16.     private $hierarchyService;
  17.     public function __construct(
  18.         NmdAdressesIncommingRepository $adresseRepository,
  19.         UserRepository $userRepository,
  20.         HierarchyService $hierarchyService
  21.     ) {
  22.         $this->adresseRepository $adresseRepository;
  23.         $this->userRepository $userRepository;
  24.         $this->hierarchyService $hierarchyService;
  25.     }
  26.     public function __invoke(int $idUserKernelInterface $kernelRequest $request): JsonResponse
  27.     {
  28.         $user $this->userRepository->find($idUser);
  29.         if (!$user) {
  30.             return new JsonResponse(['error' => 'Utilisateur introuvable'], 404);
  31.         }
  32.         $userRoles $user->getRoles();
  33.         $cpv $request->query->get('cpv');
  34.         $migrable strtoupper($request->query->get('migrable''NON')) === 'OUI';
  35.         // Cas sans cpv et utilisateur avec rôle organisation
  36.         if (!$cpv && in_array('ROLE_ORGANISATION'$userRoles)) {
  37.             $data $migrable
  38.                 $this->adresseRepository->getGlobalHierarchyMigrable()
  39.                 : $this->adresseRepository->getGlobalHierarchy();
  40.             return new JsonResponse($data ?? [], 200);
  41.         }
  42.         // Cas avec rôles manager/director/seller
  43.         if ($this->hasManagementRole($userRoles)) {
  44.             return $this->handleManagerData($idUser$kernel$request$migrable);
  45.         }
  46.         // Cas avec cpv
  47.         return $this->handleHierarchyData($kernel$request$cpv$migrable);
  48.     }
  49.     private function hasManagementRole(array $roles): bool
  50.     {
  51.         $managementRoles = ['ROLE_MANAGER''ROLE_DIRECTOR''ROLE_SELLER'];
  52.         return !empty(array_intersect($managementRoles$roles));
  53.     }
  54.     private function handleManagerData(int $idUserKernelInterface $kernelRequest $requestbool $migrable): JsonResponse
  55.     {
  56.         $userIds array_unique(array_merge(
  57.             [$idUser],
  58.             array_map(fn($p) => (int) $p['id'], $this->hierarchyService->getHierarchyDescendante($idUser))
  59.         ));
  60.         $cpv $request->query->get('cpv');
  61.         $baseDir $kernel->getProjectDir() . "/fileAttached/geo_map/prises_neuves/{$cpv}/distributed_by_user";
  62.         $codeCluster $request->query->get('codeCluster');
  63.         $codeInsee $request->query->get('codeInsee');
  64.         if ($codeCluster && $codeInsee) {
  65.             $semaine $request->query->get('semaine');
  66.             return new JsonResponse(
  67.                 $this->mergeDistributedVoiesFiles($userIds$baseDir$codeCluster$codeInsee$semaine$migrable),
  68.                 200
  69.             );
  70.         }
  71.         return new JsonResponse($this->mergeDistributedClusters($userIds$baseDir$migrable), 200);
  72.     }
  73.     private function handleHierarchyData(KernelInterface $kernelRequest $requeststring $cpvbool $migrable): JsonResponse
  74.     {
  75.         $baseDir $kernel->getProjectDir() . "/fileAttached/geo_map/prises_neuves/{$cpv}";
  76.         $hierarchyFile $migrable
  77.             "$baseDir/migrables/hierarchy_cluster_city_migrable.json"
  78.             "$baseDir/hierarchy_clusters_cities.json";
  79.         if (!file_exists($hierarchyFile)) {
  80.             return new JsonResponse(['error' => "Fichier hiérarchie introuvable"], 200);
  81.         }
  82.         $jsonData json_decode(file_get_contents($hierarchyFile), true);
  83.         if (empty($jsonData)) {
  84.             return new JsonResponse(['error' => "Fichier hiérarchie vide ou invalide"], 200);
  85.         }
  86.         $semaine $request->query->get('semaine');
  87.         if (!$semaine) {
  88.             return new JsonResponse($jsonData200);
  89.         }
  90.         return $this->filterByHierarchy($jsonData$request$kernel$cpv$migrable);
  91.     }
  92.     private function filterByHierarchy(array $jsonDataRequest $requestKernelInterface $kernelstring $cpvbool $migrable): JsonResponse
  93.     {
  94.         $semaine $request->query->get('semaine');
  95.         $jour $request->query->get('date');
  96.         $codeCluster $request->query->get('codeCluster');
  97.         $codeInsee $request->query->get('codeInsee');
  98.         $anneeActuelle = (new \DateTimeImmutable())->format('Y');
  99.         // Récupération des voies si codeCluster & codeInsee & semaine existent
  100.         if ($codeCluster && $codeInsee && $semaine) {
  101.             $baseDir $kernel->getProjectDir() . "/fileAttached/geo_map/prises_neuves/{$cpv}";
  102.             $hierarchyFile $migrable
  103.                 "$baseDir/migrables/voies/{$anneeActuelle}/S{$semaine}/{$codeCluster}/{$codeInsee}/liste_voies.json"
  104.                 "$baseDir/voies/{$anneeActuelle}/S{$semaine}/{$codeCluster}/{$codeInsee}/liste_voies.json";
  105.             if (!file_exists($hierarchyFile)) {
  106.                 return new JsonResponse(['error' => "Fichier des voies introuvable"], 200);
  107.             }
  108.             $voiesData json_decode(file_get_contents($hierarchyFile), true);
  109.             if (empty($voiesData)) {
  110.                 return new JsonResponse(['error' => "Fichier des voies vide ou invalide"], 200);
  111.             }
  112.             return new JsonResponse($voiesData200);
  113.         } else {
  114.             //Filter v1 
  115.             $semaines array_values(array_filter($jsonData, fn($s) => ($s['numero_semaine'] ?? null) == $semaine));
  116.             if (empty($semaines)) {
  117.                 return new JsonResponse([], 200);
  118.             }
  119.             if (!$jour) {
  120.                 return new JsonResponse($semaines200);
  121.             }
  122.             $jours = [];
  123.             foreach ($semaines as $sem) {
  124.                 $filteredDays array_values(array_filter($sem['jours'] ?? [], fn($d) => ($d['date_jour'] ?? null) === $jour));
  125.                 $jours array_merge($jours$filteredDays);
  126.             }
  127.             if (empty($jours)) {
  128.                 return new JsonResponse([], 200);
  129.             }
  130.             if (!$codeCluster) {
  131.                 return new JsonResponse($jours200);
  132.             }
  133.             $clusters = [];
  134.             foreach ($jours as $day) {
  135.                 $filteredClusters array_values(array_filter($day['clusters'] ?? [], fn($c) => ($c['clusterCode'] ?? null) === $codeCluster));
  136.                 $clusters array_merge($clusters$filteredClusters);
  137.             }
  138.             if (empty($clusters)) {
  139.                 return new JsonResponse([], 200);
  140.             }
  141.             if (!$codeInsee) {
  142.                 return new JsonResponse($clusters[0], 200);
  143.             }
  144.             // Si on arrive ici, on retourne la ville trouvée
  145.             $villes = [];
  146.             foreach ($clusters as $cluster) {
  147.                 $filteredVilles array_values(array_filter($cluster['villes'] ?? [], fn($v) => ($v['cod_insee'] ?? null) == $codeInsee));
  148.                 $villes array_merge($villes$filteredVilles);
  149.             }
  150.             return new JsonResponse($villes[0] ?? [], 200);
  151.         }
  152.     }
  153.     private function mergeDistributedClusters(array $userIdsstring $baseDirbool $isMigrable): array
  154.     {
  155.         $subdir $isMigrable 'distributed_hierarchy_cluster_city_migrable.json' 'distributed_hierarchy_cluster_city.json';
  156.         foreach ($userIds as $uid) {
  157.             $file "{$baseDir}/{$uid}/{$subdir}";
  158.             if (!file_exists($file)) continue;
  159.             $data json_decode(file_get_contents($file), true);
  160.             if (is_array($data)) {
  161.                 return $data;
  162.             }
  163.         }
  164.         return [];
  165.     }
  166.     private function mergeDistributedVoiesFiles(array $userIdsstring $baseDirstring $codeClusterstring $codeInsee, ?int $semainebool $isMigrable): array
  167.     {
  168.         $subdir $isMigrable 'voies_migrable' 'voies';
  169.         foreach ($userIds as $uid) {
  170.             $file "{$baseDir}/{$subdir}/{$uid}/semaine_{$semaine}/{$codeCluster}/{$codeInsee}/liste_voies.json";
  171.             if (!file_exists($file)) continue;
  172.             $data json_decode(file_get_contents($file), true);
  173.             if (is_array($data)) {
  174.                 return $data;
  175.             }
  176.         }
  177.         return [];
  178.     }
  179.     /**
  180.      * @Route("/api/adresses-incomming-streets/{idUser}", name="api_get_adresse_incoming_streets_from_json", methods={"GET"})
  181.      */
  182.     public function getAdressesIncomingStreetsFromJson(int $idUserKernelInterface $kernelRequest $request): JsonResponse
  183.     {
  184.         $migrable    strtoupper($request->query->get('migrable''NON'));
  185.         $cpv         $request->query->get('cpv'null);
  186.         $semaine $request->query->get('semaine'null);
  187.         $jour $request->query->get('date'null);
  188.         $codeCluster $request->query->get('codeCluster'null);
  189.         $codeInsee   $request->query->get('codeInsee'null);
  190.         $projectDir  $kernel->getProjectDir();
  191.         $anneeActuelle = (new \DateTimeImmutable())->format('Y');
  192.         $result = []; // Initialisation de la variable résultat
  193.         $user $this->userRepository->find($idUser);
  194.         if (!$user) {
  195.             $result = ['error' => 'Utilisateur introuvable'];
  196.             return new JsonResponse($result404);
  197.         }
  198.         if (!$cpv) {
  199.             $result = ['error' => 'CPV manquant'];
  200.             return new JsonResponse($result400);
  201.         }
  202.         $baseDir "$projectDir/fileAttached/geo_map/prises_neuves/{$cpv}";
  203.         if ($codeCluster && $codeInsee) {
  204.             $voiesFile $migrable === 'OUI'
  205.                 "$baseDir/migrables/voies/$anneeActuelle/$semaine/$jour/$codeCluster/$codeInsee/liste_voies.json"
  206.                 "$baseDir/voies/$anneeActuelle/$semaine/$jour/$codeCluster/$codeInsee/liste_voies.json";
  207.             if (!file_exists($voiesFile)) {
  208.                 $result = ['error' => "Fichier voies introuvable"];
  209.                 return new JsonResponse($result404);
  210.             }
  211.             $voiesData json_decode(file_get_contents($voiesFile), true);
  212.             if ($voiesData === null && json_last_error() !== JSON_ERROR_NONE) {
  213.                 $result = ['error' => "Fichier voies vide ou invalide"];
  214.                 return new JsonResponse($result400);
  215.             }
  216.             $result $voiesData;
  217.         }
  218.         return new JsonResponse($result200);
  219.     }
  220.     /**
  221.      * @Route("/api/adresses-incomming-hierarchy-by-anciennete/{cpv}", name="api_get_adresse_incomming_hierarchy_by_anciennete_from_json", methods={"GET"})
  222.      */
  223.     public function getHierarchyByAncienneteFromJson(
  224.         int $cpv,
  225.         KernelInterface $kernel,
  226.         Request $request
  227.     ): JsonResponse {
  228.         $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_neuves/{$cpv}/anciennete/anciennete.json";
  229.         if (!file_exists($filePath)) {
  230.             return new JsonResponse(['error' => 'Fichier non trouvé'], 200);
  231.         }
  232.         $jsonData json_decode(file_get_contents($filePath), true);
  233.         if ($jsonData === null) {
  234.             return new JsonResponse(['error' => 'Erreur de lecture du JSON'], 200);
  235.         }
  236.         // Récupérer les paramètres de l'intervalle d'ancienneté
  237.         $debutAnciennete $request->query->get('debutAnciennete'null);
  238.         $finAnciennete $request->query->get('finAnciennete'null);
  239.         $codeCluster $request->query->get('codeCluster'null);
  240.         $codeInsee $request->query->get('codeInsee'null);
  241.         // Vérification des paramètres d'intervalle d'ancienneté
  242.         if ($debutAnciennete != null && $finAnciennete != null && $debutAnciennete <= $finAnciennete) {
  243.             // Convertir debutAnciennete et finAnciennete en nombre (supporter négatif et positif)
  244.             $debutAnciennete floatval($debutAnciennete);
  245.             $finAnciennete floatval($finAnciennete);
  246.             // Tableaux pour la combinaison des clusters et totalPrises
  247.             $finalClusters = [];
  248.             $finalTotalPrises 0;
  249.             // Filtrer et combiner les clusters pour les niveaux d'ancienneté dans l'intervalle
  250.             foreach ($jsonData as $key => $data) {
  251.                 $keyAnciennete floatval($key); // S'assurer que la clé est un nombre
  252.                 if ($keyAnciennete >= $debutAnciennete && $keyAnciennete <= $finAnciennete) {
  253.                     // Ajouter les clusters de cet ancienneté
  254.                     foreach ($data['clusters'] as $cluster) {
  255.                         $clusterCode $cluster['code_cluster'];
  256.                         // Si le cluster existe déjà, on additionne le totalPrises
  257.                         if (isset($finalClusters[$clusterCode])) {
  258.                             // Ajouter les villes et additionner les prises des villes existantes
  259.                             foreach ($cluster['villes'] as $ville) {
  260.                                 $villeCode $ville['cod_insee'];
  261.                                 $foundVille false;
  262.                                 // Si la ville existe déjà, on additionne son totalPrises
  263.                                 foreach ($finalClusters[$clusterCode]['villes'] as &$existingVille) {
  264.                                     if ($existingVille['cod_insee'] === $villeCode) {
  265.                                         $existingVille['totalPrises'] += $ville['totalPrises'];
  266.                                         $foundVille true;
  267.                                         break;
  268.                                     }
  269.                                 }
  270.                                 // Si la ville n'existe pas encore, on l'ajoute
  271.                                 if (!$foundVille) {
  272.                                     $finalClusters[$clusterCode]['villes'][] = $ville;
  273.                                 }
  274.                             }
  275.                             // Additionner les totalPrises du cluster
  276.                             $finalClusters[$clusterCode]['totalPrises'] += $cluster['totalPrises'];
  277.                         } else {
  278.                             // Si le cluster n'existe pas encore, on l'ajoute avec ses villes
  279.                             $finalClusters[$clusterCode] = [
  280.                                 'code_cluster' => $cluster['code_cluster'],
  281.                                 'libelle_cluster' => $cluster['libelle_cluster'],
  282.                                 'totalPrises' => $cluster['totalPrises'],
  283.                                 'villes' => $cluster['villes'],
  284.                             ];
  285.                         }
  286.                         // Additionner les prises du cluster à la somme globale
  287.                         $finalTotalPrises += $cluster['totalPrises'];
  288.                     }
  289.                 }
  290.             }
  291.             // Si aucun cluster n'a été trouvé dans l'intervalle, renvoyer une erreur
  292.             if (empty($finalClusters)) {
  293.                 return new JsonResponse('Aucun cluster trouvé dans l\'intervalle d\'ancienneté'200);
  294.             }
  295.             $jsonDataByAncinneteRange = [
  296.                 'totalPrises' => $finalTotalPrises,
  297.                 'clusters' => array_values($finalClusters),
  298.             ];
  299.             // Si codeCluster est fourni, rechercher le cluster correspondant
  300.             if ($codeCluster) {
  301.                 $cluster array_filter($jsonDataByAncinneteRange['clusters'], function ($c) use ($codeCluster) {
  302.                     return $c['code_cluster'] === $codeCluster;
  303.                 });
  304.                 if (empty($cluster)) {
  305.                     return new JsonResponse(['Cluster non trouvé'], 200);
  306.                 }
  307.                 $cluster array_values($cluster)[0]; // Récupérer le premier élément
  308.                 // Si codeInsee est fourni, rechercher la ville correspondante
  309.                 if ($codeInsee) {
  310.                     $ville array_filter($cluster['villes'], function ($v) use ($codeInsee) {
  311.                         return $v['cod_insee'] === $codeInsee;
  312.                     });
  313.                     if (empty($ville)) {
  314.                         return new JsonResponse(['error' => 'Ville non trouvée'], 200);
  315.                     }
  316.                     return new JsonResponse(array_values($ville)[0], 200);
  317.                 }
  318.                 return new JsonResponse($cluster200);
  319.             }
  320.             // Retourner la réponse finale avec totalPrises et clusters combinés
  321.             return new JsonResponse($jsonDataByAncinneteRange200);
  322.         }
  323.         return new JsonResponse($jsonData200);
  324.     }
  325.     /**
  326.      * @Route("/api/adresses-incomming-streets-by-anciennete/{cpv}/{codeCluster}/{codeInsee}", name="api_get_adresses_incomming_voies_by_anciennete_from_json", methods={"GET"})
  327.      */
  328.     public function getInterventionPlaceVoiesFromJson(int $cpvstring $codeCluster$codeInseeKernelInterface $kernelRequest $request): JsonResponse
  329.     {
  330.         $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_neuves/{$cpv}/anciennete/voies/{$codeCluster}/{$codeInsee}/liste_voies.json";
  331.         if (!file_exists($filePath)) {
  332.             return new JsonResponse(['error' => 'Fichier non trouvé'], 200);
  333.         }
  334.         $anciennete $request->query->get('anciennete'null);
  335.         // Lire et décoder le fichier JSON
  336.         $jsonData json_decode(file_get_contents($filePath), true);
  337.         if ($jsonData === null) {
  338.             return new JsonResponse(['error' => 'Erreur de lecture du JSON'], 200);
  339.         }
  340.         if ($anciennete) {
  341.             if (!isset($jsonData[$anciennete])) {
  342.                 return new JsonResponse(['error' => 'Ancienneté non trouvée'], 200);
  343.             }
  344.             return new JsonResponse($jsonData[$anciennete], 200);
  345.         }
  346.         // Renvoi des données paginées
  347.         return new JsonResponse($jsonData200);
  348.     }
  349.     /**
  350.      * @Route("/api/adresses-incomming-hierarchy-arret-cu-v2/{cpv}", name="api_get_adresses_incomming_arret_cu_from_json_v2", methods={"GET"})
  351.      */
  352.     public function getHierrachyByArretCuFromJsonV2(int $cpvKernelInterface $kernelRequest $request): JsonResponse
  353.     {
  354.         // Récupérer les paramètres de la requête
  355.         $codeCluster $request->query->get('codeCluster'null);
  356.         $codeInsee   $request->query->get('codeInsee'null);
  357.         $annee       $request->query->get('annee'null);
  358.         $mois        $request->query->get('mois'null);
  359.         // Définir le chemin du fichier JSON principal
  360.         $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_neuves/{$cpv}/arret_cu_v2/arret_cu.json";
  361.         if (!file_exists($filePath)) {
  362.             return new JsonResponse([], 200);
  363.         }
  364.         $jsonData json_decode(file_get_contents($filePath), true);
  365.         if ($jsonData === null) {
  366.             return new JsonResponse([], 200);
  367.         }
  368.         // --- Filtrage par codeCluster ---
  369.         if ($codeCluster) {
  370.             $cluster array_filter($jsonData, fn($c) => $c['code_cluster'] == $codeCluster);
  371.             if (count($cluster) < 1) {
  372.                 return new JsonResponse([], 200);
  373.             }
  374.             $cluster array_values($cluster)[0];
  375.             // --- Filtrage par codeInsee ---
  376.             if ($codeInsee) {
  377.                 $ville array_filter($cluster['villes'], fn($v) => $v['cod_insee'] == $codeInsee);
  378.                 if (count($ville) < 1) {
  379.                     return new JsonResponse([], 200);
  380.                 }
  381.                 $ville array_values($ville)[0];
  382.                 // --- Ici on ajoute l’appel à la 2e API ---
  383.                 $streetsFilePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_neuves/{$cpv}/arret_cu/voies/{$codeCluster}/{$codeInsee}/liste_voies.json";
  384.                 if (file_exists($streetsFilePath)) {
  385.                     $streetsData json_decode(file_get_contents($streetsFilePath), true) ?? [];
  386.                     // Filtrage par année et mois si demandé
  387.                     if ($annee !== null && isset($streetsData[$annee])) {
  388.                         $streetsData $streetsData[$annee];
  389.                         if ($mois !== null && isset($streetsData[$mois])) {
  390.                             $streetsData $streetsData[$mois];
  391.                         }
  392.                     }
  393.                     // On enrichit la réponse avec les rues
  394.                     $ville['voies'] = $streetsData;
  395.                 }
  396.                 return new JsonResponse($ville200);
  397.             }
  398.             return new JsonResponse($cluster200);
  399.         }
  400.         return new JsonResponse($jsonData200);
  401.     }
  402.     /**
  403.      * @Route("/api/adresses-incomming-hierarchy-arret-cu/{cpv}", name="api_get_adresses_incomming_arret_cu_from_json", methods={"GET"})
  404.      */
  405.     public function getHierarchyArretCufromJson(int $cpvKernelInterface $kernelRequest $request): JsonResponse
  406.     {
  407.         // Récupérer les paramètres de la requête
  408.         $annee       $request->query->get('annee'null);
  409.         $mois        $request->query->get('mois'null);
  410.         $codeCluster $request->query->get('codeCluster'null);
  411.         $codeInsee   $request->query->get('codeInsee'null);
  412.         // Définir le chemin du fichier JSON principal
  413.         $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_neuves/{$cpv}/arret_cu/arret_cu.json";
  414.         if (!file_exists($filePath)) {
  415.             return new JsonResponse([], 200);
  416.         }
  417.         $jsonData json_decode(file_get_contents($filePath), true);
  418.         if ($jsonData === null) {
  419.             return new JsonResponse([], 200);
  420.         }
  421.         // Filtrage par année
  422.         if ($annee !== null && isset($jsonData[$annee])) {
  423.             $jsonDataAnnee $jsonData[$annee];
  424.             // Filtrage par mois
  425.             if ($mois !== null && isset($jsonDataAnnee[$mois])) {
  426.                 $jsonDataMois $jsonDataAnnee[$mois];
  427.                 // Filtrage par cluster
  428.                 if ($codeCluster !== null && isset($jsonDataMois['clusters'])) {
  429.                     $clusterData null;
  430.                     foreach ($jsonDataMois['clusters'] as $c) {
  431.                         if ($c['code_cluster'] == $codeCluster) {
  432.                             $clusterData $c;
  433.                             break;
  434.                         }
  435.                     }
  436.                     // Filtrage par ville (codeInsee)
  437.                     if ($clusterData !== null && $codeInsee !== null && isset($clusterData['villes'])) {
  438.                         $villeData null;
  439.                         foreach ($clusterData['villes'] as $villeItem) {
  440.                             if ($villeItem['cod_insee'] == $codeInsee) {
  441.                                 $villeData $villeItem;
  442.                                 break;
  443.                             }
  444.                         }
  445.                         // Si une ville est trouvée → chercher aussi les rues
  446.                         if ($villeData !== null) {
  447.                             $streetsFilePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_neuves/{$cpv}/arret_cu/voies/{$codeCluster}/{$codeInsee}/liste_voies.json";
  448.                             if (file_exists($streetsFilePath)) {
  449.                                 $streetsData json_decode(file_get_contents($streetsFilePath), true) ?? [];
  450.                                 // Filtrage rues par année et mois
  451.                                 if ($annee !== null && isset($streetsData[$annee])) {
  452.                                     $streetsData $streetsData[$annee];
  453.                                     if ($mois !== null && isset($streetsData[$mois])) {
  454.                                         $streetsData $streetsData[$mois];
  455.                                     }
  456.                                 }
  457.                                 // Enrichir la ville avec ses voies
  458.                                 $villeData['voies'] = $streetsData;
  459.                             }
  460.                             return new JsonResponse($villeData200);
  461.                         }
  462.                         return new JsonResponse([], 200);
  463.                     }
  464.                     return new JsonResponse($clusterData ?? [], 200);
  465.                 }
  466.                 return new JsonResponse($jsonDataMois ?? [], 200);
  467.             } else {
  468.                 return new JsonResponse(['error' => 'Mois non défini'], 404);
  469.             }
  470.         }
  471.         // Si pas de filtre → retourner le JSON complet
  472.         return new JsonResponse($jsonData200);
  473.     }
  474. }