Skip to content

Mapping des champs entre les entités DEMA1N et les messages RabbitMQ MVLS

Version : 1.0
Dernière mise à jour : 12/12/2025

Vue d'ensemble

Ce document présente le mapping détaillé entre les champs des entités DEMA1N (Jeune, Bénévole, Binôme) et les champs envoyés dans les messages RabbitMQ MVLS.

Les messages RabbitMQ sont envoyés uniquement pour les utilisateurs dont le sandbox est égal à 'MVLS'.


1. Mapping Jeune → Message RabbitMQ MVLS

Structure du message

Type de message : USER_CREATED ou USER_UPDATED
Routing key : user___mvls
Exchange : dema1n

Mapping détaillé

1.1 Champs de niveau racine (body)

Champ RabbitMQ Source dans DEMA1N Type Notes
charte Jeune.charteJeune boolean \| null Acceptation de la charte jeune
notification User.newsletter boolean \| null Acceptation de la newsletter
newEmail - string \| null Optionnel - Nouvel email si différent de user.userJwt.username. Si présent et différent de username, l'email de l'utilisateur sera mis à jour dans DEMA1N avec le préfixe mvls_ (ex: mvls_nouvel.email@example.com). Utilisé uniquement dans les messages USER_UPDATED et USER_CREATED reçus depuis la plateforme MVLS.

1.2 Champs utilisateur (body.user)

Champ RabbitMQ Source dans DEMA1N Type Notes
gender User.gender string \| null Genre de l'utilisateur
birthdate User.birthday Date \| string \| null Date de naissance (ISO 8601)
firstname User.firstName string \| null Prénom
lastname User.lastName string \| null Nom
phoneNumber Jeune.phone string \| null Numéro de téléphone
roles Constante string[] Toujours ['lyceen'] pour un jeune MVLS
userJwt.username User.email string Email sans préfixe mvls_ (préfixe retiré automatiquement)
userJwt.ssoId User.ssoId string \| null Identifiant SSO
userJwt.activationToken User.activationToken string \| null Token d'activation

1.3 Champs MVLS Lycéen (body.user.mvlsLyceens[0])

Champ RabbitMQ Source dans DEMA1N Type Notes
createdAt Jeune.creationDate Date \| string Date de création du jeune
mentor_sexe Jeune.externalInfos.mentor_sexe string \| null Préférence de genre du mentor
etudesSup Jeune.externalInfos.etudesSup string \| null Réponse à "Souhaitez-vous faire des études supérieures ?" ('totaly', 'kinda', 'notreally', 'no')
travailEfficace Jeune.externalInfos.travailEfficace string \| null Réponse à "Travaillez-vous efficacement ?" ('totaly', 'kinda', 'notreally', 'no')
preparationSup Jeune.externalInfos.preparationSup string \| null Réponse à "Vous sentez-vous préparé pour les études supérieures ?" ('yes', 'kinda', 'no')
nomClasse Jeune.schoolClass string \| null Nom de la classe (ex: "Terminale S")
domaines Jeune.externalInfos.domaines string[] \| null Domaines d'intérêt
domainesAutre Jeune.externalInfos.domainesAutre string \| null Autre domaine (si "Autre" sélectionné)
formations Jeune.externalInfos.formations string[] \| null Formations souhaitées
formationsAutre Jeune.externalInfos.formationsAutre string \| null Autre formation (si "Autre" sélectionné)
communication Jeune.externalInfos.communication string[] \| null Préférences de communication
legalRepresentativeEmail Jeune.legalRepresentativeMail string \| null Email du représentant légal
legalRepresentativePhone Jeune.legalRepresentativePhone string \| null Téléphone du représentant légal
streetNumber Jeune.streetNumber string \| null Numéro de rue
street Jeune.streetName string \| null Nom de la rue
zipcode Jeune.cityCode string \| null Code postal
city Jeune.cityName string \| null Ville
voeux_formation Jeune.precision string \| null Vœux de formation (champ texte libre)
besoins Jeune.besoins string[] \| null Besoins (extrait des slugs : besoins.map(b => b.slug))
statut Jeune.status string \| null Statut du jeune
state Jeune.state string \| null État du jeune
dateUpdateStatut Jeune.statusUpdateDate Date \| string \| null Date de dernière mise à jour du statut
dateUpdateState Jeune.stateUpdateDate Date \| string \| null Date de dernière mise à jour de l'état

1.4 Champs Parcours Lycéen (body.user.parcoursLyceens[0])

