src/Repository/EtablissementRepository.php line 287

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * Copyright (C) Office National de Publication et de Communication - All Rights Reserved
  5.  *
  6.  * Unauthorized copying of this file, via any medium is strictly prohibited by law
  7.  * This file is proprietary and confidential
  8.  */
  9. namespace App\Repository;
  10. use App\Entity\Delegue;
  11. use App\Entity\Etablissement;
  12. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  13. use Doctrine\ORM\Query;
  14. use Doctrine\ORM\QueryBuilder;
  15. use Doctrine\Persistence\ManagerRegistry;
  16. /**
  17.  * @method null|Etablissement find($id, $lockMode = null, $lockVersion = null)
  18.  * @method null|Etablissement findOneBy(array $criteria, array $orderBy = null)
  19.  * @method Etablissement[]    findAll()
  20.  * @method Etablissement[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  21.  */
  22. final class EtablissementRepository extends ServiceEntityRepository
  23. {
  24.     private const CACHE_LIFETIME 60;
  25.     public function __construct(ManagerRegistry $registry)
  26.     {
  27.         parent::__construct($registryEtablissement::class);
  28.     }
  29.     public function createQueryBuilder($alias$indexBy null)
  30.     {
  31.         return parent::createQueryBuilder($alias$indexBy)
  32.             // Gestionnaire
  33.             ->leftJoin("${alias}.gestionnaire"'gestionnaire')
  34.             ->addSelect('gestionnaire')
  35.             // Adresse
  36.             ->leftJoin("${alias}.ville"'ville')
  37.             ->addSelect('ville')
  38.             ->leftJoin('ville.coordonnees''villeCoordonnees')
  39.             ->addSelect('villeCoordonnees')
  40.             ->leftJoin('ville.departement''departement')
  41.             ->addSelect('departement')
  42.             ->leftJoin('departement.coordonnees''departementCoordonnees')
  43.             ->addSelect('departementCoordonnees')
  44.             ->leftJoin('departement.ancienneRegion''ancienneRegion')
  45.             ->addSelect('ancienneRegion')
  46.             ->leftJoin('ancienneRegion.region''region')
  47.             ->addSelect('region')
  48.             ->leftJoin('region.pays''pays')
  49.             ->addSelect('pays')
  50.             // Categorie
  51.             ->leftJoin("${alias}.categoriePrimaire"'categoriePrimaire')
  52.             ->addSelect('categoriePrimaire')
  53.             // ->leftJoin("${alias}.categoriesSecondaires", 'categoriesSecondaires')
  54.             // ->addSelect('categoriesSecondaires')
  55.             // Place disponible
  56.             // ->leftJoin("${alias}.placeDisponible", 'placeDisponible')
  57.             // ->addSelect('placeDisponible')
  58.             // Texte référencement
  59.             ->leftJoin("${alias}.texteReferencement"'texteReferencement')
  60.             ->addSelect('texteReferencement');
  61.     }
  62.     public function createQueryBuilderLight($alias$indexBy null)
  63.     {
  64.         return parent::createQueryBuilder($alias$indexBy);
  65.     }
  66.     public function createQueryBuilderByEmailResponsable(string $email): QueryBuilder
  67.     {
  68.         $queryBuilder $this->createQueryBuilder('e');
  69.         $queryBuilder
  70.             ->where($queryBuilder->expr()->eq('e.emailPrincipal'':email'))
  71.             ->setParameter('email'$email);
  72.         return $queryBuilder;
  73.     }
  74.     public function findByIdsForTracing(array $ids): array
  75.     {
  76.         $ids array_values(array_unique(array_filter($ids)));
  77.         if (empty($ids)) {
  78.             return [];
  79.         }
  80.         $queryBuilder parent::createQueryBuilder('e');
  81.         return $queryBuilder
  82.             ->andWhere($queryBuilder->expr()->in('e.id'':ids'))
  83.             ->setParameter('ids'$ids)
  84.             ->getQuery()
  85.             ->getResult();
  86.         //
  87.         // $result = [];
  88.         // foreach ($list as $etab) {
  89.         //     $result[$etab->getId()] = $etab;
  90.         // }
  91.         //
  92.         // return $result;
  93.     }
  94.     // public function findFournisseurs(): array
  95.     // {
  96.     //     $queryBuilder = $this->createQueryBuilder('e');
  97.     //
  98.     //     return $queryBuilder
  99.     //         ->andWhere($queryBuilder->expr()->eq('e.type', ':type'))
  100.     //         ->setParameter('type', 'fournisseur')
  101.     //         ->andWhere(
  102.     //             $queryBuilder->expr()->orX(
  103.     //                 $queryBuilder->expr()->eq('e.presenceWeb', true),
  104.     //                 $queryBuilder->expr()->eq('e.droitForfaitGX', true)
  105.     //             )
  106.     //         )
  107.     //         ->setMaxResults(100)
  108.     //         ->getQuery()
  109.     //         ->getResult();
  110.     // }
  111.     public function findByEmailResponsable(string $email): array
  112.     {
  113.         if (!$email) {
  114.             return [];
  115.         }
  116.         return $this
  117.             ->createQueryBuilderByEmailResponsable($email)
  118.             ->getQuery()
  119.             ->getResult();
  120.     }
  121.     public function findByEmailDelegue(string $email): array
  122.     {
  123.         return [];
  124.         // /** @var Delegue $delegue */
  125.         // $delegue = $this
  126.         //     ->getEntityManager()
  127.         //     ->getRepository(Delegue::class)
  128.         //     ->find($email)
  129.         // ;
  130.         // $idsDepartements = $delegue ? $delegue->getIdsDepartement() : [];
  131.         // if (!$idsDepartements) {
  132.         //     return [];
  133.         // }
  134.         //
  135.         // $queryBuilder = $this->createQueryBuilder('e');
  136.         // $queryBuilder
  137.         //     ->leftJoin('e.ville', 'v')
  138.         //     ->leftJoin('v.departement', 'd')
  139.         //     ->leftJoin('e.gestionnaire', 'g')
  140.         //     ->leftJoin('g.ville', 'gv')
  141.         //     ->leftJoin('gv.departement', 'gd')
  142.         //     ->where(
  143.         //         $queryBuilder->expr()->orX(
  144.         //             // Non gérés
  145.         //             $queryBuilder->expr()->andX(
  146.         //                 $queryBuilder->expr()->neq('e.typeGestion', 'géré'),
  147.         //                 $queryBuilder->expr()->orX(
  148.         //                     // responsable direct
  149.         //                     $queryBuilder->expr()->eq('e.emailDelegue', ':email'),
  150.         //                     // dans ses départements sur sa responsabilité
  151.         //                     $queryBuilder->expr()->andX(
  152.         //                         $queryBuilder->expr()->isNull('e.emailDelegue'),
  153.         //                         $queryBuilder->expr()->in('d.id', ':idsDepartements')
  154.         //                     )
  155.         //                 )
  156.         //             ),
  157.         //             // Gérés
  158.         //             $queryBuilder->expr()->andX(
  159.         //                 $queryBuilder->expr()->eq('e.typeGestion', 'géré'),
  160.         //                 $queryBuilder->expr()->orX(
  161.         //                     // responsable direct
  162.         //                     $queryBuilder->expr()->eq('g.emailDelegue', ':email'),
  163.         //                     // dans ses départements sur sa responsabilité
  164.         //                     $queryBuilder->expr()->andX(
  165.         //                         $queryBuilder->expr()->isNull('g.emailDelegue'),
  166.         //                         $queryBuilder->expr()->in('gd.id', ':idsDepartements')
  167.         //                     )
  168.         //                 )
  169.         //             )
  170.         //         )
  171.         //     )
  172.         //     ->setParameter('email', $email)
  173.         //     ->setParameter('idsDepartements', $idsDepartements)
  174.         // ;
  175.         //
  176.         // return $queryBuilder->getQuery()->getResult();
  177.     }
  178.     public function findAllVisibles(): array
  179.     {
  180.         $queryBuilder $this->createQueryBuilder('e');
  181.         return $queryBuilder
  182.             ->where($queryBuilder->expr()->eq('e.actif'true))
  183.             ->where($queryBuilder->expr()->isNotNull('e.denomination'))
  184.             // ->setMaxResults(1000) // DEBUG
  185.             ->getQuery()
  186.             ->getResult();
  187.     }
  188.     public function findClients(): array
  189.     {
  190.         return $this
  191.             ->createQueryBuilderClient()
  192.             ->orderBy('e.maj''DESC')
  193.             ->getQuery()
  194.             ->getResult();
  195.     }
  196.     public function countParticipantes(): int
  197.     {
  198.         $queryBuilder $this->createQueryBuilderClient();
  199.         return (int) $queryBuilder
  200.             ->select($queryBuilder->expr()->count('e'))
  201.             ->getQuery()
  202.             ->getSingleScalarResult();
  203.     }
  204.     public function countForfaitGx(): int
  205.     {
  206.         $queryBuilder parent::createQueryBuilder('e');
  207.         return (int) $queryBuilder
  208.             ->select($queryBuilder->expr()->count('e'))
  209.             ->where($queryBuilder->expr()->eq('e.droitForfaitGX'true))
  210.             ->getQuery()
  211.             ->getSingleScalarResult();
  212.     }
  213.     public function findDenominationsByTerm(string $termint $max): array
  214.     {
  215.         $term trim($term);
  216.         if (empty($term) || $max 1) {
  217.             return [];
  218.         }
  219.         $queryBuilder parent::createQueryBuilder('e');
  220.         $rows $queryBuilder
  221.             ->select('e.denomination')
  222.             ->where($queryBuilder->expr()->like('e.denomination'':term'))
  223.             ->setParameter('term''%'.$term.'%')
  224.             ->setMaxResults($max)
  225.             ->addGroupBy('e.denomination')
  226.             ->getQuery()
  227.             ->setHint(Query::HINT_FORCE_PARTIAL_LOADtrue)
  228.             ->useResultCache(trueself::CACHE_LIFETIME)
  229.             ->getScalarResult();
  230.         return array_column($rows'denomination');
  231.     }
  232.     private function createQueryBuilderClient(): QueryBuilder
  233.     {
  234.         $queryBuilder $this->createQueryBuilder('e');
  235.         $queryBuilder
  236.             ->where($queryBuilder->expr()->eq('e.actif'true))
  237.             ->where($queryBuilder->expr()->eq('e.presenceWeb'true));
  238.         return $queryBuilder;
  239.     }
  240.     public function findOrganismes(string $cathoLaicstring $categorie$departement$region): array
  241.     {
  242.         $queryBuilder parent::createQueryBuilder('e');
  243.         $catho $cathoLaic == "catholique" 0;
  244.         $qb $queryBuilder
  245.             ->select('e')
  246.             ->where("e.id LIKE 'OR%'")
  247.             ->andWhere("e.catholique = $catho")
  248.             ->andWhere("e.presenceWeb = 1")
  249.             ->andWhere("e.categorieOrganisme = '$categorie'");
  250.         if ($region)
  251.             $qb->andWhere("e.region = '$region'");
  252.         if ($departement)
  253.             $qb->andWhere("e.departement = '$departement'");
  254.         $rows=$qb->getQuery()->getResult();
  255.         return $rows;
  256.     }
  257.     public function findOrganismesCentresOrientationPublics(): array
  258.     {
  259.         $queryBuilder parent::createQueryBuilder('e');
  260.         $qb $queryBuilder
  261.             ->select('e')
  262.             ->where("e.id LIKE 'OR%'")
  263.             ->andWhere("e.catholique = 0")
  264.             ->andWhere("e.rubrique = 'ORSOLAICPUCIDJ'")
  265.             ->andWhere("e.presenceWeb = 1");
  266.         $rows=$qb->getQuery()->getResult();
  267.         return $rows;
  268.     }
  269.     public function findFournisseurs(string $cathoLaicstring $categorie$departement$region): array
  270.     {
  271.         $queryBuilder parent::createQueryBuilder('e');
  272.         $catho $cathoLaic == "catholique" 0;
  273.         $qb $queryBuilder
  274.             ->select('e')
  275.             ->where("e.id LIKE 'FO%'")
  276.             ->andWhere("e.presenceWeb = 1");
  277.         $rows=$qb->getQuery()->getResult();
  278.         return $rows;
  279.     }
  280.     // Pour le lien "L'ORIENTATION SCOLAIRE"
  281.     public function findCentresOrientationScolaire(): array
  282.     {
  283.         $queryBuilder parent::createQueryBuilder('e');
  284.         $qb $queryBuilder
  285.             ->select('e')
  286.             ->where("e.id LIKE 'OR%'")
  287.             ->andWhere("e.rubrique IN ('ORSOCATINFCMON', 'ORSOCATINFCCRE', 'ORSOCATINFCAIX', 'ORSOCATINFCCAE', 'ORSOCATINFCDIJ', 'ORSOCATINFCBES', 'ORSOCATINFCTOU', 'ORSOCATINFCBOR', 'ORSOCATINFCGRE', 'ORSOCATINFCNAT', 'ORSOCATINFCORL', 'ORSOCATINFCREI', 'ORSOCATINFCNAN', 'ORSOCATINFCLIL', 'ORSOCATINFCAMI', 'ORSOCATINFCCLE', 'ORSOCATINFCSTR', 'ORSOCATINFCLYO', 'ORSOLAICPUCIDJ', 'ORSOCATINFCPAR', 'ORSOCATINFCROU', 'ORSOCATINFCVER', 'ORSOCATINFCNIC', 'ORSOCATINFCLIM', 'ORSOCATINFCGUA', 'ORSOCATINFCMAR', 'ORSOCATINFCREU')");
  288.         $rows=$qb->getQuery()->getResult();
  289.         return $rows;
  290.     }
  291.     public function findHavingJouveDiapo(): array
  292.     {
  293.         $queryBuilder $this->createQueryBuilder('e');
  294.         return $queryBuilder
  295.             ->where($queryBuilder->expr()->isNotNull('e.imagesDiaporama'))
  296.             ->getQuery()
  297.             ->getResult();
  298.     }    
  299.     public function findMany(array $ids): array {
  300.         $queryBuilder $this->createQueryBuilder('e');
  301.         return $queryBuilder
  302.             ->getQuery()
  303.             ->getResult();
  304.     }
  305.     /**
  306.      * Used by Elastica to transform results to model
  307.      * 
  308.      * @param string $entityAlias
  309.      * @return  Doctrine\ORM\QueryBuilder
  310.      */
  311.     public function createCustomSearchQueryBuilder($alias$indexBy null) {
  312.         return parent::createQueryBuilder($alias$indexBy)
  313.             ->leftJoin("${alias}.ville"'ville')
  314.             ->addSelect('ville')
  315.             ->leftJoin('ville.coordonnees''villeCoordonnees')
  316.             ->addSelect('villeCoordonnees')
  317.             ->leftJoin('ville.departement''departement')
  318.             ->addSelect('departement')
  319.             ->leftJoin('departement.coordonnees''departementCoordonnees')
  320.             ->addSelect('departementCoordonnees')
  321.             ->leftJoin('departement.ancienneRegion''ancienneRegion')
  322.             ->addSelect('ancienneRegion')
  323.             ->leftJoin('ancienneRegion.region''region')
  324.             ->addSelect('region')
  325.             ->leftJoin('region.pays''pays')
  326.             ->addSelect('pays')
  327.             ->leftJoin("${alias}.categoriePrimaire"'categoriePrimaire')
  328.             ->addSelect('categoriePrimaire')
  329.             ->leftJoin("${alias}.texteReferencement"'texteReferencement')
  330.             ->addSelect('texteReferencement')
  331.             
  332.             // sql -- pour aller charger la diapo principale
  333.             ->leftJoin("${alias}.diaporamas"'diaporama'// réduire les requetesSQL car OneToOne
  334.             ->addSelect('diaporama')
  335.             // ->where('diaporama.principal = 1') // ça bug
  336.             ->leftJoin('diaporama.photo''photo'// réduire les requetesSQL car OneToOne
  337.             ->addSelect('photo')
  338.             ->leftJoin("${alias}.videos"'video'// réduire les requetesSQL car OneToOne
  339.             ->addSelect('video')
  340.             ->leftJoin("${alias}.logo"'logo'
  341.             ->addSelect('logo'// avec le nv filtre des langues le temps d'exce est pareil, donc autant gagner en requêtes SQL :)
  342.         ;
  343.     }
  344.     // Etabs visibles n'ayant pas d'url
  345.     public function findNotHavingPath(): array
  346.     {
  347.         $queryBuilder $this->createCustomSearchQueryBuilder('e');
  348.         return $queryBuilder
  349.             ->andWhere($queryBuilder->expr()->isNotNull('e.denomination'))
  350.             ->andWhere($queryBuilder->expr()->isNull('e.path'))
  351.             ->getQuery()
  352.             ->getResult();
  353.     }
  354.     // Etabs visibles n'ayant pas de composion de l'ensemble scolaire
  355.     public function findNotHavingCompositionEnsembleScolaire(): array
  356.     {
  357.         $queryBuilder $this->createQueryBuilder('e');
  358.         return $queryBuilder
  359.             ->where($queryBuilder->expr()->eq('e.actif'true))
  360.             ->andWhere($queryBuilder->expr()->isNotNull('e.denomination'))
  361.             ->andWhere($queryBuilder->expr()->isNull('e.compositionEnsembleScolaire'))
  362.             // ->andWhere("e.id = 'ET075-469'") // DEBU
  363.             // ->setMaxResults(100)    // DEBUG
  364.             ->getQuery()
  365.             ->getResult();
  366.     }   
  367.     
  368.     // Surcharger afin de pouvoir optimiser
  369.     public function findById(array $ids): array
  370.     {
  371.         $ids array_values(array_unique(array_filter($ids)));
  372.         if (empty($ids)) {
  373.             return [];
  374.         }
  375.         $queryBuilder parent::createQueryBuilder('e');
  376.         return $queryBuilder
  377.             // ->addSelect('e')
  378.             ->leftJoin('e.gestionnaire''g')
  379.             ->addSelect('g')
  380.             // ->leftJoin('g.ville', 'gville')
  381.             // ->addSelect('gville')
  382.             // ->leftJoin('gville.coordonnees', 'gvilleCoordonnees')
  383.             // ->addSelect('gvilleCoordonnees')
  384.             ->leftJoin("g.texteReferencement"'gtexteReferencement')
  385.             ->addSelect('gtexteReferencement')
  386.             
  387.             ->leftJoin("e.ville"'ville')
  388.             ->addSelect('ville')
  389.             ->leftJoin('ville.coordonnees''villeCoordonnees')
  390.             ->addSelect('villeCoordonnees')
  391.             ->leftJoin('ville.departement''departement')
  392.             ->addSelect('departement')
  393.             ->leftJoin('departement.coordonnees''departementCoordonnees')
  394.             ->addSelect('departementCoordonnees')
  395.             ->leftJoin('departement.ancienneRegion''ancienneRegion')
  396.             ->addSelect('ancienneRegion')
  397.             ->leftJoin('ancienneRegion.region''region')
  398.             ->addSelect('region')
  399.             ->leftJoin('region.pays''pays')
  400.             ->addSelect('pays')
  401.             ->leftJoin("e.categoriePrimaire"'categoriePrimaire')
  402.             ->addSelect('categoriePrimaire')
  403.             ->leftJoin("e.texteReferencement"'texteReferencement')
  404.             ->addSelect('texteReferencement')
  405.             
  406.             // sql -- pour aller charger la diapo principale
  407.             ->leftJoin("e.diaporamas"'diaporama'// réduire les requetesSQL car OneToOne
  408.             ->addSelect('diaporama')
  409.             // ->where('diaporama.principal = 1') // ça bug
  410.             ->leftJoin('diaporama.photo''photo'// réduire les requetesSQL car OneToOne
  411.             ->addSelect('photo')
  412.             ->leftJoin("e.videos"'video'// réduire les requetesSQL car OneToOne
  413.             ->addSelect('video')
  414.             ->leftJoin("e.logo"'logo'// réduire les requetesSQL car OneToOne
  415.             ->addSelect('logo')
  416.             ->andWhere($queryBuilder->expr()->in('e.id'':ids'))
  417.             ->setParameter('ids'$ids)
  418.             ->getQuery()
  419.             ->getResult()
  420.         ;
  421.         // $queryBuilder = $this->createQueryBuilder('e');
  422.         $queryBuilder parent::createQueryBuilder('e');
  423.         // $queryBuilder = $this->createCustomSearchQueryBuilder('e');
  424.         
  425.         return $queryBuilder
  426.             ->leftJoin('e.gestionnaire''g')
  427.             ->addSelect('g')
  428.             ->andWhere($queryBuilder->expr()->in('e.id'':ids'))
  429.             ->setParameter('ids'$ids)
  430.             ->getQuery()
  431.             ->getResult();
  432.         //
  433.         // $result = [];
  434.         // foreach ($list as $etab) {
  435.         //     $result[$etab->getId()] = $etab;
  436.         // }
  437.         //
  438.         // return $result;
  439.     }
  440.     public function findAllWithUai($limit null$force false$prospectOnly false): array
  441.     {
  442.         $queryBuilder $this->createQueryBuilder('e');
  443.         $queryBuilder
  444.             ->where($queryBuilder->expr()->eq('e.actif'true))
  445.             ->andWhere($queryBuilder->expr()->isNotNull('e.denomination'))
  446.             ->andWhere($queryBuilder->expr()->isNotNull('e.numeroAdministratifUai'))
  447.             ->andWhere($queryBuilder->expr()->neq('e.numeroAdministratifUai'':notEmpty'))
  448.             ->setParameter('notEmpty''');
  449.         if (!$force) {
  450.             $queryBuilder
  451.                 ->leftJoin('e.data''ed')
  452.                 ->andWhere($queryBuilder->expr()->isNull('ed.id'));
  453.         } 
  454.         if ($limit !== null) {
  455.             $queryBuilder->setMaxResults((int)$limit);
  456.             $queryBuilder->addOrderBy('RAND()');
  457.         }
  458.         if ($prospectOnly) {
  459.             $queryBuilder
  460.                 ->andWhere($queryBuilder->expr()->eq('e.participant'false));
  461.         }
  462.         return $queryBuilder
  463.             ->getQuery()
  464.             ->getResult();
  465.     }
  466.     public function removeAllEtablissementData(Etablissement $etablissement): void
  467.     {
  468.         $em $this->getEntityManager();
  469.         $qb $em->createQueryBuilder()
  470.             ->delete('App\Entity\EtablissementData''ed')
  471.             ->where('ed.etablissement = :etablissement')
  472.             ->setParameter('etablissement'$etablissement);
  473.         $qb->getQuery()->execute();
  474.     }
  475. }