Aller au contenu principal

Tests et évaluations — guide technique

Référence de maintenance du catalogue, des attributions, du lancement externe, des imports et des compétences. Les affirmations sont vérifiées dans le code historique local ; leur concordance avec le déploiement reste non vérifiée. Consultez le guide fonctionnel pour les observations et la configuration pour l’administration.

Périmètre et architecture​

L’implémentation tracée utilise Symfony, Twig, jQuery/Ajax, Doctrine, adaptateurs fournisseurs et stockage privé des rapports dans smartmobility-legacy. Les chemins sont relatifs à ce dépôt sauf mention contraire.

Le schéma représente le parcours ordinaire fournisseur. Les questionnaires internes utilisent AssessmentUser et des réponses, pas cette tentative. Les tests d’anglais par niveau ajoutent TestCenterLevel et une progression par seuil distincte.

ComposantResponsabilité
src/Company/TestBundle/Controller/InterneController.phpFiltres, détails, participants autorisés, sélecteur de personnes non attribuées et réattribution.
src/Main/ConfigBundle/Controller/TestController.phpRecherche, attribution depuis le profil, lecture/ajout/retrait de correspondances et réévaluation.
src/Repository/TestCenterRepository.phpRequêtes liées à l’entreprise, inactivité et filtres.
src/Test/MarketPlaceBundle/Controller/SkillValueController.phpAttribution, obligation et callbacks ; couvre plusieurs fournisseurs malgré son nom.
src/Customer/AccountBundle/Controller/DefaultController.php et Resources/views/Default/index.html.twigCentre personnel, disponibilité, synchronisation et téléchargement.
src/Customer/TestBundle/Controller/DefaultController.phpLancement limité au propriétaire et questionnaires internes.
src/Service/TestMarketplace/TestMarketplaceService.phpRéutilisation d’attribution, inscription différée, résultats/PDF, notifications, retrait et nouvel essai.
src/Service/TestMarketplace/TestManagerFactory.phpRésolution du gestionnaire par type.
src/Service/TestMarketplace/Managers/Comportements CT, CG, SV, SVv2, GSB.
src/Company/AccountBundle/Service/Préférences, liens catalogue et ratios.
src/EventListener/TestListener.phpSynchronisation au retour avec cookie current_test.
src/Controller/TestResult/TestResultWebhookController.phpRecherche callback Goshaba et récupération.

Modèle et cycle de vie​

EnregistrementSens et champs importants
TestPartnerIdentité catalogue du fournisseur.
TestCenterDéfinition, type, métadonnées, langue, campagne externe et correspondances.
SettingTestcenterDisponibilité entreprise/test.
TestPartnerClientPréférence entreprise/fournisseur de visibilité.
TestPartnerKeysSecrets entreprise/fournisseur ; jamais de valeurs dans les guides ou diagnostics.
TestResultAttribution/tentative : utilisateur, test, hash, ctid, ctlink, score, global, test_score, dates, obligation, visibilité, inactivité.
Testcenterskill, TestCenterLevel, liens de potentielsCorrespondances, niveaux et dimensions fournisseur.
SkillLevelScoreRatioBornes d’entreprise pour les chemins par défaut et Goshaba.

L’ORM déclare TestResult.score en texte nullable. Dans le parcours rapport, il contient un nom de fichier, pas le pourcentage suggéré par son nom. test_score, charges fournisseur et notes sont distincts. created/completed sont des timestamps entiers nullables ; invitation/résultat des datetimes nullables. Aucun enum unique attente/terminé/réussi établi.

Le résumé personnel compte les tests ordinaires activés de l’entreprise comme terminés lorsque score est non vide. La réussite d’anglais est calculée séparément. La boucle des cartes terminées exige score et exclut les tests par niveau, sans répéter le filtre de disponibilité utilisé par résumé et attente. Les anciennes cartes peuvent donc différer du compteur après désactivation ; leur disparition complète n’est pas établie.

Observé : catalogue de 87 tests pour Jim dans PS Testing. Après attribution SQL Senior, Tests ouvrait /plateforme/parametres/, avec Tests (0/1), 1 Questionnaires / 0 Complétés / 1 À faire, et une carte obligatoire lorsque le statut était actif. Le lancement revenait avec une erreur d’indisponibilité et compteurs inchangés. Tests réussis ne prouve pas une réussite numérique ordinaire.

