1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-09 05:15:02 +00:00
mon-entreprise/exoneration-covid/README.md
Johan Girod 70650db9f6 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
2022-02-14 18:19:57 +01:00

4.6 KiB
Raw Blame History

Modèle social français en publicodes

Ce paquet contient les règles publicodes utilisées sur https://mon-entreprise.urssaf.fr pour le calcul de l'exonération covid 2021.

Installation

npm install publicodes exoneration-covid

Exemple

import Engine, { formatValue } from 'publicodes'
import rules from 'exoneration-covid'

const engine = new Engine(rules)
engine.setSituation({
    "lieu d'exercice": "'métropole'",
    "début d'activité": "'mai 2021'",
    secteur: "'S1'",

    '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

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 :

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.

[
    "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 :

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 :

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é.

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.

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 €"