src/Controller/Api/InterventionPlace/InterventionPlaceHierarchyController.php line 96

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api\InterventionPlace;
  3. use App\Dto\InterventionPlace;
  4. use App\Dto\InterventionPlaceKpi;
  5. use App\Service\HierarchyService;
  6. use App\Repository\UserRepository;
  7. use App\Repository\CityGeolocRepository;
  8. use App\Repository\NmdAdresseRepository;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\HttpKernel\KernelInterface;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use App\Port\NmdAdressePort;
  16. use Symfony\Component\HttpFoundation\Response;
  17. class InterventionPlaceHierarchyController extends AbstractController
  18. {
  19.     private NmdAdressePort $adresseRepository;
  20.     private $cityGeolocRepository;
  21.     private $entityManager;
  22.     private $userRepository;
  23.     public function __construct(
  24.         NmdAdressePort $adresseRepository,
  25.         CityGeolocRepository $cityGeolocRepository,
  26.         EntityManagerInterface $entityManager,
  27.         UserRepository $userRepository
  28.     ) {
  29.         $this->adresseRepository $adresseRepository;
  30.         $this->cityGeolocRepository $cityGeolocRepository;
  31.         $this->entityManager $entityManager;
  32.         $this->userRepository $userRepository;
  33.     }
  34.     public function __invoke(int $cpv,  Request $request): JsonResponse
  35.     {
  36.         $codeCluster $request->query->get('codeCluster'null);
  37.         $codeInsee $request->query->get('codeInsee'null);
  38.         $page $request->query->get('page'1);
  39.         $fttb $request->query->get('fttb');
  40.         $adsl $request->query->get('adsl');
  41.         $mobMono $request->query->get('mobMono');
  42.         $mobMultiThd $request->query->get('mobMultiThd');
  43.         $mobMultiAdsl $request->query->get('mobMultiAdsl');
  44.         $thd $request->query->get('thd');
  45.         $limit 25;
  46.         $result $this->adresseRepository->getInterventionPlaceKpiByStreet(
  47.             $cpv,
  48.             $codeCluster,
  49.             $codeInsee,
  50.             $page,
  51.             $limit,
  52.             $fttb,
  53.             $adsl,
  54.             $mobMono,
  55.             $mobMultiThd,
  56.             $mobMultiAdsl,
  57.             $thd
  58.         );
  59.         if (empty($result)) {
  60.             return new JsonResponse(
  61.                 [],
  62.                 200
  63.             );
  64.         }
  65.         $parameters = [
  66.             'cpv' => $cpv,
  67.             'code_cluster' => null
  68.         ];
  69.         $finalResult $this->generateResult($result$parameters);
  70.         if ($codeCluster != null) {
  71.             $parameters = [
  72.                 'code_cluster' => $codeCluster,
  73.                 'cod_insee' => null
  74.             ];
  75.             $finalResult $this->generateResult($result$parameters);
  76.         }
  77.         if ($codeInsee != null) {
  78.             $parameters = [
  79.                 'cod_insee' => $codeInsee,
  80.                 'nom_voie' => null
  81.             ];
  82.             $finalResult $this->generateResult($result$parameters);
  83.         }
  84.         return new JsonResponse($finalResult200);
  85.     }
  86.     /**
  87.      * @Route("/api/interventions-places-details", name="api_get_interventions_places_details", methods={"GET"})
  88.      */
  89.     public function getInterventionPlacesDetails(Request $request): Response
  90.     {
  91.         $cpv $request->query->get('cpv'null);
  92.         $codeCluster $request->query->get('codeCluster'null);
  93.         $codeInsee $request->query->get('codeInsee'null);
  94.         $page $request->query->get('page'1);
  95.         $fttb $request->query->get('fttb','no');
  96.         $adsl $request->query->get('adsl','no');
  97.         $mobMono $request->query->get('mobMono','no');
  98.         $mobMultiThd $request->query->get('mobMultiThd','no');
  99.         $mobMultiAdsl $request->query->get('mobMultiAdsl','no');
  100.         $thd $request->query->get('thd','no');
  101.         $exportCsv = (int) $request->query->get('exportCsv'0);
  102.        
  103.         $result $this->adresseRepository->getInterventionPlaceDetails(
  104.             $cpv,
  105.             $codeCluster,
  106.             $codeInsee,
  107.             $fttb,
  108.             $adsl,
  109.             $mobMono,
  110.             $mobMultiThd,
  111.             $mobMultiAdsl,
  112.             $thd
  113.         );
  114.         if (empty($result)) {
  115.             return new JsonResponse([], 200);
  116.         }
  117.         // Si on demande un CSV → téléchargement
  118.         if ($exportCsv === 1) {
  119.             // Création du flux CSV
  120.             $handle fopen('php://temp''r+');
  121.             // Ajout de l'en-tête
  122.             fputcsv($handlearray_keys($result[0]), ';');
  123.             // Ajout des données
  124.             foreach ($result as $row) {
  125.                 fputcsv($handle$row';');
  126.             }
  127.             rewind($handle);
  128.             $content stream_get_contents($handle);
  129.             fclose($handle);
  130.             // Réponse CSV → téléchargement
  131.             return new Response(
  132.                 $content,
  133.                 200,
  134.                 [
  135.                     'Content-Type' => 'text/csv; charset=utf-8',
  136.                     'Content-Disposition' => 'attachment; filename="prises_parc_details.csv"',
  137.                 ]
  138.             );
  139.         }
  140.         // Sinon JSON normal
  141.         return new JsonResponse($result200);
  142.     }
  143.     public function generateResult($result$parameters)
  144.     {
  145.         // Extraire les clés primaires et secondaires directement
  146.         $primaryKey key($parameters);
  147.         $secondaryKey key(array_slice($parameters11true)); // Récupérer la 2ème clé
  148.         // Structure de base pour le résultat final
  149.         $finalResult = [
  150.             $primaryKey => $parameters[$primaryKey],
  151.             $secondaryKey => []
  152.         ];
  153.         // Champs supplémentaires basés sur les clés primaires
  154.         $additionalFields = [
  155.             'cpv' => [],
  156.             'code_cluster' => ['ville'],
  157.             'cod_insee' => ['ville''nom_voie']
  158.         ];
  159.         // Parcourir chaque ligne du résultat
  160.         foreach ($result as $row) {
  161.             $data = [
  162.                 "nb_fyr_fttb" => (int)$row["nb_fyr_fttb"],
  163.                 "nb_fyr_adsl" => (int)$row["nb_fyr_adsl"],
  164.                 "nb_fyr_mob_mono" => (int)$row["nb_fyr_mob_mono"],
  165.                 "nb_fyr_mob_multi_thd" => (int)$row["nb_fyr_mob_multi_thd"],
  166.                 "nb_fyr_mob_multi_adsl" => (int)$row["nb_fyr_mob_multi_adsl"],
  167.                 "nb_fyr_thd" => (int)$row["nb_fyr_thd"]
  168.             ];
  169.             // Ajouter les champs spécifiques selon la clé primaire
  170.             if (isset($additionalFields[$primaryKey])) {
  171.                 foreach ($additionalFields[$primaryKey] as $field) {
  172.                     $data[$field] = $row[$field];
  173.                 }
  174.             }
  175.             // Si la clé primaire est 'code_cluster', ajouter lbl_cluster à la structure
  176.             if ($primaryKey === 'code_cluster') {
  177.                 $lblCluster $row["lbl_cluster"]; // Récupérer la valeur de lbl_cluster
  178.                 $secondaryValue $row[$secondaryKey];
  179.                 // Récupérer le polygon pour ce cod_insee (valeur secondaire)
  180.                 $polygon $this->getPolygonsByCodeInsee($secondaryValue);
  181.                 $formattedPolygon null;
  182.                 if ($polygon) {
  183.                     // Décoder la chaîne JSON échappée
  184.                     $polygonDecoded json_decode($polygontrue);
  185.                     // Vérifier si le décodage a réussi
  186.                     if (json_last_error() === JSON_ERROR_NONE) {
  187.                         // Extraire 'type' et 'coordinates'
  188.                         $polygonType $polygonDecoded['type'] ?? null;
  189.                         $polygonCoordinates $polygonDecoded['coordinates'] ?? null;
  190.                         // Réécrire proprement les données (ici, nous nous concentrons sur 'type' et 'coordinates')
  191.                         $formattedPolygon = [
  192.                             'type' => $polygonType,
  193.                             'coordinates' => $polygonCoordinates
  194.                         ];
  195.                     }
  196.                 }
  197.                 // Ajouter les autres données sous la clé secondaire
  198.                 $finalResult[$secondaryKey][] = [
  199.                     $secondaryValue => [
  200.                         "data" => $data,
  201.                         "polygon" => $formattedPolygon // Ajouter le polygon formaté
  202.                     ]
  203.                 ];
  204.                 // Réorganiser lbl_cluster à la deuxième position dans la structure
  205.                 $finalResult $this->reorderResult($finalResult$lblCluster);
  206.             } else {
  207.                 // Par défaut, lbl_cluster reste dans 'data'
  208.                 $data["lbl_cluster"] = $row["lbl_cluster"];
  209.                 $finalResult[$secondaryKey][] = [
  210.                     $row[$secondaryKey] => ["data" => $data]
  211.                 ];
  212.             }
  213.         }
  214.         return $finalResult;
  215.     }
  216.     // Fonction pour réorganiser lbl_cluster à la 2ème position
  217.     private function reorderResult($finalResult$lblCluster)
  218.     {
  219.         // Réorganiser lbl_cluster à la 2ème position
  220.         $temp = [
  221.             'code_cluster' => $finalResult['code_cluster'], // Conserver la clé primaire
  222.             'lbl_cluster' => $lblCluster// Ajouter lbl_cluster à la 2ème position
  223.             'cod_insee' => $finalResult['cod_insee'], // Conserver le reste des éléments
  224.         ];
  225.         return $temp;
  226.     }
  227.     /**
  228.      * @Route("/api/interventions-places-kpi-json/{cpv}/{codeCluster}", name="api_get_clusters_details_by_cpv_and_code_cluster", methods={"GET"})
  229.      */
  230.     public function getInterventionPlaceKpiFromJson(int $cpvstring $codeClusterKernelInterface $kernelRequest $request): JsonResponse
  231.     {
  232.         $codeInsee null;
  233.         if ($request->query->get('codeInsee') != null) {
  234.             $codeInsee $request->query->get('codeInsee');
  235.         }
  236.         $baseDir $kernel->getProjectDir() . "/fileAttached/prisesParcJson/{$cpv}/";
  237.         if ($codeInsee !== null) {
  238.             $filePath "$baseDir/migrableKpiByStreet/{$codeCluster}/{$codeInsee}.json";
  239.         } else {
  240.             $filePath "$baseDir/migrableKpiByCodeInsee/{$codeCluster}.json";
  241.         }
  242.         if (!file_exists($filePath)) {
  243.             return new JsonResponse(['error' => 'Fichier non trouvé'], 404);
  244.         }
  245.         $jsonData json_decode(file_get_contents($filePath), true);
  246.         if ($jsonData === null) {
  247.             return new JsonResponse(['error' => 'Erreur de lecture du JSON'], 500);
  248.         }
  249.         return new JsonResponse($jsonData200);
  250.     }
  251.     private function getPolygonsByCodeInsee($codeInsee)
  252.     {
  253.         $geoCity $this->cityGeolocRepository->findOneBy(['codeInsee' => $codeInsee]);
  254.         return  $geoCity->getPolygon() ?? null;
  255.     }
  256.     /**
  257.      * @Route("/api/interventions-places-hierarchy/{cpv}/{userId}", name="api_get_intervention_places_hierarchy_from_json", methods={"GET"})
  258.      */
  259.     public function getInterventionPlaceHierarchyFromJson(
  260.         int $cpv,
  261.         $userId,
  262.         KernelInterface $kernel,
  263.         Request $request,
  264.         HierarchyService $hierarchyService,
  265.         UserRepository $userRepository
  266.     ): JsonResponse {
  267.         $userId $request->query->get('userId'$userId);
  268.         $codeCluster $request->query->get('codeCluster'null);
  269.         $codeInsee $request->query->get('codeInsee'null);
  270.         $user $userRepository->findOneBy(['id' => $userId]);
  271.         if (!$user) {
  272.             return new JsonResponse(['error' => 'Utilisateur non trouvé'], 404);
  273.         }
  274.         $projectDir $kernel->getProjectDir();
  275.         $baseDir "$projectDir/fileAttached/geo_map/prises_parc/{$cpv}";
  276.         $jsonData $this->loadHierarchyData($user$userId$baseDir$hierarchyService);
  277.         if (empty($jsonData)) {
  278.             return new JsonResponse(['error' => 'Fichier non trouvé ou vide'], 404);
  279.         }
  280.         #Filtres
  281.         if ($codeCluster) {
  282.             $cluster array_filter($jsonData, function ($c) use ($codeCluster) {
  283.                 if ($c['clusterCode'] == $codeCluster) {
  284.                     return $c;
  285.                 }
  286.             });
  287.             if (empty($cluster)) {
  288.                 return new JsonResponse([], 200);
  289.             }
  290.             if ($codeInsee) {
  291.                 $ville array_filter(array_values($cluster)[0]['villes'], function ($v) use ($codeInsee) {
  292.                     if ($v['cod_insee'] == $codeInsee) {
  293.                         return $v;
  294.                     }
  295.                 });
  296.                 if (empty($ville)) {
  297.                     return new JsonResponse([], 200);
  298.                 }
  299.                 return new JsonResponse(array_values($ville), 200);
  300.             }
  301.             return new JsonResponse(array_values($cluster)[0], 200);
  302.         }
  303.         return new JsonResponse($jsonData200);
  304.     }
  305.     /**
  306.      * Charge les données hiérarchiques (fusionnées ou non selon le rôle)
  307.      */
  308.     private function loadHierarchyData($userint $userIdstring $baseDirHierarchyService $hierarchyService): array
  309.     {
  310.         if (in_array('ROLE_MANAGER'$user->getRoles()) || in_array('ROLE_DIRECTOR'$user->getRoles())) {
  311.             return $this->loadAndMergeDistributedFiles($userId$baseDir$hierarchyService);
  312.         }
  313.         $filePath "{$baseDir}/hiearchy_prises_parc_cluster_ville.json";
  314.         if (!file_exists($filePath)) {
  315.             return [];
  316.         }
  317.         $jsonData json_decode(file_get_contents($filePath), true);
  318.         return is_array($jsonData) ? $jsonData : [];
  319.     }
  320.     /**
  321.      * Fusionne les fichiers distribués des utilisateurs hiérarchiques
  322.      */
  323.     private function loadAndMergeDistributedFiles(int $userIdstring $baseDirHierarchyService $hierarchyService): array
  324.     {
  325.         $mergedData = [];
  326.         $userIds array_merge(
  327.             [$userId],
  328.             array_map(fn($p) => (int) $p['id'], $hierarchyService->getHierarchyDescendante($userId))
  329.         );
  330.         foreach ($userIds as $uid) {
  331.             $filePath "{$baseDir}/distributed_by_user/{$uid}/distributed_hierarchy_cluster_city.json";
  332.             if (!file_exists($filePath)) {
  333.                 continue;
  334.             }
  335.             $data json_decode(file_get_contents($filePath), true);
  336.             if (!is_array($data)) {
  337.                 continue;
  338.             }
  339.             foreach ($data as $cluster) {
  340.                 $clusterKey $cluster['clusterCode'];
  341.                 if (!isset($mergedData[$clusterKey])) {
  342.                     $mergedData[$clusterKey] = $cluster;
  343.                 } else {
  344.                     $mergedData[$clusterKey]['total_prises'] += $cluster['total_prises'];
  345.                     foreach ($cluster['villes'] as $ville) {
  346.                         $insee $ville['cod_insee'];
  347.                         $villeExistante false;
  348.                         foreach ($mergedData[$clusterKey]['villes'] as &$v) {
  349.                             if ($v['cod_insee'] === $insee) {
  350.                                 $v['total_prises'] += $ville['total_prises'];
  351.                                 $villeExistante true;
  352.                                 break;
  353.                             }
  354.                         }
  355.                         if (!$villeExistante) {
  356.                             $mergedData[$clusterKey]['villes'][] = $ville;
  357.                         }
  358.                     }
  359.                 }
  360.             }
  361.         }
  362.         return array_values($mergedData);
  363.     }
  364.     /**
  365.      * @Route("/api/interventions-places-streets/{cpv}/{codeCluster}/{codeInsee}", name="api_get_intervention_places_voies_from_json", methods={"GET"})
  366.      */
  367.     public function getInterventionPlaceVoiesFromJson(
  368.         int $cpv,
  369.         string $codeCluster,
  370.         $codeInsee,
  371.         KernelInterface $kernel,
  372.         HierarchyService $hierarchyService,
  373.         UserRepository $userRepository,
  374.         Request $request
  375.     ): JsonResponse {
  376.         $userId $request->query->get('userId'null);
  377.         $user null;
  378.         if ($userId) {
  379.             $user $userRepository->findOneBy(['id' => $userId]);
  380.             if (!$user) {
  381.                 return new JsonResponse(['error' => 'Utilisateur non trouvé'], 404);
  382.             }
  383.         }
  384.         $projectDir $kernel->getProjectDir();
  385.         $baseDir "$projectDir/fileAttached/geo_map/prises_parc/{$cpv}";
  386.         $jsonData $this->loadVoiesData($user$userId$baseDir$codeCluster$codeInsee$hierarchyService);
  387.         if (empty($jsonData)) {
  388.             return new JsonResponse(['error' => 'Fichier non trouvé ou vide'], 404);
  389.         }
  390.         return new JsonResponse($jsonData200);
  391.     }
  392.     /**
  393.      * Retourne les données de voies en les fusionnant si nécessaire
  394.      */
  395.     private function loadVoiesData($user,  $userIdstring $baseDirstring $codeClusterstring $codeInseeHierarchyService $hierarchyService): array
  396.     {
  397.         $merged = [];
  398.         if ($user) {
  399.             if (in_array('ROLE_MANAGER'$user->getRoles()) || in_array('ROLE_DIRECTOR'$user->getRoles())) {
  400.                 $userIds array_merge(
  401.                     [$userId],
  402.                     array_map(fn($u) => (int) $u['id'], $hierarchyService->getHierarchyDescendante($userId))
  403.                 );
  404.                 foreach ($userIds as $uid) {
  405.                     $filePath "{$baseDir}/distributed_by_user/voies/{$uid}/{$codeCluster}/{$codeInsee}/liste_voies.json";
  406.                     if (!file_exists($filePath)) {
  407.                         continue;
  408.                     }
  409.                     $data json_decode(file_get_contents($filePath), true);
  410.                     if (!is_array($data)) {
  411.                         continue;
  412.                     }
  413.                     $merged $this->mergeVoiesData($merged$data);
  414.                 }
  415.                 return array_values($merged); // Réindexé
  416.             }
  417.         }
  418.         $filePath "{$baseDir}/voies/{$codeCluster}/{$codeInsee}/liste_voies.json";
  419.         if (!file_exists($filePath)) {
  420.             return [];
  421.         }
  422.         $jsonData json_decode(file_get_contents($filePath), true);
  423.         return is_array($jsonData) ? $jsonData : [];
  424.     }
  425.     /**
  426.      * Fusionne plusieurs tableaux de voies selon `nom_voie + code_iris`
  427.      */
  428.     private function mergeVoiesData(array $merged, array $data): array
  429.     {
  430.         foreach ($data as $voie) {
  431.             $key $voie['nom_voie'] . '|' $voie['code_iris'];
  432.             if (!isset($merged[$key])) {
  433.                 $merged[$key] = $voie;
  434.             } else {
  435.                 $merged[$key]['total_prises'] += $voie['total_prises'];
  436.                 // Fusionner les numéros de voie (data)
  437.                 $existingNums array_column($merged[$key]['data'], 'numr_voie');
  438.                 foreach ($voie['data'] as $num) {
  439.                     if (!in_array($num['numr_voie'], $existingNums)) {
  440.                         $merged[$key]['data'][] = $num;
  441.                     }
  442.                 }
  443.             }
  444.         }
  445.         return $merged;
  446.     }
  447.     /**
  448.      * @Route("/api/interventions-places-hierarchy-migrable/{cpv}", name="api_get_intervention_places_hierarchy_migrable_from_json", methods={"GET"})
  449.      */
  450.     public function getInterventionPlaceHierarchyMigrableFromJson(int $cpvKernelInterface $kernelRequest $request): JsonResponse
  451.     {
  452.         $userId $request->query->get('userId'null);
  453.         $codeCluster $request->query->get('codeCluster'null);
  454.         $codeInsee $request->query->get('codeInsee'null);
  455.         if ($userId) {
  456.             $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_parc/{$cpv}/{$userId}/migrables/hiearchy_prises_parc_cluster_ville_migrable.json";
  457.         }
  458.         $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_parc/{$cpv}/migrables/hiearchy_prises_parc_cluster_ville_migrable.json";
  459.         if (!file_exists($filePath)) {
  460.             return new JsonResponse(['error' => 'Fichier non trouvé'], 404);
  461.         }
  462.         // Lire et décoder le fichier JSON
  463.         $jsonData json_decode(file_get_contents($filePath), true);
  464.         if ($jsonData === null) {
  465.             return new JsonResponse(['error' => 'Erreur de lecture du JSON'], 404);
  466.         }
  467.         // Si codeCluster est fourni, rechercher le cluster correspondant
  468.         if ($codeCluster) {
  469.             $cluster array_filter($jsonData, function ($c) use ($codeCluster) {
  470.                 return $c['clusterCode'] === $codeCluster;
  471.             });
  472.             if (empty($cluster)) {
  473.                 return new JsonResponse([], 200);
  474.             }
  475.             // Si codeInsee est fourni, rechercher la ville correspondante
  476.             if ($codeInsee) {
  477.                 $ville array_filter(array_values($cluster)[0]['villes'], function ($v) use ($codeInsee) {
  478.                     return $v['cod_insee'] == $codeInsee;
  479.                 });
  480.                 if (empty($ville)) {
  481.                     return new JsonResponse([], 200);
  482.                 }
  483.                 // Retourner seulement l’objet, pas un tableau avec un index
  484.                 return new JsonResponse(array_values($ville)[0], 200);
  485.             }
  486.             return new JsonResponse(array_values($cluster)[0], 200);
  487.         }
  488.         return new JsonResponse($jsonData200);
  489.     }
  490.     /**
  491.      * @Route("/api/interventions-places-streets-migrable/{cpv}/{codeCluster}/{codeInsee}", name="api_get_intervention_places_voies_migrable_from_json", methods={"GET"})
  492.      */
  493.     public function getInterventionPlaceVoiesMigrableFromJson(int $cpvstring $codeCluster$codeInseeKernelInterface $kernelRequest $request): JsonResponse
  494.     {
  495.         $userId $request->query->get('userId'null);
  496.         $nomVoie $request->query->get('nomVoie'null);
  497.         if ($userId) {
  498.             $filePath $kernel->getProjectDir() . "/fileAttached/distribution/prises_parc/{$cpv}/{$userId}/migrables/voies/{$codeCluster}/{$codeInsee}/liste_voies_migrable.json";
  499.         }
  500.         $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_parc/{$cpv}/migrables/voies/{$codeCluster}/{$codeInsee}/liste_voies_migrable.json";
  501.         if (!file_exists($filePath)) {
  502.             return new JsonResponse(['error' => 'Fichier non trouvé'], 404);
  503.         }
  504.         // Lire et décoder le fichier JSON
  505.         $jsonData json_decode(file_get_contents($filePath), true);
  506.         if ($jsonData === null) {
  507.             return new JsonResponse(['error' => 'Erreur de lecture du JSON'], 404);
  508.         }
  509.         // Filtrer par nomVoie si fourni
  510.         if ($nomVoie !== null && is_array($jsonData)) {
  511.             $jsonData array_filter($jsonData, function ($voie) use ($nomVoie) {
  512.                 return isset($voie['nom_voie']) && strtolower($voie['nom_voie']) === strtolower($nomVoie);
  513.             });
  514.             $jsonData array_values($jsonData); // Réindexer le tableau
  515.         }
  516.         // Renvoi des données paginées
  517.         return new JsonResponse($jsonData200);
  518.     }
  519.     /**
  520.      * @Route("/api/interventions-places-arret-cu/{cpv}", name="api_get_intervention_places_arret_cu_from_json", methods={"GET"})
  521.      */
  522.     public function getArretCufromJson(int $cpvKernelInterface $kernelRequest $request): JsonResponse
  523.     {
  524.         // Récupérer les paramètres de la requête
  525.         $userId $request->query->get('userId'null);
  526.         $annee $request->query->get('annee'null);
  527.         $mois $request->query->get('mois'null);
  528.         $codeCluster $request->query->get('codeCluster'null);
  529.         $codeInsee $request->query->get('codeInsee'null);
  530.         // Définir le chemin du fichier JSON
  531.         if ($userId) {
  532.             $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_parc/{$cpv}/{$userId}/arret_cu/arret_cu.json";
  533.         } else {
  534.             $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_parc/{$cpv}/arret_cu/arret_cu.json";
  535.         }
  536.         // Vérifier si le fichier existe
  537.         if (!file_exists($filePath)) {
  538.             return new JsonResponse([], 200);
  539.         }
  540.         // Lire et décoder le fichier JSON
  541.         $jsonData json_decode(file_get_contents($filePath), true);
  542.         // Vérifier si la lecture du JSON a échoué
  543.         if ($jsonData === null) {
  544.             return new JsonResponse([], 200);
  545.         }
  546.         if ($annee !== null && isset($jsonData[$annee])) {
  547.             $jsonDataAnnee $jsonData[$annee];
  548.             // Check if the month is set and filter by month
  549.             if ($mois !== null && isset($jsonDataAnnee[$mois])) {
  550.                 $jsonDataMois $jsonDataAnnee[$mois];
  551.                 // Check if the cluster code is set and filter by cluster
  552.                 if ($codeCluster !== null && isset($jsonDataMois['clusters'])) {
  553.                     $clusterData null;
  554.                     foreach ($jsonDataMois['clusters'] as $c) {
  555.                         if ($c['code_cluster'] == $codeCluster) {
  556.                             $clusterData $c;
  557.                             break;
  558.                         }
  559.                     }
  560.                     if ($codeInsee !== null && isset($clusterData['villes'])) {
  561.                         $villeData null;
  562.                         foreach ($clusterData['villes'] as $villeItem) {
  563.                             if ($villeItem['cod_insee'] == $codeInsee) {
  564.                                 $villeData $villeItem;
  565.                                 break;
  566.                             }
  567.                         }
  568.                         return new JsonResponse($villeData ?? [], 200);
  569.                     }
  570.                     return new JsonResponse($clusterData ?? [], 200);
  571.                 }
  572.                 // After filtering, return the data
  573.                 return new JsonResponse($jsonDataMois ?? [], 200);
  574.             } else {
  575.                 return new JsonResponse(['error' => 'Mois non défini'], 200);
  576.             }
  577.             // If no month is specified, return the data for the year
  578.             return new JsonResponse($jsonDataAnnee ?? [], 200);
  579.         }
  580.         // Renvoi des données filtrées sous forme de réponse JSON
  581.         return new JsonResponse($jsonData200);
  582.     }
  583.     /**
  584.      * @Route("/api/interventions-places-arret-cu-v2/{cpv}", name="api_get_intervention_places_arret_cu_from_json_v2", methods={"GET"})
  585.      */
  586.     public function getInterventionPlaceArretCuFromJsonV2(int $cpvKernelInterface $kernelRequest $request): JsonResponse
  587.     {
  588.         // Récupérer les paramètres de la requête
  589.         $userId $request->query->get('userId'null);
  590.         $codeCluster $request->query->get('codeCluster'null);
  591.         $codeInsee $request->query->get('codeInsee'null);
  592.         // Définir le chemin du fichier JSON
  593.         if ($userId) {
  594.             $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_parc/{$cpv}/{$userId}/arret_cu/arret_cu.json";
  595.         } else {
  596.             $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_parc/{$cpv}/arret_cu_v2/arret_cu.json";
  597.         }
  598.         // Vérifier si le fichier existe
  599.         if (!file_exists($filePath)) {
  600.             return new JsonResponse([], 200);
  601.         }
  602.         // Lire et décoder le fichier JSON
  603.         $jsonData json_decode(file_get_contents($filePath), true);
  604.         // Vérifier si la lecture du JSON a échoué
  605.         if ($jsonData === null) {
  606.             return new JsonResponse([], 200);
  607.         }
  608.         if ($codeCluster) {
  609.             $cluster array_filter($jsonData, function ($c) use ($codeCluster) {
  610.                 if ($c['code_cluster'] == $codeCluster) {
  611.                     return $c;
  612.                 }
  613.             });
  614.             if (count($cluster) < 1) {
  615.                 return new JsonResponse([], 200);
  616.             }
  617.             // Si codeInsee est fourni, rechercher la ville correspondante
  618.             if ($codeInsee) {
  619.                 $ville array_filter(array_values($cluster)[0]['villes'], function ($v) use ($codeInsee) {
  620.                     if ($v['cod_insee'] == $codeInsee) {
  621.                         return $v;
  622.                     }
  623.                 });
  624.                 if (count($ville) < 1) {
  625.                     return new JsonResponse([], 200);
  626.                 }
  627.                 return new JsonResponse(array_values($ville), 200);
  628.             }
  629.             return new JsonResponse(array_values($cluster)[0], 200);
  630.         }
  631.         // Renvoi des données filtrées sous forme de réponse JSON
  632.         return new JsonResponse($jsonData200);
  633.     }
  634.     /**
  635.      * @Route("/api/interventions-places-arret-cu-streets/{cpv}/{codeCluster}/{codeInsee}", name="api_get_intervention_places_arret_cu_streets_from_json", methods={"GET"})
  636.      */
  637.     public function getInterventionPlaceArretCuStreetsFromJson(int $cpvstring $codeClusterstring $codeInseeKernelInterface $kernelRequest $request): JsonResponse
  638.     {
  639.         $userId $request->query->get('userId'null);
  640.         $annee $request->query->get('annee'null);
  641.         $mois $request->query->get('mois'null);
  642.         if ($userId) {
  643.             $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_parc/{$cpv}/{$userId}/arret_cu/voies/{$codeCluster}/{$codeInsee}/liste_voies.json";
  644.         }
  645.         $filePath $kernel->getProjectDir() . "/fileAttached/geo_map/prises_parc/{$cpv}/arret_cu/voies/{$codeCluster}/{$codeInsee}/liste_voies.json";
  646.         if (!file_exists($filePath)) {
  647.             return new JsonResponse([], 200);
  648.         }
  649.         // Vérifier si le fichier existe
  650.         if (!file_exists($filePath)) {
  651.             return new JsonResponse([], 200);
  652.         }
  653.         // Lire et décoder le fichier JSON
  654.         $jsonData json_decode(file_get_contents($filePath), true);
  655.         // Vérifier si la lecture du JSON a échoué
  656.         if ($jsonData === null) {
  657.             return new JsonResponse([], 200);
  658.         }
  659.         if ($annee !== null && isset($jsonData[$annee])) {
  660.             $jsonDataAnnee $jsonData[$annee];
  661.             // Check if the month is set and filter by month
  662.             if ($mois !== null && isset($jsonDataAnnee[$mois])) {
  663.                 $jsonDataMois $jsonDataAnnee[$mois];
  664.                 return new JsonResponse($jsonDataMois200);
  665.             }
  666.         }
  667.         return new JsonResponse($jsonData200);
  668.     }
  669. }