Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
JalilArfaoui committed Nov 13, 2024
1 parent 427ebfe commit 05937b4
Show file tree
Hide file tree
Showing 30 changed files with 638 additions and 420 deletions.
11 changes: 9 additions & 2 deletions api/source/test-e2e/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,18 @@ describe('e2e test mon-entreprise api', () => {
'dirigeant . indépendant . PL . métier': "'avocat'",
'entreprise . activité . nature': "'libérale'",
'entreprise . date de création': '01/01/2013',
"entreprise . chiffre d'affaires": 6264,
"entreprise . chiffre d'affaires": '6264 €/an',
'entreprise . catégorie juridique': "'EI'",
'entreprise . catégorie juridique . EI . auto-entrepreneur': 'non',
},
expressions: ['dirigeant . rémunération . net . après impôt'],
expressions: [
// 'dirigeant . régime social',
// 'dirigeant . indépendant',
// 'dirigeant . rémunération . totale',
// 'dirigeant . rémunération . cotisations',
// 'dirigeant . rémunération . net',
'dirigeant . rémunération . net . après impôt',
],
})
.then((res) => {
expect(res.status).toMatchInlineSnapshot('200')
Expand Down
5 changes: 4 additions & 1 deletion modele-social/règles/dirigeant/dirigeant.publicodes
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ dirigeant . gérant minoritaire:
dirigeant . régime social:
experimental: oui
variations:
- si: entreprise . catégorie juridique . EI . auto-entrepreneur
- si:
toutes ces conditions:
- est applicable: entreprise . catégorie juridique . EI . auto-entrepreneur
- entreprise . catégorie juridique . EI . auto-entrepreneur
alors: "'auto-entrepreneur'"
- si:
une de ces conditions:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ dirigeant . indépendant . PL . CNBF . retraite de base:
alors: 608 €/an
- si: date >= 01/2021
alors: 581 €/an
plafond: 2 ans
plafond: 2 an
- montant:
variations:
- si: date >= 01/2024
Expand All @@ -60,7 +60,7 @@ dirigeant . indépendant . PL . CNBF . retraite de base:
alors: 954 €/an
- si: date >= 01/2021
alors: 912 €/an
plafond: 3 ans
plafond: 3 an
- montant:
variations:
- si: date >= 01/2024
Expand All @@ -71,7 +71,7 @@ dirigeant . indépendant . PL . CNBF . retraite de base:
alors: 1299 €/an
- si: date >= 01/2021
alors: 1242 €/an
plafond: 5 ans
plafond: 5 an
- montant:
variations:
- si: date >= 01/2024
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ dirigeant . indépendant . PL . métier:

dirigeant . indépendant . PL . métier . rattaché CIPAV:
titre: Autre métier rattaché à la CIPAV
par défaut: non
description: |
Vous exercez un métier réglementé rattaché à la CIPAV. La liste de ces métiers est :

Expand Down Expand Up @@ -125,7 +126,7 @@ dirigeant . indépendant . PL . métier . juridique:
description: |
Les officiers ministériels, les officiers publics et les compagnies judiciaires sont affiliées à la Cavom pour leur retraite et de prévoyance.

Liste des métiers concernés :
Liste des métiers concernés :

- Huissiers de justice ;
- Commissaires-priseurs (judiciaires et/ou de ventes volontaires) ;
Expand Down
22 changes: 9 additions & 13 deletions modele-social/règles/entreprise/catégorie-juridique.publicodes
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,15 @@ entreprise . catégorie juridique . EI:

avec:
auto-entrepreneur:
question: Êtes-vous auto-entrepreneur ?
acronyme: AE
par défaut: par défaut
non applicable si: salarié
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
Expand All @@ -66,15 +71,6 @@ entreprise . catégorie juridique . EI:
Où et comment s'inscrire pour devenir micro-entrepreneur (ex auto-entrepreneur)?: https://bpifrance-creation.fr/encyclopedie/micro-entreprise-regime-auto-entrepreneur/lessentiel-ce-regime/ou-comment-sinscrire
La comptabilité du micro-entrepreneur (auto-entrepreneur): https://bpifrance-creation.fr/encyclopedie/micro-entreprise-regime-auto-entrepreneur/fiscal-social-comptable/comptabilite-du

auto-entrepreneur . par défaut:
non applicable si:
une de ces conditions:
- 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
experimental: oui

EI:
titre: entreprise individuelle
acronyme: EI
Expand Down
6 changes: 3 additions & 3 deletions modele-social/règles/salarié/salarié.publicodes
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
salarié:
par défaut: non
icônes: 🤝
valeur: oui

salarié . ancienneté:
durée:
Expand Down Expand Up @@ -41,9 +41,9 @@ salarié . convention collective:
valeur:
convention collective = 'autre'
description: >-
Attention : votre convention collective n'est pas prise en charge,
Attention : votre convention collective n'est pas prise en charge,
la simulation se basera sur le droit commun.

salarié . régimes spécifiques:
salarié . régimes spécifiques . alsace moselle:
titre: Régime Alsace-Moselle
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-vitest": "^0.3.22",
"prettier": "^3.0.3",
"publicodes": "^1.5.1",
"publicodes": "^1.5.4",
"rimraf": "^5.0.1"
},
"resolutions": {
Expand Down
2 changes: 1 addition & 1 deletion site/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
"@internationalized/number": "^3.2.1",
"@juggle/resize-observer": "^3.4.0",
"@leeoniya/ufuzzy": "^1.0.10",
"@publicodes/react-ui": "^1.5.2",
"@publicodes/react-ui": "^1.5.4",
"@react-aria/accordion": "^3.0.0-alpha.17",
"@react-pdf/renderer": "^3.1.12",
"@sentry/integrations": "^7.70.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ const config: SimulationConfig = {
'dirigeant . régime social': "'indépendant'",
date: '01/01/2023',
'dirigeant . indépendant . PL . CIPAV': 'non',
'entreprise . catégorie juridique': "''",
impôt: 'non',
},
'unité par défaut': '€',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const configArtisteAuteur: SimulationConfig = {
],
situation: {
'artiste-auteur': 'oui',
salarié: 'oui',
dirigeant: {
'applicable si': 'non',
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ export const configComparateurStatuts: ComparateurConfig = {
'unité par défaut': '€/mois',
situation: {
'entreprise . activités . revenus mixtes': 'non',
'entreprise . catégorie juridique': "''",
salarié: 'non',
'salarié . cotisations . ATMP . taux fonctions support': 'oui',
"entreprise . chiffre d'affaires": '4000 €/mois',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ export const configRéductionGénérale: SimulationConfig = {
'unité par défaut': '€/an',
situation: {
dirigeant: 'non',
'entreprise . catégorie juridique': "''",
'entreprise . imposition': 'non',
},
}
50 changes: 50 additions & 0 deletions site/test/modele-social/artiste-auteur.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import rules, { DottedName } from 'modele-social'
import Engine from 'publicodes'
import { beforeEach, describe, expect, it } from 'vitest'

import { Situation } from '@/domaine/Situation'

describe('Un artiste-auteur', () => {
let engine: Engine<DottedName>
beforeEach(() => {
engine = new Engine(rules)
})

const situation: Situation = {
'artiste-auteur': 'oui',
salarié: 'oui',
}

describe('salarié à 1000 €/an', () => {
const situationSalarié = {
...situation,
salarié: 'oui',
'artiste-auteur . revenus . traitements et salaires': '1000 €/an',
}

it('paie des cotisations', () => {
const e = engine.setSituation(situationSalarié)

expect(e).toEvaluate('artiste-auteur . cotisations', 160)
})

it('ne paie pas d’IRCEC', () => {
const e = engine.setSituation(situationSalarié)

expect(e).toEvaluate('artiste-auteur . cotisations . IRCEC', 0)
})
})

describe('avec un revenu BNC de 10 000 €/an', () => {
const situationBNC = {
...situation,
'artiste-auteur . revenus . BNC . recettes': '10000 €/an',
}

it('paie des cotisations', () => {
const e = engine.setSituation(situationBNC)

expect(e).toEvaluate('artiste-auteur . cotisations', 1230)
})
})
})
42 changes: 42 additions & 0 deletions site/test/modele-social/auto-entrepreneur.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import rules, { DottedName } from 'modele-social'
import Engine from 'publicodes'
import { beforeEach, describe, expect, it } from 'vitest'

describe('Auto-entrepreneur', function () {
let engine: Engine<DottedName>
beforeEach(() => {
engine = new Engine(rules)
})

const situation = {
'entreprise . catégorie juridique': "'EI'",
'entreprise . catégorie juridique . EI . auto-entrepreneur': 'oui',
}

it('a le régime social auto-entrepreneur', function () {
engine.setSituation(situation)

expect(engine).toEvaluate('dirigeant . régime social', 'auto-entrepreneur')
})
describe('dans un DROM', () => {
const situationDrom = {
...situation,
'établissement . commune . département . outre-mer': 'oui',
"dirigeant . auto-entrepreneur . chiffre d'affaires": '20000 €/an',
'entreprise . activités . revenus mixtes': 'oui',
"entreprise . chiffre d'affaires . service BIC": '12000 €/an',
"entreprise . chiffre d'affaires . service BNC": '3000 €/an',
"entreprise . chiffre d'affaires . vente restauration hébergement":
'5000 €/an',
}

it('a un revenu net de', () => {
engine.setSituation(situationDrom)

expect(engine).toEvaluate(
'dirigeant . auto-entrepreneur . revenu net',
16125
)
})
})
})
39 changes: 39 additions & 0 deletions site/test/modele-social/avocat.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import rules, { DottedName } from 'modele-social'
import Engine from 'publicodes'
import { beforeEach, describe, expect, it } from 'vitest'

describe('Un avocat', () => {
let engine: Engine<DottedName>
beforeEach(() => {
engine = new Engine(rules)
})

const chiffreDAffaires = 6264

const situation = {
'dirigeant . indépendant . cotisations facultatives': 'oui',
'entreprise . activité . nature . libérale . réglementée': 'oui',
'dirigeant . indépendant . PL . métier': "'avocat'",
'entreprise . activité . nature': "'libérale'",
'entreprise . date de création': '01/01/2021',
"entreprise . chiffre d'affaires": `${chiffreDAffaires} €/an`,
'entreprise . catégorie juridique': "'EI'",
'entreprise . catégorie juridique . EI . auto-entrepreneur': 'non',
}

it('est un indépendant', () => {
const e = engine.setSituation(situation)
expect(e).toEvaluate('entreprise . catégorie juridique', 'EI')
expect(e).toEvaluate('dirigeant . régime social', 'indépendant')
})

it('paie des cotisations inférieures à son chiffre d’affaires', () => {
const e = engine.setSituation(situation)

const cotisations = e.evaluate(
'dirigeant . rémunération . cotisations'
).nodeValue

expect(cotisations).toSatisfy((c: number) => c > 0 && c < chiffreDAffaires)
})
})
5 changes: 5 additions & 0 deletions site/test/modele-social/helpers/PublicodesTypes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export type PublicodesTypes =
| number
| boolean
| string
| Record<string, unknown>
10 changes: 10 additions & 0 deletions site/test/modele-social/helpers/logValue.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { DottedName } from 'modele-social'
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}`
// eslint-disable-next-line no-console,@typescript-eslint/restrict-template-expressions
console.log(`${rule} = ${result.nodeValue} ${unit}`)
}
47 changes: 47 additions & 0 deletions site/test/modele-social/matchers/toEvaluate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
import { DottedName } from 'modele-social'
import Engine, { Evaluation } from 'publicodes'
import { expect } from 'vitest'

import { PublicodesTypes } from '../helpers/PublicodesTypes'

const toEvaluate = function <T extends PublicodesTypes>(
engine: Engine,
rule: DottedName,
value: Evaluation<T>
) {
const evaluated = engine.evaluate(rule).nodeValue
const pass = evaluated === value

if (pass) {
return {
message: () =>
// `this` context will have correct typings
// @ts-ignore
`expected ${this.utils.printReceived(
evaluated
// @ts-ignore
)} not to equal ${this.utils.printExpected(
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
`${value}`
)} for rule ${rule}`,
pass: true,
}
} else {
return {
message: () =>
// @ts-ignore
`expected ${this.utils.printReceived(
evaluated
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
)} to equal ${this.utils.printExpected(`${value}`)} for rule ${rule}`,
pass: false,
}
}
}

expect.extend({
toEvaluate,
})
Loading

0 comments on commit 05937b4

Please sign in to comment.