From d3784227b4c6a4a0ab96a46d97f906927c4ec96a Mon Sep 17 00:00:00 2001 From: Jalil Arfaoui Date: Wed, 13 Nov 2024 19:09:48 +0100 Subject: [PATCH] =?UTF-8?q?wip=20profession-lib=C3=A9rale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cat\303\251gorie-juridique.publicodes" | 5 +-- site/test/modele-social/helpers/logValue.ts | 18 ++++++++- .../test/modele-social/matchers/toEvaluate.ts | 19 +++++++++ .../profession-lib\303\251rale.test.ts" | 39 +++++++++++++++++++ site/test/vitest.d.ts | 1 + 5 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 "site/test/modele-social/profession-lib\303\251rale.test.ts" diff --git "a/modele-social/r\303\250gles/entreprise/cat\303\251gorie-juridique.publicodes" "b/modele-social/r\303\250gles/entreprise/cat\303\251gorie-juridique.publicodes" index 3375a623a9..a7de9b9dd1 100644 --- "a/modele-social/r\303\250gles/entreprise/cat\303\251gorie-juridique.publicodes" +++ "b/modele-social/r\303\250gles/entreprise/cat\303\251gorie-juridique.publicodes" @@ -52,15 +52,14 @@ entreprise . catégorie juridique . EI: avec: auto-entrepreneur: + question: Êtes-vous auto-entrepreneur ? + acronyme: AE par défaut: non non applicable si: par défaut: non une de ces conditions: - salarié = oui - entreprise . imposition . IR . type de bénéfices = 'BA' - - toutes ces conditions: - - activité . nature . libérale . réglementée - - dirigeant . indépendant . PL . métier . rattaché CIPAV = non références: S'informer sur le statut: https://www.autoentrepreneur.urssaf.fr/portail/accueil/sinformer-sur-le-statut/lessentiel-du-statut.html Les étapes de la création d'une auto-entreprise: https://www.autoentrepreneur.urssaf.fr/portail/accueil/creer-mon-auto-entreprise.html diff --git a/site/test/modele-social/helpers/logValue.ts b/site/test/modele-social/helpers/logValue.ts index 0104655e38..0895e79860 100644 --- a/site/test/modele-social/helpers/logValue.ts +++ b/site/test/modele-social/helpers/logValue.ts @@ -4,7 +4,23 @@ import Engine from 'publicodes' export const logValue = (e: Engine, rule: DottedName) => { const result = e.evaluate(rule) // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - const unit = `${result.unit?.numerators}/${result.unit?.denominators}` + + const unit = result.unit?.denominators + ? `${result.unit?.numerators}/-${result.unit?.denominators}` + : result.unit?.numerators + ? `${result.unit?.numerators}` + : '' + // eslint-disable-next-line no-console,@typescript-eslint/restrict-template-expressions console.log(`${rule} = ${result.nodeValue} ${unit}`) } + +export const logApplicability = (e: Engine, rule: DottedName) => { + const result = e.evaluate({ 'est applicable': rule }) + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + + // eslint-disable-next-line no-console,@typescript-eslint/restrict-template-expressions + console.log( + `${rule} ${result.nodeValue ? 'est applicable' : 'n’est pas applicable'}` + ) +} diff --git a/site/test/modele-social/matchers/toEvaluate.ts b/site/test/modele-social/matchers/toEvaluate.ts index 05d38ed52d..3202c36b04 100644 --- a/site/test/modele-social/matchers/toEvaluate.ts +++ b/site/test/modele-social/matchers/toEvaluate.ts @@ -42,6 +42,25 @@ const toEvaluate = function ( } } +const toBeApplicable = function (engine: Engine, rule: DottedName) { + const pass = engine.evaluate({ + 'est applicable': rule, + }).nodeValue + + if (pass) { + return { + message: () => `La règle ${rule} ne devrait pas être applicable`, + pass: true, + } + } else { + return { + message: () => `La règle ${rule} devrait être applicable`, + pass: false, + } + } +} + expect.extend({ toEvaluate, + toBeApplicable, }) diff --git "a/site/test/modele-social/profession-lib\303\251rale.test.ts" "b/site/test/modele-social/profession-lib\303\251rale.test.ts" new file mode 100644 index 0000000000..a05ab6da1d --- /dev/null +++ "b/site/test/modele-social/profession-lib\303\251rale.test.ts" @@ -0,0 +1,39 @@ +import rules, { DottedName } from 'modele-social' +import Engine from 'publicodes' +import { beforeEach, describe, expect, it } from 'vitest' + +const situationProfessionLibérale = { + salarié: 'non', + 'entreprise . activité . nature': "'libérale'", + 'entreprise . catégorie juridique': "'EI'", + 'entreprise . imposition': "'IR'", + 'entreprise . catégorie juridique . EI . auto-entrepreneur': 'non', +} + +describe('Une profession libérale', () => { + let engine: Engine + beforeEach(() => { + engine = new Engine(rules) + }) + + const situationCIPAV = { + ...situationProfessionLibérale, + 'entreprise . activité . nature . libérale . réglementée': 'oui', + } + + describe('en CIPAV ACRE', () => { + const situationCIPAVACRE = { + ...situationCIPAV, + 'dirigeant . rémunération . net': '5000 €/an', + 'dirigeant . exonérations . ACRE': 'oui', + 'entreprise . date de création': '11/11/2023', + } + + it('paie une retraite de base', () => { + const e = engine.setSituation(situationCIPAVACRE) + + expect(e).toBeApplicable('dirigeant . indépendant . PL') + expect(e).toEvaluate('protection sociale . retraite . base', 38) + }) + }) +}) diff --git a/site/test/vitest.d.ts b/site/test/vitest.d.ts index 58da381e33..02900a2849 100644 --- a/site/test/vitest.d.ts +++ b/site/test/vitest.d.ts @@ -10,6 +10,7 @@ interface CustomMatchers { rule: DottedName, value: Evaluation ) => R + toBeApplicable: (rule: DottedName) => R } declare module 'vitest' {