Gérer des fiches questions-réponses avec Mezzoteam
Les possibilités de paramétrage de Mezzoteam permettent aux administrateurs de laisser libre cours à leur imagination.
Il m’a été demandé de paramétrer pour un client des fiches questions-réponses, document courant sur les chantiers. L’objectif étant de permettre à un utilisateur de poser une question, et à une ou plusieurs personnes de répondre à cette question. Vous me direz, pourquoi ne pas utiliser les forums de Mezzo ?
Tout simplement pour des raisons de confidentialité : les fils de discussions postés dans les forums sont publics, alors qu’une fiche question-réponse attend une réponse précise d’un ou de plusieurs utilisateurs donnés. De plus, il semblait pratique de prévoir que les questions (et/ou les réponses) soient agrémentées de fichiers associés. Ces deux pré-requis m’interdisaient d’utiliser le forum pour répondre à ce besoin.
Malgré ces besoins de confidentialité, il fallait que la saisie soit la plus simple possible (pas de saisie de numéro d’ordre ou autre), afin d’obtenir un fonctionnement proche de celui du forum, tout en conservant les fonctionnalités riches demandées.
Scénario utilisateur
Le scénario utilisateur retenu consiste à créer une famile de documents « Question », qui permettra de… poser les questions ! Une fois sa question terminée, l’émetteur signera et diffusera sa question aux personnes qui doivent répondre, et qui seront informées par courriel de la présence d’une question. La réponse se fera en clonant la question, qui devra alors être marquée comme une réponse.
Pour garder un lien logique entre question et réponse, on utilisera un « code question » qui sera commun à la question et aux réponses. Le numéro servira ensuite de discriminant entre la question et les réponses.
Ainsi, une question aura un code du type : Q-003-00, et ses réponses un code du type R-003-01 et suivants.
Mise en oeuvre
Pour réaliser ce paramétrage, nous allons nous appuyer fortement sur le langage de formules Mezzoscript de Mezzoteam.
Tout d’abord, nous allons créer une famille de documents non-révisable appelée « Question ». Nous allons ajouter les champs utilisateurs suivants :
- Sous-titre
- Type (Code
TYPE
, Question ou Réponse, calculé) - Code Question (Code
CODEQUEST
, calculé) - Numéro d’ordre (Code
NUMORDRE
, calculé)
Il est à noter que tous les champs calculés doivent ne l’être qu’à la création du document !
Le champ Type sera basé sur la formule suivante :
@Ifs(TYPE="","Q","R")
Si le champ Type ne contient rien (nous sommes en train de créer une nouvelle question), alors on lui affecte le code « Q ». Dans le cas contraire (il contient « Q »), nous sommes en train de cloner le document (donc de créer une réponse), et nous affecterons alors le code « R ».
Le champ Code Question est un champ qui contient le numéro chronologique du « fil de discussion » ; il sera partagé par la question et les réponses. Il ne doit donc être calculé que lors de création de la question et non lors du clonage d’un document (pour créer une réponse). Sa formule, plus complexe, est la suivante :
@ReturnIf(TYPE="R",
CODEQUEST
);
@ReturnIf(TYPE="Q" OR TYPE="",@Format(@ChronoGetNext("QUESTION"),"000"));
On utilise ici la capacité de Mezzoscript à pouvoir enchaîner plusieurs commandes dans un script. La formule @ReturnIf
permet d’évaluer l’expression qu’elle contient, puis d’arrêter toute évaluation si la condition est vérifiée.
On vérifie d’abord si le document est une réponse (TYPE="R"
), et si c’est le cas, on se contente de réaffecter le code récupéré lors du clonage de la question (ou d’une des réponses…). Si ce n’est pas le cas, on calcule un nouveau code question, que l’on formatte sur trois caractères.
Mais pourquoi ne pas utiliser @Ifs ?
Pourquoi utiliser @ReturnIf
alors que @Ifs
aurait apparemment pu faire l’affaire ? Tout simplement parce que si nous avions écrit cela :
@Ifs(TYPE="Q" OR TYPE="",@Format(@ChronoGetNext("QUESTION"),"000"),CODEQUEST)
L’ensemble de la formule aurait été évaluée à chaque fois, et notre chrono aurait été incrémenté à chaque fois que nous aurions créé une réponse (même si le numéro affiché dans le code question aurrait été correct !).
Le champ Numéro d’ordre va nous permettre de franchir encore un cap dans l’utilisation des chronos. Nous avions vu dans un précédent article que le paramètre de la formule @ChronoGetNext
permettait de repérer uniquement le chrono dans la liste de ceux utilisés dans un espace de travail. Mais comme nous sommes dans MezzoScript, nous pouvons parfaitement calculer ce paramètre, afin de le rendre dynamique.
Et c’est exactement ce que nous allons faire avec le numéro d’ordre des fiches questions-réponses. En effet, ce numéro d’ordre doit se rapporter au code question, et non pas à l’ensemble des questions posées ; ainsi il sera vu comme un « indice » du code question, avec la question portant le numéro « 00 », et les réponses commençant à « 01 ».
@ReturnIf(TYPE="Q","00");
@Format(@ChronoGetNext("QUESTION"&CODEQUEST),"00")
Sur la première ligne, nous évaluons si nous avons à faire à une question, auquel cas nous lui affectons le numéro « 00 ». Dans le cas contraire, nous construisons le code du chrono du nuéméro à partir du nom de la famille documentaire et du code question de la fiche à laquelle nous répondons.
Nous n’avons plus qu’à composer le code en choisissant les champs correspondant dans l’identifiant, puis à positionner les champs Titre et Sous-titre dans le masque, puisqu’ils sont les seuls à être saisissables.
N’oubliez pas également de gérer les droits du documents, en n’affectant aucun droit de lecture particulier lorsque le document est signé (ainsi, seuls les lecteurs du document pourront répondre).