Loading module/Oscar/src/Oscar/Entity/Discipline.php +1 −1 Original line number Diff line number Diff line Loading @@ -15,7 +15,7 @@ use Doctrine\ORM\Mapping as ORM; * Class Discipline * @package Oscar\Entity * @ORM\Entity() * @ORM\Entity(repositoryClass="Oscar\Entity\DisciplineRepository") * @ORM\Entity(repositoryClass="Oscar\Entity\Repository\DisciplineRepository") */ class Discipline { Loading module/Oscar/src/Oscar/Entity/DisciplineRepository.php→module/Oscar/src/Oscar/Entity/Repository/DisciplineRepository.php +69 −3 Original line number Diff line number Diff line Loading @@ -6,12 +6,12 @@ * @copyright Certic (c) 2017 */ namespace Oscar\Entity; namespace Oscar\Entity\Repository; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query; class DisciplineRepository extends EntityRepository class DisciplineRepository extends EntityRepository implements RepositoryConstants { /** * Retourne les disciplines. Loading @@ -20,7 +20,73 @@ class DisciplineRepository extends EntityRepository { return $this->createQueryBuilder('d') ->select('d') ->from(Discipline::class) ->getQuery() ->getResult(); } public function getDisciplinesArray(...$options) { $label = 'd.label as label'; $where = []; $having = []; if( in_array(self::ARRAY_ACTIVE_ONLY, $options) ){ $where[] = "d.active = TRUE"; } if( in_array(self::ARRAY_USE_ONLY, $options) ){ $having[] = "count(a.id) > 0"; } if( in_array(self::ARRAY_LABEL_WITH_COUNT, $options) ){ $label = "CONCAT(d.label, ' (', count(a.id), ')') as label"; } if( count($where) > 0 ){ $where = 'WHERE ' . implode(' AND ', $where); } else { $where = ''; } if( count($having) > 0 ){ $having = 'HAVING ' . implode(' AND ', $having); } else { $having = ''; } $dql = "SELECT d.id, $label, d.active, count(a.id) as usage FROM Oscar\Entity\Discipline d LEFT JOIN d.activities a $where GROUP BY d.id $having ORDER BY d.label"; $query = $this->getEntityManager()->createQuery($dql); $result = $query->getArrayResult(); if( in_array(self::ARRAY_FORMAT_FLAT, $options) ){ $output = []; foreach ($result as $row) { $output[$row['id']] = $row['label']; } return $output; } return $result; } public function getDisciplinesById(array $ids): array { return $this->createQueryBuilder('d') ->select('d') ->where('d.id IN (:ids)') ->setParameter('ids', $ids) ->getQuery() ->getResult(); } Loading module/Oscar/src/Oscar/Entity/Repository/RepositoryConstants.php 0 → 100644 +20 −0 Original line number Diff line number Diff line <?php namespace Oscar\Entity\Repository; interface RepositoryConstants { const ARRAY_ACTIVE_ONLY = 'ARRAY_ACTIVE_ONLY'; const ARRAY_USE_ONLY = 'ARRAY_USE_ONLY'; /** * Ajout (COUNT) au label */ const ARRAY_LABEL_WITH_COUNT = 'ARRAY_LABEL_WITH_COUNT'; /** * Sous la forme [ID] => "LABEL" */ const ARRAY_FORMAT_FLAT = 'ARRAY_FORMAT_FLAT'; } No newline at end of file module/Oscar/src/Oscar/Service/ProjectGrantSearchService.php +12 −1 Original line number Diff line number Diff line Loading @@ -9,10 +9,12 @@ use Oscar\Entity\Activity; use Oscar\Entity\ActivityMotCle; use Oscar\Entity\ActivityMotCleRepository; use Oscar\Entity\DateType; use Oscar\Entity\Discipline; use Oscar\Entity\OrganizationRole; use Oscar\Entity\OrganizationRoleRepository; use Oscar\Entity\Person; use Oscar\Entity\Project; use Oscar\Entity\Repository\DisciplineRepository; use Oscar\Exception\OscarException; use Oscar\Traits\UseAdministrationConfigService; use Oscar\Traits\UseAdministrationConfigServiceTrait; Loading Loading @@ -1204,13 +1206,22 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U return $this->getProjectGrantService()->getActivityTypes(true); } /** * Liste des disciplines. * @return array */ private function getFilterOptionsDisciplines(): array { return $this->getProjectGrantService()->getDisciplines(); /** @var DisciplineRepository $disciplineRepository */ $disciplineRepository = $this->getEntityManager()->getRepository(Discipline::class); $disciplines = $disciplineRepository->getDisciplinesArray( DisciplineRepository::ARRAY_LABEL_WITH_COUNT, DisciplineRepository::ARRAY_USE_ONLY, DisciplineRepository::ARRAY_FORMAT_FLAT ); return $disciplines; } /** Loading module/Oscar/src/Oscar/Service/ProjectGrantService.php +13 −22 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ use Oscar\Entity\PcruTypeEtablissementRepository; use Oscar\Entity\Person; use Oscar\Entity\PersonRepository; use Oscar\Entity\Project; use Oscar\Entity\Repository\DisciplineRepository; use Oscar\Entity\Role; use Oscar\Entity\RoleRepository; use Oscar\Entity\TabDocument; Loading Loading @@ -3021,35 +3022,25 @@ class ProjectGrantService implements UseGearmanJobLauncherService, UseOscarConfi } /** * @param integer[] $ids * @return DisciplineRepository * @throws NotSupported */ public function getDisciplinesById($ids) protected function getDisciplineRepository() : DisciplineRepository { return $this->getEntityManager()->getRepository(Discipline::class)->createQueryBuilder('d') ->select('d') ->where('d.id IN (:ids)') ->setParameter('ids', $ids) ->getQuery() ->getResult(); return $this->getEntityManager()->getRepository(Discipline::class); } /** * @return Discipline[] * @param integer[] $ids */ public function getDisciplines() public function getDisciplinesById($ids) { $array = []; foreach ( $this->getEntityManager() ->createQueryBuilder() ->select('d') ->from(Discipline::class, 'd') ->getQuery() ->getResult() as $discipline ) { $array[$discipline->getId()] = strval($discipline); return $this->getDisciplineRepository()->getDisciplinesById($ids); } return $array; public function getDisciplines() :array { return $this->getDisciplineRepository()->getDisciplinesArray(DisciplineRepository::ARRAY_ACTIVE_ONLY); } /** Loading Loading
module/Oscar/src/Oscar/Entity/Discipline.php +1 −1 Original line number Diff line number Diff line Loading @@ -15,7 +15,7 @@ use Doctrine\ORM\Mapping as ORM; * Class Discipline * @package Oscar\Entity * @ORM\Entity() * @ORM\Entity(repositoryClass="Oscar\Entity\DisciplineRepository") * @ORM\Entity(repositoryClass="Oscar\Entity\Repository\DisciplineRepository") */ class Discipline { Loading
module/Oscar/src/Oscar/Entity/DisciplineRepository.php→module/Oscar/src/Oscar/Entity/Repository/DisciplineRepository.php +69 −3 Original line number Diff line number Diff line Loading @@ -6,12 +6,12 @@ * @copyright Certic (c) 2017 */ namespace Oscar\Entity; namespace Oscar\Entity\Repository; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query; class DisciplineRepository extends EntityRepository class DisciplineRepository extends EntityRepository implements RepositoryConstants { /** * Retourne les disciplines. Loading @@ -20,7 +20,73 @@ class DisciplineRepository extends EntityRepository { return $this->createQueryBuilder('d') ->select('d') ->from(Discipline::class) ->getQuery() ->getResult(); } public function getDisciplinesArray(...$options) { $label = 'd.label as label'; $where = []; $having = []; if( in_array(self::ARRAY_ACTIVE_ONLY, $options) ){ $where[] = "d.active = TRUE"; } if( in_array(self::ARRAY_USE_ONLY, $options) ){ $having[] = "count(a.id) > 0"; } if( in_array(self::ARRAY_LABEL_WITH_COUNT, $options) ){ $label = "CONCAT(d.label, ' (', count(a.id), ')') as label"; } if( count($where) > 0 ){ $where = 'WHERE ' . implode(' AND ', $where); } else { $where = ''; } if( count($having) > 0 ){ $having = 'HAVING ' . implode(' AND ', $having); } else { $having = ''; } $dql = "SELECT d.id, $label, d.active, count(a.id) as usage FROM Oscar\Entity\Discipline d LEFT JOIN d.activities a $where GROUP BY d.id $having ORDER BY d.label"; $query = $this->getEntityManager()->createQuery($dql); $result = $query->getArrayResult(); if( in_array(self::ARRAY_FORMAT_FLAT, $options) ){ $output = []; foreach ($result as $row) { $output[$row['id']] = $row['label']; } return $output; } return $result; } public function getDisciplinesById(array $ids): array { return $this->createQueryBuilder('d') ->select('d') ->where('d.id IN (:ids)') ->setParameter('ids', $ids) ->getQuery() ->getResult(); } Loading
module/Oscar/src/Oscar/Entity/Repository/RepositoryConstants.php 0 → 100644 +20 −0 Original line number Diff line number Diff line <?php namespace Oscar\Entity\Repository; interface RepositoryConstants { const ARRAY_ACTIVE_ONLY = 'ARRAY_ACTIVE_ONLY'; const ARRAY_USE_ONLY = 'ARRAY_USE_ONLY'; /** * Ajout (COUNT) au label */ const ARRAY_LABEL_WITH_COUNT = 'ARRAY_LABEL_WITH_COUNT'; /** * Sous la forme [ID] => "LABEL" */ const ARRAY_FORMAT_FLAT = 'ARRAY_FORMAT_FLAT'; } No newline at end of file
module/Oscar/src/Oscar/Service/ProjectGrantSearchService.php +12 −1 Original line number Diff line number Diff line Loading @@ -9,10 +9,12 @@ use Oscar\Entity\Activity; use Oscar\Entity\ActivityMotCle; use Oscar\Entity\ActivityMotCleRepository; use Oscar\Entity\DateType; use Oscar\Entity\Discipline; use Oscar\Entity\OrganizationRole; use Oscar\Entity\OrganizationRoleRepository; use Oscar\Entity\Person; use Oscar\Entity\Project; use Oscar\Entity\Repository\DisciplineRepository; use Oscar\Exception\OscarException; use Oscar\Traits\UseAdministrationConfigService; use Oscar\Traits\UseAdministrationConfigServiceTrait; Loading Loading @@ -1204,13 +1206,22 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U return $this->getProjectGrantService()->getActivityTypes(true); } /** * Liste des disciplines. * @return array */ private function getFilterOptionsDisciplines(): array { return $this->getProjectGrantService()->getDisciplines(); /** @var DisciplineRepository $disciplineRepository */ $disciplineRepository = $this->getEntityManager()->getRepository(Discipline::class); $disciplines = $disciplineRepository->getDisciplinesArray( DisciplineRepository::ARRAY_LABEL_WITH_COUNT, DisciplineRepository::ARRAY_USE_ONLY, DisciplineRepository::ARRAY_FORMAT_FLAT ); return $disciplines; } /** Loading
module/Oscar/src/Oscar/Service/ProjectGrantService.php +13 −22 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ use Oscar\Entity\PcruTypeEtablissementRepository; use Oscar\Entity\Person; use Oscar\Entity\PersonRepository; use Oscar\Entity\Project; use Oscar\Entity\Repository\DisciplineRepository; use Oscar\Entity\Role; use Oscar\Entity\RoleRepository; use Oscar\Entity\TabDocument; Loading Loading @@ -3021,35 +3022,25 @@ class ProjectGrantService implements UseGearmanJobLauncherService, UseOscarConfi } /** * @param integer[] $ids * @return DisciplineRepository * @throws NotSupported */ public function getDisciplinesById($ids) protected function getDisciplineRepository() : DisciplineRepository { return $this->getEntityManager()->getRepository(Discipline::class)->createQueryBuilder('d') ->select('d') ->where('d.id IN (:ids)') ->setParameter('ids', $ids) ->getQuery() ->getResult(); return $this->getEntityManager()->getRepository(Discipline::class); } /** * @return Discipline[] * @param integer[] $ids */ public function getDisciplines() public function getDisciplinesById($ids) { $array = []; foreach ( $this->getEntityManager() ->createQueryBuilder() ->select('d') ->from(Discipline::class, 'd') ->getQuery() ->getResult() as $discipline ) { $array[$discipline->getId()] = strval($discipline); return $this->getDisciplineRepository()->getDisciplinesById($ids); } return $array; public function getDisciplines() :array { return $this->getDisciplineRepository()->getDisciplinesArray(DisciplineRepository::ARRAY_ACTIVE_ONLY); } /** Loading