Aller au contenu principal

Cartographie des compétences — guide technique

Cette référence s’adresse au support, à l’intégration et à l’ingénierie. Elle trace portefeuille, bibliothèque, évaluations, comparaison d’emploi et consultation manager, en les distinguant de l’édition du référentiel, des réponses d’évaluation et du rapprochement IA de libellés. Consultez le guide fonctionnel et le guide de configuration.

Les affirmations sont vérifiées dans le code, sauf indication contraire. Les sources et limites identifient les révisions locales, sans établir la version déployée.

Architecture et responsabilités​

Le nœud partagé représente des entités mappées sur les mêmes tables métier, dont userskill, sans prouver une connexion commune entre déploiements. L’URL de recherche est configurable. AIHub implémente une capacité compatible, mais le service réellement choisi par l’entreprise historique reste non vérifié.

ComposantResponsabilité et limite
Customer/ProfileBundle historiqueRendu, autoévaluation, motivation, entrée de suppression et analyse.
Main/ConfigBundle/Controller/SkillLibraryController.php historiqueBibliothèque, recherche groupée et soumission personnelle/entreprise.
SkillSearcher, SkillLibraryUrlManager, ObservatorySkillPersisterEntrées, sélection du service, classement/résolution et copies d’observatoires.
SkillQuotaService, SkillDeletionService, LockedSkillSourceServiceQuota hors emploi, retrait protégé et origines.
ProspectBundle manager historiqueProfil et section conditionnée par rôle.
UserSkillDTO, dépôt et contrôleur nextgenCRUD, entreprise courante, visibilité et filtres.
Rendu de question compétence nextgenRéponses d’évaluation, pas portefeuille ou Analyse autonome.
AIHub src/skills_libraryRecherche classée à partir de texte libre ; ne dessine pas la carte historique.

Observé : Chrome exposait les routes historiques personnelles et manager le 23 octobre 2026. Les recherches nextgen trouvaient des composants d’évaluation/configuration sans établir une page de remplacement. Une navigation moderne ne prouve pas une implémentation refondue.

Requêtes et flux​

  1. Le collaborateur ouvre skills/library/{hash} dans le contexte de routage du profil. Le contrôleur exige l’authentification et résout le customer. Un hash inconnu redirige à l’accueil ; le profil d’un tiers exige d’autres droits.
  2. Le modèle envoie text et customer en POST XHR à main_config_skill_suggestion. La variante entreprise main_config_skill_suggestionbo accepte aussi des restrictions de référentiels.
  3. SkillSearcher::buildApiInput() combine observatoires et référentiels explicites, sinon publics de l’entreprise, avec langue, limite et collection.
  4. SkillLibraryUrlManager sélectionne l’URL normale ou IA. Le mode IA peut prioriser les référentiels publics, principal d’abord, et demander la déduplication.
  5. Les identifiants sont triés par score décroissant et chargés localement. Les observatoires peuvent être copiés au catalogue cible. Les résultats hors entreprise sont exclus ; titre/référentiel dédupliquent l’affichage.
  6. Le contrôleur regroupe par groupe/type et origine puis rend le HTML.

Corps illustratif avec identifiants fictifs et valeurs de déploiement omises :

{
"search_query": "communication",
"repositories_id": [101, 202],
"language": "fr",
"results_number": 40,
"repositories_id_prio": null
}

Le corps réel contient aussi collection_name. Avec priorités IA, repositories_id_prio devient une liste ordonnée et threshold_deduplicate vaut 0.95. Le contrat consommé inclut skill_id, score, texte et métadonnées de référentiel. Le score classe les candidats, sans mesurer la maîtrise.

Cycle de vie : la recherche peut persister copies catalogue et journaux API, même sans ajout au profil. L’inspection initiale a effectué une recherche sans ajout délibéré de compétences utilisateur.

Soumission de la sélection​

Le modèle conserve identifiants et évaluations dans la page puis poste à main_config_add_skills (/addSkills dans son fichier ; vérifier les préfixes d’importation). Exemple fictif :

customer=123
data[0][skillId]=456
data[0][level]=3
data[0][motivation]=4

Les espaces de début servent à l’affichage ; ce sont des clés de formulaire, pas du JSON. Le contrôleur reconnaît aussi locked et managerLevel, sans garantie générale d’autorisation.

