diff --git a/documentation/SQL/release_1.1.0.sql b/documentation/SQL/release_1.1.0.sql index 941964945317937161ba61e822b209f84e6d0d2b..ac835934a7b30cefe59b8ea1eac21eac7e5c8c9a 100644 --- a/documentation/SQL/release_1.1.0.sql +++ b/documentation/SQL/release_1.1.0.sql @@ -32,3 +32,10 @@ FROM d JOIN unicaen_parametre_categorie cp ON cp.CODE = 'GLOBAL'; +INSERT INTO unicaen_privilege_privilege(CATEGORIE_ID, CODE, LIBELLE, ORDRE) +WITH d(code, lib, ordre) AS ( + select 'inscription_annuler', 'Annuler l''inscription', 60 +) +SELECT cp.id, d.code, d.lib, d.ordre +FROM d +JOIN unicaen_privilege_categorie cp ON cp.CODE = 'inscription'; \ No newline at end of file diff --git a/module/Formation/config/merged/inscription.config.php b/module/Formation/config/merged/inscription.config.php index 3c266aac3550da6305914d1cbda33a2e154bd894..54236453437c412d41bfeb2aa5efc0f6911bdaf1 100644 --- a/module/Formation/config/merged/inscription.config.php +++ b/module/Formation/config/merged/inscription.config.php @@ -46,6 +46,7 @@ return [ [ 'privileges' => [ InscriptionPrivileges::INSCRIPTION_AFFICHER, + InscriptionPrivileges::INSCRIPTION_ANNULER, ], 'resources' => ['Inscription'], 'assertion' => InscriptionAssertion::class @@ -140,13 +141,21 @@ return [ 'controller' => InscriptionController::class, 'action' => [ 'inscription', - 'desinscription', ], 'roles' => [ 'Agent', 'Stagiaire externe', ], ], + [ + 'controller' => InscriptionController::class, + 'action' => [ + 'desinscription', + ], + 'privileges' => [ + InscriptionPrivileges::INSCRIPTION_ANNULER, + ], + ], [ 'controller' => InscriptionController::class, 'action' => [ diff --git a/module/Formation/src/Formation/Assertion/InscriptionAssertion.php b/module/Formation/src/Formation/Assertion/InscriptionAssertion.php index 478d46b85505d4f6d99c67bf3daa6c28d02c316b..dde38523a1c16b955914cd6d81c74d8cc95dcc0e 100644 --- a/module/Formation/src/Formation/Assertion/InscriptionAssertion.php +++ b/module/Formation/src/Formation/Assertion/InscriptionAssertion.php @@ -9,6 +9,8 @@ use Agent\Service\Agent\AgentServiceAwareTrait; use Agent\Service\AgentValidateur\AgentValidateurServiceAwareTrait; use Agent\Provider\Privilege\AgentPrivileges; use Formation\Entity\Db\Inscription; +use Formation\Provider\Etat\InscriptionEtats; +use Formation\Provider\Etat\SessionEtats; use Formation\Provider\Privilege\InscriptionPrivileges; use Formation\Provider\Role\FormationRoles; use Formation\Service\Inscription\InscriptionServiceAwareTrait; @@ -64,10 +66,16 @@ class InscriptionAssertion extends AbstractAssertion if (!$this->getPrivilegeService()->checkPrivilege($privilege, $role)) return false; + $session = $entity->getSession(); + $sessionEtat = $session->getEtatActif()?->getType()->getCode(); switch ($privilege) { case InscriptionPrivileges::INSCRIPTION_AFFICHER: return $this->isScopeCompatible($entity, $user, $role); + case InscriptionPrivileges::INSCRIPTION_ANNULER: + if (!$this->isScopeCompatible($entity, $user, $role)) return false; + if (!in_array($role->getRoleId(), [RolesProvider::ROLE_AGENT, FormationRoles::STAGIAIRE_EXTERNE])) return true; + return ($sessionEtat AND in_array($sessionEtat, SessionEtats::ETATS_INSCRIPTION_ANNULABLE)); } return true; diff --git a/module/Formation/src/Formation/Provider/Etat/SessionEtats.php b/module/Formation/src/Formation/Provider/Etat/SessionEtats.php index 34b3187fa35e8f2245548fc9237a22f49978ed4c..4fc070c8e6ca239b9423e13f68d31ec83be092a1 100644 --- a/module/Formation/src/Formation/Provider/Etat/SessionEtats.php +++ b/module/Formation/src/Formation/Provider/Etat/SessionEtats.php @@ -32,4 +32,10 @@ class SessionEtats { SessionEtats::ETAT_SESSION_ANNULEE, SessionEtats::ETAT_CLOTURE_INSTANCE, ]; + + const ETATS_INSCRIPTION_ANNULABLE = [ + SessionEtats::ETAT_CREATION_EN_COURS, + SessionEtats::ETAT_INSCRIPTION_OUVERTE, + SessionEtats::ETAT_INSCRIPTION_FERMEE, + ]; } \ No newline at end of file diff --git a/module/Formation/src/Formation/Provider/Privilege/InscriptionPrivileges.php b/module/Formation/src/Formation/Provider/Privilege/InscriptionPrivileges.php index 298106ff541d4a0bbc2c56084fffadb0ac19e71f..b26efecfd920dbdc66397a6b8593b7ace527f6c5 100644 --- a/module/Formation/src/Formation/Provider/Privilege/InscriptionPrivileges.php +++ b/module/Formation/src/Formation/Provider/Privilege/InscriptionPrivileges.php @@ -7,5 +7,6 @@ use UnicaenPrivilege\Provider\Privilege\Privileges; class InscriptionPrivileges extends Privileges { const INSCRIPTION_AFFICHER = 'inscription-inscription_afficher'; + const INSCRIPTION_ANNULER = 'inscription-inscription_annuler'; const INSCRIPTION_ENQUETE = 'inscription-inscription_enquete'; } diff --git a/module/Formation/view/formation/formation-instance-inscrit/inscriptions.phtml b/module/Formation/view/formation/formation-instance-inscrit/inscriptions.phtml index 124ddf903fe51a7fd986f6470241cd5be87a5ad5..09f8b1b83ca51754d7374c91f8a7b648b076d9d7 100644 --- a/module/Formation/view/formation/formation-instance-inscrit/inscriptions.phtml +++ b/module/Formation/view/formation/formation-instance-inscrit/inscriptions.phtml @@ -18,6 +18,7 @@ use Agent\Entity\Db\Agent; use DemandeExterne\Entity\Db\DemandeExterne; use Formation\Entity\Db\Inscription; use Formation\Provider\Etat\SessionEtats; +use Formation\Provider\Privilege\InscriptionPrivileges; ?> @@ -64,13 +65,15 @@ use Formation\Provider\Etat\SessionEtats; <strong>Inscrit en liste <?php echo $inscription->getListe(); ?></strong> </div> <div class="col-md-4"> + <?php if ($this->isAllowed($inscription, InscriptionPrivileges::INSCRIPTION_ANNULER)) : ?> <a - <?php /** @see \Formation\Controller\FormationInstanceInscritController::desinscriptionAction() */ ?> + <?php /** @see \Formation\Controller\InscriptionController::desinscriptionAction() */ ?> href="<?php echo $this->url('inscription/annuler-inscription', ['inscription' => $inscription->getId()], [], true); ?>" class="btn btn-danger ajax-modal" data-event="modification" > <span class="icon icon-unchecked"> J'annule mon inscription </span> </a> + <?php endif; ?> <?php if ($instance->isEtatActif(SessionEtats::ETAT_FORMATION_CONVOCATION) && $inscription->getListe() === Inscription::PRINCIPALE) : ?> <br/> <a