Champ RabbitMQ Source dans DEMA1N Type Notes
boostAlternanceApprentissage Jeune.externalInfos.alternance string \| null Intérêt pour l'alternance
filiere Jeune.filieres[0] string \| null Première filière du tableau filieres
isBoursierSecondaire Jeune.boursier string \| null 'oui' si boursier === 'OUI', sinon null
createdAt Jeune.creationDate Date \| string Date de création du jeune
etablissement.departmentCode Jeune.schoolDepartment string \| null Code département converti depuis le nom (via getDepartmentCodeByName())
etablissement.nom Jeune.schoolName string \| null Nom de l'établissement

2. Mapping Bénévole → Message RabbitMQ MVLS

Structure du message

Type de message : USER_CREATED ou USER_UPDATED
Routing key : user___mvls
Exchange : dema1n

Mapping détaillé

2.1 Champs de niveau racine (body)

Champ RabbitMQ Source dans DEMA1N Type Notes
charte Benevole.charteBenevole boolean \| null Acceptation de la charte bénévole
notification User.newsletter boolean \| null Acceptation de la newsletter
newEmail - string \| null Optionnel - Nouvel email si différent de user.userJwt.username. Si présent et différent de username, l'email de l'utilisateur sera mis à jour dans DEMA1N avec le préfixe mvls_ (ex: mvls_nouvel.email@example.com). Utilisé uniquement dans les messages USER_UPDATED et USER_CREATED reçus depuis la plateforme MVLS.

2.2 Champs utilisateur (body.user)

Champ RabbitMQ Source dans DEMA1N Type Notes
gender User.gender string \| null Genre de l'utilisateur
birthdate User.birthday Date \| string \| null Date de naissance (ISO 8601)
firstname User.firstName string \| null Prénom
lastname User.lastName string \| null Nom
phoneNumber Benevole.phone string \| null Numéro de téléphone
zipcode - null Non disponible dans l'entité Benevole
roles Constante string[] Toujours ['eclaireur'] pour un bénévole MVLS
userJwt.username User.email string Email sans préfixe mvls_ (préfixe retiré automatiquement)
userJwt.ssoId User.ssoId string \| null Identifiant SSO
userJwt.activationToken User.activationToken string \| null Token d'activation

2.3 Champs MVLS Éclaireur (body.user.mvlsEclaireurs[0])

Champ RabbitMQ Source dans DEMA1N Type Notes
createdAt Benevole.creationDate Date \| string Date de création du bénévole
formations CursusBenevole.cursus ou Benevole.externalInfos.cursus string[] \| null Formations (priorité à cursus[0].cursus si disponible, sinon externalInfos.cursus). Si cursus est une string, elle est splitée par ', '
formationsAutre CursusBenevole.cursusAutre ou Benevole.externalInfos.cursusAutre string \| null Autre formation (priorité à cursus[0].cursusAutre)
domaines CursusBenevole.filiere ou Benevole.externalInfos.filiere string \| string[] \| null Domaines (priorité à cursus[0].filiere)
domainesAutre CursusBenevole.filiereAutre ou Benevole.externalInfos.filiereAutre string \| null Autre domaine (priorité à cursus[0].filiereAutre)
casierJudiciaire Benevole.majorWithNoCriminalRecord boolean \| null Casier judiciaire vierge
precision Benevole.precision string \| null Précisions
besoins Benevole.besoins string[] \| null Besoins (extrait des slugs : besoins.map(b => b.slug))
alternance Benevole.externalInfos.alternance boolean \| null Intérêt pour l'alternance
annee CursusBenevole.annee ou Benevole.externalInfos.annee string \| null Année (converti en string, priorité à cursus[0].annee)
etablissement.nom CursusBenevole.etablissement string \| null Nom de l'établissement (depuis cursus[0].etablissement)
etablissement.nomAutre - null Toujours null
statut Benevole.status string \| null Statut du bénévole
state Benevole.state string \| null État du bénévole
dateUpdateStatut Benevole.statusUpdateDate Date \| string \| null Date de dernière mise à jour du statut
dateUpdateState Benevole.stateUpdateDate Date \| string \| null Date de dernière mise à jour de l'état

Note importante : Les champs formations, formationsAutre, domaines, domainesAutre, annee et etablissement utilisent en priorité les données de la relation CursusBenevole (via benevole.cursus[0]) si disponible, sinon ils utilisent externalInfos comme fallback.

2.4 Champs Parcours Éclaireur (body.user.parcoursEclaireurs[0])