Attribution et exécution​

  1. Le chargement manager utilise UserAllowedService, joint les résultats du test et rend une table paginée. Le sélecteur exclut les personnes déjà liées.
  2. L’attribution parcourt les couples personne/test, appelle getTestResult() et fixe l’obligation. L’email optionnel ne concerne que les nouvelles lignes dans ce point d’entrée.
  3. getTestResult() réutilise normalement le lien existant. Une nouvelle ligne reçoit utilisateur/test, date, source, hash aléatoire et visibilité courante. Cette recherche applicative ne prouve pas une contrainte d’unicité en base.
  4. Le lancement recherche identifiant d’attribution et utilisateur courant. loadTestUrl() inscrit la tentative si URL ou identifiant externe manque ; sinon une tentative sans rapport peut être synchronisée.
  5. Le lancement revient au centre pour attribution inconnue/d’un tiers, résultat déjà disponible ou lien absent. Le dernier cas notifie aussi une erreur. Un succès émet UserTestsEvent, transforme HTTP en HTTPS, pose current_test jusqu’au lendemain puis redirige.
  6. La récupération délègue au fournisseur puis flush. TestListener contrôle le propriétaire avant la synchronisation par cookie et efface le cookie ancien/terminé. Le centre appelle aussi syncPendingUserTests().
  7. getPdfReport() valide le contenu via PdfHelper::isValidPdfContent(), tente l’import/synchronisation au besoin, puis renvoie le PDF ou null. Le téléchargement annonce l’indisponibilité en cas d’échec.

Ouvrir le lancement peut créer un candidat/essai et émettre des événements. Ouvrir le centre peut synchroniser. Ce ne sont pas des consultations sans effet.

Réattribution et suppression​

reassignUserToTest() refuse si un enregistrement correspondant a score et dateResult nuls, puis délègue au fournisseur. BaseTestManager::getTestResult() crée une tentative avec test, personne, obligation, source et visibilité. Le reste dépend de l’adaptateur ; aucun comportement universel de nouvel essai.

Le retrait vérifie entreprise et conditions d’obligation, appelle la suppression fournisseur si présente puis retire le résultat local. Un succès ne prouve pas le retrait de toutes les lignes soumises : certaines peuvent être ignorées. Aucune réversibilité garantie.

Contrats HTTP​

Routes applicatives relatives, pas engagements publics d’intégration. Définitions dans config/routes.yaml et les Resources/config/routing.yml concernés. N’utilisez pas d’identifiants de production dans ces exemples.

Route et méthode déclaréeEntrée / réponse
POST /api/tests/search ; XHR exigécriterias[search/category/partner/locale/level], offset, limit ; response, pages, count. Authentification requise.
POST /api/tests/add ; condition XHRAttribution profil : user, add_test[], _token, mandatory, sendEmail, tpl optionnels. Vérifie manager, CSRF add_test_to_user, entreprise cible.
GET /api/tests/{id}/skills ; XHR exigéLien entreprise/test requis ; identifiants, compétences traduites, potentiels et effectifs DataTables.
POST /api/tests/{id}/skills/add ; condition XHRLignes imbriquées test, test[revalidate_skill] optionnel ; liens, remise à zéro et attribution possibles.
POST /api/tests/{id}/skills/delete ; XHR exigétest_skills séparés par virgules ; suppression de liens et remise à zéro.
/plateforme/parametres/ ; méthode non restreintecustomer_account_home ; peut synchroniser l’attente.
/company/test/{id} ; méthode non restreinteSans ID : catalogue ; ID numérique : détail ou introuvable.
/company/test/action/test_result_users_data ; non restreinteDataTables et test ; draw, effectifs et cellules rendues. Entreprise/test absent : introuvable.
/company/test/action/company_test_load_users ; non restreintetest_id, limit, offset ; données rendues et total. Test absent : réponse vide avec message 404, pas nécessairement statut HTTP 404.
POST /tests/marketplace/skill/emailusers[][id], users[][test_id], mandatory, sendEmail ; attributions, jetons positionnels et countUsers. Personnes vides : HTTP 404.
POST /tests/marketplace/test-result/{id}/mandatorymandatory ; batch et ids séparés par virgules pour lot. Identifiants et statut booléen ; contrôles 401/403/404/400.
/company/test/action/reassignetest ; non restreinteid de résultat ; message JSON success et nouvel id, ou error. Orthographe conforme à la route.
POST /company/test/result/delete ; condition XHRid séparés par virgules ; response JSON ; 401 sans authentification, 400 si absent/invalide.
/plateforme/tests/pass-test/{id} ; non restreinteRésultat du compte courant ; redirection fournisseur/centre. Effets d’écriture et externes.

