Commit 59b9baea authored by Thomas Hamel's avatar Thomas Hamel
Browse files

Formations : ajout filtre année universitaire, tri en fonction des séances

parent 7e201b21
Loading
Loading
Loading
Loading
+16 −0
Changes for module/Formation/src/Formation/Entity/Db/Repository/FormationRepository.php: 16 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -107,4 +107,20 @@ class FormationRepository extends DefaultEntityRepository

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

    public function fetchDistinctAnneesUnivFormation(string $ordre='ASC', bool $keep_histo = false) : array
    {
        $qb = $this->createQueryBuilder('formation')
            ->leftJoin('formation.sessions', 'session')->addSelect('session')
            ->leftJoin('session.seances', 'seance')->addSelect('seance')
            ->distinct()
            ->select("YEAR(seance.debut) as annee")
            ->orderBy("annee", $ordre);

        if (!$keep_histo) $qb = $qb->andWhere('session.histoDestruction IS NULL');

        return array_map(function($value) {
            return current($value);
        }, $qb->getQuery()->getScalarResult());
    }
}
 No newline at end of file
+1 −1
Changes for module/Formation/src/Formation/Entity/Db/Repository/SessionRepository.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ class SessionRepository extends DefaultEntityRepository
            ->setParameter('structures', array_unique($structures))
            ->setParameter('ouverte', Etat::CODE_OUVERTE)
            ->setParameter('preparation', Etat::CODE_PREPARATION)
            ->orderBy("seance.debut", "DESC");
        ;

        /** TODO SOMETHING WITH IT*/
@@ -96,7 +97,6 @@ class SessionRepository extends DefaultEntityRepository
        }

        $result =  $qb->getQuery()->getResult();
        usort($result, function (Session $a, Session $b) { return $a->getDateDebut() > $b->getDateDebut();});
        return $result;
    }

+70 −2
Changes for module/Formation/src/Formation/Service/Formation/Search/FormationSearchService.php: 70 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -2,12 +2,14 @@

namespace Formation\Service\Formation\Search;

use Application\Entity\AnneeUniv;
use Application\QueryBuilder\DefaultQueryBuilder;
use Application\Search\Filter\SearchFilter;
use Application\Search\Filter\SelectSearchFilter;
use Application\Search\Filter\TextSearchFilter;
use Application\Search\SearchService;
use Application\Search\Sorter\SearchSorter;
use Application\Service\AnneeUniv\AnneeUnivServiceAwareTrait;
use Doctrine\ORM\QueryBuilder;
use Formation\Entity\Db\Interfaces\HasModaliteInterface;
use Formation\Entity\Db\Repository\FormationRepositoryAwareTrait;
@@ -19,12 +21,15 @@ class FormationSearchService extends SearchService
    use FormationRepositoryAwareTrait;

    use EtablissementServiceAwareTrait;
    use AnneeUnivServiceAwareTrait;

    const NAME_libelle = 'libelle';
    const NAME_modalite = 'modalite';
    const NAME_responsable = 'responsable';
    const NAME_site = 'site';
    const NAME_structure = 'structure';
    const NAME_anneeUniv = 'anneeUniv';


    public function init()
    {
@@ -33,11 +38,18 @@ class FormationSearchService extends SearchService
        $libelleFilter = $this->createLibelleFilter();
        $responsableFilter = $this->createResponsableFilter();
        $modaliteFilter = $this->createModaliteFilter();
        $anneeUnivFilter = $this->createAnneeUnivFilter();

        $siteFilter->setDataProvider(fn() => $this->etablissementService->getRepository()->findAllEtablissementsInscriptions(true));
        $structureFilter->setDataProvider(fn() => $this->formationRepository->fetchListeStructures());
        $responsableFilter->setDataProvider(fn() => $this->formationRepository->fetchListeResponsable());
        $modaliteFilter->setData(HasModaliteInterface::MODALITES);
        $anneeUnivFilter->setDataProvider(function(SelectSearchFilter $filter) {
            return $this->fetchAnneesUniv($filter);
        });

        $annee = $this->anneeUnivService->courante();
        $debut = $this->anneeUnivService->computeDateDebut($annee);

        $this->addFilters([
            $siteFilter,
@@ -45,21 +57,29 @@ class FormationSearchService extends SearchService
            $structureFilter,
            $libelleFilter,
            $modaliteFilter,
            $anneeUnivFilter->setDefaultValue($debut->format('Y'))->setAllowsEmptyOption(false),
        ]);

        $this->addSorters([
            $this->createLibelleSorter()->setIsDefault(),
            $this->createLibelleSorter(),
            $this->createSiteSorter(),
            $this->createStructureSorter(),
            $this->createResponsableSorter(),
            $this->createModaliteSorter(),
        ]);

        //tri descendant par les dates des séances (lorsqu'aucun sorter n'est sélectionné)
        $this->addInvisibleSort('CASE WHEN seance.fin IS NULL THEN 1 ELSE 0 END', 'ASC');
        $this->addInvisibleSort('seance.debut', 'DESC');
    }

    public function createQueryBuilder(): QueryBuilder
    {
        // ATTENTION à bien sélectionner les relations utilisées par les filtres/tris et parcourues côté vue.
        return $this->formationRepository->createQueryBuilder('f');
        $queryBuilder = $this->formationRepository->createQueryBuilder('f');
        $queryBuilder->leftJoin('f.sessions', 'session')->addSelect('session')
            ->leftJoin('session.seances', 'seance')->addSelect('seance');
        return $queryBuilder;
    }

    /********************************** FILTERS ****************************************/
