Aller au contenu principal

Analyse de données — guide technique

Ce guide décrit le tableau de bord manager legacy monté sur /company/dashboard-manager, pour les équipes techniques et support. Il établit le comportement du code local, sans confirmer le déploiement en production. Voir les guides fonctionnel et configuration.

Architecture et responsabilités​

Vérifié dans le code : contrôleurs Symfony, fragments Twig, requêtes jQuery, SQL/ORM Doctrine, session, Highcharts, DataTables et Select2. La route inspectée n’appelle pas de moteur BI externe.

Les chemins sont relatifs à smartmobility-legacy/. Les chemins du bundle commencent dans src/Company/ManagerDashboardBundle/.

ComposantResponsabilité / symboles
config/routes.yaml, Resources/config/routing.yml du bundleMontage et définition des routes.
Controller/DefaultController.phpindexAction construit onglets/hiérarchie ; les actions calculent population, jeux de données et fragments.
Services/Helper.phpUtilisateur/manager courant, options, repli de permission legacy, administration, échelles, couleurs et lexique.
Controller/PerimeterController.php::indexActionRéponse DataTables côté serveur pour la population en session ; getCollaborators applique recherche, tri et pagination.
Controller/OneToOneController.php::progressActionRecherche de l’entretien, appartenance au périmètre et catégories de progression.
Chart/TeamProficiency.phpjobMasteryRatio, averageGapLevelPerJobs, averageGapLevelPerUsers, skillsWithGapLevel, motivationRatio, representationOfJobs.
Chart/SkillsMapCampaign.phpCalculs de campagnes de cartographie, appelés par campaignAction.
Resources/views/Default/index.html.twig, Resources/views/Tabs/, Resources/views/Partials/Contrôles conditionnels, fragments, tableaux et traductions.
Resources/public/js/dashboard.jsinit, onChartElementClick, tableClickableItem, campaignClickable, oneToOne, filterResultsByJobDescription, exportAsCsv.
Resources/public/js/perimeter.jsModale DataTables côté serveur, instance détruite à la fermeture.
src/Security/FeatureSwitchVoter.php, src/Service/Configuration/FeatureSwitchService.phpÉvaluation via BaseVoter::hasModuleAccess : valeur stockée OU accès tokenizer.

Requêtes et réponses​

Vérifié dans le code : suffixes relatifs à /company/dashboard-manager. Ce sont des routes de session navigateur, sans contrat d’API publique d’intégration. Les traitements AJAX vérifient Request::isXmlHttpRequest et rejettent une requête directe ordinaire avec HTTP 400. Les exemples sont structurels, sans identifiant réel ni secret.

Méthode / suffixeTraitementEntrées / sortie
Page /DefaultController::indexActionStructure Twig, onglets, hiérarchie et contexte administrateur.
POST /team-activityteamActivityActionFormulaire level[], relation[] facultatif ; HTML, graphiques et attributs de périmètre.
POST /team-proficiencyteamProficiencyActionPopulation ; paramètres de requête jid, vw pour les fragments métier compatibles.
POST /skill-analysisskillAnalysisActionPopulation ; paramètres skill, motivation, jid, vw pour les branches de détail/graphique. q est transmis à la récupération des compétences.
POST /skills-map-campaigncampaignActionPopulation ; campaignId pour progression, campaignIdTable pour non-démarrés.
POST /1to1oneToOneActionNiveaux pour la population et les campagnes d’entretien disponibles.
GET /1to1/progress/{id}OneToOneController::progressActionID numérique d’entretien ; périmètre en session ; HTML et graphique.
POST /perimeterPerimeterController::indexActiondraw, start, length, search[value], order ; retour draw, recordsTotal, recordsFiltered, data.

Une requête d’onglet utilise X-Requested-With: XMLHttpRequest et un formulaire tel que level[]=1. Forme habituelle :

{
"html": "<fragment onglet rendu>",
"highcharts": {},
"attributes": {"perimeterSize": "<résumé du périmètre>"}
}

highcharts est conditionnel : anneau, barres, empilé, carte thermique, bulles ou autres structures. Un périmètre vide renvoie un fragment d’erreur et les attributs, sans graphiques normaux. Les détails utilisent des clés propres, comme tableId, userProgression ou userNotStarted ; aucun schéma unique ne couvre toutes les réponses.

Le navigateur conserve l’onglet actif dans le fragment d’URL. Changement d’onglet et application des filtres déclenchent un POST. Le choix métier envoie jid/vw et remplace le panneau associé. Le choix de campagne d’entretien déclenche le GET de détail. Le CSV est généré localement avec Blob, BOM UTF-8 et séparateurs point-virgule à partir des lignes filtrées DataTables, sans tâche d’export en arrière-plan.

