Commit edb27916 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

- Up : Gestion des disciplines améliorée

 - Up : (Recherche d'activité) Seul les Disciplines utilisées sont proposées dans la liste
 - Up : (Formulaire activité) Seul les disciplines "active" sont proposées
parent 0471708f
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
{
+69 −3
Original line number Diff line number Diff line
@@ -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.
@@ -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();
    }
+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
+12 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
    }

    /**
+13 −22
Original line number Diff line number Diff line
@@ -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;
@@ -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