<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.hercule.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Damien</id>
	<title>YoWiki - Contributions de l’utilisateur [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hercule.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Damien"/>
	<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php/Sp%C3%A9cial:Contributions/Damien"/>
	<updated>2026-05-07T13:37:56Z</updated>
	<subtitle>Contributions de l’utilisateur</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1214</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1214"/>
		<updated>2026-05-07T08:26:44Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:ordinal&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version ordinale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3e&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;Troisième&amp;lt;/code&amp;gt; etc. &lt;br /&gt;
Ce traitement accepte deux paramètres optionnels : &lt;br /&gt;
: - 1. le paramètre de genre : &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;Premier&amp;quot;, ou 1 =&amp;gt; &amp;quot;Première&amp;quot; par exemple.&lt;br /&gt;
: - 2. le format (par défaut : &amp;quot;short&amp;quot; si rien n'est indiqué). Le format &amp;quot;short&amp;quot; correspond à 1er/1re/2e/3e… La format &amp;quot;old&amp;quot; correspond à l'ancien format (1er/1ère/2ème/3ème…). Et finalement, le format &amp;quot;long&amp;quot;, correspond à la version en toutes lettres (Premier/Première/Deuxième/Vingt et unième…).&lt;br /&gt;
: '''''Exemple :''''' &lt;br /&gt;
:: &amp;lt;code&amp;gt;{1:ordinal}&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;1re&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;{5:ordinal}&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;5e&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;{1:ordinal('m')}&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;1er&amp;lt;/code&amp;gt;&lt;br /&gt;
:: &amp;lt;code&amp;gt;{1:ordinal('m', 'long')}&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;premier&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:date-format&amp;lt;/code&amp;gt; : permet de forcer l'affichage d'une chaine sous forme de date, ou pour formater une date dans un format différent. &lt;br /&gt;
:: Par défaut, si aucun paramètre n'est précisé, le format &amp;quot;dd/MM/yyyy&amp;quot; sera utilisé.&lt;br /&gt;
:: Un paramètre peut être fourni pour indiquer le format souhaité ([https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax voir la norme Unicode ici]). &lt;br /&gt;
:: Ex: &amp;lt;code&amp;gt;MA_DATE:date-format('d MMMM yyyy')&amp;lt;/code&amp;gt; pour afficher la date avec le mois en toutes lettres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-of(LISTE, 'SOUSVAR')&amp;lt;/code&amp;gt; permet d'obtenir l'élément d'une liste à partir de sa clé (équivalent d'un &amp;lt;code&amp;gt;get_value(…)&amp;lt;/code&amp;gt; côté SmartDoc). Le premier paramètre correspond à la liste concernée, et le deuxième (facultatif) à l'éventuelle sous-variable à récupérer.&amp;lt;br/&amp;gt; &lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;BEST_EMPLOYEE_KEY:item-of(EMPLOYES, 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-by-key(LISTE)&amp;lt;/code&amp;gt; est équivalent au &amp;lt;code&amp;gt;:item-of&amp;lt;/code&amp;gt; précédent mais permet d'obtenir un élément grâce à l'index et non pas de sa clé. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;3:item-by-key(EMPLOYES_NAMES)&amp;lt;/code&amp;gt; (obtenir le 3ème noms de la liste). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
:: '''Options de pagination d'un paragraphe'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-next: true&amp;lt;/code&amp;gt; : si cette option est à &amp;quot;true&amp;quot;, le paragraphe concerné sera sur la même page que le paragraphe suivant, et sinon ils passeront, tous deux, sur la page suivante (option Word &amp;quot;Paragraphes solidaires&amp;quot;).  &lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-lines: true&amp;lt;/code&amp;gt; : le paragraphe ne se divise pas sur deux pages différentes (option Word &amp;quot;Lignes solidaires&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
:: '''Appliquer un style Word (du volet de styles)'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;style-name: mon-style&amp;lt;/code&amp;gt; : permet d'utiliser directement un style Word prédéfinie dans le Volet de Styles du docx-template. Cette méthode permet de couvrir l'ensemble des besoins complexes, notamment ceux des listes à puces (choix de la numérotation, du type de puce, de la couleur, des options de césures etc. directement sous Word via le docx-template, et simplement appliqué sur l'élément du SmartDoc via &amp;lt;code&amp;gt;style-name&amp;lt;/code&amp;gt;). Notez que si le nom du style sous Word contient un espace, un point-virgule, un point, ou autre type de caractère particulier, il se peut qu'il ne soit pas reconnu par le SmartDoc, vous pouvez néanmoins librement utiliser les tirets, underscores, chiffres, lettres etc. pour nommer le style dans le Volet de Styles. &lt;br /&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1213</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1213"/>
		<updated>2026-05-06T15:52:32Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:ordinal&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version ordinale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:date-format&amp;lt;/code&amp;gt; : permet de forcer l'affichage d'une chaine sous forme de date, ou pour formater une date dans un format différent. &lt;br /&gt;