Population et cycle de session​

DefaultController::tree, iterate, extractLevel et getManagerIds construisent et sélectionnent les IDs de fiches manager. Le niveau 1 inclut aussi le niveau 0 dans extractLevel. Pour un manager non racine restreint sans all_collaborators, cette méthode appelle applyVisibilityRules et VisibilityFilter.

setHierarchicalUsers recherche les collaborateurs actifs reliés au manager par les relations sélectionnées, sous contrôle de dashboard_filter_user_relation. Les traitements activité, maîtrise, compétences et campagnes de cartographie l’appellent. Leurs requêtes peuvent combiner appartenance aux fiches manager OU aux utilisateurs liés. Cela ne prouve pas que tous les détails appliquent des règles de visibilité identiques.

getPerimeterSize exclut les comptes désactivés et l’utilisateur courant, compte les collaborateurs distincts et stocke perimeter = {managerIds, hierarchicalUsers, total} en session. setFilters mémorise les clés dans filters. La modale lit ce périmètre sans accepter une population indépendante.

cacheTree conserve treeStructure pour les niveaux ordinaires ou l’entreprise entière, avec identité utilisateur et expiration time() + 600 ; isCacheExpired vérifie identité et date. Ce cache concerne la hiérarchie, pas les jeux de données BI ni le rafraîchissement des graphiques.

Différences vérifiées : oneToOneAction lit les niveaux sans appeler setHierarchicalUsers ; une sélection de relations seule peut passer le contrôle générique de présence puis aboutir à une population vide. Dashboard.campaignClickable ne sérialise que les niveaux pour les détails, sans relations. Ne garantissez pas l’égalité des populations vue d’ensemble/détail. Ouvrez les détails dépendant de la session après chargement de la population voulue.

Données et indicateurs​

Sources : User, School, Customer, Setting, métiers et niveaux/attendus de compétences, relations hiérarchiques, connexions, entretiens et progression d’évaluation. Le parcours lit ces données et mémorise un contexte transitoire ; aucun modèle persistant de rapport propre au tableau de bord n’est établi.

  • getProfileCompletionLevel et teamActivityAction produisent tranches et agrégat de complétude.
  • getLoginStats(managerIds, nbOfWeeks = 4) regroupe les connexions par utilisateur/semaine ; teamActivityAction lui transmet 6, soit six semaines pour cet onglet. La série hebdomadaire augmente par ligne utilisateur/semaine ; logins cumule les événements. collaborators compte les lignes renvoyées, sans garantir un total d’utilisateurs distincts sur toute la période.
  • TeamProficiency compare attendus métier et compétences détenues. La motivation est distincte ; teamProficiencyAction transmet une valeur fixe 4 à motivationRatio, tandis que l’échelle de compétences vient ailleurs des paramètres client.
  • TeamProficiency::THRESHOLD_PERCENTAGE_FOR_GROUPED_JOBS vaut 2 ; showJobRepresentations regroupe les pourcentages inférieurs ou égaux à ce seuil. Le navigateur peut détailler les groupes sans modifier les affectations.
  • campaignAction appelle SkillsMapCampaign ; OneToOneController::progressAction contrôle les participants contre les IDs manager ou collaborateurs liés en session et calcule les étapes d’entretien. Ces deux flux de campagnes sont distincts.

Aucun engagement de rafraîchissement, garantie d’historisation ou dénominateur commun n’a été vérifié. La branche de compétences non maîtrisées commentée dans teamProficiencyAction n’est pas une fonctionnalité établie.

Configuration et autorisation​

Helper::hasAccess exige toutes les options demandées ; hasAccessToAny en exige une. indexAction refuse l’entrée si aucun onglet n’est activé et si isManagerDashboardActive est faux, mais ajoute seulement les onglets accordés individuellement. Le repli de permission peut donc autoriser la structure sans créer d’onglet visible.

Les traitements d’onglet acceptent généralement leur option ou le repli legacy. Le détail d’entretien exige directement dashboard_team_1to1. Le périmètre possède une condition composée incluant isAdmin ; ne réduisez pas ces contrôles à une règle unique. Helper::isAdmin prend en compte fiche racine, visibilité et all_managers_filter. Voir le guide de configuration.

FeatureSwitchService::isSwitchActive accepte valeur stockée 1 ou accès tokenizer. Cela prouve le mécanisme, pas les valeurs effectives du client. Aucun remplacement par nextgen ni contrat de migration indépendant n’est vérifié.