L’action vérifie authentification, existence du customer, même Setting/entreprise et acteur : soi-même, manager direct ou catégorie master-school. Elle exige un tableau non vide, valide le quota et ignore les liens existants. Les compétences existantes au catalogue sont attribuées par SkillImportService, persistées, puis suivies de UserSkillAddedEvent. Une branche de création existe sans avoir été exercée ; elle ne garantit pas la sauvegarde de toute proposition libre.

Le navigateur exige maîtrise et, sauf fo_no_display_motivation_add_skill, motivation. Le succès affiche un dialogue et revient au profil. Les écritures étaient non vérifiées dans l’application lors de l’examen initial. Le flush dans la boucle ne garantit pas une sauvegarde multiple atomique ; une erreur n’implique pas l’absence de changements.

Évaluations du profil et analyse​

customer_profil_updatenote et customer_profile_motivationskill correspondent à changeNoteSkillsAction() et motivationAction(). Le premier reçoit skills_id, skills_note, type tel que niveau ; le second skill, note. Ils utilisent les identifiants des liens user-skill, distincts des compétences catalogue.

Les gestionnaires mettent à jour les valeurs et renvoient le JSON actualisant contrôles et graphiques. Des branches synchronisent aussi les compétences d’expérience : une modification ne concerne pas nécessairement une seule ligne visuelle. Les contrôles de propriété diffèrent selon la branche ; l’auto-service examiné n’est pas un audit exhaustif.

Les bulles excluent le marqueur de langue du CV et exigent maîtrise et motivation positives. Valeurs réelles et positions sont distinctes ; les points coïncidents sont décalés d’un quart. Les quadrants sont séparés à 2,5, avec vert/bleu/orange/rose conformément à la légende. Les noms longs peuvent devenir (...). Ces artifices d’affichage ne modifient pas la maîtrise stockée.

analysis-tab.html.twig active la comparaison avec module_analysespider, peut masquer le sélecteur et cache la carte sans données. Comparaison et motivation utilisent des périmètres distincts. L’algorithme complet du comparateur et les bulles à cinq niveaux restent non vérifiés ; utilisez la légende sans extrapoler des seuils.

Retrait et mises à jour en aval​

La suppression en masse valide la requête, normalise les identifiants de liens et appelle SkillDeletionService pour l’utilisateur courant. Elle exclut les compétences d’emploi principal/alternatif selon configuration et marker = locked, retire les liens éligibles puis émet UserSkillDeletedEvent. Un succès ne prouve pas un retrait effectif.

UserSkillEntityListener émet UserSkillChangedEvent après persistance/retrait. DatabaseActivitySubscriber gère aussi les changements, dont évaluations ; PlatformActivitySubscriber contient les abonnements broker. Cela établit l’intégration événementielle, sans garantie de fraîcheur du matching, délai ou traitement unique. Ces chemins n’ont pas été exécutés pendant l’examen initial.

Modèle et contrats API​

DonnéeReprésentation
Compétence catalogueEntité avec traductions, groupe/type et référentiel.
Compétence collaborateurLien userskill : utilisateur, compétence, note nullable, motivation, managerNiveau, origine et verrou notamment.
Niveau attenduRelation emploi–compétence, distincte des évaluations collaborateur/manager.
Origine et protectionImport et emploi influencent rendu/filtres ; le verrou reste séparé.
Réponse de compétence d’évaluationStructure propre à l’évaluation, non interchangeable avec la ressource user-skill.

Nextgen importe V1 sous /api/v1 dans config/routes.yaml. src/Http/Api/Routing/V1/user_skill.yaml définit :

MéthodeCheminPermission
GET/api/v1/user/skill ou /api/v1/user/{userId}/skillread-user-skill
GET/api/v1/user/{userId}/skill/{skillId}read-user-skill
POST/api/v1/user/skill ou /api/v1/user/{userId}/skillcreate-user-skill
PUT / PATCH/api/v1/user/{userId}/skill/{skillId}update-user-skill
DELETE/api/v1/user/{userId}/skill/{skillId}delete-user-skill

Des variantes personnelles et /by-code/{skillCode} existent pour détail/modification/suppression. {skillId} filtre s.id, identifiant catalogue, pas le lien userskill historique. Les suppressions déclarent soft_deletable: false ; elles n’ont pas été appelées.

UserSkillDTO expose skillId ou skillCode, currentLevel, motivationLevel, lectures traduites et dates. Le sérialiseur convertit camelCase vers snake_case. Exemple de création :