Champ RabbitMQ Source dans DEMA1N Type Notes
createdAt Benevole.creationDate Date \| string Date de création du bénévole
annee CursusBenevole.annee ou Benevole.externalInfos.annee string \| null Année (converti en string, priorité à cursus[0].annee)
sourceOfFinanceStudies Benevole.externalInfos.sourceOfFinanceStudies string \| null Source de financement des études. Format attendu : {"valeur1","valeur2"}. Si la valeur n'est pas déjà au format {"valeur"}, elle est convertie automatiquement
formation CursusBenevole.diplome string \| null Formation (depuis cursus[0].diplome)

3. Mapping Binôme → Message RabbitMQ MVLS

Structure du message

Type de message : BINOME_CREATED ou BINOME_UPDATED
Routing key : user___mvls
Exchange : dema1n

Mapping détaillé

3.1 Champs du binôme (body.binome)

Champ RabbitMQ Source dans DEMA1N Type Notes
binome_id Binome.id string OBLIGATOIRE - Identifiant du binôme (converti en string)
status Binome.status string \| null Statut du binôme
state Binome.state string \| null OBLIGATOIRE - État du binôme
creationDate Binome.creationDate Date \| string \| null Date de création du binôme (ISO 8601)
buildDate Binome.buildDate Date \| string \| null Date de construction du binôme (ISO 8601)
statusUpdateDate Binome.statusUpdateDate Date \| string \| null Date de dernière mise à jour du statut (ISO 8601)

3.2 Champs du jeune dans le binôme (body.binome.jeune)

Champ RabbitMQ Source dans DEMA1N Type Notes
id Jeune.id string Identifiant du jeune
email User.email (via Jeune.user.email) string \| null Email du jeune sans préfixe mvls_ (préfixe retiré automatiquement)
status Jeune.status string \| null Statut du jeune
state Jeune.state string \| null État du jeune
creationDate Jeune.creationDate Date \| string \| null Date de création du jeune (ISO 8601)
statusUpdateDate Jeune.statusUpdateDate Date \| string \| null Date de dernière mise à jour du statut (ISO 8601)
stateUpdateDate Jeune.stateUpdateDate Date \| string \| null Date de dernière mise à jour de l'état (ISO 8601)

Relations nécessaires : binome.jeune et binome.jeune.user doivent être chargées.

3.3 Champs du bénévole dans le binôme (body.binome.benevole)

Champ RabbitMQ Source dans DEMA1N Type Notes
id Benevole.id string Identifiant du bénévole
email User.email (via Benevole.user.email) string \| null Email du bénévole sans préfixe mvls_ (préfixe retiré automatiquement)
status Benevole.status string \| null Statut du bénévole
state Benevole.state string \| null État du bénévole
creationDate Benevole.creationDate Date \| string \| null Date de création du bénévole (ISO 8601)
statusUpdateDate Benevole.statusUpdateDate Date \| string \| null Date de dernière mise à jour du statut (ISO 8601)
stateUpdateDate Benevole.stateUpdateDate Date \| string \| null Date de dernière mise à jour de l'état (ISO 8601)

Relations nécessaires : binome.benevole et binome.benevole.user doivent être chargées.


4. Notes importantes

4.1 Préfixe mvls_ sur les emails

Les emails MVLS peuvent avoir un préfixe mvls_ dans DEMA1N (ex: mvls_jean.dupont@example.com). Ce préfixe est automatiquement retiré avant l'envoi à RabbitMQ pour garantir la compatibilité avec la plateforme MVLS.

Exemple : - Email dans DEMA1N : mvls_jean.dupont@example.com - Email dans RabbitMQ : jean.dupont@example.com

4.2 Relations nécessaires

Pour publier un message RabbitMQ, certaines relations doivent être chargées :

Pour un jeune MVLS :

  • jeune.user (pour accéder à User.email, User.firstName, User.lastName, etc.)

Pour un bénévole MVLS :

  • benevole.user (pour accéder à User.email, User.firstName, User.lastName, etc.)
  • benevole.cursus (pour accéder aux formations et domaines, optionnel mais recommandé)

Pour un binôme MVLS :

  • binome.jeune (obligatoire)
  • binome.jeune.user (obligatoire)
  • binome.benevole (obligatoire)
  • binome.benevole.user (obligatoire)

4.3 Format des dates

Toutes les dates sont envoyées au format ISO 8601 (string) dans les messages RabbitMQ, même si elles sont stockées comme Date dans la base de données.

Exemple : "2025-12-12T10:00:00.000Z"

4.4 Format de sourceOfFinanceStudies

