1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-11 08:35:02 +00:00
mon-entreprise/publicodes/docs/se-lancer.md
Maxime Quandalle 2e6ce3ab1a Squashed 'publicodes/' changes from 10a30d32..a680ad31
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
2021-11-05 15:52:37 +01:00

6 KiB

Installation béta

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>
    )
}