:: Par défaut, si aucun paramètre n'est précisé, le format &amp;quot;dd/MM/yyyy&amp;quot; sera utilisé.&lt;br /&gt;
:: Un paramètre peut être fourni pour indiquer le format souhaité ([https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax voir la norme Unicode ici]). &lt;br /&gt;
:: Ex: &amp;lt;code&amp;gt;MA_DATE:date-format('d MMMM yyyy')&amp;lt;/code&amp;gt; pour afficher la date avec le mois en toutes lettres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-of(LISTE, 'SOUSVAR')&amp;lt;/code&amp;gt; permet d'obtenir l'élément d'une liste à partir de sa clé (équivalent d'un &amp;lt;code&amp;gt;get_value(…)&amp;lt;/code&amp;gt; côté SmartDoc). Le premier paramètre correspond à la liste concernée, et le deuxième (facultatif) à l'éventuelle sous-variable à récupérer.&amp;lt;br/&amp;gt; &lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;BEST_EMPLOYEE_KEY:item-of(EMPLOYES, 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-by-key(LISTE)&amp;lt;/code&amp;gt; est équivalent au &amp;lt;code&amp;gt;:item-of&amp;lt;/code&amp;gt; précédent mais permet d'obtenir un élément grâce à l'index et non pas de sa clé. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;3:item-by-key(EMPLOYES_NAMES)&amp;lt;/code&amp;gt; (obtenir le 3ème noms de la liste). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
:: '''Options de pagination d'un paragraphe'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-next: true&amp;lt;/code&amp;gt; : si cette option est à &amp;quot;true&amp;quot;, le paragraphe concerné sera sur la même page que le paragraphe suivant, et sinon ils passeront, tous deux, sur la page suivante (option Word &amp;quot;Paragraphes solidaires&amp;quot;).  &lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-lines: true&amp;lt;/code&amp;gt; : le paragraphe ne se divise pas sur deux pages différentes (option Word &amp;quot;Lignes solidaires&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
:: '''Appliquer un style Word (du volet de styles)'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;style-name: mon-style&amp;lt;/code&amp;gt; : permet d'utiliser directement un style Word prédéfinie dans le Volet de Styles du docx-template. Cette méthode permet de couvrir l'ensemble des besoins complexes, notamment ceux des listes à puces (choix de la numérotation, du type de puce, de la couleur, des options de césures etc. directement sous Word via le docx-template, et simplement appliqué sur l'élément du SmartDoc via &amp;lt;code&amp;gt;style-name&amp;lt;/code&amp;gt;). Notez que si le nom du style sous Word contient un espace, un point-virgule, un point, ou autre type de caractère particulier, il se peut qu'il ne soit pas reconnu par le SmartDoc, vous pouvez néanmoins librement utiliser les tirets, underscores, chiffres, lettres etc. pour nommer le style dans le Volet de Styles. &lt;br /&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1212</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1212"/>
		<updated>2026-03-05T12:29:17Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Fusionner plusieurs listes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;nom_de_la_fonction( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;nom_de_la_fonction&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;min 2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - De 2 à N : la clé de l'élément antérieur ;&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ],&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00 ]&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Ajouter une valeur dans une liste plate =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;add_to_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 à N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] plate (ex: [&amp;quot;jaune&amp;quot;, &amp;quot;vert&amp;quot;, &amp;quot;bleu&amp;quot;]) ;&lt;br /&gt;
## - La valeur à ajouter à la liste (string, nombre…) ;&lt;br /&gt;
&lt;br /&gt;
'''''Usage'''''&lt;br /&gt;
&lt;br /&gt;
:: Soit la liste plate PRODUITS qui vaut [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;] :&lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;] (la nouvelle valeur est ajoutée à la fin). &lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;] (on peut passer autant de valeur qu'on le souhaite à la fonction, elles seront ajoutées à la fin).&lt;br /&gt;
&lt;br /&gt;
'''''Usage avancé'''''&lt;br /&gt;
:: Cette fonction peut-être très utile, combinée à un [[Instructions de Boucle dans une Variable Dynamique (DynVar Loop Statement)|#reduce]], pour fabriquer des listes plates dynamiques.&lt;br /&gt;
:: Par exemple, si je veux lister les prénoms des associés ayant plus de 25% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 25 ? add_to_list(_PREV, ASSOCIE_ITEM.PRENOM) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
''Renvoie par exemple : [&amp;quot;Olivier&amp;quot;, &amp;quot;Bruno&amp;quot;]''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Ou, autre exemple, lister les clés des associés qui ont plus de 50% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 30 ? add_to_list(_PREV, _KEY) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
''Renvoie par exemple : [&amp;quot;_abc123&amp;quot;, &amp;quot;_ac9876&amp;quot;]''&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tranformer une liste en chaine de caractère (jointure) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur de jointure (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;code&amp;gt;join(COULEURS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;jaune, rouge, bleu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Fusionner plusieurs listes =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;merge_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - 2 ou N listes (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
:: Si une clé existe dans la liste 1 et la liste 2, la valeur de la liste 1 sera remplacée par celle de la liste 2. &lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   &amp;lt;code&amp;gt;merge(GERANTS, MANDATS_NOMINATION)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir uniquement les clés d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;keys_only&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - une liste structurée (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GERANTS&amp;lt;/code&amp;gt;). Ne fonctionne pas pour les listes plates (renvoie NULL).&lt;br /&gt;
:: Pour la liste ASSOCIES_PRESENTS de la forme : &amp;lt;code&amp;gt;{ &amp;quot;_abc123&amp;quot; =&amp;gt; { &amp;quot;NOM&amp;quot;: &amp;quot;Damien&amp;quot; }, &amp;quot;_xyz975&amp;quot; =&amp;gt; { &amp;quot;NOM&amp;quot;: &amp;quot;Léo&amp;quot; } }&amp;lt;/code&amp;gt;&lt;br /&gt;
:: Le résultat de  &amp;lt;code&amp;gt;keys_only(ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt; sera &amp;lt;code&amp;gt;[&amp;quot;_abc123&amp;quot;, &amp;quot;_xyz975&amp;quot;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1211</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1211"/>
		<updated>2025-11-26T14:35:47Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Ajouter une valeur dans une liste plate */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;nom_de_la_fonction( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;nom_de_la_fonction&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;min 2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - De 2 à N : la clé de l'élément antérieur ;&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ],&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00 ]&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Ajouter une valeur dans une liste plate =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;add_to_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 à N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] plate (ex: [&amp;quot;jaune&amp;quot;, &amp;quot;vert&amp;quot;, &amp;quot;bleu&amp;quot;]) ;&lt;br /&gt;
## - La valeur à ajouter à la liste (string, nombre…) ;&lt;br /&gt;
&lt;br /&gt;
'''''Usage'''''&lt;br /&gt;
&lt;br /&gt;
:: Soit la liste plate PRODUITS qui vaut [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;] :&lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;] (la nouvelle valeur est ajoutée à la fin). &lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;] (on peut passer autant de valeur qu'on le souhaite à la fonction, elles seront ajoutées à la fin).&lt;br /&gt;
&lt;br /&gt;
'''''Usage avancé'''''&lt;br /&gt;
:: Cette fonction peut-être très utile, combinée à un [[Instructions de Boucle dans une Variable Dynamique (DynVar Loop Statement)|#reduce]], pour fabriquer des listes plates dynamiques.&lt;br /&gt;
:: Par exemple, si je veux lister les prénoms des associés ayant plus de 25% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 25 ? add_to_list(_PREV, ASSOCIE_ITEM.PRENOM) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
''Renvoie par exemple : [&amp;quot;Olivier&amp;quot;, &amp;quot;Bruno&amp;quot;]''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Ou, autre exemple, lister les clés des associés qui ont plus de 50% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 30 ? add_to_list(_PREV, _KEY) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
''Renvoie par exemple : [&amp;quot;_abc123&amp;quot;, &amp;quot;_ac9876&amp;quot;]''&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tranformer une liste en chaine de caractère (jointure) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur de jointure (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;code&amp;gt;join(COULEURS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;jaune, rouge, bleu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Fusionner plusieurs listes =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;merge_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - 2 ou N listes (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
:: Si une clé existe dans la liste 1 et la liste 2, la valeur de la liste 1 sera remplacée par celle de la liste 2. &lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   &amp;lt;code&amp;gt;merge(GERANTS, MANDATS_NOMINATION)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1210</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1210"/>
		<updated>2025-11-26T14:35:23Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Assigner un nouveau couple clé-valeur dans une liste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;nom_de_la_fonction( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;nom_de_la_fonction&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;min 2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - De 2 à N : la clé de l'élément antérieur ;&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ],&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00 ]&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ajouter une valeur dans une liste plate ====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;add_to_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 à N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] plate (ex: [&amp;quot;jaune&amp;quot;, &amp;quot;vert&amp;quot;, &amp;quot;bleu&amp;quot;]) ;&lt;br /&gt;
## - La valeur à ajouter à la liste (string, nombre…) ;&lt;br /&gt;
&lt;br /&gt;
'''''Usage'''''&lt;br /&gt;
&lt;br /&gt;
:: Soit la liste plate PRODUITS qui vaut [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;] :&lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;] (la nouvelle valeur est ajoutée à la fin). &lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;] (on peut passer autant de valeur qu'on le souhaite à la fonction, elles seront ajoutées à la fin).&lt;br /&gt;
&lt;br /&gt;
'''''Usage avancé'''''&lt;br /&gt;
:: Cette fonction peut-être très utile, combinée à un [[Instructions de Boucle dans une Variable Dynamique (DynVar Loop Statement)|#reduce]], pour fabriquer des listes plates dynamiques.&lt;br /&gt;
:: Par exemple, si je veux lister les prénoms des associés ayant plus de 25% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 25 ? add_to_list(_PREV, ASSOCIE_ITEM.PRENOM) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
''Renvoie par exemple : [&amp;quot;Olivier&amp;quot;, &amp;quot;Bruno&amp;quot;]''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Ou, autre exemple, lister les clés des associés qui ont plus de 50% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 30 ? add_to_list(_PREV, _KEY) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
''Renvoie par exemple : [&amp;quot;_abc123&amp;quot;, &amp;quot;_ac9876&amp;quot;]''&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tranformer une liste en chaine de caractère (jointure) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur de jointure (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;code&amp;gt;join(COULEURS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;jaune, rouge, bleu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Fusionner plusieurs listes =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;merge_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - 2 ou N listes (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
:: Si une clé existe dans la liste 1 et la liste 2, la valeur de la liste 1 sera remplacée par celle de la liste 2. &lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   &amp;lt;code&amp;gt;merge(GERANTS, MANDATS_NOMINATION)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1209</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1209"/>
		<updated>2025-11-26T14:31:02Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Ajouter une valeur dans une liste plate */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;nom_de_la_fonction( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;nom_de_la_fonction&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;min 2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - De 2 à N : la clé de l'élément antérieur ;&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ],&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00 ]&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### Ajouter une valeur dans une liste plate&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;add_to_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 à N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] plate (ex: [&amp;quot;jaune&amp;quot;, &amp;quot;vert&amp;quot;, &amp;quot;bleu&amp;quot;]) ;&lt;br /&gt;
## - La valeur à ajouter à la liste (string, nombre…) ;&lt;br /&gt;
&lt;br /&gt;
'''''Usage'''''&lt;br /&gt;
&lt;br /&gt;
:: Soit la liste plate PRODUITS qui vaut [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;] :&lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;] (la nouvelle valeur est ajoutée à la fin). &lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;] (on peut passer autant de valeur qu'on le souhaite à la fonction, elles seront ajoutées à la fin).&lt;br /&gt;
&lt;br /&gt;
'''''Usage avancé'''''&lt;br /&gt;
:: Cette fonction peut-être très utile, combinée à un [[Instructions de Boucle dans une Variable Dynamique (DynVar Loop Statement)|#reduce]], pour fabriquer des listes plates dynamiques.&lt;br /&gt;
:: Par exemple, si je veux lister les prénoms des associés ayant plus de 25% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 25 ? add_to_list(_PREV, ASSOCIE_ITEM.PRENOM) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:: Ou, autre exemple, lister les clés des associés qui ont plus de 50% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 30 ? add_to_list(_PREV, _KEY) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tranformer une liste en chaine de caractère (jointure) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur de jointure (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;code&amp;gt;join(COULEURS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;jaune, rouge, bleu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Fusionner plusieurs listes =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;merge_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - 2 ou N listes (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
:: Si une clé existe dans la liste 1 et la liste 2, la valeur de la liste 1 sera remplacée par celle de la liste 2. &lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   &amp;lt;code&amp;gt;merge(GERANTS, MANDATS_NOMINATION)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1208</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1208"/>
		<updated>2025-11-26T14:30:00Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Assigner un nouveau couple clé-valeur dans une liste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;nom_de_la_fonction( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;nom_de_la_fonction&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;min 2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - De 2 à N : la clé de l'élément antérieur ;&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ],&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00 ]&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Ajouter une valeur dans une liste plate =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;add_to_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 à N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] plate (ex: [&amp;quot;jaune&amp;quot;, &amp;quot;vert&amp;quot;, &amp;quot;bleu&amp;quot;]) ;&lt;br /&gt;
## - La valeur à ajouter à la liste (string, nombre…) ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&lt;br /&gt;
:: Soit la liste plate PRODUITS qui vaut [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;] :&lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;] (la nouvelle valeur est ajoutée à la fin). &lt;br /&gt;
:: - &amp;lt;code&amp;gt;add_to_list(PRODUITS, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste [&amp;quot;voiture&amp;quot;, &amp;quot;sac&amp;quot;, &amp;quot;pomme&amp;quot;, &amp;quot;poire&amp;quot;] (on peut passer autant de valeur qu'on le souhaite à la fonction, elles seront ajoutées à la fin).&lt;br /&gt;
&lt;br /&gt;
'''Usage avancé'''&lt;br /&gt;
:: Cette fonction peut-être très utile, combinée à un [[Instructions de Boucle dans une Variable Dynamique (DynVar Loop Statement)|#reduce]], pour fabriquer des listes plates dynamiques.&lt;br /&gt;
:: Par exemple, si je veux lister les prénoms des associés ayant plus de 25% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 25 ? add_to_list(_PREV, ASSOCIE_ITEM.PRENOM) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:: Ou, autre exemple, lister les clés des associés qui ont plus de 50% des parts :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#reduce list ASSOCIES as ASSOCIE_ITEM, [] as _PREV :&lt;br /&gt;
ASSOCIE_ITEM.PARTS &amp;gt; 30 ? add_to_list(_PREV, _KEY) : _PREV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tranformer une liste en chaine de caractère (jointure) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur de jointure (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;code&amp;gt;join(COULEURS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;jaune, rouge, bleu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Fusionner plusieurs listes =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;merge_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - 2 ou N listes (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
:: Si une clé existe dans la liste 1 et la liste 2, la valeur de la liste 1 sera remplacée par celle de la liste 2. &lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   &amp;lt;code&amp;gt;merge(GERANTS, MANDATS_NOMINATION)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1207</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1207"/>
		<updated>2025-11-22T13:34:53Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Fonctions sur des listes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;nom_de_la_fonction( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;nom_de_la_fonction&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;min 2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - De 2 à N : la clé de l'élément antérieur ;&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ],&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00 ]&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tranformer une liste en chaine de caractère (jointure) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur de jointure (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;code&amp;gt;join(COULEURS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;jaune, rouge, bleu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Fusionner plusieurs listes =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;merge_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - 2 ou N listes (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
:: Si une clé existe dans la liste 1 et la liste 2, la valeur de la liste 1 sera remplacée par celle de la liste 2. &lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   &amp;lt;code&amp;gt;merge(GERANTS, MANDATS_NOMINATION)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1206</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1206"/>
		<updated>2025-11-22T13:32:55Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Fonctions sur des listes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;nom_de_la_fonction( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;nom_de_la_fonction&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;min 2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - De 2 à N : la clé de l'élément antérieur ;&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ],&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00 ]&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tranformer une liste en chaine de caractère (jointure) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur de jointure (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;code&amp;gt;join(COULEURS, &amp;quot;, &amp;quot;)&amp;lt;code&amp;gt; donnera &amp;quot;jaune, rouge, bleu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir sous-expression =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_expr&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
## - D'éventuels paramètres pour la sous-expression, paramètres au format numérique ou chaine de caractères, qui seront accessbible via les variables PARAM1, PARAM2, PARAM3 etc. &lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont plus de 30 ans :&lt;br /&gt;
::   &amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; 30&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
::   &lt;br /&gt;
::   &amp;lt;p&amp;gt;Pour obtenir ce même filtre avec un age dynamique :&amp;lt;/p&amp;gt;&lt;br /&gt;
::   &amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_expr(ASSOCIES, &amp;quot;ITEM.AGE &amp;gt; PARAM1&amp;quot;, AGE_MAX)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Fusionner plusieurs listes =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;merge_list&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou N&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - 2 ou N listes (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
:: Si une clé existe dans la liste 1 et la liste 2, la valeur de la liste 1 sera remplacée par celle de la liste 2. &lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::   &amp;lt;code&amp;gt;merge(GERANTS, MANDATS_NOMINATION)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1205</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1205"/>
		<updated>2025-11-22T11:38:53Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Obtenir la valeur d'un élément d'une liste à partir d'une clé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;nom_de_la_fonction( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;nom_de_la_fonction&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;min 2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - De 2 à N : la clé de l'élément antérieur ;&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ],&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00 ]&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Montrer et organiser les valeurs d'une liste (à rerédiger plus parfaitement) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1204</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1204"/>
		<updated>2025-11-19T14:22:42Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:date-format&amp;lt;/code&amp;gt; : permet de forcer l'affichage d'une chaine sous forme de date, ou pour formater une date dans un format différent. &lt;br /&gt;
:: Par défaut, si aucun paramètre n'est précisé, le format &amp;quot;dd/MM/yyyy&amp;quot; sera utilisé.&lt;br /&gt;
:: Un paramètre peut être fourni pour indiquer le format souhaité ([https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax voir la norme Unicode ici]). &lt;br /&gt;
:: Ex: &amp;lt;code&amp;gt;MA_DATE:date-format('d MMMM yyyy')&amp;lt;/code&amp;gt; pour afficher la date avec le mois en toutes lettres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-of(LISTE, 'SOUSVAR')&amp;lt;/code&amp;gt; permet d'obtenir l'élément d'une liste à partir de sa clé (équivalent d'un &amp;lt;code&amp;gt;get_value(…)&amp;lt;/code&amp;gt; côté SmartDoc). Le premier paramètre correspond à la liste concernée, et le deuxième (facultatif) à l'éventuelle sous-variable à récupérer.&amp;lt;br/&amp;gt; &lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;BEST_EMPLOYEE_KEY:item-of(EMPLOYES, 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-by-key(LISTE)&amp;lt;/code&amp;gt; est équivalent au &amp;lt;code&amp;gt;:item-of&amp;lt;/code&amp;gt; précédent mais permet d'obtenir un élément grâce à l'index et non pas de sa clé. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;3:item-by-key(EMPLOYES_NAMES)&amp;lt;/code&amp;gt; (obtenir le 3ème noms de la liste). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
:: '''Options de pagination d'un paragraphe'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-next: true&amp;lt;/code&amp;gt; : si cette option est à &amp;quot;true&amp;quot;, le paragraphe concerné sera sur la même page que le paragraphe suivant, et sinon ils passeront, tous deux, sur la page suivante (option Word &amp;quot;Paragraphes solidaires&amp;quot;).  &lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-lines: true&amp;lt;/code&amp;gt; : le paragraphe ne se divise pas sur deux pages différentes (option Word &amp;quot;Lignes solidaires&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
:: '''Appliquer un style Word (du volet de styles)'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;style-name: mon-style&amp;lt;/code&amp;gt; : permet d'utiliser directement un style Word prédéfinie dans le Volet de Styles du docx-template. Cette méthode permet de couvrir l'ensemble des besoins complexes, notamment ceux des listes à puces (choix de la numérotation, du type de puce, de la couleur, des options de césures etc. directement sous Word via le docx-template, et simplement appliqué sur l'élément du SmartDoc via &amp;lt;code&amp;gt;style-name&amp;lt;/code&amp;gt;). Notez que si le nom du style sous Word contient un espace, un point-virgule, un point, ou autre type de caractère particulier, il se peut qu'il ne soit pas reconnu par le SmartDoc, vous pouvez néanmoins librement utiliser les tirets, underscores, chiffres, lettres etc. pour nommer le style dans le Volet de Styles. &lt;br /&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1203</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1203"/>
		<updated>2025-08-22T14:04:51Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Styles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:date-format&amp;lt;/code&amp;gt; : permet de forcer l'affichage d'une chaine sous forme de date, ou pour formater une date dans un format différent. &lt;br /&gt;
:: Par défaut, si aucun paramètre n'est précisé, le format &amp;quot;dd/MM/yyyy&amp;quot; sera utilisé.&lt;br /&gt;
:: Un paramètre peut être fourni pour indiquer le format souhaité ([https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax voir la norme Unicode ici]). &lt;br /&gt;
:: Ex: &amp;lt;code&amp;gt;MA_DATE:date-format('d MMMM Y')&amp;lt;/code&amp;gt; pour afficher la date avec le mois en toutes lettres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-of(LISTE, 'SOUSVAR')&amp;lt;/code&amp;gt; permet d'obtenir l'élément d'une liste à partir de sa clé (équivalent d'un &amp;lt;code&amp;gt;get_value(…)&amp;lt;/code&amp;gt; côté SmartDoc). Le premier paramètre correspond à la liste concernée, et le deuxième (facultatif) à l'éventuelle sous-variable à récupérer.&amp;lt;br/&amp;gt; &lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;BEST_EMPLOYEE_KEY:item-of(EMPLOYES, 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-by-key(LISTE)&amp;lt;/code&amp;gt; est équivalent au &amp;lt;code&amp;gt;:item-of&amp;lt;/code&amp;gt; précédent mais permet d'obtenir un élément grâce à l'index et non pas de sa clé. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;3:item-by-key(EMPLOYES_NAMES)&amp;lt;/code&amp;gt; (obtenir le 3ème noms de la liste). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
:: '''Options de pagination d'un paragraphe'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-next: true&amp;lt;/code&amp;gt; : si cette option est à &amp;quot;true&amp;quot;, le paragraphe concerné sera sur la même page que le paragraphe suivant, et sinon ils passeront, tous deux, sur la page suivante (option Word &amp;quot;Paragraphes solidaires&amp;quot;).  &lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-lines: true&amp;lt;/code&amp;gt; : le paragraphe ne se divise pas sur deux pages différentes (option Word &amp;quot;Lignes solidaires&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
:: '''Appliquer un style Word (du volet de styles)'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;style-name: mon-style&amp;lt;/code&amp;gt; : permet d'utiliser directement un style Word prédéfinie dans le Volet de Styles du docx-template. Cette méthode permet de couvrir l'ensemble des besoins complexes, notamment ceux des listes à puces (choix de la numérotation, du type de puce, de la couleur, des options de césures etc. directement sous Word via le docx-template, et simplement appliqué sur l'élément du SmartDoc via &amp;lt;code&amp;gt;style-name&amp;lt;/code&amp;gt;). Notez que si le nom du style sous Word contient un espace, un point-virgule, un point, ou autre type de caractère particulier, il se peut qu'il ne soit pas reconnu par le SmartDoc, vous pouvez néanmoins librement utiliser les tirets, underscores, chiffres, lettres etc. pour nommer le style dans le Volet de Styles. &lt;br /&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1202</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1202"/>
		<updated>2025-08-22T13:54:01Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Styles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:date-format&amp;lt;/code&amp;gt; : permet de forcer l'affichage d'une chaine sous forme de date, ou pour formater une date dans un format différent. &lt;br /&gt;
:: Par défaut, si aucun paramètre n'est précisé, le format &amp;quot;dd/MM/yyyy&amp;quot; sera utilisé.&lt;br /&gt;
:: Un paramètre peut être fourni pour indiquer le format souhaité ([https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax voir la norme Unicode ici]). &lt;br /&gt;
:: Ex: &amp;lt;code&amp;gt;MA_DATE:date-format('d MMMM Y')&amp;lt;/code&amp;gt; pour afficher la date avec le mois en toutes lettres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-of(LISTE, 'SOUSVAR')&amp;lt;/code&amp;gt; permet d'obtenir l'élément d'une liste à partir de sa clé (équivalent d'un &amp;lt;code&amp;gt;get_value(…)&amp;lt;/code&amp;gt; côté SmartDoc). Le premier paramètre correspond à la liste concernée, et le deuxième (facultatif) à l'éventuelle sous-variable à récupérer.&amp;lt;br/&amp;gt; &lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;BEST_EMPLOYEE_KEY:item-of(EMPLOYES, 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-by-key(LISTE)&amp;lt;/code&amp;gt; est équivalent au &amp;lt;code&amp;gt;:item-of&amp;lt;/code&amp;gt; précédent mais permet d'obtenir un élément grâce à l'index et non pas de sa clé. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;3:item-by-key(EMPLOYES_NAMES)&amp;lt;/code&amp;gt; (obtenir le 3ème noms de la liste). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
:: '''Options de pagination d'un paragraphe'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-next: true&amp;lt;/code&amp;gt; : si cette option est à &amp;quot;true&amp;quot;, le paragraphe concerné sera sur la même page que le paragraphe suivant, et sinon ils passeront, tous deux, sur la page suivante (option Word &amp;quot;Paragraphes solidaires&amp;quot;).  &lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-lines: true&amp;lt;/code&amp;gt; : le paragraphe ne se divise pas sur deux pages différentes (option Word &amp;quot;Lignes solidaires&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
:: '''Appliquer un style Word (du volet de styles)'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;style-name: mon-style&amp;lt;/code&amp;gt; : permet d'utiliser directement un style Word prédéfinie dans le Volet de Styles du docx-template. Cette méthode permet de couvrir l'ensemble des besoins complexes, notamment ceux des listes à puces (choix de la numérotation, du type de puce, de la couleur, des options de césures etc. directement sous Word via le docx-template, et simplement appliqué sur l'élément du SmartDoc via &amp;lt;code&amp;gt;style-name&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1201</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1201"/>
		<updated>2025-08-20T00:41:18Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Styles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:date-format&amp;lt;/code&amp;gt; : permet de forcer l'affichage d'une chaine sous forme de date, ou pour formater une date dans un format différent. &lt;br /&gt;
:: Par défaut, si aucun paramètre n'est précisé, le format &amp;quot;dd/MM/yyyy&amp;quot; sera utilisé.&lt;br /&gt;
:: Un paramètre peut être fourni pour indiquer le format souhaité ([https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax voir la norme Unicode ici]). &lt;br /&gt;
:: Ex: &amp;lt;code&amp;gt;MA_DATE:date-format('d MMMM Y')&amp;lt;/code&amp;gt; pour afficher la date avec le mois en toutes lettres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-of(LISTE, 'SOUSVAR')&amp;lt;/code&amp;gt; permet d'obtenir l'élément d'une liste à partir de sa clé (équivalent d'un &amp;lt;code&amp;gt;get_value(…)&amp;lt;/code&amp;gt; côté SmartDoc). Le premier paramètre correspond à la liste concernée, et le deuxième (facultatif) à l'éventuelle sous-variable à récupérer.&amp;lt;br/&amp;gt; &lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;BEST_EMPLOYEE_KEY:item-of(EMPLOYES, 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-by-key(LISTE)&amp;lt;/code&amp;gt; est équivalent au &amp;lt;code&amp;gt;:item-of&amp;lt;/code&amp;gt; précédent mais permet d'obtenir un élément grâce à l'index et non pas de sa clé. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;3:item-by-key(EMPLOYES_NAMES)&amp;lt;/code&amp;gt; (obtenir le 3ème noms de la liste). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
:: '''Options de pagination d'un paragraphe'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-next: true&amp;lt;/code&amp;gt; : si cette option est à &amp;quot;true&amp;quot;, le paragraphe concerné sera sur la même page que le paragraphe suivant, et sinon ils passeront, tous deux, sur la page suivante (option Word &amp;quot;Paragraphes solidaires&amp;quot;).  &lt;br /&gt;
:::: &amp;lt;code&amp;gt;keep-lines: true&amp;lt;/code&amp;gt; : le paragraphe ne se divise pas sur deux pages différentes (option Word &amp;quot;Lignes solidaires&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1200</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1200"/>
		<updated>2025-07-03T15:43:09Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Principes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;nom_de_la_fonction( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;nom_de_la_fonction&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou 3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à cibler ;&lt;br /&gt;
## - Dans le cas d'une liste &amp;quot;structurée&amp;quot; (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Montrer et organiser les valeurs d'une liste (à rerédiger plus parfaitement) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1199</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1199"/>
		<updated>2025-04-07T09:07:17Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:date-format&amp;lt;/code&amp;gt; : permet de forcer l'affichage d'une chaine sous forme de date, ou pour formater une date dans un format différent. &lt;br /&gt;
:: Par défaut, si aucun paramètre n'est précisé, le format &amp;quot;dd/MM/yyyy&amp;quot; sera utilisé.&lt;br /&gt;
:: Un paramètre peut être fourni pour indiquer le format souhaité ([https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax voir la norme Unicode ici]). &lt;br /&gt;
:: Ex: &amp;lt;code&amp;gt;MA_DATE:date-format('d MMMM Y')&amp;lt;/code&amp;gt; pour afficher la date avec le mois en toutes lettres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-of(LISTE, 'SOUSVAR')&amp;lt;/code&amp;gt; permet d'obtenir l'élément d'une liste à partir de sa clé (équivalent d'un &amp;lt;code&amp;gt;get_value(…)&amp;lt;/code&amp;gt; côté SmartDoc). Le premier paramètre correspond à la liste concernée, et le deuxième (facultatif) à l'éventuelle sous-variable à récupérer.&amp;lt;br/&amp;gt; &lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;BEST_EMPLOYEE_KEY:item-of(EMPLOYES, 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:item-by-key(LISTE)&amp;lt;/code&amp;gt; est équivalent au &amp;lt;code&amp;gt;:item-of&amp;lt;/code&amp;gt; précédent mais permet d'obtenir un élément grâce à l'index et non pas de sa clé. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: '''''Exemple :''''' &amp;lt;code&amp;gt;3:item-by-key(EMPLOYES_NAMES)&amp;lt;/code&amp;gt; (obtenir le 3ème noms de la liste). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1198</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1198"/>
		<updated>2025-04-07T08:56:07Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Obtenir la valeur d'un élément d'une liste à partir d'une clé dynamique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;MA_FONCTION( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;MA_FONCTION&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou 3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à cibler ;&lt;br /&gt;
## - Dans le cas d'une liste &amp;quot;structurée&amp;quot; (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.&lt;br /&gt;
&lt;br /&gt;
::'''Cas pratique'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   [&lt;br /&gt;
     '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,&lt;br /&gt;
     '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00&lt;br /&gt;
   ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
::Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
::::- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value_by_index&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - L'index de l'élément à retourner (1,2,3…)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Cette fonction est similaire au &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; mais en utilisant l'index de l'élément au lieu de sa clé. &lt;br /&gt;
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement &amp;quot;en dur&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
:::: '''''Exemple sans variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: '''''Exemple avec variable''''' : &amp;lt;code&amp;gt;get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` : &lt;br /&gt;
:: '''''Exemple''''' : Obtenir le &amp;lt;code&amp;gt;NOM&amp;lt;/code&amp;gt; du 3ème employé de la liste &amp;lt;code&amp;gt;EMPLOYES&amp;lt;/code&amp;gt; : &amp;lt;code&amp;gt;get_value( get_value_by_index(EMPLOYES, 3), 'NOM')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Montrer et organiser les valeurs d'une liste (à rerédiger plus parfaitement) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1197</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1197"/>
		<updated>2025-02-12T14:50:49Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Rechercher et remplacer dans une chaîne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;MA_FONCTION( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;MA_FONCTION&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé dynamique =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou 3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à cibler ;&lt;br /&gt;
## - Dans le cas d'une liste &amp;quot;structurée&amp;quot; (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.&lt;br /&gt;
&lt;br /&gt;
'''Cas pratique'''&lt;br /&gt;
&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
 '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,&lt;br /&gt;
 '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Montrer et organiser les valeurs d'une liste (à rerédiger plus parfaitement) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de liste (paramètre obligatoire) ;&lt;br /&gt;
## - Séparateur (facultatif) ; &lt;br /&gt;
## - Dernier séparateur (facultatif) ; &lt;br /&gt;
## - Préfixe (facultatif) ; &lt;br /&gt;
## - Suffixe (facultatif)&lt;br /&gt;
&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible de combiner &amp;quot;join&amp;quot; avec la fonction &amp;quot;filter_by_keys&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;\t - &amp;quot;, &amp;quot; ; \n&amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1196</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1196"/>
		<updated>2025-01-31T14:53:50Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:date-format&amp;lt;/code&amp;gt; : permet de forcer l'affichage d'une chaine sous forme de date, ou pour formater une date dans un format différent. &lt;br /&gt;
:: Par défaut, si aucun paramètre n'est précisé, le format &amp;quot;dd/MM/yyyy&amp;quot; sera utilisé.&lt;br /&gt;
:: Un paramètre peut être fourni pour indiquer le format souhaité ([https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax voir la norme Unicode ici]). &lt;br /&gt;
:: Ex: &amp;lt;code&amp;gt;MA_DATE:date-format('d MMMM Y')&amp;lt;/code&amp;gt; pour afficher la date avec le mois en toutes lettres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1195</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1195"/>
		<updated>2025-01-31T14:49:19Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:date-format&amp;lt;/code&amp;gt; : permet de forcer l'affichage d'une chaine sous forme de date, ou pour formater une date dans un format différent. &lt;br /&gt;
:: Par défaut, si aucun paramètre n'est précisé, le format &amp;quot;dd/MM/yyyy&amp;quot; sera utilisé.&lt;br /&gt;
:: Un paramètre peut être fourni pour indiquer le format souhaité (voir [[la norme Unicode ici|https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax]]). Ex: &amp;lt;code&amp;gt;MA_DATE:date-format('d MMMM Y')&amp;lt;/code&amp;gt; pour afficher la date avec le mois en toutes lettres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1193</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1193"/>
		<updated>2025-01-28T01:29:49Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Obtenir une copie filtrée d'une liste à partir d'une série de clés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;MA_FONCTION( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;MA_FONCTION&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée et remplacée. Par défaut, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés et remplacés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé dynamique =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou 3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à cibler ;&lt;br /&gt;
## - Dans le cas d'une liste &amp;quot;structurée&amp;quot; (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.&lt;br /&gt;
&lt;br /&gt;
'''Cas pratique'''&lt;br /&gt;
&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
 '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,&lt;br /&gt;
 '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
::'''Exemple de paramétrage :'''&lt;br /&gt;
::&amp;lt;p&amp;gt;Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot; :&amp;lt;/p&amp;gt;&lt;br /&gt;
::&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1192</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1192"/>
		<updated>2025-01-28T01:27:57Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Fonctions sur des listes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;MA_FONCTION( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;MA_FONCTION&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée et remplacée. Par défaut, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés et remplacés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé dynamique =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou 3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à cibler ;&lt;br /&gt;
## - Dans le cas d'une liste &amp;quot;structurée&amp;quot; (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.&lt;br /&gt;
&lt;br /&gt;
'''Cas pratique'''&lt;br /&gt;
&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
 '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,&lt;br /&gt;
 '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;filter_by_keys&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une liste avec des clés et des valeurs (ex: &amp;lt;code&amp;gt;ASSOCIES&amp;lt;/code&amp;gt;);&lt;br /&gt;
## - Une liste de clés ;&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : Pour obtenir une liste des associés avec uniquement ceux qui ont été cochés comme &amp;quot;présents&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Treatment&amp;diff=1191</id>
		<title>Treatment</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Treatment&amp;diff=1191"/>
		<updated>2024-11-13T15:00:04Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Types d'instructions de traitement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&lt;br /&gt;
[[File:Exemple-traitements.png|thumb|droite|400px|Exemple d'une table de traitements avec différents types d'instruction (et des commentaires explicatifs).]]&lt;br /&gt;
&lt;br /&gt;
Une table de traitement est un liste d'instruction qui peuvent s'appliquer sur un Dataset, permettant de transformer les données existantes.&lt;br /&gt;
Les traitements sont déclenchés manuellement par l'application (via un Thème par exemple).&lt;br /&gt;
&lt;br /&gt;
Une Configuration peut définir plusieurs table de traitements, chacune ayant un identifiant unique (une chaîne de caractère, sans espace).&lt;br /&gt;
&lt;br /&gt;
Les instructions de la table de traitement sont exécutés dans l'ordre de le lecture.&lt;br /&gt;
&lt;br /&gt;
= Types d'instructions de traitement =&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs &amp;quot;types&amp;quot; d'instructions de traitement :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;. Instruction la plus élémentaire, elle consiste à '''assigner une nouvelle valeur''' à une variable à partir d'une SmartExpression fournie. La SmartExpression peut faire appel à d'autres variables du Dataset, mais aussi à d'éventuelles [[Variables_dynamiques_(DynVars)|DynVars]]. Ce type d'assignation ne peut s'appliquer que sur une variable simple (de premier niveau).  &lt;br /&gt;
:::: - Voir [[Media:Treat-ex-set-1.png|exemple illustré n°1]].&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-set-2.png|exemple illustré n°2]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;unset&amp;lt;/code&amp;gt; '''Forcer à null la valeur d'une variable'''. À l'inverse de l'instruction précédente, cette instruction permet de &amp;quot;vider&amp;quot; la valeur de la variable spécifiée. Si cette instruction est appliquée sur une variable de type &amp;quot;liste&amp;quot; alors la liste sera vidée de tous ses éléments (sous-variables etc.).&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-unset.png|exemple illustré]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;set-all&amp;lt;/code&amp;gt;. '''L'assignation multiple''' consiste à assigner une valeur à une sous-variable, pour TOUS les éléments d'une liste. La valeur est calculée à partir d'une SmartExpression qui peut faire appel à d'autres variables du Dataset, ainsi qu'à d'éventuelles [[Variables_dynamiques_(DynVars)|DynVars]]. La sous-variable ciblée est indiquée sous la forme de sa définition (Ex: ''EMPLOYÉS.DATE_ENTRÉE''). Il est aussi possible d'utiliser dans l'expression deux variables spéciales &amp;lt;code&amp;gt;_KEY&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;_INDEX&amp;lt;/code&amp;gt; qui prennent la valeur correspondante (respectivement la clé, ou l'index) à chaque sous élément de la liste.   &lt;br /&gt;
:::: - Voir [[Media:Treat-ex-setall-1.png|exemple illustré n°1]].&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-setall-2.png|exemple illustré n°2]].&lt;br /&gt;
:: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;add-in-list&amp;lt;/code&amp;gt;. '''L'ajout ou la mise à jour d'un élément spécifique dans une liste'''. Pour une variable de liste (Ex: EMPLOYÉS), ce type d'instruction permet d'ajouter une nouvelle entrée dans la liste (ou d'éditer une entrée existante) et aussi de définir la valeur des  potentielles sous-variables. &lt;br /&gt;
&lt;br /&gt;
:::: Par défaut, si aucune clé n'est définie, un nouvel élément est rajouté dans la liste. &lt;br /&gt;
&lt;br /&gt;
:::: Si une SmartExpression est fournie, et que sa valeur correspond à la clé d'un élément existant de la liste, alors cet élément sera ciblé et mis-à-jour au lieu qu'un nouvel élément soit rajouté à la fin de la liste. &lt;br /&gt;
&lt;br /&gt;
:::: Dans le cas d'une Liste Structurée (ex: EMPLOYÉS), les lignes suivantes dans la table permettront de définir la valeur à assigner aux sous-variables. Elles seront indiquée sous une forme simplifiée, sans re-citer la variable de liste, et donc reconnaissable car débutant par un &amp;quot;.&amp;quot; (ex: &amp;lt;code&amp;gt;.DATE_ENTRÉE&amp;lt;/code&amp;gt; pour définir la valeur de &amp;lt;code&amp;gt;EMPLOYÉ.DATE_ENTRÉE&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
:::: Dans le cas d'une Liste Plate (ex: LIST_COULEURS), qui n'a pas de sous-variables par nature, il faudra utiliser la syntaxe &amp;lt;code&amp;gt;._VALUE&amp;lt;/code&amp;gt;  pour définir la valeur à rajouter dans la liste. &lt;br /&gt;
&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-add-1.png|exemple illustré n°1]] (ajout).&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-add-2a.png|exemple illustré n°2]] (remplacement).&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-add-3.png|exemple illustré n°3]] (ajout liste plate). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;remove-in-list&amp;lt;/code&amp;gt; '''Le retrait d'un élément dans une liste'''. Pour une variable de liste (Ex: EMPLOYÉS), ce type d'instruction permet de supprimer une entrée en fonction d'une clé fournie au travers de la SmartExpression. &lt;br /&gt;
:::: Si la SmartExpression renvoie une liste plate de clés, alors chacune des clés citée seront retirées (si elles existent dans la liste bien sûr). Cela permet d'effectuer une suppression &amp;quot;multiple&amp;quot;. &lt;br /&gt;
:::: - Voir [[Media:Treat-ex-remove.png|exemple illustré]] (suppression).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; '''La fusion d'une liste sur une autre liste'''. La variable ciblée, de type &amp;quot;liste&amp;quot;, se verra fusionnée à la liste renvoyée par la SmartExpression. Les valeurs indiquées dans cette dernière viendront donc remplacer les valeurs existantes dans la liste ciblée. De plus, si une des deux listes contient des éléments que l'autre liste ne connait pas (identifiés par leurs clés), alors ils seront rajoutés au résultat. &lt;br /&gt;
:::: Dans le cas de listes structurées, il est bien entendu nécéssaire que les deux listes soient similaires au niveau des définitions de leurs sous-variables. En effet, si la liste 2 définie des sous-variables qui n'existent pas dans la liste 1, après la fusion, la liste 1 va se retrouver avec des variables qu'elle ne connait pas, et cela posera un problème d'intégrité résultant en une erreur (fusion nulle). &lt;br /&gt;
::: - Voir exemple illustré (@TODO).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;merge-through-key&amp;lt;/code&amp;gt; '''La fusion d'une liste 1 sur une liste 2, au travers d'une clé spécifiée dans la liste 2'''. Très similaire à l'instruction de fusion précédente, ce type de traitement permet de spécifier la clé de fusion de chaque élément. &lt;br /&gt;
:::: La clé de fusion est indiquée avec la syntaxe &amp;lt;code&amp;gt;through key SUBVAR&amp;lt;/code&amp;gt;, où &amp;lt;code&amp;gt;SUBVAR&amp;lt;/code&amp;gt; est une sous-variable de la liste 2, ayant pour valeur une clé de la liste 1. Ce type de fusion est particulièrement utile dans le cas d'une mise à jour ciblée des éléments d'une liste.&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-merge-through-key.png|exemple illustré]] (exemple avec cumul de traitement). Dans l'exemple illustré, prenez note du retour chariot (obligatoire) entre &amp;quot;EMPLOYÉS&amp;quot; et &amp;quot;through&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Treatment&amp;diff=1190</id>
		<title>Treatment</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Treatment&amp;diff=1190"/>
		<updated>2024-11-13T14:55:39Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Types d'instructions de traitement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&lt;br /&gt;
[[File:Exemple-traitements.png|thumb|droite|400px|Exemple d'une table de traitements avec différents types d'instruction (et des commentaires explicatifs).]]&lt;br /&gt;
&lt;br /&gt;
Une table de traitement est un liste d'instruction qui peuvent s'appliquer sur un Dataset, permettant de transformer les données existantes.&lt;br /&gt;
Les traitements sont déclenchés manuellement par l'application (via un Thème par exemple).&lt;br /&gt;
&lt;br /&gt;
Une Configuration peut définir plusieurs table de traitements, chacune ayant un identifiant unique (une chaîne de caractère, sans espace).&lt;br /&gt;
&lt;br /&gt;
Les instructions de la table de traitement sont exécutés dans l'ordre de le lecture.&lt;br /&gt;
&lt;br /&gt;
= Types d'instructions de traitement =&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs &amp;quot;types&amp;quot; d'instructions de traitement :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;. Instruction la plus élémentaire, elle consiste à '''assigner une nouvelle valeur''' à une variable à partir d'une SmartExpression fournie. La SmartExpression peut faire appel à d'autres variables du Dataset, mais aussi à d'éventuelles [[Variables_dynamiques_(DynVars)|DynVars]]. Ce type d'assignation ne peut s'appliquer que sur une variable simple (de premier niveau).  &lt;br /&gt;
:::: - Voir [[Media:Treat-ex-set-1.png|exemple illustré n°1]].&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-set-2.png|exemple illustré n°2]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;unset&amp;lt;/code&amp;gt; '''Forcer à null la valeur d'une variable'''. À l'inverse de l'instruction précédente, cette instruction permet de &amp;quot;vider&amp;quot; la valeur de la variable spécifiée. Si cette instruction est appliquée sur une variable de type &amp;quot;liste&amp;quot; alors la liste sera vidée de tous ses éléments (sous-variables etc.).&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-unset.png|exemple illustré]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;set-all&amp;lt;/code&amp;gt;. '''L'assignation multiple''' consiste à assigner une valeur à une sous-variable, pour TOUS les éléments d'une liste. La valeur est calculée à partir d'une SmartExpression qui peut faire appel à d'autres variables du Dataset, ainsi qu'à d'éventuelles [[Variables_dynamiques_(DynVars)|DynVars]]. La sous-variable ciblée est indiquée sous la forme de sa définition (Ex: ''EMPLOYÉS.DATE_ENTRÉE''). Il est aussi possible d'utiliser dans l'expression deux variables spéciales &amp;lt;code&amp;gt;_KEY&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;_INDEX&amp;lt;/code&amp;gt; qui prennent la valeur correspondante (respectivement la clé, ou l'index) à chaque sous élément de la liste.   &lt;br /&gt;
:::: - Voir [[Media:Treat-ex-setall-1.png|exemple illustré n°1]].&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-setall-2.png|exemple illustré n°2]].&lt;br /&gt;
:: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;add-in-list&amp;lt;/code&amp;gt;. '''L'ajout ou la mise à jour d'un élément spécifique dans une liste'''. Pour une variable de liste (Ex: EMPLOYÉS), ce type d'instruction permet d'ajouter une nouvelle entrée dans la liste et de définir sa valeur et celle de toutes ses potentielles sous-variables. &lt;br /&gt;
&lt;br /&gt;
:::: Par défaut, si aucune clé n'est définie, un nouvel élément est rajouté dans la liste. &lt;br /&gt;
&lt;br /&gt;
:::: Si une SmartExpression est fournie, et que sa valeur correspond à la clé d'un élément existant de la liste, alors cet élément sera ciblé et mis-à-jour au lieu qu'un nouvel élément soit rajouté à la fin de la liste. &lt;br /&gt;
&lt;br /&gt;
:::: Dans le cas d'une Liste Structurée (ex: EMPLOYÉS), les lignes suivantes dans la table permettront de définir la valeur à assigner aux sous-variables. Elles seront indiquée sous une forme simplifiée, sans re-citer la variable de liste, et donc reconnaissable car débutant par un &amp;quot;.&amp;quot; (ex: &amp;lt;code&amp;gt;.DATE_ENTRÉE&amp;lt;/code&amp;gt; pour définir la valeur de &amp;lt;code&amp;gt;EMPLOYÉ.DATE_ENTRÉE&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
:::: Dans le cas d'une Liste Plate (ex: LIST_COULEURS), qui n'a pas de sous-variables par nature, il faudra utiliser la syntaxe &amp;lt;code&amp;gt;._VALUE&amp;lt;/code&amp;gt;  pour définir la valeur à rajouter dans la liste. &lt;br /&gt;
&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-add-1.png|exemple illustré n°1]] (ajout).&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-add-2a.png|exemple illustré n°2]] (remplacement).&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-add-3.png|exemple illustré n°3]] (ajout liste plate). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;remove-in-list&amp;lt;/code&amp;gt; '''Le retrait d'un élément dans une liste'''. Pour une variable de liste (Ex: EMPLOYÉS), ce type d'instruction permet de supprimer une entrée en fonction d'une clé fournie au travers de la SmartExpression. &lt;br /&gt;
:::: Si la SmartExpression renvoie une liste plate de clés, alors chacune des clés citée seront retirées (si elles existent dans la liste bien sûr). Cela permet d'effectuer une suppression &amp;quot;multiple&amp;quot;. &lt;br /&gt;
:::: - Voir [[Media:Treat-ex-remove.png|exemple illustré]] (suppression).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; '''La fusion d'une liste sur une autre liste'''. La variable ciblée, de type &amp;quot;liste&amp;quot;, se verra fusionnée à la liste renvoyée par la SmartExpression. Les valeurs indiquées dans cette dernière viendront donc remplacer les valeurs existantes dans la liste ciblée. De plus, si une des deux listes contient des éléments que l'autre liste ne connait pas (identifiés par leurs clés), alors ils seront rajoutés au résultat. &lt;br /&gt;
:::: Dans le cas de listes structurées, il est bien entendu nécéssaire que les deux listes soient similaires au niveau des définitions de leurs sous-variables. En effet, si la liste 2 définie des sous-variables qui n'existent pas dans la liste 1, après la fusion, la liste 1 va se retrouver avec des variables qu'elle ne connait pas, et cela posera un problème d'intégrité résultant en une erreur (fusion nulle). &lt;br /&gt;
::: - Voir exemple illustré (@TODO).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;merge-through-key&amp;lt;/code&amp;gt; '''La fusion d'une liste 1 sur une liste 2, au travers d'une clé spécifiée dans la liste 2'''. Très similaire à l'instruction de fusion précédente, ce type de traitement permet de spécifier la clé de fusion de chaque élément. &lt;br /&gt;
:::: La clé de fusion est indiquée avec la syntaxe &amp;lt;code&amp;gt;through key SUBVAR&amp;lt;/code&amp;gt;, où &amp;lt;code&amp;gt;SUBVAR&amp;lt;/code&amp;gt; est une sous-variable de la liste 2, ayant pour valeur une clé de la liste 1. Ce type de fusion est particulièrement utile dans le cas d'une mise à jour ciblée des éléments d'une liste.&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-merge-through-key.png|exemple illustré]] (exemple avec cumul de traitement). Dans l'exemple illustré, prenez note du retour chariot (obligatoire) entre &amp;quot;EMPLOYÉS&amp;quot; et &amp;quot;through&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Fichier:Treat-ex-add-3.png&amp;diff=1189</id>
		<title>Fichier:Treat-ex-add-3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Fichier:Treat-ex-add-3.png&amp;diff=1189"/>
		<updated>2024-11-13T14:55:03Z</updated>

		<summary type="html">&lt;p&gt;Damien : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exemple de traitement add-in-list sur une liste plate&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1188</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1188"/>
		<updated>2024-05-31T13:32:35Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Fonctions sur les Nombres */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;MA_FONCTION( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;MA_FONCTION&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Formater un nombre en chaîne de caractère =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;numFormat&amp;lt;/code&amp;gt; &lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mais seulement le 1er est obligatoire.&lt;br /&gt;
# Paramètres : &lt;br /&gt;
## - (numérique) le nombre à formater (obligatoire)&lt;br /&gt;
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)&lt;br /&gt;
## - (string) le caractère pour le séparateur des milliers (ex: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot; &amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: &amp;lt;code&amp;gt;&amp;quot;.&amp;quot;&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt; etc.). Par défaut: &amp;lt;code&amp;gt;&amp;quot;,&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Le fonctionnement est très similaire au traitement &amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; des SmartDocs.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(1003.1415, 2)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;1 003,14&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(8133003.1415, 0)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8 133 003&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3500.999)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3 500,999&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;numFormat(3000.50, 4, ',', '.')&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;3,500.5000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée et remplacée. Par défaut, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés et remplacés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé dynamique =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou 3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à cibler ;&lt;br /&gt;
## - Dans le cas d'une liste &amp;quot;structurée&amp;quot; (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.&lt;br /&gt;
&lt;br /&gt;
'''Cas pratique'''&lt;br /&gt;
&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
 '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,&lt;br /&gt;
 '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1187</id>
		<title>Sections-Form</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1187"/>
		<updated>2024-05-09T19:16:29Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Option &amp;quot;autoaddress&amp;quot; (Google Places) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;sections-form&amp;quot;&amp;gt;Sections-Form&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Wiki-sections.png|vignette|right|Schéma récapitulatif de l'imbrication des différents types de section d'un SmartForm |redresse=0.75]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Qu'est ce qu'une section ?&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections du formulaire servent à organiser son contenu. Il existe 3 types de sections qui permettent d'organiser visuellement vos champs de formulaire : `chapter` , `slide` et `area`. &lt;br /&gt;
