Loading data/ddl/table/CANDIDATURE.php +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ return [ 'position' => 1, 'commentaire' => NULL, ], 'VALIDATION_iD' => [ 'VALIDATION_ID' => [ 'name' => 'VALIDATION_ID', 'type' => 'int', 'bdd-type' => 'NUMBER', Loading data/privileges.php +2 −0 Original line number Diff line number Diff line Loading @@ -168,6 +168,8 @@ return [ 'offre-emploi-modifier' => 'Modifier des offres d\'emploi', 'offre-emploi-valider' => 'Valider des offres d\'emploi', 'offre-emploi-postuler' => 'Postuler à une offre d\'emploi', 'candidature-valider' => 'Valider une candidature', 'candidature-visualisation' => 'Visualiser les candidatures d\'une offre', ], Loading front/Mission/ListeOffreEmploi.vue +20 −7 Original line number Diff line number Diff line <template> <!--On affiche une synthèse de la liste des offres--> <div v-if="!extended" class="row row-cols-1 row-cols-md-2 g-4 mb-3"> <offreEmploi v-for="offre in offres" @supprimer="supprimer" @refresh="refresh" :key="offre.id" :offre="offre" :public="this.public" <offreEmploi v-for="offre in offres" @supprimer="supprimer" @refresh="refresh" :key="offre.id" :offre="offre" :canModifier="this.canModifier" :canValider="this.canValider" :canSupprimer="this.canSupprimer"></offreEmploi> :canSupprimer="this.canSupprimer" :canVoirCandidature="this.canVoirCandidature"></offreEmploi> </div> <a v-if="!this.public && this.canModifier" class=" btn btn-primary" :href="ajoutUrl" @click.prevent="ajout">Ajouter une nouvelle offre</a> <div v-if="!extended"> <a v-if="this.canModifier" class=" btn btn-primary" :href="ajoutUrl" @click.prevent="ajout">Ajouter une nouvelle offre</a> </div> <!--On affiche une synthèse de la liste des offres--> <div v-if="extended"> <offreEmploi v-for="offre in offres" :key="offre.id" :offre="offre" :canPostuler="this.canPostuler" :extended="extended" :public="this.public" :utilisateur="this.utilisateur" :intervenant="this.intervenant"></offreEmploi> <offreEmploi v-for="offre in offres" :key="offre.id" :offre="offre" :canPostuler="this.canPostuler" :canVoirCandidature="this.canVoirCandidature" :canValiderCandidature="this.canValiderCandidature" :extended="extended" :utilisateur="this.utilisateur" :intervenant="this.intervenant"></offreEmploi> </div> <br/> </template> <script> Loading @@ -22,13 +33,15 @@ export default { offreEmploi }, props: { public: {type: Boolean, required: true}, id: {type: Number, required: false}, utilisateur: {required: false}, intervenant: {required: false}, canModifier: {type: Boolean, required: false}, canPostuler: {type: Boolean, required: false}, canValider: {type: Boolean, required: false}, canVoirCandidature: {type: Boolean, required: false}, canValiderCandidature: {type: Boolean, required: false}, canSupprimer: {type: Boolean, required: false}, Loading front/Mission/OffreEmploi.vue +49 −37 Original line number Diff line number Diff line <template> <div class="col" v-if="isPublic && !this.extended"> <div class="col" v-if="!this.extended"> <div class="card h-100"> <div class="card-header"> <h4> {{ offre.titre }}</h4> <span class="badge rounded-pill bg-info">{{ offre.nombreHeures }} heure(s)</span> <span v-if="nbPostesRestants > 0" class="badge rounded-pill bg-success">{{ nbPostesRestants }} poste(s) restant(s)</span> <span v-if="nbPostesRestants <= 0" class="badge rounded-pill bg-danger">Tous les postes sont pourvus</span> <span v-if="offre.validation && !this.public" class="badge rounded-pill bg-success">Valider le <u-date <span v-if="offre.validation" class="badge rounded-pill bg-success">Valider le <u-date :value="offre.validation.histoCreation"/> par {{ offre.validation.histoCreateur.displayName }}</span> <span v-if="!offre.validation && !this.public" class="badge rounded-pill bg-warning"> En attente de validation par la DRH</span> <span v-if="!offre.validation" class="badge rounded-pill bg-warning"> En attente de validation par la DRH</span> </div> <div class="card-body"> Loading @@ -31,19 +31,19 @@ </div> <div class="card-footer"> <div class="d-grid gap-2 d-md-flex justify-content-md-end"> <a v-if="offre.validation && offre.canValide && !this.public" <a v-if="offre.validation && offre.canValide" :href="devaliderUrl" class="btn btn-danger" @click.prevent="devalider">Devalider</a> <a v-if="!offre.validation && offre.canValide && !this.public" <a v-if="!offre.validation && offre.canValide" :href="validerUrl" class="btn btn-success" @click.prevent="valider">Valider</a> <a v-if="offre.canSaisie && !this.public" <a v-if="offre.canModifier" :href="saisirUrl" class="btn btn-primary" @click.prevent="saisir">Modifier</a> <a v-if="offre.canSupprime && !this.public" <a v-if="offre.canSupprime" :href="supprimerUrl" class="btn btn-danger" data-title="Suppression de l'offre" Loading @@ -52,10 +52,7 @@ <a :href="consulterUrl" class="btn btn-primary" >Plus d'information</a> <a v-if="this.public" :href="consulterUrl" class="btn btn-primary" >Plus d'information</a> </div> </div> </div> Loading @@ -68,13 +65,13 @@ postuler. </div> </div> <div v-if="!offre.canPostuler" class="alert alert-primary d-flex align-items-center" role="alert"> <div v-if="!offre.canPostuler && this.utilisateur" class="alert alert-primary d-flex align-items-center" role="alert"> <i class="fa-solid fa-circle-xmark"></i> <div class="ms-2"> Vous n'avez pas les droits pour postuler à cette offre, merci de contacter votre administration de rattachement. </div> </div> <div v-if="isCandidat" class="alert alert-primary d-flex align-items-center" role="alert"> <div v-if="isCandidat && this.utilisateur" class="alert alert-primary d-flex align-items-center" role="alert"> <i class="fa-solid fa-circle-xmark"></i> <div class="ms-2"> Vous avez déjà postulé à cette offre. Loading Loading @@ -108,23 +105,46 @@ {{ offre.description }} <br/><br/> <div v-if="this.canVoirCandidature"> <h5><strong>Liste des candidats :</strong></h5> <h2>Candidats en cours</h2> <table class="table table-bordered "> <thead> <tr> <th>Intervenant</th> <th>Composante</th> <th>Etat</th> <th v-if="canValiderCandidature">Action</th> </tr> </thead> <tbody> <tr v-if="offre.candidatures.length == 0"> <td v-if="canValiderCandidature" colspan="4" style="text-align:center;">Aucune candidature</td> <td v-if="!canValiderCandidature" colspan="3" style="text-align:center;">Aucune candidature</td> </tr> <tr v-for="candidature in offre.candidatures"> <td><a :href="'/intervenant/code:' + candidature.intervenant.code + '/voir'"> {{ candidature.intervenant.prenom+' '+candidature.intervenant.nomUsuel }}</a></td> <td>{{ candidature.intervenant.structure.libelleLong }}</td> <th> <span v-if="candidature.intervenant.validation" class="badge rounded-pill bg-success">Valider le <u-date :value="candidature.intervenant.validation.histoCreation"/> par {{ candidature.intervenant.validation.histoCreateur.displayName }}</span> <span v-if="!candidature.intervenant.validation" class="badge rounded-pill bg-warning">En attente de validation</span> </th> <td v-if="this.canValiderCandidature"> <a :href="'/intervenant/code:' + candidature.intervenant.code + '/voir'" v-if="!candidature.intervenant.validation">Valider </a> </td> </tr> </tbody> <div> <ul> <li v-for="candidature in offre.candidatures"> {{ candidature.intervenant.prenom+' '+candidature.intervenant.nomUsuel }} <a :href="'/intervenant/code:' + candidature.intervenant.code + '/voir'">Voir</a> </li> </ul> </table> </div> <div class="mt-5"> <a class="btn btn-primary" href="/offre-emploi/public">Retour aux offres</a> <a :class="isDisabled" :href="postulerUrl" data-bs-toggle="tooltip" data-bs-placement="top" <a class="btn btn-primary" href="/offre-emploi">Retour aux offres</a> <a :class="isDisabled" :href="'/offre-emploi/postuler/' + offre.id" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-original-title="Vous devez être connecté pour postuler">Postuler</a> Loading @@ -140,13 +160,15 @@ export default { name: "OffreEmploi.vue", props: { offre: {required: true}, public: {type: Boolean, required: false}, utilisateur: {required: false}, intervenant: {required: false}, extended: {type: Boolean, required: false}, canModifier: {type: Boolean, required: false}, canPostuler: {type: Boolean, required: false}, canValider: {type: Boolean, required: false}, canSupprimer: {type: Boolean, required: false}, canVoirCandidature: {type: Boolean, required: false}, canValiderCandidature: {type: Boolean, required: false}, }, data() { Loading @@ -156,22 +178,12 @@ export default { supprimerUrl: unicaenVue.url("offre-emploi/supprimer/:offre", {offre: this.offre.id}), validerUrl: unicaenVue.url('offre-emploi/valider/:offre', {offre: this.offre.id}), devaliderUrl: unicaenVue.url('offre-emploi/devalider/:offre', {offre: this.offre.id}), consulterUrl: unicaenVue.url('offre-emploi/public/:offre', {offre: this.offre.id}), postulerUrl: unicaenVue.url('offre-emploi/postuler/:offre', {offre: this.offre.id}) consulterUrl: unicaenVue.url('offre-emploi/detail/:offre', {offre: this.offre.id}), }; }, computed: { isPublic: function () { if (this.public === false) { return true; } else if (this.public === true && this.offre.validation != null) { return true; } else { return false; } }, isDisabled: function () { if (!this.offre.canPostuler || this.offre.candidats.indexOf(this.intervenant.id) !== -1) { if (!this.offre.canPostuler || this.offre.candidats.indexOf(this.intervenant.id) == -1) { return 'btn btn-primary disabled'; } return 'btn btn-primary'; Loading module/Application/src/Entity/Db/Intervenant.php +3 −3 Original line number Diff line number Diff line Loading @@ -364,7 +364,7 @@ class Intervenant implements HistoriqueAwareInterface, ResourceInterface, Import public function axiosDefinition(): array { return ['nomUsuel', 'prenom', 'emailPro', 'statut', 'code']; return ['id', 'nomUsuel', 'prenom', 'emailPro', 'statut', 'code', 'structure']; } Loading Loading
data/ddl/table/CANDIDATURE.php +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ return [ 'position' => 1, 'commentaire' => NULL, ], 'VALIDATION_iD' => [ 'VALIDATION_ID' => [ 'name' => 'VALIDATION_ID', 'type' => 'int', 'bdd-type' => 'NUMBER', Loading
data/privileges.php +2 −0 Original line number Diff line number Diff line Loading @@ -168,6 +168,8 @@ return [ 'offre-emploi-modifier' => 'Modifier des offres d\'emploi', 'offre-emploi-valider' => 'Valider des offres d\'emploi', 'offre-emploi-postuler' => 'Postuler à une offre d\'emploi', 'candidature-valider' => 'Valider une candidature', 'candidature-visualisation' => 'Visualiser les candidatures d\'une offre', ], Loading
front/Mission/ListeOffreEmploi.vue +20 −7 Original line number Diff line number Diff line <template> <!--On affiche une synthèse de la liste des offres--> <div v-if="!extended" class="row row-cols-1 row-cols-md-2 g-4 mb-3"> <offreEmploi v-for="offre in offres" @supprimer="supprimer" @refresh="refresh" :key="offre.id" :offre="offre" :public="this.public" <offreEmploi v-for="offre in offres" @supprimer="supprimer" @refresh="refresh" :key="offre.id" :offre="offre" :canModifier="this.canModifier" :canValider="this.canValider" :canSupprimer="this.canSupprimer"></offreEmploi> :canSupprimer="this.canSupprimer" :canVoirCandidature="this.canVoirCandidature"></offreEmploi> </div> <a v-if="!this.public && this.canModifier" class=" btn btn-primary" :href="ajoutUrl" @click.prevent="ajout">Ajouter une nouvelle offre</a> <div v-if="!extended"> <a v-if="this.canModifier" class=" btn btn-primary" :href="ajoutUrl" @click.prevent="ajout">Ajouter une nouvelle offre</a> </div> <!--On affiche une synthèse de la liste des offres--> <div v-if="extended"> <offreEmploi v-for="offre in offres" :key="offre.id" :offre="offre" :canPostuler="this.canPostuler" :extended="extended" :public="this.public" :utilisateur="this.utilisateur" :intervenant="this.intervenant"></offreEmploi> <offreEmploi v-for="offre in offres" :key="offre.id" :offre="offre" :canPostuler="this.canPostuler" :canVoirCandidature="this.canVoirCandidature" :canValiderCandidature="this.canValiderCandidature" :extended="extended" :utilisateur="this.utilisateur" :intervenant="this.intervenant"></offreEmploi> </div> <br/> </template> <script> Loading @@ -22,13 +33,15 @@ export default { offreEmploi }, props: { public: {type: Boolean, required: true}, id: {type: Number, required: false}, utilisateur: {required: false}, intervenant: {required: false}, canModifier: {type: Boolean, required: false}, canPostuler: {type: Boolean, required: false}, canValider: {type: Boolean, required: false}, canVoirCandidature: {type: Boolean, required: false}, canValiderCandidature: {type: Boolean, required: false}, canSupprimer: {type: Boolean, required: false}, Loading
front/Mission/OffreEmploi.vue +49 −37 Original line number Diff line number Diff line <template> <div class="col" v-if="isPublic && !this.extended"> <div class="col" v-if="!this.extended"> <div class="card h-100"> <div class="card-header"> <h4> {{ offre.titre }}</h4> <span class="badge rounded-pill bg-info">{{ offre.nombreHeures }} heure(s)</span> <span v-if="nbPostesRestants > 0" class="badge rounded-pill bg-success">{{ nbPostesRestants }} poste(s) restant(s)</span> <span v-if="nbPostesRestants <= 0" class="badge rounded-pill bg-danger">Tous les postes sont pourvus</span> <span v-if="offre.validation && !this.public" class="badge rounded-pill bg-success">Valider le <u-date <span v-if="offre.validation" class="badge rounded-pill bg-success">Valider le <u-date :value="offre.validation.histoCreation"/> par {{ offre.validation.histoCreateur.displayName }}</span> <span v-if="!offre.validation && !this.public" class="badge rounded-pill bg-warning"> En attente de validation par la DRH</span> <span v-if="!offre.validation" class="badge rounded-pill bg-warning"> En attente de validation par la DRH</span> </div> <div class="card-body"> Loading @@ -31,19 +31,19 @@ </div> <div class="card-footer"> <div class="d-grid gap-2 d-md-flex justify-content-md-end"> <a v-if="offre.validation && offre.canValide && !this.public" <a v-if="offre.validation && offre.canValide" :href="devaliderUrl" class="btn btn-danger" @click.prevent="devalider">Devalider</a> <a v-if="!offre.validation && offre.canValide && !this.public" <a v-if="!offre.validation && offre.canValide" :href="validerUrl" class="btn btn-success" @click.prevent="valider">Valider</a> <a v-if="offre.canSaisie && !this.public" <a v-if="offre.canModifier" :href="saisirUrl" class="btn btn-primary" @click.prevent="saisir">Modifier</a> <a v-if="offre.canSupprime && !this.public" <a v-if="offre.canSupprime" :href="supprimerUrl" class="btn btn-danger" data-title="Suppression de l'offre" Loading @@ -52,10 +52,7 @@ <a :href="consulterUrl" class="btn btn-primary" >Plus d'information</a> <a v-if="this.public" :href="consulterUrl" class="btn btn-primary" >Plus d'information</a> </div> </div> </div> Loading @@ -68,13 +65,13 @@ postuler. </div> </div> <div v-if="!offre.canPostuler" class="alert alert-primary d-flex align-items-center" role="alert"> <div v-if="!offre.canPostuler && this.utilisateur" class="alert alert-primary d-flex align-items-center" role="alert"> <i class="fa-solid fa-circle-xmark"></i> <div class="ms-2"> Vous n'avez pas les droits pour postuler à cette offre, merci de contacter votre administration de rattachement. </div> </div> <div v-if="isCandidat" class="alert alert-primary d-flex align-items-center" role="alert"> <div v-if="isCandidat && this.utilisateur" class="alert alert-primary d-flex align-items-center" role="alert"> <i class="fa-solid fa-circle-xmark"></i> <div class="ms-2"> Vous avez déjà postulé à cette offre. Loading Loading @@ -108,23 +105,46 @@ {{ offre.description }} <br/><br/> <div v-if="this.canVoirCandidature"> <h5><strong>Liste des candidats :</strong></h5> <h2>Candidats en cours</h2> <table class="table table-bordered "> <thead> <tr> <th>Intervenant</th> <th>Composante</th> <th>Etat</th> <th v-if="canValiderCandidature">Action</th> </tr> </thead> <tbody> <tr v-if="offre.candidatures.length == 0"> <td v-if="canValiderCandidature" colspan="4" style="text-align:center;">Aucune candidature</td> <td v-if="!canValiderCandidature" colspan="3" style="text-align:center;">Aucune candidature</td> </tr> <tr v-for="candidature in offre.candidatures"> <td><a :href="'/intervenant/code:' + candidature.intervenant.code + '/voir'"> {{ candidature.intervenant.prenom+' '+candidature.intervenant.nomUsuel }}</a></td> <td>{{ candidature.intervenant.structure.libelleLong }}</td> <th> <span v-if="candidature.intervenant.validation" class="badge rounded-pill bg-success">Valider le <u-date :value="candidature.intervenant.validation.histoCreation"/> par {{ candidature.intervenant.validation.histoCreateur.displayName }}</span> <span v-if="!candidature.intervenant.validation" class="badge rounded-pill bg-warning">En attente de validation</span> </th> <td v-if="this.canValiderCandidature"> <a :href="'/intervenant/code:' + candidature.intervenant.code + '/voir'" v-if="!candidature.intervenant.validation">Valider </a> </td> </tr> </tbody> <div> <ul> <li v-for="candidature in offre.candidatures"> {{ candidature.intervenant.prenom+' '+candidature.intervenant.nomUsuel }} <a :href="'/intervenant/code:' + candidature.intervenant.code + '/voir'">Voir</a> </li> </ul> </table> </div> <div class="mt-5"> <a class="btn btn-primary" href="/offre-emploi/public">Retour aux offres</a> <a :class="isDisabled" :href="postulerUrl" data-bs-toggle="tooltip" data-bs-placement="top" <a class="btn btn-primary" href="/offre-emploi">Retour aux offres</a> <a :class="isDisabled" :href="'/offre-emploi/postuler/' + offre.id" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-original-title="Vous devez être connecté pour postuler">Postuler</a> Loading @@ -140,13 +160,15 @@ export default { name: "OffreEmploi.vue", props: { offre: {required: true}, public: {type: Boolean, required: false}, utilisateur: {required: false}, intervenant: {required: false}, extended: {type: Boolean, required: false}, canModifier: {type: Boolean, required: false}, canPostuler: {type: Boolean, required: false}, canValider: {type: Boolean, required: false}, canSupprimer: {type: Boolean, required: false}, canVoirCandidature: {type: Boolean, required: false}, canValiderCandidature: {type: Boolean, required: false}, }, data() { Loading @@ -156,22 +178,12 @@ export default { supprimerUrl: unicaenVue.url("offre-emploi/supprimer/:offre", {offre: this.offre.id}), validerUrl: unicaenVue.url('offre-emploi/valider/:offre', {offre: this.offre.id}), devaliderUrl: unicaenVue.url('offre-emploi/devalider/:offre', {offre: this.offre.id}), consulterUrl: unicaenVue.url('offre-emploi/public/:offre', {offre: this.offre.id}), postulerUrl: unicaenVue.url('offre-emploi/postuler/:offre', {offre: this.offre.id}) consulterUrl: unicaenVue.url('offre-emploi/detail/:offre', {offre: this.offre.id}), }; }, computed: { isPublic: function () { if (this.public === false) { return true; } else if (this.public === true && this.offre.validation != null) { return true; } else { return false; } }, isDisabled: function () { if (!this.offre.canPostuler || this.offre.candidats.indexOf(this.intervenant.id) !== -1) { if (!this.offre.canPostuler || this.offre.candidats.indexOf(this.intervenant.id) == -1) { return 'btn btn-primary disabled'; } return 'btn btn-primary'; Loading
module/Application/src/Entity/Db/Intervenant.php +3 −3 Original line number Diff line number Diff line Loading @@ -364,7 +364,7 @@ class Intervenant implements HistoriqueAwareInterface, ResourceInterface, Import public function axiosDefinition(): array { return ['nomUsuel', 'prenom', 'emailPro', 'statut', 'code']; return ['id', 'nomUsuel', 'prenom', 'emailPro', 'statut', 'code', 'structure']; } Loading