Change l'architecture des règles de l'exonération

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
pull/2016/head
Johan Girod 2022-02-14 14:10:09 +01:00
parent b1c85af31e
commit 70650db9f6
6 changed files with 367 additions and 129 deletions

View File

@ -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

View File

@ -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)) // "3300 €"
```

View File

@ -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",

View File

@ -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

View File

@ -56,6 +56,7 @@ export default function MonEntrepriseRulePage() {
<ScrollToTop key={pathname} />
<Grid item md={10}>
<BackToSimulation />
<Spacing xl />
<Route
path={documentationPath + '/:name+'}
render={({ match }) =>
@ -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)}

View File

@ -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'