<?php
declare(strict_types=1);
/*
* Copyright (C) Office National de Publication et de Communication - All Rights Reserved
*
* Unauthorized copying of this file, via any medium is strictly prohibited by law
* This file is proprietary and confidential
*/
namespace App\Repository;
use App\Entity\Delegue;
use App\Entity\Etablissement;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method null|Etablissement find($id, $lockMode = null, $lockVersion = null)
* @method null|Etablissement findOneBy(array $criteria, array $orderBy = null)
* @method Etablissement[] findAll()
* @method Etablissement[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
final class EtablissementRepository extends ServiceEntityRepository
{
private const CACHE_LIFETIME = 60;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Etablissement::class);
}
public function createQueryBuilder($alias, $indexBy = null)
{
return parent::createQueryBuilder($alias, $indexBy)
// Gestionnaire
->leftJoin("${alias}.gestionnaire", 'gestionnaire')
->addSelect('gestionnaire')
// Adresse
->leftJoin("${alias}.ville", 'ville')
->addSelect('ville')
->leftJoin('ville.coordonnees', 'villeCoordonnees')
->addSelect('villeCoordonnees')
->leftJoin('ville.departement', 'departement')
->addSelect('departement')
->leftJoin('departement.coordonnees', 'departementCoordonnees')
->addSelect('departementCoordonnees')
->leftJoin('departement.ancienneRegion', 'ancienneRegion')
->addSelect('ancienneRegion')
->leftJoin('ancienneRegion.region', 'region')
->addSelect('region')
->leftJoin('region.pays', 'pays')
->addSelect('pays')
// Categorie
->leftJoin("${alias}.categoriePrimaire", 'categoriePrimaire')
->addSelect('categoriePrimaire')
// ->leftJoin("${alias}.categoriesSecondaires", 'categoriesSecondaires')
// ->addSelect('categoriesSecondaires')
// Place disponible
// ->leftJoin("${alias}.placeDisponible", 'placeDisponible')
// ->addSelect('placeDisponible')
// Texte référencement
->leftJoin("${alias}.texteReferencement", 'texteReferencement')
->addSelect('texteReferencement');
}
public function createQueryBuilderLight($alias, $indexBy = null)
{
return parent::createQueryBuilder($alias, $indexBy);
}
public function createQueryBuilderByEmailResponsable(string $email): QueryBuilder
{
$queryBuilder = $this->createQueryBuilder('e');
$queryBuilder
->where($queryBuilder->expr()->eq('e.emailPrincipal', ':email'))
->setParameter('email', $email);
return $queryBuilder;
}
public function findByIdsForTracing(array $ids): array
{
$ids = array_values(array_unique(array_filter($ids)));
if (empty($ids)) {
return [];
}
$queryBuilder = parent::createQueryBuilder('e');
return $queryBuilder
->andWhere($queryBuilder->expr()->in('e.id', ':ids'))
->setParameter('ids', $ids)
->getQuery()
->getResult();
//
// $result = [];
// foreach ($list as $etab) {
// $result[$etab->getId()] = $etab;
// }
//
// return $result;
}
// public function findFournisseurs(): array
// {
// $queryBuilder = $this->createQueryBuilder('e');
//
// return $queryBuilder
// ->andWhere($queryBuilder->expr()->eq('e.type', ':type'))
// ->setParameter('type', 'fournisseur')
// ->andWhere(
// $queryBuilder->expr()->orX(
// $queryBuilder->expr()->eq('e.presenceWeb', true),
// $queryBuilder->expr()->eq('e.droitForfaitGX', true)
// )
// )
// ->setMaxResults(100)
// ->getQuery()
// ->getResult();
// }
public function findByEmailResponsable(string $email): array
{
if (!$email) {
return [];
}
return $this
->createQueryBuilderByEmailResponsable($email)
->getQuery()
->getResult();
}
public function findByEmailDelegue(string $email): array
{
return [];
// /** @var Delegue $delegue */
// $delegue = $this
// ->getEntityManager()
// ->getRepository(Delegue::class)
// ->find($email)
// ;
// $idsDepartements = $delegue ? $delegue->getIdsDepartement() : [];
// if (!$idsDepartements) {
// return [];
// }
//
// $queryBuilder = $this->createQueryBuilder('e');
// $queryBuilder
// ->leftJoin('e.ville', 'v')
// ->leftJoin('v.departement', 'd')
// ->leftJoin('e.gestionnaire', 'g')
// ->leftJoin('g.ville', 'gv')
// ->leftJoin('gv.departement', 'gd')
// ->where(
// $queryBuilder->expr()->orX(
// // Non gérés
// $queryBuilder->expr()->andX(
// $queryBuilder->expr()->neq('e.typeGestion', 'géré'),
// $queryBuilder->expr()->orX(
// // responsable direct
// $queryBuilder->expr()->eq('e.emailDelegue', ':email'),
// // dans ses départements sur sa responsabilité
// $queryBuilder->expr()->andX(
// $queryBuilder->expr()->isNull('e.emailDelegue'),
// $queryBuilder->expr()->in('d.id', ':idsDepartements')
// )
// )
// ),
// // Gérés
// $queryBuilder->expr()->andX(
// $queryBuilder->expr()->eq('e.typeGestion', 'géré'),
// $queryBuilder->expr()->orX(
// // responsable direct
// $queryBuilder->expr()->eq('g.emailDelegue', ':email'),
// // dans ses départements sur sa responsabilité
// $queryBuilder->expr()->andX(
// $queryBuilder->expr()->isNull('g.emailDelegue'),
// $queryBuilder->expr()->in('gd.id', ':idsDepartements')
// )
// )
// )
// )
// )
// ->setParameter('email', $email)
// ->setParameter('idsDepartements', $idsDepartements)
// ;
//
// return $queryBuilder->getQuery()->getResult();
}
public function findAllVisibles(): array
{
$queryBuilder = $this->createQueryBuilder('e');
return $queryBuilder
->where($queryBuilder->expr()->eq('e.actif', true))
->where($queryBuilder->expr()->isNotNull('e.denomination'))
// ->setMaxResults(1000) // DEBUG
->getQuery()
->getResult();
}
public function findClients(): array
{
return $this
->createQueryBuilderClient()
->orderBy('e.maj', 'DESC')
->getQuery()
->getResult();
}
public function countParticipantes(): int
{
$queryBuilder = $this->createQueryBuilderClient();
return (int) $queryBuilder
->select($queryBuilder->expr()->count('e'))
->getQuery()
->getSingleScalarResult();
}
public function countForfaitGx(): int
{
$queryBuilder = parent::createQueryBuilder('e');
return (int) $queryBuilder
->select($queryBuilder->expr()->count('e'))
->where($queryBuilder->expr()->eq('e.droitForfaitGX', true))
->getQuery()
->getSingleScalarResult();
}
public function findDenominationsByTerm(string $term, int $max): array
{
$term = trim($term);
if (empty($term) || $max < 1) {
return [];
}
$queryBuilder = parent::createQueryBuilder('e');
$rows = $queryBuilder
->select('e.denomination')
->where($queryBuilder->expr()->like('e.denomination', ':term'))
->setParameter('term', '%'.$term.'%')
->setMaxResults($max)
->addGroupBy('e.denomination')
->getQuery()
->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
->useResultCache(true, self::CACHE_LIFETIME)
->getScalarResult();
return array_column($rows, 'denomination');
}
private function createQueryBuilderClient(): QueryBuilder
{
$queryBuilder = $this->createQueryBuilder('e');
$queryBuilder
->where($queryBuilder->expr()->eq('e.actif', true))
->where($queryBuilder->expr()->eq('e.presenceWeb', true));
return $queryBuilder;
}
public function findOrganismes(string $cathoLaic, string $categorie, $departement, $region): array
{
$queryBuilder = parent::createQueryBuilder('e');
$catho = $cathoLaic == "catholique" ? 1 : 0;
$qb = $queryBuilder
->select('e')
->where("e.id LIKE 'OR%'")
->andWhere("e.catholique = $catho")
->andWhere("e.presenceWeb = 1")
->andWhere("e.categorieOrganisme = '$categorie'");
if ($region)
$qb->andWhere("e.region = '$region'");
if ($departement)
$qb->andWhere("e.departement = '$departement'");
$rows=$qb->getQuery()->getResult();
return $rows;
}
public function findOrganismesCentresOrientationPublics(): array
{
$queryBuilder = parent::createQueryBuilder('e');
$qb = $queryBuilder
->select('e')
->where("e.id LIKE 'OR%'")
->andWhere("e.catholique = 0")
->andWhere("e.rubrique = 'ORSOLAICPUCIDJ'")
->andWhere("e.presenceWeb = 1");
$rows=$qb->getQuery()->getResult();
return $rows;
}
public function findFournisseurs(string $cathoLaic, string $categorie, $departement, $region): array
{
$queryBuilder = parent::createQueryBuilder('e');
$catho = $cathoLaic == "catholique" ? 1 : 0;
$qb = $queryBuilder
->select('e')
->where("e.id LIKE 'FO%'")
->andWhere("e.presenceWeb = 1");
$rows=$qb->getQuery()->getResult();
return $rows;
}
// Pour le lien "L'ORIENTATION SCOLAIRE"
public function findCentresOrientationScolaire(): array
{
$queryBuilder = parent::createQueryBuilder('e');
$qb = $queryBuilder
->select('e')
->where("e.id LIKE 'OR%'")
->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')");
$rows=$qb->getQuery()->getResult();
return $rows;
}
public function findHavingJouveDiapo(): array
{
$queryBuilder = $this->createQueryBuilder('e');
return $queryBuilder
->where($queryBuilder->expr()->isNotNull('e.imagesDiaporama'))
->getQuery()
->getResult();
}
public function findMany(array $ids): array {
$queryBuilder = $this->createQueryBuilder('e');
return $queryBuilder
->getQuery()
->getResult();
}
/**
* Used by Elastica to transform results to model
*
* @param string $entityAlias
* @return Doctrine\ORM\QueryBuilder
*/
public function createCustomSearchQueryBuilder($alias, $indexBy = null) {
return parent::createQueryBuilder($alias, $indexBy)
->leftJoin("${alias}.ville", 'ville')
->addSelect('ville')
->leftJoin('ville.coordonnees', 'villeCoordonnees')
->addSelect('villeCoordonnees')
->leftJoin('ville.departement', 'departement')
->addSelect('departement')
->leftJoin('departement.coordonnees', 'departementCoordonnees')
->addSelect('departementCoordonnees')
->leftJoin('departement.ancienneRegion', 'ancienneRegion')
->addSelect('ancienneRegion')
->leftJoin('ancienneRegion.region', 'region')
->addSelect('region')
->leftJoin('region.pays', 'pays')
->addSelect('pays')
->leftJoin("${alias}.categoriePrimaire", 'categoriePrimaire')
->addSelect('categoriePrimaire')
->leftJoin("${alias}.texteReferencement", 'texteReferencement')
->addSelect('texteReferencement')
// sql -- pour aller charger la diapo principale
->leftJoin("${alias}.diaporamas", 'diaporama') // réduire les requetesSQL car OneToOne
->addSelect('diaporama')
// ->where('diaporama.principal = 1') // ça bug
->leftJoin('diaporama.photo', 'photo') // réduire les requetesSQL car OneToOne
->addSelect('photo')
->leftJoin("${alias}.videos", 'video') // réduire les requetesSQL car OneToOne
->addSelect('video')
->leftJoin("${alias}.logo", 'logo')
->addSelect('logo') // avec le nv filtre des langues le temps d'exce est pareil, donc autant gagner en requêtes SQL :)
;
}
// Etabs visibles n'ayant pas d'url
public function findNotHavingPath(): array
{
$queryBuilder = $this->createCustomSearchQueryBuilder('e');
return $queryBuilder
->andWhere($queryBuilder->expr()->isNotNull('e.denomination'))
->andWhere($queryBuilder->expr()->isNull('e.path'))
->getQuery()
->getResult();
}
// Etabs visibles n'ayant pas de composion de l'ensemble scolaire
public function findNotHavingCompositionEnsembleScolaire(): array
{
$queryBuilder = $this->createQueryBuilder('e');
return $queryBuilder
->where($queryBuilder->expr()->eq('e.actif', true))
->andWhere($queryBuilder->expr()->isNotNull('e.denomination'))
->andWhere($queryBuilder->expr()->isNull('e.compositionEnsembleScolaire'))
// ->andWhere("e.id = 'ET075-469'") // DEBU
// ->setMaxResults(100) // DEBUG
->getQuery()
->getResult();
}
// Surcharger afin de pouvoir optimiser
public function findById(array $ids): array
{
$ids = array_values(array_unique(array_filter($ids)));
if (empty($ids)) {
return [];
}
$queryBuilder = parent::createQueryBuilder('e');
return $queryBuilder
// ->addSelect('e')
->leftJoin('e.gestionnaire', 'g')
->addSelect('g')
// ->leftJoin('g.ville', 'gville')
// ->addSelect('gville')
// ->leftJoin('gville.coordonnees', 'gvilleCoordonnees')
// ->addSelect('gvilleCoordonnees')
->leftJoin("g.texteReferencement", 'gtexteReferencement')
->addSelect('gtexteReferencement')
->leftJoin("e.ville", 'ville')
->addSelect('ville')
->leftJoin('ville.coordonnees', 'villeCoordonnees')
->addSelect('villeCoordonnees')
->leftJoin('ville.departement', 'departement')
->addSelect('departement')
->leftJoin('departement.coordonnees', 'departementCoordonnees')
->addSelect('departementCoordonnees')
->leftJoin('departement.ancienneRegion', 'ancienneRegion')
->addSelect('ancienneRegion')
->leftJoin('ancienneRegion.region', 'region')
->addSelect('region')
->leftJoin('region.pays', 'pays')
->addSelect('pays')
->leftJoin("e.categoriePrimaire", 'categoriePrimaire')
->addSelect('categoriePrimaire')
->leftJoin("e.texteReferencement", 'texteReferencement')
->addSelect('texteReferencement')
// sql -- pour aller charger la diapo principale
->leftJoin("e.diaporamas", 'diaporama') // réduire les requetesSQL car OneToOne
->addSelect('diaporama')
// ->where('diaporama.principal = 1') // ça bug
->leftJoin('diaporama.photo', 'photo') // réduire les requetesSQL car OneToOne
->addSelect('photo')
->leftJoin("e.videos", 'video') // réduire les requetesSQL car OneToOne
->addSelect('video')
->leftJoin("e.logo", 'logo') // réduire les requetesSQL car OneToOne
->addSelect('logo')
->andWhere($queryBuilder->expr()->in('e.id', ':ids'))
->setParameter('ids', $ids)
->getQuery()
->getResult()
;
// $queryBuilder = $this->createQueryBuilder('e');
$queryBuilder = parent::createQueryBuilder('e');
// $queryBuilder = $this->createCustomSearchQueryBuilder('e');
return $queryBuilder
->leftJoin('e.gestionnaire', 'g')
->addSelect('g')
->andWhere($queryBuilder->expr()->in('e.id', ':ids'))
->setParameter('ids', $ids)
->getQuery()
->getResult();
//
// $result = [];
// foreach ($list as $etab) {
// $result[$etab->getId()] = $etab;
// }
//
// return $result;
}
public function findAllWithUai($limit = null, $force = false, $prospectOnly = false): array
{
$queryBuilder = $this->createQueryBuilder('e');
$queryBuilder
->where($queryBuilder->expr()->eq('e.actif', true))
->andWhere($queryBuilder->expr()->isNotNull('e.denomination'))
->andWhere($queryBuilder->expr()->isNotNull('e.numeroAdministratifUai'))
->andWhere($queryBuilder->expr()->neq('e.numeroAdministratifUai', ':notEmpty'))
->setParameter('notEmpty', '');
if (!$force) {
$queryBuilder
->leftJoin('e.data', 'ed')
->andWhere($queryBuilder->expr()->isNull('ed.id'));
}
if ($limit !== null) {
$queryBuilder->setMaxResults((int)$limit);
$queryBuilder->addOrderBy('RAND()');
}
if ($prospectOnly) {
$queryBuilder
->andWhere($queryBuilder->expr()->eq('e.participant', false));
}
return $queryBuilder
->getQuery()
->getResult();
}
public function removeAllEtablissementData(Etablissement $etablissement): void
{
$em = $this->getEntityManager();
$qb = $em->createQueryBuilder()
->delete('App\Entity\EtablissementData', 'ed')
->where('ed.etablissement = :etablissement')
->setParameter('etablissement', $etablissement);
$qb->getQuery()->execute();
}
}