Exemple fictif de réponse de modification d’obligation autorisée, non envoyé à l’application :

{"ids":[12345],"mandatory":true}

skill/email persiste même sans email. Les valeurs subissent la coercition booléenne PHP ; la chaîne "false" n’équivaut pas nécessairement à faux.

Les callbacks SkillValue, v2 et CodinGame sont dans le bundle marketplace. Goshaba déclare POST /goshaba sous son montage configuré ; URL complète déployée non vérifiée et omise. Il exige campaignId, externalId, résout fournisseur+campagne puis test+identifiant externe et charge le résultat. Champs absents/vides : 204 ; campagne/essai non résolu : 404 ; recherche/récupération réussie : 200. Ceci ne constitue pas un audit d’authentification webhook.

Vérification observée d’attribution et de lancement​

L’exemple utilisait Administrateur base de données (SQL) - Senior CodinGame dans PS Testing, Jim étant le compte actif et l’unique personne choisie. Obligation et email étaient décochés. La confirmation Vous avez correctement ajouté 1 collaborateur à ce test. était suivie de sa ligne avec date courante, Non Passé, réalisation vide.

L’activation d’Obligatoire renvoyait le jeton non traduit view_test.set_mandatory_success ; la case persistait après recharge et la carte disait Ce test est obligatoire. Le statut a été remis en optionnel. Aucune réponse ni note de compétence soumise.

Le lancement limité au propriétaire ouvrait un onglet puis revenait avec Ce test ne semble pas disponible. Notre équipe support va contacter l’éditeur et reviendra vers vous. Cela établit l’issue visible d’absence de lien, pas sa cause précise ni la livraison d’une notification opérationnelle. L’enregistrement est resté en attente, sans rapport terminé.

Résultats et compétences par fournisseur​

La factory construit la classe depuis TestCenter.type ; type/gestionnaire absent renvoie null. L’orchestration ignore alors les opérations non prises en charge, sans garantir de résultat.

  • SVv2TestManager::setScoreToTestSkills() résout les correspondances, calcule une note et appelle SkillImportService avec source=Test et le pourcentage si un emploi existe. Le chemin par niveau est distinct.
  • CGTestManager::supports() exige company_api_CG et company_api_CG_url non vide. assignUserToTest() envoie campagne, identité/email du candidat et email manager à CodingGameApi::assignUserToCampaign(), puis conserve id et test_url si présents. L’adaptateur envoie send_invitation_email=false et send_notification_email_on_bounce=false. Configuration absente, réponse rejetée ou champs absents peuvent laisser identifiants/lien vides. Aucune valeur secrète ni réponse réelle inspectée.
  • GSBTestManager prépare ses dimensions et conversions. Potentiels et secrets Goshaba sont distincts de la configuration par défaut.
  • CTTestManager récupère résultats/rapports avec sa propre logique de potentiels et scores.
  • Les modèles de profil reconnaissent Test, montrent les métadonnées disponibles et masquent l’autoévaluation ordinaire de maîtrise.

Ne généralisez pas seuils, dates, reprises ou conditions d’écriture d’un adaptateur aux autres.

Recherche catalogue et changements de correspondances​

TestCenterRepository::findFilteredTests() et countFilteredTests() exigent SettingTestcenter pour l’entreprise et t.isInactive != 1. Nom : contient ; fournisseur, catégorie, langue, niveau : égalité si fournis. Ordre par nom et pagination offset/limit. showOnlyPublished du front ne prouve pas un prédicat de publication distinct : le dépôt contrôle l’inactivité. Les null SQL peuvent influer sur != 1 ; aucun cas réel testé.

