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.0pull/2016/head
parent
b1c85af31e
commit
70650db9f6
|
@ -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
|
||||
|
|
|
@ -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 €"
|
||||
```
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)}
|
||||
|
|
|
@ -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'
|
||||
|
||||
|
|
Loading…
Reference in New Issue