From 70650db9f629b7cc0f3e707a796123f93f4d41cf Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 14 Feb 2022 14:10:09 +0100 Subject: [PATCH] =?UTF-8?q?Change=20l'architecture=20des=20r=C3=A8gles=20d?= =?UTF-8?q?e=20l'exon=C3=A9ration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pour être plus proche de l'implémentation, les exonérations sont regroupées par mois. Ajoute un tutoriel d'utilisation complet dans le README v0.2.0 --- exoneration-covid/CHANGELOG.md | 4 + exoneration-covid/README.md | 136 ++++++- exoneration-covid/package.json | 2 +- .../règles/exonération-covid.yaml | 350 ++++++++++++------ site/source/pages/Documentation.tsx | 2 + site/vite.config.ts | 2 +- 6 files changed, 367 insertions(+), 129 deletions(-) diff --git a/exoneration-covid/CHANGELOG.md b/exoneration-covid/CHANGELOG.md index 93fdd3060..981ce8f09 100644 --- a/exoneration-covid/CHANGELOG.md +++ b/exoneration-covid/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.0 + +Change complètement l'organisation des règles publicodes pour être au plus proche de l'implémentation + ## 0.1.0 Première version du paquet diff --git a/exoneration-covid/README.md b/exoneration-covid/README.md index beee92dc0..5469c868b 100644 --- a/exoneration-covid/README.md +++ b/exoneration-covid/README.md @@ -8,7 +8,7 @@ Ce paquet contient les règles [publicodes](https://publi.codes) utilisées sur npm install publicodes exoneration-covid ``` -### Exemple d'utilisation +### Exemple ```js import Engine, { formatValue } from 'publicodes' @@ -20,13 +20,139 @@ engine.setSituation({ "début d'activité": "'mai 2021'", secteur: "'S1'", - 'LFSS600 . mois éligibles . avril 2021': 'oui', - 'LFSS600 . mois éligibles . mai 2021': 'non', - 'LFSS600 . mois éligibles . juin 2021': 'oui', - 'LFSS600 . mois éligibles . décembre 2021': 'oui', + 'mois . avril 2021': 'LFSS 600', + 'mois . mai 2021': 'non', + 'mois . juin 2021': 'LFSS 600', + 'mois . décembre 2021': 'LFSS 300', }) console.log(formatValue(engine.evaluate('montant total'))) ``` 👉 **[Voir l'exemple complet](https://codesandbox.io/s/covidform-rxweh?file=/src/index.js)** + +### Utilisation + +#### 1. Récuperer la liste des mois à afficher + +La première étape est de savoir quels sont les mois à afficher en fonction des données d'entrée (secteur, lieu et date de début d'activité). Pour cela, il suffit de récuperer la liste de toutes les variables manquantes à l'évaluation du montant dans la situation. Voici comment procéder : + +```js +import Engine from 'publicodes' +import rules from 'exoneration-covid' + +const engine = new Engine(rules) + +// 1. On met à jour les valeurs de la première étape du formulaire +const step1Situation = { + "lieu d'exercice": "'métropole'", + "début d'activité": "'mai 2021'", + secteur: "'S1'", +} +engine.setSituation(step1Situation) + +// 2. On lance le calcul pour le montant exonéré +const evaluation = engine.evaluate('montant total') + +// 3. On récupère la liste des mois manquants +const missingVariables = Object.keys(evaluation.missingVariables) +``` + +Ci-dessus, `missingVariable` contiendra la liste des règles publicodes dont la valeur est manquante pour l'évaluation. + +```json +[ + "mois . mai 2021", + "mois . juin 2021", + "mois . juillet 2021", + "mois . août 2021", + "mois . décembre 2021", + "mois . janvier 2022", + "mois . février 2022" +] +``` + +#### 2. Obtenir les exonérations possibles pour un mois en particulier + +Par défaut, on souhaite qu'aucune exonération ne soit selectionnée pour aucun des mois. On va donc mettre à jour la situation initiale en conséquence : + +```js +import Engine, { formatValue } from 'publicodes' +import rules from 'exoneration-covid' + +const engine = new Engine(rules) + +const step1Situation = { + "lieu d'exercice": "'métropole'", + "début d'activité": "'mai 2021'", + secteur: "'S1'", +} + +const monthToFill = Object.keys( + engine.evaluate('montant total').missingVariables +) +const currentSituation = Object.fromEntries( + monthToFill.map((month) => [month, 'non']) +) +engine.setSituation({ ...step1Situation, ...currentSituation }) +``` + +Pour connaître la liste des éléments possibles pour un mois, il faut lister les possibilités : + +```js +const currentMonth = 'mois . juillet 2022' +const options = Object.keys(engine.getParsedRules()).filter((name) => + name.startsWith(currentMonth + ' . ') +) // Retourne ['mois . juillet . LFSS 600', 'mois . juillet . LFR 1' ] +``` + +Puis enlever les options qui ne sont pas applicables dans la situation actuelle. Pour cela, on utilise la situation courante en réinitialisant le mois selectionné. + +```js +const situationWithoutCurrentMonth = { + ...step1Situation, + ...currentSituation, +} +delete situationWithoutCurrentMonth[currentMonth] +engine.setSituation(situationWithoutCurrentMonth) + +const applicableOptions = options.filter( + (name) => engine.evaluate(name).nodeValue !== false +) +``` + +#### 3. Calculer le montant de l'exonération en temps réel + +Pour calculer l'exonération en fonction des entrées de l'utilisateur, il suffit de mettre à jour la situation avec les informations saisies par ce dernier. + +```js +import Engine, { formatValue } from 'publicodes' +import rules from 'exoneration-covid' + +const engine = new Engine(rules) + +const step1Situation = { + "lieu d'exercice": "'métropole'", + "début d'activité": "'mai 2021'", + secteur: "'S1'", +} +const currentSituation = { + 'mois éligibles . mai 2021': "'LFSS 600'", + 'mois éligibles . juin 2021': "'LFR1'", + 'mois éligibles . juillet 2021': "'LFSS 600'", + 'mois éligibles . août 2021': "'LFR1'", + 'mois éligibles . décembre 2021': "'LFSS 300'", + 'mois éligibles . janvier 2022': "'non'", + 'mois éligibles . février 2022': "'LFSS 300'", +} + +const montantTotal = engine + .setSituation({ + ...step1situation, + ...currentSituation, + }) + .evaluate('montant total') + +console.log(montantTotal.nodeValue) // 3300 +console.log(formatValue(montantTotal)) // "3 300 €" +``` diff --git a/exoneration-covid/package.json b/exoneration-covid/package.json index 12140efeb..06b532612 100644 --- a/exoneration-covid/package.json +++ b/exoneration-covid/package.json @@ -1,6 +1,6 @@ { "name": "exoneration-covid", - "version": "0.1.0", + "version": "0.2.0", "description": "Les règles publicodes pour le calcul de l'exonération de cotisations covid (année 2021)", "main": "./dist/index.js", "types": "./index.d.ts", diff --git a/exoneration-covid/règles/exonération-covid.yaml b/exoneration-covid/règles/exonération-covid.yaml index 42daabf81..c9dc27c8d 100644 --- a/exoneration-covid/règles/exonération-covid.yaml +++ b/exoneration-covid/règles/exonération-covid.yaml @@ -103,142 +103,253 @@ début d'activité . date: - si: début d'activité = 'décembre 2021' alors: 12/2021 -LFSS600: +mois: applicable si: secteur . S1 ou S1bis valeur: oui -LFSS600 . mois éligibles: - unité: mois - description: Nombre de mois éligible à l'exonération LFSS à 600 € - somme: - - par défaut: non - valeur: - nom: janvier 2021 - applicable si: début d'activité . date >= 01/2021 - non applicable si: début d'activité . date >= 02/2021 - - par défaut: non - valeur: - nom: février 2021 - non applicable si: début d'activité . date >= 03/2021 - applicable si: début d'activité . date >= 01/2021 - - par défaut: non - valeur: - nom: mars 2021 - non applicable si: début d'activité . date >= 04/2021 - applicable si: début d'activité . date >= 01/2021 - - par défaut: non - valeur: - nom: avril 2021 - non applicable si: début d'activité . date >= 05/2021 - - par défaut: non - valeur: - nom: mai 2021 - non applicable si: début d'activité . date >= 06/2021 - - par défaut: non - valeur: - nom: juin 2021 - non applicable si: début d'activité . date >= 07/2021 - - par défaut: non - valeur: - nom: juillet 2021 - non applicable si: début d'activité . date >= 08/2021 - - par défaut: non - valeur: - nom: août 2021 - applicable si: lieu d'exercice = 'outre-mer' - non applicable si: début d'activité . date >= 09/2021 - - par défaut: non - valeur: - nom: septembre 2021 - applicable si: lieu d'exercice = 'outre-mer' - non applicable si: début d'activité . date >= 10/2021 - - par défaut: non - valeur: - nom: octobre 2021 - applicable si: lieu d'exercice = 'outre-mer' - non applicable si: début d'activité . date >= 11/2021 - - par défaut: non - valeur: - nom: novembre 2021 - applicable si: lieu d'exercice = 'outre-mer' - non applicable si: début d'activité . date >= 12/2021 - - par défaut: non - valeur: - nom: décembre 2021 - - par défaut: non - valeur: - nom: janvier 2022 - - par défaut: non - valeur: - nom: février 2022 +mois . janvier 2021: + applicable si: début d'activité . date >= 01/2021 + non applicable si: début d'activité . date >= 02/2021 + une possibilité: + possibilités: + - LFSS 600 -LFSS600 . montant: +mois . janvier 2021 . LFSS 600: + valeur: janvier 2021 = 'LFSS 600' + +mois . février 2021: + non applicable si: début d'activité . date >= 03/2021 + applicable si: début d'activité . date >= 01/2021 + une possibilité: + possibilités: + - LFSS 600 + +mois . février 2021 . LFSS 600: + valeur: février 2021 = 'LFSS 600' + +mois . mars 2021: + non applicable si: début d'activité . date >= 04/2021 + applicable si: début d'activité . date >= 01/2021 + une possibilité: + possibilités: + - LFSS 600 + +mois . mars 2021 . LFSS 600: + valeur: mars 2021 = 'LFSS 600' + +mois . avril 2021: + non applicable si: début d'activité . date >= 05/2021 + une possibilité: + possibilités: + - LFSS 600 + +mois . avril 2021 . LFSS 600: + valeur: avril 2021 = 'LFSS 600' + +mois . mai 2021: + non applicable si: début d'activité . date >= 06/2021 + une possibilité: + possibilités: + - LFSS 600 + +mois . mai 2021 . LFSS 600: + valeur: mai 2021 = 'LFSS 600' + +mois . juin 2021: + non applicable si: début d'activité . date >= 07/2021 + une possibilité: + possibilités: + - LFSS 600 + - LFR1 + +mois . juin 2021 . LFSS 600: + valeur: juin 2021 = 'LFSS 600' +mois . juin 2021 . LFR1: + applicable si: LFR1 applicable + valeur: juin 2021 = 'LFR1' + +mois . juillet 2021: + non applicable si: début d'activité . date >= 08/2021 + une possibilité: + possibilités: + - LFSS 600 + - LFR1 + +mois . juillet 2021 . LFSS 600: + valeur: juillet 2021 = 'LFSS 600' + +mois . juillet 2021 . LFR1: + applicable si: LFR1 applicable + valeur: juillet 2021 = 'LFR1' + +mois . août 2021: + non applicable si: début d'activité . date >= 09/2021 + applicable si: + une de ces conditions: + - LFR1 applicable + - lieu d'exercice = 'outre-mer' + une possibilité: + possibilités: + - LFSS 600 + - LFR1 + +mois . août 2021 . LFSS 600: + valeur: août 2021 = 'LFSS 600' + applicable si: lieu d'exercice = 'outre-mer' + +mois . août 2021 . LFR1: + applicable si: LFR1 applicable + valeur: août 2021 = 'LFR1' + +mois . septembre 2021: + non applicable si: début d'activité . date >= 10/2021 + applicable si: lieu d'exercice = 'outre-mer' + une possibilité: + possibilités: + - LFSS 600 + +mois . septembre 2021 . LFSS 600: + valeur: septembre 2021 = 'LFSS 600' + +mois . octobre 2021: + non applicable si: début d'activité . date >= 11/2021 + applicable si: lieu d'exercice = 'outre-mer' + une possibilité: + possibilités: + - LFSS 600 + +mois . octobre 2021 . LFSS 600: + valeur: octobre 2021 = 'LFSS 600' + +mois . novembre 2021: + non applicable si: début d'activité . date >= 12/2021 + applicable si: lieu d'exercice = 'outre-mer' + une possibilité: + possibilités: + - LFSS 600 + +mois . novembre 2021 . LFSS 600: + valeur: novembre 2021 = 'LFSS 600' + +mois . décembre 2021: + une possibilité: + possibilités: + - LFSS 600 + - LFSS 300 + +mois . décembre 2021 . LFSS 600: + valeur: décembre 2021 = 'LFSS 600' +mois . décembre 2021 . LFSS 300: + valeur: décembre 2021 = 'LFSS 300' + +mois . janvier 2022: + une possibilité: + possibilités: + - LFSS 600 + - LFSS 300 + +mois . janvier 2022 . LFSS 600: + valeur: janvier 2022 = 'LFSS 600' +mois . janvier 2022 . LFSS 300: + valeur: janvier 2022 = 'LFSS 300' + +mois . février 2022: + une possibilité: + possibilités: + - LFSS 600 + - LFSS 300 + +mois . février 2022 . LFSS 600: + valeur: février 2022 = 'LFSS 600' +mois . février 2022 . LFSS 300: + valeur: février 2022 = 'LFSS 300' + +LFSS 600: + applicable si: secteur . S1 ou S1bis produit: assiette: 600 €/mois - facteur: mois éligibles + facteur: + nom: mois éligibles + unité: mois + description: Nombre de mois éligible à l'exonération LFSS à 600 € + somme: + - valeur: mois . janvier 2021 . LFSS 600 + par défaut: non + - valeur: mois . février 2021 . LFSS 600 + par défaut: non + - valeur: mois . mars 2021 . LFSS 600 + par défaut: non + - valeur: mois . avril 2021 . LFSS 600 + par défaut: non + - valeur: mois . mai 2021 . LFSS 600 + par défaut: non + - valeur: mois . juin 2021 . LFSS 600 + par défaut: non + - valeur: mois . juillet 2021 . LFSS 600 + par défaut: non + - valeur: mois . août 2021 . LFSS 600 + par défaut: non + - valeur: mois . septembre 2021 . LFSS 600 + par défaut: non + - valeur: mois . octobre 2021 . LFSS 600 + par défaut: non + - valeur: mois . novembre 2021 . LFSS 600 + par défaut: non + - valeur: mois . décembre 2021 . LFSS 600 + par défaut: non + - valeur: mois . janvier 2022 . LFSS 600 + par défaut: non + - valeur: mois . février 2022 . LFSS 600 + par défaut: non -LFSS300: +LFSS 300: applicable si: secteur . S1 ou S1bis - valeur: oui - -LFSS300 . mois éligibles: - unité: mois - description: Nombre de mois éligible à l'exonération LFSS à 300€ - somme: - - par défaut: non - valeur: - nom: décembre 2021 - non applicable si: LFSS600 . mois éligibles . décembre 2021 - - par défaut: non - valeur: - non applicable si: LFSS600 . mois éligibles . janvier 2022 - nom: janvier 2022 - - par défaut: non - valeur: - non applicable si: LFSS600 . mois éligibles . février 2022 - nom: février 2022 - -LFSS300 . montant: produit: assiette: 300 €/mois - facteur: mois éligibles + facteur: + nom: mois éligibles + description: Nombre de mois éligible à l'exonération LFSS à 300€ + unité: mois + somme: + - valeur: mois . décembre 2021 . LFSS 300 + par défaut: non + - valeur: mois . janvier 2022 . LFSS 300 + par défaut: non + - valeur: mois . février 2022 . LFSS 300 + par défaut: non -LFR1: +LFR1 applicable: valeur: oui applicable si: toutes ces conditions: - secteur . S1 ou S1bis - début d'activité . date < 06/2021 - -LFR1 . mois éligibles: - unité: mois non applicable si: toutes ces conditions: - début d'activité . date >= 01/2021 - - LFSS600 . mois éligibles . mars 2021 = non - - LFSS600 . mois éligibles . avril 2021 = non - - LFSS600 . mois éligibles . mai 2021 = non - description: Nombre de mois éligible à l'exonération LFR1 - somme: - - par défaut: non - valeur: - nom: juin 2021 - non applicable si: LFSS600 . mois éligibles . juin 2021 - - par défaut: non - valeur: - nom: juillet 2021 - non applicable si: LFSS600 . mois éligibles . juillet 2021 - - par défaut: non - valeur: - nom: août 2021 - non applicable si: LFSS600 . mois éligibles . août 2021 + - mois . mars 2021 . LFSS 600 = non + - mois . avril 2021 . LFSS 600 = non + - mois . mai 2021 . LFSS 600 = non -LFR1 . montant: +LFR1: produit: - assiette: mois éligibles - facteur: 600 €/mois + assiette: 600 €/mois + facteur: + unité: mois + description: Nombre de mois éligible à l'exonération LFR1 + nom: mois éligibles + somme: + - valeur: mois . juin 2021 . LFR1 + par défaut: non + - valeur: mois . juillet 2021 . LFR1 + par défaut: non + - valeur: mois . août 2021 . LFR1 + par défaut: non exonération S2: + produit: + assiette: 600 €/mois + facteur: mois éligibles applicable si: toutes ces conditions: - secteur . S2 @@ -273,14 +384,9 @@ exonération S2 . mois éligibles . dernier mois: alors: 09/2021 - sinon: 07/2021 -exonération S2 . montant: - produit: - assiette: mois éligibles - facteur: 600 €/mois - montant total: somme: - - LFR1 . montant - - LFSS600 . montant - - LFSS300 . montant - - exonération S2 . montant + - LFSS 600 + - LFR1 + - LFSS 300 + - exonération S2 diff --git a/site/source/pages/Documentation.tsx b/site/source/pages/Documentation.tsx index d2ac1d951..c6c45cfb9 100644 --- a/site/source/pages/Documentation.tsx +++ b/site/source/pages/Documentation.tsx @@ -56,6 +56,7 @@ export default function MonEntrepriseRulePage() { + @@ -241,6 +242,7 @@ function componentCSS(rules: any, props: any) { const StyledDocumentation = styled.div` h1 { ${(props) => componentCSS((H1.componentStyle as any).rules, props)} + margin-top: 1rem; } h2 { ${(props) => componentCSS((H2.componentStyle as any).rules, props)} diff --git a/site/vite.config.ts b/site/vite.config.ts index d2f7df368..0bc5b4d73 100644 --- a/site/vite.config.ts +++ b/site/vite.config.ts @@ -5,7 +5,7 @@ import fs from 'fs/promises' import path from 'path' import toml from 'rollup-plugin-toml' import { defineConfig, Plugin } from 'vite' -import { watchDottedNames } from '../modele-social/build.js' +import { watchDottedNames } from '../scripts/build-rules' import shimReactPdf from 'vite-plugin-shim-react-pdf' import serveStatic from 'serve-static'