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.cursusformationsAutre:cursus[0].cursusAutre>externalInfos.cursusAutredomaines:cursus[0].filiere>externalInfos.filieredomainesAutre:cursus[0].filiereAutre>externalInfos.filiereAutreannee:cursus[0].annee>externalInfos.anneeetablissement.nom:cursus[0].etablissementuniquement
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
- Documentation MVLS - Intégration DEMA1N
- Documentation réception messages binômes
- Documentation envoi binômes via RabbitMQ
- Interfaces TypeScript MVLS
- Service MVLS
Version du document : 1.0
Dernière mise à jour : 12/12/2025