Architecture : Représentation "à plat" des réponses aux questionnaires
Contexte
L'application repose sur un système de questionnaires dynamiques avec transitions conditionnelles. Les questionnaires sont paramétrés en base de données et permettent de naviguer d'une question à l'autre en fonction des réponses données, avec des prérequis et des conditions de parcours.
Décision : Structure uniforme pour toutes les réponses
Toutes les réponses givenAnswers sont stockées de manière uniforme, indépendamment du type de question (ouverte, fermée, booléenne, choix multiple).
Pour les questions ouvertes : une seule entrée dans possibleAnswers contient les contraintes (min/max) et les identifiants section / field. La valeur textuelle est stockée dans givenAnswers.
Pour les questions fermées : chaque choix possible génère une entrée distincte dans possibleAnswers avec ses propres section / field. Les réponses dans givenAnswers sont des booléens (true/false).
Justification
Cette approche "à plat" a été privilégiée pour les raisons suivantes :
-
Uniformité de la logique de navigation : Les conditions de transition entre questions référencent toujours des
possibleAnswersspécifiques. Avoir une structure de données homogène simplifie la vérification des prérequis (givenAnswer.value === true/false) sans avoir à gérer différents types de données (string, array, boolean). -
Simplicité des requêtes : Le parcours de l'arbre de questionnaire nécessite de fréquentes vérifications de réponses. Une structure uniforme évite les switch/case sur les types de questions et rend le code plus maintenable.
-
Stabilité architecturale : La logique métier du questionnaire (90% du code) repose sur une représentation prévisible et cohérente des données.
Compromis accepté : Transformation pour la génération de documents
Cette structure "à plat" n'est pas optimale pour la présentation des résultats dans les templates Twig. C'est pourquoi une couche de transformation est appliquée uniquement au moment de la génération des documents finaux.
Cette transformation convertit les données en structures sémantiquement correctes :
- Questions ouvertes → string/int/date
- Questions à choix unique → string (valeur choisie)
- Questions à choix multiple → array
- Questions booléennes → boolean
Principe : Conserver la simplicité dans la logique métier du questionnaire, et isoler la complexité de transformation à un seul endroit (le passage du monde "questionnaire" au monde "document").