src/Controller/HomeController.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\GasMeter;
  4. use App\Entity\ElectricMeter;
  5. use App\Entity\Entreprise;
  6. use App\Entity\Rappel;
  7. use App\Entity\Contrat;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Doctrine\Persistence\ManagerRegistry;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. class HomeController extends AbstractController
  16. {
  17.     /**
  18.      * @Route("/", name="app_home")
  19.      */
  20.     public function index(): Response
  21.     {
  22.         return $this->redirectToRoute('app_site');
  23.     }
  24.     /**
  25.      * @Route("/site", name="app_site")
  26.      */
  27.     public function site(ManagerRegistry $doctrineRequest $request): Response
  28.     {
  29.         // Vérifier si l'utilisateur est connecté et a le rôle ROLE_TEAM
  30.         if (!$this->getUser() || !$this->isGranted('ROLE_TEAM')) {
  31.             return $this->redirectToRoute('app_login');
  32.         }
  33.         // Récupérer le nombre de jours depuis la requête, par défaut 7 jours
  34.         $nbJours $request->query->get('nbJours'7);
  35.         
  36.         // Calculer la date limite
  37.         $dateLimite = new \DateTime();
  38.         $dateLimite->modify('+' $nbJours ' days');
  39.         // Récupérer les rappels non complétés à venir dans les X prochains jours
  40.         $rappels $doctrine->getRepository(Rappel::class)
  41.             ->createQueryBuilder('r')
  42.             ->where('r.completer = :completer')
  43.             ->andWhere('r.echeance >= :now')
  44.             ->andWhere('r.echeance <= :dateLimite')
  45.             ->setParameter('completer'false)
  46.             ->setParameter('now', new \DateTime())
  47.             ->setParameter('dateLimite'$dateLimite)
  48.             ->orderBy('r.echeance''ASC')
  49.             ->getQuery()
  50.             ->getResult();
  51.         // Récupérer les entreprises liées aux rappels
  52.         $entreprises = [];
  53.         foreach ($rappels as $rappel) {
  54.             if ($rappel->getEntrepriseId()) {
  55.                 $entreprise $doctrine->getRepository(Entreprise::class)->find($rappel->getEntrepriseId());
  56.                 if ($entreprise) {
  57.                     $entreprises[$rappel->getId()] = $entreprise->getRaisonSociale();
  58.                 }
  59.             }
  60.         }
  61.         return $this->render('home/index.html.twig', [
  62.             'controller_name' => 'HomeController',
  63.             'rappels' => $rappels,
  64.             'entreprises' => $entreprises,
  65.             'nbJours' => $nbJours
  66.         ]);
  67.     }
  68.     /**
  69.      * @Route("/rappel/complete/{id}", name="app_rappel_complete", methods={"POST"})
  70.      */
  71.     public function completeRappel(Rappel $rappelEntityManagerInterface $entityManager): JsonResponse
  72.     {
  73.         // Vérifier si l'utilisateur est connecté et a le rôle ROLE_TEAM
  74.         if (!$this->getUser() || !$this->isGranted('ROLE_TEAM')) {
  75.             return new JsonResponse(['error' => 'Accès non autorisé'], 403);
  76.         }
  77.         $rappel->setCompleter(true);
  78.         $entityManager->flush();
  79.         return new JsonResponse(['success' => true]);
  80.     }
  81.     /**
  82.      * @Route("/requetes", name="app_requetes")
  83.      */
  84.     public function requetes(ManagerRegistry $doctrine): Response
  85.     {
  86.         // Vérifier si l'utilisateur est connecté et a le rôle ROLE_TEAM
  87.         if (!$this->getUser() || !$this->isGranted('ROLE_TEAM')) {
  88.             return $this->redirectToRoute('app_login');
  89.         }
  90.         $electricMeterRepository $doctrine->getRepository(ElectricMeter::class);
  91.         $gasMeterRepository $doctrine->getRepository(GasMeter::class);
  92.         $entrepriseRepository $doctrine->getRepository(Entreprise::class);
  93.         $contratRepository $doctrine->getRepository(Contrat::class);
  94.         $electric_meters $electricMeterRepository->findAll();
  95.         $gas_meters $gasMeterRepository->findAll();
  96.         $entreprises $entrepriseRepository->findAll();
  97.         // prepare entities to display in datatables
  98.         $electric_meters_array = [];
  99.         foreach ($electric_meters as $electric_meter) {
  100.             $entreprise $doctrine->getRepository(Entreprise::class)->find($electric_meter->getEntrepriseId());
  101.             $latestContract $contratRepository->createQueryBuilder('c')
  102.                 ->where('c.pdl = :pdl')
  103.                 ->setParameter('pdl'$electric_meter->getPDL())
  104.                 ->orderBy('c.date_debut''DESC')
  105.                 ->setMaxResults(1)
  106.                 ->getQuery()
  107.                 ->getOneOrNullResult();
  108.             $electric_meters_array[] = [
  109.                 $entreprise $entreprise->getRaisonSociale() : '',
  110.                 $electric_meter->getAdresseCompteur(),
  111.                 $electric_meter->getPDL(),
  112.                 ($latestContract && $latestContract->getDateDebut()) ? $latestContract->getDateDebut()->format('d/m/Y') : '',
  113.                 ($latestContract && $latestContract->getDateFin()) ? $latestContract->getDateFin()->format('d/m/Y') : '',
  114.                 $electric_meter->getProfil(),
  115.                 $electric_meter->getCAR(),
  116.                 $latestContract $latestContract->getFournisseur() : '',
  117.                 $electric_meter->getPrix(),
  118.                 '',
  119.             ];
  120.         }
  121.         $gas_meters_array = [];
  122.         foreach ($gas_meters as $gas_meter) {
  123.             if ($gas_meter->getDateFin() !== null) { // Only include meters with a set end date
  124.                 $entreprise $doctrine->getRepository(Entreprise::class)->find($gas_meter->getEntrepriseId());
  125.                 $latestContract $contratRepository->createQueryBuilder('c')
  126.                     ->where('c.pdl = :pdl')
  127.                     ->setParameter('pdl'$gas_meter->getPDL())
  128.                     ->orderBy('c.date_debut''DESC')
  129.                     ->setMaxResults(1)
  130.                     ->getQuery()
  131.                     ->getOneOrNullResult();
  132.                 $gas_meters_array[] = [
  133.                     $entreprise $entreprise->getRaisonSociale() : '',
  134.                     $gas_meter->getAdresseCompteur(),
  135.                     $gas_meter->getPDL(),
  136.                     ($latestContract && $latestContract->getDateDebut()) ? $latestContract->getDateDebut()->format('d/m/Y') : '',
  137.                     ($latestContract && $latestContract->getDateFin()) ? $latestContract->getDateFin()->format('d/m/Y') : '',
  138.                     $gas_meter->getProfil(),
  139.                     $gas_meter->getCAR(),
  140.                     $latestContract $latestContract->getFournisseur() : '',
  141.                     $gas_meter->getPrix(),
  142.                     '',
  143.                 ];
  144.             }
  145.         }
  146.         $entreprises_array = [];
  147.         foreach ($entreprises as $entreprise) {
  148.             $entreprises_array[] = [
  149.                 $entreprise->getRaisonSociale(),
  150.                 $entreprise->getAdresse(),
  151.                 $entreprise->getSiret(),
  152.                 $entreprise->getNaf(),
  153.                 $entreprise->getCodeInsee(),
  154.                 $entreprise->getStatut(),
  155.                 '',
  156.             ];
  157.         }
  158.         return $this->render('requetes.html.twig', [
  159.             'electric_meters' => $electric_meters_array,
  160.             'gas_meters' => $gas_meters_array,
  161.             'entreprises' => $entreprises_array,
  162.         ]);
  163.     }
  164.     /**
  165.      * @Route("/requetes2", name="app_requetes2")
  166.      */
  167.     public function requetes2(ManagerRegistry $doctrine,Request $request): JsonResponse
  168.     {
  169.         // Vérifier si l'utilisateur est connecté et a le rôle ROLE_TEAM
  170.         if (!$this->getUser() || !$this->isGranted('ROLE_TEAM')) {
  171.             return new JsonResponse(['error' => 'Accès non autorisé'], 403);
  172.         }
  173.         $filters $request->request->all();
  174.         // prepare filters for each entities
  175.         $electric_meter_filters = [];
  176.         $gas_meter_filters = [];
  177.         $entreprise_filters = [];
  178.         foreach ($filters as $key => $value) {
  179.             if (strpos($key'Electric')) {
  180.                 $electric_meter_filters[str_replace(['Electric','Filter'], ''$key)] = $value;
  181.             } elseif (strpos($key'Gaz')) {
  182.                 $gas_meter_filters[str_replace(['Gaz','Filter'], ''$key)] = $value;
  183.             } elseif (strpos($key'Entreprise')) {
  184.                 $entreprise_filters[str_replace(['Entreprise','Filter'], ''$key)] = $value;
  185.             }
  186.         }
  187.         // Fetch the repository for each entity type
  188.         $electricMeterRepository $doctrine->getRepository(ElectricMeter::class);
  189.         $gasMeterRepository $doctrine->getRepository(GasMeter::class);
  190.         $entrepriseRepository $doctrine->getRepository(Entreprise::class);
  191.         $contratRepository $doctrine->getRepository(Contrat::class);
  192.         //convert filters date to datetime
  193.         if(isset($electric_meter_filters['date_debut']) && $electric_meter_filters['date_debut'] !== '') {
  194.             $electric_meter_filters['date_debut'] = new \DateTime($electric_meter_filters['date_debut']);
  195.         }
  196.         if(isset($electric_meter_filters['date_fin']) && $electric_meter_filters['date_fin'] !== '') {
  197.             $electric_meter_filters['date_fin'] = new \DateTime($electric_meter_filters['date_fin']);
  198.         }
  199.         if(isset($gas_meter_filters['date_debut']) && $gas_meter_filters['date_debut'] !== '') {
  200.             $gas_meter_filters['date_debut'] = new \DateTime($gas_meter_filters['date_debut']);
  201.         }
  202.         if(isset($gas_meter_filters['date_fin']) && $gas_meter_filters['date_fin'] !== '') {
  203.             $gas_meter_filters['date_fin'] = new \DateTime($gas_meter_filters['date_fin']);
  204.         }
  205.         // First get filtered entreprises IDs
  206.         $entreprises $entrepriseRepository->createQueryBuilder('e');
  207.         if(isset($entreprise_filters['RaisonSociale']) && $entreprise_filters['RaisonSociale'] !== '') {
  208.             $entreprises->andWhere('e.RaisonSociale LIKE :RaisonSociale')
  209.                 ->setParameter('RaisonSociale''%'.$entreprise_filters['RaisonSociale'].'%');
  210.         }
  211.         if(isset($entreprise_filters['Adresse']) && $entreprise_filters['Adresse'] !== '') {
  212.             $entreprises->andWhere('e.Adresse LIKE :Adresse')
  213.                 ->setParameter('Adresse''%'.$entreprise_filters['Adresse'].'%');
  214.         }
  215.         if(isset($entreprise_filters['Siret']) && $entreprise_filters['Siret'] !== '') {
  216.             $entreprises->andWhere('e.Siret LIKE :Siret')
  217.                 ->setParameter('Siret''%'.$entreprise_filters['Siret'].'%');
  218.         }
  219.         // Gestion du filtrage par plage de codes NAF
  220.         if(isset($entreprise_filters['NafStart']) && $entreprise_filters['NafStart'] !== '' && 
  221.            isset($entreprise_filters['NafEnd']) && $entreprise_filters['NafEnd'] !== '') {
  222.             // Fonction pour extraire la partie numérique du code NAF
  223.             $extractNafNumber = function($naf) {
  224.                 return (int) preg_replace('/[^0-9]/'''substr($naf0, -1));
  225.             };
  226.             
  227.             $nafStart $extractNafNumber($entreprise_filters['NafStart']);
  228.             $nafEnd $extractNafNumber($entreprise_filters['NafEnd']);
  229.             
  230.             // Assurons-nous que nafStart est inférieur à nafEnd
  231.             if ($nafStart $nafEnd) {
  232.                 $temp $nafStart;
  233.                 $nafStart $nafEnd;
  234.                 $nafEnd $temp;
  235.             }
  236.             $entreprises->andWhere(
  237.                 $entreprises->expr()->andX(
  238.                     // La partie numérique du NAF doit être >= à nafStart
  239.                     'CAST(REGEXP_REPLACE(SUBSTRING(e.Naf, 1, LENGTH(e.Naf)-1), \'[^0-9]\', \'\') AS INTEGER) >= :nafStart',
  240.                     // La partie numérique du NAF doit être <= à nafEnd
  241.                     'CAST(REGEXP_REPLACE(SUBSTRING(e.Naf, 1, LENGTH(e.Naf)-1), \'[^0-9]\', \'\') AS INTEGER) <= :nafEnd'
  242.                 )
  243.             )
  244.             ->setParameter('nafStart'$nafStart)
  245.             ->setParameter('nafEnd'$nafEnd);
  246.         }
  247.         if(isset($entreprise_filters['Code_Insee']) && $entreprise_filters['Code_Insee'] !== '') {
  248.             $entreprises->andWhere('e.Code_Insee LIKE :Code_Insee')
  249.                 ->setParameter('Code_Insee''%'.$entreprise_filters['Code_Insee'].'%');
  250.         }
  251.         if(isset($entreprise_filters['Statut']) && $entreprise_filters['Statut'] !== '') {
  252.             $entreprises->andWhere('e.Statut LIKE :Statut')
  253.                 ->setParameter('Statut''%'.$entreprise_filters['Statut'].'%');
  254.         }
  255.         // Get filtered electric meter entreprise IDs
  256.         $electricMeterEntrepriseIds $electricMeterRepository->createQueryBuilder('e')
  257.             ->select('DISTINCT e.entreprise_id')
  258.             ->leftJoin(Contrat::class, 'c''WITH''e.PDL = c.pdl')
  259.             ->orderBy('c.date_debut''DESC');
  260.         if(isset($electric_meter_filters['adresse_compteur']) && $electric_meter_filters['adresse_compteur'] !== '') {
  261.             $electricMeterEntrepriseIds->andWhere('e.adresse_compteur LIKE :adresse_compteur')
  262.                 ->setParameter('adresse_compteur''%'.$electric_meter_filters['adresse_compteur'].'%');
  263.         }
  264.         if(isset($electric_meter_filters['PDL']) && $electric_meter_filters['PDL'] !== '') {
  265.             $electricMeterEntrepriseIds->andWhere('e.PDL LIKE :PDL')
  266.                 ->setParameter('PDL''%'.$electric_meter_filters['PDL'].'%');
  267.         }
  268.         if(isset($electric_meter_filters['Profil']) && $electric_meter_filters['Profil'] !== '') {
  269.             $electricMeterEntrepriseIds->andWhere('e.Profil = :profil_electric')
  270.                 ->setParameter('profil_electric'$electric_meter_filters['Profil']);
  271.         }
  272.         $dateTypeElectric = isset($filters['dateTypeElectricFilter']) ? $filters['dateTypeElectricFilter'] : 'start';
  273.         
  274.         if(isset($electric_meter_filters['date_fin']) && $electric_meter_filters['date_fin'] !== '') {
  275.             if ($dateTypeElectric === 'end') {
  276.                 $electricMeterEntrepriseIds->andWhere('c.date_fin <= :date_fin')
  277.                     ->setParameter('date_fin'$electric_meter_filters['date_fin']);
  278.             } else {
  279.                 $electricMeterEntrepriseIds->andWhere('c.date_debut <= :date_fin')
  280.                     ->setParameter('date_fin'$electric_meter_filters['date_fin']);
  281.             }
  282.         }
  283.         if(isset($electric_meter_filters['date_debut']) && $electric_meter_filters['date_debut'] !== '') {
  284.             if ($dateTypeElectric === 'end') {
  285.                 $electricMeterEntrepriseIds->andWhere('c.date_fin >= :date_debut')
  286.                     ->setParameter('date_debut'$electric_meter_filters['date_debut']);
  287.             } else {
  288.                 $electricMeterEntrepriseIds->andWhere('c.date_debut >= :date_debut')
  289.                     ->setParameter('date_debut'$electric_meter_filters['date_debut']);
  290.             }
  291.         }
  292.         // Get filtered gas meter entreprise IDs
  293.         $gasMeterEntrepriseIds $gasMeterRepository->createQueryBuilder('g')
  294.             ->select('DISTINCT g.entreprise_id')
  295.             ->leftJoin(Contrat::class, 'c''WITH''g.PDL = c.pdl')
  296.             ->orderBy('c.date_debut''DESC');
  297.         if(isset($gas_meter_filters['adresse_compteur']) && $gas_meter_filters['adresse_compteur'] !== '') {
  298.             $gasMeterEntrepriseIds->andWhere('g.adresse_compteur LIKE :adresse_compteur')
  299.                 ->setParameter('adresse_compteur''%'.$gas_meter_filters['adresse_compteur'].'%');
  300.         }
  301.         if(isset($gas_meter_filters['PDL']) && $gas_meter_filters['PDL'] !== '') {
  302.             $gasMeterEntrepriseIds->andWhere('g.PDL LIKE :PDL')
  303.                 ->setParameter('PDL''%'.$gas_meter_filters['PDL'].'%');
  304.         }
  305.         if(isset($gas_meter_filters['Profil']) && $gas_meter_filters['Profil'] !== '') {
  306.             $gasMeterEntrepriseIds->andWhere('g.Profil = :profil_gas')
  307.                 ->setParameter('profil_gas'$gas_meter_filters['Profil']);
  308.         }
  309.         $dateTypeGaz = isset($filters['dateTypeGazFilter']) ? $filters['dateTypeGazFilter'] : 'start';
  310.         
  311.         if(isset($gas_meter_filters['date_fin']) && $gas_meter_filters['date_fin'] !== '') {
  312.             if ($dateTypeGaz === 'end') {
  313.                 $gasMeterEntrepriseIds->andWhere('c.date_fin <= :date_fin')
  314.                     ->setParameter('date_fin'$gas_meter_filters['date_fin']);
  315.             } else {
  316.                 $gasMeterEntrepriseIds->andWhere('c.date_debut <= :date_fin')
  317.                     ->setParameter('date_fin'$gas_meter_filters['date_fin']);
  318.             }
  319.         }
  320.         if(isset($gas_meter_filters['date_debut']) && $gas_meter_filters['date_debut'] !== '') {
  321.             if ($dateTypeGaz === 'end') {
  322.                 $gasMeterEntrepriseIds->andWhere('c.date_fin >= :date_debut')
  323.                     ->setParameter('date_debut'$gas_meter_filters['date_debut']);
  324.             } else {
  325.                 $gasMeterEntrepriseIds->andWhere('c.date_debut >= :date_debut')
  326.                     ->setParameter('date_debut'$gas_meter_filters['date_debut']);
  327.             }
  328.         }
  329.         // Get the entreprise IDs from both meter queries
  330.         $electricMeterIds array_map(function($row) {
  331.             return $row['entreprise_id'];
  332.         }, $electricMeterEntrepriseIds->getQuery()->getResult());
  333.         $gasMeterIds array_map(function($row) {
  334.             return $row['entreprise_id'];
  335.         }, $gasMeterEntrepriseIds->getQuery()->getResult());
  336.         // If any meter filters are applied, filter entreprises by those IDs
  337.         if (!empty($electric_meter_filters) || !empty($gas_meter_filters)) {
  338.             $filteredIds array_unique(array_merge($electricMeterIds$gasMeterIds));
  339.             if (empty($filteredIds)) {
  340.                 // If no meters match the filters, return no enterprises
  341.                 $entreprises->andWhere('e.id = 0'); // This will ensure no results
  342.             } else {
  343.                 $entreprises->andWhere('e.id IN (:meter_entreprise_ids)')
  344.                     ->setParameter('meter_entreprise_ids'$filteredIds);
  345.             }
  346.         }
  347.         $entreprises $entreprises->getQuery()->getResult();
  348.         $entrepriseIds array_map(function($entreprise) {
  349.             return $entreprise->getId();
  350.         }, $entreprises);
  351.         // If no enterprises match the filters, don't return any meters
  352.         if (empty($entrepriseIds)) {
  353.             return new JsonResponse([
  354.                 'electric_meters' => [],
  355.                 'gas_meters' => [],
  356.                 'entreprises' => [],
  357.                 'filters' => $filters,
  358.                 'electric_meter_filters' => $electric_meter_filters,
  359.                 'gas_meter_filters' => $gas_meter_filters,
  360.                 'entreprise_filters' => $entreprise_filters,
  361.             ]);
  362.         }
  363.         // Build the query for electric meters with contracts and filtered entreprises
  364.         $electric_meters $electricMeterRepository->createQueryBuilder('e')
  365.             ->leftJoin(Contrat::class, 'c''WITH''e.PDL = c.pdl')
  366.             ->orderBy('c.date_debut''DESC')
  367.             ->select('e')
  368.             ->distinct()
  369.             ->andWhere('e.entreprise_id IN (:entreprise_ids)')
  370.             ->setParameter('entreprise_ids'$entrepriseIds);
  371.         if(isset($electric_meter_filters['adresse_compteur']) && $electric_meter_filters['adresse_compteur'] !== '') {
  372.             $electric_meters->andWhere('e.adresse_compteur LIKE :adresse_compteur')
  373.                 ->setParameter('adresse_compteur''%'.$electric_meter_filters['adresse_compteur'].'%');
  374.         }
  375.         if(isset($electric_meter_filters['PDL']) && $electric_meter_filters['PDL'] !== '') {
  376.             $electric_meters->andWhere('e.PDL LIKE :PDL')
  377.                 ->setParameter('PDL''%'.$electric_meter_filters['PDL'].'%');
  378.         }
  379.         if(isset($electric_meter_filters['Profil']) && $electric_meter_filters['Profil'] !== '') {
  380.             $electric_meters->andWhere('e.Profil = :profil_electric')
  381.                 ->setParameter('profil_electric'$electric_meter_filters['Profil']);
  382.         }
  383.         
  384.         // Check if there are no contracts after date_fin
  385.         if(isset($electric_meter_filters['date_fin']) && $electric_meter_filters['date_fin'] !== '') {
  386.             if ($dateTypeElectric === 'end') {
  387.                 $electric_meters->andWhere('c.date_fin <= :date_fin')
  388.                     ->setParameter('date_fin'$electric_meter_filters['date_fin']);
  389.             } else {
  390.                 $electric_meters->andWhere('c.date_debut <= :date_fin')
  391.                     ->setParameter('date_fin'$electric_meter_filters['date_fin']);
  392.             }
  393.         }
  394.         
  395.         if(isset($electric_meter_filters['date_debut']) && $electric_meter_filters['date_debut'] !== '') {
  396.             if ($dateTypeElectric === 'end') {
  397.                 $electric_meters->andWhere('c.date_fin >= :date_debut')
  398.                     ->setParameter('date_debut'$electric_meter_filters['date_debut']);
  399.             } else {
  400.                 $electric_meters->andWhere('c.date_debut >= :date_debut')
  401.                     ->setParameter('date_debut'$electric_meter_filters['date_debut']);
  402.             }
  403.         }
  404.         $electric_meters $electric_meters->getQuery()->getResult();
  405.         // Build the query for gas meters with contracts and filtered entreprises
  406.         $gas_meters $gasMeterRepository->createQueryBuilder('g')
  407.             ->leftJoin(Contrat::class, 'c''WITH''g.PDL = c.pdl')
  408.             ->orderBy('c.date_debut''DESC')
  409.             ->select('g')
  410.             ->distinct()
  411.             ->andWhere('g.entreprise_id IN (:entreprise_ids)')
  412.             ->setParameter('entreprise_ids'$entrepriseIds);
  413.         if(isset($gas_meter_filters['adresse_compteur']) && $gas_meter_filters['adresse_compteur'] !== '') {
  414.             $gas_meters->andWhere('g.adresse_compteur LIKE :adresse_compteur')
  415.                 ->setParameter('adresse_compteur''%'.$gas_meter_filters['adresse_compteur'].'%');
  416.         }
  417.         if(isset($gas_meter_filters['PDL']) && $gas_meter_filters['PDL'] !== '') {
  418.             $gas_meters->andWhere('g.PDL LIKE :PDL')
  419.                 ->setParameter('PDL''%'.$gas_meter_filters['PDL'].'%');
  420.         }
  421.         if(isset($gas_meter_filters['Profil']) && $gas_meter_filters['Profil'] !== '') {
  422.             $gas_meters->andWhere('g.Profil = :profil_gas')
  423.                 ->setParameter('profil_gas'$gas_meter_filters['Profil']);
  424.         }
  425.         
  426.         // Check if there are no contracts after date_fin
  427.         if(isset($gas_meter_filters['date_fin']) && $gas_meter_filters['date_fin'] !== '') {
  428.             if ($dateTypeGaz === 'end') {
  429.                 $gas_meters->andWhere('c.date_fin <= :date_fin')
  430.                     ->setParameter('date_fin'$gas_meter_filters['date_fin']);
  431.             } else {
  432.                 $gas_meters->andWhere('c.date_debut <= :date_fin')
  433.                     ->setParameter('date_fin'$gas_meter_filters['date_fin']);
  434.             }
  435.         }
  436.         
  437.         if(isset($gas_meter_filters['date_debut']) && $gas_meter_filters['date_debut'] !== '') {
  438.             if ($dateTypeGaz === 'end') {
  439.                 $gas_meters->andWhere('c.date_fin >= :date_debut')
  440.                     ->setParameter('date_debut'$gas_meter_filters['date_debut']);
  441.             } else {
  442.                 $gas_meters->andWhere('c.date_debut >= :date_debut')
  443.                     ->setParameter('date_debut'$gas_meter_filters['date_debut']);
  444.             }
  445.         }
  446.         $gas_meters $gas_meters->getQuery()->getResult();
  447.         // Prepare arrays for response
  448.         $electric_meters_array = [];
  449.         foreach ($electric_meters as $electric_meter) {
  450.             $entreprise $doctrine->getRepository(Entreprise::class)->find($electric_meter->getEntrepriseId());
  451.             // Get the latest contract for this PDL
  452.             $latestContract $contratRepository->createQueryBuilder('c')
  453.                 ->where('c.pdl = :pdl')
  454.                 ->setParameter('pdl'$electric_meter->getPDL())
  455.                 ->orderBy('c.date_debut''DESC')
  456.                 ->setMaxResults(1)
  457.                 ->getQuery()
  458.                 ->getOneOrNullResult();
  459.             $electric_meters_array[] = [
  460.                 $entreprise $entreprise->getRaisonSociale() : '',
  461.                 $electric_meter->getAdresseCompteur(),
  462.                 $electric_meter->getPDL(),
  463.                 ($latestContract && $latestContract->getDateDebut()) ? $latestContract->getDateDebut()->format('d/m/Y') : '',
  464.                 ($latestContract && $latestContract->getDateFin()) ? $latestContract->getDateFin()->format('d/m/Y') : '',
  465.                 $electric_meter->getProfil(),
  466.                 $latestContract $latestContract->getCAR() : $electric_meter->getCAR(),
  467.                 $latestContract $latestContract->getFournisseur() : $electric_meter->getFournisseur(),
  468.                 $electric_meter->getPrix(),
  469.                 '',
  470.             ];
  471.         }
  472.         $gas_meters_array = [];
  473.         foreach ($gas_meters as $gas_meter) {
  474.             $entreprise $doctrine->getRepository(Entreprise::class)->find($gas_meter->getEntrepriseId());
  475.             // Get the latest contract for this PDL
  476.             $latestContract $contratRepository->createQueryBuilder('c')
  477.                 ->where('c.pdl = :pdl')
  478.                 ->setParameter('pdl'$gas_meter->getPDL())
  479.                 ->orderBy('c.date_debut''DESC')
  480.                 ->setMaxResults(1)
  481.                 ->getQuery()
  482.                 ->getOneOrNullResult();
  483.             $gas_meters_array[] = [
  484.                 $entreprise $entreprise->getRaisonSociale() : '',
  485.                 $gas_meter->getAdresseCompteur(),
  486.                 $gas_meter->getPDL(),
  487.                 ($latestContract && $latestContract->getDateDebut()) ? $latestContract->getDateDebut()->format('d/m/Y') : '',
  488.                 ($latestContract && $latestContract->getDateFin()) ? $latestContract->getDateFin()->format('d/m/Y') : '',
  489.                 $gas_meter->getProfil(),
  490.                 $latestContract $latestContract->getCAR() : $gas_meter->getCAR(),
  491.                 $latestContract $latestContract->getFournisseur() : $gas_meter->getFournisseur(),
  492.                 $gas_meter->getPrix(),
  493.                 '',
  494.             ];
  495.         }
  496.         $entreprises_array = [];
  497.         foreach ($entreprises as $entreprise) {
  498.             $entreprises_array[] = [
  499.                 $entreprise->getRaisonSociale(),
  500.                 $entreprise->getAdresse(),
  501.                 $entreprise->getSiret(),
  502.                 $entreprise->getNaf(),
  503.                 $entreprise->getCodeInsee(),
  504.                 $entreprise->getStatut(),
  505.                 '',
  506.             ];
  507.         }
  508.         return new JsonResponse([
  509.             'electric_meters' => $electric_meters_array,
  510.             'gas_meters' => $gas_meters_array,
  511.             'entreprises' => $entreprises_array,
  512.             'filters' => $filters,
  513.             'electric_meter_filters' => $electric_meter_filters,
  514.             'gas_meter_filters' => $gas_meter_filters,
  515.             'entreprise_filters' => $entreprise_filters,
  516.         ]);
  517.     }
  518. }