@@ -123,6 +143,54 @@ class FormationSearchService extends SearchService
        return $filter;
    }

    /**
     * @return SelectSearchFilter
     */
    private function createAnneeUnivFilter(): SelectSearchFilter
    {
        $filter = new SelectSearchFilter(
            "An. univ.",
            self::NAME_anneeUniv
        );

        $filter->setQueryBuilderApplier(function(SearchFilter $filter, QueryBuilder $qb, string $alias = 'session') {
            $filterValue = $filter->getValue();
            $annee = $filterValue === 'NULL' ? $this->anneeUnivService->courante() : AnneeUniv::fromPremiereAnnee((int)$filterValue);
            $debut = $this->anneeUnivService->computeDateDebut($annee);
            $fin = $this->anneeUnivService->computeDateFin($annee);

            if ($debut !== null && $fin !== null) {
                $qb->andWhere('seance.debut >= :debut')->setParameter('debut', $debut)
                    ->andWhere('seance.fin <= :fin')->setParameter('fin', $fin);
            }
        });

        return $filter;
    }

    /********************************** FILTERS ****************************************/

    private function fetchAnneesUniv(SelectSearchFilter $filter): array
    {
        $anneeUnivCourante = $this->anneeUnivService->courante();
        $anneeCourante = new \DateTime();
        $anneeCourante = $anneeCourante->format('Y');
        $annees = $this->formationRepository->fetchDistinctAnneesUnivFormation();

        $anneesUniv = [];
        foreach($annees as $annee){
            if (! is_numeric($annee))  continue;

            if($anneeCourante === $annee){
                if(!in_array($anneeUnivCourante, $anneesUniv)) $anneesUniv[] =  $anneeUnivCourante;
                continue;
            }
            $anneesUniv[$annee] = AnneeUniv::fromPremiereAnnee($annee);
        }

        return $anneesUniv;
    }

    /********************************** SORTERS ****************************************/

    public function createSiteSorter(): SearchSorter
+5 −0
Changes for module/Formation/src/Formation/Service/Formation/Search/FormationSearchServiceFactory.php: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace Formation\Service\Formation\Search;

use Application\Service\AnneeUniv\AnneeUnivService;
use Formation\Entity\Db\Formation;
use Laminas\ServiceManager\Factory\FactoryInterface;
use Psr\Container\ContainerInterface;
@@ -28,6 +29,10 @@ class FormationSearchServiceFactory implements FactoryInterface
        $etablissementService = $container->get(EtablissementService::class);
        $service->setEtablissementService($etablissementService);

        /** @var AnneeUnivService $anneeUnivService */
        $anneeUnivService = $container->get(AnneeUnivService::class);
        $service->setAnneeUnivService($anneeUnivService);

        return $service;
    }
}
 No newline at end of file
+5 −14
Changes for module/Formation/src/Formation/Service/Session/Search/SessionSearchService.php: 5 added lines, 14 removed lines.
Original line number Diff line number Diff line
@@ -86,16 +86,15 @@ class SessionSearchService extends SearchService
            $this->createEtatSorter(),
            $this->createModaliteSorter(),
        ]);

        //tri descendant par les dates des séances (lorsqu'aucun sorter n'est sélectionné)
        $this->addInvisibleSort('CASE WHEN seance.fin IS NULL THEN 1 ELSE 0 END', 'ASC');
        $this->addInvisibleSort('seance.debut', 'DESC');
    }

    public function createQueryBuilder(): QueryBuilder
    {
        $queryBuilder = $this->sessionRepository->createQueryBuilder('s');

        $queryBuilder->select('s');
        $queryBuilder->addOrderBy('CASE WHEN seance.fin IS NULL THEN 1 ELSE 0 END', 'ASC');
        $queryBuilder->addOrderBy('seance.debut', 'DESC');
        return $queryBuilder;
        return $this->sessionRepository->createQueryBuilder('s');
    }

    /********************************** FILTERS ****************************************/
@@ -163,20 +162,12 @@ class SessionSearchService extends SearchService
            $annee = $filterValue === 'NULL' ? $this->anneeUnivService->courante() : AnneeUniv::fromPremiereAnnee((int)$filterValue);
            $debut = $this->anneeUnivService->computeDateDebut($annee);
            $fin = $this->anneeUnivService->computeDateFin($annee);
            if ($filterValue === 'NULL') {
                if ($debut !== null && $fin !== null) {
                    $qb->andWhere('seance.debut >= :debut')->setParameter('debut', $debut)
                        ->andWhere('seance.fin <= :fin')->setParameter('fin', $fin);
                }
            } else {
            if ($debut !== null && $fin !== null) {
                $qb->andWhere('seance.debut >= :debut')->setParameter('debut', $debut)
                    ->andWhere('seance.fin <= :fin')->setParameter('fin', $fin);
            }
            }
        });


        return $filter;
    }

Loading