Skip to content

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