Main/ConfigBundle/Controller/TestController::addTestSkillsAction() vérifie contexte et disponibilité, limite les compétences à l’entreprise, déduplique test/compétence/potentiel/entreprise et persiste les nouveaux liens. Pour chaque insertion :

  1. Si test[revalidate_skill] est présent, findUserTestCenterSkills() charge les compétences concernées de source test ; note 0, source et score null, puis flush. La présence de clé est contrôlée : une valeur ressemblant à faux n’équivaut pas à l’omettre.
  2. findUserSkillJob() trouve les emplois courants concernés et appelle assignTest(..., false, 'REASSIGN'), sans email dans cet appel ; le nouvel essai dépend du fournisseur.
  3. La réponse contient comptes ajoutés/ignorés et liens. skills_reset utilise une variable différente de la collection réellement réinitialisée et test_result_reset ne prouve pas une réinitialisation fournisseur. Vérifiez les données plutôt que ces seuls compteurs.

L’onglet dépend de edit_test_skill et la case company_test_reinittest est cochée par défaut lorsqu’offerte. Le gestionnaire ne répète pas exactement ces droits : UI et serveur doivent être évalués séparément.

deleteTestSkillsAction() limite le retrait des liens à l’entreprise/test. Le reset ultérieur sélectionne par objets compétence et source Test, sans prédicat explicite d’entreprise utilisateur ou de test d’origine. findUserSkillJob() n’a pas non plus de paramètre d’entreprise explicite ; ces requêtes dépendent des identités choisies. Réutilisation de compétences ou plusieurs tests exigent une revue attentive. Retirer un lien peut effacer des notes issues d’autres tests ; aucune protection complète de provenance établie. Aucune mutation de correspondance exercée. Le détail exposait l’onglet et la réévaluation cochée ; attribution et obligation ont été testées séparément.

Configuration et propagation​

HandleTestPartnerSavingService exige Setting et contenu non vide. Il extrait test_{providerId} et visibility-type_{providerId}, écrit les préférences, crée les liens par lots de 50 puis nettoie les exclusions. Fournisseur inconnu : 404 ; contexte/contenu absent : 400.

Les mises à jour de visibilité ciblent entreprise/fournisseur avec is_changed_visibility=0 par défaut ; les changements explicites sont exclus. L’absence d’audience n’est pas un défaut sûr établi ; vérifier PHP/base avant usage programmatique.

Le GET des paramètres appelle checkSkillLevelScoreRatio() qui persiste les ratios manquants. Sauvegarder Goshaba lance l’import. Les ratios recalculent les compétences Test de l’entreprise. Les comparaisons de borne supérieure examinées utilisent des opérandes de type tableau : le comportement scalaire correct reste non vérifié et exige des données d’essai approuvées avant recalcul massif.

Un callback SkillValue contrôle FEATURE_SWITCH pour test_skill_change. Cela n’établit pas un commutateur global de tous les imports ; examiner adaptateur et appel précis.

Permissions et sécurité​

Le lancement limite explicitement au propriétaire. Observé : catalogue accessible à Jim, paramètres fournisseur refusés. Vérifié : les paramètres exigent un School racine et refusent avant initialisation des ratios. Le firewall limite /company à ROLE_COMPANY, /plateforme à ROLE_CUSTOMER, /api à ROLE_USER, avec HTTPS. Ces règles larges ne remplacent pas les contrôles par enregistrement. L’obligation vérifie entreprise et mandatory_tests si un objet de permissions existe. UserAllowedService limite participants/candidats ; les contrôles utilisent aussi test_reassigned, test_d.

Cela ne prouve pas l’équivalence de toutes les mutations. Attribution, réattribution, rapports et partage exigent une revue route/firewall/voter/contrôleur avant intégration. Aucun audit complet CSRF, callback, IDOR ou accès aux rapports réalisé. /api/tests/add contrôle explicitement CSRF et entreprise ; ne supposez pas les mêmes vérifications sur skill/email. La visibilité catalogue seule ne protège pas les données.

L’inscription transmet l’identité selon l’adaptateur. Les rapports utilisent le répertoire média privé du client et un nom fondé sur résultat/temps. Excluez résultats, liens, identifiants candidats, secrets et URL fournisseur des captures et journaux ordinaires. La capture du catalogue ne contient aucun résultat personnel.

Erreurs et observabilité​

SymptômeTrace
Catalogue videDisponibilité, import, filtres et isInactive. Les 87 tests observés ne prouvent pas le lancement.
Attribution sans URLFactory/type, support, création candidat/tentative, secrets et notification de lien absent.
Résultat absentCookie/propriétaire/expiration, synchronisation de l’attente, récupération et recherche callback. Aucun SLA universel établi.
PDF invalide/absentStockage privé, import, validation et message d’indisponibilité.
Nouvel essai refuséAttente existante ou réattribution propre au fournisseur.
Niveau incorrectConversion, liens, type de ratio, bornes et contexte collaborateur.

