Enquêtes, NPS et quiz
Extension payante. Un formulaire peut analyser ses réponses : répartitions pour une enquête, score Net Promoter Score, ou note chiffrée pour un quiz. Les rapports vivent sur un écran dédié et s’exportent en CSV et en PDF.
Ce document décrit ce que le module garantit et ce qu’il refuse. Le guide utilisateur en donne la version courte, dans la section « Mesurer les réponses ».
Le principe
Le réglage vit dans les réglages du formulaire, sous survey. Il n’y a pas de
table de configuration : un formulaire exporté puis réimporté emporte son
questionnaire, et un formulaire dupliqué le duplique.
{
"survey": {
"enabled": true,
"mode": "quiz",
"pass_percent": 60,
"privacy_threshold": 5,
"questions": [
{ "field": "q_securite", "weight": 2, "points": { "consigner": 1, "gants": 0 } }
]
}
}
Trois modes : survey, nps, quiz. Une valeur inconnue ne retombe pas sur le
plus inoffensif — un réglage corrompu ou forgé ne produit aucune analyse, parce
qu’une analyse silencieusement différente de ce qui est réglé est pire qu’une
analyse absente : elle paraît juste.
Les champs analysables
Choix (select, radio, checkbox), nombres (rating, range, number,
nps) et textes (text, textarea).
La liste est blanche. Un mot de passe, un fichier, une signature, un paiement n’y figurent pas — et n’y figureront pas par oubli, puisque c’est l’inscription qui ouvre, pas l’omission. Les champs que le cœur déclare sensibles sont écartés une seconde fois, de sorte qu’un type ajouté demain à cette liste cesse d’être agrégé sans qu’on ait à y penser.
Une question texte ne porte qu’un volume. Agréger du texte libre demande de le lire, et un nuage de mots fait remonter des bribes de réponses individuelles — un nom propre, une ville, une tournure reconnaissable — dans un rapport qui promet précisément de ne pas le faire. Seul le nombre de personnes ayant répondu est conservé ; le texte reste dans la soumission.
Le score d’un quiz
Le maximum suit ce que le répondant a vu. La logique conditionnelle est la source de vérité et le serveur l’a déjà résolue : une question écartée est absente des valeurs retenues, et ne compte ni au score ni au maximum. La compter pénaliserait quelqu’un pour une question qu’il n’a jamais vue, et deux répondants suivant deux branches n’auraient plus de pourcentages comparables — alors que c’est le pourcentage qui les rend comparables.
La présence de la clé fait foi, pas la valeur : une question affichée puis laissée vide compte au maximum et rapporte zéro. C’est un échec sur cette question, pas une absence de question.
Les points négatifs descendent le score, jamais le maximum : personne n’est tenu de prendre une pénalité, et l’inclure rendrait un sans-faute inférieur à cent pour cent. Le total est borné à zéro par le bas.
Trois états, dont un qui n’est pas un échec : passed, failed, et unscored —
il n’y avait rien à noter. Les confondre afficherait un échec à quelqu’un qui n’a
pas passé l’épreuve, et ferait chuter le taux de réussite d’un rapport pour des
copies qui n’en relèvent pas.
Le NPS
NPS = 100 × (promoteurs − détracteurs) / réponses valides
promoteurs : 9–10
passifs : 7–8
détracteurs : 0–6
Le mode exige le champ Recommandation (NPS), et lui seul. Le champ de notation du cœur commence à un, et un curseur se règle comme on veut : accepter l’un ou l’autre reviendrait à calculer un NPS sur une échelle qui n’est pas celle de la formule, pour un score qui aurait toujours l’air d’un NPS.
Une note hors échelle est écartée plutôt que ramenée dans l’intervalle : le dénominateur ne compte que les réponses valides, ce que la formule désigne. Zéro réponse rend une absence de score, jamais zéro — un NPS nul est un résultat réel, et l’afficher pour un formulaire sans réponse ferait passer l’absence de données pour une satisfaction moyenne.
Les versions de questionnaire
schema_hash est un SHA-256 de la signification du questionnaire : mode,
questions, options, points, pondérations, seuil de réussite. Changer un libellé
d’option change l’empreinte, parce que cela change ce que la réponse veut dire.
Le seuil de confidentialité n’y entre pas : il règle ce qu’on montre, pas ce qu’on a demandé. L’y mettre couperait les séries en deux le jour où un administrateur passe le seuil de cinq à dix, sans qu’aucune question n’ait bougé.
Chaque résultat emporte un instantané des libellés et des barèmes d’alors. Un rapport sur les réponses de l’an dernier porte donc les intitulés de l’an dernier : relire la configuration actuelle ferait qu’un simple renommage réécrirait l’histoire, et personne ne saurait que la série d’avant et celle d’après ne mesurent pas la même chose.
Le filtre « toutes les versions » existe, et le libellé dit ce qu’il fait : il cumule des séries qui ne sont pas comparables.
Le seuil de confidentialité
Par défaut cinq réponses, réglable par formulaire, jamais au-dessous de trois. En deçà, une répartition désigne quelqu’un.
Il s’applique à deux niveaux : au rapport entier, qui n’affiche alors qu’un volume, et à chaque question prise isolément — une question facultative peut n’avoir reçu que deux réponses dans un rapport qui en compte cinquante.
Quand le rapport est masqué, le lien vers les soumissions disparaît aussi : un rapport qui annonce protéger les petits groupes ne doit pas offrir, juste à côté, le moyen de les lire une par une.
La décision est portée par le rapport, pas par l’affichage. La page, le CSV et le PDF lisent le même objet. Une règle écrite dans le gabarit de la page serait contournée par le premier export venu, et un fichier qui circule est la pire des fuites.
Ce que les tables conservent
Ni adresse, ni nom, ni adresse IP, ni agent, ni contenu de champ. answer_key
porte la valeur technique d’une option — oui, plan_pro, 8 — jamais son
intitulé. entry_id suffit à retrouver la soumission, pour qui a déjà le droit de
la lire.
Les rapports excluent les envois indésirables, en corbeille et les brouillons. Le statut n’est pas recopié : chaque agrégat joint la table des soumissions et lit le statut réel, de sorte qu’un envoi classé en indésirable quitte le rapport à l’instant même, sans tâche de rattrapage.
Supprimer une soumission efface son résultat et ses réponses. Une tâche quotidienne retire en outre les résultats dont la soumission a disparu autrement — requête SQL directe, migration de site, ou suppression pendant que l’extension était désactivée.
Les graphiques
Il n’y en a pas, au sens où il n’y a rien à décrire en plus. Les barres sont des fonds posés dans les cellules d’un tableau qui porte les chiffres : la largeur donne l’ordre de grandeur, le nombre donne la mesure. Un lecteur d’écran lit des nombres parce qu’il n’y a jamais eu que des nombres, et le tableau reste entier à l’impression comme dans le PDF.
Aucune couleur ne porte de sens : deux séries se distinguent par leur colonne.
Les exports
Le CSV porte un en-tête — formulaire, version, période, date de génération, seuil — puis la synthèse, les segments ou les tranches de score, une ligne par question et par réponse, et la série quotidienne. Il commence par un BOM, sans lequel Excel lit l’UTF-8 comme du latin et abîme tout accent dès la première ligne.
Le PDF repose sur le même moteur que les reçus signés, isolé derrière
PdfEngineInterface. Il est produit à la demande et envoyé en téléchargement ;
rien n’est écrit sur le disque, un rapport déposé dans les téléversements étant
une adresse à deviner.
Aucun des deux ne contient de réponse individuelle. L’export des soumissions reste le chemin explicite vers les données de réponse, avec ses propres droits.
Ce que le module ne fait pas
Ni banque de questions partagée, ni tirage aléatoire, ni limite de temps, ni tentative multiple, ni correction manuelle, ni certificat. Ni modèle statistique avancé, ni pondération démographique, ni analyse de texte. Ni classement individuel, ni affichage public de noms ou de réponses. Ni comparaison entre formulaires : elle exigerait un contrat de questions et de versions que la V1 n’établit pas.
Les champs calculés, les répéteurs et les valeurs sensibles ne peuvent pas porter de barème.
Droits
La configuration exige solis_forms_manage_forms. Les rapports suivent
solis_forms_view_entries et la restriction par auteur : un utilisateur limité à
ses formulaires ne peut ni sélectionner ni deviner les résultats d’un formulaire
tiers, et le contrôle porte sur la requête, non sur l’affichage.
