a680ad31 🐛 Corrige un bug sur l'affichage des remplacements dans la doc publicodes 1e45d98d 🔥 Supprime la transformation d'emoji dans la doc publicodes 77973a9b 🐛 Répare l'affichage des règles remplacées 341b2e39 🎨🐛 corrige le style du remplacement dans les sommes 24dce683 🎨 Améliore l'explication des règles avec remplacement 6d086823 💚 fix lint 2d64d908 🏗Add export as Pdf button on simulators 163b766a ✅ Prettier linting in publicodes subtree e1507975 ✨ Reformat files 80161f95 🐛 Fix VAT example 79bde0be 🔥 Remove "classnames" dependency from publicodes-react 3e65e320 🔥 Remove ramda from publicodes-react 71b68707 📦 Publicodes v1.0.0-beta.16 bdc92216 Merge the tests and publish workflows 1c032ebc ✅ Add test for a value with a percentage in its unit d2865e8c Disable sum optimization inside comparisons f4faa35d Ajout d'un test qui casse l'implé actuelle des missing parentes f6105283 🖋 Document packages publication on NPM a79eeb86 Better Github workflows d0db4d09 Import publish action c268cff5 Type checking in CI a35403d7 Correction formattage 3022fd78 Add a separate cache for applicability 35095da9 Optimize the evaluation of applicability 7525446e Add a github action to run tests on push 39a12a13 Ajout d'un prettierrc / reformattage de quelques fichiers récents c296a25e Ajout d'un deuxièmes test non fonctionnel sur le sujet #33 9f5afb4e Désactivation d'un nouveau test pas encore résolu 76d00085 Récupération de la complexité initiale du test missing variations 93210235 🐛 Meilleures missingVariables des variations 369abeae Simplification du test missingVariables qui ne marche pas 64217d3d Nouveau test missing variables éval paresseuse variations d9c3e1f6 Conversion d'un gros test JS object en YAML 615ae5e5 Ajout d'un test râté pour #33 d290b46d Passage à mochapack pour webpack 5 5d7a5b31 Paquets NPM et conf babel manquants 1df9a8d4 Ajout d'un .gitignore et yarn.lock 6c2d0203 Uniformise l'unité des arrondis 2cbffe8a ⬆ MAJ Typescript vers 4.3 678403e4 Corrige le calcul des cotisations forfaitaires de début d'activité 8cdaac05 Simpler condition component (#1578) b7459617 🔥 Supprime les variables temporelles db62b57d 🔥 Supprime l'utilisation des temporals dans les mécanismes git-subtree-dir: publicodes git-subtree-split: a680ad31c33b93e4f35171488cec1b6f9e08179a
6 KiB
Installation ![béta](https://img.shields.io/badge/-beta-blue)
Publicodes est distribué sous la forme d'une librairie Node.js permettant de compiler un jeu de règles publicodes et de l'évaluer dans une situation donnée.
Le paquet est disponible sur npm :
$ npm install publicodes
Premiers pas
La bibliothèque exporte une classe par défaut Engine
qui permet d'instancier le moteur avec un
jeu de règles publicodes.
import Engine from 'publicodes'
// On définit une liste de règles publicodes
const rules = `
prix:
prix . carottes: 2€/kg
prix . champignons: 5€/kg
prix . avocat: 2€/avocat
dépenses primeur:
formule:
somme:
- prix . carottes * 1.5 kg
- prix . champignons * 500g
- prix . avocat * 3 avocat
`
// On initialise un moteur en lui donnant le publicodes.
// Ce publicodes va être parsé
const engine = new Engine(rules)
Note : importer sans bundler
Voici comment importer publicodes en fonction de l'environnement.
- Node >= 15.0.0
import Engine from 'publicodes'
Node < 15.0.0
const Engine = require('publicodes').default
- ESModule sans npm install (
<script type="module">
et deno)import Engine from 'https://unpkg.com/publicodes@next/esm/index.min.js'
<script>
dans navigateur<script src="https://unpkg.com/publicodes@next/dist/index.min.js"></script> <script> const Engine = window.publicodes.default </script>
La variable engine
permet en ensuite de calculer la valeur d'une règle avec la
méthode evaluate
:
console.log(engine.evaluate('dépenses primeur'))
La valeur du nœud est disponible dans la propriété nodeValue
, son
unité est disponible dans la propriété unit
. Mais pour un formattage sans
effort, on préfèrera utiliser la fonction formatValue
:
import Engine, { formatValue } from 'publicodes'
// ...
const dépenses = engine.evaluate('dépenses primeur')
console.log(`J'ai dépensé ${formatValue(dépenses)} chez le primeur.`)
La méthode setSituation
permet de forcer la valeur d'une liste de règles. Elle
est utile pour préciser les paramètres spécifiques à une simulation :
// Ici on change le prix des avocats
engine.setSituation({
'prix . avocat': '3€/avocat',
})
La valeur de dépenses primeur
se base maintenant sur un avocat à 3€ :
// On ré-évalue la règle dans la nouvelle situation
console.log(
`Nouveau prix ! Dépenses mises à jour: ${formatValue(
engine.evaluate('dépenses primeur')
)}.`
)
Évaluation d'expressions
La fonction evaluate
permet d'évaluer des expressions publicodes complètes :
// On va au marché une fois par semaine, amortissons la dépense sur 7 jours
const depensesParJour = engine.evaluate('dépenses primeur / 7 jours')
console.log(`J'ai dépensé ${formatValue(depensesParJour)}.`)
Conversion d'unité
Publicodes permet de réaliser des conversions d'unités. Pour celà il faut
indiquer l'unité désirée via le mécanisme unité
:
// on va au marché une fois par semaine en moyenne, combien dépense-t-on par mois ?
const depensesParMois = engine.evaluate({
valeur: 'dépenses primeur / 7 jours',
unité: '€/mois',
})
console.log(`J'ai dépensé ${formatValue(depensesParMois)}.`)
➡ en savoir plus sur les unités
Variables manquantes
Publicodes calcule automatiquement les dépendances de chaque règle. Si la
valeur d'une dépendance est manquante et ne permet pas de faire le calcul, elle
apparaîtra dans la propriété missingVariables
:
const missingYEngine = new Engine(`
x: y + 5
y:
`)
console.log(missingYEngine.evaluate('x').missingVariables)
Cette information est utile pour intégrer publicodes à votre application.
Il est aussi possible d'utiliser des valeurs par défaut. Dans ce cas la règle
sera calculée avec la valeur par défaut de sa dépendance, mais cette dernière
apparaîtra tout de même dans les missingVariables
. Cette fonctionnalité est
utile pour réaliser des simulateurs où l'on veut proposer un résultat sans
attendre que l'utilisateur ait répondu à l'intégralité des questions tout en
utilisant la liste des variables manquantes pour déterminer les questions
restant à poser.
Les variables manquantes sont calculées lors de l'évaluation. Si une variable
apparaît dans la formule de calcul d'une règle elle ne sera rapportée que si
elle est effectivement nécessaire au calcul. Si elle est présente dans une
portion non active de l'évaluation (par exemple dans un bloc condition non
actif, ou la tranche d'un barème non actif) elle sera filtrée et n'apparaîtra
pas dans les missingVariables
.
Documentation interactive
Publicodes génère également pour vous une documentation interactive, très
facilement intégrable dans une app React. Pour cela, il vous suffit d'importer
le composant dédié, et passer l'engine
à afficher dans les props.
Il faut commencer par installer la librairie publicodes-react
:
$ npm install publicodes-react
import { BrowserRouter as Router } from 'react-router-dom'
import { Documentation } from 'publicodes-react'
function MonApp() {
return (
<Router>
<Documentation
engine={engine}
documentationPath={'/documentation'}
language={'fr'}
/>
{/* Composants de l'app */}
</Router>
)
}
Vous pourrez ensuite faire un lien vers la documentation avec le composant
RuleLink
.
import { RuleLink } from 'publicodes'
function MesDépenses() {
return (
<p>
Accéder aux{' '}
<RuleLink
dottedName={'dépenses primeur'}
engine={engine}
documentationPath={'/documentation'}
/>
</p>
)
}