Utilisez les journaux protégés et diagnostics fournisseur avec corrélation entreprise/tentative. Aucun tableau de métriques dédié, file de reprise durable, idempotence callback ou calendrier déployé établi. Les commandes src/Command/TestMarketplace/ et src/Command/ImportTestCenter/ sont des entrées possibles, sans preuve de planification automatique.

Dépendances, coexistence et extensions​

Dépendances : Symfony historique, Doctrine, Twig/JavaScript, API fournisseurs, email et médias privés. Les commandes optionnelles dépendent de leur planification et secrets. Aucun appel AIHub obligatoire trouvé dans l’orchestration ; la recherche ciblée de sources de compétences/configuration n’a pas trouvé d’implémentation correspondante.

Les recherches nextgen ciblées n’ont trouvé aucun équivalent TestMarketplace/TestCenter/fournisseur. Catalogue et Tests personnels utilisent l’historique dans la navigation moderne, sans preuve de migration ou remplacement.

Pour un fournisseur, tracez ensemble TestManagerInterface, factory, types, import catalogue, attribution, synchronisation, rapports, nouvel essai/retrait, conversion et visibilité. Un nom ajouté au modèle ne prouve pas un parcours complet. Validez isolation et cycle de résultat avant activation.

Sources et limites​

  • Vérifié : chemins ci-dessus ; src/Main/ConfigBundle/Resources/config/doctrine/{TestResult,TestCenter,TestCenterLevel}.orm.yml ; src/Main/ConfigBundle/Repository/Test/TestResultRepository.php ; gestionnaires, factory, callbacks et services de configuration ; src/Main/ConfigBundle/Controller/TestController.php, Resources/config/routing/test.yml, src/Repository/TestCenterRepository.php, src/Main/ConfigBundle/Repository/UserskillRepository.php, config/packages/security.yaml.
  • Observé : Chrome, 23 octobre 2026, PS Testing, Jim : 87 Tests, détail, attribution sauvegardée, obligation persistante, dialogue de mapping, carte 0/1, lancement indisponible et configuration refusée. Les captures complètes des guides proviennent de cette entreprise ; aucune référence à un autre environnement.
  • Déduit : ordre de diagnostic et extensions recommandés.
  • Non vérifié : concordance des versions, exécution fournisseur, rapports, authentification callback, idempotence inter-fournisseurs, toutes les autorisations, files/planification et bornes exactes. Une attribution et son obligation sauvegardées ; lancement propriétaire en échec, obligation remise en optionnel. Aucun mapping, réponse, partage, retrait ou paramètre fournisseur modifié. Exécution, récupération et notification opérationnelle restent non vérifiées.

Sources du guide fonctionnel​

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

  • Observé : Chrome, 23 octobre 2026, PS Testing avec Jim uniquement : catalogue, Performance → Tests Marketplace, Tests personnel, attribution/confirmation, attente, obligation persistante, mapping, compteurs, erreur fournisseur et refus des paramètres. Captures de cette session ; le centre personnel est décrit sans exposer ses coordonnées.
  • Vérifié : smartmobility-legacy/src/Company/TestBundle/Controller/InterneController.php, modèles Resources/views/Interne/, src/Customer/AccountBundle/{Controller/DefaultController.php,Resources/views/Default/index.html.twig}, src/Customer/TestBundle/Controller/DefaultController.php, src/Service/TestMarketplace/.
  • Déduit : diagnostic recommandé, pas garantie de la cause d’une erreur particulière.
  • Non vérifié : réception d’email (désactivé), exécution externe, rapports, abonnements et tous les rôles. Une attribution pour Jim, obligation testée puis rétablie. Aucune réponse, correspondance, partage ou configuration entreprise sauvegardée. Tout le travail applicatif est resté dans PS Testing avec Jim.

Vérification du parcours — 26 octobre 2026​

Observé : PS Testing, Jim Carter. L’ouverture du SQL Senior existant revient avec le message d’indisponibilité. Aucune tentative fournisseur, callback de résultat ou conversion établie. Aucune communication envoyée ; la phrase de contact support est un texte applicatif.

Dernière mise à jour : 3 novembre 2026