# Composants de réponse complexe
Pogues permet la conception de questionnaire dont la structure est faite de séquences, sous-séquences et questions.
Pour ces dernières, il s'agit de constituer un triptyque :
- question
- réponse
- variable(s)
La réponse associée à une question peut être de différents types. Nous cherchons à étendre ces types de réponses à des "composants" dont la complexité n'est pas portée par DDI.
## Existant
### Pogues
Les types de réponses actuels sont :
- simple
- liste à choix unique
- liste à choix multiple
- tableau (fixe ou dynamique)
### Dans le [modèle](https://github.com/InseeFr/Pogues-Model/blob/main/src/main/resources/xsd/Questionnaire.xsd)
L'élément [Question](https://github.com/InseeFr/Pogues-Model/blob/main/src/main/resources/xsd/Questionnaire.xsd#L77) porte l'ensemble des informations liées à la question posée, on y trouve notamment :
- [Response](https://github.com/InseeFr/Pogues-Model/blob/main/src/main/resources/xsd/Questionnaire.xsd#L237)
- [ResponseStructure](https://github.com/InseeFr/Pogues-Model/blob/main/src/main/resources/xsd/Questionnaire.xsd#L171)
- [Les types de questions (QuestionType)](https://github.com/InseeFr/Pogues-Model/blob/main/src/main/resources/xsd/Questionnaire.xsd#L483), à l'heure actuelle :
- `SIMPLE`
- `SINGLE_CHOICE`
- `MULTIPLE_CHOICE`
- `TABLE`
Exemple d'une réponse simple (la question `PRODUCER` du questionnaire Simpsons) :
```json
{
"Response": [
{
"CollectedVariableReference": "jbcgf11f",
"id": "jbgd90cy",
"mandatory": false,
"Datatype": {
"Pattern": "",
"typeName": "TEXT",
"type": "TextDatatypeType",
"MaxLength": 30
}
}
],
"Control": [],
"depth": 3,
"FlowControl": [],
"Label": [ "Who is the producer?" ],
"id": "j3343qhx",
"TargetMode": [ "CAWI", "PAPI", "CAPI", "CATI" ],
"Declaration": [],
"type": "QuestionType",
"questionType": "SIMPLE",
"Name": "PRODUCER"
}
```
### Dans DDI
[QuestionItem](https://ddialliance.github.io/ddimodel-web/DDI-L-3.3/item-types/QuestionItem/)
[QuestionGrid](https://ddialliance.github.io/ddimodel-web/DDI-L-3.3/_images/QuestionGrid.svg) pour les tableaux et les batteries de questions
:::info
Note : pour un tableau dynamique, une seule variable au sens Pogues / DDI est créée par colonne. Par exemple, pour le [questionnaire Simpsons](https://pogues.dev.insee.io/questionnaire/i6vwi2506prod) pour la première question du module V.
Dans Pogues, on déclare la variable collectée `FAVOURITE_CHAR1`
La variable dans le modèle Pogues
```json
{
"CollectedVariableReference": "kiq7llp5",
"id": "kiq7p16z",
"Datatype": {
"Pattern": "",
"typeName": "TEXT",
"type": "TextDatatypeType",
"MaxLength": 255
}
```
Dans DDI :
- une variable pour la colonne
```xml
<l:VariableName>
<r:String xml:lang="fr-FR">FAVOURITE_CHAR1</r:String>
</l:VariableName>
```
- liée à un paramètre de sortie du tableau
```xml
<r:SourceParameterReference>
<r:Agency>fr.insee</r:Agency>
<r:ID>j6qg8rc6-QOP-kiq7p16z</r:ID>
<r:Version>1</r:Version>
<r:TypeOfObject>OutParameter</r:TypeOfObject>
</r:SourceParameterReference>
```
:::
## Cible
### Pogues
Dans la liste des choix de réponses, on veut ajouter différents composants "complexes" :
- un composant adresse
- un composant autocomplétion
- un composant liens deux-à-deux
Deux possibilités d'affichage :
1. un nouvel item "Composants complexes" dans la liste des types de question, puis un choix à faire ensuite sur le composant choisi
2. trois nouvels items pour chacun des composants dans la liste des types de question, puis des champs dédiés au besoin de paramétrage de chacun des composants (à ce jour seul le composant d'autocomplétion semble nécessiter ce paramétrage)
3. question simple mais de nouveaux types de réponses
Préférence à la solution 2.
### Modèle
Ajouter des items à la [liste des types de question](https://github.com/InseeFr/Pogues-Model/blob/main/src/main/resources/xsd/Questionnaire.xsd#L483)
```xml
<xs:simpleType name="QuestionTypeEnum">
<xs:restriction base="xs:token">
<xs:enumeration value="SIMPLE"/>
<xs:enumeration value="SINGLE_CHOICE"/>
<xs:enumeration value="MULTIPLE_CHOICE"/>
<xs:enumeration value="TABLE"/>
<!-- Nouveaux éléments -->
<xs:enumeration value="ADDRESS"/>
<xs:enumeration value="SUGGESTER"/>
<xs:enumeration value="PAIRING"/>
</xs:restriction>
</xs:simpleType>
```
(valeurs non définitives)
### DDI
On passe l'information dans le DDI via l'utilisation de l'élément `UserAttributePair` (cf. [cette doc](https://ddialliance.github.io/ddimodel-web/DDI-L-3.3/composite-types/StandardKeyValuePairType/))
```xml
<d:QuestionItem>
<r:Agency>fr.insee</r:Agency>
<r:ID>jr6ebqby</r:ID>
<r:Version>1</r:Version>
<r:UserAttributePair>
<r:AttributeKey>UIComponent</r:AttributeKey>
<r:AttributeValue>HouseholdPairing</r:AttributeValue>
</r:UserAttributePair>
<d:QuestionItemName>
<r:String xml:lang="fr-FR">LIEN_DEUX_A_DEUX</r:String>
</d:QuestionItemName>
[...]
</d:QuestionItem>
```
:::info
Les valeurs données ici pour `AttributeKey` et `AttributeValue` ont valeur d'exemple mais ne sont pas les valeurs finales. On utilisera probablement des valeurs issues d'un vocabulaire contrôlé, qui reste à créer.
:::