Le champ sourceOfFinanceStudies dans le parcours éclaireur doit être au format {"valeur1","valeur2"}. Si la valeur n'est pas déjà dans ce format, elle est automatiquement convertie lors de l'envoi.

Exemples : - Valeur simple : "bourse"{"bourse"} - Valeur déjà formatée : {"bourse","aide_familiale"}{"bourse","aide_familiale"}

4.5 Format de besoins

Le champ besoins est un tableau d'objets dans DEMA1N avec la structure { slug: string, subs: string[] }[]. Dans RabbitMQ, seul le slug est envoyé sous forme de tableau de strings.

Exemple : - DEMA1N : [{ slug: "orientation", subs: ["choix_metier"] }] - RabbitMQ : ["orientation"]

4.6 Priorité des sources pour les bénévoles

Pour les bénévoles MVLS, certains champs utilisent en priorité les données de la relation CursusBenevole si disponible, sinon ils utilisent externalInfos comme fallback :

  • formations : cursus[0].cursus > externalInfos.cursus
  • formationsAutre : cursus[0].cursusAutre > externalInfos.cursusAutre
  • domaines : cursus[0].filiere > externalInfos.filiere
  • domainesAutre : cursus[0].filiereAutre > externalInfos.filiereAutre
  • annee : cursus[0].annee > externalInfos.annee
  • etablissement.nom : cursus[0].etablissement uniquement

5. Exemples de messages complets

5.1 Message USER_UPDATED pour un jeune MVLS

{
  "header": {
    "model": "USER",
    "event": "UPDATED",
    "name": "USER_UPDATED",
    "date": "2025-12-12T10:00:00.000Z",
    "requestId": "abc123",
    "uniqid": "xyz789",
    "VERSION": "1.0",
    "producer": "dema1n"
  },
  "body": {
    "charte": true,
    "notification": true,
    "newEmail": null,
    "user": {
      "gender": "M",
      "birthdate": "2007-05-15T00:00:00.000Z",
      "firstname": "Jean",
      "lastname": "Dupont",
      "phoneNumber": "+33612345678",
      "roles": ["lyceen"],
      "userJwt": {
        "username": "jean.dupont@example.com",
        "ssoId": "sso-123",
        "activationToken": "token-abc"
      },
      "mvlsLyceens": [{
        "createdAt": "2025-12-01T10:00:00.000Z",
        "mentor_sexe": "M",
        "etudesSup": "totaly",
        "travailEfficace": "kinda",
        "preparationSup": "yes",
        "nomClasse": "Terminale S",
        "domaines": ["Sciences", "Technologie"],
        "domainesAutre": null,
        "formations": ["Bac+3", "Bac+5"],
        "formationsAutre": null,
        "communication": ["email", "phone"],
        "legalRepresentativeEmail": "parent@example.com",
        "legalRepresentativePhone": "+33698765432",
        "streetNumber": "10",
        "street": "Rue de la Paix",
        "zipcode": "75001",
        "city": "Paris",
        "voeux_formation": "Ingénierie",
        "besoins": ["orientation"],
        "statut": "EN_ATTENTE",
        "state": "ACTIF",
        "dateUpdateStatut": "2025-12-12T10:00:00.000Z",
        "dateUpdateState": null
      }],
      "parcoursLyceens": [{
        "createdAt": "2025-12-01T10:00:00.000Z",
        "boostAlternanceApprentissage": null,
        "filiere": "Scientifique",
        "isBoursierSecondaire": "oui",
        "etablissement": {
          "departmentCode": "75",
          "nom": "Lycée Victor Hugo"
        }
      }]
    }
  }
}

5.2 Message USER_UPDATED pour un bénévole MVLS