Erreurs, observabilité et exécution​

ConditionComportement / conséquence support
Requête non AJAX vers un traitementHTTP 400.
Niveaux et relations absentsHTTP 400 via hasFiltersApplied dans les onglets principaux.
Contrôle d’accès refuséHTTP 403 ou exception d’accès refusé selon traitement.
Entretien introuvableException not found dans progressAction.
Population videFragment Twig d’erreur et décompte dans le JSON, sans graphiques normaux.
Réponse lenteMessage supplémentaire après 15 secondes ; ni délai maximal ni intervalle de polling.
Échec d’un détailPlusieurs callbacks d’erreur sont vides : retour visuel parfois limité. Inspectez statut et session avec les outils support autorisés.

Dépendances : services Symfony, base relationnelle, Doctrine, sessions, traductions/lexique et scripts du modèle Twig. Aucun worker analytique planifié, appel aihub ou compte BI externe n’est établi par cette route. Aucune requête de production, donnée personnelle ou authentification n’a été collectée pour ce guide.

Confidentialité, extension et coexistence​

Les réponses peuvent contenir noms, adresses électroniques, liens de profil, compétences et avancement. Le CSV hérite des lignes chargées/filtrées ; les règles d’accès aux données s’y appliquent. Un filtre navigateur n’est pas une frontière de sécurité. Toute extension doit conserver les contrôles serveur d’accès et de population.

Ajouter un onglet nécessite option, indexAction/getEndpointForTab, route, réponse contrôleur, Twig et initialisation graphique. Ajoutez les indicateurs dans les requêtes/classes graphiques pertinentes avec unité et population explicites. Ne considérez pas une branche commentée comme un contrat d’extension supporté.

Les recherches ciblées de route et de clés dans nextgen-front, nextgen-back et aihub n’établissent ni remplacement refondu, proxy ni dépendance IA. Le code local ne prouve pas le routage en production ni l’absence d’autres produits analytiques. Superset/Sisense et le Centre d’import/export sont distincts.

Preuves et limites​

Vérifié dans le code : chemins et symboles inspectés le 22 octobre 2026. Resources/config/routing.yml établit routes/méthodes ; contrôleurs et helper établissent population/session/accès ; classes graphiques et JavaScript établissent calculs et interactions. Aucune correspondance avec une version déployée n’a été établie.

Documenté dans Confluence : FAQ matricielle, v1, 24 septembre 2026, pour l’intention à la maille équipe. L’entrée KBCT 2136702980 est le dossier FAQ. Les pages PS méthodologie (2104033292, v7, 30 décembre 2025) et onboarding (2104983553, v9, 18 février 2026) ne contiennent pas de contrat technique propre à la route. La page BI générale (988512264, v2, 19 mars 2024) a renvoyé un contenu à macros avec conversion incomplète : aucun comportement n’en a été déduit.

Non vérifié : version déployée, activation client, comportement complet des services externes, réponses réelles, calculs de bout en bout et cohérence de toutes les populations. Le guide fonctionnel présente les vérifications authentifiées en français et anglais : population, complétion, sélection graphique, compétences/campagnes vides et navigation collaborateur (Observé dans l’application). Elles ne prouvent pas tous les contrats de requête ou calculs. Cette page technique ne contient aucune capture d’application.

Sources du guide fonctionnel​

Ces références d’implémentation et de produit étayent le guide fonctionnel. Le code local n’établit pas la révision ou les options déployées. Les observations dans l’application restent distinctes du code et des sources documentaires.

Vérifié dans le code : smartmobility-legacy/src/Company/ManagerDashboardBundle/Controller/{DefaultController,PerimeterController,OneToOneController}.php, Services/Helper.php, Resources/views/Default/index.html.twig, Resources/views/Tabs/, Resources/public/js/{dashboard,perimeter}.js et Chart/TeamProficiency.php. Les contrats et symboles sont détaillés dans le guide technique.

Documenté dans Confluence : FAQ matricielle citée ci-dessus, sous KBCT → Dashboard Manager. L’entrée FAQ KBCT fournie est un dossier. Les pages PS « 1. Delivery Philosophy & Project Methodology » (v7, 30 décembre 2025) et « 2. Onboarding/learning and partner certification » (v9, 18 février 2026) ont été consultées mais ne définissent aucun contrat de configuration propre au tableau de bord. Les sources BI/Sisense concernent une intégration distincte.

Dernière mise à jour : 3 novembre 2026