&lt;br /&gt;
Plusieurs bénéfices à organiser proprement un formulaire dynamique : &lt;br /&gt;
&lt;br /&gt;
- Pour les très longs formulaires, il est recommandé de mettre en place des chapitres (section de type &amp;quot;&amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt;&amp;quot;). Les chapitres sont visuellement indépendants les uns des autres ce qui laisse la possibilité à l'utilisateur de commencer par le chapitre de son choix. Ce découpage permet d'améliorer l'ergonomie et de mieux se repérer lors de la navigation. Le découpage en chapitre n'est pas obligatoire et créer un formulaire d'un seul chapitre est assez courant. &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;quot;&amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;&amp;quot; permettent de découper votre formulaire en plusieurs page/écran. Cette organisation est plus digeste pour les utilisateurs qui peuvent alors répondre étape par étape. Un menu visuel permet de se situer et de connaitre les &amp;quot;slides&amp;quot; passées et à venir lors du remplissage. Autre avantage de ce type de section : le contenu de la page étant sauvegardée lors du passage à la suivante, l'utilisateur pourra revenir plus tard sur son formulaire sans que sa saisie ne soit perdue. &lt;br /&gt;
&lt;br /&gt;
- Notez qu'en groupant les champs du formulaire au sein d'une même section, vous pouvez facilement les faire apparaitre ou disparaitre en plaçant une condition (&amp;lt;code&amp;gt;visibleIf&amp;lt;/code&amp;gt;) directement sur la section et non plus sur le champ. C'est le principal cas d'usage du type de section &amp;quot;&amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;&amp;quot;, qui ne vise qu'à grouper des champs entre eux. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Imbriquer les sections et structurer son formulaire &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections répondent à une hiérarchie stricte et logique : &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;chapter&amp;quot;&amp;lt;/code&amp;gt; sont celles de plus haut niveau, et ne peuvent contenir que des sous-sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;slide&amp;quot;&amp;lt;/code&amp;gt; peuvent être héritées d'une section &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou directement placées à la racine du formulaire. Ces sections correspondent aux pages du formulaire, il y a donc obligatoirement une section de ce type dans le formulaire. Ce type de section contient des sous-sections de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; mais il est possible de directement assigner des champs de saisie à une &amp;quot;slide&amp;quot; pour s'économiser la création d'une &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; inutile (pour information, techniquement, si des champs sont assignés à une &amp;quot;slide&amp;quot; alors une section &amp;quot;area&amp;quot; par défaut sera créée pour les contenir au sein de la page). &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; sont obligatoirement héritées d'une section de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;. Ces sections ont deux utilités principales : grouper des champs entre eux pour conditionner facilement leur affichage, ou, enrichir le formulaire avec des contenus au format HTML (voir plus bas rubrique #HTML).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;À noter :&amp;lt;/b&amp;gt; les sections ne peuvent pas être vides. Elles doivent, soit contenir des champs (pour le cas des sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;), soit contenir des sous-sections (pour le cas des sections de type &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;). ⚠️ Une exception cependant : les section de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; peuvent être vides si un contenu HTML est spécifié (utile pour enrichir le formulaire avec des contenus contextuels conditionnés à d'autres champs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;section-params&amp;quot;&amp;gt;Paramétrages des sections et attributs&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections d'un formulaire peuvent être paramétrées via la feuille &amp;lt;code&amp;gt; &amp;quot;Sections-Form &amp;quot;...&amp;quot; &amp;lt;/code&amp;gt; du tableur de configuration. &lt;br /&gt;
Elles doivent être définies dans l'ordre d'apparition souhaité. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;section-id&amp;quot;&amp;gt;Section Id&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne précise le nom de la section (soit un chapitre soit un slide). Il s’agit d’une chaîne alphanumérique sans accent et sans espace. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Elle sert de référence à l’intégralité du moteur pour identifier de manière unique les différents chapitres et slides qui apparaîtront dans le formulaire. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier un chapitre ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque chapitre est défini par un identifiant unique. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cet identifiant est défini librement par l'utilisateur, la seule restriction étant qu'il ne peut pas contenir de point &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier une slide ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque slide est défini par un identifiant unique.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est la concaténation de l’identifiant unique du chapitre auquel il appartient ET d’un identifiant unique à cette slide (le tout séparé par un point sans espace).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le format est donc chapter.slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Parties.id.png|thumbs|1000px|néant]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dans cet exemple, la slide &amp;lt;code&amp;gt;identification&amp;lt;/code&amp;gt; est à l’intérieur du chapter &amp;lt;code&amp;gt;parties&amp;lt;/code&amp;gt;. Son nom reflète cette hiérarchie : &amp;lt;code&amp;gt;parties.identification&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;type-de-section&amp;quot;&amp;gt;Type de section&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une section peut soit être un chapitre soit un slide. Le premier est ainsi défini par le mot chapter et le second par le mot slide dans ‘Type de section’. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le chapitre est le niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs slides.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le slide est le second niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs champs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple de Chapitres : &lt;br /&gt;
[[Fichier:Exemple chapter.png|frame|none|Exemple de chapter]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple d’une Slide, à l’intérieur du Chapter “Informations sur le produit” :&lt;br /&gt;
[[Fichier:Une slide.png|thumb|none|750px|La slide &amp;quot;au sujet du produit acheté&amp;quot; à l'intérieur du chapter &amp;quot;informations sur le produit&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;titre&amp;quot;&amp;gt;Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “libellé” : c’est l’intitulé du chapitre ou de la slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est obligatoire.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;sous-titre&amp;quot;&amp;gt;Sous-Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Permet de définir un sous-titre, qui apparaîtra en dessous du titre.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est facultatif.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;icon&amp;quot;&amp;gt;Icon&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ n’est utilisable que si la section est de type “Chapter”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il a pour but de personnaliser le questionnaire en associant une icône au chapter, pour aboutir à un rendu tel que dans l’exemple ci-dessous.&lt;br /&gt;
[[Fichier:Exemple icons.png|frame|none|Exemple d'icônes paramétrées via le champ &amp;quot;Icon&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les icônes à gauche de “Votre activité” et “Le Franchiseur” ont été paramétrées grâce au champ “Icon” du fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser une icône, il suffit de remplir le champ “Icon” de la manière suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;fa fa-NOMDEL’ICÔNE&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’icône en question doit être gratuite &amp;amp;amp; disponible sur le site de [https://fontawesome.com/v4.7.0/icons/ FontAwesome].&amp;lt;/p&amp;gt;&lt;br /&gt;
'''Attention : le SmartBundle ne supporte que les icônes fontawesome jusqu'à la version 4.7.0, consultables sur ce [https://fontawesome.com/v4.7.0/icons/ lien]'''&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “NOMDEL’ICÔNE” est la chaîne de caractères utilisée par FontAwesome.&lt;br /&gt;
&amp;lt;strong&amp;gt;Exemple : &amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Guide pas-à-pas : &amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Aller sur [https://fontawesome.com/v4.7.0/icons/ FontAwesome]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Rechercher son icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Search icon.png|frame|none|Rechercher son icône]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Copier l’identifiant de l’icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
Ici, l’identifiant de cette icône de drapeau est “flag”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Remplir le champ dans le fichier de paramétrage&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour avoir cette icône de drapeau dans le questionnaire, on remplira donc le champ Icon de la manière suivante : &lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;fa fa-flag&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;visible-if&amp;quot;&amp;gt;Visible if&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne permet de définir les conditions d’apparition de la section en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Son fonctionnement est similaire au reste du système : voir le fonctionnement des [[Conditions|Visible ifs]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;html&amp;quot;&amp;gt;HTML&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''Coming Soon''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;repeater&amp;quot;&amp;gt;Repeater&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le fonctionnement des repeaters est détaillé [[Repeaters|ici]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Option &amp;quot;autoaddress&amp;quot; (Google Places) ===&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;autoaddress&amp;quot;, à placer dans la colonne &amp;quot;Options&amp;quot; d'un SectionForm, va permettre à l'utilisateur de pré-remplir les champs relatifs à une adresse depuis un champ de saisie automatique (autocomplete) basé sur les données fournies par Google Places. &lt;br /&gt;
&lt;br /&gt;
Côté interface, cette option fera apparaitre un bouton au niveau du titre de la section (area). Au clic sur ce bouton, une fenêtre modale apparait permettant à l'utilisateur de saisir un texte. Lors de la saisie, plusieurs suggestions seront proposées. Une fois qu'une suggestion est sélectionné par l'utilisateur, la fenêtre se referme et les champs du formulaire sont alors pré-remplis avec les données correspondantes à la suggestion choisie.&lt;br /&gt;
&lt;br /&gt;
L'utilisation de cette option est possible uniquement sur une section de type '''''area'''''. &lt;br /&gt;
&lt;br /&gt;
Cette option est à configurer au format [https://geekflare.com/fr/yaml-introduction/ YAML], c'est à dire sous la forme ''&amp;quot;attribut: valeur&amp;quot;'' et avec des indentations (4 espaces) pour identifier les sous-attributs. &lt;br /&gt;
Les sous-attributs sont tous facultatifs et permettent de spécifier quelle valeur doit être injectée dans tel ou tel champ. &lt;br /&gt;
Les types de valeurs possibles sont : &lt;br /&gt;
:: - &amp;lt;code&amp;gt;street_number&amp;lt;/code&amp;gt; : numéro de rue (ex: 31)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;route&amp;lt;/code&amp;gt; : type et nom de rue (ex: ''Rue du Four'', ou ''Avenue Charles-de-Gaulle'') &lt;br /&gt;
:: - &amp;lt;code&amp;gt;plain_address&amp;lt;/code&amp;gt; : numéro, type et nom de rue. (ex: ''156, Avenue Charles-de-Gaulle'')&lt;br /&gt;
:: - &amp;lt;code&amp;gt;postal_code&amp;lt;/code&amp;gt; : code postal (ex: 34700, 75009 …)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;locality&amp;lt;/code&amp;gt; : commune (ex: Paris, Montpellier…)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;country&amp;lt;/code&amp;gt; : pays (ex: France) &lt;br /&gt;
:: - &amp;lt;code&amp;gt;country_code&amp;lt;/code&amp;gt; : code pays, [https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes en deux lettres, ISO_3166])&lt;br /&gt;
:: - &amp;lt;code&amp;gt;administrative_area_level_1&amp;lt;/code&amp;gt; : en France, la région (ex: Occitanie)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;administrative_area_level_2&amp;lt;/code&amp;gt; : en France, le département (ex: Hérault) &lt;br /&gt;
&lt;br /&gt;
:: Exemple de configuration : &amp;lt;code&amp;gt;&lt;br /&gt;
:::: auto-address:&lt;br /&gt;
:::::: plain_address: EMPLOYE_ADRESSE&lt;br /&gt;
:::::: locality: EMPLOYE_VILLE&lt;br /&gt;
:::::: postal_code: EMPLOYE_CP&lt;br /&gt;
:::::: country_code: EMPLOYE_PAYS_CHOICE&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1186</id>
		<title>Sections-Form</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1186"/>
		<updated>2024-05-09T19:16:10Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Option &amp;quot;autoaddress&amp;quot; (Google Places) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;sections-form&amp;quot;&amp;gt;Sections-Form&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Wiki-sections.png|vignette|right|Schéma récapitulatif de l'imbrication des différents types de section d'un SmartForm |redresse=0.75]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Qu'est ce qu'une section ?&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections du formulaire servent à organiser son contenu. Il existe 3 types de sections qui permettent d'organiser visuellement vos champs de formulaire : `chapter` , `slide` et `area`. &lt;br /&gt;
&lt;br /&gt;
Plusieurs bénéfices à organiser proprement un formulaire dynamique : &lt;br /&gt;
&lt;br /&gt;
- Pour les très longs formulaires, il est recommandé de mettre en place des chapitres (section de type &amp;quot;&amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt;&amp;quot;). Les chapitres sont visuellement indépendants les uns des autres ce qui laisse la possibilité à l'utilisateur de commencer par le chapitre de son choix. Ce découpage permet d'améliorer l'ergonomie et de mieux se repérer lors de la navigation. Le découpage en chapitre n'est pas obligatoire et créer un formulaire d'un seul chapitre est assez courant. &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;quot;&amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;&amp;quot; permettent de découper votre formulaire en plusieurs page/écran. Cette organisation est plus digeste pour les utilisateurs qui peuvent alors répondre étape par étape. Un menu visuel permet de se situer et de connaitre les &amp;quot;slides&amp;quot; passées et à venir lors du remplissage. Autre avantage de ce type de section : le contenu de la page étant sauvegardée lors du passage à la suivante, l'utilisateur pourra revenir plus tard sur son formulaire sans que sa saisie ne soit perdue. &lt;br /&gt;
&lt;br /&gt;
- Notez qu'en groupant les champs du formulaire au sein d'une même section, vous pouvez facilement les faire apparaitre ou disparaitre en plaçant une condition (&amp;lt;code&amp;gt;visibleIf&amp;lt;/code&amp;gt;) directement sur la section et non plus sur le champ. C'est le principal cas d'usage du type de section &amp;quot;&amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;&amp;quot;, qui ne vise qu'à grouper des champs entre eux. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Imbriquer les sections et structurer son formulaire &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections répondent à une hiérarchie stricte et logique : &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;chapter&amp;quot;&amp;lt;/code&amp;gt; sont celles de plus haut niveau, et ne peuvent contenir que des sous-sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;slide&amp;quot;&amp;lt;/code&amp;gt; peuvent être héritées d'une section &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou directement placées à la racine du formulaire. Ces sections correspondent aux pages du formulaire, il y a donc obligatoirement une section de ce type dans le formulaire. Ce type de section contient des sous-sections de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; mais il est possible de directement assigner des champs de saisie à une &amp;quot;slide&amp;quot; pour s'économiser la création d'une &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; inutile (pour information, techniquement, si des champs sont assignés à une &amp;quot;slide&amp;quot; alors une section &amp;quot;area&amp;quot; par défaut sera créée pour les contenir au sein de la page). &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; sont obligatoirement héritées d'une section de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;. Ces sections ont deux utilités principales : grouper des champs entre eux pour conditionner facilement leur affichage, ou, enrichir le formulaire avec des contenus au format HTML (voir plus bas rubrique #HTML).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;À noter :&amp;lt;/b&amp;gt; les sections ne peuvent pas être vides. Elles doivent, soit contenir des champs (pour le cas des sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;), soit contenir des sous-sections (pour le cas des sections de type &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;). ⚠️ Une exception cependant : les section de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; peuvent être vides si un contenu HTML est spécifié (utile pour enrichir le formulaire avec des contenus contextuels conditionnés à d'autres champs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;section-params&amp;quot;&amp;gt;Paramétrages des sections et attributs&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections d'un formulaire peuvent être paramétrées via la feuille &amp;lt;code&amp;gt; &amp;quot;Sections-Form &amp;quot;...&amp;quot; &amp;lt;/code&amp;gt; du tableur de configuration. &lt;br /&gt;
Elles doivent être définies dans l'ordre d'apparition souhaité. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;section-id&amp;quot;&amp;gt;Section Id&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne précise le nom de la section (soit un chapitre soit un slide). Il s’agit d’une chaîne alphanumérique sans accent et sans espace. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Elle sert de référence à l’intégralité du moteur pour identifier de manière unique les différents chapitres et slides qui apparaîtront dans le formulaire. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier un chapitre ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque chapitre est défini par un identifiant unique. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cet identifiant est défini librement par l'utilisateur, la seule restriction étant qu'il ne peut pas contenir de point &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier une slide ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque slide est défini par un identifiant unique.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est la concaténation de l’identifiant unique du chapitre auquel il appartient ET d’un identifiant unique à cette slide (le tout séparé par un point sans espace).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le format est donc chapter.slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Parties.id.png|thumbs|1000px|néant]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dans cet exemple, la slide &amp;lt;code&amp;gt;identification&amp;lt;/code&amp;gt; est à l’intérieur du chapter &amp;lt;code&amp;gt;parties&amp;lt;/code&amp;gt;. Son nom reflète cette hiérarchie : &amp;lt;code&amp;gt;parties.identification&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;type-de-section&amp;quot;&amp;gt;Type de section&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une section peut soit être un chapitre soit un slide. Le premier est ainsi défini par le mot chapter et le second par le mot slide dans ‘Type de section’. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le chapitre est le niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs slides.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le slide est le second niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs champs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple de Chapitres : &lt;br /&gt;
[[Fichier:Exemple chapter.png|frame|none|Exemple de chapter]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple d’une Slide, à l’intérieur du Chapter “Informations sur le produit” :&lt;br /&gt;
[[Fichier:Une slide.png|thumb|none|750px|La slide &amp;quot;au sujet du produit acheté&amp;quot; à l'intérieur du chapter &amp;quot;informations sur le produit&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;titre&amp;quot;&amp;gt;Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “libellé” : c’est l’intitulé du chapitre ou de la slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est obligatoire.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;sous-titre&amp;quot;&amp;gt;Sous-Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Permet de définir un sous-titre, qui apparaîtra en dessous du titre.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est facultatif.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;icon&amp;quot;&amp;gt;Icon&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ n’est utilisable que si la section est de type “Chapter”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il a pour but de personnaliser le questionnaire en associant une icône au chapter, pour aboutir à un rendu tel que dans l’exemple ci-dessous.&lt;br /&gt;
[[Fichier:Exemple icons.png|frame|none|Exemple d'icônes paramétrées via le champ &amp;quot;Icon&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les icônes à gauche de “Votre activité” et “Le Franchiseur” ont été paramétrées grâce au champ “Icon” du fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser une icône, il suffit de remplir le champ “Icon” de la manière suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;fa fa-NOMDEL’ICÔNE&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’icône en question doit être gratuite &amp;amp;amp; disponible sur le site de [https://fontawesome.com/v4.7.0/icons/ FontAwesome].&amp;lt;/p&amp;gt;&lt;br /&gt;
'''Attention : le SmartBundle ne supporte que les icônes fontawesome jusqu'à la version 4.7.0, consultables sur ce [https://fontawesome.com/v4.7.0/icons/ lien]'''&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “NOMDEL’ICÔNE” est la chaîne de caractères utilisée par FontAwesome.&lt;br /&gt;
&amp;lt;strong&amp;gt;Exemple : &amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Guide pas-à-pas : &amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Aller sur [https://fontawesome.com/v4.7.0/icons/ FontAwesome]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Rechercher son icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Search icon.png|frame|none|Rechercher son icône]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Copier l’identifiant de l’icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
Ici, l’identifiant de cette icône de drapeau est “flag”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Remplir le champ dans le fichier de paramétrage&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour avoir cette icône de drapeau dans le questionnaire, on remplira donc le champ Icon de la manière suivante : &lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;fa fa-flag&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;visible-if&amp;quot;&amp;gt;Visible if&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne permet de définir les conditions d’apparition de la section en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Son fonctionnement est similaire au reste du système : voir le fonctionnement des [[Conditions|Visible ifs]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;html&amp;quot;&amp;gt;HTML&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''Coming Soon''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;repeater&amp;quot;&amp;gt;Repeater&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le fonctionnement des repeaters est détaillé [[Repeaters|ici]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Option &amp;quot;autoaddress&amp;quot; (Google Places) ===&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;autoaddress&amp;quot;, à placer dans la colonne &amp;quot;Options&amp;quot; d'un SectionForm, va permettre à l'utilisateur de pré-remplir les champs relatifs à une adresse depuis un champ de saisie automatique (autocomplete) basé sur les données fournies par Google Places. &lt;br /&gt;
&lt;br /&gt;
- Côté interface, cette option fera apparaitre un bouton au niveau du titre de la section (area). Au clic sur ce bouton, une fenêtre modale apparait permettant à l'utilisateur de saisir un texte. Lors de la saisie, plusieurs suggestions seront proposées. Une fois qu'une suggestion est sélectionné par l'utilisateur, la fenêtre se referme et les champs du formulaire sont alors pré-remplis avec les données correspondantes à la suggestion choisie.&lt;br /&gt;
&lt;br /&gt;
- L'utilisation de cette option est possible uniquement sur une section de type '''''area'''''. &lt;br /&gt;
&lt;br /&gt;
- Cette option est à configurer au format [https://geekflare.com/fr/yaml-introduction/ YAML], c'est à dire sous la forme ''&amp;quot;attribut: valeur&amp;quot;'' et avec des indentations (4 espaces) pour identifier les sous-attributs. &lt;br /&gt;
Les sous-attributs sont tous facultatifs et permettent de spécifier quelle valeur doit être injectée dans tel ou tel champ. &lt;br /&gt;
Les types de valeurs possibles sont : &lt;br /&gt;
:: - &amp;lt;code&amp;gt;street_number&amp;lt;/code&amp;gt; : numéro de rue (ex: 31)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;route&amp;lt;/code&amp;gt; : type et nom de rue (ex: ''Rue du Four'', ou ''Avenue Charles-de-Gaulle'') &lt;br /&gt;
:: - &amp;lt;code&amp;gt;plain_address&amp;lt;/code&amp;gt; : numéro, type et nom de rue. (ex: ''156, Avenue Charles-de-Gaulle'')&lt;br /&gt;
:: - &amp;lt;code&amp;gt;postal_code&amp;lt;/code&amp;gt; : code postal (ex: 34700, 75009 …)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;locality&amp;lt;/code&amp;gt; : commune (ex: Paris, Montpellier…)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;country&amp;lt;/code&amp;gt; : pays (ex: France) &lt;br /&gt;
:: - &amp;lt;code&amp;gt;country_code&amp;lt;/code&amp;gt; : code pays, [https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes en deux lettres, ISO_3166])&lt;br /&gt;
:: - &amp;lt;code&amp;gt;administrative_area_level_1&amp;lt;/code&amp;gt; : en France, la région (ex: Occitanie)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;administrative_area_level_2&amp;lt;/code&amp;gt; : en France, le département (ex: Hérault) &lt;br /&gt;
&lt;br /&gt;
:: Exemple de configuration : &amp;lt;code&amp;gt;&lt;br /&gt;
:::: auto-address:&lt;br /&gt;
:::::: plain_address: EMPLOYE_ADRESSE&lt;br /&gt;
:::::: locality: EMPLOYE_VILLE&lt;br /&gt;
:::::: postal_code: EMPLOYE_CP&lt;br /&gt;
:::::: country_code: EMPLOYE_PAYS_CHOICE&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1185</id>
		<title>Sections-Form</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1185"/>
		<updated>2024-05-09T19:06:07Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Option &amp;quot;autoaddress&amp;quot; (Google Places) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;sections-form&amp;quot;&amp;gt;Sections-Form&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Wiki-sections.png|vignette|right|Schéma récapitulatif de l'imbrication des différents types de section d'un SmartForm |redresse=0.75]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Qu'est ce qu'une section ?&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections du formulaire servent à organiser son contenu. Il existe 3 types de sections qui permettent d'organiser visuellement vos champs de formulaire : `chapter` , `slide` et `area`. &lt;br /&gt;
&lt;br /&gt;
Plusieurs bénéfices à organiser proprement un formulaire dynamique : &lt;br /&gt;
&lt;br /&gt;
- Pour les très longs formulaires, il est recommandé de mettre en place des chapitres (section de type &amp;quot;&amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt;&amp;quot;). Les chapitres sont visuellement indépendants les uns des autres ce qui laisse la possibilité à l'utilisateur de commencer par le chapitre de son choix. Ce découpage permet d'améliorer l'ergonomie et de mieux se repérer lors de la navigation. Le découpage en chapitre n'est pas obligatoire et créer un formulaire d'un seul chapitre est assez courant. &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;quot;&amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;&amp;quot; permettent de découper votre formulaire en plusieurs page/écran. Cette organisation est plus digeste pour les utilisateurs qui peuvent alors répondre étape par étape. Un menu visuel permet de se situer et de connaitre les &amp;quot;slides&amp;quot; passées et à venir lors du remplissage. Autre avantage de ce type de section : le contenu de la page étant sauvegardée lors du passage à la suivante, l'utilisateur pourra revenir plus tard sur son formulaire sans que sa saisie ne soit perdue. &lt;br /&gt;
&lt;br /&gt;
- Notez qu'en groupant les champs du formulaire au sein d'une même section, vous pouvez facilement les faire apparaitre ou disparaitre en plaçant une condition (&amp;lt;code&amp;gt;visibleIf&amp;lt;/code&amp;gt;) directement sur la section et non plus sur le champ. C'est le principal cas d'usage du type de section &amp;quot;&amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;&amp;quot;, qui ne vise qu'à grouper des champs entre eux. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Imbriquer les sections et structurer son formulaire &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections répondent à une hiérarchie stricte et logique : &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;chapter&amp;quot;&amp;lt;/code&amp;gt; sont celles de plus haut niveau, et ne peuvent contenir que des sous-sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;slide&amp;quot;&amp;lt;/code&amp;gt; peuvent être héritées d'une section &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou directement placées à la racine du formulaire. Ces sections correspondent aux pages du formulaire, il y a donc obligatoirement une section de ce type dans le formulaire. Ce type de section contient des sous-sections de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; mais il est possible de directement assigner des champs de saisie à une &amp;quot;slide&amp;quot; pour s'économiser la création d'une &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; inutile (pour information, techniquement, si des champs sont assignés à une &amp;quot;slide&amp;quot; alors une section &amp;quot;area&amp;quot; par défaut sera créée pour les contenir au sein de la page). &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; sont obligatoirement héritées d'une section de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;. Ces sections ont deux utilités principales : grouper des champs entre eux pour conditionner facilement leur affichage, ou, enrichir le formulaire avec des contenus au format HTML (voir plus bas rubrique #HTML).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;À noter :&amp;lt;/b&amp;gt; les sections ne peuvent pas être vides. Elles doivent, soit contenir des champs (pour le cas des sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;), soit contenir des sous-sections (pour le cas des sections de type &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;). ⚠️ Une exception cependant : les section de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; peuvent être vides si un contenu HTML est spécifié (utile pour enrichir le formulaire avec des contenus contextuels conditionnés à d'autres champs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;section-params&amp;quot;&amp;gt;Paramétrages des sections et attributs&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections d'un formulaire peuvent être paramétrées via la feuille &amp;lt;code&amp;gt; &amp;quot;Sections-Form &amp;quot;...&amp;quot; &amp;lt;/code&amp;gt; du tableur de configuration. &lt;br /&gt;
Elles doivent être définies dans l'ordre d'apparition souhaité. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;section-id&amp;quot;&amp;gt;Section Id&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne précise le nom de la section (soit un chapitre soit un slide). Il s’agit d’une chaîne alphanumérique sans accent et sans espace. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Elle sert de référence à l’intégralité du moteur pour identifier de manière unique les différents chapitres et slides qui apparaîtront dans le formulaire. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier un chapitre ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque chapitre est défini par un identifiant unique. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cet identifiant est défini librement par l'utilisateur, la seule restriction étant qu'il ne peut pas contenir de point &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier une slide ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque slide est défini par un identifiant unique.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est la concaténation de l’identifiant unique du chapitre auquel il appartient ET d’un identifiant unique à cette slide (le tout séparé par un point sans espace).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le format est donc chapter.slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Parties.id.png|thumbs|1000px|néant]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dans cet exemple, la slide &amp;lt;code&amp;gt;identification&amp;lt;/code&amp;gt; est à l’intérieur du chapter &amp;lt;code&amp;gt;parties&amp;lt;/code&amp;gt;. Son nom reflète cette hiérarchie : &amp;lt;code&amp;gt;parties.identification&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;type-de-section&amp;quot;&amp;gt;Type de section&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une section peut soit être un chapitre soit un slide. Le premier est ainsi défini par le mot chapter et le second par le mot slide dans ‘Type de section’. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le chapitre est le niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs slides.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le slide est le second niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs champs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple de Chapitres : &lt;br /&gt;
[[Fichier:Exemple chapter.png|frame|none|Exemple de chapter]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple d’une Slide, à l’intérieur du Chapter “Informations sur le produit” :&lt;br /&gt;
[[Fichier:Une slide.png|thumb|none|750px|La slide &amp;quot;au sujet du produit acheté&amp;quot; à l'intérieur du chapter &amp;quot;informations sur le produit&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;titre&amp;quot;&amp;gt;Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “libellé” : c’est l’intitulé du chapitre ou de la slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est obligatoire.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;sous-titre&amp;quot;&amp;gt;Sous-Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Permet de définir un sous-titre, qui apparaîtra en dessous du titre.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est facultatif.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;icon&amp;quot;&amp;gt;Icon&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ n’est utilisable que si la section est de type “Chapter”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il a pour but de personnaliser le questionnaire en associant une icône au chapter, pour aboutir à un rendu tel que dans l’exemple ci-dessous.&lt;br /&gt;
[[Fichier:Exemple icons.png|frame|none|Exemple d'icônes paramétrées via le champ &amp;quot;Icon&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les icônes à gauche de “Votre activité” et “Le Franchiseur” ont été paramétrées grâce au champ “Icon” du fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser une icône, il suffit de remplir le champ “Icon” de la manière suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;fa fa-NOMDEL’ICÔNE&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’icône en question doit être gratuite &amp;amp;amp; disponible sur le site de [https://fontawesome.com/v4.7.0/icons/ FontAwesome].&amp;lt;/p&amp;gt;&lt;br /&gt;
'''Attention : le SmartBundle ne supporte que les icônes fontawesome jusqu'à la version 4.7.0, consultables sur ce [https://fontawesome.com/v4.7.0/icons/ lien]'''&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “NOMDEL’ICÔNE” est la chaîne de caractères utilisée par FontAwesome.&lt;br /&gt;
&amp;lt;strong&amp;gt;Exemple : &amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Guide pas-à-pas : &amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Aller sur [https://fontawesome.com/v4.7.0/icons/ FontAwesome]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Rechercher son icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Search icon.png|frame|none|Rechercher son icône]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Copier l’identifiant de l’icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
Ici, l’identifiant de cette icône de drapeau est “flag”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Remplir le champ dans le fichier de paramétrage&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour avoir cette icône de drapeau dans le questionnaire, on remplira donc le champ Icon de la manière suivante : &lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;fa fa-flag&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;visible-if&amp;quot;&amp;gt;Visible if&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne permet de définir les conditions d’apparition de la section en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Son fonctionnement est similaire au reste du système : voir le fonctionnement des [[Conditions|Visible ifs]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;html&amp;quot;&amp;gt;HTML&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''Coming Soon''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;repeater&amp;quot;&amp;gt;Repeater&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le fonctionnement des repeaters est détaillé [[Repeaters|ici]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Option &amp;quot;autoaddress&amp;quot; (Google Places) ===&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;autoaddress&amp;quot;, à placer dans la colonne &amp;quot;Options&amp;quot; d'un SectionForm, va permettre à l'utilisateur de pré-remplir les champs relatifs à une adresse depuis un champ de saisie automatique (autocomplete) basé sur les données fournies par Google Places. &lt;br /&gt;
&lt;br /&gt;
::- Côté interface, cette option fera apparaitre un bouton au niveau du titre de la section (area). Au clic sur ce bouton, une fenêtre modale apparait permettant à l'utilisateur de saisir un texte. Lors de la saisie, plusieurs suggestions seront proposées. Une fois qu'une suggestion est sélectionné par l'utilisateur, la fenêtre se referme et les champs du formulaire sont alors pré-remplis avec les données correspondantes à la suggestion choisie.&lt;br /&gt;
&lt;br /&gt;
::- L'utilisation de cette option est possible uniquement sur une section de type '''''area'''''. &lt;br /&gt;
&lt;br /&gt;
::- Cette option est à configurer au format [https://geekflare.com/fr/yaml-introduction/ YAML], c'est à dire sous la forme ''&amp;quot;attribut: valeur&amp;quot;'' et avec des indentations (4 espaces) pour identifier les sous-attributs. &lt;br /&gt;
:: Les sous-attributs sont tous facultatifs et permettent de spécifier quelle valeur doit être injectée dans tel ou tel champ. &lt;br /&gt;
:: Les types de valeurs possibles sont : &lt;br /&gt;
:: - &amp;lt;code&amp;gt;street_number&amp;lt;/code&amp;gt; : numéro de rue (ex: 31)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;route&amp;lt;/code&amp;gt; : type et nom de rue (ex: ''Rue du Four'', ou ''Avenue Charles-de-Gaulle'') &lt;br /&gt;
:: - &amp;lt;code&amp;gt;plain_address&amp;lt;/code&amp;gt; : numéro, type et nom de rue. (ex: ''156, Avenue Charles-de-Gaulle'')&lt;br /&gt;
:: - &amp;lt;code&amp;gt;postal_code&amp;lt;/code&amp;gt; : code postal (ex: 34700, 75009 …)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;locality&amp;lt;/code&amp;gt; : commune (ex: Paris, Montpellier…)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;country&amp;lt;/code&amp;gt; : pays (ex: France) &lt;br /&gt;
:: - &amp;lt;code&amp;gt;country_code&amp;lt;/code&amp;gt; : code pays, [https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes en deux lettres, ISO_3166])&lt;br /&gt;
:: - &amp;lt;code&amp;gt;administrative_area_level_1&amp;lt;/code&amp;gt; : en France, la région (ex: Occitanie)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;administrative_area_level_2&amp;lt;/code&amp;gt; : en France, le département (ex: Hérault) &lt;br /&gt;
&lt;br /&gt;
:: Exemple de configuration : &amp;lt;code&amp;gt;&lt;br /&gt;
:::: auto-address:&lt;br /&gt;
:::::: plain_address: EMPLOYE_ADRESSE&lt;br /&gt;
:::::: locality: EMPLOYE_VILLE&lt;br /&gt;
:::::: postal_code: EMPLOYE_CP&lt;br /&gt;
:::::: country_code: EMPLOYE_PAYS_CHOICE&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1184</id>
		<title>Sections-Form</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1184"/>
		<updated>2024-05-09T19:04:32Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Option &amp;quot;autoaddress&amp;quot; (Google Places) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;sections-form&amp;quot;&amp;gt;Sections-Form&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Wiki-sections.png|vignette|right|Schéma récapitulatif de l'imbrication des différents types de section d'un SmartForm |redresse=0.75]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Qu'est ce qu'une section ?&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections du formulaire servent à organiser son contenu. Il existe 3 types de sections qui permettent d'organiser visuellement vos champs de formulaire : `chapter` , `slide` et `area`. &lt;br /&gt;
&lt;br /&gt;
Plusieurs bénéfices à organiser proprement un formulaire dynamique : &lt;br /&gt;
&lt;br /&gt;
- Pour les très longs formulaires, il est recommandé de mettre en place des chapitres (section de type &amp;quot;&amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt;&amp;quot;). Les chapitres sont visuellement indépendants les uns des autres ce qui laisse la possibilité à l'utilisateur de commencer par le chapitre de son choix. Ce découpage permet d'améliorer l'ergonomie et de mieux se repérer lors de la navigation. Le découpage en chapitre n'est pas obligatoire et créer un formulaire d'un seul chapitre est assez courant. &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;quot;&amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;&amp;quot; permettent de découper votre formulaire en plusieurs page/écran. Cette organisation est plus digeste pour les utilisateurs qui peuvent alors répondre étape par étape. Un menu visuel permet de se situer et de connaitre les &amp;quot;slides&amp;quot; passées et à venir lors du remplissage. Autre avantage de ce type de section : le contenu de la page étant sauvegardée lors du passage à la suivante, l'utilisateur pourra revenir plus tard sur son formulaire sans que sa saisie ne soit perdue. &lt;br /&gt;
&lt;br /&gt;
- Notez qu'en groupant les champs du formulaire au sein d'une même section, vous pouvez facilement les faire apparaitre ou disparaitre en plaçant une condition (&amp;lt;code&amp;gt;visibleIf&amp;lt;/code&amp;gt;) directement sur la section et non plus sur le champ. C'est le principal cas d'usage du type de section &amp;quot;&amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;&amp;quot;, qui ne vise qu'à grouper des champs entre eux. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Imbriquer les sections et structurer son formulaire &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections répondent à une hiérarchie stricte et logique : &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;chapter&amp;quot;&amp;lt;/code&amp;gt; sont celles de plus haut niveau, et ne peuvent contenir que des sous-sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;slide&amp;quot;&amp;lt;/code&amp;gt; peuvent être héritées d'une section &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou directement placées à la racine du formulaire. Ces sections correspondent aux pages du formulaire, il y a donc obligatoirement une section de ce type dans le formulaire. Ce type de section contient des sous-sections de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; mais il est possible de directement assigner des champs de saisie à une &amp;quot;slide&amp;quot; pour s'économiser la création d'une &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; inutile (pour information, techniquement, si des champs sont assignés à une &amp;quot;slide&amp;quot; alors une section &amp;quot;area&amp;quot; par défaut sera créée pour les contenir au sein de la page). &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; sont obligatoirement héritées d'une section de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;. Ces sections ont deux utilités principales : grouper des champs entre eux pour conditionner facilement leur affichage, ou, enrichir le formulaire avec des contenus au format HTML (voir plus bas rubrique #HTML).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;À noter :&amp;lt;/b&amp;gt; les sections ne peuvent pas être vides. Elles doivent, soit contenir des champs (pour le cas des sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;), soit contenir des sous-sections (pour le cas des sections de type &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;). ⚠️ Une exception cependant : les section de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; peuvent être vides si un contenu HTML est spécifié (utile pour enrichir le formulaire avec des contenus contextuels conditionnés à d'autres champs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;section-params&amp;quot;&amp;gt;Paramétrages des sections et attributs&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections d'un formulaire peuvent être paramétrées via la feuille &amp;lt;code&amp;gt; &amp;quot;Sections-Form &amp;quot;...&amp;quot; &amp;lt;/code&amp;gt; du tableur de configuration. &lt;br /&gt;
Elles doivent être définies dans l'ordre d'apparition souhaité. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;section-id&amp;quot;&amp;gt;Section Id&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne précise le nom de la section (soit un chapitre soit un slide). Il s’agit d’une chaîne alphanumérique sans accent et sans espace. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Elle sert de référence à l’intégralité du moteur pour identifier de manière unique les différents chapitres et slides qui apparaîtront dans le formulaire. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier un chapitre ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque chapitre est défini par un identifiant unique. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cet identifiant est défini librement par l'utilisateur, la seule restriction étant qu'il ne peut pas contenir de point &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier une slide ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque slide est défini par un identifiant unique.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est la concaténation de l’identifiant unique du chapitre auquel il appartient ET d’un identifiant unique à cette slide (le tout séparé par un point sans espace).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le format est donc chapter.slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Parties.id.png|thumbs|1000px|néant]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dans cet exemple, la slide &amp;lt;code&amp;gt;identification&amp;lt;/code&amp;gt; est à l’intérieur du chapter &amp;lt;code&amp;gt;parties&amp;lt;/code&amp;gt;. Son nom reflète cette hiérarchie : &amp;lt;code&amp;gt;parties.identification&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;type-de-section&amp;quot;&amp;gt;Type de section&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une section peut soit être un chapitre soit un slide. Le premier est ainsi défini par le mot chapter et le second par le mot slide dans ‘Type de section’. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le chapitre est le niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs slides.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le slide est le second niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs champs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple de Chapitres : &lt;br /&gt;
[[Fichier:Exemple chapter.png|frame|none|Exemple de chapter]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple d’une Slide, à l’intérieur du Chapter “Informations sur le produit” :&lt;br /&gt;
[[Fichier:Une slide.png|thumb|none|750px|La slide &amp;quot;au sujet du produit acheté&amp;quot; à l'intérieur du chapter &amp;quot;informations sur le produit&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;titre&amp;quot;&amp;gt;Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “libellé” : c’est l’intitulé du chapitre ou de la slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est obligatoire.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;sous-titre&amp;quot;&amp;gt;Sous-Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Permet de définir un sous-titre, qui apparaîtra en dessous du titre.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est facultatif.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;icon&amp;quot;&amp;gt;Icon&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ n’est utilisable que si la section est de type “Chapter”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il a pour but de personnaliser le questionnaire en associant une icône au chapter, pour aboutir à un rendu tel que dans l’exemple ci-dessous.&lt;br /&gt;
[[Fichier:Exemple icons.png|frame|none|Exemple d'icônes paramétrées via le champ &amp;quot;Icon&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les icônes à gauche de “Votre activité” et “Le Franchiseur” ont été paramétrées grâce au champ “Icon” du fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser une icône, il suffit de remplir le champ “Icon” de la manière suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;fa fa-NOMDEL’ICÔNE&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’icône en question doit être gratuite &amp;amp;amp; disponible sur le site de [https://fontawesome.com/v4.7.0/icons/ FontAwesome].&amp;lt;/p&amp;gt;&lt;br /&gt;
'''Attention : le SmartBundle ne supporte que les icônes fontawesome jusqu'à la version 4.7.0, consultables sur ce [https://fontawesome.com/v4.7.0/icons/ lien]'''&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “NOMDEL’ICÔNE” est la chaîne de caractères utilisée par FontAwesome.&lt;br /&gt;
&amp;lt;strong&amp;gt;Exemple : &amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Guide pas-à-pas : &amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Aller sur [https://fontawesome.com/v4.7.0/icons/ FontAwesome]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Rechercher son icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Search icon.png|frame|none|Rechercher son icône]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Copier l’identifiant de l’icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
Ici, l’identifiant de cette icône de drapeau est “flag”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Remplir le champ dans le fichier de paramétrage&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour avoir cette icône de drapeau dans le questionnaire, on remplira donc le champ Icon de la manière suivante : &lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;fa fa-flag&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;visible-if&amp;quot;&amp;gt;Visible if&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne permet de définir les conditions d’apparition de la section en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Son fonctionnement est similaire au reste du système : voir le fonctionnement des [[Conditions|Visible ifs]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;html&amp;quot;&amp;gt;HTML&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''Coming Soon''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;repeater&amp;quot;&amp;gt;Repeater&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le fonctionnement des repeaters est détaillé [[Repeaters|ici]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Option &amp;quot;autoaddress&amp;quot; (Google Places) ===&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;autoaddress&amp;quot;, à placer dans la colonne &amp;quot;Options&amp;quot; d'un SectionForm, va permettre à l'utilisateur de pré-remplir les champs relatifs à une adresse depuis un champ de saisie automatique (autocomplete) basé sur les données fournies par Google Places. &lt;br /&gt;
&lt;br /&gt;
::- Côté interface, cette option fera apparaitre un bouton au niveau du titre de la section (area). Au clic sur ce bouton, une fenêtre modale apparait permettant à l'utilisateur de saisir un texte. Lors de la saisie, plusieurs suggestions seront proposées. Une fois qu'une suggestion est sélectionné par l'utilisateur, la fenêtre se referme et les champs du formulaire sont alors pré-remplis avec les données correspondantes à la suggestion choisie.&lt;br /&gt;
&lt;br /&gt;
::- L'utilisation de cette option est possible uniquement sur une section de type '''''area'''''. &lt;br /&gt;
&lt;br /&gt;
::- Cette option est à configurer au format [https://geekflare.com/fr/yaml-introduction/ YAML], c'est à dire sous la forme ''&amp;quot;attribut: valeur&amp;quot;'' et avec des indentations (4 espaces) pour identifier les sous-attributs. &lt;br /&gt;
:: Les sous-attributs sont tous facultatifs et permettent de spécifier quelle valeur doit être injectée dans tel ou tel champ. &lt;br /&gt;
:: Les types de valeurs possibles sont : &lt;br /&gt;
:: - &amp;lt;code&amp;gt;street_number&amp;lt;/code&amp;gt; (numéro de rue)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;route&amp;lt;/code&amp;gt; (type et nom de rue)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;plain_address&amp;lt;/code&amp;gt; (numéro, type et nom de rue)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;postal_code&amp;lt;/code&amp;gt; (code postal)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;locality&amp;lt;/code&amp;gt; : commune (ex: Paris, Montpellier…)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;country&amp;lt;/code&amp;gt; : pays (ex: France) &lt;br /&gt;
:: - &amp;lt;code&amp;gt;country_code&amp;lt;/code&amp;gt; : code pays, [https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes en deux lettres, ISO_3166])&lt;br /&gt;
:: - &amp;lt;code&amp;gt;administrative_area_level_1&amp;lt;/code&amp;gt; : en France, la région (ex: Occitanie)&lt;br /&gt;
:: - &amp;lt;code&amp;gt;administrative_area_level_2&amp;lt;/code&amp;gt; : en France, le département (ex: Hérault) &lt;br /&gt;
&lt;br /&gt;
:: Exemple de configuration : &amp;lt;code&amp;gt;&lt;br /&gt;
:::: auto-address:&lt;br /&gt;
:::::: plain_address: EMPLOYE_ADRESSE&lt;br /&gt;
:::::: locality: EMPLOYE_VILLE&lt;br /&gt;
:::::: postal_code: EMPLOYE_CP&lt;br /&gt;
:::::: country_code: EMPLOYE_PAYS_CHOICE&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1183</id>
		<title>Sections-Form</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1183"/>
		<updated>2024-05-09T18:46:55Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Option &amp;quot;autoaddress&amp;quot; (Google Places) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;sections-form&amp;quot;&amp;gt;Sections-Form&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Wiki-sections.png|vignette|right|Schéma récapitulatif de l'imbrication des différents types de section d'un SmartForm |redresse=0.75]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Qu'est ce qu'une section ?&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections du formulaire servent à organiser son contenu. Il existe 3 types de sections qui permettent d'organiser visuellement vos champs de formulaire : `chapter` , `slide` et `area`. &lt;br /&gt;
&lt;br /&gt;
Plusieurs bénéfices à organiser proprement un formulaire dynamique : &lt;br /&gt;
&lt;br /&gt;
- Pour les très longs formulaires, il est recommandé de mettre en place des chapitres (section de type &amp;quot;&amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt;&amp;quot;). Les chapitres sont visuellement indépendants les uns des autres ce qui laisse la possibilité à l'utilisateur de commencer par le chapitre de son choix. Ce découpage permet d'améliorer l'ergonomie et de mieux se repérer lors de la navigation. Le découpage en chapitre n'est pas obligatoire et créer un formulaire d'un seul chapitre est assez courant. &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;quot;&amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;&amp;quot; permettent de découper votre formulaire en plusieurs page/écran. Cette organisation est plus digeste pour les utilisateurs qui peuvent alors répondre étape par étape. Un menu visuel permet de se situer et de connaitre les &amp;quot;slides&amp;quot; passées et à venir lors du remplissage. Autre avantage de ce type de section : le contenu de la page étant sauvegardée lors du passage à la suivante, l'utilisateur pourra revenir plus tard sur son formulaire sans que sa saisie ne soit perdue. &lt;br /&gt;
&lt;br /&gt;
- Notez qu'en groupant les champs du formulaire au sein d'une même section, vous pouvez facilement les faire apparaitre ou disparaitre en plaçant une condition (&amp;lt;code&amp;gt;visibleIf&amp;lt;/code&amp;gt;) directement sur la section et non plus sur le champ. C'est le principal cas d'usage du type de section &amp;quot;&amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;&amp;quot;, qui ne vise qu'à grouper des champs entre eux. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Imbriquer les sections et structurer son formulaire &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections répondent à une hiérarchie stricte et logique : &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;chapter&amp;quot;&amp;lt;/code&amp;gt; sont celles de plus haut niveau, et ne peuvent contenir que des sous-sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;slide&amp;quot;&amp;lt;/code&amp;gt; peuvent être héritées d'une section &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou directement placées à la racine du formulaire. Ces sections correspondent aux pages du formulaire, il y a donc obligatoirement une section de ce type dans le formulaire. Ce type de section contient des sous-sections de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; mais il est possible de directement assigner des champs de saisie à une &amp;quot;slide&amp;quot; pour s'économiser la création d'une &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; inutile (pour information, techniquement, si des champs sont assignés à une &amp;quot;slide&amp;quot; alors une section &amp;quot;area&amp;quot; par défaut sera créée pour les contenir au sein de la page). &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; sont obligatoirement héritées d'une section de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;. Ces sections ont deux utilités principales : grouper des champs entre eux pour conditionner facilement leur affichage, ou, enrichir le formulaire avec des contenus au format HTML (voir plus bas rubrique #HTML).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;À noter :&amp;lt;/b&amp;gt; les sections ne peuvent pas être vides. Elles doivent, soit contenir des champs (pour le cas des sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;), soit contenir des sous-sections (pour le cas des sections de type &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;). ⚠️ Une exception cependant : les section de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; peuvent être vides si un contenu HTML est spécifié (utile pour enrichir le formulaire avec des contenus contextuels conditionnés à d'autres champs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;section-params&amp;quot;&amp;gt;Paramétrages des sections et attributs&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections d'un formulaire peuvent être paramétrées via la feuille &amp;lt;code&amp;gt; &amp;quot;Sections-Form &amp;quot;...&amp;quot; &amp;lt;/code&amp;gt; du tableur de configuration. &lt;br /&gt;
Elles doivent être définies dans l'ordre d'apparition souhaité. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;section-id&amp;quot;&amp;gt;Section Id&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne précise le nom de la section (soit un chapitre soit un slide). Il s’agit d’une chaîne alphanumérique sans accent et sans espace. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Elle sert de référence à l’intégralité du moteur pour identifier de manière unique les différents chapitres et slides qui apparaîtront dans le formulaire. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier un chapitre ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque chapitre est défini par un identifiant unique. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cet identifiant est défini librement par l'utilisateur, la seule restriction étant qu'il ne peut pas contenir de point &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier une slide ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque slide est défini par un identifiant unique.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est la concaténation de l’identifiant unique du chapitre auquel il appartient ET d’un identifiant unique à cette slide (le tout séparé par un point sans espace).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le format est donc chapter.slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Parties.id.png|thumbs|1000px|néant]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dans cet exemple, la slide &amp;lt;code&amp;gt;identification&amp;lt;/code&amp;gt; est à l’intérieur du chapter &amp;lt;code&amp;gt;parties&amp;lt;/code&amp;gt;. Son nom reflète cette hiérarchie : &amp;lt;code&amp;gt;parties.identification&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;type-de-section&amp;quot;&amp;gt;Type de section&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une section peut soit être un chapitre soit un slide. Le premier est ainsi défini par le mot chapter et le second par le mot slide dans ‘Type de section’. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le chapitre est le niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs slides.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le slide est le second niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs champs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple de Chapitres : &lt;br /&gt;
[[Fichier:Exemple chapter.png|frame|none|Exemple de chapter]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple d’une Slide, à l’intérieur du Chapter “Informations sur le produit” :&lt;br /&gt;
[[Fichier:Une slide.png|thumb|none|750px|La slide &amp;quot;au sujet du produit acheté&amp;quot; à l'intérieur du chapter &amp;quot;informations sur le produit&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;titre&amp;quot;&amp;gt;Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “libellé” : c’est l’intitulé du chapitre ou de la slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est obligatoire.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;sous-titre&amp;quot;&amp;gt;Sous-Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Permet de définir un sous-titre, qui apparaîtra en dessous du titre.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est facultatif.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;icon&amp;quot;&amp;gt;Icon&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ n’est utilisable que si la section est de type “Chapter”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il a pour but de personnaliser le questionnaire en associant une icône au chapter, pour aboutir à un rendu tel que dans l’exemple ci-dessous.&lt;br /&gt;
[[Fichier:Exemple icons.png|frame|none|Exemple d'icônes paramétrées via le champ &amp;quot;Icon&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les icônes à gauche de “Votre activité” et “Le Franchiseur” ont été paramétrées grâce au champ “Icon” du fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser une icône, il suffit de remplir le champ “Icon” de la manière suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;fa fa-NOMDEL’ICÔNE&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’icône en question doit être gratuite &amp;amp;amp; disponible sur le site de [https://fontawesome.com/v4.7.0/icons/ FontAwesome].&amp;lt;/p&amp;gt;&lt;br /&gt;
'''Attention : le SmartBundle ne supporte que les icônes fontawesome jusqu'à la version 4.7.0, consultables sur ce [https://fontawesome.com/v4.7.0/icons/ lien]'''&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “NOMDEL’ICÔNE” est la chaîne de caractères utilisée par FontAwesome.&lt;br /&gt;
&amp;lt;strong&amp;gt;Exemple : &amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Guide pas-à-pas : &amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Aller sur [https://fontawesome.com/v4.7.0/icons/ FontAwesome]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Rechercher son icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Search icon.png|frame|none|Rechercher son icône]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Copier l’identifiant de l’icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
Ici, l’identifiant de cette icône de drapeau est “flag”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Remplir le champ dans le fichier de paramétrage&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour avoir cette icône de drapeau dans le questionnaire, on remplira donc le champ Icon de la manière suivante : &lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;fa fa-flag&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;visible-if&amp;quot;&amp;gt;Visible if&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne permet de définir les conditions d’apparition de la section en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Son fonctionnement est similaire au reste du système : voir le fonctionnement des [[Conditions|Visible ifs]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;html&amp;quot;&amp;gt;HTML&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''Coming Soon''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;repeater&amp;quot;&amp;gt;Repeater&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le fonctionnement des repeaters est détaillé [[Repeaters|ici]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Option &amp;quot;autoaddress&amp;quot; (Google Places) ===&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;autoaddress&amp;quot; permet à l'utilisateur de faire pré-remplir les champs relatifs à une adresse depuis un champ &amp;quot;autocomplete&amp;quot; basé sur les données fournies par Google Places. &lt;br /&gt;
&lt;br /&gt;
:: - Cette option fera apparaitre un bouton au niveau du titre de la section (area). Au clic sur ce bouton, une fenêtre modale apparait permettant à l'utilisateur de saisir un texte et de sélectionner une suggestion d'adresse parmi celles qui apparaissent. Une fois la suggestion selectionnée, la fenêtre se referme et les champs du formulaire sont pré-remplis avec les données correspondantes.&lt;br /&gt;
&lt;br /&gt;
:: - L'utilisation de cette option est possible uniquement sur une section de type '''''area'''''. &lt;br /&gt;
&lt;br /&gt;
:: - Cette option est à configurer au format au format [https://geekflare.com/fr/yaml-introduction/ YAML], c'est à dire sous la forme ''&amp;quot;attribut: valeur&amp;quot;'' et avec des indentations (4 espaces) pour identifier les sous-attributs. &lt;br /&gt;
:: Les sous-attributs sont tous facultatifs et permettent de spécifier quelle valeur doit être injectée dans tel ou tel champ. &lt;br /&gt;
:: Les types de valeurs possibles sont : &amp;lt;code&amp;gt;street_number&amp;lt;/code&amp;gt; (numéro de rue), &amp;lt;code&amp;gt;route&amp;lt;/code&amp;gt; (type et nom de rue), &amp;lt;code&amp;gt;plain_address&amp;lt;/code&amp;gt; (numéro, type et nom de rue), &amp;lt;code&amp;gt;postal_code&amp;lt;/code&amp;gt; (code postal), &amp;lt;code&amp;gt;locality&amp;lt;/code&amp;gt; (commune), &amp;lt;code&amp;gt;country&amp;lt;/code&amp;gt; (pays), &amp;lt;code&amp;gt;country_code&amp;lt;/code&amp;gt; (code pays, [https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes en deux lettres]), &amp;lt;code&amp;gt;administrative_area_level_1&amp;lt;/code&amp;gt; (région), &amp;lt;code&amp;gt;administrative_area_level_2&amp;lt;/code&amp;gt; (département).&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;&lt;br /&gt;
:::: auto-address:&lt;br /&gt;
:::::: plain_address: EMPLOYE_ADRESSE&lt;br /&gt;
:::::: locality: EMPLOYE_VILLE&lt;br /&gt;
:::::: postal_code: EMPLOYE_CP&lt;br /&gt;
:::::: country_code: EMPLOYE_PAYS_CHOICE&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1182</id>
		<title>Sections-Form</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Sections-Form&amp;diff=1182"/>
		<updated>2024-05-09T18:45:31Z</updated>

		<summary type="html">&lt;p&gt;Damien : Rajout de l'auto-address&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;sections-form&amp;quot;&amp;gt;Sections-Form&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Wiki-sections.png|vignette|right|Schéma récapitulatif de l'imbrication des différents types de section d'un SmartForm |redresse=0.75]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Qu'est ce qu'une section ?&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections du formulaire servent à organiser son contenu. Il existe 3 types de sections qui permettent d'organiser visuellement vos champs de formulaire : `chapter` , `slide` et `area`. &lt;br /&gt;
&lt;br /&gt;
Plusieurs bénéfices à organiser proprement un formulaire dynamique : &lt;br /&gt;
&lt;br /&gt;
- Pour les très longs formulaires, il est recommandé de mettre en place des chapitres (section de type &amp;quot;&amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt;&amp;quot;). Les chapitres sont visuellement indépendants les uns des autres ce qui laisse la possibilité à l'utilisateur de commencer par le chapitre de son choix. Ce découpage permet d'améliorer l'ergonomie et de mieux se repérer lors de la navigation. Le découpage en chapitre n'est pas obligatoire et créer un formulaire d'un seul chapitre est assez courant. &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;quot;&amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;&amp;quot; permettent de découper votre formulaire en plusieurs page/écran. Cette organisation est plus digeste pour les utilisateurs qui peuvent alors répondre étape par étape. Un menu visuel permet de se situer et de connaitre les &amp;quot;slides&amp;quot; passées et à venir lors du remplissage. Autre avantage de ce type de section : le contenu de la page étant sauvegardée lors du passage à la suivante, l'utilisateur pourra revenir plus tard sur son formulaire sans que sa saisie ne soit perdue. &lt;br /&gt;
&lt;br /&gt;
- Notez qu'en groupant les champs du formulaire au sein d'une même section, vous pouvez facilement les faire apparaitre ou disparaitre en plaçant une condition (&amp;lt;code&amp;gt;visibleIf&amp;lt;/code&amp;gt;) directement sur la section et non plus sur le champ. C'est le principal cas d'usage du type de section &amp;quot;&amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;&amp;quot;, qui ne vise qu'à grouper des champs entre eux. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;what-is-section&amp;quot;&amp;gt;Imbriquer les sections et structurer son formulaire &amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections répondent à une hiérarchie stricte et logique : &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;chapter&amp;quot;&amp;lt;/code&amp;gt; sont celles de plus haut niveau, et ne peuvent contenir que des sous-sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;slide&amp;quot;&amp;lt;/code&amp;gt; peuvent être héritées d'une section &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou directement placées à la racine du formulaire. Ces sections correspondent aux pages du formulaire, il y a donc obligatoirement une section de ce type dans le formulaire. Ce type de section contient des sous-sections de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; mais il est possible de directement assigner des champs de saisie à une &amp;quot;slide&amp;quot; pour s'économiser la création d'une &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; inutile (pour information, techniquement, si des champs sont assignés à une &amp;quot;slide&amp;quot; alors une section &amp;quot;area&amp;quot; par défaut sera créée pour les contenir au sein de la page). &lt;br /&gt;
&lt;br /&gt;
- Les sections de type &amp;lt;code&amp;gt;&amp;quot;area&amp;quot;&amp;lt;/code&amp;gt; sont obligatoirement héritées d'une section de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;. Ces sections ont deux utilités principales : grouper des champs entre eux pour conditionner facilement leur affichage, ou, enrichir le formulaire avec des contenus au format HTML (voir plus bas rubrique #HTML).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;À noter :&amp;lt;/b&amp;gt; les sections ne peuvent pas être vides. Elles doivent, soit contenir des champs (pour le cas des sections de type &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt;), soit contenir des sous-sections (pour le cas des sections de type &amp;lt;code&amp;gt;chapter&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;slide&amp;lt;/code&amp;gt;). ⚠️ Une exception cependant : les section de type &amp;lt;code&amp;gt;area&amp;lt;/code&amp;gt; peuvent être vides si un contenu HTML est spécifié (utile pour enrichir le formulaire avec des contenus contextuels conditionnés à d'autres champs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;section-params&amp;quot;&amp;gt;Paramétrages des sections et attributs&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les sections d'un formulaire peuvent être paramétrées via la feuille &amp;lt;code&amp;gt; &amp;quot;Sections-Form &amp;quot;...&amp;quot; &amp;lt;/code&amp;gt; du tableur de configuration. &lt;br /&gt;
Elles doivent être définies dans l'ordre d'apparition souhaité. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;section-id&amp;quot;&amp;gt;Section Id&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne précise le nom de la section (soit un chapitre soit un slide). Il s’agit d’une chaîne alphanumérique sans accent et sans espace. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Elle sert de référence à l’intégralité du moteur pour identifier de manière unique les différents chapitres et slides qui apparaîtront dans le formulaire. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier un chapitre ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque chapitre est défini par un identifiant unique. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cet identifiant est défini librement par l'utilisateur, la seule restriction étant qu'il ne peut pas contenir de point &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Comment identifier une slide ?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Chaque slide est défini par un identifiant unique.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est la concaténation de l’identifiant unique du chapitre auquel il appartient ET d’un identifiant unique à cette slide (le tout séparé par un point sans espace).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le format est donc chapter.slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Parties.id.png|thumbs|1000px|néant]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dans cet exemple, la slide &amp;lt;code&amp;gt;identification&amp;lt;/code&amp;gt; est à l’intérieur du chapter &amp;lt;code&amp;gt;parties&amp;lt;/code&amp;gt;. Son nom reflète cette hiérarchie : &amp;lt;code&amp;gt;parties.identification&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;type-de-section&amp;quot;&amp;gt;Type de section&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une section peut soit être un chapitre soit un slide. Le premier est ainsi défini par le mot chapter et le second par le mot slide dans ‘Type de section’. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le chapitre est le niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs slides.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le slide est le second niveau de catégorie le plus haut du formulaire. Il doit contenir un ou plusieurs champs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple de Chapitres : &lt;br /&gt;
[[Fichier:Exemple chapter.png|frame|none|Exemple de chapter]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Exemple d’une Slide, à l’intérieur du Chapter “Informations sur le produit” :&lt;br /&gt;
[[Fichier:Une slide.png|thumb|none|750px|La slide &amp;quot;au sujet du produit acheté&amp;quot; à l'intérieur du chapter &amp;quot;informations sur le produit&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;titre&amp;quot;&amp;gt;Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “libellé” : c’est l’intitulé du chapitre ou de la slide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est obligatoire.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;sous-titre&amp;quot;&amp;gt;Sous-Titre&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Permet de définir un sous-titre, qui apparaîtra en dessous du titre.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Remplir cette colonne est facultatif.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;icon&amp;quot;&amp;gt;Icon&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ n’est utilisable que si la section est de type “Chapter”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il a pour but de personnaliser le questionnaire en associant une icône au chapter, pour aboutir à un rendu tel que dans l’exemple ci-dessous.&lt;br /&gt;
[[Fichier:Exemple icons.png|frame|none|Exemple d'icônes paramétrées via le champ &amp;quot;Icon&amp;quot;]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les icônes à gauche de “Votre activité” et “Le Franchiseur” ont été paramétrées grâce au champ “Icon” du fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser une icône, il suffit de remplir le champ “Icon” de la manière suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;fa fa-NOMDEL’ICÔNE&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’icône en question doit être gratuite &amp;amp;amp; disponible sur le site de [https://fontawesome.com/v4.7.0/icons/ FontAwesome].&amp;lt;/p&amp;gt;&lt;br /&gt;
'''Attention : le SmartBundle ne supporte que les icônes fontawesome jusqu'à la version 4.7.0, consultables sur ce [https://fontawesome.com/v4.7.0/icons/ lien]'''&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “NOMDEL’ICÔNE” est la chaîne de caractères utilisée par FontAwesome.&lt;br /&gt;
&amp;lt;strong&amp;gt;Exemple : &amp;lt;/strong&amp;gt;&lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Guide pas-à-pas : &amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Aller sur [https://fontawesome.com/v4.7.0/icons/ FontAwesome]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Rechercher son icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Search icon.png|frame|none|Rechercher son icône]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Copier l’identifiant de l’icône&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &lt;br /&gt;
[[Fichier:Flag example.png|frame|none]]&lt;br /&gt;
Ici, l’identifiant de cette icône de drapeau est “flag”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Remplir le champ dans le fichier de paramétrage&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour avoir cette icône de drapeau dans le questionnaire, on remplira donc le champ Icon de la manière suivante : &lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;fa fa-flag&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;visible-if&amp;quot;&amp;gt;Visible if&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette colonne permet de définir les conditions d’apparition de la section en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Son fonctionnement est similaire au reste du système : voir le fonctionnement des [[Conditions|Visible ifs]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;html&amp;quot;&amp;gt;HTML&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''Coming Soon''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;repeater&amp;quot;&amp;gt;Repeater&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le fonctionnement des repeaters est détaillé [[Repeaters|ici]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Option &amp;quot;autoaddress&amp;quot; (Google Places) ===&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;autoaddress&amp;quot; permet à l'utilisateur de faire pré-remplir les champs relatifs à une adresse depuis un champ &amp;quot;autocomplete&amp;quot; basé sur les données fournies par Google Places. &lt;br /&gt;
&lt;br /&gt;
:: - Cette option fera apparaitre un bouton au niveau du titre de la section (area). Au clic sur ce bouton, une fenêtre modale apparait permettant à l'utilisateur de saisir un texte et de sélectionner une suggestion d'adresse parmi celles qui apparaissent. Une fois la suggestion selectionnée, la fenêtre se referme et les champs du formulaire sont pré-remplis avec les données correspondantes.&lt;br /&gt;
&lt;br /&gt;
:: - L'utilisation de cette option est possible uniquement sur une section de type '''''area'''''. &lt;br /&gt;
&lt;br /&gt;
:: - Cette option est à configurer au format au format [https://geekflare.com/fr/yaml-introduction/ YAML], c'est à dire sous la forme ''&amp;quot;attribut: valeur&amp;quot;'' et avec des indentations (4 espaces) pour identifier les sous-attributs. &lt;br /&gt;
:: Les sous-attributs sont tous facultatifs et permettent de spécifier quelle valeur doit être injectée dans tel champ. Les types de valeurs sont : '&amp;lt;code&amp;gt;street_number&amp;lt;/code&amp;gt;' (numéro de rue), '&amp;lt;code&amp;gt;route&amp;lt;/code&amp;gt;' (type et nom de rue), '&amp;lt;code&amp;gt;plain_address&amp;lt;/code&amp;gt;' (numéro, type et nom de rue), '&amp;lt;code&amp;gt;postal_code&amp;lt;/code&amp;gt;' (code postal), '&amp;lt;code&amp;gt;locality&amp;lt;/code&amp;gt;' (commune), '&amp;lt;code&amp;gt;country&amp;lt;/code&amp;gt;' (pays), '&amp;lt;code&amp;gt;country_code&amp;lt;/code&amp;gt;' (code pays, [https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes en deux lettres]), '&amp;lt;code&amp;gt;administrative_area_level_1&amp;lt;/code&amp;gt;' (région), '&amp;lt;code&amp;gt;administrative_area_level_2&amp;lt;/code&amp;gt;' (département).&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;&lt;br /&gt;
:::: auto-address:&lt;br /&gt;
:::::: plain_address: EMPLOYE_ADRESSE&lt;br /&gt;
:::::: locality: EMPLOYE_VILLE&lt;br /&gt;
:::::: postal_code: EMPLOYE_CP&lt;br /&gt;
:::::: country_code: EMPLOYE_PAYS_CHOICE&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1181</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1181"/>
		<updated>2024-02-14T19:07:18Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Fonctions sur les Chaînes de caractères */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;MA_FONCTION( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;MA_FONCTION&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Compter le nombre de caractères d'une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringLength&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''Renvoie le nombre de caractère de la chaîne.''&amp;lt;br/&amp;gt;&lt;br /&gt;
:: Exemple : &amp;lt;code&amp;gt;stringLength('Hercule !')&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; ''(entier numérique)''. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.&amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de &amp;quot;digit&amp;quot; de ce nomnre. &amp;lt;br/&amp;gt;Ex : Avec &amp;lt;code&amp;gt;CODE_POSTAL&amp;lt;/code&amp;gt; qui vaut &amp;lt;code&amp;gt;34700&amp;lt;/code&amp;gt; (entier numérique), alors &amp;lt;code&amp;gt;stringLength(CODE_POSTAL)&amp;lt;/code&amp;gt; renvoie &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;. &amp;lt;/p&amp;gt;&lt;br /&gt;
:: &amp;lt;p&amp;gt;Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée et remplacée. Par défaut, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés et remplacés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé dynamique =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou 3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à cibler ;&lt;br /&gt;
## - Dans le cas d'une liste &amp;quot;structurée&amp;quot; (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.&lt;br /&gt;
&lt;br /&gt;
'''Cas pratique'''&lt;br /&gt;
&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
 '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,&lt;br /&gt;
 '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1180</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1180"/>
		<updated>2023-11-30T15:58:35Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Styles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
:: '''Indentation :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-left: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'', soit environ 8 pixels ou 10pt)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-right: 200;&amp;lt;/code&amp;gt; (Idem que pour l'indentation gauche mais à partir de la droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;indentation-first-line: 200;&amp;lt;/code&amp;gt; (Indenter à gauche de 200 ''twips'' mais uniquement la première ligne du paragraphe)&lt;br /&gt;
&lt;br /&gt;
:: '''Espacement de paragraphe :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-after: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''après''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;spacing-before: 200;&amp;lt;/code&amp;gt; (Ajouter un espacement de 200 ''twips'', soit environ 8 pixels ou 10pt, '''avant''' le paragraphe)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;line-height: 1.5em;&amp;lt;/code&amp;gt; (Ajouter une interligne sur le paragraphe d'un facteur de 1.5 hauteurs de ligne) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1179</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1179"/>
		<updated>2023-11-27T22:06:44Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Fonctions sur les Nombres */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;MA_FONCTION( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;MA_FONCTION&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer le nombre de décimale (sans arrondir) =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).&lt;br /&gt;
&lt;br /&gt;
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors &amp;lt;code&amp;gt;truncate(PRIX_ACHAT, 2)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;1.33&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Valeur absolue =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors &amp;lt;code&amp;gt;abs(VARIATION)&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;6.34&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Minimum ou Maximum =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : les deux nombres à comparer.&lt;br /&gt;
&lt;br /&gt;
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;br/&amp;gt;&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(-6, 55)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;max(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(100, 8)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;.&lt;br /&gt;
: - &amp;lt;code&amp;gt;min(-99, 300)&amp;lt;/code&amp;gt; vaut &amp;lt;code&amp;gt;-99&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée et remplacée. Par défaut, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés et remplacés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé dynamique =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou 3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à cibler ;&lt;br /&gt;
## - Dans le cas d'une liste &amp;quot;structurée&amp;quot; (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.&lt;br /&gt;
&lt;br /&gt;
'''Cas pratique'''&lt;br /&gt;
&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
 '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,&lt;br /&gt;
 '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1178</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1178"/>
		<updated>2023-11-27T21:30:23Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;{ 312:letters }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1177</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1177"/>
		<updated>2023-11-27T21:29:39Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: Avec la variable VAR qui vaudrait &amp;quot;Hello&amp;quot;, &amp;lt;code&amp;gt;{ VAR:uppercase } world!&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;HELLO world!&amp;quot;''.&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : permet de passer en majuscule la première lettre de chaque mot, et ne s'applique que sur une chaine de caractères. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Jean Baptiste vous salue&amp;quot;'' avec la variable NOM qui vaudrait ''&amp;quot;jean baptiste&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Option : Il est possible de fournir un paramètre (valeur 1 ou &amp;quot;yes&amp;quot;) à ce traitement pour indiquer que seule la première lettre du premier mot doit être mise en majuscule. Exemple : &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt; =&amp;gt;  ''&amp;quot;Jean baptiste vous salue&amp;quot;'' &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : permet de la convertir la valeur numérique associée en &amp;quot;toutes-lettres&amp;quot; (Français). Ne s'applique que sur une valeur numérique.&amp;lt;br/&amp;gt;&lt;br /&gt;
: Par exemple : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Trois-cent-douze&amp;quot;'').&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;douze euros et trois centimes&amp;quot;'' &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 13.01:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;Treize euros et un centime&amp;quot;'' (remarquer le singulier à &amp;quot;centime&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;quatorze centimes&amp;quot;'' (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;un dollar des États-Unis et quatorze cents&amp;quot;'' (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;cinq hectares et douze ares&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; ''&amp;quot;zero euro&amp;quot;''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1176</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1176"/>
		<updated>2023-11-27T21:13:03Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la convertir en &amp;quot;toutes-lettres&amp;quot;. Par exemple : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Trois-cent-douze&amp;lt;/code&amp;gt;).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Il existe aussi des formatages spéciaux pour les devises ou certaines unités particulières permettant ainsi de mieux nommer les décimales et d'ajuster automatiquement les singuliers / pluriels. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Le code de formatage est passé comme paramètre du traitement. Les codes existants sont les devises : &amp;lt;code&amp;gt;EUR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USD&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CAN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CHF&amp;lt;/code&amp;gt;, et l'unité &amp;lt;code&amp;gt;HECTARE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple : &lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; &amp;quot;douze euros et trois centimes&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 12.03:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; &amp;quot;douze euros et un centime&amp;quot; (remarquer le singulier des centimes). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0.14:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; &amp;quot;quatorze centimes&amp;quot; (remarquer l'absence du nombre entier). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 1.14:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; &amp;quot;un dollar des États-Unis et quatorze cents&amp;quot; (remarquer l'unité en dollar et singulier à dollar). &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 10.560:letters(USD) }&amp;lt;/code&amp;gt; =&amp;gt; &amp;quot;dix dollars des États-Unis et cinquante-six cents&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 5.12:letters(HECTARE) }&amp;lt;/code&amp;gt; =&amp;gt; &amp;quot;cinq hectares et douze ares&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
:: -  &amp;lt;code&amp;gt;{ 0:letters(EUR) }&amp;lt;/code&amp;gt; =&amp;gt; &amp;quot;zero euro&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de passer en majuscule la première lettre de chaque mot. Ex: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Option : si l'option 1 (ou &amp;quot;yes&amp;quot;) est passée en paramètre de ce traitement, alors seule la première lettre du premier mot sera mise en majuscule. Ex: &amp;lt;code&amp;gt;NOM:capitalize(1)&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt;… &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Smartdoc/titre-et-references&amp;diff=1175</id>
		<title>Smartdoc/titre-et-references</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Smartdoc/titre-et-references&amp;diff=1175"/>
		<updated>2023-04-20T06:24:30Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* 2 - Intégrer la référence */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Titres, numérotation et références =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Contexte :''' &lt;br /&gt;
&lt;br /&gt;
Le [[SmartDoc|SmartDoc]] correspond à un système de document dynamique qu'il est possible de paramétrer avec des variables (pour intégrer des valeurs de façon dynamique), des [[Conditions|conditions de visibilités]] (afficher ou masquer un élément du document selon telle ou telle condition), et même des [[Boucles|conditions de répétitions]] (répéter un éléments autant de fois que nécéssaire). &lt;br /&gt;
&lt;br /&gt;
Mais qu'en est il des titres, sous-titres et de leur numérotation ? Comment paramétrer cela dans un modèle de document dynamique puisque n'importe quel chapitre peut apparaitre et disparaitre selon le contexte et que cela remet en cause la numérotation ? Comment faire référence à titre alors que sa numérotation est dynamique ? &lt;br /&gt;
C'est tout cela que nous vous expliquons ici. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Définir un titre ==&lt;br /&gt;
&lt;br /&gt;
Comme défini dans la [[SmartDoc|rubrique dédiée]], un [[SmartDoc|SmartDoc]] est constitué d'une suite ordonnée ''[[Élément_de_contenu|d'éléments de contenu]]''. &lt;br /&gt;
Dans la feuille du tableur de paramétrage, il faut créer autant de lignes que d'[[Élément_de_contenu|éléments de contenus dynamiques]]. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge). &lt;br /&gt;
&lt;br /&gt;
Les [[SmartDoc#Options|&amp;quot;options&amp;quot;]] disponibles sur l'élément de contenu permettent de définir des caractéristiques spéciales de cet élément : notamment indiquer que cet élément doit être considéré comme un titre, lui assigner un &amp;quot;niveau&amp;quot; (titre de niveau 1, 2, ...) et un &amp;quot;identifiant&amp;quot; pour s'y référer.&lt;br /&gt;
 &lt;br /&gt;
:: '''Marche à suivre :''' &lt;br /&gt;
:: -  Créer un nouvel ''[[Élément_de_contenu|élément de contenu]]'' (c'est à dire une nouvelle ligne dans la feuille du tableur de paramétrage)&lt;br /&gt;
:: -  Saisissez le titre à affiche dans la colonne &amp;quot;Contenu&amp;quot;&lt;br /&gt;
:: -  Donner à ce nouvel élément l'option &amp;quot;title-level&amp;quot; pour qu'il soit considéré comme un titre / sous-titre interne au document. L'option &amp;quot;title-level&amp;quot; doit définir le niveau du titre (de 1 à 6 inclus). Ex: `title-level: 3` &lt;br /&gt;
:: -  Vous pouvez éventuellement rajouter une condition de visibilité sur votre élément (comme pour tout autre élément). Notez néanmoins que seul le titre sera affecté par cette condition, pas le contenu qui suit (pour conditionner la visibilité d'une rubrique entière, utilisez [[SmartDoc/Blocs|le système de blocs]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notez que :&lt;br /&gt;
* Ce système de niveau de titre permet de réguler la hiérarchie des titres du document, mais '''ce n'est en rien un moyen de styliser un titre pour qu'il apparaissent plus grand ou plus petit''' (utilisez les &amp;quot;styles&amp;quot; pour cela) ;&lt;br /&gt;
* Il est préférable de '''respecter la logique hiérarchique''' : un titre de niveau 2 ne peut être défini qu'au sein d'un titre de niveau 1, et qu'un titre de niveau 3 ne le sera qu'au sein d'un titre de niveau 2 et ainsi de suite. Il ne serait pas logique de définir un titre de niveau 5 directement en dessous d'un titre de niveau 1 (il sera alors considéré par le document comme un titre de niveau 2 même si vous avez indiqué 5) ;&lt;br /&gt;
* Si vous rajoutez une [[SmartDoc#Visible_if|conditions de visibilités]] sur un titre, cela ne fera pas disparaitre le contenu de la rubrique mais seulement le titre lui-même. Si vous souhaiter conditionner l'affichage de toute une rubrique (titre + ses paragraphes etc.) nous vous conseillons d'utiliser le système de [[SmartDoc/Blocs|&amp;quot;BLOC&amp;quot;]] : le bloc contiendra l'ensemble de la rubrique et la condition d'affichage portera directement sur le bloc ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Intégrer une référence dynamique vers un titre ==&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Vous pouvez à tout moment intégrer dans votre contenu une référence dynamique vers un titre du document.&lt;br /&gt;
&lt;br /&gt;
Notez qu'il existe deux types de référence dynamiques : &lt;br /&gt;
:: - Celles qui référencent un titre du document courant : nommée &amp;quot;référence interne&amp;quot; ;&lt;br /&gt;
:: - Et celles qui font référence à un titre d'un autre document, nommée &amp;quot;référence externe&amp;quot; ou &amp;quot;référence inter-document&amp;quot; ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1 - Identifier le titre ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Id-title.png|vignette|left|Exemples de titres portant des &amp;quot;identifiants&amp;quot; uniques afin qu'ils puissent être référencés .|redresse=1.25]]&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir faire une référence à un titre, il est d'abord nécéssaire de donner un &amp;quot;identifiant unique&amp;quot; au titre vers lequel la référence doit porter.&lt;br /&gt;
Pour cela, on utilise l'option &amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; sur l'élément de contenu correspondant, en plus de l'option &amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; décrite précédemment. Evitez d'intégrer des espaces ou des caractères spéciaux dans vos identifiants de titre car cela peut compliquer l'écriture des références. Ex: &amp;lt;code&amp;gt;title-id: mon-super-titre&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;b&amp;gt;Rappel :&amp;lt;/b&amp;gt; dans un SmartDoc, pour qu'un élément soit affichés comme un titre, il doit porter l'option &amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; avec une valeur comprise entre 1 et 6 selon le niveau de titre (titre de premier niveau, de 2ème niveau etc.). Ex : &amp;lt;code&amp;gt;title-level: 1&amp;lt;/code&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2 - Intégrer la référence ===&lt;br /&gt;
&lt;br /&gt;
Vous pouvez faire référence à un titre dans votre contenu en utilisant :&lt;br /&gt;
&lt;br /&gt;
— &amp;lt;b&amp;gt;Pour une référence vers un titre interne au document&amp;lt;/b&amp;gt;, utilisez l'opérateur spécial &amp;lt;code&amp;gt;@ref&amp;lt;/code&amp;gt;. Cet opérateur doit être accompagné d'un paramètre obligatoire : le '''title-id''' du titre à référencer. Chaque paramètre étant séparé par le signe &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;, la syntaxe d'une référence interne prend la forme de : &amp;lt;code&amp;gt;{ @ref : title-id }&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
— &amp;lt;b&amp;gt;Pour une référence vers un titre présent dans un autre document&amp;lt;/b&amp;gt;, utilisez l'opérateur spécial &amp;lt;code&amp;gt;@ref-ext&amp;lt;/code&amp;gt;. Cet opérateur doit être accompagné de 2 paramètres obligatoires : le '''doc-id''' du document vers lequel porte la référence, puis le  '''title-id''' du titre à référencer dans ce document externe. Chaque paramètre étant séparé par le signe &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;, la syntaxe d'une référence externe prend la forme de : &amp;lt;code&amp;gt;{ @ref-ext : doc-id : title-id }&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''''Exemple de contenu utilisant une référence interne :''''' &lt;br /&gt;
:: &amp;lt;pre&amp;gt;Le décret énonce les différents cas pris en compte par la procédure. Voir : { @ref:article-truc }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''''Exemple de contenu utilisant une référence externe vers un autre document: ''''' &lt;br /&gt;
:: &amp;lt;pre&amp;gt;Voir annexe : { @ref-ext:annexe1:article-truc }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3 - Formater la référence ===&lt;br /&gt;
&lt;br /&gt;
Que ce soit une référence interne ou une référence externe, vous pouvez vouloir afficher la référence au titre de plusieurs façon : seulement la numérotation du titre, seulement le titre, la numérotation du titre ainsi que ces parents (1-5-2) etc. &lt;br /&gt;
&lt;br /&gt;
Par  défaut, l'intégration d'une référence affiche la numérotation suivi du titre mais il est possible de personnaliser l'affichage : &lt;br /&gt;
&lt;br /&gt;
:: '''— N'afficher que la numérotation :'''&lt;br /&gt;
&lt;br /&gt;
:: Utiliser le transformateur &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; comme dernier paramètre pour n'afficher que la numérotation. &lt;br /&gt;
:: &amp;lt;pre&amp;gt;    Comme indiqué à l'article {@ref:article-truc:num} du contrat, il faut recourir à une procédure de ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
:: De même pour une référence externe : &lt;br /&gt;
:: &amp;lt;pre&amp;gt;    Voir article { @ref-ext:mon-doc:article-truc:num } de l'annexe.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''— N'afficher que le titre :'''&lt;br /&gt;
&lt;br /&gt;
:: Utiliser le transformateur &amp;lt;code&amp;gt;:title-only&amp;lt;/code&amp;gt; comme dernier paramètre pour n'afficher que le titre sans sa numérotation. &lt;br /&gt;
:: &amp;lt;pre&amp;gt;    Dans notre article &amp;quot;{@ref:article-truc:title-only}&amp;quot; nous expliquons comment le ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''— Affichage totalement personnalisé :'''&lt;br /&gt;
&lt;br /&gt;
:: Utiliser le transformateur &amp;lt;code&amp;gt;:format(&amp;quot;xxx&amp;quot;)&amp;lt;/code&amp;gt; pour formater vous même l'affichage de la référence.&lt;br /&gt;
:: Il faudra spécifier (à la place des ''xxx'') une chaîne de caractère décrivant le format souhaité. &lt;br /&gt;
:: Cette chaîne répond à la même syntaxe que celle de l'option de document &amp;lt;code&amp;gt;title-num-display&amp;lt;/code&amp;gt; ([[SmartDoc|documentation ici]]) où $1 (et $2, $3 ... $6) font référence à l'index de numérotation d'un titre et permettent ainsi de personnaliser le système de numérotation (Exemple : pour un titre placé au ''9-7-1'' d'un document, &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt; vaut 9, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt; vaut 7, et &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; vaut 1). &lt;br /&gt;
&lt;br /&gt;
:: Utilisez aussi ce transformateur &amp;lt;code&amp;gt;:format&amp;lt;/code&amp;gt; pour mettre en forme votre référence en la préfixant d'un terme, ou en personnalisant les signes séparateurs.  &lt;br /&gt;
&lt;br /&gt;
:: Exemple de contenu : &lt;br /&gt;
:: &amp;lt;pre&amp;gt;    En référence à l'{ @ref:mon-titre:format(&amp;quot;Art. $3.$2&amp;quot;) } du code de ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
:: Ce qui affichera &amp;quot;''En référence à l'&amp;lt;u&amp;gt;Art 6.4&amp;lt;/u&amp;gt; du code de ...''&amp;quot; (pour un titre ayant l'identifiant &amp;quot;''mon-titre'''&amp;quot; dans le document et qui serait le 2ème titre visible du niveau 4, lui-même enfant du 6ème titre visible de niveau 3). &lt;br /&gt;
  &lt;br /&gt;
:: Autre exemple d'intégration personnalisée :  &lt;br /&gt;
:: &amp;lt;pre&amp;gt;    En vous référant à la {@ref:section-bidule:format(&amp;quot;section $3 (article $1.$2)&amp;quot;)}, vous trouverez ... &amp;lt;/pre&amp;gt;&lt;br /&gt;
:: Qui affichera quelque chose comme : &amp;quot;''En vous référant à la &amp;lt;u&amp;gt;section 12 (article 3.4)&amp;lt;/u&amp;gt;, vous trouverez ...''&amp;quot;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=Treatment&amp;diff=1174</id>
		<title>Treatment</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=Treatment&amp;diff=1174"/>
		<updated>2023-04-13T09:46:03Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Types d'instructions de traitement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&lt;br /&gt;
[[File:Exemple-traitements.png|thumb|droite|400px|Exemple d'une table de traitements avec différents types d'instruction (et des commentaires explicatifs).]]&lt;br /&gt;
&lt;br /&gt;
Une table de traitement est un liste d'instruction qui peuvent s'appliquer sur un Dataset, permettant de transformer les données existantes.&lt;br /&gt;
Les traitements sont déclenchés manuellement par l'application (via un Thème par exemple).&lt;br /&gt;
&lt;br /&gt;
Une Configuration peut définir plusieurs table de traitements, chacune ayant un identifiant unique (une chaîne de caractère, sans espace).&lt;br /&gt;
&lt;br /&gt;
Les instructions de la table de traitement sont exécutés dans l'ordre de le lecture.&lt;br /&gt;
&lt;br /&gt;
= Types d'instructions de traitement =&lt;br /&gt;
&lt;br /&gt;
Il existe plusieurs &amp;quot;types&amp;quot; d'instructions de traitement :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;. Instruction la plus élémentaire, elle consiste à '''assigner une nouvelle valeur''' à une variable à partir d'une SmartExpression fournie. La SmartExpression peut faire appel à d'autres variables du Dataset, mais aussi à d'éventuelles [[Variables_dynamiques_(DynVars)|DynVars]]. Ce type d'assignation ne peut s'appliquer que sur une variable simple (de premier niveau).  &lt;br /&gt;
:::: - Voir [[Media:Treat-ex-set-1.png|exemple illustré n°1]].&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-set-2.png|exemple illustré n°2]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;unset&amp;lt;/code&amp;gt; '''Forcer à null la valeur d'une variable'''. À l'inverse de l'instruction précédente, cette instruction permet de &amp;quot;vider&amp;quot; la valeur de la variable spécifiée. Si cette instruction est appliquée sur une variable de type &amp;quot;liste&amp;quot; alors la liste sera vidée de tous ses éléments (sous-variables etc.).&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-unset.png|exemple illustré]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;set-all&amp;lt;/code&amp;gt;. '''L'assignation multiple''' consiste à assigner une valeur à une sous-variable, pour TOUS les éléments d'une liste. La valeur est calculée à partir d'une SmartExpression qui peut faire appel à d'autres variables du Dataset, ainsi qu'à d'éventuelles [[Variables_dynamiques_(DynVars)|DynVars]]. La sous-variable ciblée est indiquée sous la forme de sa définition (Ex: ''EMPLOYÉS.DATE_ENTRÉE''). Il est aussi possible d'utiliser dans l'expression deux variables spéciales &amp;lt;code&amp;gt;_KEY&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;_INDEX&amp;lt;/code&amp;gt; qui prennent la valeur correspondante (respectivement la clé, ou l'index) à chaque sous élément de la liste.   &lt;br /&gt;
:::: - Voir [[Media:Treat-ex-setall-1.png|exemple illustré n°1]].&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-setall-2.png|exemple illustré n°2]].&lt;br /&gt;
:: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;add-in-list&amp;lt;/code&amp;gt;. '''L'ajout ou la mise à jour d'un élément spécifique dans une liste'''. Pour une variable de liste (Ex: EMPLOYÉS), ce type d'instruction permet d'ajouter une nouvelle entrée dans la liste et de définir sa valeur et celle de toutes ses potentielles sous-variables. &lt;br /&gt;
&lt;br /&gt;
:::: Par défaut, si aucune clé n'est définie, un nouvel élément est rajouté dans la liste. &lt;br /&gt;
&lt;br /&gt;
:::: Si une SmartExpression est fournie, et que sa valeur correspond à la clé d'un élément existant de la liste, alors cet élément sera ciblé et mis-à-jour au lieu qu'un nouvel élément soit rajouté à la fin de la liste. &lt;br /&gt;
&lt;br /&gt;
:::: Dans le cas d'une Liste Structurée (ex: EMPLOYÉS), les lignes suivantes dans la table permettront de définir la valeur à assigner aux sous-variables. Elles seront indiquée sous une forme simplifiée, sans re-citer la variable de liste, et donc reconnaissable car débutant par un &amp;quot;.&amp;quot; (ex: &amp;lt;code&amp;gt;.DATE_ENTRÉE&amp;lt;/code&amp;gt; pour définir la valeur de &amp;lt;code&amp;gt;EMPLOYÉ.DATE_ENTRÉE&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
:::: Dans le cas d'une Liste Plate (ex: LIST_COULEURS), qui n'a pas de sous-variables par nature, il faudra utiliser la syntaxe &amp;lt;code&amp;gt;._VALUE&amp;lt;/code&amp;gt;  pour définir la valeur à rajouter dans la liste. &lt;br /&gt;
&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-add-1.png|exemple illustré n°1]] (ajout).&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-add-2a.png|exemple illustré n°2]] (remplacement).&lt;br /&gt;
:::: - Voir (@TODO) (ajout liste plate).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;remove-in-list&amp;lt;/code&amp;gt; '''Le retrait d'un élément dans une liste'''. Pour une variable de liste (Ex: EMPLOYÉS), ce type d'instruction permet de supprimer une entrée en fonction d'une clé fournie au travers de la SmartExpression. &lt;br /&gt;
:::: Si la SmartExpression renvoie une liste plate de clés, alors chacune des clés citée seront retirées (si elles existent dans la liste bien sûr). Cela permet d'effectuer une suppression &amp;quot;multiple&amp;quot;. &lt;br /&gt;
:::: - Voir [[Media:Treat-ex-remove.png|exemple illustré]] (suppression).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; '''La fusion d'une liste sur une autre liste'''. La variable ciblée, de type &amp;quot;liste&amp;quot;, se verra fusionnée à la liste renvoyée par la SmartExpression. Les valeurs indiquées dans cette dernière viendront donc remplacer les valeurs existantes dans la liste ciblée. De plus, si une des deux listes contient des éléments que l'autre liste ne connait pas (identifiés par leurs clés), alors ils seront rajoutés au résultat. &lt;br /&gt;
:::: Dans le cas de listes structurées, il est bien entendu nécéssaire que les deux listes soient similaires au niveau des définitions de leurs sous-variables. En effet, si la liste 2 définie des sous-variables qui n'existent pas dans la liste 1, après la fusion, la liste 1 va se retrouver avec des variables qu'elle ne connait pas, et cela posera un problème d'intégrité résultant en une erreur (fusion nulle). &lt;br /&gt;
::: - Voir exemple illustré (@TODO).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;merge-through-key&amp;lt;/code&amp;gt; '''La fusion d'une liste 1 sur une liste 2, au travers d'une clé spécifiée dans la liste 2'''. Très similaire à l'instruction de fusion précédente, ce type de traitement permet de spécifier la clé de fusion de chaque élément. &lt;br /&gt;
:::: La clé de fusion est indiquée avec la syntaxe &amp;lt;code&amp;gt;through key SUBVAR&amp;lt;/code&amp;gt;, où &amp;lt;code&amp;gt;SUBVAR&amp;lt;/code&amp;gt; est une sous-variable de la liste 2, ayant pour valeur une clé de la liste 1. Ce type de fusion est particulièrement utile dans le cas d'une mise à jour ciblée des éléments d'une liste.&lt;br /&gt;
:::: - Voir [[Media:Treat-ex-merge-through-key.png|exemple illustré]] (exemple avec cumul de traitement). Dans l'exemple illustré, prenez note du retour chariot (obligatoire) entre &amp;quot;EMPLOYÉS&amp;quot; et &amp;quot;through&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1173</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1173"/>
		<updated>2023-03-21T20:49:43Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la convertir en &amp;quot;toutes-lettres&amp;quot; (ex : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Trois-cent-douze&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de passer en majuscule la première lettre de chaque mot. Ex: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Option : si l'option 1 (ou &amp;quot;yes&amp;quot;) est passée en paramètre de ce traitement, alors seule la première lettre du premier mot sera mise en majuscule. Ex: &amp;lt;code&amp;gt;NOM:capitalize(1)&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt;… &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce traitement accepte deux paramètres facultatifs : &amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le premier concerne son formatage : &amp;lt;code&amp;gt;&amp;quot;national&amp;quot;&amp;lt;/code&amp;gt; (par défaut, ex:''06 62 04 63 55'') indique que le numéro s'affichera dans son format national, &amp;lt;code&amp;gt;&amp;quot;international&amp;quot;&amp;lt;/code&amp;gt; (format ''+33 662 04 63 55''), ou &amp;lt;code&amp;gt;&amp;quot;raw&amp;quot;&amp;lt;/code&amp;gt; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
: - Le second paramètre permet d'indiquer d'être silencieux. Par défaut, si le numéro fourni n'est pas un numéro valide, un texte rouge apparaitra pour l'indiquer. Si ce second paramètre indique &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, alors le traitement restera silencieux et, en cas de numéro invalide, le traitement ne renverra rien (chaîne vide).&amp;lt;br/&amp;gt;&lt;br /&gt;
: Exemple: &amp;lt;code&amp;gt;{ MA_VAR_TEL:tel(international, true) }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1172</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1172"/>
		<updated>2023-03-21T20:29:26Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Traitements disponibles et syntaxe spécifique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la convertir en &amp;quot;toutes-lettres&amp;quot; (ex : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Trois-cent-douze&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de passer en majuscule la première lettre de chaque mot. Ex: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Option : si l'option 1 (ou &amp;quot;yes&amp;quot;) est passée en paramètre de ce traitement, alors seule la première lettre du premier mot sera mise en majuscule. Ex: &amp;lt;code&amp;gt;NOM:capitalize(1)&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt;… &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;br/&amp;gt;&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;&amp;quot;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;quot;&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:numeral&amp;lt;/code&amp;gt;: (uniquement pour les valeurs numériques). Permet de transformer un nombre en sa version numérale. Ex: &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;3ème&amp;lt;/code&amp;gt;. Ce traitement accepte le paramètre &amp;quot;m&amp;quot; ou &amp;quot;f&amp;quot; (&amp;quot;f&amp;quot; par défaut), afin de résoudre le 1 =&amp;gt; &amp;quot;1ère, ou 1 =&amp;gt; &amp;quot;1er&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:tel&amp;lt;/code&amp;gt;: Permet de vérifier et de transformer une chaîne ou un nombre en numéro de téléphone (avec les bons espacements etc.). Ce traitement accepte un paramètre sur son formatage : &amp;quot;national&amp;quot; (par défaut, ex: &amp;lt;code&amp;gt;06 62 04 63 55&amp;lt;/code&amp;gt;), &amp;quot;international&amp;quot; (format &amp;lt;code&amp;gt;&amp;quot;+33 662 04 63 55&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;raw&amp;quot; (tel que la chaîne fournie, sans formatage).&amp;lt;br/&amp;gt;&lt;br /&gt;
Si le numéro fourni n'est pas valide, un texte rouge apparaitra pour l'indiquer. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ce filtre peut être utile pour éviter que le numéro de téléphone ne soit interprété comme un nombre et ne soit formaté avec les espacements des milliers etc. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1171</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1171"/>
		<updated>2023-01-29T22:01:36Z</updated>

		<summary type="html">&lt;p&gt;Damien : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivantes sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span,&lt;br /&gt;
* br&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Avertissement sur l'utilisation des balises HTML &amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Veuillez prendre en compte qu'une fois que le système détecte qu'un [[Élément_de_contenu|éléments de contenu]] utilise directement une ou plusieurs balises HTML, l'ensemble de l'élément de contenu est converti au format HTML.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, l'élément de contenu concerné ne peut &amp;lt;b&amp;gt;plus prendre en compte tout autre élément de mise en forme non-HTML&amp;lt;/b&amp;gt;.&amp;lt;/p&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
Par exemple, un saut de ligne inséré à l'aide de la combinaison ALT + ENTREE ne sera plus pris en compte dans cet élément de contenu. Il conviendra alors d'utiliser la balise &amp;lt;nowiki&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt; pour sauter une ligne.&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la convertir en &amp;quot;toutes-lettres&amp;quot; (ex : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Trois-cent-douze&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de passer en majuscule la première lettre de chaque mot. Ex: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Option : si l'option 1 (ou &amp;quot;yes&amp;quot;) est passée en paramètre de ce traitement, alors seule la première lettre du premier mot sera mise en majuscule. Ex: &amp;lt;code&amp;gt;NOM:capitalize(1)&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt;… &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [[http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ''❌ Deprecated depuis 02/2020 : depuis la v0.10 car un formateur &amp;quot;fr&amp;quot; est appliqué par défaut sur variables de Dates ou les chaînes ayant un format de date.'' Ce traitement ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1169</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1169"/>
		<updated>2022-11-24T04:40:55Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Fonctions sur des listes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;MA_FONCTION( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;MA_FONCTION&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
===== arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée et remplacée. Par défaut, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés et remplacés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé dynamique =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2 ou 3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à cibler ;&lt;br /&gt;
## - Dans le cas d'une liste &amp;quot;structurée&amp;quot; (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.&lt;br /&gt;
&lt;br /&gt;
'''Cas pratique'''&lt;br /&gt;
&amp;lt;p&amp;gt;Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: &amp;lt;code&amp;gt;EMPLOYES.NOM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.DATE_ENTREE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EMPLOYES.SALAIRE&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' : &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
 '_abc123' =&amp;gt; [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,&lt;br /&gt;
 '_xyz987' =&amp;gt; [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_abc123', 'NOM')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;quot;Jean&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, '_xyz987', 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer &amp;lt;code&amp;gt;39500.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple). &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer le salaire du meilleur employé selon le choix effectué.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Savoir si une liste contient ou pas une certaine clé =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;has_key&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à rechercher ;&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, '_abc123')&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123' &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Tout comme pour la fonction &amp;lt;code&amp;gt;get_value&amp;lt;/code&amp;gt; cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.&amp;lt;br/&amp;gt;&lt;br /&gt;
Prenons par exemple, une variable &amp;quot;MEILLEUR_EMPLOYE&amp;quot;, qui serait utilisée dans un formulaire avec un champ &amp;quot;choice-list&amp;quot;, et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).&amp;lt;br/&amp;gt; &lt;br /&gt;
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer TRUE si la clé renseignée dans &amp;lt;code&amp;gt;MEILLEUR_EMPLOYE&amp;lt;/code&amp;gt; se trouve bien dans la liste &amp;lt;code&amp;gt;EMPLOYES_CDI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Assigner un nouveau couple clé-valeur dans une liste =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;set_in_struct&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] ;&lt;br /&gt;
## - La clé à créer ou mettre à jour (string);&lt;br /&gt;
## - La valeur a assigner ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Usage'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)&amp;lt;/code&amp;gt; =&amp;gt; va renvoyer la liste PRODUITS avec la nouvelle valeur assignée. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Explication'''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme : &lt;br /&gt;
&amp;lt;pre&amp;gt;[ '_abc123' =&amp;gt; 12.50,  '_xyz985' =&amp;gt; 89.99 ]&amp;lt;/pre&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;CODE_PRODUIT&amp;lt;/code&amp;gt; est une variable &amp;quot;string&amp;quot;, par exemple &amp;quot;_bcd456&amp;quot; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
- &amp;lt;code&amp;gt;PRIX&amp;lt;/code&amp;gt; est une variable &amp;quot;numerique&amp;quot;, par exemple &amp;lt;code&amp;gt;13.50&amp;lt;/code&amp;gt; ; &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
'_abc123' =&amp;gt; 12.50,&lt;br /&gt;
'_xyz985' =&amp;gt; 89.99,&lt;br /&gt;
'_bcd456' =&amp;gt; 13.50,&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1168</id>
		<title>SmartExpressions</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartExpressions&amp;diff=1168"/>
		<updated>2022-11-24T04:06:34Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Fonctions sur les repeaters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Cette page est en cours de construction''&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
On désigne par &amp;quot;SmartExpressions&amp;quot; la syntaxe permettant de paramétrer les [[Dynvars]] et les [[Conditions|Visible If]].&lt;br /&gt;
&lt;br /&gt;
= Paramétrage =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bases de la syntaxe ==&lt;br /&gt;
&lt;br /&gt;
''Cette page est encore en cours de construction''&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type &amp;lt;code&amp;gt;SI ... ALORS&amp;lt;/code&amp;gt; afin de déterminer des règles d'applications, ainsi que des calculs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; : Alors&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; : Sinon&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;or, and&amp;lt;/code&amp;gt; : OU, ET&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; : Concaténation (entre plusieurs chaînes de caractères)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; : opérateurs mathématiques&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Illustration&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Smartex complexe.png|900px|thumb|néant|]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici la SmartExpression utilisée signifie :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Entreprise unipersonnelle à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société à responsabilité limitée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société civile&amp;quot;, &amp;lt;b&amp;gt;ALORS&amp;lt;/b&amp;gt; la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;parts sociales&amp;quot;, sinon &amp;lt;b&amp;gt;SI&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée&amp;quot; &amp;lt;b&amp;gt;OU&amp;lt;/b&amp;gt; si la variable &amp;lt;code&amp;gt;TYPE_SOCIETE&amp;lt;/code&amp;gt; est égale à &amp;quot;Société par actions simplifiée unipersonnelle&amp;quot;, alors la la [[Dynvars|Dynvar]] &amp;lt;code&amp;gt;ACTIONS_PARTS&amp;lt;/code&amp;gt; devra valoir &amp;quot;actions&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Décomposition&amp;lt;/b&amp;gt;&lt;br /&gt;
@LEO TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemples d'application ===&lt;br /&gt;
&lt;br /&gt;
==== Opérations mathématiques ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple : &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar Maths.png|900px|thumb|néant|Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Liste des opérateurs mathématiques pouvant être utilisés : &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Factorisation du raisonnement ====&lt;br /&gt;
&lt;br /&gt;
===== Factorisation simple =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;On peut aussi prévoir qu'une Dynvar prenne pour valeur &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; en fonction de la valeur d'autres variables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvars - true or false.png|900px|thumb|néant|Si une des deux variables vaut &amp;quot;france&amp;quot;, alors la variable FISCALITE_FR vaudra &amp;quot;vrai&amp;quot;.]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette formule signifie : la Dynvar nommée &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; vaudra &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; si &amp;lt;code&amp;gt;NATIONALITE_ACHETEUR&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;NATIONALITE_VENDEUR&amp;lt;/code&amp;gt; est égal à &amp;lt;code&amp;gt;&amp;quot;france&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera donc possible d'utiliser la Dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt; dans des [[Conditions|Visible Ifs]], ou même dans les formules d'autres Dynvars.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour utiliser la dynvar &amp;lt;code&amp;gt;FISCALITE_FR&amp;lt;/code&amp;gt;, on utilisera donc la SmartExpression suivante : &amp;lt;code&amp;gt;FISCALITE_FR = true&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;FISCALITE_FR = false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Factorisation et chaînes de caractères =====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple smartex complexe.png|900px|vignette|néant|La SmartExpression contenue dans cette dynvar]]&lt;br /&gt;
&amp;lt;p&amp;gt;Dans l'exemple ci-dessus, la SmartExpression signifie : &amp;quot;Si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est supérieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;bénéfice&amp;quot;, sinon si la variable &amp;lt;code&amp;gt;SOCIETE_RESULTAT&amp;lt;/code&amp;gt; est inférieure à 0, &amp;lt;b&amp;gt;Alors&amp;lt;/b&amp;gt; la Dynvar &amp;lt;code&amp;gt;BENEFICE_PERTE&amp;lt;/code&amp;gt; doit valoir &amp;quot;perte&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Dynvars et chaînes de caractères ====&lt;br /&gt;
&amp;lt;p&amp;gt; Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Dynvar full name bis.png|900px|vignette|néant|Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.]]&lt;br /&gt;
&lt;br /&gt;
== Les fonctions ==&lt;br /&gt;
&lt;br /&gt;
=== Principes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction prend toujours la forme suivante : &amp;lt;code&amp;gt;MA_FONCTION( xxx )&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fonction est donc toujours composée de trois éléments :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;MA_FONCTION&amp;lt;/code&amp;gt; : on commence toujours par nommer la '''fonction''' souhaitée.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; : ces parenthèses dites &amp;quot;d'exécution&amp;quot; peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; : les '''paramètres''' de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Dates ====&lt;br /&gt;
&lt;br /&gt;
===== Opération sur une date =====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : ''&amp;quot;3 mois après la date de signature…&amp;quot;''), ou parler d'une date en fonction d'une autre (Ex : ''&amp;quot;12 jours avant la date…&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
# Nom de la fonction : &amp;lt;code&amp;gt;date_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Un nombre entier (positif ou négatif) &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité sous forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;jour_franc&amp;quot;, &amp;quot;mois_franc&amp;quot; (tenant compte des jours fériés Français) &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de &amp;quot;mois de même quantième&amp;quot;. On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut rajouter 3 jours à cette date : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 3, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Ou avec une valeur négative, pour soustraire 3 ans par exemple : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, -3, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;12/05/2017&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :&lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, 4, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Alsace-Moselle&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;18/05/2017&amp;lt;/code&amp;gt; (car il saute le week-end) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Pour aller plus loin :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Dans les exemples précédents, la seule variable était ''DATE_SIGNATURE'' (avec pour valeur ''12/05/2020''). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le &amp;lt;code&amp;gt;date_sum(…)&amp;lt;/code&amp;gt;. Par exemple, avec &amp;lt;code&amp;gt;AJOUT_NUM&amp;lt;/code&amp;gt; qui vaudrait 3 (issue d'un champ numérique), et la variable &amp;lt;code&amp;gt;AJOUT_UNITÉ&amp;lt;/code&amp;gt; qui vaudrait &amp;lt;code&amp;gt;day&amp;lt;/code&amp;gt; (issue d'un champ de choix par exemple),  : &lt;br /&gt;
&amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;15/05/2020&amp;lt;/code&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== savoir si une date est avant une autre date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_before&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;Date 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Date 2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ &amp;quot;date-input&amp;quot; d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format &amp;lt;code&amp;gt;j-m-A&amp;lt;/code&amp;gt; (la précision peut aller jusqu'à la seconde : &amp;lt;code&amp;gt;j-m-A h:m:s&amp;lt;/code&amp;gt;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''12/05/2020'', et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2020&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FAUX&amp;lt;/code&amp;gt; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ Alors que &amp;lt;code&amp;gt;date_before(DATE_SIGNATURE,&amp;quot;01-01-2021&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; &lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== calcul de la différence entre deux dates =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_diff&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : &amp;quot;year&amp;quot;; &amp;quot;month&amp;quot;; &amp;quot;day&amp;quot;; &amp;quot;hour&amp;quot;; &amp;quot;minute&amp;quot;; &amp;quot;second&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
       + Unité spéciale pour la France et ses territoires :  &amp;quot;jour_ouvrable&amp;quot;, &amp;quot;jour_ouvré&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. &lt;br /&gt;
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une date de signature (''DATE_SIGNATURE'') ayant pour valeur le ''31/05/2020'', et l'on veut savoir combien d'années de différence entre les 2 dates :&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;date_diff(DATE_SIGNATURE,&amp;quot;20-09-2004&amp;quot;,&amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; car 15 années se sont écoulées &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;year&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie aussi &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; (la valeur est absolue, peu importe l'ordre des dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;20-09-2004&amp;quot;,DATE_SIGNATURE, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;5732&amp;lt;/code&amp;gt; (le nombre total de jour entre les deux dates) &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;day&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;18&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). &amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;date_diff(&amp;quot;01-05-2020&amp;quot;,&amp;quot;31-05-2020&amp;quot;, &amp;quot;jour_ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== renvoyer automatiquement la date du jour =====&lt;br /&gt;
&lt;br /&gt;
''Spécificité : fonction unaire, ne possède pas de paramètres''&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;now()&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : N/A&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:Now().png|thumb|neant|780px]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== trouver automatiquement l'âge d'un individu =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;years_old&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;years_old(DATE_NAISSANCE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== isoler le jour, le mois, l'année d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_day&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_month&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;date_year&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_month(DATE_SIGNATURE)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître le jour de la semaine =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_weekday&amp;lt;/code&amp;gt; , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).&lt;br /&gt;
&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple : &amp;lt;code&amp;gt;date_weekday(DATE_SIGNATURE)&amp;lt;/code&amp;gt; =&amp;gt; Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Savoir si le jour est ouvrable, ouvré, ou férié =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;day_is&amp;lt;/code&amp;gt; , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.&lt;br /&gt;
&lt;br /&gt;
# Paramètres attendus : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;ul style=&amp;quot;margin-left:50px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format &amp;quot;d-m-Y H:i&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 2 - Le type de jour demandée parmi : &amp;lt;code&amp;gt;weekend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ouvré&amp;lt;/code&amp;gt;,  &amp;lt;code&amp;gt;ouvrable&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;férié&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,&lt;br /&gt;
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Par exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;25-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car le jour de Noël est férié&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;férié&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;26-12-2021&amp;quot;, &amp;quot;weekend&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un dimanche.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;23-12-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un jeudi, non-férié.&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; car ce jour est un vendredi, non-férié (en Métropole du moins).&amp;lt;br/&amp;gt;&lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;day_is(&amp;quot;22-05-2021&amp;quot;, &amp;quot;ouvré&amp;quot;, &amp;quot;Martinique&amp;quot;)&amp;lt;/code&amp;gt;  =&amp;gt;  renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car ce jour est férié en Martinique contrairement à la Métropole.&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== changer le format d'une date =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;date_format&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une date, Un format de date&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Passer d'une date complète à un format jour/mois&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;date_format(DATE_NAISSANCE, &amp;quot;d/m&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Nombres ====&lt;br /&gt;
&lt;br /&gt;
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''&lt;br /&gt;
&lt;br /&gt;
===== arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre, Un autre nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre''&lt;br /&gt;
&amp;lt;p&amp;gt;La méthode utilisée est celle de l'arrondi [https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)#Arrondi_au_plus_proche_ou_arrondi_arithm%C3%A9tique arithmétique].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à 3 chiffres après la virgule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;round(PRIX_ACHAT, 3)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== arrondir un nombre entier à l'entier inférieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier inférieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;floor(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== arrondir un nombre entier à l'entier supérieur =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Un nombre&lt;br /&gt;
&lt;br /&gt;
''La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour arrondir un prix d'achat à l'entier supérieur&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ceil(PRIX_ACHAT)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur les Chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères commence par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;begins_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Trouver si une chaîne de caractères se finit par une autre chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;ends_with&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), une autre Chaîne de caractères&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;''La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher''&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;''La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre''&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Un élément en contient-il un autre ? =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
::::1er paramètre : une Chaine A ([[DataStore|string]]) ou une Liste ([[DataStore|list]])&lt;br /&gt;
::::Paramètre 2 : une chaîne B ([[DataStore|string]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si le 1er paramètre est &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; par défaut.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: 30px&amp;quot;&amp;gt; &lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;b style=&amp;quot;color: #777;&amp;quot;&amp;gt;Exemple :&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'. &amp;lt;br/&amp;gt;&lt;br /&gt;
     Et soit une Liste HOBBIES correspondants à 3 choix : &amp;lt;code&amp;gt;[&amp;quot;sport&amp;quot;, &amp;quot;cinema&amp;quot;, &amp;quot;music&amp;quot;]&amp;lt;/code&amp;gt; (saisis par exemple via un champ de choix multiple). &lt;br /&gt;
  &amp;lt;p&amp;gt; ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient la chaine &amp;quot;F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;2020F&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; contient aussi la chaine &amp;quot;2020F&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(NUM_FACTURE,&amp;quot;20 Euros&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car la chaine &amp;quot;2020F01&amp;quot; ne contient pas &amp;quot;20 Euros&amp;quot; &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cinema&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;VRAI&amp;lt;/code&amp;gt; et c'est d'ailleurs le 2ème élément &amp;lt;br/&amp;gt; &lt;br /&gt;
      ▷ &amp;lt;code&amp;gt;contains(HOBBIES,&amp;quot;cine&amp;quot;)&amp;lt;/code&amp;gt; =&amp;gt; renvoie &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; car aucun élément est exactement nommé &amp;quot;cine&amp;quot; parmi ceux de la liste &amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Tronquer une chaîne de caractères =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation&lt;br /&gt;
''À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2, 3)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcu&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou encore :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 0, 4)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;Herc&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ou enfin :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour une dynvar paramétrée de la manière suivante : &amp;lt;code&amp;gt;substring(DENOMINATION, 2)&amp;lt;/code&amp;gt;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si la variable DENOMINATION vaut &amp;quot;Hercule&amp;quot;;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La Dynvar ainsi paramétrée vaudra &amp;quot;rcule&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Connaître la position d'une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringPos&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. (Ex: &amp;lt;code&amp;gt;&amp;quot;Maison d'été&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.&lt;br /&gt;
&lt;br /&gt;
Notez que le premier caractère est comptabilisé comme à la position n°0.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;n&amp;quot;)&amp;lt;/code&amp;gt; va retourner 5 car la lettre &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie (la lettre &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; étant comptée comme la position n°0)&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Maison d'été&amp;quot;, &amp;quot;été&amp;quot;)&amp;lt;/code&amp;gt; va retourner 9 car le terme &amp;lt;code&amp;gt;été&amp;lt;/code&amp;gt; se trouve à la 9ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringPos(&amp;quot;Blablabla&amp;quot;, &amp;quot;a&amp;quot;, 3)&amp;lt;/code&amp;gt; va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; se trouve à la 5ème position de la chaîne fournie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;avant&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringBefore&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Maison&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringBefore(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Tronquer la chaîne avec tout ce qui est &amp;quot;après&amp;quot; une sous-chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringAfter&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 1 obligatoire, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher. &lt;br /&gt;
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt; sera utilisé.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Maison d'été&amp;quot;, &amp;quot; &amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;d'été&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après l'espace.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringAfter(&amp;quot;Damien, Jean, Paul&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt; Jean, Paul&amp;lt;/code&amp;gt; car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Rechercher et remplacer dans une chaîne =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;stringReplace&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : 2 obligatoires, 1 facultatif.&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
##  La chaîne de caractères dans laquelle rechercher et remplacer ;&lt;br /&gt;
##  La chaîne de caractères de remplacement (celle qui sera &amp;quot;insérée&amp;quot;) ;&lt;br /&gt;
##  (Optionnel) La chaîne de caractères qui sera recherchée et remplacée. Par défaut, ce sont des sauts de ligne (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) qui seront recherchés et remplacés.&lt;br /&gt;
&lt;br /&gt;
Ex: &amp;lt;code&amp;gt;stringReplace(&amp;quot;Damien&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; va retourner &amp;lt;code&amp;gt;Famien&amp;lt;/code&amp;gt; car on lui demande de remplacer &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; dans la chaîne &amp;lt;code&amp;gt;Damien&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.  &lt;br /&gt;
&lt;br /&gt;
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : &amp;lt;code&amp;gt;stringReplace(ADDRESS, &amp;quot;\n&amp;quot;, &amp;quot;,&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fonctions sur des listes ====&lt;br /&gt;
&lt;br /&gt;
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;list_sum&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : &lt;br /&gt;
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;&lt;br /&gt;
## - Le nom de la sous-variable qui devra être additionnée ;&lt;br /&gt;
&lt;br /&gt;
'''Contexte'''&lt;br /&gt;
&amp;lt;p&amp;gt;Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, dans cette situation :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]&lt;br /&gt;
&lt;br /&gt;
'''Paramétrage'''&lt;br /&gt;
&amp;lt;p&amp;gt;Le paramétrage prend la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;list_sum(VARIABLE_LISTE,&amp;quot;SOUS_VARIABLE&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera &amp;lt;code&amp;gt;list_sum(CHEMISES,&amp;quot;prix&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fonctions autres ====&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_empty(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen &amp;quot;false&amp;quot; (c'est d'ailleurs pour cela qu'il est préférable d'utiliser &amp;lt;code&amp;gt;`is_empty(MY_VAR)`&amp;lt;/code&amp;gt; au lieu de, par exemple, &amp;lt;code&amp;gt;`MY_VAR = null`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Vérifier si une variable est &amp;quot;non vide&amp;quot; =====&lt;br /&gt;
&lt;br /&gt;
# Fonction : &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt;&lt;br /&gt;
# Nombre de paramètres : &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;&lt;br /&gt;
# Paramètres attendus : Une variable de n'importe quel type&lt;br /&gt;
# Exemple : &amp;lt;code&amp;gt;is_set(MY_VAR) == true&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;A l'inverse de la fonction &amp;lt;code&amp;gt;is_empty&amp;lt;/code&amp;gt;, la fonction &amp;lt;code&amp;gt;is_set&amp;lt;/code&amp;gt; permet de savoir si une variable possède une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La fonction renverra VRAI pour n'importe quelle variable non-vide : &amp;quot;une chaîne&amp;quot;, un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1162</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1162"/>
		<updated>2022-08-30T18:15:00Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Visible if */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivants sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la convertir en &amp;quot;toutes-lettres&amp;quot; (ex : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Trois-cent-douze&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de passer en majuscule la première lettre de chaque mot. Ex: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Option : si l'option 1 (ou &amp;quot;yes&amp;quot;) est passée en paramètre de ce traitement, alors seule la première lettre du premier mot sera mise en majuscule. Ex: &amp;lt;code&amp;gt;NOM:capitalize(1)&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt;… &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [[http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. Depuis la version v0.10, ce filtre est &amp;quot;facultatif&amp;quot; car il est appliqué par défaut sur les dates ou les chaînes au format de date. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
'''Particularité :''' les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1161</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1161"/>
		<updated>2022-08-30T18:13:44Z</updated>

		<summary type="html">&lt;p&gt;Damien : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivants sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la convertir en &amp;quot;toutes-lettres&amp;quot; (ex : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Trois-cent-douze&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de passer en majuscule la première lettre de chaque mot. Ex: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Option : si l'option 1 (ou &amp;quot;yes&amp;quot;) est passée en paramètre de ce traitement, alors seule la première lettre du premier mot sera mise en majuscule. Ex: &amp;lt;code&amp;gt;NOM:capitalize(1)&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt;… &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [[http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. Depuis la version v0.10, ce filtre est &amp;quot;facultatif&amp;quot; car il est appliqué par défaut sur les dates ou les chaînes au format de date. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&lt;br /&gt;
=== Visible if ===&lt;br /&gt;
&lt;br /&gt;
Ici, les [[Conditions|visible ifs]] permettront de conditionner l’apparition des contenus dans le Document.&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]].&lt;br /&gt;
&lt;br /&gt;
Particularité: les [[Conditions|visible ifs]] des SmartDocs peuvent utiliser la variable spéciale &amp;lt;code&amp;gt;_CURRENT_DOC_ID&amp;lt;/code&amp;gt; (type ''string'') qui contient l'identifiant du document courant.&lt;br /&gt;
&lt;br /&gt;
=== Utiliser les [[Boucles]] ===&lt;br /&gt;
Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]].&lt;br /&gt;
&lt;br /&gt;
=== Commentaire ===&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1160</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1160"/>
		<updated>2022-08-30T16:31:39Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Contenu spécial ou dynamique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivants sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section'' &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document.&lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la convertir en &amp;quot;toutes-lettres&amp;quot; (ex : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Trois-cent-douze&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de passer en majuscule la première lettre de chaque mot. Ex: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Option : si l'option 1 (ou &amp;quot;yes&amp;quot;) est passée en paramètre de ce traitement, alors seule la première lettre du premier mot sera mise en majuscule. Ex: &amp;lt;code&amp;gt;NOM:capitalize(1)&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt;… &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [[http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. Depuis la version v0.10, ce filtre est &amp;quot;facultatif&amp;quot; car il est appliqué par défaut sur les dates ou les chaînes au format de date. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;visible-if&amp;quot;&amp;gt;[[Conditions|Visible if]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, les [[Conditions|visible ifs]] permettront de conditionner logiquement l’apparition du texte se trouvant dans la colonne “Contenu”&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;utiliser-les-loops-boucles-&amp;quot;&amp;gt;Utiliser les [[Boucles]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;commentaire&amp;quot;&amp;gt;Commentaire&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1159</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1159"/>
		<updated>2022-08-30T15:49:29Z</updated>

		<summary type="html">&lt;p&gt;Damien : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
=== Métadonnées ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DataStore ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
La colonne &amp;quot;Options&amp;quot; permet de définir des options relatives au document courant.&lt;br /&gt;
Cette cellule attend un contenu au format YAML.&lt;br /&gt;
&lt;br /&gt;
==== L'option &amp;quot;title-num-display&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
L'option &amp;quot;title-num-display&amp;quot; permet de définir le format d’affichage pour la numérotation de chaque titre du document. &lt;br /&gt;
&lt;br /&gt;
Si cette option vaut &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; les titres et les références affichées dans ce document seront &amp;quot;désactivées&amp;quot; et ne s'afficheront donc pas.&lt;br /&gt;
&lt;br /&gt;
Au contraire, pour personnaliser le format de la numérotation, cette option attend une liste clés-valeurs (texte indenté, YAML), où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, trois attributs peuvent être saisis : &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, et &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; (voir exemple imagée ci-dessous).&lt;br /&gt;
&lt;br /&gt;
Les valeurs possible pour l'attribut &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt; sont :&lt;br /&gt;
:: - &amp;quot;decimal&amp;quot; : numérotation décimale classique en chiffre arabe (1, 2 , 3 …) ;&lt;br /&gt;
:: - &amp;quot;upper-roman&amp;quot; : nombre romain majuscule (I, II, III, IV etc.) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.) ;&lt;br /&gt;
:: - &amp;quot;upper-alpha&amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E) ;&lt;br /&gt;
:: - &amp;quot;lower-roman&amp;quot; : numérotation alphabétique minuscule (a, b, c, d...) ;&lt;br /&gt;
:: - &amp;quot;none&amp;quot; : aucune numérotation pour ce niveau de titre ;&lt;br /&gt;
 &lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; attend une chaîne de caractère qui permet de représenter le contexte (préfixe, suffixe…) de la numérotation à afficher avant chaque Titre.&lt;br /&gt;
Cette chaîne doit contenir au moins une fois un $1, $2, $3 … $6, qui seront remplacés par la numérotation pur le niveau concerné.&lt;br /&gt;
L'attribut &amp;lt;code&amp;gt;format-ref&amp;lt;/code&amp;gt; fonctionne de la même façon que l'attribut précédent mais il permet de représenter la numérotation à afficher dans chaque référence intégrée au sein du document (voir [[Smartdoc/titre-et-references|SmartDocument, faire une référence à un titre]]).&lt;br /&gt;
&lt;br /&gt;
Ces attributs doivent contenir au moins une fois un code numéroté tel que &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$3&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;$6&amp;lt;/code&amp;gt;, qui permettra d'être remplacé par la numérotation du niveau concerné.&lt;br /&gt;
&lt;br /&gt;
'''Exemple''' : le format “&amp;lt;code&amp;gt;$1)&amp;lt;/code&amp;gt;“ s'affichera “''A)''”, &amp;quot;''B)''&amp;quot;, &amp;quot;''C)''&amp;quot; etc. (s'il est combiné au style &amp;lt;code&amp;gt;&amp;quot;upper-alpha&amp;quot;&amp;lt;/code&amp;gt;), ou &amp;quot;i)&amp;quot;, &amp;quot;ii)&amp;quot;, &amp;quot;iii)&amp;quot; (style &amp;lt;code&amp;gt;&amp;quot;lower-roman&amp;quot;&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Autre exemple''' : “&amp;lt;code&amp;gt;Article $1.$2&amp;lt;/code&amp;gt;“ s'affichera “Article 1.A”, &amp;quot;Article 1.B&amp;quot;, &amp;quot;Article 2.A&amp;quot; … (combiné avec un niveau 1 au style &amp;lt;code&amp;gt;décimal&amp;lt;/code&amp;gt; et un niveau 2 en &amp;lt;code&amp;gt;upper-roman&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''Exemple complet :'''&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
D'après la configuration de l'image ci-dessus, les titres :&lt;br /&gt;
* de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&lt;br /&gt;
* de niveau 2 seront de la forme : “2 Lorem ipsum ”&lt;br /&gt;
* de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&lt;br /&gt;
* de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&lt;br /&gt;
* de niveau 5 seront de la forme : “a. Lorem ipsum ”&lt;br /&gt;
* de niveau 6 seront de la forme : “ iv ) Lorem ipsum&lt;br /&gt;
&lt;br /&gt;
=== List-Labels ===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivants sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : Comme décrit dans la section &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document. &lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la convertir en &amp;quot;toutes-lettres&amp;quot; (ex : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Trois-cent-douze&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de passer en majuscule la première lettre de chaque mot. Ex: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Option : si l'option 1 (ou &amp;quot;yes&amp;quot;) est passée en paramètre de ce traitement, alors seule la première lettre du premier mot sera mise en majuscule. Ex: &amp;lt;code&amp;gt;NOM:capitalize(1)&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt;… &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [[http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. Depuis la version v0.10, ce filtre est &amp;quot;facultatif&amp;quot; car il est appliqué par défaut sur les dates ou les chaînes au format de date. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;visible-if&amp;quot;&amp;gt;[[Conditions|Visible if]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, les [[Conditions|visible ifs]] permettront de conditionner logiquement l’apparition du texte se trouvant dans la colonne “Contenu”&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;utiliser-les-loops-boucles-&amp;quot;&amp;gt;Utiliser les [[Boucles]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;commentaire&amp;quot;&amp;gt;Commentaire&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1158</id>
		<title>SmartDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.hercule.co/index.php?title=SmartDoc&amp;diff=1158"/>
		<updated>2022-07-05T17:40:37Z</updated>

		<summary type="html">&lt;p&gt;Damien : /* Styles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 id=&amp;quot;smartdoc&amp;quot;&amp;gt;SmartDoc&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;introduction&amp;quot;&amp;gt;Introduction&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;En premier lieu, un SmartDoc doit être clairement identifié par son doc-id, qui doit être strictement le même que le doc-id spécifié dans la [[DocList]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La nouvelle feuille du [[Fichier de Paramétrage]] qui a vocation à être un SmartDoc doit donc se nommer précisément : Doc “le_doc-id”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, la [[DocList]] mentionne un seul SmartDoc, dont le doc-id est “demo-hercule” :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:DocList 1.png|frame|none|Une DocList classique]]&lt;br /&gt;
&amp;lt;p&amp;gt;En conséquence, la feuille correspondante  se nomme demo-hercule&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Capture d’écran 2019-07-24 à 11.19.59.png|frame|none]]&lt;br /&gt;
&amp;lt;p&amp;gt;Quant aux colonnes détaillées ci-dessous, elles doivent toutes obligatoirement être remplies, à l’exception de la colonne D “List Labels”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;metadonn-es-datastore-options-list-labels&amp;quot;&amp;gt;Metadonnées, datastore, options, list labels&amp;lt;/h2&amp;gt;&lt;br /&gt;
[[Fichier:Smartdoc options 1.png|sans_cadre|1200px|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;Métadonnées&amp;quot;&amp;gt;Métadonnées&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; C'est un simple espace de commentaire &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;Datastore&amp;quot;&amp;gt;DataStore&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[DataStore]] : C’est l'id du [[DataStore]] auquel les variables utilisées dans le document sont associées. Par défaut, mainstore.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;title-num-display&amp;quot;&amp;gt;Options - title-num-display&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;title-num-display :  cette colonne permet de définir le format d’affichage pour la numérotation de chaque titre du document. Cette option attend un tableau, où chaque clé est un niveau de titre (de 1 à 6 inclus), et pour chaque niveau, deux attributs à configurer : style et format .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Les valeurs possible pour les attributs style sont :&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;quot;upper-roman&amp;amp;quot; : nombre romain majuscule (I, II, III, IV etc...)&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;quot;decimal&amp;amp;quot; : numérotation décimale / chiffres arabes (1, 2 , 3 ...)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;quot;lower-roman&amp;amp;quot; : nombre romain minuscule (i, ii, iii, iv etc.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;quot;lower-alpha” : numérotation alphabétique minuscule (a, b, c, d...)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;amp;quot;upper-alpha&amp;amp;quot; : numérotation alphabétique majuscule (A, B, C, D, E)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;En ce qui concerne l’attributs format  :&amp;lt;/strong&amp;gt;&lt;br /&gt;
Il attend une chaîne de caractère dans laquelle $1, $2, $3 … $6  seront remplacés par la numérotation (au style attribué). &lt;br /&gt;
Exemple : “Article $1.$2” peut donner “Article 3.a”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple complet :&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:Gestion des titres.png|frame|none|Gestion du format des titres]]&lt;br /&gt;
&amp;lt;p&amp;gt;Où les titres :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;de niveau 1 seront de la forme : “ARTICLE 8 - Lorem ipsum”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;de niveau 2 seront de la forme : “2 Lorem ipsum ”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;de niveau 3 seront de la forme : “2-5 Lorem ipsum ”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;de niveau 4 seront de la forme : “2-5-10 Lorem ipsum ”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;de niveau 5 seront de la forme : “a. Lorem ipsum ”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;de niveau 6 seront de la forme : “ iv ) Lorem ipsum”&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;List-Labels&amp;quot;&amp;gt;List-Labels&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Introduction&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;List-Labels : cette colonne permet d’effectuer une conversion entre des choix d’une variable de type “choices” du SmartForm et le SmartDoc. Autrement dit, elle permet d'établir des &amp;quot;dictionnaires de correspondance&amp;quot; permettant de faire correspondre un libellé à une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple :&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Fichier:List Label.png|none|frame|La gestion des List Labels]]&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois un List-Label préparé, il est possible de l'utiliser grâce au traitement Label&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Contexte&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne &amp;quot;Choices&amp;quot; du  `Fields-Form` vous permet de spécifier les choix qui doivent apparaitre dans le formulaire. Chaque choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- s'écrit sur une ligne différente, ligne qui doit se terminer par un point-virgule ;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;- chaque choix s'écrit en deux parties séparées par un &amp;quot;:&amp;quot; afin d'indiquer, à gauche, la valeur à stocker en base de données (et à utiliser dans les [[Conditions|visible ifs]]) et à droite la valeur à afficher dans le formulaire. On parle de couple &amp;quot;valeur : libellé&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Fichier:Dg.png|thumb|none|375px]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Mise en place&amp;lt;/strong&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le document n'est pas à même de décider sous quelle forme afficher la variable correspondante aux choix d'un champ de type &amp;quot;choix&amp;quot;&amp;lt;/p&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;Si rien n'est spécifié, le document affichera ce qui est stocké dans la base de données &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est toutefois possible d'indiquer au document des libellés et pour cela intervient le filtre &amp;lt;code&amp;gt;:label(xxx)`&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Par exemple, on peut imaginer un dictionnaire nommé &amp;quot;fonctions&amp;quot; pour indiquer que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Directeur Général&amp;quot;, et un autre dictionnaire nommé &amp;quot;fonctions_abrégées&amp;quot; qui indiquerait au contraire que &amp;quot;dg&amp;quot; doit s'afficher &amp;quot;Dir. G.&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il sera alors possible, dans le contenu du SmartDoc, de faire appel au dictionnaire de votre choix :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;- M. Dupond occupant le poste de &amp;lt;code&amp;gt;{VARFONCT:label(&amp;quot;&lt;br /&gt;
fonctions_abrégées&amp;quot;)}&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Les dictionnaires sont définis via la case D2 (List Labels) des onglets &amp;quot;Doc&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ils sont écrits sous la forme suivante :&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[[Fichier:D2.png|none|thumb|175px]]&lt;br /&gt;
&amp;lt;p&amp;gt;⚠ Notez les espaces d'indentation qui permettent d'indiquer au système l'imbrication / hiérarchie de l'info. C'est à dire qu'ici, val1 et val2 appartiennent au premier dictionnaire, alors que valA et valB appartiennent au second dictionnaire. Sans cette indentation, le système ne saurait pas reconnaitre si la ligne correspond à la déclaration d'un nouveau dictionnaire ou à un couple valeur/libellé. &amp;lt;/p&amp;gt;&lt;br /&gt;
→ A noter : On peut aussi utiliser un libellé référencé dans une “[[Choice-List]]”.&lt;br /&gt;
Par exemple, il est possible de créer un List Label nommé “countries” qu’on configurerait de la manière suivante :  &amp;lt;code&amp;gt;countries: @pays&amp;lt;/code&amp;gt; .&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut alors l’utiliser de la même façon au sein d’un document avec, par exemple, &amp;lt;code&amp;gt;{PAYS_NAISS:label(&amp;quot;countries&amp;quot;)}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;La colonne A qui donne France si la variable PAYS_NAISS vaut “FR”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;templates-docx&amp;quot;&amp;gt;Les modèles .docx&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le SmartDoc consiste à définir du &amp;quot;contenu dynamique&amp;quot;, bien qu'il soit possible de définir certains styles de base (couleurs, gras, italiques, titres etc.), la mise en page du document lui même reste limitée. C'est en cela que les &amp;quot;modèles .docx&amp;quot; peuvent être utile.&lt;br /&gt;
&lt;br /&gt;
Chaque SmartDoc peut se baser sur un modèle de fichier, au format .docx. Le contenu dynamique sera tout simplement &amp;quot;injecté&amp;quot; dans le document à l'endroit indiqué.&lt;br /&gt;
Le modèle peut, par exemple, prévoir un habillage (page de couverture, page de garde etc.), prévoir des entêtes et pieds-de-page, mais surtout, peut permettre de définir les marges du document et les styles des paragraphes et des titres (tailles, couleurs, espacement...). &lt;br /&gt;
Le contenu dynamique, créé au travers du SmartDoc, se retrouvera simplement injecté dans le modèle prédéfini. &lt;br /&gt;
&lt;br /&gt;
'''Définir un modèle et l'associer à un ou plusieurs SmartDoc'''&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir utiliser un modèle, il suffit de le rajouter dans la Doc-List, en lui donnant un identifiant unique, et en indiquant le type &amp;lt;code&amp;gt;docx-template&amp;lt;/code&amp;gt; (vous pouvez aussi préciser un titre, une description). &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle présent dans la Doc-List, il est possible de l'associer à un SmartDoc en utilisant l'option : &amp;lt;code&amp;gt;docx-template: mon-template&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Préparer son modèle et l'injection du contenu'''  &lt;br /&gt;
&lt;br /&gt;
Le modèle .docx peut être préparé comme un document classique : définir les styles des titres et des paragraphes, définir les marges et les interlignes, une page de couverture et des pieds-de-pages etc.&lt;br /&gt;
Pour définir où le contenu dynamique devra être injecté, il faut utiliser la syntaxe suivante : &amp;lt;code&amp;gt;${ @inject all }&amp;lt;/code&amp;gt;. Ainsi, l'intégralité du contenu du SmartDoc sera intégrée à cet endroit même du modèle.&lt;br /&gt;
Il est aussi possible de demander l'intégration d'un seul [[Blocs | bloc du SmartDoc]], en indiquant, à la place de &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, l'identifiant du SmartDoc et le nom exact du bloc.  &lt;br /&gt;
&lt;br /&gt;
Par exemple, dans un SmartDoc nommé &amp;lt;code&amp;gt;contrat&amp;lt;/code&amp;gt;, un bloc défini par &amp;lt;code&amp;gt;#BLOC dénomination&amp;lt;/code&amp;gt;, pourra être injecté dans le modèle .docx avec la syntaxe suivante :&lt;br /&gt;
  &amp;lt;pre&amp;gt;${ @inject contrats :: dénomination }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Nb :''' notez les 2 fois 2 points (&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;) pour séparer l'identifiant du SmartDoc concerné et le nom exact du bloc à injecter.'' &lt;br /&gt;
&lt;br /&gt;
'''Pour aller plus loin :''' &lt;br /&gt;
*  Vous pouvez trouver plus d'informations sur les modèles docx et sur la manière de les mettre en place sur la [[Docx-template|page dédiée du Wiki]].&lt;br /&gt;
*  Il est parfaitement possible d'utiliser plusieurs injections dans un même modèle .docx. Il vous suffit d'utiliser plusieurs fois la syntaxe &amp;lt;code&amp;gt;${ @inject ... }&amp;lt;/code&amp;gt; dans le document modèle.&lt;br /&gt;
*  Le contenu injecté peut lui-même inclure d'autres blocs (voir [[Smartdoc/include| les &amp;quot;inclusions&amp;quot; (includes) d'un SmartDoc]]), des boucles, des titres etc. &lt;br /&gt;
*  Dans certains cas, il peut être problématique d'injecter un bloc, lui même contenu dans [[Boucles | une boucle du SmartDoc]]. En effet, la boucle a pour conséquence de &amp;quot;contextualiser&amp;quot; la variable sur laquelle elle boucle, si vous injectez ce contenu hors de ce contexte, le SmartDoc ne saura pas comment interpréter la variable correspondante à une occurence de la boucle.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Contenu, options, styles, [[Conditions|visible ifs]], commentaires ==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SmartDoc options 2.png|1200px|sans_cadre|néant]]&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;contenu&amp;quot;&amp;gt;Contenu&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Un SmartDoc est constitué d'une suite ordonnée d'[[Élément_de_contenu|éléments de contenu]]. Dans la feuille du tableur de paramétrage, il faut créer autant de ligne que d'éléments de contenu dynamique. On défini un nouvel élément pour lui associer une condition de visibilité spécifique (ex : car cet élément ne doit pas s'afficher dans certains cas), ou on veut lui associer un &amp;quot;style&amp;quot; spécifique (ex : mettre une partie du paragraphe en couleur rouge).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Le “contenu” du SmartDoc est ce qui sera effectivement “imprimé” dans le document final qui sera transmis à l’utilisateur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce contenu, en plus d’être dynamique grâce au “visible-ifs” comme le reste du système, accepte aussi l’utilisation de variables.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h4 id=&amp;quot;bases&amp;quot;&amp;gt;Bases&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C’est ici qu’il faut entrer le contenu “brut” du texte : c’est-à-dire le corps du texte.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;On peut se servir des [https://developer.mozilla.org/fr/docs/Apprendre/Commencer_avec_le_web/Les_bases_HTML balises HTML basiques] pour mettre en forme le texte rentré ici.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les balises suivants sont utilisables&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
* a, &lt;br /&gt;
* br, &lt;br /&gt;
* b, &lt;br /&gt;
* strong, &lt;br /&gt;
* i, &lt;br /&gt;
* em, &lt;br /&gt;
* ol, &lt;br /&gt;
* ul, &lt;br /&gt;
* li, &lt;br /&gt;
* hr, &lt;br /&gt;
* span&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Contenu spécial ou dynamique ====&lt;br /&gt;
&lt;br /&gt;
Ils sont de la forme &amp;lt;code&amp;gt;{ @… }&amp;lt;/code&amp;gt; et s'integre parmi le contenu. &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @line-break }&amp;lt;/code&amp;gt; : ajout un saut de ligne : il est possible de forcer un saut de ligne (ou plusieurs) en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@line-break}&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Plusieurs saut de ligne (par exemple 2) : &amp;lt;code&amp;gt;{@line-break:2}&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@page-break&amp;lt;/code&amp;gt;} : ajout d’un saut de page : il est possible de forcer un saut de page en utilisant la syntaxe suivante dans un contenu HTML : &amp;lt;code&amp;gt;{@page-break}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Le saut de page est effectif dans les exports .docx ou .pdf, mais est simulé par une simple ligne verticale dans les prévisualisations HTML.&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; : ajout d’une référence vers un titre : comme pour intégrer une variable, il est possible d’intégrer un lien vers un titre du document (le titre peut se trouver avant ou après la référence dans le contenu). Pour intégrer une référence, il suffit d’utiliser la syntaxe &amp;lt;code&amp;gt;{@ref:my title id}&amp;lt;/code&amp;gt; pour laquelle “my title id” correspond à l’attribut title-id d’un bloc-titre existant dans le document. Le fonctionnement des références croisées est décrit en détail [[Smartdoc/titre-et-references|ici]].&lt;br /&gt;
:::: Nb : si plusieurs titres ont le même title-id alors la référence pointe vers le premier de la page. &lt;br /&gt;
:::: Nb : si la référence pointe vers un titre qui n’existe pas dans le document (ou est invisible), elle sera remplacée par le texte “[référence manquante]”. &lt;br /&gt;
:::: Par défaut, la référence à un titre se contente d’afficher le titre (càd, le contenu du bloc titre).&lt;br /&gt;
&lt;br /&gt;
:::: Une chaine de caractère étant retournée, il est possible d’appliquer les filtres classiques.&lt;br /&gt;
:::: Exemple : Comme décrit dans la section &amp;lt;code&amp;gt;{@ref:droit-acheteur:uppercase}&amp;lt;/code&amp;gt;.&lt;br /&gt;
:::: Le traitement &amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt; peut-être appliqué dans la syntaxe afin d’afficher la référence sous forme numérique et tenant compte des titres parents. &lt;br /&gt;
:::: Exemple : ''Comme décrit dans la section ''&amp;lt;code&amp;gt;{@ref:droit-acheteur:num}&amp;lt;/code&amp;gt;… =&amp;gt; ''Comme décrit dans la section '' '''3.1.1.2'''&lt;br /&gt;
&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-article à “true” le nombre retourné sera simplement celui de l’article dans le cas du traitement “:num”.&lt;br /&gt;
:::: Pour les cas des références vers des titres ayant l’option title-no-count , le traitement “:num” n’aura alors aucun effet.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;Ajout d’un sommaire automatique : il est possible d’ajouter un sommaire automatique au document (table of contents) en utilisant la syntaxe suivante : &amp;lt;code&amp;gt;{@summary}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: — &amp;lt;code&amp;gt;{ @doc-meta(title) }&amp;lt;/code&amp;gt; : permet d'insérer une méta-donnée du document courant. Les 3 paramètres possibles sont : &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, ou &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Pratique, par exemple, pour citer le titre du document au sein du contenu, malgré peut-être la présence d'un clausier et de blocs injectés d'un autre document. &lt;br /&gt;
&lt;br /&gt;
==== Comment rendre dynamique le contenu d'un [[SmartDoc]] ? ====&lt;br /&gt;
&lt;br /&gt;
Pour rendre dynamique le contenu du SmartDoc, il est possible de lui intégrer les valeurs des variables telles qu'elles ont été collectée dans un formulaire, ou calculée via une variable dynamique etc. &lt;br /&gt;
&lt;br /&gt;
La syntaxe pour intégrer un contenu dynamique est reconnaissable car il est systématiquement placé entre accolades : &amp;lt;code&amp;gt;{ … }&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une variable peut être intégrée de façon brute (Exemple : ''&amp;quot;Je m'appelle { PRENOM }.&amp;quot;'').&lt;br /&gt;
L'affichage brut pouvant parfois être trop limitatif, une syntaxe de &amp;quot;traitements SmartDoc&amp;quot; est disponible. Par exemple, le traitement &amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; appliqué sur une variable la fera afficher en majuscule. Exemple ::  ''&amp;quot;Je m'appelle &amp;lt;code&amp;gt;{ PRENOM:uppercase }&amp;lt;/code&amp;gt;.&amp;quot;'').&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 id=&amp;quot;les-primitives&amp;quot;&amp;gt;Les primitives&amp;lt;/h5&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une primitive est un élément qui a une valeur.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Par exemple:&amp;lt;/strong&amp;gt; la variable PRENOM va valoir “Damien”. Ou tout simplement un nombre (ex: 36) ou une chaine de caractère (ex: &amp;amp;quot;une chaise&amp;amp;quot;)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Pour intégrer une valeur :&amp;lt;/strong&amp;gt; les variables du dataset sont intégrées dans le contenu à partir d’une syntaxe simple : la variable est placée, sans espace, entre deux accolades. &lt;br /&gt;
Exemple :&lt;br /&gt;
Le vendeur, né le &amp;lt;code&amp;gt;{DATE_NAISSANCE}&amp;lt;/code&amp;gt;, à &amp;lt;code&amp;gt;{VILLE_NAISSANCE}&amp;lt;/code&amp;gt; ...   &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Les traitements dans le SmartDoc ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Les traitements peuvent être définies comme une modification appliquée sur un contenu. Par exemple, le traitement &amp;lt;code&amp;gt;uppercase&amp;lt;/code&amp;gt; permet de mettre en majuscule une primitive de catégorie chaîne-de-caractère. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Pour appliquer un traitement sur une primitive, on utilise le signe : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; Ce qui donne Mon prénom est &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt; qui donne Mon prénom est DAMIEN même quand la variable &amp;lt;code&amp;gt;PRENOM&amp;lt;/code&amp;gt; vaut “DaMien”.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comme vu précédemment, pour intégrer une valeur avec un traitement, on procède en utilisant : &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt; &lt;br /&gt;
Le vendeur s’appelle &amp;lt;code&amp;gt;{PRENOM:uppercase}&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Il est possible d&amp;amp;#39;enchaîner les traitements. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Exemple :&amp;lt;/strong&amp;gt;L&amp;amp;#39;acheteur a payé &amp;lt;code&amp;gt;{PRIX:letters:uppercase}&amp;lt;/code&amp;gt; euros.&lt;br /&gt;
Ici, la valeur contenue dans la variable &amp;amp;quot;PRIX&amp;amp;quot; sera d&amp;amp;#39;abord convertie en lettres, puis mise automatiquement en MAJUSCULES.&lt;br /&gt;
On obtiendra un résultat du type : &amp;amp;quot;L&amp;amp;#39;acheteur a payé TRENTE euros&amp;amp;quot;, alors que la valeur de départ sera &amp;amp;quot;30&amp;amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;A noter&amp;lt;/strong&amp;gt; : les traitements peuvent s’appliquer aussi sur de simples chaînes de caractères et pas seulement des variables. Ex :  L&amp;amp;#39;acheteur a payé {&amp;amp;quot;32 000&amp;amp;quot;:letters:uppercase} euros.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====  Traitements disponibles et syntaxe spécifique ==== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:uppercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en majuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:lowercase&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de forcer l’affichage de la chaîne en minuscule&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:letters&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la convertir en &amp;quot;toutes-lettres&amp;quot; (ex : &amp;lt;code&amp;gt;312&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;Trois-cent-douze&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:capitalize&amp;lt;/code&amp;gt; : ne s'applique que sur une chaine de caractères, et permet de passer en majuscule la première lettre de chaque mot. Ex: &amp;lt;code&amp;gt;NOM:capitalize&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Option : si l'option 1 (ou &amp;quot;yes&amp;quot;) est passée en paramètre de ce traitement, alors seule la première lettre du premier mot sera mise en majuscule. Ex: &amp;lt;code&amp;gt;NOM:capitalize(1)&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;NOM:capitalize(yes)&amp;lt;/code&amp;gt;… &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt; : transforme une chaine de caractère (url) en image dans le document. Ex : &amp;lt;code&amp;gt;{&amp;quot;https://api.memegen.link/images/puffin.jpg&amp;quot;:img}&amp;lt;/code&amp;gt; va permettre d'intégrer l'image présente à cette URL dans le document.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;i&amp;gt;&amp;lt;b&amp;gt;Nb:&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; dans les version v0.9-v0.11 l'intégration d'une image distante (via &amp;lt;code&amp;gt;:img&amp;lt;/code&amp;gt;) n'est plus possible dans les exports .docx / .pdf si un modèle de document (voir &amp;lt;i&amp;gt;docx template&amp;lt;/i&amp;gt;) est utilisé. En effet, la norme DocX ne permet pas/plus l'intégration d'image / objet si le fichier est créé par un TemplateEngine. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num&amp;lt;/code&amp;gt;: (uniquement pour les références). Pour une référence à un titre, affiche son numéro au lieu d’afficher le titre. &lt;br /&gt;
Exemple : &amp;lt;/code&amp;gt;Comme décrit dans la section {@ref:droit-acheteur:num}, vous...&amp;lt;/code&amp;gt;. Le fonctionnement des références croisées est décrit en détail [[http://wiki.hercule.co:3002/index.php/Smartdoc/titre-et-references|ici]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-datetime&amp;lt;/code&amp;gt; :  ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;Date&amp;quot;. Ce traitement permet de transformer la date au format &amp;quot;30/12/1985 à 12h45&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:french-date&amp;lt;/code&amp;gt; : ne s'applique que sur une date ou une chaîne de caractère au format &amp;quot;YYYY-MM-DD&amp;quot; (format international). Ce traitement permet de transformer la date fournie dans le format Français &amp;quot;jj/mm/aaaa&amp;quot;. Depuis la version v0.10, ce filtre est &amp;quot;facultatif&amp;quot; car il est appliqué par défaut sur les dates ou les chaînes au format de date. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:num-format&amp;lt;/code&amp;gt; : ne s'applique que sur une valeur numérique, et permet de la formater pour son affichage. Ce traitement peut prendre 3 paramètres '''facultatifs'''. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le 1er permet (numérique et facultatif) permet d'indiquer le nombre de décimale souhaitées (par défaut, 2 chiffres ou 0 si la partie décimale est nulle).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le second paramètre (chaîne, facultative) correspond au séparateur des milliers (par défaut : un espace).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Le troisième paramètre (chaîne, facultative) correspond au caractère à afficher pour le séparateur décimal (par défaut : &amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Quelques exemples : &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - soit une variable numérique VAR_PI qui vaut &amp;lt;code&amp;gt;3,1451&amp;lt;/code&amp;gt;. L'affichage par défaut &amp;lt;code&amp;gt;{ VAR_PI }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,14&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt; L'affichage &amp;lt;code&amp;gt;{ VAR_PI:num-format(3) }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;3,145&amp;lt;/code&amp;gt;. &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt; - pour la variable PRICE (numérique) qui vaudrait &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt;, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9 999,99&amp;lt;/code&amp;gt; (dans ce cas le `:num-format` est facultatif). &amp;lt;br/&amp;gt;Par contre, l'affichage &amp;lt;code&amp;gt;{ PRICE:num-format(1,',', '.') }&amp;lt;/code&amp;gt; affichera &amp;lt;code&amp;gt;9,999.9&amp;lt;/code&amp;gt; (1 chiffre après la virgule, séparateur des milliers et décimaux modifiés).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;:join&amp;lt;/code&amp;gt; : limité à une variable de liste plate (issue d'un [[Fields-Form|multiples-choices]] principalement) → permet d'afficher les différentes valeurs de la liste sous la forme suivante : &amp;lt;code&amp;gt;Valeur1, Valeur2, Valeur3, et Valeur4&amp;lt;/code&amp;gt;. Les différentes valeurs contenues dans la variable sont affichées les unes à la suite des autres, séparées par des virgules; la dernière valeur est précédée de la conjonction de coordination &amp;lt;code&amp;gt;et&amp;lt;/code&amp;gt;. &lt;br /&gt;
:: Il est possible de personnaliser le séparateur, par exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;)&amp;lt;/code&amp;gt;  → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou Valeur3&amp;lt;/code&amp;gt;.&lt;br /&gt;
:: Et il est même possible de personnaliser indépendamment le séparateur du dernier élément grâce à un second paramètre. Exemple &amp;lt;code&amp;gt;LIST:join(&amp;quot; ou &amp;quot;, &amp;quot; ou bien même &amp;quot;)&amp;lt;/code&amp;gt; → renvoie &amp;lt;code&amp;gt;Valeur1 ou Valeur2 ou bien même Valeur3&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:list&amp;lt;/code&amp;gt; : '''utilisable uniquement pour les variables [[Fields-Form|multiples-choices]]''' → permet d'afficher les différentes valeurs de la liste dans le SmartDoc sous la forme d'une liste à puce; chacune des valeurs de la liste démarre une nouvelle puce&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:label&amp;lt;/code&amp;gt; : dont le fonctionnement est expliqué [[SmartDoc#List-Labels|plus haut]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:substr(x,y)&amp;lt;/code&amp;gt; : permet de tronquer une chaîne de caractères. Par exemple pour une variable PRENOM qui vaudrait &amp;quot;Maximilien&amp;quot;, on pourra utiliser la notation suivante : &amp;lt;code&amp;gt;{PRENOM:substr(2,4)}&amp;lt;/code&amp;gt;, qui donnera en pratique &amp;quot;ximi&amp;quot; ;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:string-replace([remplaceur], [remplacé])&amp;lt;/code&amp;gt; : permet de remplacer une chaîne par une autre chaîne dans le contenu d'une variable de type &amp;quot;string&amp;quot;. &lt;br /&gt;
Par exemple pour une variable VAR qui vaudrait &amp;quot;Damien&amp;quot;, l'expression &amp;lt;code&amp;gt;VAR:string-replace(&amp;quot;F&amp;quot;, &amp;quot;D&amp;quot;)&amp;lt;/code&amp;gt; donnera &amp;quot;Famien&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Si le paramètre &amp;quot;remplacé&amp;quot; n'est pas fourni, ce sera par défaut un saut de ligne qui sera recherché. Par exemple pour une variable ADDRESS qui contient des sauts de ligne, l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;, &amp;quot;)&amp;lt;/code&amp;gt; va remplacer chaque saut de ligne de l'adresse par &amp;lt;code&amp;gt;, &amp;lt;/code&amp;gt; ce qui permet de passer un texte multi-lignes dans un format une-ligne. &amp;lt;br/&amp;gt;&lt;br /&gt;
A savoir : un saut de ligne se note &amp;lt;code&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/code&amp;gt;, il est donc aussi possible de remplacer, par exemple, des tirets &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; par des sauts de ligne avec l'expression &amp;lt;code&amp;gt;ADDRESS:string-replace(&amp;quot;\n&amp;quot;, &amp;quot;-&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;:default(&amp;quot;texte par défaut&amp;quot;)&amp;lt;/code&amp;gt; permet de définir une valeur &amp;quot;par défaut&amp;quot; à afficher dans le SmartDoc si la variable sur laquelle le filtre est appliqué est vide.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;options&amp;quot;&amp;gt;Options&amp;lt;/h3&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; (facultatif) : valeur possible &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;before&amp;lt;/code&amp;gt; ou  &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;p&amp;gt;Permet d’intégrer un saut de ligne. Par défaut, toutes les entrées sont en  break: after.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si after est indiqué (ou si rien n’est indiqué puisque c’est la valeur par défaut), alors le bloc se terminera par un saut de ligne et le bloc suivant s’affichera sur une nouvelle ligne.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si before est indiqué, l’entrée s’affiche sur une nouvelle ligne (le saut de ligne intervient avant l’entrée).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Si none est indiqué, il n’y a pas de saut de ligne, les entrées s&amp;amp;#39;enchaînent.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-level&amp;lt;/code&amp;gt; (facultatif) : valeurs possibles : 1, 2, 3, 4, 5, 6.&lt;br /&gt;
*&amp;lt;code&amp;gt;title-id&amp;lt;/code&amp;gt; (facultatif) : la valeur attendue est une chaîne de caractères alpha-numériques sans sauts de ligne et dont les caractères suivants sont interdits :  :,  {,  }, &amp;amp;quot;&lt;br /&gt;
&amp;lt;p&amp;gt;Cette option permet d’assigner un identifiant au titre concerné, de cette façon il sera possible de faire référence à ce titre via un “bookmark” (voir plus haut, “ajout de référence”).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Nb: cet attribut n’est possible QUE si l’attribut title-level est lui aussi renseigné.&amp;lt;p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-article&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”.&lt;br /&gt;
Quand cette option est à “true”, le titre sera considéré comme un “titre d’article”. Il sera donc préfixé par &amp;amp;quot;ARTICLE 1 - &amp;amp;quot; ou le nombre “1” sera remplacé par l’index de l’article en question.&amp;lt;/p&amp;gt;&lt;br /&gt;
*&amp;lt;code&amp;gt;title-no-count&amp;lt;/code&amp;gt; (facultatif) : valeur booléenne attendue. Par défaut, la valeur est “false”. Quand cette option est à “true”, le titre ne sera pas numéroté, ni dans les sommaires, ni préfixe par aucun type de numérotation.&lt;br /&gt;
&lt;br /&gt;
=== Styles ===&lt;br /&gt;
&lt;br /&gt;
La colonne Styles est facultative, et permet de personnaliser les styles de la ligne de contenu concernée. &lt;br /&gt;
&lt;br /&gt;
Les styles sont fournies dans un format inspiré de la norme [https://www.w3schools.com/css CSS] (mais fortement simplifiée).&lt;br /&gt;
Ce format permet de définir plusieurs instructions stylistiques, chacune se terminant par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. Exemple d'une cellule dont le texte devra être en taille 18px et dans la couleur rouge (''#FF0000'' en couleur hexadécimale) : &lt;br /&gt;
    font-size:18px; &lt;br /&gt;
    color:#FF0000;&lt;br /&gt;
&lt;br /&gt;
Chaque instruction est donc formée : d'un attribut de style (voir la liste ci-dessous), puis d'un séparateur (caractère &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;), puis de la valeur du style souhaité, et se termine par un point-virgule (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) et un saut de ligne. &lt;br /&gt;
Il est autorisé de placer un espace après le séparateur &amp;quot;&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&amp;quot; mais attention à ce que ce espace ne soit pas &amp;quot;particulier&amp;quot; (espace insécable etc.) car cela mettrait en danger l'interprétation du style et il se peut qu'il ne soit pas du tout pris en compte.&lt;br /&gt;
&lt;br /&gt;
Les instructions de styles autorisées sont : &lt;br /&gt;
&lt;br /&gt;
:: '''Définir une police de caractère spécifique :'''&lt;br /&gt;
:::: L'attribut “&amp;lt;code&amp;gt;font-family&amp;lt;/code&amp;gt;” permet de spécifier la police à utiliser. &lt;br /&gt;
:::: Plusieurs noms de police peuvent être proposées (dans l'ordre de priorité). Si le lecteur (navigateur, logiciel de traitement de texte…) utilisé ne supporte pas la première police, le système tentera d’utiliser la deuxième police, puis la troisième, ainsi de suite ...&lt;br /&gt;
:::: Exemple : &amp;lt;code&amp;gt;font-family:Times New Roman, Times;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, on prévoit d’utiliser Times New Roman en priorité. Le cas échéant, on utilisera &amp;quot;Times&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:: '''Définir la taille du texte'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-size:14px;&amp;lt;/code&amp;gt;&lt;br /&gt;
:::: Dans cet exemple, la taille du texte sera forcée à 14px. &lt;br /&gt;
&lt;br /&gt;
:: '''Italique :''' &lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-style:italic;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Gras :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;font-weight:bold&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Souligner le texte :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-decoration:underline;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: '''Alignement :'''&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:right;&amp;lt;/code&amp;gt; (aligner à droite)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:left;&amp;lt;/code&amp;gt; (aligner à gauche)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:center&amp;lt;/code&amp;gt; (centrer sur la page)&lt;br /&gt;
:::: &amp;lt;code&amp;gt;text-align:justify&amp;lt;/p&amp;gt;&amp;lt;/code&amp;gt; (justifier)&lt;br /&gt;
&lt;br /&gt;
NOTE : ''la suite est à finaliser et mettre au propre''&lt;br /&gt;
&lt;br /&gt;
*Définir une bordure&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;border: 1px #777777 solid&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Choisir une couleur de fond pour le texte&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;background-color: #FFFF00&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
*Choisir une couleur pour le texte&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;color: #FF0000&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;La couleur doit être indiquée au format hexadecimal&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;refs&amp;quot;&amp;gt;[[Smartdoc/titre-et-references|Les références croisées]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
Les références croisées font l'objet d'une [[Smartdoc/titre-et-references|page dédiée]].&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;visible-if&amp;quot;&amp;gt;[[Conditions|Visible if]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ici, les [[Conditions|visible ifs]] permettront de conditionner logiquement l’apparition du texte se trouvant dans la colonne “Contenu”&lt;br /&gt;
Le fonctionnement est similaire au reste du système, et est détaillé dans la page relative aux [[Conditions|Visible ifs]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;utiliser-les-loops-boucles-&amp;quot;&amp;gt;Utiliser les [[Boucles]]&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Les boucles permettent de répéter un groupe d&amp;amp;#39;informations autant de fois que nécessaire, cette notion est détaillée dans la [[Boucles|page correspondante]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h3 id=&amp;quot;commentaire&amp;quot;&amp;gt;Commentaire&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Ce champ permet à celui qui paramètre de laisser toute indication utile à la compréhension de son fichier de paramétrage.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;L’utilisateur final ne verra jamais ce qui est écrit dans ce champ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;autre&amp;quot;&amp;gt;Autres fonctionnalités présentes dans le SmartDoc&amp;lt;/h2&amp;gt;&lt;/div&gt;</summary>
		<author><name>Damien</name></author>
		
	</entry>
</feed>