Commit d0bc2615 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

[FIX] Rapport d'activité : correction du filtrage selon le profil de l'utilisateur.

parent bc920b5c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ Journal des modifications
- Module Formation : Amélioration de l'UI concernant l'affichage des inscrits à une session de formation
- Passage unicaen/renderer 7.0.2 (et donc à TinyMCE 6.3.0).
- Filtre 'Catégorie de privilège' sur les pages 'Droits d'accès' : la liste est désormais issue d'une requête en bdd.
- [FIX] Rapport d'activité : correction du filtrage selon le profil de l'utilisateur.

9.2.1
-----
+5 −0
Original line number Diff line number Diff line
@@ -140,6 +140,11 @@ class Role extends AbstractRole implements SourceAwareInterface, HistoriqueAware
        return $this->getCode() === self::CODE_DIRECTEUR_THESE;
    }

    public function isCodirecteurThese(): bool
    {
        return $this->getCode() === self::CODE_CODIRECTEUR_THESE;
    }

    /**
     * @return bool
     */
+11 −0
Original line number Diff line number Diff line
<?php

namespace Application\Search\Filter;

class WhereSearchFilter extends SearchFilter
{
    public function canApplyToQueryBuilder(): bool
    {
        return true;
    }
}
+97 −11
Original line number Diff line number Diff line
@@ -4,10 +4,13 @@ namespace RapportActivite\Controller\Recherche;

