From b1c85af31e753c47a9fa32bc69a80d71d1ec367f Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 27 Jan 2022 18:28:48 +0100 Subject: [PATCH 1/5] =?UTF-8?q?Cr=C3=A9e=20un=20nouveau=20paquet=20npm=20c?= =?UTF-8?q?ontenant=20les=20r=C3=A8gles=20publicodes=20de=20l'exon=C3=A9ra?= =?UTF-8?q?tion=20covid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish.yaml | 4 +- README.md | 1 + exoneration-covid/.yarnrc | 2 + exoneration-covid/CHANGELOG.md | 3 + exoneration-covid/README.md | 32 ++ exoneration-covid/index.d.ts | 9 + exoneration-covid/package.json | 32 ++ .../règles/exonération-covid.yaml | 286 ++++++++++++++++++ exoneration-covid/tsconfig.json | 7 + modele-social/package.json | 4 +- modele-social/tsconfig.json | 3 +- package.json | 3 +- .../build.js => scripts/build-rules.js | 5 +- {modele-social => scripts}/check-changelog.js | 0 site/source/components/Distribution.css | 1 - 15 files changed, 380 insertions(+), 12 deletions(-) create mode 100644 exoneration-covid/.yarnrc create mode 100644 exoneration-covid/CHANGELOG.md create mode 100644 exoneration-covid/README.md create mode 100644 exoneration-covid/index.d.ts create mode 100644 exoneration-covid/package.json create mode 100644 exoneration-covid/règles/exonération-covid.yaml create mode 100644 exoneration-covid/tsconfig.json rename modele-social/build.js => scripts/build-rules.js (91%) rename {modele-social => scripts}/check-changelog.js (100%) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index bfb6a5f1b..a83026473 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -9,10 +9,8 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} runs-on: ubuntu-20.04 strategy: - # On a seulement 1 paquet donc pas besoin de matrix ici, mais c'est en - # prévision du paquet covid à venir. matrix: - package: ['modele-social'] + package: ['modele-social', 'exoneration-covid'] steps: - uses: actions/checkout@v2 - run: yarn install --frozen-lockfile diff --git a/README.md b/README.md index 779c86b46..42239bdd3 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ Ce dépôt contient : - Le code source du site [mon-entreprise](https://mon-entreprise.urssaf.fr) - Les [règles publicodes](https://github.com/betagouv/mon-entreprise/tree/master/modele-social) pour le calcul des cotisations sociales, des impôts et des droits sociaux. +- Les [règles publicodes](https://github.com/betagouv/mon-entreprise/tree/master/exoneration-covid) pour le calcul du montant des exonérations de cotisations liées au covid ## [mon-entreprise](https://mon-entreprise.urssaf.fr) diff --git a/exoneration-covid/.yarnrc b/exoneration-covid/.yarnrc new file mode 100644 index 000000000..803b9f31c --- /dev/null +++ b/exoneration-covid/.yarnrc @@ -0,0 +1,2 @@ +version-tag-prefix exonération-covid.publicodes -v +version-git-message "⬆ Mise à jour du paquet \"exonération-covid.publicodes \" vers %s" diff --git a/exoneration-covid/CHANGELOG.md b/exoneration-covid/CHANGELOG.md new file mode 100644 index 000000000..93fdd3060 --- /dev/null +++ b/exoneration-covid/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.1.0 + +Première version du paquet diff --git a/exoneration-covid/README.md b/exoneration-covid/README.md new file mode 100644 index 000000000..beee92dc0 --- /dev/null +++ b/exoneration-covid/README.md @@ -0,0 +1,32 @@ +# Modèle social français en publicodes + +Ce paquet contient les règles [publicodes](https://publi.codes) utilisées sur https://mon-entreprise.urssaf.fr pour le calcul de l'exonération covid 2021. + +### Installation + +``` +npm install publicodes exoneration-covid +``` + +### Exemple d'utilisation + +```js +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'", + + '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', +}) + +console.log(formatValue(engine.evaluate('montant total'))) +``` + +👉 **[Voir l'exemple complet](https://codesandbox.io/s/covidform-rxweh?file=/src/index.js)** diff --git a/exoneration-covid/index.d.ts b/exoneration-covid/index.d.ts new file mode 100644 index 000000000..8cb6cf61e --- /dev/null +++ b/exoneration-covid/index.d.ts @@ -0,0 +1,9 @@ +// Currenty we systematically bundle all the rules even if we only need a +// sub-section of them. We might support "code-splitting" the rules in the +// future. +import { Rule } from 'publicodes' +import { Names } from './dist/names' + +export type DottedName = Names +declare let rules: Record +export default rules diff --git a/exoneration-covid/package.json b/exoneration-covid/package.json new file mode 100644 index 000000000..12140efeb --- /dev/null +++ b/exoneration-covid/package.json @@ -0,0 +1,32 @@ +{ + "name": "exoneration-covid", + "version": "0.1.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", + "repository": { + "type": "git", + "url": "https://github.com/betagouv/mon-entreprise.git", + "directory": "exoneration-covid" + }, + "bugs": "https://github.com/betagouv/mon-entreprise/issues?q=is%3Aopen+is%3Aissue+label%3A%22%F0%9F%93%95+l%C3%A9gislation%22", + "license": "MIT", + "files": [ + "dist/index.js" + ], + "type": "module", + "devDependencies": { + "js-yaml": "^4.1.0", + "publicodes": "^1.0.0-beta.30" + }, + "peerDependencies": { + "publicodes": "^1.0.0-beta.30" + }, + "scripts": { + "build": "node ../scripts/build-rules.js", + "clean": "rimraf dist node_modules", + "prepare": "yarn run build", + "up": "yarn version --minor && echo \"ℹ N'oubliez pas de poussez le tag git\"", + "test": "node ../scripts/check-changelog.js" + } +} diff --git a/exoneration-covid/règles/exonération-covid.yaml b/exoneration-covid/règles/exonération-covid.yaml new file mode 100644 index 000000000..42daabf81 --- /dev/null +++ b/exoneration-covid/règles/exonération-covid.yaml @@ -0,0 +1,286 @@ +secteur: + question: De quel secteur relève votre activité principale ? + une possibilité: + choix obligatoire: oui + possibilités: [S1, S1bis, S2] + +secteur . S1: + valeur: secteur = 'S1' + titre: Secteur dit S1 + Description: Activités du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel + +secteur . S1bis: + valeur: secteur = 'S1bis' + titre: Secteur dit S1bis + Description: Activités dépendantes du secteur 1 + +secteur . S2: + valeur: secteur = 'S2' + titre: Secteur dit S2 + Description: Autres activités ayant fait l'objet d'une interdiction (par exemple, commerces) + +secteur . S1 ou S1bis: + une de ces conditions: + - S1 + - S1bis + +lieu d'exercice: + question: Où exercez-vous votre activité ? + une possibilité: + choix obligatoire: oui + possibilités: + - métropole + - outre-mer + +lieu d'exercice . métropole: + titre: En métropole +lieu d'exercice . outre-mer: + titre: En outre-mer + +début d'activité: + titre: Période de début d’activité + question: À quelle période avez-vous débuté votre activité ? + formulaire: + type: select + une possibilité: + choix obligatoire: oui + possibilités: + - avant 2021 + - janvier 2021 + - février 2021 + - mars 2021 + - avril 2021 + - mai 2021 + - juin 2021 + - juillet 2021 + - août 2021 + - septembre 2021 + - octobre 2021 + - novembre 2021 + - décembre 2021 + +début d'activité . avant 2021: +début d'activité . janvier 2021: +début d'activité . février 2021: +début d'activité . mars 2021: +début d'activité . avril 2021: +début d'activité . mai 2021: +début d'activité . juin 2021: +début d'activité . juillet 2021: +début d'activité . août 2021: +début d'activité . septembre 2021: +début d'activité . octobre 2021: +début d'activité . novembre 2021: +début d'activité . décembre 2021: + +début d'activité . date: + # Converti les possibilités en date (dans le futur on aimerait avoir des select basé sur des types sommes, et un type pour exprimer un 'mois' d'une date) + variations: + - si: début d'activité = 'avant 2021' + alors: 12/2020 + - si: début d'activité = 'janvier 2021' + alors: 01/2021 + - si: début d'activité = 'février 2021' + alors: 02/2021 + - si: début d'activité = 'mars 2021' + alors: 03/2021 + - si: début d'activité = 'avril 2021' + alors: 04/2021 + - si: début d'activité = 'mai 2021' + alors: 05/2021 + - si: début d'activité = 'juin 2021' + alors: 06/2021 + - si: début d'activité = 'juillet 2021' + alors: 07/2021 + - si: début d'activité = 'août 2021' + alors: 08/2021 + - si: début d'activité = 'septembre 2021' + alors: 09/2021 + - si: début d'activité = 'octobre 2021' + alors: 10/2021 + - si: début d'activité = 'novembre 2021' + alors: 11/2021 + - si: début d'activité = 'décembre 2021' + alors: 12/2021 + +LFSS600: + 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 + +LFSS600 . montant: + produit: + assiette: 600 €/mois + facteur: mois éligibles + +LFSS300: + 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 + +LFR1: + 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 + +LFR1 . montant: + produit: + assiette: mois éligibles + facteur: 600 €/mois + +exonération S2: + applicable si: + toutes ces conditions: + - secteur . S2 + - début d'activité . date <= mois éligibles . dernier mois + +exonération S2 . mois éligibles: + unité: mois + arrondi: oui + question: + texte: Précisez le nombre de mois entre {{ premier mois }} et {{ dernier mois }} durant lesquels vous avez fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de votre activité + plafond: + nom: plafond + somme: + - durée: + depuis: premier mois + jusqu'à: dernier mois + arrondi: oui + unité: mois + - 1 mois +exonération S2 . mois éligibles . premier mois: + variations: + - si: début d'activité . date < 01/2021 + alors: 04/2021 + - sinon: + valeur: début d'activité . date + plancher: 02/2021 + plafond: dernier mois + +exonération S2 . mois éligibles . dernier mois: + variations: + - si: lieu d'exercice = 'outre-mer' + 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 diff --git a/exoneration-covid/tsconfig.json b/exoneration-covid/tsconfig.json new file mode 100644 index 000000000..f8fb691b2 --- /dev/null +++ b/exoneration-covid/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "allowJs": true, + "noEmit": true, + "strict": true + } +} diff --git a/modele-social/package.json b/modele-social/package.json index ee0a8b0b2..4c0f31a40 100644 --- a/modele-social/package.json +++ b/modele-social/package.json @@ -24,10 +24,10 @@ "publicodes": "^1.0.0-beta.30" }, "scripts": { - "build": "node build.js", + "build": "node ../scripts/build-rules.js", "clean": "rimraf dist node_modules", "prepare": "yarn run build", "up": "yarn version --minor && echo \"ℹ N'oubliez pas de poussez le tag git\"", - "test": "node check-changelog.js" + "test": "node ../scripts/check-changelog.js" } } diff --git a/modele-social/tsconfig.json b/modele-social/tsconfig.json index 49fc71a60..f8fb691b2 100644 --- a/modele-social/tsconfig.json +++ b/modele-social/tsconfig.json @@ -3,6 +3,5 @@ "allowJs": true, "noEmit": true, "strict": true - }, - "include": ["build.js"] + } } diff --git a/package.json b/package.json index c6884e993..7ea7dbbe8 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "workspaces": [ "modele-social", + "exoneration-covid", "site" ], "type": "module", @@ -26,7 +27,7 @@ "test:type": "yarn workspaces run tsc --skipLibCheck --noEmit", "clean": "yarn workspaces run clean && rimraf node_modules", "start": "yarn workspace site start", - "moso:up": "yarn workspace modele-social run up && yarn workspace site upgrade modele-social", + "moso:up": "yarn workspace modele-social run up && yarn workspace exoneration-covid run up && yarn workspace site upgrade modele-social", "i18n:check": "yarn workspace site i18n:check", "i18n:translate": "yarn workspace site i18n:translate" }, diff --git a/modele-social/build.js b/scripts/build-rules.js similarity index 91% rename from modele-social/build.js rename to scripts/build-rules.js index 72636f7f5..a7599b69f 100644 --- a/modele-social/build.js +++ b/scripts/build-rules.js @@ -3,9 +3,8 @@ import fs from 'fs' import path from 'path' import yaml from 'js-yaml' -// utf8 url -const publicodesDir = decodeURI(new URL('./règles', import.meta.url).pathname) -const outDir = new URL('./dist', import.meta.url).pathname +const publicodesDir = './règles' +const outDir = './dist' if (!fs.existsSync(outDir)) { fs.mkdirSync(outDir) diff --git a/modele-social/check-changelog.js b/scripts/check-changelog.js similarity index 100% rename from modele-social/check-changelog.js rename to scripts/check-changelog.js diff --git a/site/source/components/Distribution.css b/site/source/components/Distribution.css index 94df4c327..12791fd2e 100644 --- a/site/source/components/Distribution.css +++ b/site/source/components/Distribution.css @@ -6,7 +6,6 @@ width: 100%; border: none; align-items: center; - position: relative; } .distribution-chart__bar-container { From 70650db9f629b7cc0f3e707a796123f93f4d41cf Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 14 Feb 2022 14:10:09 +0100 Subject: [PATCH 2/5] =?UTF-8?q?Change=20l'architecture=20des=20r=C3=A8gles?= =?UTF-8?q?=20de=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' From 454fbe4c806954f03bfd590481abd762c9de68d2 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 14 Feb 2022 17:57:18 +0100 Subject: [PATCH 3/5] =?UTF-8?q?D=C3=A9sactive=20le=20watch=20des=20r=C3=A8?= =?UTF-8?q?gles=20en=20attendant=20de=20trouver=20une=20meilleure=20fa?= =?UTF-8?q?=C3=A7on=20de=20faire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintignore | 3 +++ exoneration-covid/.yarnrc | 4 ++-- scripts/build-rules.js | 5 +---- scripts/check-changelog.js | 8 ++------ site/vite.config.ts | 3 +-- 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/.eslintignore b/.eslintignore index 7e0cec355..2154f9afa 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,6 @@ node_modules dist publicodes/example/ + +# TODO fix weird error in ./exoneration-covid/index.d.ts : Parsing error: "parserOptions.project" has been set for @typescript-eslint/parser. +exoneration-covid/index.d.ts \ No newline at end of file diff --git a/exoneration-covid/.yarnrc b/exoneration-covid/.yarnrc index 803b9f31c..816ae2805 100644 --- a/exoneration-covid/.yarnrc +++ b/exoneration-covid/.yarnrc @@ -1,2 +1,2 @@ -version-tag-prefix exonération-covid.publicodes -v -version-git-message "⬆ Mise à jour du paquet \"exonération-covid.publicodes \" vers %s" +version-tag-prefix exoneration-covid -v +version-git-message "⬆ Mise à jour du paquet \"exoneration-covid \" vers %s" diff --git a/scripts/build-rules.js b/scripts/build-rules.js index a7599b69f..83d59a36d 100644 --- a/scripts/build-rules.js +++ b/scripts/build-rules.js @@ -43,7 +43,7 @@ function readRules() { // Note: we can't put the output file in the fs.watched directory -function writeJSFile() { +export default function writeJSFile() { const rules = readRules() const names = Object.keys(rules) const jsString = `export default ${JSON.stringify(rules, null, 2)}` @@ -55,6 +55,3 @@ function writeJSFile() { } writeJSFile() -export function watchDottedNames() { - return fs.watch(publicodesDir, writeJSFile) -} diff --git a/scripts/check-changelog.js b/scripts/check-changelog.js index e875c9c28..995cc3543 100644 --- a/scripts/check-changelog.js +++ b/scripts/check-changelog.js @@ -1,13 +1,9 @@ // Ensure that current package version is referenced in the Changelog.md import { readFileSync } from 'fs' -const packageVersion = JSON.parse( - readFileSync(new URL('./package.json', import.meta.url).pathname) -).version +const packageVersion = JSON.parse(readFileSync('./package.json')).version -const changelog = readFileSync( - new URL('./CHANGELOG.md', import.meta.url).pathname -) +const changelog = readFileSync('./CHANGELOG.md') if (!changelog.includes(`## ${packageVersion}\n`)) { throw Error( diff --git a/site/vite.config.ts b/site/vite.config.ts index 0bc5b4d73..56943c32c 100644 --- a/site/vite.config.ts +++ b/site/vite.config.ts @@ -5,7 +5,6 @@ import fs from 'fs/promises' import path from 'path' import toml from 'rollup-plugin-toml' import { defineConfig, Plugin } from 'vite' -import { watchDottedNames } from '../scripts/build-rules' import shimReactPdf from 'vite-plugin-shim-react-pdf' import serveStatic from 'serve-static' @@ -162,7 +161,7 @@ function monEntrepriseDevServer(): Plugin { configureServer() { // We could use native ViteJS watch API, but it would require changing // more code and maybe the whole "modele-social" package build process. - watchDottedNames() + // watchDottedNames() }, } } From 13523f45a3ef71657ac5996c4bdefa3137c0a5ed Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 16 Feb 2022 14:03:34 +0100 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20les=20erreurs=20da?= =?UTF-8?q?ns=20la=20console?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/conversation/NumberInput.tsx | 1 - .../components/utils/useSimulationConfig.ts | 9 +- site/source/design-system/buttons/Button.tsx | 20 ++-- .../design-system/buttons/ButtonHelp.tsx | 11 +- site/source/design-system/card/Card.tsx | 10 +- .../design-system/field/SearchField.tsx | 1 - .../design-system/field/Select/index.tsx | 4 +- site/source/locales/ui-en.yaml | 101 +++++++++--------- site/source/locales/ui-fr.yaml | 28 ++--- .../pages/Simulateurs/ChômagePartiel.tsx | 89 +++++++-------- site/source/pages/Simulateurs/metadata.tsx | 32 +++--- 11 files changed, 154 insertions(+), 152 deletions(-) diff --git a/site/source/components/conversation/NumberInput.tsx b/site/source/components/conversation/NumberInput.tsx index e19effa90..cc54a1078 100644 --- a/site/source/components/conversation/NumberInput.tsx +++ b/site/source/components/conversation/NumberInput.tsx @@ -108,7 +108,6 @@ function getSerializedUnit( } const formatUnit = getFormatUnit(unit) - console.log(unit, locale, formatUnit) if (!formatUnit) { return ( diff --git a/site/source/components/utils/useSimulationConfig.ts b/site/source/components/utils/useSimulationConfig.ts index 3fafee9c9..51874f97b 100644 --- a/site/source/components/utils/useSimulationConfig.ts +++ b/site/source/components/utils/useSimulationConfig.ts @@ -1,4 +1,5 @@ import { setSimulationConfig } from 'Actions/actions' +import { useEffect } from 'react' import { useDispatch, useSelector } from 'react-redux' import { useHistory } from 'react-router' import { Company } from 'Reducers/inFranceAppReducer' @@ -24,9 +25,11 @@ export default function useSimulationConfig( : undefined const lastConfig = useSelector(configSelector) - if (config && lastConfig !== config) { - dispatch(setSimulationConfig(config ?? {}, url, initialSituation)) - } + useEffect(() => { + if (config && lastConfig !== config) { + dispatch(setSimulationConfig(config ?? {}, url, initialSituation)) + } + }, [config, dispatch, lastConfig, initialSituation, url]) } export function getCompanySituation(company: Company | null): Situation { diff --git a/site/source/design-system/buttons/Button.tsx b/site/source/design-system/buttons/Button.tsx index 5b02534f0..a7fb4ad60 100644 --- a/site/source/design-system/buttons/Button.tsx +++ b/site/source/design-system/buttons/Button.tsx @@ -32,7 +32,7 @@ export const Button = forwardRef(function Button( {...buttonOrLinkProps} className={className} size={size} - light={light} + $light={light} color={color} /> ) @@ -41,7 +41,7 @@ export const Button = forwardRef(function Button( type StyledButtonProps = { color: Color size: Size - light: boolean + $light: boolean isDisabled?: boolean } @@ -93,8 +93,8 @@ export const StyledButton = styled.button` `} /* Primary, secondary & tertiary light colors */ - ${({ light, color, theme }) => - light && + ${({ $light, color, theme }) => + $light && !theme.darkMode && css` color: ${theme.colors.bases[color][color === 'primary' ? 700 : 700]}; @@ -111,9 +111,9 @@ export const StyledButton = styled.button` `} /* White color and light mode (dark background mode) */ - ${({ light, theme }) => + ${({ $light, theme }) => theme.darkMode && - light && + $light && css` background-color: transparent; border-color: ${theme.colors.extended.grey[100]}; @@ -122,11 +122,11 @@ export const StyledButton = styled.button` } /* HOVER STYLE */ :hover { - ${({ theme, color, isDisabled, light }) => + ${({ theme, color, isDisabled, $light }) => isDisabled || theme.darkMode ? '' : /* Primary, secondary & tertiary light colors */ - light + $light ? css` background-color: ${theme.colors.bases[color][ color === 'primary' ? 200 : color === 'secondary' ? 100 : 100 @@ -143,11 +143,11 @@ export const StyledButton = styled.button` /* Dark mode */ @media not print { :hover { - ${({ light, theme, isDisabled }) => + ${({ $light, theme, isDisabled }) => isDisabled || !theme.darkMode ? '' : /* White color and light mode (dark background mode) */ - light + $light ? css` color: rgba(255, 255, 255, 25%); opacity: 1; diff --git a/site/source/design-system/buttons/ButtonHelp.tsx b/site/source/design-system/buttons/ButtonHelp.tsx index 87a733d39..8d1ae9622 100644 --- a/site/source/design-system/buttons/ButtonHelp.tsx +++ b/site/source/design-system/buttons/ButtonHelp.tsx @@ -20,7 +20,7 @@ export default function ButtonHelp({ return ( ( - +