Commit 8c4d34b8 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Substitution de structures : réalisation des jointures dans les requêtes...

Substitution de structures : réalisation des jointures dans les requêtes Doctrine et suppression dans les vues SRC_*.
parent d094c6b3
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -10,14 +10,14 @@ class DefaultEntityRepository extends EntityRepository
    /**
     * @var string
     */
    protected $queryBuilderClassName = DefaultQueryBuilder::class;
    protected string $queryBuilderClassName = DefaultQueryBuilder::class;

    /**
     * @param string $alias
     * @param string $indexBy
     * @return DefaultQueryBuilder
     */
    public function createQueryBuilder($alias, $indexBy = null)
    public function createQueryBuilder($alias, $indexBy = null): DefaultQueryBuilder
    {
        $className = $this->queryBuilderClassName;

+37 −61
Original line number Diff line number Diff line
@@ -2,35 +2,23 @@

namespace Application\Entity\Db\Repository;

use Structure\Entity\Db\Etablissement;
use Individu\Entity\Db\IndividuRole;
use Application\Entity\Db\Role;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\Query\Expr\Join;
use Structure\Entity\Db\Etablissement;
use UnicaenApp\Exception\RuntimeException;

class RoleRepository extends DefaultEntityRepository
{

//    /**
//     * @param int $id
//     * @return Role
//     */
//    public function find($id) {
//
//        /** @var Role $role */
//        $role = $this->findOneBy(["id" => $id]);
//        return $role;
//    }

    /**
     * @param string $roleCode
     * @return Role
     * @return Role|null
     */
    public function findByCode($roleCode) {

    public function findByCode(string $roleCode): ?Role
    {
        /** @var Role $role */
        $role = $this->findOneBy(["code" => $roleCode]);

        return $role;
    }

@@ -38,101 +26,89 @@ class RoleRepository extends DefaultEntityRepository
     * @param string[] $rolesCodes
     * @return Role[]
     */
    public function findByCodes(array $rolesCodes)
    public function findByCodes(array $rolesCodes): array
    {
        /** @var Role $role */
        $qb = $this->createQueryBuilder('r');
        $qb
            ->andWhere($qb->expr()->in('r.code', $rolesCodes))
            ->addSelect('s')
            ->leftJoin('r.structure', 's')
            ->orderBy('r.libelle, s.libelle');
            ->addSelect('structureSubstituante')
            ->leftJoin('s.structureSubstituante', 'structureSubstituante')
            ->orderBy('r.libelle, structureSubstituante.libelle, s.libelle');

        return $qb->getQuery()->getResult();
    }

    /**
     * Recherche du rôle Doctorant pour un établissement.
     *
     * NB : ici pas de jointure vers l'éventuelle structure substituée, charge à l'appelant de passer la structure
     * substituée si besoin.
     *
     * @param string|Etablissement $etablissement
     * @return Role
     * @return Role|null
     */
    public function findRoleDoctorantForEtab($etablissement)
    public function findRoleDoctorantForEtab(Etablissement $etablissement): ?Role
    {
        if ($etablissement instanceof Etablissement) {
            $etablissement = $etablissement->getStructure()->getCode();
        }

        $qb = $this->createQueryBuilder('r');
        $qb
            ->addSelect('s')
            ->join('r.structure', 's', Join::WITH, 's.code = :etablissement')
            ->where('r.code = :code')
            ->setParameter('code', Role::CODE_DOCTORANT)
            ->setParameter('etablissement', $etablissement)
            ;
            ->setParameter('etablissement', $code = $etablissement->getStructure()->getCode());

        try {
            $role = $qb->getQuery()->getOneOrNullResult();
            return $qb->getQuery()->getOneOrNullResult();
        } catch (NonUniqueResultException $e) {
            throw new RuntimeException("Plusieurs rôles doctorant trouvés pour le même établissement " . $etablissement);
            throw new RuntimeException("Plusieurs rôles doctorant trouvés pour le même établissement " . $code);
        }

        return $role;
    }

    /**
     * @param $individu
     * @return Role[]
     */
    public function findAllByIndividu($individu)
    {
        $qb = $this->getEntityManager()->getRepository(IndividuRole::class)->createQueryBuilder("ir")
            ->andWhere("ir.individu = :individu")
            ->setParameter("individu", $individu);
        $results = $qb->getQuery()->getResult();

        /** @var IndividuRole $result */
        $roles = [];
        foreach($results as $result) {
            $roles[] = $result->getRole();
        }

        return $roles;
    }

    /**
     * Recherche de rôles par établissement.
     *
     * NB : ici pas de jointure vers l'éventuelle structure substituée, charge à l'appelant de passer la structure
     * substituée si besoin.
     *
     * @param Etablissement $etablissement
     * @return Role[]
     */
    public function findAllRolesTheseDependantByEtablissement($etablissement)
    public function findAllRolesTheseDependantByEtablissement(Etablissement $etablissement): array
    {
        $qb = $this->createQueryBuilder("role")
            ->andWhere("role.theseDependant = true")
            ->andWhere("role.structure = :etablissement")
            ->setParameter("etablissement", $etablissement)
            ->orderBy("role.ordreAffichage", "DESC")
        ;
            ->orderBy("role.ordreAffichage", "DESC");

        return $qb->getQuery()->getResult();
    }

    /**
     * Recherche d'un rôle selon son code et son établissement.
     *
     * NB : ici pas de jointure vers l'éventuelle structure substituée, charge à l'appelant de passer la structure
     * substituée si besoin.
     *
     * @param string $code
     * @param Etablissement $etablissement
     * @return Role
     * @return Role|null
     */
    public function findByCodeAndEtablissement(string $code, Etablissement $etablissement)
    public function findByCodeAndEtablissement(string $code, Etablissement $etablissement): ?Role
    {
        $qb = $this->createQueryBuilder('r')
            ->andWhere('r.structure = :structure')
            ->setParameter('structure', $etablissement->getStructure())
            ->andWhere('r.code = :code')
            ->setParameter('code', $code)
            ->andWhere('r.histoDestruction is null')
        ;
            ->andWhere('r.histoDestruction is null');

        try {
            $result = $qb->getQuery()->getOneOrNullResult();
            return $qb->getQuery()->getOneOrNullResult();
        } catch (NonUniqueResultException $e) {
            throw new RuntimeException('Plusieurs Role partagent le même code ['.$code.'] et le même établissement ['.$etablissement->getStructure()->getCode().']');
        }
        return $result;
    }
}
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ class ValidationRepository extends DefaultEntityRepository
    /**
     * @var string
     */
    protected $queryBuilderClassName = ValidationQueryBuilder::class;
    protected string $queryBuilderClassName = ValidationQueryBuilder::class;

    /**
     * @param string $code
+1 −1
Original line number Diff line number Diff line
@@ -12,6 +12,6 @@ class ValiditeFichierRepository extends DefaultEntityRepository
    /**
     * @var string
     */
    protected $queryBuilderClassName = QueryBuilder::class;
    protected string $queryBuilderClassName = QueryBuilder::class;

}
 No newline at end of file
+14 −3
Original line number Diff line number Diff line
@@ -135,10 +135,21 @@ class Role extends AbstractRole implements SourceAwareInterface, HistoriqueAware
    }

    /**
     * @return Structure
     * Retourne l'éventuelle structure liée *ou son substitut le cas échéant*.
     *
     * **ATTENTION** : veiller à bien faire les jointures suivantes en amont avant d'utiliser cet accesseur :
     * '.structure' puis 'structure.structureSubstituante'.
     *
     * @param bool $returnSubstitIfExists À true, retourne la structure substituante s'il y en a une ; sinon la structure d'origine.
     * @see Structure::getStructureSubstituante()
     * @return Structure|null
     */
    public function getStructure()
    public function getStructure(bool $returnSubstitIfExists = true): ?Structure
    {
        if ($returnSubstitIfExists && $this->structure && ($sustitut = $this->structure->getStructureSubstituante())) {
            return $sustitut;
        }

        return $this->structure;
    }

@@ -146,7 +157,7 @@ class Role extends AbstractRole implements SourceAwareInterface, HistoriqueAware
     * @param Structure $structure
     * @return Role
     */
    public function setStructure($structure)
    public function setStructure(Structure $structure): self
    {
        $this->structure = $structure;

Loading