use Application\Controller\AbstractController;
use Application\Entity\Db\Interfaces\TypeValidationAwareTrait;
use Application\Entity\Db\Role;
use Application\Exporter\ExporterDataException;
use Application\Filter\IdifyFilter;
use Application\Search\Controller\SearchControllerInterface;
use Application\Search\Controller\SearchControllerTrait;
use Application\Search\Filter\SearchFilter;
use Application\Search\Filter\WhereSearchFilter;
use Application\Search\SearchServiceAwareTrait;
use Fichier\Entity\FichierArchivable;
use Fichier\Service\Fichier\Exception\FichierServiceException;
@@ -19,7 +22,9 @@ use RapportActivite\Entity\Db\RapportActivite;
use RapportActivite\Provider\Privilege\RapportActivitePrivileges;
use RapportActivite\Rule\Operation\RapportActiviteOperationRuleAwareTrait;
use RapportActivite\Service\Fichier\RapportActiviteFichierServiceAwareTrait;
use RapportActivite\Service\RapportActiviteService;
use RapportActivite\Service\RapportActiviteServiceAwareTrait;
use RapportActivite\Service\Search\RapportActiviteSearchService;
use RuntimeException;
use Structure\Service\Structure\StructureServiceAwareTrait;
use UnexpectedValueException;
@@ -57,8 +62,7 @@ class RapportActiviteRechercheController extends AbstractController implements S
     */
    public function indexAction()
    {
        $this->restrictFilterEcolesDoctorales();
        $this->restrictFilterUnitesRecherches();
        $this->restrictFilters();

        $text = $this->params()->fromQuery('text');

@@ -106,8 +110,7 @@ class RapportActiviteRechercheController extends AbstractController implements S
     */
    public function filtersAction(): ViewModel
    {
        $this->restrictFilterEcolesDoctorales();
        $this->restrictFilterUnitesRecherches();
        $this->restrictFilters();

        $filters = $this->filters();

@@ -120,9 +123,47 @@ class RapportActiviteRechercheController extends AbstractController implements S
        return $model;
    }

    private function restrictFilterEcolesDoctorales()
    private function restrictFilters(): void
    {
        $this->restrictFilterDoctorant();
        $this->restrictFilterEtablissementTheseSearchFilter();
        $this->restrictFilterEcolesDoctorales();
        $this->restrictFilterUnitesRecherches();
        $this->restrictFilterNomDirecteur();
    }


    private function restrictFilterDoctorant(): void
    {
        if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) {
            // aucune restriction sur les ED sélectionnables
        } elseif ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN))) {
            // restrictions en fonction du rôle
            $role = $this->userContextService->getSelectedIdentityRole();
            if ($role->isDirecteurThese() || $role->isCodirecteurThese()) {
                $this->searchService->addFilter((new WhereSearchFilter("invisible", 'acteur_individu'))
                    ->setWhereField('act.individu')
                    ->setDefaultValue($this->userContextService->getDbUser()->getIndividu()->getId())
                    ->setVisible(false)
                );
                $this->searchService->addFilter((new WhereSearchFilter("invisible", 'acteur_role'))
                    ->setWhereField('actr.code')
                    ->setDefaultValue($role->isDirecteurThese() ? Role::CODE_DIRECTEUR_THESE : Role::CODE_CODIRECTEUR_THESE)
                    ->setVisible(false)
                );
            }
        } else {
            throw new UnexpectedValueException(
                "Anomalie : l'action aurait dû être bloquée en amont (controller guard) car l'utilisateur n'a aucun des privilèges suivants : " .
                implode(', ', [RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT, RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN])
            );
        }

    }

    private function restrictFilterEcolesDoctorales(): void
    {
        $edFilter = $this->searchService->getEcoleDoctoraleSearchFilter();
        $filter = $this->searchService->getEcoleDoctoraleSearchFilter();

        if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) {
            // aucune restriction sur les ED sélectionnables
@@ -130,9 +171,11 @@ class RapportActiviteRechercheController extends AbstractController implements S
            // restrictions en fonction du rôle
            if ($roleEcoleDoctorale = $this->userContextService->getSelectedRoleEcoleDoctorale()) {
                $ed = $roleEcoleDoctorale->getStructure()->getEcoleDoctorale();
                $edFilter->setData([$ed]);
                $edFilter->setDefaultValueAsObject($ed);
                $edFilter->setAllowsEmptyOption(false);
                $filter->setData([$ed]);
                $filter->setDefaultValueAsObject($ed);
                $filter->setAllowsEmptyOption(false);
            } elseif ($this->userContextService->getSelectedRoleDirecteurThese()) {
                $filter->setVisible(false);
            }
        } else {
            throw new UnexpectedValueException(
@@ -142,7 +185,29 @@ class RapportActiviteRechercheController extends AbstractController implements S
        }
    }

    private function restrictFilterUnitesRecherches()
    private function restrictFilterEtablissementTheseSearchFilter(): void
    {
        $filter = $this->searchService->getEtablissementTheseSearchFilter();

        if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) {
            // aucune restriction sur les ED sélectionnables
        } elseif ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN))) {
            // restrictions en fonction du rôle
            $role = $this->userContextService->getSelectedIdentityRole();
            if ($etab = $role->getStructure()?->getEtablissement()) {
                $filter->setData([$etab]);
                $filter->setDefaultValueAsObject($etab);
                $filter->setAllowsEmptyOption(false);
            }
        } else {
            throw new UnexpectedValueException(
                "Anomalie : l'action aurait dû être bloquée en amont (controller guard) car l'utilisateur n'a aucun des privilèges suivants : " .
                implode(', ', [RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT, RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN])
            );
        }
    }

    private function restrictFilterUnitesRecherches(): void
    {
        $filter = $this->searchService->getUniteRechercheSearchFilter();

@@ -155,6 +220,27 @@ class RapportActiviteRechercheController extends AbstractController implements S
                $filter->setData([$ur]);
                $filter->setDefaultValueAsObject($ur);
                $filter->setAllowsEmptyOption(false);
            } elseif ($this->userContextService->getSelectedRoleDirecteurThese()) {
                $filter->setVisible(false);
            }
        } else {
            throw new UnexpectedValueException(
                "Anomalie : l'action aurait dû être bloquée en amont (controller guard) car l'utilisateur n'a aucun des privilèges suivants : " .
                implode(', ', [RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT, RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN])
            );
        }
    }

    private function restrictFilterNomDirecteur(): void
    {
        $filter = $this->searchService->getNomDirecteurSearchFilter();

        if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) {
            // aucune restriction
        } elseif ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN))) {
            // restrictions en fonction du rôle
            if ($this->userContextService->getSelectedRoleDirecteurThese()) {
                $filter->setVisible(false);
            }
        } else {
            throw new UnexpectedValueException(
@@ -187,7 +273,7 @@ class RapportActiviteRechercheController extends AbstractController implements S
     */
    public function telechargerZipAction(): Response
    {
        $this->restrictFilterEcolesDoctorales();
        $this->restrictFilters();

        $result = $this->search();
        if ($result instanceof Response) {
+22 −2
Original line number Diff line number Diff line
@@ -67,6 +67,8 @@ class RapportActiviteSearchService extends SearchService
    private ?SelectSearchFilter $operationRealiseeSearchFilter = null;
    private ?SelectSearchFilter $operationAttendueSearchFilter = null;
    private ?SelectSearchFilter $dematerialiseSearchFilter = null;
    private ?TextSearchFilter $nomDirecteurSearchFilter = null;
    private ?TextSearchFilter $nomDoctorantSearchFilter = null;

    /**
     * @inheritDoc
@@ -110,8 +112,8 @@ class RapportActiviteSearchService extends SearchService
            $uniteRechercheFilter,
            $finalSearchFilter,
            $anneeRapportActiviteInscrFilter,
            $this->createFilterNomDoctorant(),
            $this->createFilterNomDirecteur(),
            $this->getNomDoctorantSearchFilter(),
            $this->getNomDirecteurSearchFilter(),
            $avisAttenduSearchFilter,
            $dematerialiseSearchFilter,
        ]));
@@ -148,6 +150,8 @@ class RapportActiviteSearchService extends SearchService
            ->leftJoin('ra.rapportAvis', 'raa')
            ->leftJoin('raa.avis', 'a')
            ->leftJoin('a.avisType', 'at')
            ->leftJoin('these.acteurs', 'act')->andWhereNotHistorise('act')
            ->leftJoin('act.role', 'actr')->andWhereNotHistorise('actr')
            ->andWhereNotHistorise();

        $qb
@@ -650,6 +654,22 @@ class RapportActiviteSearchService extends SearchService
        return $this->anneeRapportActiviteSearchFilter;
    }

    public function getNomDirecteurSearchFilter(): TextSearchFilter
    {
        if ($this->nomDirecteurSearchFilter === null) {
            $this->nomDirecteurSearchFilter = $this->createFilterNomDirecteur();
        }
        return $this->nomDirecteurSearchFilter;
    }

    public function getNomDoctorantSearchFilter(): TextSearchFilter
    {
        if ($this->nomDoctorantSearchFilter === null) {
            $this->nomDoctorantSearchFilter = $this->createFilterNomDoctorant();
        }
        return $this->nomDoctorantSearchFilter;
    }

    /**
     * @param EtablissementSearchFilter $etablissementTheseSearchFilter
     * @return RapportActiviteSearchService