Skip to content
Snippets Groups Projects
Commit 8fbe0fdc authored by Antony Le Courtes's avatar Antony Le Courtes
Browse files

Renforcement assertion pour bloquer la validation ou le refus d'une...

Renforcement assertion pour bloquer la validation ou le refus d'une candidature à sa propre composante uniquement (#60566)
parent 8b1baf89
No related branches found
No related tags found
No related merge requests found
...@@ -12,12 +12,12 @@ ...@@ -12,12 +12,12 @@
<th>Composante</th> <th>Composante</th>
<th>Etat</th> <th>Etat</th>
<th>Date commission</th> <th>Date commission</th>
<th v-if="canValiderCandidature || canRefuserCandidature">Action</th> <th>Action</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr v-if="candidatures.length == 0"> <tr v-if="candidatures.length == 0">
<td v-if="canValiderCandidature" colspan="5" style="text-align:center;">Aucune candidature</td> <td colspan="5" style="text-align:center;">Aucune candidature</td>
</tr> </tr>
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
<u-date v-if="candidature.dateCommission" :value="candidature.dateCommission"/> <u-date v-if="candidature.dateCommission" :value="candidature.dateCommission"/>
</td> </td>
<td v-if="this.canValiderCandidature || this.canRefuserCandidature" style="text-align:center;"> <td style="text-align:center;">
<a v-if="!candidature.validation && this.canValiderCandidature" <a v-if="!candidature.validation && candidature.canValider"
:href="urlAccepterCandidature(candidature)" :href="urlAccepterCandidature(candidature)"
class="btn btn-success" class="btn btn-success"
data-content="Êtes vous sûr de vouloir accepter cette candidature ?" data-content="Êtes vous sûr de vouloir accepter cette candidature ?"
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
@click.prevent="validerCandidature"> @click.prevent="validerCandidature">
<i class="fa-solid fa-check"></i> <i class="fa-solid fa-check"></i>
</a>&nbsp; </a>&nbsp;
<a v-if="this.canRefuserCandidature" :href="urlRefuserCandidature(candidature)" <a v-if="!candidature.motif && candidature.canRefuser" :href="urlRefuserCandidature(candidature)"
class="btn btn-danger" class="btn btn-danger"
data-content="Êtes vous sûr de vouloir refuser cette candidature ?" data-content="Êtes vous sûr de vouloir refuser cette candidature ?"
data-title="Refuser la candidature" data-title="Refuser la candidature"
...@@ -81,8 +81,6 @@ export default { ...@@ -81,8 +81,6 @@ export default {
name: "ListeCandidatures.vue", name: "ListeCandidatures.vue",
props: { props: {
intervenant: {required: true}, intervenant: {required: true},
canValiderCandidature: {type: Boolean, required: false},
canRefuserCandidature: {type: Boolean, required: false},
renseignerDonneesPersonnelles: {type: Boolean, required: false}, renseignerDonneesPersonnelles: {type: Boolean, required: false},
}, },
......
...@@ -91,12 +91,14 @@ return [ ...@@ -91,12 +91,14 @@ return [
'controller' => OffreEmploiController::class, 'controller' => OffreEmploiController::class,
'action' => 'accepter-candidature', 'action' => 'accepter-candidature',
'privileges' => Privileges::MISSION_CANDIDATURE_VALIDER, 'privileges' => Privileges::MISSION_CANDIDATURE_VALIDER,
'assertion' => Assertion\OffreEmploiAssertion::class,
], ],
'refuser-candidature' => [ 'refuser-candidature' => [
'route' => '/refuser-candidature/:candidature', 'route' => '/refuser-candidature/:candidature',
'controller' => OffreEmploiController::class, 'controller' => OffreEmploiController::class,
'action' => 'refuser-candidature', 'action' => 'refuser-candidature',
'privileges' => Privileges::MISSION_CANDIDATURE_REFUSER, 'privileges' => Privileges::MISSION_CANDIDATURE_REFUSER,
'assertion' => Assertion\OffreEmploiAssertion::class,
], ],
...@@ -167,7 +169,6 @@ return [ ...@@ -167,7 +169,6 @@ return [
Privileges::MISSION_OFFRE_EMPLOI_VALIDER, Privileges::MISSION_OFFRE_EMPLOI_VALIDER,
Privileges::MISSION_OFFRE_EMPLOI_POSTULER, Privileges::MISSION_OFFRE_EMPLOI_POSTULER,
Privileges::MISSION_CANDIDATURE_VISUALISATION, Privileges::MISSION_CANDIDATURE_VISUALISATION,
Privileges::MISSION_CANDIDATURE_VALIDER,
Privileges::MISSION_OFFRE_EMPLOI_SUPPRESSION, Privileges::MISSION_OFFRE_EMPLOI_SUPPRESSION,
], ],
...@@ -179,7 +180,7 @@ return [ ...@@ -179,7 +180,7 @@ return [
Privileges::MISSION_CANDIDATURE_VALIDER, Privileges::MISSION_CANDIDATURE_VALIDER,
Privileges::MISSION_CANDIDATURE_REFUSER, Privileges::MISSION_CANDIDATURE_REFUSER,
], ],
'resources' => ['Intervenant'], 'resources' => 'Candidature',
'assertion' => Assertion\OffreEmploiAssertion::class, 'assertion' => Assertion\OffreEmploiAssertion::class,
], ],
......
...@@ -9,6 +9,7 @@ use Application\Service\Traits\WorkflowServiceAwareTrait; ...@@ -9,6 +9,7 @@ use Application\Service\Traits\WorkflowServiceAwareTrait;
use Intervenant\Entity\Db\Intervenant; use Intervenant\Entity\Db\Intervenant;
use Laminas\Permissions\Acl\Resource\ResourceInterface; use Laminas\Permissions\Acl\Resource\ResourceInterface;
use Lieu\Entity\Db\Structure; use Lieu\Entity\Db\Structure;
use Mission\Entity\Db\Candidature;
use Mission\Entity\Db\OffreEmploi; use Mission\Entity\Db\OffreEmploi;
use UnicaenApp\Service\EntityManagerAwareInterface; use UnicaenApp\Service\EntityManagerAwareInterface;
use UnicaenApp\Service\EntityManagerAwareTrait; use UnicaenApp\Service\EntityManagerAwareTrait;
...@@ -87,9 +88,10 @@ class OffreEmploiAssertion extends AbstractAssertion implements EntityManagerAwa ...@@ -87,9 +88,10 @@ class OffreEmploiAssertion extends AbstractAssertion implements EntityManagerAwa
return $this->assertOffreEmploiSupprimer($role, $entity); return $this->assertOffreEmploiSupprimer($role, $entity);
} }
break; break;
case $entity instanceof Intervenant: case $entity instanceof Candidature:
switch ($privilege) { switch ($privilege) {
case Privileges::MISSION_CANDIDATURE_VALIDER: case Privileges::MISSION_CANDIDATURE_VALIDER:
case Privileges::MISSION_CANDIDATURE_REFUSER:
return $this->assertCandidatureValider($role, $entity); return $this->assertCandidatureValider($role, $entity);
} }
break; break;
...@@ -121,16 +123,19 @@ class OffreEmploiAssertion extends AbstractAssertion implements EntityManagerAwa ...@@ -121,16 +123,19 @@ class OffreEmploiAssertion extends AbstractAssertion implements EntityManagerAwa
if (!$entity) { if (!$entity) {
$entity = $this->getMvcEvent()->getParam('volumeHoraireMission'); $entity = $this->getMvcEvent()->getParam('volumeHoraireMission');
} }
if (!$entity) {
$entity = $this->getMvcEvent()->getParam('candidature');
}
if (!$entity) { if (!$entity) {
return false; return false;
} }
switch ($action) { switch ($action) {
case 'candidature': case 'accepter-candidature':
if ($entity instanceof Intervenant){ case 'refuser-candidature':
// à revoir : réorganiser l'assertion if ($entity instanceof Candidature){
// intégrer le workflow $assert = $this->assertCandidatureValider($role, $entity);
return $entity->getStatut()->getOffreEmploiPostuler(); return $assert;
} }
break; break;
} }
...@@ -258,14 +263,16 @@ class OffreEmploiAssertion extends AbstractAssertion implements EntityManagerAwa ...@@ -258,14 +263,16 @@ class OffreEmploiAssertion extends AbstractAssertion implements EntityManagerAwa
protected function assertCandidatureValider (Role $role, Intervenant $intervenant) protected function assertCandidatureValider (Role $role, Candidature $candidature)
{ {
$codeEtape = WfEtape::CANDIDATURE_VALIDATION; $codeEtape = WfEtape::CANDIDATURE_VALIDATION;
$intervenant = $candidature->getIntervenant();
$wfEtape = $this->getServiceWorkflow()->getEtape($codeEtape, $intervenant); $wfEtape = $this->getServiceWorkflow()->getEtape($codeEtape, $intervenant);
$structureOffre = $candidature->getOffre()->getStructure();
return $this->asserts([ return $this->asserts([
$wfEtape && $wfEtape->isAtteignable(), $wfEtape && $wfEtape->isAtteignable(),
$this->haveRole(), $this->assertStructure($role, $structureOffre),
]); ]);
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
namespace Mission\Service; namespace Mission\Service;
use Application\Acl\Role; use Application\Acl\Role;
use Application\Provider\Privilege\Privileges;
use Application\Service\AbstractEntityService; use Application\Service\AbstractEntityService;
use Application\Service\Traits\ContextServiceAwareTrait; use Application\Service\Traits\ContextServiceAwareTrait;
use Application\Service\Traits\ParametresServiceAwareTrait; use Application\Service\Traits\ParametresServiceAwareTrait;
...@@ -108,13 +109,22 @@ class CandidatureService extends AbstractEntityService ...@@ -108,13 +109,22 @@ class CandidatureService extends AbstractEntityService
$query = $this->getEntityManager()->createQuery($dql)->setParameters($parameters); $query = $this->getEntityManager()->createQuery($dql)->setParameters($parameters);
$result = $query->getResult(); $result = $query->getResult();
$triggers = []; $triggers = [
'/' => function (Candidature $original, array $extracted) {
$extracted['canValider'] = $this->getAuthorize()->isAllowed($original, Privileges::MISSION_CANDIDATURE_VALIDER);
$extracted['canRefuser'] = $this->getAuthorize()->isAllowed($original, Privileges::MISSION_CANDIDATURE_REFUSER);
return $extracted;
},
];
$properties = [ $properties = [
'id', 'id',
'motif', 'motif',
'validation', 'validation',
'dateCommission', 'dateCommission',
'canValider',
'canRefuser',
['offre', ['id', 'typeMission', 'titre', ['structure', ['libelleCourt']]]], ['offre', ['id', 'typeMission', 'titre', ['structure', ['libelleCourt']]]],
['intervenant', ['id', 'nomUsuel', 'prenom', 'emailPro', 'code', ['structure', ['libelleLong', 'libelleCourt', 'code', 'id']], ['statut', ['libelle', 'code']]]], ['intervenant', ['id', 'nomUsuel', 'prenom', 'emailPro', 'code', ['structure', ['libelleLong', 'libelleCourt', 'code', 'id']], ['statut', ['libelle', 'code']]]],
]; ];
......
<?php <?php
use Application\Provider\Privilege\Privileges;
$this->intervenant($intervenant)->renderTitle('Candidature'); $this->intervenant($intervenant)->renderTitle('Candidature');
$canValiderCandidature = $this->isAllowed($intervenant, Privileges::MISSION_CANDIDATURE_VALIDER);
$canRefuserCandidature = $this->isAllowed($intervenant, Privileges::MISSION_CANDIDATURE_REFUSER);
echo $this->vue('mission/liste-candidatures', [ echo $this->vue('mission/liste-candidatures', [
'intervenant' => $intervenant->getId(), 'intervenant' => $intervenant->getId(),
'canValiderCandidature' => $canValiderCandidature,
'canRefuserCandidature' => $canRefuserCandidature,
'renseignerDonneesPersonnelles' => $renseignerDonneesPersonnelles, 'renseignerDonneesPersonnelles' => $renseignerDonneesPersonnelles,
]); ]);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment