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

Formations : petites améliorations concernant les enquêtes.

parent 2012cad7
Loading
Loading
Loading
Loading
+1 −0
Changes for CHANGELOG.md: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ Journal des modifications

13.5.0
------
- Formations : petites améliorations concernant les enquêtes.
- [FIX] Formations suivies : rétablissement de l'accès au dépôt de justificatif d'absence.

13.4.0
+18 −1
Changes for module/Formation/config/others/enquete.config.php: 18 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@
namespace Formation;

use Application\Navigation\ApplicationNavigationFactory;
use Formation\Assertion\Enquete\EnqueteAssertion;
use Formation\Assertion\Enquete\EnqueteAssertionFactory;
use Formation\Controller\EnqueteQuestionController;
use Formation\Controller\EnqueteQuestionControllerFactory;
use Formation\Controller\EnqueteReponseController;
@@ -33,9 +35,23 @@ use Formation\Service\EnqueteReponse\Search\EnqueteReponseSearchServiceFactory;
use Laminas\Router\Http\Literal;
use Laminas\Router\Http\Segment;
use UnicaenPrivilege\Guard\PrivilegeController;
use UnicaenPrivilege\Provider\Rule\PrivilegeRuleProvider;

return [
    'bjyauthorize' => [
        'rule_providers' => [
            PrivilegeRuleProvider::class => [
                'allow' => [
                    [
                        'privileges' => [
                            EnquetePrivileges::ENQUETE_REPONSE_REPONDRE,
                        ],
                        'resources' => ['Inscription'],
                        'assertion' => EnqueteAssertion::class,
                    ],
                ],
            ],
        ],
        'guards' => [
            PrivilegeController::class => [
                [
@@ -98,6 +114,7 @@ return [
                    'privileges' => [
                        EnquetePrivileges::ENQUETE_REPONSE_REPONDRE,
                    ],
                    'assertion' => EnqueteAssertion::class,
                ],
                [
                    'controller' => EnqueteReponseRechercheController::class,
@@ -337,8 +354,8 @@ return [
            EnqueteCategorieService::class => EnqueteCategorieServiceFactory::class,
            EnqueteQuestionService::class => EnqueteQuestionServiceFactory::class,
            EnqueteReponseService::class => EnqueteReponseServiceFactory::class,

            EnqueteReponseSearchService::class => EnqueteReponseSearchServiceFactory::class,
            EnqueteAssertion::class => EnqueteAssertionFactory::class,
        ],
    ],
    'controllers' => [
+86 −0
Changes for module/Formation/src/Formation/Assertion/Enquete/EnqueteAssertion.php: 86 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Formation\Assertion\Enquete;

use Application\Assertion\AbstractAssertion;
use Application\Entity\Db\Role;
use Application\Service\UserContextServiceAwareInterface;
use Doctorant\Service\DoctorantServiceAwareTrait;
use Formation\Entity\Db\Inscription;
use Formation\Provider\Privilege\EnquetePrivileges;
use Formation\Service\Inscription\InscriptionServiceAwareTrait;
use Laminas\Permissions\Acl\Assertion\AssertionInterface;
use Laminas\Permissions\Acl\Resource\ResourceInterface;
use UnicaenApp\Service\MessageCollectorAwareInterface;

class EnqueteAssertion extends AbstractAssertion implements AssertionInterface, UserContextServiceAwareInterface, MessageCollectorAwareInterface
{
    use DoctorantServiceAwareTrait;
    use InscriptionServiceAwareTrait;

    public function __invoke(array $page): bool
    {
        return $this->assertPage($page);
    }

    private function assertPage(array $page): bool
    {
        return true;
    }

    protected function assertController($controller, $action = null, $privilege = null): bool
    {
        if (!parent::assertController($controller, $action, $privilege)) {
            return false;
        }

        $inscriptionId = $this->getMvcEvent()->getRouteMatch()->getParam('inscription');
        $inscription = $inscriptionId ? $this->inscriptionService->getRepository()->find($inscriptionId) : null;

        switch ($action) {
            case 'repondre-questions':
            case 'valider-questions':
                if (!$this->scopeValide($inscription)) {
                    return false;
                }
                break;
        }
        return true;
    }

    /** @var Inscription $entity */
    protected function assertEntity(ResourceInterface $entity, $privilege = null): bool
    {
        if (!parent::assertEntity($entity, $privilege)) {
            return false;
        }

        $inscription = $entity;

        if ($privilege == EnquetePrivileges::ENQUETE_REPONSE_REPONDRE) {
            if (!$this->scopeValide($inscription)) {
                return false;
            }
        }

        return true;
    }

    public function scopeValide(?Inscription $inscription): bool
    {
        $role = $this->userContextService->getSelectedIdentityRole();
        if (!$role) {
            return false;
        }

        switch ($role->getCode()) {
            case Role::CODE_DOCTORANT :
                $individu = $this->userContextService->getIdentityIndividu();
                $doctorant = $inscription?->getDoctorant();
                $userDoctorant = $this->doctorantService->getRepository()->findOneByIndividu($individu);
                return $doctorant === $userDoctorant;
        }

        return true;
    }
}
 No newline at end of file
+38 −0
Changes for module/Formation/src/Formation/Assertion/Enquete/EnqueteAssertionFactory.php: 38 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Formation\Assertion\Enquete;

use Doctorant\Service\DoctorantService;
use Formation\Service\Inscription\InscriptionService;
use Laminas\Mvc\Application;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;

class EnqueteAssertionFactory {

    /**
     * @throws ContainerExceptionInterface
     * @throws NotFoundExceptionInterface
     */
    public function __invoke(ContainerInterface $container): EnqueteAssertion
    {
        /**
         * @see DoctorantService $doctorantService
         * @see InscriptionService $inscriptionService
         */
        $doctorantService = $container->get(DoctorantService::class);
        $inscriptionService = $container->get(InscriptionService::class);

        $assertion = new EnqueteAssertion();
        $assertion->setDoctorantService($doctorantService);
        $assertion->setInscriptionService($inscriptionService);

        /* @var Application $application */
        $application = $container->get('Application');
        $mvcEvent = $application->getMvcEvent();
        $assertion->setMvcEvent($mvcEvent);

        return $assertion;
    }
}
 No newline at end of file
+4 −11
Changes for module/Formation/src/Formation/Controller/EnqueteQuestionController.php: 4 added lines, 11 removed lines.
Original line number Diff line number Diff line
@@ -343,23 +343,16 @@ class EnqueteQuestionController extends AbstractController {

        $categories = $this->getEntityManager()->getRepository(EnqueteCategorie::class)->findAll();

        $delai = $inscription->getSursisEnquete() ?: $this->getParametreService()->getValeurForParametre(FormationParametres::CATEGORIE, FormationParametres::DELAI_ENQUETE);
        $heurodatagesSession = $inscription->getSession()->getHeurodatages();
        $date = null;
        foreach($heurodatagesSession as $heurodatageSession){
            $date = $heurodatageSession->getEtat()->getCode() === Etat::CODE_CLOTUREE ? DateTime::createFromFormat('d/m/Y', $heurodatageSession->getHeurodatage()->format('d/m/Y')) : $date;
            if($date){
                $date->add(new DateInterval('P'.$delai.'D'));
            }
        }
        $delaiEnqueteParametre = $this->parametreService->getValeurForParametre(FormationParametres::CATEGORIE, FormationParametres::DELAI_ENQUETE);
        $dateButoir = $inscription->computeDateButoirEnquete($delaiEnqueteParametre);

        return new ViewModel([
            'inscription' => $inscription,
            'questions' => $questions,
            'categories' => $categories,
            'form' => $form,
            'date' => $date,
            'delai' => $delai
            'date' => $dateButoir,
            'delai' => $inscription->getSursisEnquete() ?: $delaiEnqueteParametre,
        ]);
    }

Loading