Personnalisation des rapports
Sommaire
Docx-templater
Introduction
Les rapports .docx, .pptx et .xlsx générés dans Auditool peuvent être personnalisés en modifiant les modèles fournis dans l'outil, ou en créant ses propres modèles.
Pour télécharger un modèle par défaut dans Auditool : sur la page de génération de rapport, sélectionner un format de fichier (docx/pptx/xlsx), sélectionner un modèle et cliquer sur "Télécharger ce modèle".
Une fois modifié, ces modèles peuvent être ensuite utilisés en les sélectionnant dans la section "Charger un modèle personnalisé" de la page de Rapport.
Fonctionnement

Auditool utilise docx-templater comme librairie externe afin de générer les rapports.
Docxtemplater est une librairie de génération de documents docx, pptx et xlsx, qui gère les conditions, les boucles et permet d'insérer des tableaux, du html, et des images.
Elle utilise le JSON (objets Javascript) comme entrée de données, et se base sur le principe de Tags, chaque tag exposant une fonctionnalité afin de permettre à l'utilisateur d'écrire ses modèles de document.
Types de tags
Introduction
Docx-templater utilise des tags délimités par deux accolades {}.
Ainsi, à partir d'un modèle contenant le texte suivant (template.docx) :
Hello {name} !
Et en lui donnant en entrée la donnée suivante :
json
{
"name": "John"
}
Docx-templater produira un document contenant :
Hello John !
Boucles
Une boucle est générée avec un tag ouvrant commençant par un #. Exemple : {#users}
Et avec un tag fermant commençant par /. Exemple {/users}.
Une boucle permet d'itérer sur des objets et sur des tableaux.
Par exemple, un modèle contenant le texte suivant (template.docx) :
{#users}{name}: {role}{/users}
Avec la donnée entrante suivante :
json
{
"users": [
{ "name": "John", "role": "admin" },
{ "name": "Chris", "role": "auditor" },
{ "name": "Jake", "role": "client" }
]
}
produira un document contenant :
John: admin
Chris: auditor
Jake: client
Afin de boucler sur un tableau contenant des données primitives (par ex. une chaîne de caractères) :
json
{
"users": ["John", "Chris", "Jake"]
}
Il est nécessaire d'utiliser le tag {.} :
{#users} {.} {/users}
Résultat :
John
Chris
Jake
Boucles emboitées
Il est possible de créer des boucles à plusieurs niveaux.
Imaginons la données suivante :
json
{
"users": [
{
"name": "John",
"audits": [
{ "standard": "ISO 27001", "client": "Google" },
{ "standard": "ASVS", "client": "Facebook" },
{ "standard": "RGPD", "client": "Apple" }
]
}
]
}
Avec le modèle suivant :
{#users}
User: {name}
Audits:
{#audits}{standard} - {client}{/audits}
{/users}
Donnera le résultat :
User: John
Audits:
ISO 27001 - Google
ASVS - Facebook
RGPD - Apple
Boucles de création de slides pptx
Une boucle peut, dans le contexte d'un document pptx, générer une nouvelle slide a chaque itération de la boucle.
Le tag permettant cela est le suivant : {:users}
Ce tag n'a pas besoin de tag fermant pour fonctionner.
Prenons comme exemple la donnée suivante :
json
{
"users": [
{ "name": "John", "role": "admin" },
{ "name": "Chris", "role": "auditor" },
{ "name": "Jake", "role": "client" }
]
}
Si l'on crée une slide dans un document pptx contenant les tags suivant :
{:users}
{name}: {role}
La librairie produira 3 slides :
Slide 1
John: admin
-------------
Slide 2
Chris: auditor
-------------
Slide 3
Jake: client
Html
Des balises HTML peuvent être insérées dans un modèle de document en utilisant un tag commençant par ~~
Par exemple, un modèle contenant le texte suivant (template.docx) :
{~~description}
Avec la donnée entrante suivante :
json
{
"description": "<p><b>Auditool can help you save time</b></p><br><p style=\"color\": red;>And money !</p>"
}
produira un document contenant le texte :
Auditool can help you save time
And money !
En savoir plus
Les fonctionnalités décrites précédemment sont celles utilisées principalement dans les modèles de rapport Auditool. Cependant, docx-templater intègre bien d'autres fonctionnalités et modules (conditions, sections, sections inversées, etc).
Modèle de données
Télécharger le modèle au format JSON
Afin de pouvoir personnaliser les rapports générés par Auditool, il est nécessaire de connaître le format et le contenu des données envoyées par l'application au moment de la génération.
Pour une meilleure lisibilité, Nous vous proposons de télécharger ces données sous format JSON, afin de les lire dans un éditeur de texte approprié (télécharger Notepad++).
Vous pouvez également l'ouvrir dans le navigateur (Firefox recommandé ou Chrome + Json Viewer)
Pour générer le fichier json, ouvrez un audit dans la page Audit et ouvrez l'onglet Génération de rapports. Puis choisissez Rapport personnalisé et cliquez sur le bouton Voir le format des données.
NB : Pour des raisons de taille, les recommendations et les assessments présents dans le JSON généré ne seront pas intégralement détaillées. Seuls leurs id seront visibles. Cependant dans lors de la génération des rapports, ces id seront remplacés par les objets complets, avec le format décrit dans les paragraphes ci-dessous.
Détails du schéma de données d'un audit
Données primitives
Voici ci-dessous le format des données d'entrée reçu par le template lors de la génération du rapport. Seules les données primitives, se trouvant à la racine du JSON sont affichées, les données complexes étant détaillées juste après.
json
{
// numéro de l'audit
"id": 5,
// date de création de l'audit
"dateCreated": "2020-03-16",
// date de début de l'audit, calculée en fonction de sa planification
"dateStart": "2020-03-16",
// date de fin de l'audit, calculée en fonction de sa planification
"dateEnd": "2020-04-16",
// nom de l'auteur
"author": "Pierre Martin",
// notes de l'audit
"notes": "<p>Notes de l'audit</p>",
// statut de l'audit (planned, scheduled, ongoing, closed)
"state": "ongoing",
// nom de la structure d'audit
"typeName": "Conformité",
// indique si l'audit utilise des sites physiques ou des cibles (targets)
"useTargets": false,
"auditlayout": {...},
"client": {...},
"sites": [...],
"scale": {...},
"standards": [...],
"allAssessments": [...],
"allRecommendations": [...],
"allCategories": [...],
"frames": {...},
"actionplan": null,
"reviews": null
}
client
La clé client expose les informations relatives au client lié à l'audit.
On y trouve son nom et les sites associés à l'audit.
Si l'audit utilise des cibles (useTargets: true
), chaque site représente une cible.
json
{
"client": {
// identification unique du client
"id": 1,
// nom du client
"name": "Client 1",
// sites associés à l'audit
"sites": [
{
// Site global
"id": 1,
"name": "Global",
"description": "",
// booléen servant à différencier le site global
"isAll": true,
// id du client auquel le site est associé
"clientId": 1
},
{
// identifiant unique du site
"id": 2,
"name": "Toulouse",
"description": "",
// boolean servant à différencier le site global
"isAll": false,
"clientId": 1
},
{
"id": 3,
"name": "Paris",
"description": "",
"isAll": false,
"clientId": 1
}
]
}
}
scale
La clé scale expose les informations de l'échelle de notation associée à l'audit.
Une échelle est contituée d'un ensemble d'indicateurs, appelés "sous-échelles".
Chaque sous-échelle contient plusieurs niveaux, associant une valeur à un nom et à une couleur.
json
{
"scale": {
"id": 2,
// la référence unique de l'échelle
"reference": "governance",
// la version de l'échelle utilisée pour l'audit
"version": 1,
// la langue dans laquelle l'échelle est affichée
"language": "fr",
// le nom de l'échelle
"name": "Gouvernance et conformité",
"description": "Echelle de notation pour les audits de gouvernance et de conformité, basée sur les recommandations de l'ANSSI",
// liste des indicateurs utilisés par l'échelle
"indicators": [
// la sous-échelle de type "status"
{
"id": 9,
"type": "status",
"name": "Niveau de conformité",
"description": "Indique la conformité à l'exigence",
// le tableau contenant tous les niveaux de la sous-échelle
"levels": [
{
"value": 1,
"color": "#808080",
// indique la conformité/non-conformité
"status": null,
"name": "Non-applicable",
"description": "L’exigence n’est pas applicable au périmètre cible de l’audit"
},
{
"value": 2,
"color": "#70AC47",
"status": "ok",
"name": "Point Fort",
"description": "Les éléments audités dépassent les attentes de l’exigence ou se distinguent par une pratique, méthode, ou technique performante"
},
{ ... },
]
},
// les sous-échelles de type "coût d'investissement", "charge de réalisation", et "priorité"
{ "type": "investment", ... },
{ "type": "workload", ... },
{ "type": "priority", ... }
],
// une table de correspondance pour le calcul automatique des niveaux
"compute": { ... }
}
}
allAssessments
La clé allAssessments expose toutes les évaluations (aka. assessments) liées à l'audit, classées par référence de l'exigence.
json
{
"allAssessments": [
{
// id unique de l'évaluation
"id": 143,
// id de l'audit
"auditId": 6,
// id du réferentiel auquel l'évaluation est rattachée
"standardId": 4,
// nom du réferentiel auquel l'évaluation est rattachée
"standardName": "RGPD 2.0 FR",
// id de l'exigence à laquelle l'évaluation est rattachée
"nodeId": 1095,
// référence de l'exigence associée
"reqRef": "1.1",
// titre de l'exigence associée
"reqTitle": "Identification des composants d'application",
// description de l'exigence associée
"reqDescription": "Vérifiez que tous les composants de l'application sont identifiés et nécessaires.",
// id du site auquel l'évaluation est rattachée
"siteId": 1,
// nom du site auquel l'évaluation est rattachée
"siteName": "Global",
// valeur 'true' s'il s'agit du site global
"siteIsAll": true,
// évaluation épinglée
"needReview": false,
// statut de l'évaluation (en rapport avec l'échelle utilisée)
"status": 1,
// nom du statut de l'évaluation, tel que défini dans l'échelle
"statusName": "Non-applicable",
// couleur associée au statut, telle que définie dans l'échelle
"statusColor": "70AD47",
// booléen indiquant si le statut correspond à une conformité
"statusOk": true,
// booléen indiquant si le statut correspond à une non-conformité
"statusKo": false,
// référence de la conformité (présent uniquement si statusOk vaut "true")
"coRef": "001",
// référence de la non-conformité (présent uniquement si statusKo vaut "true")
"ncRef": "001",
// contexte de l'évaluation
"context": "<p>Ceci n'est pas applicable</p>",
// pièces jointes
"attachments": [],
// recommandations associées à cette évaluation
"recommendations": [...]
},
...
]
}
Chaque objet contient, dans son champ recommendations la liste des recommandations qui sont associées à l'évaluation.
Le format de chaque recommandation est décrit dans le paragraphe allRecommendations.
allRecommendations
La clé allRecommendations expose toutes les recommandations liées à l'audit, classées par référence de l'exigence.
json
{
"allRecommendations": [
{
// identifiant unique de la recommandation
"id": 26,
// titre de la recommendation
"title": "Le titre de la recommandation",
// constat
"findings": "<p>Voici le constat </p>",
// risque
"risk": "<p>Pas trop de risque quand même</p>",
// remédiation
"remediation": "<p>Il faudrait y remédier ainsi ...</p>",
// niveau de risque
"risklevel": null,
// niveau de priorité
"priority": 3,
// nom du niveau de priorité, tel que défini dans l'échelle
"priorityName": "Haute",
// coût d'investissement
"investment": 1,
// nom du coût d'investissement, tel que défini dans l'échelle
"investmentName": "Bas",
// charge de réalisation
"workload": 1,
// nom de la charge de réalisation, tel que défini dans l'échelle
"workloadName": "Elevée",
// référence de la recommandation
"ref": "001",
// site associé à la recommandation
"siteId": 1,
"siteName": "Global",
"siteIsAll": false,
// reférentiel associé
"standardId": 4,
"standardName": "RGPD 2.0 FR",
// exigence associée
"reqRef": "1.7",
"reqTitle": "Contrôles de sécurité",
"reqDescription": "Vérifiez que tous les accès sont identifiés et tracés.",
// statut de l'évaluation associée
"assessStatus": 5,
"assessStatusName": "Non-conforme mineur",
"assessStatusColor": "FFCC00",
"assessStatusOk": false,
"assessStatusKo": true,
// liste de tous les indicateurs utilisés dans l'échelle
"indicators": [
{
// nom de l'indicateur
"name": "Coût d'investissement",
// type de l'indicateur
"type": "investment",
// niveau du coût d'investissement
"value": 1,
// nom du niveau de priorité, tel que défini dans l'échelle
"name": "Faible",
// couleur liée au niveau du coût d'investissement
"color": "70AD47",
// statut de l'échelle
"status": null
},
{ "indicator": "Charge de réalisation", ... },
{ "indicator": "Priorité de mise en oeuvre", ... }
],
},
...
]
}
allCategories
La clé allCategories contient la liste des évaluations, classées par catégorie du référentiel.
json
{
"allCategories": [
{
// la position de la catégorie dans la liste
"order": 1,
// référence de la catégorie
"ref": "V1",
// titre de la catégorie
"title": "Architecture, conception et modélisation des menaces",
// niveau de profondeur de la catégorie (structure en arbre).
// Seules les catégories de niveau 1 sont exportées dans le rapport
"level": 1,
// reférentiel associé
"standardId": 4,
"standardName": "RGPD 2.0 FR",
// évaluations liées à cette catégorie
"assessments": [...],
// recommandations liées à cette catégorie
"recommendations": [...]
},
...
]
}
Chaque objet de la liste contient :
-
assessments : la liste des évaluations applicables pour cette catégorie, classées par référence de l'exigence.
Le format de chaque évaluation est décrit dans le paragraphe allAssessments. -
recommendations : la liste des recommandations applicables pour cette catégorie, classées par référence de l'exigence.
Le format de chaque recommandation est décrit dans le paragraphe allRecommendations.
sites
Le champ sites reprend les mêmes données que précédemment, mais structurées afin de facilité leur insertion dans les modèles de rapport.
Il s'agit d'un tableau contenant des objets. Chaque objet correspond à un site client lié à l'audit (comprenant également le site global).
Les données allAssessments, allRecommendations, et allCategories présentes dans chaque objet ne concernent que le site en question.
json
{
"sites": [
{
"id": 1,
"name": "Global",
"description": "",
"isAll": true,
"clientId": 1,
// liste des évaluations concernant uniquement le site 1
"allAssessments": [...],
// liste des recommandations concernant uniquement le site 1
"allRecommendations": [...],
// liste des catégories concernant uniquement le site 1
"allCategories": [...]
},
{
"id": 2,
"name": "Toulouse",
"description": "",
"isAll": false,
"clientId": 1,
// liste des évaluations concernant uniquement le site 2
"allAssessments": [...],
// liste des recommandations concernant uniquement le site 2
"allRecommendations": [...],
// liste des catégories concernant uniquement le site 2
"allCategories": [...]
},
...
]
}
Pour voir le détail des formats de chaque liste, consultez :
- le paragraphe allAssessments
- le paragraphe allRecommendations
- le paragraphe allCategories
standards
La clé standards expose un tableau contenant tous les référentiels associés à l'audit.
Dans le cas d'un audit multi-référentiel, ce tableau peut contenir plusieurs objets.
json
{
"standards": [
{
"id": 7,
"name": "ASVS",
"version": "1.6",
"language": "fr",
"kwords": "",
"notes": "Source :\nSite web :\nVersion d’origine :",
"draft": false,
"dateCreated": "2020-02-24",
"scaleId": 1,
"displayName": "ASVS FR v1.6",
"tags": [],
"nodes": [...],
"allAssessments": [...],
"allRecommendations": [...],
"allCategories": [...],
"sites": [...]
}
],
}
Chaque objet contient des informations sur le référentiel (nom, date de création, etc.), mais également :
- nodes : la liste des exigences du référentiel.
- allAssessments : liste des évaluations classées par référence de l'exigence, pour ce référentiel uniquement (cf. allAssessments).
- allRecommendations : liste des recommandations classées par référence de l'exigence, pour ce référentiel uniquement (cf. allRecommendations).
- allCategories : liste des évaluations, classées par catégorie du référentiel, pour ce référentiel uniquement (cf. allCategories).
- sites : sites reprend les mêmes données (allAssessments, allRecommendations, etc.) mais triées par site client, pour le référentiel donné uniquement (cf. sites).
frames
La clé frames permet d'avoir accès au données du contexte, de la conclusion, et du bloc-notes, utilisées dans les modèles docx.
Frames est un object contenant 3 clés : context, conclusion, et notepad.
Chacune de ces trois clés est un tableau contenant des sections.
Chaque section comprend un id, un titre, un contenu, un ordre de classement et un niveau (disposition en arborescence).
json
{
"frames": {
// sections contenues dans le contexte
"context": [
{
// identifiant unique de la section
"id": 385,
// identifiant de la section parente (utilisé seulement pour les sous-sections)
"parentId": null,
// niveau de la section dans l'arborescence des frames
"level": 1,
// ordre de la section
"order": 1,
// titre de la section
"title": "Préambule",
// contenu de la section
"content": "Texte optionnel"
},
{
"id": 390,
"parentId": 385,
"order": 1,
"title": "Périmètre",
"content": "Décrire ici le périmètre de l'audit",
"children": [],
"level": 2
},
{
"id": 391,
"parentId": 385,
"order": 2,
"title": "Dates de l'audit",
"content": "Noter les dates de début et de cloture",
"children": [],
"level": 2
},
...
],
// sections contained in the conclusion
"conclusion": [
{
"id": 387,
"parentId": null,
"order": 1,
"title": "Synthèse générale",
"content": "Décrire ici le niveau global de conformité",
"level": 1
},
{
"id": 388,
"parentId": null,
"order": 2,
"title": "Points forts",
"content": null,
"level": 1
},
{
"id": 389,
"parentId": null,
"order": 3,
"title": "Pistes d'amélioration",
"content": null,
"level": 1
}
],
// sections contenues dans le bloc-notes
"notepad": [...]
}
}
Détails du schéma de données des revues
actionplan
Si un plan d'action a été importé pour l'audit, l'objet actionplan expose les informations liées au plan d'action et aux revues.
json
{
"id": 4,
"draft": false,
"auditId": 11,
// liste des correctifs constituant le plan d'action
"correctives": [...],
// liste des revues liées à l'audit
"reviews": [...]
}
Pour voir le détail des formats de chaque liste, consultez :
- le paragraphe correctives
- le paragraphe reviews
correctives
Le tableau correctives dans l'objet actionplan permet de visualiser tous les correctifs liés au plan d'action.
json
{
// identifiant unique du correctif
"id": 28,
// texte décrivant la correction à apporter
"text": "This recommendation should be fixed",
// échéance
"deadline": "2021-05-18",
// responsable de l'action
"assignee": "Mike Wazowski",
// statut du correctif : **true** (corrigé), **false** (ouvert) ou **null** (non évalué)
"corrected": null,
// la recommandation associée à ce correctif
"recoId": 58,
"recoOrder": 1,
"reco": {
...
},
// le site que concerne ce correctif
"site": {
"id": 5,
"name": "Global"
},
// l'exigence associée à la recommandation ayant donnée lieu au correctif
"requirement": {
"id": 79,
"reference": "4.1.1",
"title": "Enjeux",
"description": "L’organisation doit déterminer les enjeux externes et internes pertinents compte tenu de sa mission et qui influent sur sa capacité à obtenir le(s) résultat(s) attendu(s) de son système de management de la sécurité de l’information."
},
// la liste des actions de revue ayant été réalisées pour ce correctif
"reviews": [
{
// identifiant unique de cette action de revue
"id": 1,
// texte saisi pour le correctif lors de l'action de revue
"text": "<p>In progress. Should soon be fixed</p>",
// indique si le correctif est appliqué (true) ou non (false)
"corrected": false,
// échéance de la prochaine action de revue
"deadline": "2022-02-01",
// numéro de la revue
"order": 1,
// statut de la revue : false (terminée), true (en cours)
"open": false,
// id du correctif sur lequel s'applique cette action de revue
"correctiveId": 8
},
{
"id": 12,
"text": "<p>Finally corrected !</p>",
"corrected": true,
"deadline": null,
"order": 2,
"open": true,
"correctiveId": 8
},
...
]
},
Pour le détail du format du champ reco, consulter le paragraphe allRecommendations
reviews
Si un plan d'action a été importé pour l'audit, et qu'au moins une revue a été crée, le tableau reviews expose la liste des revues liées à l'audit.
json
[
{
// identifiant unique de la revue
"id": 4,
// numéro de la revue
"order": 1,
// définit si la revue est en cours (true) ou fermée (false)
"open": false
},
{
"id": 5,
"order": 2,
"open": true
}
],
Trier et filtrer les données du rapport
Auditool met à dispositions quelques opérateurs permettant de trier et de filtrer les données directement dans le modèle de rapport.
Trier une liste
L'opérateur | sort: permet de trier une liste en fonction d'une ou plusieurs clés, par ordre ascendant ou descendant.
Chaque clé doit correspondre à un champ présent dans les données de la liste.
Pour indiquer l'ordre ascendant il faut utiliser +, et pour l'ordre descendant -.
Par exemple, pour trier maliste par clé1 ascendante puis clé2 descendante et clé3 descendante, il faut utiliser la syntaxe suivante :
{#maliste | sort:'clé1+':'clé2-':'clé3-'}
Deux opérateurs supplémentaires sont disponibles, afin de faciliter le tri des assessments
et des recommendations
:
- | sortAssess: qui va trier les assessments d'abord sur la clé fournie, puis sur le champ
ncRef
, et enfin sur le champorder
- | sortReco: qui va trier les recommendations d'abord sur la clé fournie, puis sur le champ
siteId
, et enfin sur le champref
Par exemple, pour trier tous les assessements sur le champ 'clé' ascendant :
{#allAssessments | sortAssess:'clé+'}
Pour trier des recommendations sur le champ 'clé' descendant :
{#allRecommendations | sortReco:'clé-'}
Filtrer une liste
L'opérateur | where: permet filtrer une liste, afin de ne conserver que les éléments qui respectent une condition donnée.
Par exemple, pour ne conserver que les assessments dont le status est supérieur à 2, il faut utiliser :
{#allAssessments | where:'status > 2'}
Récupérer la longueur d'une liste triée ou filtrée
L'opérateur | length permet de récupérer le nombre d'éléments d'une liste. Il est très utile couplé à l'opérateur where.
Par exemple pour afficher le nombre de recommandation dont le niveau de risque est CRITIQUE, on peut écrire dans le template :
{#allRecommendations | where:'risklevel===4' | length}{.}{/}
Pour afficher le texte "Liste des risques critiques" s'il existe des recommandations dont le niveau de risque est CRITIQUE :
{#allRecommendations | where:'risklevel===4' | length}
{#.}Liste des risques critiques{/}
{/}
Appliquer des conditions sur une liste triée ou filtrée
L'opérateur | items permet de récupérer la liste des éléments résultat d'un tri ou d'un filtre. Il est assez similaire à l'opérateur length, à cela près qu'il renvoie les éléments de la liste, afin d'appliquer des conditions (sur sa longueur par exemple).
Pour afficher les findings, s'il y a plus d'une recommandation de niveau CRITIQUE, on peut écrire dans le template :
{#allRecommendations | where:'risklevel===4' | items}
{#items.length > 1}
Au moins 2 recommandations de niveau critique :
{#items}
- {findings}
{/}
{/}
{/}
Pagination dans les rapports PPTX
Une pagination est disponible pour les listes. Elle est principalement destinée à la génération de slides dans les rapports PPTX.
L'opérateur | paginate: permet de découper une liste en pages de n élements.
Par exemple, pour générer des slides contenant chacun 4 assessments :
{:allAssessments | paginate:4} Assessments {pageNum}/{pagesCount}
Les champs disponibles à l'intérieur de ce tag sont :
- pageNum : le numéro de la page courante
- pagesCount : le nombre de pages totales (ie: le nombre d'élément de la liste divisé par le nombre d'élements par page)
- itemsCount : le nombre total d'élements dans l'ensemble des pages
- items : la liste des n élements de la page (nb : la dernière page peut contenir moins de n éléments)
Un deuxième opérateur de pagination est disponible : | paginateBy:.
Il est identique à paginate, et permet donc de découper une liste en pages de n éléments, mais il va automatiquement changer de page lorsque la valeur des champs définis en paramètre changent dans les éléments. Cet opérateur nécessite donc que les élément de la liste contiennent les champs définis.
Par exemple, pour créer une page par site et par catégorie, avec maximum 2 recommandations par page :
{:sites | subloop:'allCategories.recommendations' | paginateBy:'id':'allCategories.order':2}
Site : {items[0].name}
Catégorie : {items[0].ref}
page : {pageNumBy} sur {pagesCountBy}
{#items}
{recommendations.ref}-{recommendations.title} : {recommendations.findings}
{/}
{/}
Mise en page avancée
Modifier les couleurs en utilisant celles des échelles
Lors de la génération d'un rapport Word, il est possible de définir la couleur d'un arrière-plan ou d'une police dynamiquement.
Deux fonctions sont proposées pour cela :
styles.setColor()
styles.setBackgroundColor()
L'exemple ci-dessous affiche le status d'une évaluation, avec une police de la couleur du status (telle que définie dans l'échelle) :
{#allAssessments}
{:stylepar styles.setColor(statusColor)}{statusName}
{/allAssessments}
Il est également possible de changer la couleur d'arrière-plan :
{#allAssessments}
{:stylepar styles.setBackgroundColor(statusColor)}{statusName}
{/allAssessments}
Il est possible de cumuler les deux fonctions. L'exemple suivant met le texte en blanc, et l'arrière-plan de la couleur de l'échelle :
{#allAssessments}
{:stylepar styles.setColor('white')}{:stylepar styles.setBackgroundColor(statusColor)}{statusName}
{/allAssessments}
Il est également possible de changer les couleurs d'autres éléments. Par exemple pour l'arrière-plan d'une cellule de tableau :
{:stylecell styles.setBackgroundColor(statusColor)}{statusName}
L'ensemble des éléments pouvant être modifiés est décrit ici : https://docxtemplater.com/modules/styling/