{
  "header": {
    "model": "USER",
    "event": "UPDATED",
    "name": "USER_UPDATED",
    "date": "2025-12-12T10:00:00.000Z",
    "requestId": "def456",
    "uniqid": "uvw012",
    "VERSION": "1.0",
    "producer": "dema1n"
  },
  "body": {
    "charte": true,
    "notification": false,
    "newEmail": null,
    "user": {
      "gender": "F",
      "birthdate": "1990-03-20T00:00:00.000Z",
      "firstname": "Marie",
      "lastname": "Martin",
      "phoneNumber": "+33611111111",
      "zipcode": null,
      "roles": ["eclaireur"],
      "userJwt": {
        "username": "marie.martin@example.com",
        "ssoId": "sso-456",
        "activationToken": "token-def"
      },
      "mvlsEclaireurs": [{
        "createdAt": "2025-11-15T14:20:00.000Z",
        "formations": ["Bac+5"],
        "formationsAutre": null,
        "domaines": "Sciences",
        "domainesAutre": null,
        "casierJudiciaire": true,
        "precision": "Ingénieure en informatique",
        "besoins": ["orientation"],
        "alternance": false,
        "annee": "2020",
        "etablissement": {
          "nom": "École Polytechnique",
          "nomAutre": null
        },
        "statut": "MATCHE",
        "state": "Autonome",
        "dateUpdateStatut": "2025-12-12T10:00:00.000Z",
        "dateUpdateState": null
      }],
      "parcoursEclaireurs": [{
        "createdAt": "2025-11-15T14:20:00.000Z",
        "annee": "2020",
        "sourceOfFinanceStudies": "{\"bourse\",\"aide_familiale\"}",
        "formation": "Ingénieur"
      }]
    }
  }
}

5.3 Message BINOME_CREATED pour un binôme MVLS

{
  "header": {
    "model": "BINOME",
    "event": "CREATED",
    "name": "BINOME_CREATED",
    "date": "2025-12-12T10:00:00.000Z",
    "requestId": "ghi789",
    "uniqid": "rst345",
    "VERSION": "1.0",
    "producer": "dema1n"
  },
  "body": {
    "binome": {
      "binome_id": "12345",
      "status": "EN_ATTENTE_JEUNE",
      "state": "Autonome",
      "creationDate": "2025-12-12T10:00:00.000Z",
      "buildDate": null,
      "statusUpdateDate": "2025-12-12T10:00:00.000Z",
      "jeune": {
        "id": "jeune-123",
        "email": "jean.dupont@example.com",
        "status": "MATCHE",
        "state": "Autonome",
        "creationDate": "2025-12-01T10:00:00.000Z",
        "statusUpdateDate": "2025-12-12T10:00:00.000Z",
        "stateUpdateDate": null
      },
      "benevole": {
        "id": "benevole-456",
        "email": "marie.martin@example.com",
        "status": "MATCHE",
        "state": "Autonome",
        "creationDate": "2025-11-15T14:20:00.000Z",
        "statusUpdateDate": "2025-12-12T10:00:00.000Z",
        "stateUpdateDate": null
      }
    }
  }
}

5.4 Message USER_UPDATED avec changement d'email (newEmail)

Exemple : Mise à jour d'un utilisateur avec changement d'email

{
  "header": {
    "model": "USER",
    "event": "UPDATED",
    "name": "USER_UPDATED",
    "date": "2025-12-12T10:00:00.000Z",
    "requestId": "jkl012",
    "uniqid": "mno345",
    "VERSION": "1.0",
    "producer": "inspire"
  },
  "body": {
    "charte": true,
    "notification": true,
    "newEmail": "nouvel.email@example.com",
    "user": {
      "gender": "M",
      "birthdate": "2007-05-15T00:00:00.000Z",
      "firstname": "Jean",
      "lastname": "Dupont",
      "phoneNumber": "+33612345678",
      "roles": ["lyceen"],
      "userJwt": {
        "username": "ancien.email@example.com",
        "ssoId": "sso-123",
        "activationToken": "token-abc"
      },
      "mvlsLyceens": [{
        "createdAt": "2025-12-01T10:00:00.000Z",
        "mentor_sexe": "M",
        "etudesSup": "totaly",
        "travailEfficace": "kinda",
        "preparationSup": "yes",
        "nomClasse": "Terminale S",
        "domaines": ["Sciences", "Technologie"],
        "formations": ["Bac+3", "Bac+5"],
        "communication": ["email", "phone"],
        "statut": "EN_ATTENTE",
        "state": "ACTIF",
        "dateUpdateStatut": "2025-12-12T10:00:00.000Z",
        "dateUpdateState": null
      }],
      "parcoursLyceens": [{
        "createdAt": "2025-12-01T10:00:00.000Z",
        "filiere": "Scientifique",
        "isBoursierSecondaire": "oui",
        "etablissement": {
          "departmentCode": "75",
          "nom": "Lycée Victor Hugo"
        }
      }]
    }
  }
}

Comportement : - L'utilisateur est recherché par son ancien email : mvls_ancien.email@example.com - Si newEmail est présent et différent de username, l'email de l'utilisateur sera mis à jour avec : mvls_nouvel.email@example.com - Le préfixe mvls_ est automatiquement ajouté par DEMA1N lors de la mise à jour


6. Références


Version du document : 1.0
Dernière mise à jour : 12/12/2025