{
"skill_id": 456,
"current_level": 3,
"motivation_level": 4
}

Exemple issu du code, pas une capture de succès. Le DTO valide références de la même entreprise et unicité utilisateur/compétence. currentLevel correspond à note, de 1 à l’échelle d’entreprise ; la description « 1 to 5 » est moins précise que le validateur. Motivation accepte 0–4 ; nullabilité et éligibilité de carte restent distinctes. Le listener remplit l’utilisateur courant sans identifiant fourni et résout le code alternatif.

Filtres et visibilité des listes​

UserSkillRepository::findUserSkills() limite entreprise et utilisateur, ajoute les traductions et applique la visibilité pour un tiers. Les listes V1 trient le niveau croissant et filtrent niveau, origine, titre, type et approbation.

only_approved vaut vrai par défaut et sélectionne us.source IS NULL ; faux sélectionne cv ou linkedin, pas toutes les sources. skill_source distingue emploi/profil par appartenance aux compétences de l’emploi principal, sans lire directement la chaîne source. Ces règles expliquent des divergences avec le portefeuille historique.

UserSkillController::skillOfReviewed() V2 adapte les GET pour la personne évaluée, selon routage et participation. Le front Skills/api/skills.api.ts écrit les réponses via /api/v2/user-review/{userReviewId}/answer/skill/{questionId} et sa variante avec identifiant de réponse. Ces appels ne sont pas du CRUD direct de portefeuille.

Configuration, autorisation et confidentialité​

Le guide de configuration répertorie commutateurs, échelle et quota. Restrictions UI historiques, autorisation de soumission et permissions API sont distinctes ; aucun bouton ne permet de les déduire.

Les deux générations mappent userskill. Cela établit une compatibilité de schéma à cette frontière, pas une synchronisation de déploiement ni des effets identiques. Aucune migration automatique UI ni priorité intergénération des commutateurs établie.

Maîtrise, motivation, note manager et profil importé sont des données personnelles restreintes. Utilisez des exemples fictifs et des populations autorisées. Masquez hashes, noms et portraits dans les preuves partagées. Adresses, secrets et collections de déploiement sont omis. Les journaux API conservent requêtes/réponses ; accès et conservation relèvent de la politique opérationnelle.

Dépendances, erreurs et observabilité​

L’historique exige Symfony/Doctrine, URL de recherche, référentiels et actifs JavaScript/graphiques du profil. AIHub examiné séparément prend en charge MongoDB/PostgreSQL ; query_service.py et sa documentation décrivent choix et classement. Backend réel, fournisseur et réseau restent non vérifiés. Le rattachement d’emploi nextgen utilise des lots UserSkillService et des événements de création ; il ne garantit pas des niveaux évalués.

Échec / divergenceDiagnostic
Bibliothèque indisponibleSkillLibraryUrlManager rejette l’absence d’URL ; mode et dépendances sans divulguer de secrets.
Recherche vide/incomplèteLangue, sources, limite, résolution locale et entreprise.
Transport de recherche en erreurSkillSearcher journalise les erreurs cURL et lève une exception ; le transport réussi enregistre temps et contenu dans ApiCallLog. Un résultat vide ne prouve pas la santé du service.
Ajout refusé401 authentification, 403 entreprise/acteur, 400 entrée vide/quota, 500 erreur inattendue possibles.
Sauvegarde partielleFlush dans la boucle : réconcilier les liens avant reprise, sans garantie transactionnelle globale.
Verrou UI différent du résultat APIContrôler route et service précis ; le modèle n’est pas une politique uniforme.
Compétence absente de la carteMaîtrise/motivation positives, marqueur, périmètre d’emploi et données manquantes.
Liste API différenteEntreprise/population, traductions, classification par emploi principal et approbation.
Score aval ancienÉvénements et messages concernés ; aucun délai garanti.

Aucune sonde API, injection de panne, action destructive ou test d’exécution pendant cet examen. Ces diagnostics sont fondés sur le code.

Extensions​

Conservez sélection, langue et politique des sources à la frontière de recherche ; autorisation et quota côté serveur. Une nouvelle origine nécessite une revue des champs, filtres d’approbation, verrous, éligibilité graphique et événements. Une nouvelle échelle exige une validation de tous les consommateurs, surtout des quadrants fixes historiques. Ces considérations d’ingénierie déduites ne sont pas des changements d’implémentation livrés.

