Loading module/Formation/src/Formation/Entity/Db/Repository/FormationRepository.php +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 Loading @@ -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 module/Formation/src/Formation/Entity/Db/Repository/SessionRepository.php +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 Loading @@ -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*/ Loading @@ -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; } Loading module/Formation/src/Formation/Service/Formation/Search/FormationSearchService.php +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 Loading @@ -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; Loading @@ -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() { Loading @@ -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, Loading @@ -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 ****************************************/ Loading Loading @@ -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 Loading module/Formation/src/Formation/Service/Formation/Search/FormationSearchServiceFactory.php +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 Loading @@ -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; Loading @@ -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 module/Formation/src/Formation/Service/Session/Search/SessionSearchService.php +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 Loading @@ -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 ****************************************/ Loading Loading @@ -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 Loading
module/Formation/src/Formation/Entity/Db/Repository/FormationRepository.php +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 Loading @@ -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
module/Formation/src/Formation/Entity/Db/Repository/SessionRepository.php +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 Loading @@ -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*/ Loading @@ -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; } Loading
module/Formation/src/Formation/Service/Formation/Search/FormationSearchService.php +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 Loading @@ -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; Loading @@ -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() { Loading @@ -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, Loading @@ -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 ****************************************/ Loading Loading @@ -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 Loading
module/Formation/src/Formation/Service/Formation/Search/FormationSearchServiceFactory.php +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 Loading @@ -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; Loading @@ -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
module/Formation/src/Formation/Service/Session/Search/SessionSearchService.php +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 Loading @@ -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 ****************************************/ Loading Loading @@ -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