Commit c586dfb7 authored by Thomas Hamel's avatar Thomas Hamel
Browse files

impossibilité pour le doctorant de s'inscrire à plusieurs sessions de la même...

impossibilité pour le doctorant de s'inscrire à plusieurs sessions de la même formation (ajout d'une assertion)
parent 1c26b547
Loading
Loading
Loading
Loading
+60 −5
Changes for module/Formation/src/Formation/Assertion/Inscription/InscriptionAssertion.php: 60 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -4,15 +4,18 @@ namespace Formation\Assertion\Inscription;

use Application\Assertion\AbstractAssertion;
use Application\Entity\Db\Role;
use Application\Service\AnneeUniv\AnneeUnivServiceAwareTrait;
use Application\Service\UserContextServiceAwareInterface;
use DateInterval;
use DateTime;
use Doctorant\Service\DoctorantServiceAwareTrait;
use Exception;
use Formation\Entity\Db\Etat;
use Formation\Entity\Db\Inscription;
use Formation\Entity\Db\Session;
use Formation\Provider\Privilege\InscriptionPrivileges;
use Formation\Service\Inscription\InscriptionServiceAwareTrait;
use Formation\Service\Session\SessionServiceAwareTrait;
use JetBrains\PhpStorm\Pure;
use Laminas\Permissions\Acl\Assertion\AssertionInterface;
use Laminas\Permissions\Acl\Resource\ResourceInterface;
@@ -23,6 +26,9 @@ class InscriptionAssertion extends AbstractAssertion implements AssertionInterf
{
    use DoctorantServiceAwareTrait;
    use InscriptionServiceAwareTrait;
    use InscriptionServiceAwareTrait;
    use AnneeUnivServiceAwareTrait;
    use SessionServiceAwareTrait;

    private ?int $delaiDescinscription = null;

@@ -73,6 +79,22 @@ class InscriptionAssertion extends AbstractAssertion implements AssertionInterf
        if($sessionId) $inscription = $this->getInscriptionService()->getRepository()->find($sessionId);

        switch($action) {
            case 'ajouter' :
                $doctorantId = (($this->getMvcEvent()->getRouteMatch()->getParam('doctorant')));
                if ($inscription === null && $doctorantId) {
                    $sessionId = (($this->getMvcEvent()->getRouteMatch()->getParam('session')));
                    if($sessionId){
                        $doctorant = $this->doctorantService->getRepository()->find($doctorantId);
                        $session = $this->sessionService->getRepository()->find($sessionId);

                        $inscription = new Inscription();
                        $inscription->setDoctorant($doctorant);
                        $inscription->setSession($session);
                        return $this->canInscrire($inscription);
                    }
                    return false;
                }
                return true;
            case 'desinscription' :
                if ($inscription !== null) {
                    return $this->canDesinscrire($inscription);
@@ -89,14 +111,48 @@ class InscriptionAssertion extends AbstractAssertion implements AssertionInterf
            return false;
        }

        switch ($privilege) {
            case InscriptionPrivileges::INSCRIPTION_AJOUTER :
                return $this->canDesinscrire($entity);
        $inscription = $entity;

        if ($privilege == InscriptionPrivileges::INSCRIPTION_AJOUTER) {
            if ($inscription->getHistoCreateur()) return $this->canDesinscrire($entity);
            return $this->canInscrire($entity);
        }

        return true;
    }

    private function canInscrire(?Inscription $inscription): bool
    {
        if (!$this->scopeValide($inscription)) return false;
        $doctorant = $inscription->getDoctorant();
        $session = $inscription->getSession();
        $inscriptions = $this->inscriptionService->getRepository()->findInscriptionsByDoctorant($doctorant);

        /** @var Inscription $inscription */
        foreach ($inscriptions as $inscription) {
            $sessionInscriptionEnregistree = $inscription->getSession();
            if (!$sessionInscriptionEnregistree || !$sessionInscriptionEnregistree->getDateDebut()) {
                continue; // Passe à l'inscription suivante si la session ou la date de début est manquante
            }

            $premiereAnneeUnivSessionInscription = $this->anneeUnivService->fromDate($sessionInscriptionEnregistree->getDateDebut())->getPremiereAnnee();
            //si la session demandée possède la même formation qu'une inscription possédée par l'étudiant,
            //on vérifie que l'année universitaire ne soit pas la même
            //sinon on refuse l'inscription, car l'étudiant ne peut pas s'inscrire sur une session appartenant à une formation déjà suivie sur la même année universitaire
            if ($session && $session->getFormation() === $sessionInscriptionEnregistree->getFormation()) {
                $sessionOuverteDateDebut = $session->getDateDebut();
                if ($sessionOuverteDateDebut) {
                    $premiereAnneeUnivSessionOuverte = $this->anneeUnivService->fromDate($sessionOuverteDateDebut)->getPremiereAnnee();
                    // Si les années universitaires sont identiques, on interdit l'inscription
                    if ($premiereAnneeUnivSessionOuverte === $premiereAnneeUnivSessionInscription) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    private function canDesinscrire(?Inscription $inscription): bool
    {
        if (!$this->scopeValide($inscription)) return false;
@@ -125,13 +181,12 @@ class InscriptionAssertion extends AbstractAssertion implements AssertionInterf
            return false;
        }

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

    }
}
 No newline at end of file
+8 −0
Changes for module/Formation/src/Formation/Assertion/Inscription/InscriptionAssertionFactory.php: 8 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -2,9 +2,11 @@

namespace Formation\Assertion\Inscription;

use Application\Service\AnneeUniv\AnneeUnivService;
use Doctorant\Service\DoctorantService;
use Formation\Provider\Parametre\FormationParametres;
use Formation\Service\Inscription\InscriptionService;
use Formation\Service\Session\SessionService;
use Laminas\Mvc\Application;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
@@ -23,14 +25,20 @@ class InscriptionAssertionFactory {
         * @see DoctorantService $doctorantService
         * @see InscriptionService $inscriptionService
         * @see ParametreService $parametreService
         * @see AnneeUnivService $anneeUnivService
         * @see SessionService $sessionService
         */
        $doctorantService = $container->get(DoctorantService::class);
        $inscriptionService = $container->get(InscriptionService::class);
        $parametreService = $container->get(ParametreService::class);
        $anneeUnivService = $container->get(AnneeUnivService::class);
        $sessionService = $container->get(SessionService::class);

        $assertion = new InscriptionAssertion();
        $assertion->setDoctorantService($doctorantService);
        $assertion->setInscriptionService($inscriptionService);
        $assertion->setAnneeUnivService($anneeUnivService);
        $assertion->setSessionService($sessionService);
        $assertion->setDelaiDescinscription($parametreService->getValeurForParametre(FormationParametres::CATEGORIE, FormationParametres::DELAI_ANNULATION_INSCRIPTION));

        /* @var $application Application */
+1 −0
Changes for module/Formation/src/Formation/Entity/Db/Repository/InscriptionRepository.php: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ class InscriptionRepository extends EntityRepository
        $qb = $this->createQB('inscription')
            ->andWhere('inscription.doctorant = :doctorant')
            ->setParameter('doctorant', $doctorant)
            ->andWhere('inscription.histoDestruction IS NULL')
        ;
        $result = $qb->getQuery()->getResult();

+19 −11
Changes for module/Formation/view/formation/index/index-doctorant.phtml: 19 added lines, 11 removed lines.
Original line number Diff line number Diff line
@@ -201,18 +201,25 @@ $now = new DateTime();
                           class="ajax-modal">
                            <span class="icon icon-voir"></span> Afficher les informations </a>
                        <br/>
                        <?php $inscrit = $session->estInscrit($doctorant); ?>
                        <?php if ($canAjouterInscription and !$inscrit) : ?>
                        <?php $inscrit = $session->estInscrit($doctorant);
                        if($inscrit): ?>
                            <span class="icon icon-ok" style="color:darkgreen;" data-bs-toggle="tooltip" title="Vous êtes déjà inscrit à cette formation"> Inscrit·e</span>
                        <?php else:
                            $inscription = new Inscription();
                            $inscription->setDoctorant($doctorant);
                            $inscription->setSession($session);
                            $canAjouterInscription = $this->isAllowed($inscription, InscriptionPrivileges::INSCRIPTION_AJOUTER);
                            if ($canAjouterInscription) : ?>
                                <?php /** @see \Formation\Controller\InscriptionController::ajouterAction() */ ?>
                            <a href="<?php echo $this->url('formation/inscription/ajouter', ['session' => $session->getId(), 'doctorant' => $doctorant->getId()], ['query' => ['retour' => $this->url('formation/index-doctorant', ['doctorant' => $doctorant->getId()], ['fragment' => 'preparation'], true)]], true); ?>"
                            >
                                <a href="<?php echo $this->url('formation/inscription/ajouter', ['session' => $session->getId(), 'doctorant' => $doctorant->getId()], ['query' => ['retour' => $this->url('formation/index-doctorant', ['doctorant' => $doctorant->getId()], ['fragment' => 'preparation'], true)]], true); ?>">
                                    <span class="icon icon-ajouter"
                                          title="M'inscrire" data-bs-toggle="tooltip" data-bs-html="true"
                            ></span>&nbsp;M'inscrire</a>
                        <?php endif; ?>
                        <?php if ($inscrit) : ?>
                                <span class="icon icon-ok" style="color:darkgreen;" title="Vous êtes déjà inscrit"> Inscrit·e</span>
                        <?php endif; ?>
                                    ></span>&nbsp;M'inscrire
                                </a>
                            <?php else: ?>
                                <span class="icon icon-unchecked" style="color:darkred;" data-bs-toggle="tooltip" title="Vous suivez déjà (ou avez déjà suivi) cette formation lors de cette année universitaire">&nbsp;Impossible de s'inscrire</span>
                            <?php endif;
                        endif; ?>
                    </td>
                </tr>
            <?php endforeach; ?>
@@ -359,9 +366,10 @@ $now = new DateTime();
                                    <span class="icon icon-pdf" title="Télécharger la convocation" data-bs-toggle="tooltip" data-bs-html="true"></span> Télécharger la convocation
                                </a>
                            <?php else: ?>
                                <span class="icon icon-pdf" style="color: lightgrey;"
                                <span class="icon icon-pdf" style="color: lightgrey;" data-bs-toggle="tooltip"
                                      title="La convocation n'est disponible que pour les inscrits en liste principale">
                                </span> convocation
                                    Convocation
                                </span>
                            <?php endif; ?>
                        <?php endif; ?>
                    </td>