Sources et limites​

Chemins relatifs aux dépôts du workspace GitHub. Révisions de sources locales uniquement.

Dépôt / révisionSources principales
smartmobility-legacy — 9ecdb0db43src/Customer/ProfileBundle/Controller/DefaultController.php, Resources/config/routing.yml, Resources/views/Default/includes/{competences-tab,competences-table,analysis-tab,analysisV2}.html.twig ; Services/SkillSearcher.php.
Même dépôt historiquesrc/Main/ConfigBundle/Controller/SkillLibraryController.php, Resources/config/routing/skillslibrary.yml, Resources/views/skillsLibrary/index_customer.html.twig ; src/Service/SkillLibraryUrlManager.php ; src/Service/Skills/{SkillQuotaService,SkillDeletionService,LockedSkillSourceService}.php.
Même dépôt historiquesrc/Company/ProspectBundle/Services/ViewSection/ProfileSection/SkillSection.php ; src/EventListener/{UserSkillEntityListener,DatabaseActivitySubscriber}.php ; src/EventSubscriber/PlatformActivitySubscriber.php ; src/Main/ConfigBundle/{Entity/Setting.php,Form/Type/SchoolsettingType.php}.
smartmobility-nextgen-back — 00beda02cconfig/routes.yaml, config/services/http.php, src/Http/Api/Routing/V1/user_skill.yaml, Routing/V2/review.yaml, Controller/V2/UserSkillController.php ; src/Domain/V1/User/DTO/UserSkillDTO.php ; src/Domain/V2/Review/Validator/DynamicSkillRangeValidator.php ; entité/dépôt/listener UserSkill ; src/Infrastructure/Service/User/UserSkillService.php.
smartmobility-nextgen-front — d14017a5src/modules/ModuleConfig/Campaigns/modules/Reviews/modules/FormRender/components/renderers/Skills/api/skills.api.ts ; src/modules/CompanySettings/BasicConfiguration/components/Performance/EvaluationSkillConfiguration.vue. Évaluation, sans preuve d’une cartographie de remplacement.
aihub — 757dd2678docs/en/skills_library/index.md, src/skills_library/services/query_service.py. Capacité examinée sans lien de routage réel établi vers cette entreprise.

Observé : 23 octobre 2026, session Chrome authentifiée de test, espaces collaborateur/manager ; captures fonctionnelles. Données personnelles masquées et zones encadrées sans recadrage de la fenêtre.

Non vérifié lors de l’examen initial : correspondance des versions, toutes les personas, sauvegardes/ajouts/retraits, cinq niveaux, enveloppes API, toutes les autorisations, effets de copie des observatoires et délais d’événements/matching. Aucun dépôt applicatif ni configuration d’exécution modifié. Les opérations de test ultérieures sont décrites ci-dessous.

Sources du guide fonctionnel​

Ces références soutiennent le guide fonctionnel sans prouver la révision déployée ou les options. Observations, code et documents restent distincts.

  • Observé : 23 octobre 2026, Chrome authentifié dans l’environnement de test ; profil, états bibliothèque, comparaison, carte et tableau manager. Fenêtres complètes, données masquées et encadrés violets.
  • Vérifié : src/Customer/ProfileBundle/Resources/views/Default/includes/{competences-tab,competences-table,analysis-tab}.html.twig, Controller/DefaultController.php, src/Main/ConfigBundle/Controller/SkillLibraryController.php, modèles bibliothèque, src/Service/Skills/{SkillQuotaService,SkillDeletionService,LockedSkillSourceService}.php historiques. Sources nextgen ci-dessus.
  • Déduit : échanges de développement proposés pour les quadrants ; pas des décisions automatiques.
  • Non vérifié lors de cette inspection : écritures, suppression, demandes de recommandation, paramètres de production, tous les rôles, cinq niveaux, fin de campagne et correspondance du déploiement. Aucune modification délibérée à cette date.

Vérification du parcours — 26 octobre 2026​

Observé : PS Testing 2026, Jim Carter. La nouvelle ligne MS Project conservait 2/4 après recharge, puis 3/4 après modification et nouvelle recharge. Seul cet ajout de test a été retiré, puis son absence vérifiée dans toute la liste ; les compétences existantes sont inchangées. Ni compétences d’emploi verrouillées ni écritures manager exercées.

Dernière mise à jour : 3 novembre 2026