Aller au contenu

Recrutement

À quoi ça sert

Ce module couvre tout le cycle de recrutement : demande de personnel (ouverture de poste), publication d'une offre d'emploi, réception et suivi des candidatures dans un pipeline par étapes, planification des entretiens, puis émission d'une lettre d'offre jusqu'à sa signature par le candidat.

Prérequis

Prérequis

  • Modules sous licence : RECRUITMENT
  • Permissions : recruitment.requisition.create, recruitment.requisition.update, recruitment.requisition.delete, recruitment.requisition.submit, recruitment.requisition.read, recruitment.requisition.approve, recruitment.requisition.reject, recruitment.offer.create, recruitment.offer.update, recruitment.offer.publish, recruitment.offer.close, recruitment.offer.delete, recruitment.offer.read, recruitment.candidate.create, recruitment.application.read, recruitment.application.update, recruitment.interview.create, recruitment.interview.read, recruitment.interview.update, recruitment.interview.complete
  • Rôles : RECRUITER, HR_MANAGER, ORG_ADMIN

Comment ça marche

1. Créer une demande de personnel (requisition)

  1. Ouvrez Recrutement → Demandes de personnel (/dashboard/recruitment/requisitions).
  2. Cliquez sur Nouvelle demande : intitulé du poste, département, justification (REPLACEMENT remplacement, NEW_POSITION création de poste, GROWTH croissance), priorité (URGENT, NORMAL, FUTURE), type de contrat visé (CDI, CDD, STAGE, CONSULTANT, INTERIM), fourchette de salaire.
  3. La demande est créée en statut Brouillon (DRAFT) — son auteur peut la modifier ou la supprimer librement tant qu'elle reste à ce statut.
  4. Cliquez sur Soumettre pour l'envoyer en approbation (PENDING_APPROVAL) : ceci déclenche une instance du moteur de workflow générique sur l'entité JOB_REQUISITION (voir Workflows d'approbation).
  5. Les approbateurs successifs approuvent ou rejettent la demande. Une fois toutes les étapes validées, elle passe à APPROVED, puis peut être publiée (PUBLISHED) sous forme d'offre d'emploi.
  6. La demande se termine en FILLED (poste pourvu) ou peut être annulée (CANCELLED) à tout moment.

2. Publier une offre d'emploi

  1. Depuis une demande approuvée, ou directement sous Recrutement → Offres (/dashboard/recruitment/offers), créez une offre d'emploi : titre, description, compétences requises, langues et niveaux exigés.
  2. L'offre suit son propre cycle : DRAFT → Publier → PUBLISHED (visible publiquement pour candidature) → Clôturer → CLOSED → ARCHIVED.
  3. Un modèle d'offre réutilisable peut être sauvegardé pour accélérer la création des prochaines offres similaires.
  4. Une offre publiée génère un lien public de candidature, utilisé par les candidats externes (formulaire hors authentification, PublicJobApplicationController).

3. Suivre le pipeline de candidatures

  1. Ouvrez Recrutement → Pipeline (/dashboard/recruitment/pipeline), vue par colonnes correspondant aux étapes (PipelineStage).
  2. Chaque candidature progresse à travers les statuts : NEW → SCREENING → INTERVIEW → OFFER_SENT → HIRED, ou REJECTED à tout moment (avec possibilité de réintégration — REINSTATED dans l'historique d'activité).
  3. Glissez une candidature vers une autre étape (Déplacer), ajoutez des notes, ou notez le candidat directement sur sa fiche.
  4. Chaque action (candidature reçue, changement d'étape, offre envoyée, rejet, note ajoutée, notation) est journalisée dans l'historique d'activité de la candidature (ApplicationActivity).
  5. La source du candidat est enregistrée (DIRECT, REFERRAL, LINKEDIN, JOB_BOARD, AGENCY, INTERNAL) pour analyser l'efficacité des canaux de sourcing (tableau de bord recrutement).

4. Planifier et évaluer les entretiens

  1. Depuis une candidature, cliquez sur Planifier un entretien : type (PHONE_SCREEN, TECHNICAL, HR, FINAL), date/heure, interviewers.
  2. Les invitations sont envoyées automatiquement aux interviewers avec un fichier calendrier .ics joint (IcsGeneratorService) ; le candidat peut confirmer ou décliner sa disponibilité via un lien de RSVP public sécurisé par jeton (RsvpPublicController), sans avoir de compte Jigi.
  3. Recrutement → Calendrier (/dashboard/recruitment/calendar) donne une vue agenda de tous les entretiens planifiés, avec possibilité de renvoyer les invitations.
  4. Après l'entretien, l'interviewer soumet son retour (feedback) avec une note (STRONG_YES, YES, NEUTRAL, NO, STRONG_NO) puis l'entretien est marqué Terminé (COMPLETED) ; il peut aussi être annulé (CANCELLED) ou marqué absence (NO_SHOW).

5. Émettre et suivre une lettre d'offre

  1. Depuis une candidature au stade OFFER_SENT, générez une lettre d'offre (/dashboard/recruitment/offer-letters) à partir d'un modèle (OfferLetterTemplate), avec les conditions retenues (salaire, date de début, avantages).
  2. Si le tenant a configuré un workflow d'approbation sur l'entité OFFER_LETTER, la lettre passe par PENDING_APPROVAL avant envoi ; en cas de rejet interne elle repasse en REJECTED.
  3. Une fois approuvée, cliquez sur Envoyer : la lettre passe à SENT et un lien public sécurisé est transmis au candidat (PublicOfferLetterController), qui peut l'accepter ou la décliner sans compte Jigi, avec vérification par code envoyé par email.
  4. Statuts finaux possibles : ACCEPTED, DECLINED, ou EXPIRED si le candidat ne répond pas dans le délai imparti.

Qui peut faire quoi

Permission requise Rôles concernés
recruitment.requisition.create RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.requisition.update RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.requisition.delete RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.requisition.submit RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.requisition.read RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.requisition.approve RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.requisition.reject RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.offer.create RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.offer.update RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.offer.publish RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.offer.close RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.offer.delete RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.offer.read RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.candidate.create RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.application.read RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.application.update RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.interview.create RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.interview.read RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.interview.update RECRUITER, HR_MANAGER, ORG_ADMIN
recruitment.interview.complete RECRUITER, HR_MANAGER, ORG_ADMIN
Rôle système Portée
ORG_ADMIN Toutes les actions (permission globale)
RECRUITER Création/modification/suppression/soumission des demandes de personnel, lecture des demandes ; lecture + création + mise à jour des offres ; création de candidats, lecture/mise à jour des candidatures ; accès complet aux entretiens
Permission Donne accès à
recruitment.requisition.create / .update / .delete / .submit / .read Cycle de vie de la demande de personnel côté brouillon/soumission (le créateur d'un brouillon peut aussi le modifier/supprimer sans permission de gestion, tant qu'il reste en DRAFT)
recruitment.requisition.approve / .reject Décider d'une étape d'approbation de la demande
recruitment.offer.create / .update / .publish / .close / .delete / .read Cycle de vie de l'offre d'emploi
recruitment.candidate.create Créer une fiche candidat (dépôt de candidature)
recruitment.application.read / .update Consulter/faire progresser le pipeline de candidatures
recruitment.interview.create / .read / .update / .complete Planifier, consulter, modifier, clôturer un entretien
recruitment.offer_letter.create / .read / .send Créer, consulter, envoyer une lettre d'offre
recruitment.offer_letter.approve / .reject Valider ou rejeter une lettre d'offre en attente d'approbation interne

Détails techniques

Détails techniques

Entités principales : JobRequisition, JobOffer/JobOfferTemplate/JobOfferSkill/JobOfferLanguage, Candidate/CandidateApplication/ApplicationActivity, Interview/InterviewInterviewer/InterviewRsvp, OfferLetter/OfferLetterTemplate/OfferLetterResponseGate (packages app.jigi.hr.recruitment.*).

Endpoints clés :

  • POST/PUT/DELETE /recruitment/requisitions[/{id}], /submit, /approve, /reject (JobRequisitionController) — l'autorisation de modifier/supprimer un brouillon combine hasAuthority('recruitment.requisition.update') ou @jobRequisitionAccess.isDraftOwner(...) (le créateur du brouillon)
  • POST/PUT/DELETE /recruitment/offers[/{id}], /publish, /close (JobOfferController)
  • POST /recruitment/offers/{offerId}/apply, GET /recruitment/applications, POST /recruitment/applications/{id}/move|offer|reject (CandidatePipelineController)
  • POST/GET/PUT /recruitment/applications/{applicationId}/interviews, /recruitment/interviews/{id}/feedback|complete|cancel (InterviewController)
  • GET /recruitment/calendar, /recruitment/interviews/{id}/ics, /send-invitations (InterviewCalendarController) ; RSVP public via jeton (RsvpPublicController)
  • POST /recruitment/applications/{applicationId}/offer-letters, /{id}/send, /{id}/approve, /{id}/reject (OfferLetterController) ; réponse candidat via PublicOfferLetterController

Workflow : JOB_REQUISITION (approbation de la demande de personnel) et OFFER_LETTER (validation interne avant envoi) sont deux entités distinctes du moteur générique — voir Workflows d'approbation.

Tableau de bord : RecruitmentAnalyticsController/RecruitmentDashboardDto agrègent délai moyen de recrutement, taux de conversion par étape et répartition par source de candidat.

Cas d'erreur et FAQ

Un recruteur peut-il approuver ses propres demandes de personnel ? Non. Le moteur de workflow bloque explicitement l'auto-approbation : l'engine rejette une tentative d'approuver ou de rejeter sa propre demande.

Que se passe-t-il si un candidat ne répond pas à une lettre d'offre ? Elle passe automatiquement au statut EXPIRED une fois le délai dépassé.

Comment un candidat confirme-t-il sa présence à un entretien sans compte Jigi ? Via un lien de RSVP public sécurisé par jeton, envoyé avec l'invitation — aucune authentification Jigi n'est requise.

Peut-on rouvrir une candidature rejetée ? Oui, l'historique d'activité prévoit une action REINSTATED pour réintégrer un candidat précédemment rejeté dans le pipeline.

Quelle est la différence entre une demande de personnel et une offre d'emploi ? La demande de personnel est la validation interne du besoin (budget, poste, justification) ; l'offre d'emploi est l'annonce publiée pour recevoir des candidatures, généralement créée une fois la demande approuvée.

Voir aussi