Algorithme de Matching - Dema1n
Documentation technique du système de matching jeune/bénévole (algo classique par scoring). Pour le matching via microservice (nouvel algo bêta, matching instantané), voir matching-instantane.md.
1. Filtres de disqualification (rating = -99)
Ces critères excluent immédiatement un bénévole du matching :
| Critère |
Condition |
| Admin associé différent |
Jeune ou bénévole suivi par un autre admin (sauf superadmin) |
| Jeune PNP + Mentor VIP |
Programme PNP incompatible avec badge vip |
| Jeune PNP + Mentor Partenaire |
Programme PNP incompatible avec badge partenaire |
| Blacklist |
Jeune ou bénévole en état Blacklist |
| Sandbox différente |
Jeune et bénévole pas dans la même sandbox |
| Non Autonome |
Jeune ou bénévole avec state ≠ Autonome |
| Multibinome autre admin |
Mentor MATCHE multibinome déjà suivi par autre admin |
| Mentor VIP sans admin VIP |
Admin non-VIP ne peut pas matcher un mentor VIP |
| Statut incorrect |
Status ≠ APTE ou MATCHE |
| Badge région |
Mentor avec badge region hors des régions de l'admin |
| Badge partenaire |
Mentor avec badge partenaire hors des régions de l'admin |
2. Bonus de scoring par type de jeune
2.1 LYCÉEN / COLLÉGIEN
| Critère |
Points |
| Même département |
+0.5 |
2.2 ÉTUDIANT LICENCE - Cursus CPGE
| Critère |
Points |
| Même cursus "CPGE" |
+4 |
| Même filière (ex: "Scientifique") |
+5 |
| Même secteur métier |
+1 |
| Même département |
+1 |
2.3 ÉTUDIANT LICENCE - Autres cursus
| Critère |
Points |
| Même cursus |
+2 |
| Même filière |
+2 |
| Même secteur métier |
+3 |
| Même département |
+1 |
2.4 ÉTUDIANT MASTER
| Critère |
Points |
| Même cursus |
+1 |
| Même filière |
+1 |
| Même secteur métier |
+5 |
| Même département |
+1 |
2.5 Bonus communs (tous types)
| Critère |
Points |
| Multibinome (status MATCHE) |
+0.5 |
| Passions communes |
Affiché dans le détail (pas de points) |
3. Algorithme MVLS (sandbox spécifique)
3.1 Filtre d'exclusion MVLS
| Critère |
Points |
| Préférence genre non respectée |
-99 (exclusion) |
3.2 Bonus MVLS
| Critère |
Points |
| Même domaine/filière |
+4 |
| Cursus = choix n°1 du lycéen |
+2 |
| Cursus = choix n°2 du lycéen |
+0.5 |
| Cursus = choix n°3 du lycéen |
+0.5 |
| Même département |
+1 |
| Même région |
+0.5 |
3.3 Besoins MVLS
| Besoin jeune |
Condition mentor |
Points |
RÉUSSIR (succeed) |
Besoin succeed coché |
+1 |
CANDIDATER (apply) |
Besoin apply coché |
+1 |
CANDIDATER (apply) |
Case "alternance" cochée |
+1 |
FINANCER (finance) |
Besoin finance coché |
+1 |
FINANCER (finance) |
Bourse CROUS comme source |
+1 |
DÉCOUVRIR (discover) |
Besoin discover coché |
+1 |
DÉMÉNAGER (move) |
Besoin move coché |
+1 |
4. Correspondance des champs
| Critère |
Champ Jeune |
Champ Bénévole |
| Cursus |
school_cursus |
cursusbenevole.cursus |
| Filière |
filieres (JSON array) |
cursusbenevole.filiere |
| Secteur métier |
sectors (JSON array) |
secteur_metier ou postebenevole.secteur |
| Département |
school_department |
department |
| Région |
school_region |
region |
| Besoins |
besoins (JSON) |
besoins (JSON) |
| Passions |
passions (JSON array) |
passions (JSON array) |
5. Score maximum théorique
| Type de jeune |
Calcul |
Score max |
| Lycéen/Collégien |
0.5 |
0.5 |
| Étudiant Licence CPGE |
4 + 5 + 1 + 1 + 0.5 |
11.5 |
| Étudiant Licence autre |
2 + 2 + 3 + 1 + 0.5 |
8.5 |
| Étudiant Master |
1 + 1 + 5 + 1 + 0.5 |
8.5 |
| MVLS (tous bonus) |
4 + 2 + 0.5 + 0.5 + 1 + 0.5 + 7×1 |
15.5 |
6. Flux de traitement
┌─────────────────────────────────────────────────────────────┐
│ REQUÊTE MATCHING │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ FILTRES SQL (benevole.repository.ts) │
│ • sandbox = sandbox du jeune │
│ • state = 'Autonome' │
│ • status IN ('APTE', 'MATCHE') │
│ • adminAssocieId compatible │
│ • badges VIP/partenaire (si jeune PNP) │
│ • badges région (si admin régional) │
│ • badges partenaire + région (si admin régional) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ FILTRES JS (rating.controller.ts) │
│ • Réservation active par autre admin │
│ • Nombre de binômes actifs < max │
│ • Exclusion des profils en réservation matching instantané │
│ active (15 min) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ CALCUL RATING (rating.service.ts) │
│ • Vérifications de sécurité (double check) │
│ • Calcul des points selon type de jeune │
│ • Génération du texte de détail │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ TRI ET LIMITE │
│ • Tri décroissant par rating │
│ • Retour des 50 premiers résultats │
└─────────────────────────────────────────────────────────────┘
7. Fichiers sources
| Fichier |
Rôle |
back/src/binomes/services/rating.service.ts |
Calcul du score de matching |
back/src/binomes/repositories/benevole.repository.ts |
Filtres SQL optimisés |
back/src/binomes/controllers/rating.controller.ts |
Orchestration du matching |
back/src/binomes/entities/Benevole.entity.ts |
Structure données bénévole |
back/src/binomes/entities/Jeune.entity.ts |
Structure données jeune |
Document généré le 2026-02-04