Reformat files

* Prettier upgrade to 2.3.0.
* Run prettier on yaml files.
* Trim trailing whitespaces in yaml files (via editorconfig plugin).
* Translate rules again.
pull/1667/head
Alexandre Hajjar 2021-07-01 18:26:31 +02:00
parent d3c866daa5
commit 04d8c01243
81 changed files with 1370 additions and 1412 deletions

View File

@ -28,7 +28,8 @@ jobs:
- id: deploy-env
run: echo "::set-output name=name::${{ github.event.number || '${GITHUB_REF#refs/*/}' }}"
- id: base-urls
run: echo "::set-output name=fr::${{ steps.deploy-env.outputs.name == 'master' && 'https://mon-entreprise.fr' || format('https://{0}--mon-entreprise.netlify.app', steps.deploy-env.outputs.name) }}";
run:
echo "::set-output name=fr::${{ steps.deploy-env.outputs.name == 'master' && 'https://mon-entreprise.fr' || format('https://{0}--mon-entreprise.netlify.app', steps.deploy-env.outputs.name) }}";
echo "::set-output name=en::${{ steps.deploy-env.outputs.name == 'master' && 'https://mycompanyinfrance.fr' || format('https://{0}-en--mon-entreprise.netlify.app', steps.deploy-env.outputs.name) }}";
echo "::set-output name=publicodes::${{ steps.deploy-env.outputs.name == 'master' && 'https://publi.codes' || format('https://{0}-publicodes--mon-entreprise.netlify.app', steps.deploy-env.outputs.name) }}";
@ -145,7 +146,7 @@ jobs:
issue-number: ${{ github.event.pull_request.number }}
edit-mode: replace
body: |
🚀 La branche est déployée !
🚀 La branche est déployée !
- mon-entreprise : ${{ needs.deploy-context.outputs.fr_url }}
- mycompanyinfrance : ${{ needs.deploy-context.outputs.en_url }}
@ -164,7 +165,7 @@ jobs:
fail-fast: false
matrix:
site: ['fr', 'en', 'publicodes']
browser: [electron] # Firefox is very slow…
browser: [electron] # Firefox is very slow…
viewport: [default]
container: [1, 2, 3, 4]
include:
@ -203,7 +204,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v2
- uses: actions/cache@v2
# Custom cache as we do not care about installing all the other dependancies
with:
@ -211,9 +212,9 @@ jobs:
~/.cache/Cypress
node_modules
key: cypress-cache-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
- run: node mon-entreprise/scripts/get-cypress-packages.js | xargs npm i
- name: Test e2e mon-entreprise on preview (site=${{ matrix.site }}, browser=${{ matrix.browser}}, viewport=${{ matrix.viewport }})
uses: cypress-io/github-action@v2
with:
@ -243,7 +244,7 @@ jobs:
fail-fast: false
matrix:
site: ['fr', 'en', 'publicodes']
browser: [chrome] # Firefox is very slow…
browser: [chrome] # Firefox is very slow…
viewport: [default, small]
container: [1, 2, 3, 4]
include:
@ -282,7 +283,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v2
- uses: actions/cache@v2
# Custom cache as we do not care about installing all the other dependancies
with:
@ -290,9 +291,9 @@ jobs:
~/.cache/Cypress
node_modules
key: cypress-cache-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
- run: node mon-entreprise/scripts/get-cypress-packages.js | xargs npm i
- name: Test e2e mon-entreprise on production (site=${{ matrix.site }}, browser=${{ matrix.browser}}, viewport=${{ matrix.viewport }})
uses: cypress-io/github-action@v2
with:

View File

@ -1,5 +1,5 @@
name: Règles (non-regression)
on:
on:
pull_request:
paths:
- modele-social/règles/**
@ -9,10 +9,10 @@ jobs:
test:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
- run: yarn test:regressions
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
- run: yarn test:regressions

View File

@ -5,55 +5,51 @@ jobs:
lint:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
- run: yarn lint
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
- run: yarn lint
typecheck:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
env:
# Secrets of all kinds for fetching stats & releases
GITHUB_API_SECRET: ${{ secrets.GITHUB_TOKEN }}
ZAMMAD_API_SECRET_KEY: ${{ secrets.ZAMMAD_API_SECRET_KEY }}
ATINTERNET_API_SECRET_KEY: ${{ secrets.ATINTERNET_API_SECRET_KEY }}
ATINTERNET_API_ACCESS_KEY: ${{ secrets.ATINTERNET_API_ACCESS_KEY }}
- run: yarn test:type
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
env:
# Secrets of all kinds for fetching stats & releases
GITHUB_API_SECRET: ${{ secrets.GITHUB_TOKEN }}
ZAMMAD_API_SECRET_KEY: ${{ secrets.ZAMMAD_API_SECRET_KEY }}
ATINTERNET_API_SECRET_KEY: ${{ secrets.ATINTERNET_API_SECRET_KEY }}
ATINTERNET_API_ACCESS_KEY: ${{ secrets.ATINTERNET_API_ACCESS_KEY }}
- run: yarn test:type
unit:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
- run: yarn test
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
- run: yarn test
i18n:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
- working-directory: mon-entreprise
run:
yarn run i18n:rules:check;
yarn run i18n:ui:check
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: '**/node_modules'
key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2
- run: yarn install --frozen-lockfile
- working-directory: mon-entreprise
run: yarn run i18n:rules:check;
yarn run i18n:ui:check

View File

@ -18,7 +18,7 @@ jobs:
body: |
Ce ticket vient d'être fermé 🎉
Il est temps de prévenir les utilisateurs qui nous ont fait ce retour :
Il est temps de prévenir les utilisateurs qui nous ont fait ce retour :
https://mon-entreprise.zammad.com/#search/tags%3A%23${{ github.event.issue.number }}
Laissez un 👍 quand c'est fait !

View File

@ -75,7 +75,7 @@ artiste-auteur . cotisations . option surcotisation:
dans: vieillesse
par: assiette surcotisation
question: Souhaitez-vous surcotiser pour augmenter vos droits à retraite ?
description: |
description: |
Vos revenus sont en dessous des seuils vous permettant de valider l'ensemble
de vos droits sociaux. Vous pouvez choisir de surcotiser pour augmenter vos
droits.
@ -88,12 +88,12 @@ artiste-auteur . cotisations . assiette surcotisation: 900 heures/an * SMIC hora
artiste-auteur . cotisations . avertissement trimestres retraite:
type: notification
sévérité: avertissement
formule:
formule:
toutes ces conditions:
- assiette > 0 €/an
- assiette < 600 heures/an * SMIC horaire
- option surcotisation = non
description: |
description: |
Vos revenus ne vous permettent pas de valider 4 trimestres pour la retraite
de base. Vous pouvez décider de « surcotiser » pour valider 4 trimestres et
bénéficier d'indemnités journalières.
@ -182,7 +182,7 @@ artiste-auteur . cotisations . IRCEC . cotisation RAAP:
assiette: assiette
tranches:
- taux: 4%
plafond:
plafond:
variations:
- si: profession . RACD
alors: cotisation RACD . plafond
@ -237,7 +237,7 @@ artiste-auteur . cotisations . IRCEC . profession . RACL:
titre: auteur ou compositeur lyrique, dialoguiste de doublage
description: Les auteurs et compositeurs dœuvres musicales et les dialoguistes de doublage cotisent au RACL.
formule: profession = 'RACL'
artiste-auteur . cotisations . IRCEC . régime RACL:
question: Cotisez-vous au RACL ?
par défaut: non
@ -247,9 +247,9 @@ artiste-auteur . cotisations . IRCEC . cotisation RACD:
formule:
produit:
assiette: assiette
plafond:
plafond:
nom: plafond
valeur: 496250 €/an
valeur: 496250 €/an
taux: 8%
arrondi: oui
@ -262,10 +262,10 @@ artiste-auteur . cotisations . IRCEC . cotisation RACL:
- taux: 0%
plafond: 2739 €/an
- taux: 6.5%
plafond:
plafond:
nom: plafond
valeur: 376665 €/an
- taux:
- taux:
nom: cotisation de solidarité
valeur: 1.5%
arrondi: oui

View File

@ -41,7 +41,7 @@ plafond journalier sécurité sociale:
Article D242-17 du code de la sécurité sociale: https://www.legifrance.gouv.fr/affichCodeArticle.do?cidTexte=LEGITEXT000006073189&idArticle=LEGIARTI000006736124
SMIC horaire:
formule:
formule:
variations:
- si: établissement . localisation . département = 'Mayotte'
alors: 7.74 €/heure

View File

@ -29,11 +29,11 @@ contrat salarié . convention collective . BTP . catégorie . ouvrier . prévoya
assiette: rémunération . brut de base
plafond: 3 * plafond sécurité sociale
composantes:
- attributs:
- attributs:
nom: employeur
remplace: prévoyance . employeur
taux: 1.72%
- attributs:
- attributs:
nom: salarié
remplace: prévoyance . salarié
taux: 0.87%
@ -60,11 +60,11 @@ contrat salarié . convention collective . BTP . catégorie . etam . prévoyance
assiette: rémunération . brut de base
plafond: 3 * plafond sécurité sociale
composantes:
- attributs:
- attributs:
nom: employeur
remplace: prévoyance . employeur
taux: 1.25%
- attributs:
- attributs:
nom: salarié
remplace: prévoyance . salarié
taux: 0.60%
@ -77,7 +77,6 @@ contrat salarié . convention collective . BTP . catégorie . cadre:
- règle: statut cadre
par: oui
contrat salarié . convention collective . BTP . catégorie . cadre . prévoyance complémentaire:
barème:
assiette: rémunération . brut de base
@ -104,7 +103,6 @@ contrat salarié . convention collective . BTP . catégorie . cadre . prévoyanc
- taux: 50% * 3.60%
plafond: 8
contrat salarié . convention collective . BTP . cotisations conventionnelles:
remplace: cotisations . patronales . conventionnelles
formule:

View File

@ -27,11 +27,11 @@ contrat salarié . convention collective . HCR . prévoyance conventionnelle:
assiette: rémunération . brut de base
plafond: plafond sécurité sociale
composantes:
- attributs:
- attributs:
nom: employeur
remplace: prévoyance . employeur
taux: 0.40%
- attributs:
- attributs:
nom: salarié
remplace: prévoyance . salarié
taux: 0.40%

View File

@ -12,16 +12,16 @@ dirigeant:
dirigeant . rémunération: oui
dirigeant . rémunération . totale:
question: Quel montant total pensez-vous dégager pour votre rémunération ?
description: |
description: |
C'est ce que l'entreprise dépense en tout pour la rémunération du dirigeant. Cette rémunération "super-brute" inclut toutes les cotisations sociales à payer. On peut aussi considérer que c'est la valeur monétaire du travail du dirigeant.
titre: Rémunération totale
titre: Rémunération totale
unité: €/an
résumé: Incluant les cotisations et contributions
variations:
variations:
- si: assimilé salarié
alors: contrat salarié . rémunération . total
- si: entreprise . imposition . IS
alors:
alors:
somme:
- nette après impôt
- impôt
@ -40,7 +40,7 @@ dirigeant . rémunération . nette:
dirigeant . rémunération . cotisations:
variations:
- si: assimilé salarié
- si: assimilé salarié
alors: contrat salarié . cotisations
- si: indépendant
alors: indépendant . cotisations et contributions
@ -50,13 +50,13 @@ dirigeant . rémunération . cotisations:
dirigeant . rémunération . imposable:
titre: revenu imposable
variations:
- si: assimilé salarié
- si: assimilé salarié
alors: contrat salarié . rémunération . net imposable
- si: indépendant
alors: indépendant . revenu professionnel
- si: auto-entrepreneur
alors: auto-entrepreneur . impôt . revenu imposable
dirigeant . rémunération . impôt:
titre: impôt sur le revenu
somme:
@ -72,11 +72,11 @@ dirigeant . rémunération . nette après impôt:
arrondi: oui
question: Quel est le revenu net après impôt souhaité ?
description: >-
Le revenu net après déduction de l'impôt
Le revenu net après déduction de l'impôt
sur le revenu et des cotisations sociales.
valeur: rémunération . nette - impôt
résumé: Ce que vous rapporte cette activité
dirigeant . assimilé salarié:
description: |
Certains dirigeants d'entreprise (c'est notamment le cas pour les SASU) sont considérés par la sécurité sociale comme assimilés aux salariés. Ils sont alors au régime général de la sécurité sociale, avec quelques contraintes cependant. Par exemple, ils ne cotisent pas au chômage, et n'y ont donc pas droit.
@ -86,7 +86,7 @@ dirigeant . assimilé salarié:
par: "'CDI'"
- règle: contrat salarié . statut cadre
par: oui
- règle: entreprise . imposition
- règle: entreprise . imposition
par: "'IS'"
rend non applicable:
- contrat salarié . convention collective
@ -113,7 +113,7 @@ dirigeant . assimilé salarié:
références:
Le régime des dirigeants: https://www.urssaf.fr/portail/home/employeur/creer/choisir-une-forme-juridique/le-statut-du-dirigeant/les-dirigeants-rattaches-au-regi.html
note: Nous ne gérons pas le cas des SAS(U) à l'IR pour l'instant
dirigeant . assimilé salarié . réduction ACRE:
applicable si: entreprise . ACRE
formule:
@ -136,7 +136,7 @@ dirigeant . assimilé salarié . réduction ACRE . taux:
taux: 100%
- plafond: 100%
taux: 0%
dirigeant . assimilé salarié . réduction ACRE . notification taux annuel:
formule: oui
type: notification
@ -278,7 +278,6 @@ dirigeant . auto-entrepreneur . cotisations et contributions . contribution form
- sinon: 0.1%
dirigeant . auto-entrepreneur . cotisations et contributions . cotisations:
description: |
Les cotisations sociales donnent à l'auto-entrepreneur accès à une
protection sociale minimale : une retraite, des soins de santé, des
@ -304,7 +303,6 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations:
economie.gouv.fr: https://www.economie.gouv.fr/entreprises/micro-entreprise-auto-entreprise-charges-sociales
actualité urssaf.fr (2019): https://www.autoentrepreneur.urssaf.fr/portail/accueil/sinformer-sur-le-statut/toutes-les-actualites/nouveautes-2019--ce-qui-change-e.html
dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE:
titre: taux ACRE auto-entrepreneur
applicable si: entreprise . ACRE
@ -342,10 +340,10 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . tau
plafond: 2 ans
- montant: 90%
plafond: 3 ans
- sinon:
- sinon:
applicable si: entreprise . durée d'activité < 1 an
valeur: 50%
références:
FAQ Urssaf depuis 04/2020: https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html#jai-cree-mon-auto-entreprise-en
FAQ Urssaf avant 04/2020: https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html#quest-ce-qui-change-pour-moi-si
@ -354,9 +352,9 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . tau
dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE . prestation de service:
remplace: taux prestation de service
titre: taux prestation de service avec ACRE
variations:
- si:
toutes ces conditions:
variations:
- si:
toutes ces conditions:
- entreprise . activité . libérale réglementée
- entreprise . date de création >= 01/04/2020
alors: 12.10%
@ -391,9 +389,9 @@ dirigeant . auto-entrepreneur . impôt . revenu imposable:
taux: 50%
- assiette: entreprise . chiffre d'affaires . service BNC
taux: 34%
plancher:
variations:
- si: entreprise . activité . mixte
plancher:
variations:
- si: entreprise . activité . mixte
alors: 610 €/an
- sinon: 305 €/an
@ -440,13 +438,13 @@ dirigeant . auto-entrepreneur . net après impôt:
arrondi: oui
question: Quel est le revenu net après impôt souhaité ?
description: >-
Le revenu net de l'auto-entrepreneur après déduction de l'impôt
Le revenu net de l'auto-entrepreneur après déduction de l'impôt
sur le revenu et des cotisations sociales.
**Attention :** Pour bien évaluer la rentabilité de l'entreprise, il ne faut pas
oublier de retrancher à ce montant les dépenses engagées dans le cadre de
l'activité. Cela peut inclure par exemple :
l'activité. Cela peut inclure par exemple :
- L'achat des matière premières
@ -454,7 +452,7 @@ dirigeant . auto-entrepreneur . net après impôt:
- L'abonnement à des services payants
- La location d'un local
- La location d'un local
- etc...
valeur: net de cotisations - rémunération . impôt
@ -463,8 +461,8 @@ dirigeant . auto-entrepreneur . chiffre d'affaires:
question: Quel est votre chiffre d'affaires ?
résumé: Montant total des recettes (hors taxe)
remplace: entreprise . chiffre d'affaires
inversion numérique:
avec:
inversion numérique:
avec:
- rémunération . totale
- net après impôt
- net de cotisations
@ -480,19 +478,18 @@ dirigeant . indépendant . revenu professionnel:
résoudre la référence circulaire: oui
variations:
- si: entreprise . imposition = 'IS'
alors:
somme:
alors:
somme:
- rémunération . nette
- cotisations et contributions . non déductibles
- sinon: entreprise . résultat fiscal
dirigeant . indépendant . assiette des cotisations:
unité: €/an
description: Il s'agit de l'assiette des cotisations sociales, nombre forcément positif
valeur:
nom: sans plancher
somme:
somme:
- revenu professionnel
- cotisations facultatives . déductibles
plancher: 0
@ -500,11 +497,11 @@ dirigeant . indépendant . assiette des cotisations:
dirigeant . indépendant . conjoint collaborateur:
question: Avez-vous un conjoint collaborateur ?
description: |
Permet au conjoint du dirigeant d'être couvert par la protection sociale moyennant le paiement de cotisations sociales supplémentaires.
Permet au conjoint du dirigeant d'être couvert par la protection sociale moyennant le paiement de cotisations sociales supplémentaires.
Pour en bénéficier, l'époux(se) ou partenaire de Pacs du dirigeant doit:
- exercer une activité professionnelle régulière et habituelle dans l'entreprise
- faire l'objet d'une mention au RCS pour les commerçants ou au répertoire des métiers (RM) pour les artisans
- ne pas être rémunéré
- exercer une activité professionnelle régulière et habituelle dans l'entreprise
- faire l'objet d'une mention au RCS pour les commerçants ou au répertoire des métiers (RM) pour les artisans
- ne pas être rémunéré
- ne pas être associé de la société.
par défaut: non
références:
@ -513,7 +510,7 @@ dirigeant . indépendant . conjoint collaborateur:
dirigeant . indépendant . cotisations et contributions . non déductibles:
titre: Cotisations et contributions non déductibles fiscalement
somme:
somme:
- CSG et CRDS . non déductible
- cotisations facultatives . non déductibles
@ -551,7 +548,7 @@ dirigeant . indépendant . cotisations et contributions . PSS proratisé:
dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . prorata sur l'année:
description: |
Comme le calcul des cotisations indépendants s'effectue sur l'année entière,
Comme le calcul des cotisations indépendants s'effectue sur l'année entière,
l'exonération est proratisée en fonction de la durée effective de l'ACRE sur l'année courante.
Par exemple, pour une entreprise crée le 1 fevrier 2018, le calcul du prorata pour les
@ -591,8 +588,8 @@ dirigeant . indépendant . conjoint collaborateur . assiette:
dirigeant . indépendant . conjoint collaborateur . assiette . forfaitaire:
titre: assiette forfaitaire
description: |
Le conjoint collaborateur paiera des cotisations équivalentes à un revenu
professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité sociale,
Le conjoint collaborateur paiera des cotisations équivalentes à un revenu
professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité sociale,
à lexception de la cotisation indemnités journalières qui est calculée sur
une assiette équivalente à 40% du PASS.
formule: assiette = 'forfaitaire'
@ -712,7 +709,7 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et
dirigeant . indépendant . conjoint collaborateur . cotisations . indemnités journalières maladie:
produit:
assiette:
assiette:
valeur: 40% * plafond sécurité sociale temps plein
unité: €/an
taux: cotisations et contributions . indemnités journalières maladie . taux
@ -750,7 +747,7 @@ dirigeant . indépendant . cotisations et contributions:
À la différence des cotisations, les contributions ne sont pas réintroduites
pour le calcul de la CSG/CRDS. Elles ne bénéficient pas non plus de la
réduction ACRE.
dirigeant . indépendant . assiette minimale:
non applicable si: situation personnelle . RSA
valeur: oui
@ -761,7 +758,7 @@ dirigeant . indépendant . assiette minimale:
Les cotisations minimales ne s'appliquent pas si vous bénéficiez du RSA ou de la prime dactivité.
références:
cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/
dirigeant . indépendant . assiette minimale . maladie:
titre: assiette minimale maladie
description: |
@ -773,7 +770,6 @@ dirigeant . indépendant . assiette minimale . maladie:
arrondi: oui
références:
cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/
dirigeant . indépendant . assiette minimale . retraite:
titre: assiette minimale retraite
@ -785,8 +781,6 @@ dirigeant . indépendant . assiette minimale . retraite:
arrondi: oui
références:
cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/
dirigeant . indépendant . cotisations et contributions . contributions spéciales:
description: |
@ -829,12 +823,11 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac . rev
valeur: assiette des cotisations
abattement: déduction tabac
dirigeant . indépendant . cotisations facultatives:
question: Avez-vous souscrit à des contrats de prévoyance et / ou de retraite complémentaire privés (contrats Madelin, plans d'épargne retraite) ?
description: |
Il est possible pour l'indépendant de souscrire à des contrats privés pour la complémentaire santé, ou un plan d'épargne retraite.
Les versements à ces contrats sont désigné par l'appellation "cotisations facultative" par l'administration fiscale.
description: |
Il est possible pour l'indépendant de souscrire à des contrats privés pour la complémentaire santé, ou un plan d'épargne retraite.
Les versements à ces contrats sont désigné par l'appellation "cotisations facultative" par l'administration fiscale.
Ils sont déductible d'impôts (dans la limite d'un plafond), mais non déductible pour l'assiette des cotisations et contributions sociales.
par défaut: non
@ -854,7 +847,7 @@ dirigeant . indépendant . cotisations facultatives . déductibles:
somme:
- valeur: contrats madelin . prévoyance
plafond: plafond prévoyance
- somme:
- somme:
- PER
- contrats madelin . retraite
plafond: plafond retraite complémentaire
@ -864,17 +857,15 @@ dirigeant . indépendant . cotisations facultatives . non déductibles:
formule: total - déductibles
dirigeant . indépendant . cotisations facultatives . PER:
description:
Le PER individuel est ouvert à tous. Vous pouvez le souscrire auprès d'un établissement financier ou d'un organisme d'assurance. Ce nouveau plan succède au PERP et au contrat Madelin, qui ne seront plus proposés à partir du 1er octobre 2020. Votre épargne accumulée sur le Perp et le Madelin peut être à votre demande transférée sur le PER individuel. Ce contrat donne droit à des avantages fiscaux et vos droits sont transférables vers les autres PER. Il y a des cas de déblocage anticipé.
titre: Plan d'épargne retraite
description: Le PER individuel est ouvert à tous. Vous pouvez le souscrire auprès d'un établissement financier ou d'un organisme d'assurance. Ce nouveau plan succède au PERP et au contrat Madelin, qui ne seront plus proposés à partir du 1er octobre 2020. Votre épargne accumulée sur le Perp et le Madelin peut être à votre demande transférée sur le PER individuel. Ce contrat donne droit à des avantages fiscaux et vos droits sont transférables vers les autres PER. Il y a des cas de déblocage anticipé.
titre: Plan d'épargne retraite
unité: €/an
question: Quel est le montant des cotisations que vous versez dans le cadre d'un PER (nouveau plan épargne retraite, depuis le 1er octobre 2019) ?
par défaut: 0 €/mois
références:
références:
Fiche service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F34982
Fiche economie.gouv.fr: https://www.economie.gouv.fr/PER-epargne-retraite
dirigeant . indépendant . cotisations facultatives . contrats madelin:
titre: Somme des cotisations à contrats Madelin
somme:
@ -886,7 +877,7 @@ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoy
question: Quel est le montant que vous versez pour vos contrats Madelin de prévoyance complémentaire (santé, perte d'emploi subie) ?
unité: €/an
description: |
Si vous cotisez au titre d'un contrat de prévoyance complémentaire (santé, perte d'emploi subie)
Si vous cotisez au titre d'un contrat de prévoyance complémentaire (santé, perte d'emploi subie)
de type loi Madelin, vous pouvez déduire ces cotisations des bénéfices
imposables que vous déclarez pour votre activité non salariée.
références:
@ -895,7 +886,7 @@ dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoy
Article de loi: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000029042287&cidTexte=LEGITEXT000006069577&dateTexte=20140530&fastReqId=1900907951&nbResultRech=1
par défaut: 50 €/mois
dirigeant . indépendant . cotisations facultatives . plafond prévoyance :
dirigeant . indépendant . cotisations facultatives . plafond prévoyance:
unité: €/an
formule:
somme:
@ -956,35 +947,35 @@ dirigeant . indépendant . cotisations et contributions . début activité:
années sont calculées sur une **base forfaitaire**.
Ces cotisations seront ajustées et régularisées en fonction de vos revenus réels de
Ces cotisations seront ajustées et régularisées en fonction de vos revenus réels de
lannée dexercice. Si votre revenu est supérieur à la base forfaitaire prise en compte
pour le calcul des cotisations provisionnelles alors vous serez redevable dun **complément
de cotisations**.
Ce simulateur calcule les cotisations dites définitives sur la base des revenus réels de votre
activité. Il vous permet donc de pouvoir anticiper le montant de cette régularisation et de
activité. Il vous permet donc de pouvoir anticiper le montant de cette régularisation et de
**planifier votre trésorerie** en conséquence.
note:
La base forfaitaire sélève à **19 % du plafond annuel de la Sécurité sociale** au titre de
la première et de la deuxième année dactivité (à lexception de la cotisation Maladie
et indemnités journalières pour lesquelles lassiette forfaitaire est égale à 40% du
la première et de la deuxième année dactivité (à lexception de la cotisation Maladie
et indemnités journalières pour lesquelles lassiette forfaitaire est égale à 40% du
plafond annuel de la Sécurité sociale).
applicable si: entreprise . date de création >= 01/01/2020
unité: €/an
recalcul:
recalcul:
règle: cotisations et contributions
avec:
maladie . taux progressif . assiette: 40% * plafond sécurité sociale temps plein
avec:
maladie . taux progressif . assiette: 40% * plafond sécurité sociale temps plein
assiette des cotisations: assiette forfaitaire
CSG et CRDS . assiette: assiette forfaitaire
CSG et CRDS . assiette: assiette forfaitaire
dirigeant . indépendant . cotisations facultatives: non
références:
Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/lajustement-et-la-regularisation.html
dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire:
produit:
produit:
assiette: PSS proratisé
taux: 19%
unité: €/an
@ -1002,8 +993,8 @@ dirigeant . indépendant . cotisations et contributions . régularisation:
les cotisations et contributions sont régularisées.
Ce simulateur calcule les cotisations **après régularisation**.
Il vous permet donc d'anticiper le montant de cette régularisation et de planifier votre
Ce simulateur calcule les cotisations **après régularisation**.
Il vous permet donc d'anticiper le montant de cette régularisation et de planifier votre
trésorerie en conséquence.
@ -1030,7 +1021,7 @@ dirigeant . indépendant . cotisations et contributions . indemnités journaliè
valeur: assiette des cotisations
plancher: assiette minimale . maladie
plafond: 5 * plafond sécurité sociale temps plein
taux:
taux:
nom: taux
valeur: 0.85%
arrondi: oui
@ -1045,7 +1036,7 @@ dirigeant . indépendant . cotisations et contributions . maladie:
plancher: assiette minimale . maladie
multiplicateur: plafond sécurité sociale temps plein
tranches:
- taux:
- taux:
valeur: taux progressif
arrondi: 2 décimales
plafond: 110%
@ -1063,18 +1054,17 @@ dirigeant . indépendant . cotisations et contributions . maladie:
Le terme "lorsque" laisse entendre qu'en cas de dépassement du seuil 5xPSS, tout le revenu est soumis à 6.5%. Il semblerait qu'une interprétation inverse soit à privilégier : seule la part supérieure à ce seuil est soumise à ce taux, et c'est cette implémentation que nous avons retenue.
dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire:
description: |
dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire:
description: |
La réduction supplémentaire du taux maladie pour les revenu inférieurs à 40% du plafond de la sécurité sociale
non applicable si: situation personnelle . RSA
remplace:
règle: taux progressif
remplace:
règle: taux progressif
par: taux progressif - réduction supplémentaire
taux progressif:
assiette: assiette
multiplicateur: plafond sécurité sociale temps plein
tranches:
tranches:
- plafond: 0%
taux: 1.35%
- plafond: 40%
@ -1085,7 +1075,7 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux progres
dirigeant . indépendant . cotisations et contributions . maladie . taux progressif:
taux progressif:
assiette:
assiette:
nom: assiette
valeur: assiette des cotisations
multiplicateur: plafond sécurité sociale temps plein
@ -1098,10 +1088,9 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux progres
Taux de cotisations: https://www.secu-independants.fr/cotisations/calcul-cotisations/taux-de-cotisations/
décret formule de calcul: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000036342439&categorieLien=id
dirigeant . indépendant . cotisations et contributions . retraite de base:
barème:
assiette:
assiette:
valeur: assiette des cotisations
plancher: assiette minimale . retraite
multiplicateur: plafond sécurité sociale temps plein
@ -1119,7 +1108,7 @@ dirigeant . indépendant . cotisations et contributions . retraite complémentai
assiette: assiette des cotisations
tranches:
- taux: 7%
plafond:
plafond:
nom: plafond
acronyme: PRCI
titre: plafond retraite complémentaire des indépendants
@ -1128,11 +1117,10 @@ dirigeant . indépendant . cotisations et contributions . retraite complémentai
plafond: 4 * plafond sécurité sociale temps plein
arrondi: oui
dirigeant . indépendant . cotisations et contributions . invalidité et décès:
formule:
produit:
assiette:
assiette:
valeur: assiette des cotisations
plancher: assiette minimale . retraite
plafond: plafond sécurité sociale temps plein
@ -1141,7 +1129,6 @@ dirigeant . indépendant . cotisations et contributions . invalidité et décès
références:
Cotisation minimale: https://www.secu-independants.fr/cotisations/calcul-des-cotisations/cotisations-minimales/
dirigeant . indépendant . cotisations et contributions . CSG et CRDS:
formule:
produit:
@ -1151,7 +1138,7 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS:
nom: non déductible
arrondi: oui
composantes:
- taux:
- taux:
nom: taux
valeur: 2.9%
- attributs:
@ -1162,7 +1149,7 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS:
nom: déductible
arrondi: oui
composantes:
- taux:
- taux:
nom: taux
valeur: 6.8%
- attributs:
@ -1177,8 +1164,8 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS:
dirigeant . indépendant . revenus étrangers:
description: |
Les revenus étrangers sont des revenus déclarés par les travailleurs indépendants pour des revenus perçus au titre de lexercice dune activité non salariée dans un autre Etat de lUE, EEE ou en Suisse à létranger.
Ces revenus ne sont soumis quaux cotisations et sont intégrés à lassiette sociale. Par contre, ces revenus sont identifiés spécifiquement afin de les déduire de lassiette de la CSG/CRDS.
Les revenus étrangers sont des revenus déclarés par les travailleurs indépendants pour des revenus perçus au titre de lexercice dune activité non salariée dans un autre Etat de lUE, EEE ou en Suisse à létranger.
Ces revenus ne sont soumis quaux cotisations et sont intégrés à lassiette sociale. Par contre, ces revenus sont identifiés spécifiquement afin de les déduire de lassiette de la CSG/CRDS.
Pour savoir si ces revenus sont soumis à l'impôt sur le revenu, référez-vous à la notice explicative sur le site [impots.gouv.fr](https://www.impots.gouv.fr/portail/international-particulier/imposition-des-revenus-de-source-etrangere)
question: Avez-vous perçu des revenus à l'étranger dans le cadre de votre activité ?
@ -1332,14 +1319,14 @@ dirigeant . indépendant . IJSS:
description: >-
En cas de maladie, maternité, ou accident, y compris suite à un arrêt de travail ou un arrêt
pour garde denfant en lien avec lépidémie du Covid-19, le régime général de Sécurité
sociale assure le versement de prestations « en espèces ».
sociale assure le versement de prestations « en espèces ».
Ce sont les indemnités journalières de Sécurité sociale (IJSS).
Les indemnités complémentaires aux indemnités journalières de la Sécurité
sociale versées dans le cadre dun contrat de prévoyance ne constituent pas
des revenus de remplacement.
Note: Les prestations dinvalidité versées par les régimes
dinvalidité-décès ne sont pas concernées
@ -1368,7 +1355,7 @@ dirigeant . indépendant . IJSS . imposable:
description: >-
Indiquez uniquement les revenus de remplacement imposables perçus, donc tous
les revenus de remplacement perçus **sauf les indemnités journalières en
lien avec une Affection de Longue Durée (ALD)**.
lien avec une Affection de Longue Durée (ALD)**.
Ces revenus seront déduits de votre assiette des contributions, afin de ne

View File

@ -63,7 +63,7 @@ aide déclaration revenu indépendant 2020 . cotisations payées . total charges
unité: €/an
question: Quel est le montant total des cotisations et contributions sociales payées pendant l'exercice ?
description: |
Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre :
Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre :
1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html)
2. Allez dans l'onglet "Document"
@ -75,7 +75,7 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductib
remplace: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible
unité: €/an
description: |
Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre :
Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre :
1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html)
2. Allez dans l'onglet "Document"
@ -87,7 +87,7 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CSG non dédu
question: Quel est le montant total de CSG non déductible payé cette année ?
unité: €/an
description: |
Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre :
Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre :
1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html)
2. Allez dans l'onglet "Document"
@ -99,7 +99,7 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CRDS:
question: Quel est le montant total de CRDS payé cette année ?
unité: €/an
description: |
Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre :
Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre :
1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html)
2. Allez dans l'onglet "Document"
@ -856,7 +856,7 @@ aide déclaration revenu indépendant 2020 . résultat simple . cotisations obli
description: |
À reporter dans :
- **la case DSCA/DSCB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042)
- **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD
- **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD
- **régime réel normal :** la rubrique A5 du formulaire 2053-SD
- **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD
- **régime micro fiscal :** pas de liasse professionnelle fiscale à souscrire
@ -891,7 +891,7 @@ aide déclaration revenu indépendant 2020 . résultat simple . total charges so
- CFP
description: |
À reporter dans :
- **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD
- **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD
- **régime réel normal :** la rubrique FZ du formulaire 2052-SD
- **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD
- **régime micro fiscal :** pas de liasse professionnelle fiscale à souscrire

View File

@ -8,7 +8,7 @@ entreprise . date de création:
par défaut: 01/01/2020
description: |
La date de début d'activité (ou date de création) est fixée lors de la
déclaration de votre entreprise.
déclaration de votre entreprise.
Vous pouvez [renseigner votre entreprise](/gérer), pour préremplir
automatiquement cette information.
@ -41,12 +41,12 @@ entreprise . durée d'activité:
entreprise . durée d'activité . en fin d'année:
titre: durée d'activité à la fin de l'année
formule:
somme:
somme:
- durée:
depuis: date de création
jusqu'à: période . fin d'année
- 1 jour # Le mécanisme durée n'inclue pas le dernier jour
entreprise . durée d'activité . en début d'année:
titre: durée d'activité au début de l'année
formule:
@ -56,7 +56,7 @@ entreprise . durée d'activité . en début d'année:
entreprise . chiffre d'affaires:
question: Quel est votre chiffre d'affaires envisagé ?
résumé: Montant total des recettes brutes (hors taxe)
unité: €/an
somme:
@ -65,35 +65,34 @@ entreprise . chiffre d'affaires:
- dirigeant . rémunération . cotisations
- charges
- applicable si: entreprise . imposition . IS
somme:
- imposition . IS . résultat net
- imposition . IS . impôt sur les sociétés
somme:
- imposition . IS . résultat net
- imposition . IS . impôt sur les sociétés
plancher: 0€/an
arrondi: oui
identifiant court: CA
entreprise . chiffre d'affaires . vente restauration hébergement:
titre: Vente de biens, restauration, hébergement (BIC)
résumé: Chiffre d'affaires hors taxe
question: Quel est le chiffre d'affaires issu de la vente de biens, restauration ou hébergement ?
unité: €/an
variations:
variations:
- si: activité . mixte
alors:
produit:
assiette: chiffre d'affaires
produit:
assiette: chiffre d'affaires
taux: activité . mixte . proportions . vente restauration hébergement
- sinon:
- sinon:
applicable si: activité . service ou vente = 'vente'
valeur: chiffre d'affaires
arrondi: oui
plancher: 0€/an
description: |
### Vente de biens
### Vente de biens
Il sagit du chiffre d'affaires de toutes les opérations comportant
transfert de propriété d'un bien corporel, c'est-à-dire un bien ayant une
existence matérielle.
existence matérielle.
### Restauration et hébergement
Il sagit du chiffre d'affaires de toutes les opérations de restauration
@ -106,7 +105,6 @@ entreprise . chiffre d'affaires . vente restauration hébergement:
service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32919
définition vente de bien (impots.gouv): https://www.impots.gouv.fr/portail/professionnel/achatvente-de-biens
entreprise . chiffre d'affaires . service BIC:
unité: €/an
plancher: 0€/an
@ -123,19 +121,17 @@ entreprise . chiffre d'affaires . service BIC:
services qui nécessite plus qu'un ordinateur pour être effectuées.
**Exemples** : transports, service à la personne, réparation etc.
variations:
variations:
- si: activité . mixte
alors:
produit:
assiette: chiffre d'affaires
produit:
assiette: chiffre d'affaires
taux: activité . mixte . proportions . service BIC
- sinon:
- sinon:
applicable si: activité . service ou vente = 'service'
valeur: chiffre d'affaires
références:
service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32919
entreprise . chiffre d'affaires . service BNC:
titre: Autres prestations de service et activités libérales (BNC)
@ -145,22 +141,22 @@ entreprise . chiffre d'affaires . service BNC:
plancher: 0€/an
description: |
Ce sont toutes les opérations dont l'activité intellectuelle tient
un rôle essentiel.
un rôle essentiel.
**Exemples** : conseil, accompagnement, traduction, développement,
formation, enseignement, sportif
Les revenus tirés de ce chiffre d'affaires sont imposable au régime BNC (bénéfices non commerciaux)
variations:
variations:
- si: activité . mixte
alors:
produit:
assiette: chiffre d'affaires
produit:
assiette: chiffre d'affaires
taux: activité . mixte . proportions . service BNC
- sinon:
- sinon:
applicable si: activité = 'libérale'
valeur: chiffre d'affaires
références:
liste des activités libérales: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/liste-professions-liberales
@ -179,9 +175,9 @@ entreprise . chiffre d'affaires . BIC:
Le chiffre d'affaires correspondant au revenus imposable au titre des bénéfice industriels et commerciaux (BIC ou micro-BIC).
unité: €/an
somme:
- service BIC
- service BIC
- vente restauration hébergement
entreprise . chiffre d'affaires . franchise de TVA: oui
entreprise . chiffre d'affaires . franchise de TVA . seuil vente:
@ -226,11 +222,10 @@ entreprise . chiffre d'affaires . franchise de TVA . dépassement:
entreprise . résultat fiscal:
unité: €/an
somme:
somme:
- chiffre d'affaires
- (- charges)
- (- charges . dirigeant)
entreprise . imposition:
question: Comment l'entreprise est-elle imposée ?
@ -255,8 +250,8 @@ entreprise . imposition . IR . micro-fiscal:
question: Avez-vous opté pour le régime micro-fiscal ?
description: |
Avec le régime micro fiscal, les charges déductibles sont estimées forfaitairement,en fonction dun pourcentage du chiffre daffaires. Ce pourcentage dépend du type dactivité : 71% pour les activités de vente, restauration et hébergement (location de meublé de tourisme classé et chambre dhôte), 50% pour les prestations de service commerciales ou artisanales, 34% pour les activités libérales.
Avec le régime micro fiscal, les charges déductibles sont estimées forfaitairement,en fonction dun pourcentage du chiffre daffaires. Ce pourcentage dépend du type dactivité : 71% pour les activités de vente, restauration et hébergement (location de meublé de tourisme classé et chambre dhôte), 50% pour les prestations de service commerciales ou artisanales, 34% pour les activités libérales.
Cette option permet de simplifier votre comptabilité et peut être avantageuse en termes de revenu imposable et soumis à cotisations et contributions sociales dans le cas où vos charges de fonctionnement sont faibles.
par défaut: non
@ -268,7 +263,7 @@ entreprise . imposition . IR . micro-fiscal . revenu abattu:
Le micro-entrepreneur est dispensé d'établir une déclaration professionnelle de bénéfices au titre des BNC ou BIC.
Il lui suffit de porter dans la déclaration complémentaire de revenu (n°2042-C Pro) le montant annuel du chiffre d'affaires brut (BIC) ou des recettes (BNC).
somme:
somme:
- entreprise . chiffre d'affaires . vente restauration hébergement
- entreprise . chiffre d'affaires . service BIC
- entreprise . chiffre d'affaires . service BNC
@ -281,39 +276,38 @@ entreprise . imposition . IR . micro-fiscal . revenu abattu:
taux: 50%
- assiette: entreprise . chiffre d'affaires . service BNC
taux: 34%
plancher:
variations:
- si: entreprise . activité . mixte
plancher:
variations:
- si: entreprise . activité . mixte
alors: 610 €/an
- sinon: 305 €/an
entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés:
type: notification
sévérité: avertissement
formule: chiffre d'affaires . seuil micro dépassé
description: Le seuil annuel de chiffre d'affaires pour le régime micro-fiscal est dépassé. [En savoir plus](/documentation/entreprise/chiffre-d'affaires/seuil-micro-dépassé)
entreprise . chiffre d'affaires . seuil micro dépassé:
applicable si: imposition . IR
description: |
Le statut de micro-entreprise s'applique tant que le chiffre d'affaires annuel (effectivement encaissé au cours de l'année civile) ne dépasse pas les seuils du régime fiscal de la micro-entreprise.
Le statut de micro-entreprise s'applique tant que le chiffre d'affaires annuel (effectivement encaissé au cours de l'année civile) ne dépasse pas les seuils du régime fiscal de la micro-entreprise.
En cas de dépassement **sur deux années consécutives**, l'entreprise bascule automatiquement dans le régime de [l'entreprise individuelle](/simulateurs/indépendant).
À la fin de la première année d'activité, le CA est proratisé par rapport à la durée d'activité.
À la fin de la première année d'activité, le CA est proratisé par rapport à la durée d'activité.
Exemple :
> Un contribuable crée une entreprise le 1er août et encaisse des recettes HT de `50 000 €` au cours des cinq mois d'activité de sa première année civile d'exploitation.
> Un contribuable crée une entreprise le 1er août et encaisse des recettes HT de `50 000 €` au cours des cinq mois d'activité de sa première année civile d'exploitation.
> Les recettes de cette première année civile sont ajustées *prorata temporis* pour les comparer au plafond :
>
>
> `50 000€ x (365/153) = 119 280 €`
Les charges ne sont pas déductibles pour le calcul du plafond (comme pour le calcul des cotisations)
### Multi-activité
### Multi-activité
Lorsqu'un entrepreneur exerce 2 activités au sein de sa micro-entreprise, le
seuil de chiffre daffaires à respecter nest pas pour autant doublé. En
@ -335,7 +329,6 @@ entreprise . chiffre d'affaires . seuil micro dépassé:
- entreprise . chiffre d'affaires > 176200 €/an
- entreprise . chiffre d'affaires . service > 72600 €/an
entreprise . imposition . IR . information sur le report de déficit:
non applicable si: micro-fiscal
type: notification
@ -346,7 +339,7 @@ entreprise . imposition . IR . information sur le report de déficit:
[Voir les règles fiscales détaillées](https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301)
références:
bofip: https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301
bofip: https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301
entreprise . exercice: oui
entreprise . exercice . début:
@ -392,7 +385,6 @@ entreprise . imposition . IS:
valeur: imposition = 'IS'
titre: Impôt sur les sociétés
entreprise . imposition . IS . résultat imposable:
titre: Résultat de l'exercice
résumé: Imposable à l'impôt sur les sociétés
@ -405,7 +397,6 @@ entreprise . imposition . IS . information sur le report de déficit:
description: |
Les déficits subits au cours d'un exercice peuvent être reportés sur les exercices suivants (report en avant), ou sur le seul exercice précédent (report en arrière).
entreprise . imposition . IS . résultat net:
résumé: Après déduction des charges et de l'impôt sur les société
somme:
@ -414,7 +405,7 @@ entreprise . imposition . IS . résultat net:
- (- dirigeant . rémunération . totale)
- (- impôt sur les sociétés)
par défaut: 0
entreprise . imposition . IS . impôt sur les sociétés:
unité: €/an
formule:
@ -535,16 +526,14 @@ entreprise . charges:
Charges déductibles ou non du résultat fiscal d'une entreprise: https://www.service-public.fr/professionnels-entreprises/vosdroits/F31973
par défaut: 0 €/an
entreprise . charges . dirigeant:
titre: Charges déductibles dirigeant
description: Les montants liés à la rémunération du dirigeant qui sont déductibles d'impôt.
variations:
- si: imposition . IS
variations:
- si: imposition . IS
alors: dirigeant . rémunération . totale
# Note : le cas de dirigeant AS à l'IR n'est pas géré
# - si: dirigeant . assimilé salarié
# - si: dirigeant . assimilé salarié
# alors: 0€/an
- sinon: # TNS dans entreprise à l'IR
valeur: dirigeant . indépendant . cotisations et contributions
@ -554,7 +543,7 @@ entreprise . ACRE:
description: >-
L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une
exonération partielle de charges sociales, dite exonération de début
d'activité pendant 12 mois.
d'activité pendant 12 mois.
Elle est **automatique** pour les **sociétés et les entreprises individuelles**
@ -563,7 +552,7 @@ entreprise . ACRE:
Pour les **auto-entrepreneurs** en revanche, elle doit être demandée et est réservée aux
bénéficiaires suivants:
bénéficiaires suivants:
- Les demandeurs d'emplois (indemnisés ou non indemnisés mais ayant au moins 6 mois dinscription à Pôle Emploi au cours des 18 derniers mois).
@ -684,7 +673,7 @@ entreprise . exonérée de TVA:
question: L'entreprise est-elle exonérée de TVA (hors franchise de base) ?
par défaut: non
description: |
Certains types d'entreprises ne sont pas assujetties à la TVA.
Certains types d'entreprises ne sont pas assujetties à la TVA.
Ces dernières payent la taxe sur les salaires en contrepartie.
C'est le cas par exemple des établissements bancaires, financiers ou d'assurance.
@ -705,7 +694,8 @@ entreprise . taxe sur les salaires:
une de ces conditions:
- association non lucrative
- entreprise . exonérée de TVA
description: Lorsque le montant de la taxe sur les salaires est inférieur à 1200 €/an, il
description:
Lorsque le montant de la taxe sur les salaires est inférieur à 1200 €/an, il
n'y a pas besoin de faire de déclaration et la taxe n'est pas recouvré.
Entre 1200 €/an et 2400 €/an une décote s'applique.
formule:
@ -807,7 +797,7 @@ entreprise . activité . mixte:
par défaut: non
description: |
Il est possible d'avoir plusieurs activités avec des types de revenus
différents pour une même entreprise.
différents pour une même entreprise.
Par exemple, une entreprise de plomberie qui facture l'achat et la pose d'un
robinet a une partie de son chiffre d'affaires en vente de materiel (le robinet)
@ -826,7 +816,7 @@ entreprise . activité . mixte . proportions:
description: Part des différentes activités dans le chiffre d'affaires
titre: proportion activité
unité: '%'
somme:
somme:
- nom: service BIC
variations:
- si: activité = 'libérale'
@ -843,7 +833,6 @@ entreprise . activité . mixte . proportions:
alors: 1 / 3
- sinon: 50%
note: Il appartient à l'utilisateur de bien vérifier que la somme des trois pourcentages renseignés vaut 100%.
entreprise . activité . libérale réglementée:
question: Est-ce une activité libérale réglementée ?
@ -901,7 +890,7 @@ entreprise . activité . débit de tabac:
chemin: nom
établissement . taux du versement transport:
unité: "%"
unité: '%'
formule:
synchronisation:
data: localisation

View File

@ -32,7 +32,7 @@ impôt . méthode de calcul:
# applicable si: revenu imposable > 0
# bizarrement, cette condition ne semble pas marcher, on se résout donc à utiliser une version plus "hacky" et moins proche de la loi. Elle posera problème le jour où l'on aura a calculer l'impot avec plusieurs sources de revenu
non applicable si: dirigeant . auto-entrepreneur . impôt . versement libératoire
par défaut:
par défaut:
nom: par défaut
valeur: "'barème standard'"
formule:
@ -70,11 +70,11 @@ impôt . méthode de calcul . prélèvement à la source:
impôt . revenu imposable:
description: |
C'est le revenu à prendre en compte pour calculer l'impôt avec un taux moyen d'imposition (neutre ou personnalisé).
variations:
variations:
- si: dirigeant
alors: dirigeant . rémunération . imposable
- sinon:
valeur: contrat salarié . rémunération . net imposable
- sinon:
valeur: contrat salarié . rémunération . net imposable
abattement: abattement contrat court
impôt . revenu imposable . abattement contrat court:
@ -254,7 +254,6 @@ impôt . taux personnalisé:
- votre espace personnel [impots.gouv.fr](https://impots.gouv.fr)
unité: '%'
# TODO: "foyer fiscal" should be in its own top level namespace, but we put it
# in the "impôt" namespace to have a better questions ordering
impôt . foyer fiscal:
@ -339,18 +338,17 @@ impôt . foyer fiscal . nombre de parts . majoration personne veuve avec enfant:
impôt . foyer fiscal . taux effectif:
unité: '%'
variations:
variations:
- si: impôt à payer = 0
alors: 0%
- sinon: impôt à payer / revenu imposable
alors: 0%
- sinon: impôt à payer / revenu imposable
impôt . foyer fiscal . revenu imposable:
formule:
somme:
- revenu d'activité abattu
- applicable si:
toutes ces conditions:
- applicable si:
toutes ces conditions:
- dirigeant . rémunération . imposable
- entreprise . imposition . IR
valeur: dirigeant . rémunération . imposable
@ -366,7 +364,7 @@ impôt . foyer fiscal . revenu imposable . revenu d'activité abattu:
alors: contrat salarié . rémunération . net imposable
- si: entreprise . imposition = 'IS'
alors: dirigeant . rémunération . imposable
abattement:
abattement:
valeur: 10% * assiette
# A VÉRIFIER: calculé à la main en revalorisant le taux 2020
# HISTORIQUE 2020: 12627€
@ -524,5 +522,5 @@ impôt . domiciliation étranger non implémentée:
formule: situation personnelle . domiciliation fiscale à l'étranger
type: notification
niveau: avertissement
description: |
description: |
La retenue à la source pour les non-résident n'est pas encore implémentée. Pour en savoir plus, se référer à la [documentation fiscale](https://www.impots.gouv.fr/portail/international-particulier/je-suis-non-resident-dois-je-declarer-des-revenus-et-payer-des-impots-en)

View File

@ -21,7 +21,7 @@ dirigeant . indépendant . PL . métier:
dirigeant . indépendant . PL . métier . rattaché CIPAV:
titre: Autre métier rattaché à la CIPAV
description: |
Vous exercez un métier réglementé rattaché à la CIPAV. La liste de ces métiers est :
Vous exercez un métier réglementé rattaché à la CIPAV. La liste de ces métiers est :
- Architecte (architecte, architecte dintérieur, économiste de la construction, maître dœuvre, géomètre expert)
- Guide-montage (moniteur de ski, guide de haute montagne, accompagnateur de moyenne montagne)
@ -113,7 +113,7 @@ dirigeant . indépendant . PL . option régime général:
Les personnes exerçant déjà une profession libérale non réglementée avant
2019 peuvent opter entre 2019 et 2023 pour la Sécurité sociale pour les
indépendants, à condition dêtre à jour dans le paiement de toutes leurs
cotisations à la CIPAV.
cotisations à la CIPAV.
Cette option leur permettra de bénéficier des mêmes droits que les artisans
et commerçants (indemnités journalières, retraite, invalidité, etc.).
@ -311,11 +311,11 @@ dirigeant . indépendant . PL . retraite CNAVPL:
ont les mêmes taux de cotisations pour leur retraite de base.
La caisse nationale d'assurance vieillesse des professions
libérales est l'organisme qui fédère les différentes caisses
libérales est l'organisme qui fédère les différentes caisses
existantes (CIPAV, CARPIMKO, CARCDSF, CAVEC etc..)
produit:
assiette:
assiette:
valeur: assiette des cotisations
plancher: assiette minimale . retraite
composantes:
@ -370,8 +370,8 @@ dirigeant . indépendant . PL . PAMC . proportion recette activité non conventi
30%: 30%
description: |
Les recettes non conventionnées sont toutes celles qui ne rentrent pas dans
les catégories suivantes :
les catégories suivantes :
- Honoraires tirés des actes remboursables (y compris les
dépassements dhonoraires et les frais de déplacement figurant sur le relevé
SNIR)
@ -471,30 +471,31 @@ dirigeant . indépendant . PL . PAMC . revenus activité conventionnée:
plancher: 0%
dirigeant . indépendant . PL . PAMC . assiette participation CPAM:
description: Aussi appelé revenu conventionnel, il s'agit du revenu des honoraires nets
description:
Aussi appelé revenu conventionnel, il s'agit du revenu des honoraires nets
de dépassement.
formule: revenus activité conventionnée / (100% + dépassement d'honoraire moyen)
note: |
La formule référencée dans les textes Urssaf est la suivante :
> (revenu de lactivité conventionnée) x (total des honoraires - total des dépassements dhonoraires) / montant total des honoraires.
La formule référencée dans les textes Urssaf est la suivante :
> (revenu de lactivité conventionnée) x (total des honoraires - total des dépassements dhonoraires) / montant total des honoraires.
On peut simplififer cette formule en :
On peut simplififer cette formule en :
> (revenu de lactivité conventionnée) / (100% + dépassement d'honoraire moyen)
### Preuve
Si on prends les variables suivantes,
Si on prends les variables suivantes,
> `h+` : total des honoraires (avec dépassement)
`h` : honoraires sans dépassement
`d%`: pourcentage de dépassement d'honoraire moyen
On a :
>
On a :
>
`h+ = h + h * d%`
`h+ = h * (100% + d%)`
Si on remplace dans la formule de l'assiette participation CPAM, on a :
> 1. `(revenu de lactivité conventionnée) * h / h+`
> 2. `(revenu de lactivité conventionnée) * h / (h * (100% + d%))
> 2. `(revenu de lactivité conventionnée) * h / (h * (100% + d%))
> 3. `(revenu de lactivité conventionnée) / (100% + d%)`
références:
@ -560,7 +561,7 @@ dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentist
dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf:
description: |
Le « taux Urssaf » (taux UR) permet de calculer la part de votre
cotisation dassurance maladie-maternité prise en charge par la CPAM.
cotisation dassurance maladie-maternité prise en charge par la CPAM.
Ce taux est pré-rempli sur votre déclaration de revenus professionnels. Il
est issu des données de votre Relevé individuel dactivité et de
@ -571,7 +572,7 @@ dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentist
## Calcul du taux
La formule de calcul du taux de dépassement est la suivante :
La formule de calcul du taux de dépassement est la suivante :
> Taux Urssaf = (dépassements - montants remboursés forfaits CMU) / (montants remboursables actes + montants remboursés forfaits CMU)
question: Quel est votre "taux Urssaf" ?
unité: ''
@ -615,7 +616,7 @@ dirigeant . indépendant . PL . PAMC . IJSS:
Les indemnités complémentaires aux indemnités journalières de la Sécurité
sociale versées dans le cadre dun contrat de prévoyance ne constituent pas
des revenus de remplacement.
Note: Les prestations dinvalidité versées par les régimes
dinvalidité-décès ne sont pas concernées.
@ -737,7 +738,7 @@ dirigeant . indépendant . PL . CARMF . retraite CNAVPL . participation CPAM:
dirigeant . indépendant . PL . CARMF . retraite complémentaire:
remplace: cotisations et contributions . retraite complémentaire
description: >-
La CARMF gère le régime de retraite complémentaire.
La CARMF gère le régime de retraite complémentaire.
Le montant des cotisations est déterminé en fonction des revenus
nets dactivité indépendante de lavant-dernière année.
@ -767,7 +768,7 @@ dirigeant . indépendant . PL . CARMF . invalidité décès:
description: >-
La CARMF gère un régime de prévoyance versant une pension en cas
d'invalidité permanente et un capital décès ainsi quune rente pour les
conjoints et enfants survivants en cas de décès de l'assuré.
conjoints et enfants survivants en cas de décès de l'assuré.
La cotisation comporte trois classes forfaitaires dont le montant est
déterminé en fonction de vos revenus nets d'activité indépendante de
@ -909,7 +910,8 @@ dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV:
titre: Prestation complémentaire vieillesse (CARCDSF chirurgien-dentiste)
remplace: cotisations et contributions . PCV
non applicable si: exonération PCV
note: Une dispense peut être accordée lorsque les revenus professionnels 2019 sont
note:
Une dispense peut être accordée lorsque les revenus professionnels 2019 sont
inférieurs ou égaux à 500 C (valeur au 1er janvier de lannée considérée),
soit 11 500 €.

View File

@ -44,9 +44,9 @@ protection sociale . retraite:
- On ne prend pas en compte les caisses de retraite des professions libérales réglementées (les 10 sections de la Cnavpl et la Cnbf)
- On ne calcule pas le nombre de trimestres validés par année
protection sociale . retraite . plr:
protection sociale . retraite . plr:
applicable si:
toutes ces conditions:
toutes ces conditions:
- entreprise . activité . libérale réglementée
- dirigeant . indépendant . PL . option régime général = non
remplace: retraite

View File

@ -91,7 +91,7 @@ contrat salarié . frais professionnels . titres-restaurant:
- dun repas,
- de préparations alimentaires directement consommables,
- de fruits et légumes.
Ce titre peut être émis sur support papier ou sous forme dématérialisée.
@ -126,14 +126,13 @@ contrat salarié . frais professionnels . titres-restaurant . part déductible:
contrat salarié . frais professionnels . titres-restaurant . nombre:
question: Combien de titres-restaurant sont distribués au salarié ?
arrondi: oui
par défaut:
produit:
assiette: 19 titres-restaurant/mois
par défaut:
produit:
assiette: 19 titres-restaurant/mois
facteur: temps de travail . quotité de travail
suggestions:
5 repas/semaines: 5 titres-restaurant/semaines * période . semaines par mois
3 repas/semaine: 3 titres-restaurant/semaines * période . semaines par mois
5 repas/semaines: 5 titres-restaurant/semaines * période . semaines par mois
3 repas/semaine: 3 titres-restaurant/semaines * période . semaines par mois
contrat salarié . frais professionnels . titres-restaurant . montant unitaire:
question: Quelle est la valeur unitaire du titre-restaurant ?
@ -180,7 +179,7 @@ contrat salarié . frais professionnels . abonnement transports publics . montan
par défaut: 0 €/mois
description: |
L'employeur doit prendre en charge 50% du montant dépensé par le salarié pour les transports publics lui permettant de se rendre sur son lieu de travail.
Cette prise en charge (dans la limite des 50% du montant) est exonérée de cotisations sociales et d'impôt sur le revenu.
Dans le cas d'un temps partiel, le taux de prise en charge sera le même pour un mi-temps ou plus. En dessous, le taux de prise en charge sera proportionnel.
@ -191,11 +190,9 @@ contrat salarié . frais professionnels . abonnement transports publics . montan
Navigo: 75 €/mois
Técély: 65 €/mois
RTM: 40 €/mois
Tisséo: 42.50 €/mois
Tisséo: 42.50 €/mois
TBM: 42.20 €/mois
contrat salarié . frais professionnels . abonnement transports publics . taux de participation employeur:
valeur: 50%
@ -203,7 +200,7 @@ contrat salarié . frais professionnels . abonnement transports publics . taux d
titre: Taux de prise en charge
valeur:
produit:
assiette:
assiette:
le minimum de:
- temps de travail . quotité de travail
- 50%
@ -275,9 +272,9 @@ contrat salarié . frais professionnels . transports personnels . carburant faib
valeur: montant
plafond:
le minimum de:
- proportion déduction * 200€/an
- valeur: proportion déduction * 500€/an
abattement: abonnement transports publics . prise en charge
- proportion déduction * 200€/an
- valeur: proportion déduction * 500€/an
abattement: abonnement transports publics . prise en charge
contrat salarié . frais professionnels . transports personnels . forfait mobilités durables:
valeur: oui
@ -510,17 +507,17 @@ contrat salarié . activité partielle . indemnisation entreprise . taux d'indem
formule:
variations:
- si: secteur d'activité restreint
# Historique:
# - avant le 01/07/2021: 70%
# - avant le 01/08/2021: 60%
# - avant le 01/09/2021: 52%
# - à partir du 01/09/2021: 36%
# Historique:
# - avant le 01/07/2021: 70%
# - avant le 01/08/2021: 60%
# - avant le 01/09/2021: 52%
# - à partir du 01/09/2021: 36%
alors: 70%
# Historique:
# Historique:
# - avant le 01/06/2021: 60%
# - avant le 01/07/2021: 52%
# - à partir du 01/07/2021: 36%
- sinon: 52%
- sinon: 52%
contrat salarié . activité partielle . secteur d'activité restreint:
question: >-
@ -686,7 +683,7 @@ contrat salarié . CDD . CPF:
taux: 1%
références:
Code du travail - Article L6322-37: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000022234996&cidTexte=LEGITEXT000006072050
contrat salarié . CDD . congés pris:
question: Combien de jours de congés seront pris sur la durée du CDD (en jours ouvrés) ?
description: |
@ -697,10 +694,10 @@ contrat salarié . CDD . congés pris:
la totalité: congés dus sur la durée du contrat
la moitié: 50% * congés dus sur la durée du contrat
par défaut: 0 jours ouvrés
contrat salarié . CDD . jours ouvrés sur la durée du contrat:
contrat salarié . CDD . jours ouvrés sur la durée du contrat:
produit:
assiette: 253 jours ouvrés/an
assiette: 253 jours ouvrés/an
facteur: durée contrat
contrat salarié . CDD . congés dus sur la durée du contrat:
@ -737,7 +734,7 @@ contrat salarié . CDD . indemnité compensatrice de congés payés:
rémunération brute totale perçue par le salarié au cours de la période de
référence.
### Méthode "maintien du salaire"
### Méthode "maintien du salaire"
Cette méthode sera le plus souvent favorable au salarié lorsque celui-ci a
bénéficié dune augmentation de salaire.
@ -754,7 +751,7 @@ contrat salarié . CDD . indemnité compensatrice de congés payés:
produit:
assiette: rémunération . assiette congés payés
taux: 10%
abattement:
abattement:
nom: proportion congés pris
unité: '%'
valeur: congés pris / congés dus sur la durée du contrat
@ -762,15 +759,14 @@ contrat salarié . CDD . indemnité compensatrice de congés payés:
- nom: Méthode du maintien de salaire
produit:
assiette: rémunération . assiette congés payés / jours ouvrés sur la durée du contrat
facteur:
facteur:
nom: congés non pris
valeur: congés dus sur la durée du contrat - congés pris
note: |
L'indemnité est versée à la fin du contrat, sauf si le CDD se poursuit par un CDI.
À noter, la loi El Khomri modifie l'article L3141-12:
- avant : Les congés peuvent être pris dès l'ouverture des droits
- avant : Les congés peuvent être pris dès l'ouverture des droits
- maintenant : Les congés peuvent être pris dès lembauche
références:
Fiche service-public.gouv.fr: https://www.service-public.fr/particuliers/vosdroits/F2931
@ -1347,7 +1343,6 @@ contrat salarié . rémunération . brut de base:
- équivalent temps plein
- dirigeant . rémunération . totale
références:
Le salaire. Fixation et paiement: http://travail-emploi.gouv.fr/droit-du-travail/remuneration-et-participation-financiere/remuneration/article/le-salaire-fixation-et-paiement
@ -1825,7 +1820,7 @@ contrat salarié . rémunération . net imposable:
description: |
C'est la base utilisée pour calculer l'impôt sur le revenu.
valeur:
nom: base
nom: base
description: Le net imposable avant les exonérations et déductions
somme:
- net avec revenus de remplacement
@ -1842,8 +1837,6 @@ contrat salarié . rémunération . net imposable:
références:
DSN: https://dsn-info.custhelp.com/app/answers/detail/a_id/2110
contrat salarié . rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées:
unité: €/mois
formule:
@ -1950,11 +1943,11 @@ contrat salarié . cotisations . salariales . réductions de cotisations:
contrat salarié . cotisations . patronales . réductions de cotisations:
titre: réductions patronales
description: >-
À l'exception de la déduction heure supplémentaire, les
dispositifs de réduction de cotisations patronales sont
À l'exception de la déduction heure supplémentaire, les
dispositifs de réduction de cotisations patronales sont
mutuellement exclusif.
Le formule ci dessous selectionne donc automatiquement
Le formule ci dessous selectionne donc automatiquement
le plus avantageux pour l'employeur.
formule:
somme:
@ -2205,7 +2198,7 @@ contrat salarié . aides employeur . emploi franc . éligible:
- CDD . durée contrat >= 6
question: Cette embauche est-elle éligible à l'aide emploi-franc ?
description: |
Conditions :
Conditions :
- Le salarié recruté est un demandeur d'emploi inscrit à Pôle Emploi et réside dans un quartier prioritaire de la ville (QPV) [vérifier l'éligibilité d'un quartier](https://sig.ville.gouv.fr/recherche-adresses-qp-polville)
- L'employeur est à jour de ses cotisations et n'a pas procédé à un licenciement économique pour le poste pourvu dans les 6 mois précédents le recrutement
- Le salarié recruté ne doit pas avoir appartenu à l'effectif de l'entreprise dans les 6 mois précédent l'embauche
@ -2825,7 +2818,7 @@ contrat salarié . complémentaire santé . forfait:
titre: Forfait de complémentaire santé entreprise
description: >-
L'employeur a l'obligation de proposer une offre de complémentaire santé. Il
doit prendre à sa charge au moins la moitié de son coût.
doit prendre à sa charge au moins la moitié de son coût.
Le montant peut varier, mais la prévoyance doit couvrir un panier minimum
légal de soins.

View File

@ -1,2 +1,2 @@
ignorePatterns:
- smarttag.js
ignorePatterns:
- smarttag.js

View File

@ -73,9 +73,8 @@ export function createTracker(siteId?: string, doNotTrack = false) {
}
constructor(options: { language: 'fr' | 'en' }) {
super({ site })
this.site[
INDICATOR.SITE.LANGAGE
] = `[${options.language}]` as CustomSiteIndicator[1]
this.site[INDICATOR.SITE.LANGAGE] =
`[${options.language}]` as CustomSiteIndicator[1]
if (process.env.NODE_ENV === 'production' && doNotTrack) {
this.privacy.setVisitorOptout()
} else {

View File

@ -82,7 +82,8 @@
: null
}
var c = this,
b = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g,
b =
/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g,
d = RegExp(
'^[\\x20\\t\\r\\n\\f]+|((?:^|[^\\\\])(?:\\\\.)*)[\\x20\\t\\r\\n\\f]+$',
'g'
@ -1506,12 +1507,13 @@
'undefined' !== typeof window &&
'undefined' !== typeof window.location
) {
h = (c.getConfig('urlPropertyQueryString')
? window.location.href
: window.location.protocol +
'//' +
window.location.host +
window.location.pathname
h = (
c.getConfig('urlPropertyQueryString')
? window.location.href
: window.location.protocol +
'//' +
window.location.host +
window.location.pathname
)
.replace(/[<>]/g, '')
.substring(0, 1600)
@ -1521,9 +1523,10 @@
c.setContext('page', l)
c.setParam('page_url', h, {
permanent: !0,
hitType: 'page click publisher selfPromotion onSiteAdsClick onSiteAdsImpression InternalSearch mvtesting richmedia'.split(
' '
),
hitType:
'page click publisher selfPromotion onSiteAdsClick onSiteAdsImpression InternalSearch mvtesting richmedia'.split(
' '
),
})
}
c.plugins.init()
@ -1641,8 +1644,13 @@
},
c = { search: 's', content: 'c' }
this.atMedium = 'sl'
this.atTerm = this.atNetwork = this.atVariant = this.atCreation = this.atPlatform = this.atCampaign =
''
this.atTerm =
this.atNetwork =
this.atVariant =
this.atCreation =
this.atPlatform =
this.atCampaign =
''
this.format = function () {
var a = 'sec',
h = b(this.atCampaign),
@ -1693,8 +1701,15 @@
this.Email = function () {
var e = { acquisition: 'erec', retention: 'epr', promotion: 'es' }
this.atMedium = 'email'
this.atSendTime = this.atRecipientList = this.atRecipientId = this.atLink = this.atSendDate = this.atCreation = this.atCampaign = this.atEmailtype =
''
this.atSendTime =
this.atRecipientList =
this.atRecipientId =
this.atLink =
this.atSendDate =
this.atCreation =
this.atCampaign =
this.atEmailtype =
''
this.format = function () {
var a = e[this.atEmailtype] || e.promotion,
c = b(this.atCampaign),
@ -1762,8 +1777,13 @@
}
this.Affiliate = function () {
this.atMedium = 'affiliate'
this.atVariant = this.atCreation = this.atFormat = this.atIdentifier = this.atType = this.atCampaign =
''
this.atVariant =
this.atCreation =
this.atFormat =
this.atIdentifier =
this.atType =
this.atCampaign =
''
this.format = function () {
var a = 'al',
f = b(this.atCampaign),
@ -1813,8 +1833,14 @@
}
this.Display = function () {
this.atMedium = 'display'
this.atDetailPlacement = this.atGeneralPlacement = this.atChannel = this.atFormat = this.atVariant = this.atCreation = this.atCampaign =
''
this.atDetailPlacement =
this.atGeneralPlacement =
this.atChannel =
this.atFormat =
this.atVariant =
this.atCreation =
this.atCampaign =
''
this.format = function () {
var a = 'ad',
f = b(this.atCampaign),
@ -1885,8 +1911,13 @@
}
}
this.Custom = function () {
this.atCustom4 = this.atCustom3 = this.atCustom2 = this.atCustom1 = this.atCampaign = this.atMedium =
''
this.atCustom4 =
this.atCustom3 =
this.atCustom2 =
this.atCustom1 =
this.atCampaign =
this.atMedium =
''
this.format = function () {
var a = ''
;/\d+$/.test(this.atMedium) && (a = /\d+$/.exec(this.atMedium)[0])

View File

@ -66,11 +66,8 @@ export default function CurrencyInput({
onChangeDebounced?.(event)
}
const {
isCurrencyPrefixed,
thousandSeparator,
decimalSeparator,
} = currencyFormat(language)
const { isCurrencyPrefixed, thousandSeparator, decimalSeparator } =
currencyFormat(language)
// Autogrow the input
const valueLength = currentValue.toString().length
const width = `${5 + (valueLength - 5) * 0.75}em`

View File

@ -13,17 +13,19 @@ import RuleLink from './RuleLink'
export default function Distribution() {
const targetUnit = useSelector(targetUnitSelector)
const engine = useContext(EngineContext)
const distribution = (getCotisationsBySection(
useEngine().getParsedRules()
).map(([section, cotisations]) => [
section,
cotisations
.map((c) => engine.evaluate({ valeur: c, unité: targetUnit }))
.reduce(
(acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0),
0
),
]) as Array<[DottedName, number]>)
const distribution = (
getCotisationsBySection(useEngine().getParsedRules()).map(
([section, cotisations]) => [
section,
cotisations
.map((c) => engine.evaluate({ valeur: c, unité: targetUnit }))
.reduce(
(acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0),
0
),
]
) as Array<[DottedName, number]>
)
.filter(([, value]) => value > 0)
.sort(([, a], [, b]) => b - a)

View File

@ -6,10 +6,8 @@ import { Etablissement, searchDenominationOrSiren } from '../api/sirene'
import { debounce } from '../utils'
export default function Search() {
const [
searchResults,
setSearchResults,
] = useState<Array<Etablissement> | null>()
const [searchResults, setSearchResults] =
useState<Array<Etablissement> | null>()
const [isLoading, setLoadingState] = useState(false)
const handleSearch = useCallback(
@ -21,9 +19,10 @@ export default function Search() {
},
[setSearchResults, setLoadingState]
)
const debouncedHandleSearch = useMemo(() => debounce(300, handleSearch), [
handleSearch,
])
const debouncedHandleSearch = useMemo(
() => debounce(300, handleSearch),
[handleSearch]
)
const setEntreprise = useSetEntreprise()
return (

View File

@ -52,10 +52,12 @@ export function getCotisationsBySection(
)
}
const cotisations = ([
...findCotisations('contrat salarié . cotisations . patronales'),
...findCotisations('contrat salarié . cotisations . salariales'),
] as Array<ASTNode & { dottedName: DottedName } & { nodeKind: 'reference' }>)
const cotisations = (
[
...findCotisations('contrat salarié . cotisations . patronales'),
...findCotisations('contrat salarié . cotisations . salariales'),
] as Array<ASTNode & { dottedName: DottedName } & { nodeKind: 'reference' }>
)
.map((cotisation) => cotisation.dottedName)
.filter(Boolean)
.map(

View File

@ -39,9 +39,10 @@ export default function SchemeComparaison({
const [conversationStarted, setConversationStarted] = useState(
!!Object.keys(useSelector(situationSelector)).length
)
const startConversation = useCallback(() => setConversationStarted(true), [
setConversationStarted,
])
const startConversation = useCallback(
() => setConversationStarted(true),
[setConversationStarted]
)
const situation = useSelector(situationSelector)
const displayResult =

View File

@ -41,13 +41,15 @@ export default function TargetSelection({ showPeriodSwitch = true }) {
)
return (
<div id="targetSelection">
{((typeof objectifs[0] === 'string'
? [{ objectifs }]
: objectifs) as Array<{
icône?: string
nom?: string
objectifs: Array<DottedName>
}>).map(({ icône, objectifs: targets, nom }, index: number) => (
{(
(typeof objectifs[0] === 'string'
? [{ objectifs }]
: objectifs) as Array<{
icône?: string
nom?: string
objectifs: Array<DottedName>
}>
).map(({ icône, objectifs: targets, nom }, index: number) => (
<Fragment key={nom || '0'}>
<div style={{ display: 'flex', alignItems: 'end' }}>
<div style={{ flex: 1 }}>

View File

@ -17,11 +17,9 @@ type AnswerListProps = {
export default function AnswerList({ onClose }: AnswerListProps) {
const dispatch = useDispatch()
const engine = useEngine()
const answeredQuestions = (Object.keys(
useSelector(situationSelector)
) as Array<DottedName>).map((dottedName) =>
engine.evaluate(engine.getRule(dottedName))
)
const answeredQuestions = (
Object.keys(useSelector(situationSelector)) as Array<DottedName>
).map((dottedName) => engine.evaluate(engine.getRule(dottedName)))
const nextSteps = useNextQuestions().map((dottedName) =>
engine.evaluate(engine.getRule(dottedName))

View File

@ -175,7 +175,7 @@ export default function Question({
}
const choiceElements = Array.isArray(choices)
? renderBinaryQuestion((choices as unknown) as typeof binaryQuestion)
? renderBinaryQuestion(choices as unknown as typeof binaryQuestion)
: renderChildren(choices as Choice)
return (

View File

@ -225,9 +225,11 @@ export const buildVariantTree = <Name extends string>(
variant
? {
canGiveUp,
children: (variant.explanation as (ASTNode & {
nodeKind: 'reference'
})[]).map(({ dottedName }) =>
children: (
variant.explanation as (ASTNode & {
nodeKind: 'reference'
})[]
).map(({ dottedName }) =>
buildVariantTree(engine, dottedName as Name)
),
}

View File

@ -95,9 +95,10 @@ export default function Select({ onChange, value, id, missing }: InputProps) {
},
[setSearchResults, setLoadingState]
)
const debouncedHandleSearch = useMemo(() => debounce(300, handleSearch), [
handleSearch,
])
const debouncedHandleSearch = useMemo(
() => debounce(300, handleSearch),
[handleSearch]
)
const handleSubmit = useCallback(
async (commune: Commune) => {

View File

@ -133,17 +133,17 @@ const CotisationsSection: Partial<Record<DottedName, Array<string>>> = {
function Distribution() {
const targetUnit = useSelector(targetUnitSelector)
const engine = useEngine()
const distribution = (Object.entries(
CotisationsSection
).map(([section, cotisations]) => [
section,
(cotisations as string[])
.map((c) => engine.evaluate({ valeur: c, unité: targetUnit }))
.reduce(
(acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0),
0
),
]) as Array<[DottedName, number]>)
const distribution = (
Object.entries(CotisationsSection).map(([section, cotisations]) => [
section,
(cotisations as string[])
.map((c) => engine.evaluate({ valeur: c, unité: targetUnit }))
.reduce(
(acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0),
0
),
]) as Array<[DottedName, number]>
)
.filter(([, value]) => value > 0)
.sort(([, a], [, b]) => b - a)

View File

@ -92,7 +92,8 @@ function CaisseRetraite() {
return (
<>
{caisses.map((caisse) => {
const dottedName = `dirigeant . indépendant . PL . ${caisse}` as DottedName
const dottedName =
`dirigeant . indépendant . PL . ${caisse}` as DottedName
const { description, références } = engine.getRule(dottedName).rawNode
return (
<Condition expression={dottedName} key={caisse}>

View File

@ -3,34 +3,24 @@ import { useContext } from 'react'
export const icons = {
facebook: {
icon:
'M34.1,47V33.3h4.6l0.7-5.3h-5.3v-3.4c0-1.5,0.4-2.6,2.6-2.6l2.8,0v-4.8c-0.5-0.1-2.2-0.2-4.1-0.2 c-4.1,0-6.9,2.5-6.9,7V28H24v5.3h4.6V47H34.1z',
mask:
'M0,0v64h64V0H0z M39.6,22l-2.8,0c-2.2,0-2.6,1.1-2.6,2.6V28h5.3l-0.7,5.3h-4.6V47h-5.5V33.3H24V28h4.6V24 c0-4.6,2.8-7,6.9-7c2,0,3.6,0.1,4.1,0.2V22z',
icon: 'M34.1,47V33.3h4.6l0.7-5.3h-5.3v-3.4c0-1.5,0.4-2.6,2.6-2.6l2.8,0v-4.8c-0.5-0.1-2.2-0.2-4.1-0.2 c-4.1,0-6.9,2.5-6.9,7V28H24v5.3h4.6V47H34.1z',
mask: 'M0,0v64h64V0H0z M39.6,22l-2.8,0c-2.2,0-2.6,1.1-2.6,2.6V28h5.3l-0.7,5.3h-4.6V47h-5.5V33.3H24V28h4.6V24 c0-4.6,2.8-7,6.9-7c2,0,3.6,0.1,4.1,0.2V22z',
},
twitter: {
icon:
'M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z',
mask:
'M0,0v64h64V0H0z M44.7,25.5c0,0.3,0,0.6,0,0.8C44.7,35,38.1,45,26.1,45c-3.7,0-7.2-1.1-10.1-2.9 c0.5,0.1,1,0.1,1.6,0.1c3.1,0,5.9-1,8.2-2.8c-2.9-0.1-5.3-2-6.1-4.6c0.4,0.1,0.8,0.1,1.2,0.1c0.6,0,1.2-0.1,1.7-0.2 c-3-0.6-5.3-3.3-5.3-6.4c0,0,0-0.1,0-0.1c0.9,0.5,1.9,0.8,3,0.8c-1.8-1.2-2.9-3.2-2.9-5.5c0-1.2,0.3-2.3,0.9-3.3 c3.2,4,8.1,6.6,13.5,6.9c-0.1-0.5-0.2-1-0.2-1.5c0-3.6,2.9-6.6,6.6-6.6c1.9,0,3.6,0.8,4.8,2.1c1.5-0.3,2.9-0.8,4.2-1.6 c-0.5,1.5-1.5,2.8-2.9,3.6c1.3-0.2,2.6-0.5,3.8-1C47.1,23.4,46,24.5,44.7,25.5z',
icon: 'M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z',
mask: 'M0,0v64h64V0H0z M44.7,25.5c0,0.3,0,0.6,0,0.8C44.7,35,38.1,45,26.1,45c-3.7,0-7.2-1.1-10.1-2.9 c0.5,0.1,1,0.1,1.6,0.1c3.1,0,5.9-1,8.2-2.8c-2.9-0.1-5.3-2-6.1-4.6c0.4,0.1,0.8,0.1,1.2,0.1c0.6,0,1.2-0.1,1.7-0.2 c-3-0.6-5.3-3.3-5.3-6.4c0,0,0-0.1,0-0.1c0.9,0.5,1.9,0.8,3,0.8c-1.8-1.2-2.9-3.2-2.9-5.5c0-1.2,0.3-2.3,0.9-3.3 c3.2,4,8.1,6.6,13.5,6.9c-0.1-0.5-0.2-1-0.2-1.5c0-3.6,2.9-6.6,6.6-6.6c1.9,0,3.6,0.8,4.8,2.1c1.5-0.3,2.9-0.8,4.2-1.6 c-0.5,1.5-1.5,2.8-2.9,3.6c1.3-0.2,2.6-0.5,3.8-1C47.1,23.4,46,24.5,44.7,25.5z',
},
linkedin: {
icon:
'M20.4,44h5.4V26.6h-5.4V44z M23.1,18c-1.7,0-3.1,1.4-3.1,3.1c0,1.7,1.4,3.1,3.1,3.1 c1.7,0,3.1-1.4,3.1-3.1C26.2,19.4,24.8,18,23.1,18z M39.5,26.2c-2.6,0-4.4,1.4-5.1,2.8h-0.1v-2.4h-5.2V44h5.4v-8.6 c0-2.3,0.4-4.5,3.2-4.5c2.8,0,2.8,2.6,2.8,4.6V44H46v-9.5C46,29.8,45,26.2,39.5,26.2z',
mask:
'M0,0v64h64V0H0z M25.8,44h-5.4V26.6h5.4V44z M23.1,24.3c-1.7,0-3.1-1.4-3.1-3.1c0-1.7,1.4-3.1,3.1-3.1 c1.7,0,3.1,1.4,3.1,3.1C26.2,22.9,24.8,24.3,23.1,24.3z M46,44h-5.4v-8.4c0-2,0-4.6-2.8-4.6c-2.8,0-3.2,2.2-3.2,4.5V44h-5.4V26.6 h5.2V29h0.1c0.7-1.4,2.5-2.8,5.1-2.8c5.5,0,6.5,3.6,6.5,8.3V44z',
icon: 'M20.4,44h5.4V26.6h-5.4V44z M23.1,18c-1.7,0-3.1,1.4-3.1,3.1c0,1.7,1.4,3.1,3.1,3.1 c1.7,0,3.1-1.4,3.1-3.1C26.2,19.4,24.8,18,23.1,18z M39.5,26.2c-2.6,0-4.4,1.4-5.1,2.8h-0.1v-2.4h-5.2V44h5.4v-8.6 c0-2.3,0.4-4.5,3.2-4.5c2.8,0,2.8,2.6,2.8,4.6V44H46v-9.5C46,29.8,45,26.2,39.5,26.2z',
mask: 'M0,0v64h64V0H0z M25.8,44h-5.4V26.6h5.4V44z M23.1,24.3c-1.7,0-3.1-1.4-3.1-3.1c0-1.7,1.4-3.1,3.1-3.1 c1.7,0,3.1,1.4,3.1,3.1C26.2,22.9,24.8,24.3,23.1,24.3z M46,44h-5.4v-8.4c0-2,0-4.6-2.8-4.6c-2.8,0-3.2,2.2-3.2,4.5V44h-5.4V26.6 h5.2V29h0.1c0.7-1.4,2.5-2.8,5.1-2.8c5.5,0,6.5,3.6,6.5,8.3V44z',
},
github: {
icon:
'M32,16c-8.8,0-16,7.2-16,16c0,7.1,4.6,13.1,10.9,15.2 c0.8,0.1,1.1-0.3,1.1-0.8c0-0.4,0-1.4,0-2.7c-4.5,1-5.4-2.1-5.4-2.1c-0.7-1.8-1.8-2.3-1.8-2.3c-1.5-1,0.1-1,0.1-1 c1.6,0.1,2.5,1.6,2.5,1.6c1.4,2.4,3.7,1.7,4.7,1.3c0.1-1,0.6-1.7,1-2.1c-3.6-0.4-7.3-1.8-7.3-7.9c0-1.7,0.6-3.2,1.6-4.3 c-0.2-0.4-0.7-2,0.2-4.2c0,0,1.3-0.4,4.4,1.6c1.3-0.4,2.6-0.5,4-0.5c1.4,0,2.7,0.2,4,0.5c3.1-2.1,4.4-1.6,4.4-1.6 c0.9,2.2,0.3,3.8,0.2,4.2c1,1.1,1.6,2.5,1.6,4.3c0,6.1-3.7,7.5-7.3,7.9c0.6,0.5,1.1,1.5,1.1,3c0,2.1,0,3.9,0,4.4 c0,0.4,0.3,0.9,1.1,0.8C43.4,45.1,48,39.1,48,32C48,23.2,40.8,16,32,16z',
mask:
'M0,0v64h64V0H0z M37.1,47.2c-0.8,0.2-1.1-0.3-1.1-0.8c0-0.5,0-2.3,0-4.4c0-1.5-0.5-2.5-1.1-3 c3.6-0.4,7.3-1.7,7.3-7.9c0-1.7-0.6-3.2-1.6-4.3c0.2-0.4,0.7-2-0.2-4.2c0,0-1.3-0.4-4.4,1.6c-1.3-0.4-2.6-0.5-4-0.5 c-1.4,0-2.7,0.2-4,0.5c-3.1-2.1-4.4-1.6-4.4-1.6c-0.9,2.2-0.3,3.8-0.2,4.2c-1,1.1-1.6,2.5-1.6,4.3c0,6.1,3.7,7.5,7.3,7.9 c-0.5,0.4-0.9,1.1-1,2.1c-0.9,0.4-3.2,1.1-4.7-1.3c0,0-0.8-1.5-2.5-1.6c0,0-1.6,0-0.1,1c0,0,1,0.5,1.8,2.3c0,0,0.9,3.1,5.4,2.1 c0,1.3,0,2.3,0,2.7c0,0.4-0.3,0.9-1.1,0.8C20.6,45.1,16,39.1,16,32c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16 C48,39.1,43.4,45.1,37.1,47.2z',
icon: 'M32,16c-8.8,0-16,7.2-16,16c0,7.1,4.6,13.1,10.9,15.2 c0.8,0.1,1.1-0.3,1.1-0.8c0-0.4,0-1.4,0-2.7c-4.5,1-5.4-2.1-5.4-2.1c-0.7-1.8-1.8-2.3-1.8-2.3c-1.5-1,0.1-1,0.1-1 c1.6,0.1,2.5,1.6,2.5,1.6c1.4,2.4,3.7,1.7,4.7,1.3c0.1-1,0.6-1.7,1-2.1c-3.6-0.4-7.3-1.8-7.3-7.9c0-1.7,0.6-3.2,1.6-4.3 c-0.2-0.4-0.7-2,0.2-4.2c0,0,1.3-0.4,4.4,1.6c1.3-0.4,2.6-0.5,4-0.5c1.4,0,2.7,0.2,4,0.5c3.1-2.1,4.4-1.6,4.4-1.6 c0.9,2.2,0.3,3.8,0.2,4.2c1,1.1,1.6,2.5,1.6,4.3c0,6.1-3.7,7.5-7.3,7.9c0.6,0.5,1.1,1.5,1.1,3c0,2.1,0,3.9,0,4.4 c0,0.4,0.3,0.9,1.1,0.8C43.4,45.1,48,39.1,48,32C48,23.2,40.8,16,32,16z',
mask: 'M0,0v64h64V0H0z M37.1,47.2c-0.8,0.2-1.1-0.3-1.1-0.8c0-0.5,0-2.3,0-4.4c0-1.5-0.5-2.5-1.1-3 c3.6-0.4,7.3-1.7,7.3-7.9c0-1.7-0.6-3.2-1.6-4.3c0.2-0.4,0.7-2-0.2-4.2c0,0-1.3-0.4-4.4,1.6c-1.3-0.4-2.6-0.5-4-0.5 c-1.4,0-2.7,0.2-4,0.5c-3.1-2.1-4.4-1.6-4.4-1.6c-0.9,2.2-0.3,3.8-0.2,4.2c-1,1.1-1.6,2.5-1.6,4.3c0,6.1,3.7,7.5,7.3,7.9 c-0.5,0.4-0.9,1.1-1,2.1c-0.9,0.4-3.2,1.1-4.7-1.3c0,0-0.8-1.5-2.5-1.6c0,0-1.6,0-0.1,1c0,0,1,0.5,1.8,2.3c0,0,0.9,3.1,5.4,2.1 c0,1.3,0,2.3,0,2.7c0,0.4-0.3,0.9-1.1,0.8C20.6,45.1,16,39.1,16,32c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16 C48,39.1,43.4,45.1,37.1,47.2z',
},
email: {
icon:
'M17,22v20h30V22H17z M41.1,25L32,32.1L22.9,25H41.1z M20,39V26.6l12,9.3l12-9.3V39H20z',
mask:
'M41.1,25H22.9l9.1,7.1L41.1,25z M44,26.6l-12,9.3l-12-9.3V39h24V26.6z M0,0v64h64V0H0z M47,42H17V22h30V42z',
icon: 'M17,22v20h30V22H17z M41.1,25L32,32.1L22.9,25H41.1z M20,39V26.6l12,9.3l12-9.3V39H20z',
mask: 'M41.1,25H22.9l9.1,7.1L41.1,25z M44,26.6l-12,9.3l-12-9.3V39h24V26.6z M0,0v64h64V0H0z M47,42H17V22h30V42z',
},
}

View File

@ -33,19 +33,21 @@ export const fromBottom = ({
to={{ opacity: 1, y: 0 }}
items={children}
>
{(item) => ({ y, ...style }) => (
<animated.div
style={{
transform: interpolate([y], (y) =>
y !== 0 ? `translate3d(0, ${y}px,0)` : 'none'
),
...style,
...inheritedStyle,
}}
>
{item}
</animated.div>
)}
{(item) =>
({ y, ...style }) =>
(
<animated.div
style={{
transform: interpolate([y], (y) =>
y !== 0 ? `translate3d(0, ${y}px,0)` : 'none'
),
...style,
...inheritedStyle,
}}
>
{item}
</animated.div>
)}
</Trail>
)
export const fromTop = ({
@ -63,19 +65,21 @@ export const fromTop = ({
to={{ opacity: 1, y: 0 }}
items={children}
>
{(item) => ({ y, ...style }) => (
<animated.div
style={{
transform: interpolate([y], (y) =>
y !== 0 ? `translate3d(0, ${y}px,0)` : 'none'
),
...style,
...inheritedStyle,
}}
>
{item}
</animated.div>
)}
{(item) =>
({ y, ...style }) =>
(
<animated.div
style={{
transform: interpolate([y], (y) =>
y !== 0 ? `translate3d(0, ${y}px,0)` : 'none'
),
...style,
...inheritedStyle,
}}
>
{item}
</animated.div>
)}
</Trail>
)

View File

@ -115,10 +115,12 @@ export const cleanSearchParams = (
export const getRulesParamNames = (
parsedRules: ParsedRules<DottedName>
): [DottedName, ParamName][] =>
(Object.entries(parsedRules) as [
DottedName,
{ rawNode: { 'identifiant court'?: ShortName } }
][]).map(([dottedName, ruleNode]) => [
(
Object.entries(parsedRules) as [
DottedName,
{ rawNode: { 'identifiant court'?: ShortName } }
][]
).map(([dottedName, ruleNode]) => [
dottedName,
ruleNode.rawNode['identifiant court'] || dottedName,
])

File diff suppressed because it is too large Load Diff

View File

@ -41,17 +41,15 @@ export const attributesToTranslate = [
'identifiant court',
]
const translateProp = (lang: string, translation: Translation) => (
rule: Rule,
prop: string
) => {
if (prop === 'suggestions' && rule?.suggestions) {
return translateSuggestion(prop, rule, translation, lang)
const translateProp =
(lang: string, translation: Translation) => (rule: Rule, prop: string) => {
if (prop === 'suggestions' && rule?.suggestions) {
return translateSuggestion(prop, rule, translation, lang)
}
let propTrans = translation[prop + '.' + lang]
propTrans = propTrans?.replace(/^\[automatic\] /, '')
return propTrans ? assoc(prop, propTrans, rule) : rule
}
let propTrans = translation[prop + '.' + lang]
propTrans = propTrans?.replace(/^\[automatic\] /, '')
return propTrans ? assoc(prop, propTrans, rule) : rule
}
function translateRule<Names extends string>(
lang: string,

View File

@ -45,10 +45,12 @@ export default function ResultatsSimples() {
Vous pouvez reporter les montants suivants dans votre déclaration,
calculés à partir des informations saisies.
</p>
{([
'aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires',
'aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible',
] as const).map((dottedName) => {
{(
[
'aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires',
'aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible',
] as const
).map((dottedName) => {
const r = engine.getRule(dottedName)
if (engine.evaluate(dottedName).nodeValue === false) {
return null
@ -114,13 +116,15 @@ export default function ResultatsSimples() {
grid-template-columns: repeat(3, auto);
`}
>
{([
'aide déclaration revenu indépendant 2020 . réduction covid . total',
'aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal',
'aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible',
'aide déclaration revenu indépendant 2020 . résultat simple . CFP',
'aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale',
] as const).map((dottedName) => {
{(
[
'aide déclaration revenu indépendant 2020 . réduction covid . total',
'aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal',
'aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible',
'aide déclaration revenu indépendant 2020 . résultat simple . CFP',
'aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale',
] as const
).map((dottedName) => {
const r = engine.getRule(dottedName)
if (engine.evaluate(dottedName).nodeValue === false) {
return null

View File

@ -46,13 +46,15 @@ export default function ResultatsParFormulaire() {
déclaration correcte.{' '}
</p>
<p>En cas de doute, référez-vous à votre expert comptable.</p>
{([
'aide déclaration revenu indépendant 2020 . formulaire 2035',
'aide déclaration revenu indépendant 2020 . formulaire 2033',
'aide déclaration revenu indépendant 2020 . formulaire 2050',
'aide déclaration revenu indépendant 2020 . formulaire 2042',
'aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C',
] as const).map((dottedName) => (
{(
[
'aide déclaration revenu indépendant 2020 . formulaire 2035',
'aide déclaration revenu indépendant 2020 . formulaire 2033',
'aide déclaration revenu indépendant 2020 . formulaire 2050',
'aide déclaration revenu indépendant 2020 . formulaire 2042',
'aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C',
] as const
).map((dottedName) => (
<DeclarationForm key={dottedName} dottedName={dottedName} />
))}
<Condition expression="aide déclaration revenu indépendant 2020 . informations résultat par formulaire">

View File

@ -6,7 +6,7 @@ objectifs:
- aide déclaration revenu indépendant 2020 . formulaire 2050
- aide déclaration revenu indépendant 2020 . formulaire 2042
- aide déclaration revenu indépendant 2020 . formulaire 2035
situation:
dirigeant: "'indépendant'"
aide déclaration revenu indépendant 2020: oui

View File

@ -32,9 +32,8 @@ import illustration from './undraw_fill_in_mie5.svg'
*
* Le but est de faire valider la version plus complète pour la déclaration de revenu 2021.
*/
const FEATURE_FLAG_RESULTATS_COMPLETS = document.location.search.includes(
'next'
)
const FEATURE_FLAG_RESULTATS_COMPLETS =
document.location.search.includes('next')
export default function AideDéclarationIndépendant() {
useSimulationConfig(simulationConfig)

View File

@ -34,10 +34,12 @@ export default function FieldsPDF({ fields }: FieldsPDFProps) {
{formatValue(engine.evaluate(dottedName)) +
(API === 'commune'
? ` (${
(engine.evaluate(dottedName).nodeValue as Record<
string,
unknown
>)?.codePostal as string
(
engine.evaluate(dottedName).nodeValue as Record<
string,
unknown
>
)?.codePostal as string
})`
: '')}{' '}
</Text>

View File

@ -25,7 +25,7 @@ coordonnées assuré . date de naissance:
type: date
note: 1.5
coordonnées assuré . commune de naissance:
coordonnées assuré . commune de naissance:
type: groupe
formule: oui
note: 1.7
@ -51,7 +51,7 @@ coordonnées assuré . domicile personnel . commune . étranger:
coordonnées assuré . domicile personnel . adresse:
type: texte
note: 1.9.1
coordonnées assuré . domicile personnel . commune:
coordonnées assuré . domicile personnel . commune:
formule: oui
note: 1.9.2 / 1.9.3
coordonnées assuré . domicile personnel . commune . commune:
@ -64,8 +64,6 @@ coordonnées assuré . domicile personnel . commune . étranger . code postal:
coordonnées assuré . domicile personnel . commune . étranger . pays:
type: texte
coordonnées assuré . contact:
type: groupe
formule: oui
@ -90,7 +88,7 @@ activité france . adresse:
activité france . commune:
API: commune
note: 4.4.3 / 4.4.4
activité france . organisme urssaf:
type: texte
titre: Organisme Urssaf
@ -153,7 +151,6 @@ détachement . pays . autre:
titre: Nom du pays
type: texte
détachement . date de début:
type: date
note: 2.2
@ -199,7 +196,7 @@ activité transfrontalière simultanée:
formule: oui
titre: Demande d'activité transfrontalière simultanée
type: groupe
activité transfrontalière simultanée . salarié hors France:
question: >
Travaillez-vous en tant que salarié dans un autre pays ?
@ -262,11 +259,11 @@ activité transfrontalière simultanée . activité salariée . lieu d'exercice
description: Votre activité salariée peut-être exercé depuis un autre pays que celui de l'employeur par exemple en cas de télétravail.
activité transfrontalière simultanée . activité salariée . lieu d'exercice . lieu de résidence:
question: Exercerez-vous cette activité salariée dans votre pays de résidence ?
question: Exercerez-vous cette activité salariée dans votre pays de résidence ?
non applicable si: employeur
activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays:
non applicable si:
non applicable si:
une de ces conditions:
- lieu de résidence
- employeur
@ -278,7 +275,6 @@ activité transfrontalière simultanée . activité salariée . lieu d'exercice
titre: Nom du pays
type: texte
activité transfrontalière simultanée . activité salariée . revenus:
titre: Revenus salariés
type: groupe
@ -293,7 +289,6 @@ activité transfrontalière simultanée . activité salariée . revenus . nombre
unité: heures/semaine
question: Quel est le temps de travail hebdomadaire inscrit au contrat de travail ?
activité transfrontalière simultanée . activité salariée . revenus . revenu:
question: Quel revenu estimez-vous obtenir pour cette activité salariée pour les 12 prochains mois (environ) ?
type: nombre
@ -303,13 +298,10 @@ activité transfrontalière simultanée . activité salariée . revenus . activi
question: >
Considérez-vous que votre activité salariée représentera plus de 5% de votre activité professionnelle pour les 12 prochains mois ?
activité transfrontalière simultanée . activité salariée . revenus . articulation activité indépendante:
question: Comment votre activité salariée s'articulera-t-elle avec votre activité indépendante au cours des 12 prochains mois (périodes, revenu, etc.) ?
type: paragraphe
activité transfrontalière simultanée . activité salariée . activité indépendante additionnelle:
question: >
Exercez-vous également une activité non salariée à l'étranger ?
@ -337,7 +329,6 @@ activité transfrontalière simultanée . activité non salariée . nombre:
plancher: 1
plafond: 3
activité transfrontalière simultanée . activité non salariée . n°1:
titre: activité non salarié n°1
type: groupe

View File

@ -290,9 +290,8 @@ type CompanySectionProps = {
export const CompanySection = ({ company }: CompanySectionProps) => {
const [searchModal, showSearchModal] = useState(false)
const [autoEntrepreneurModal, showAutoEntrepreneurModal] = useState(false)
const [DirigeantMajoritaireModal, showDirigeantMajoritaireModal] = useState(
false
)
const [DirigeantMajoritaireModal, showDirigeantMajoritaireModal] =
useState(false)
const companyRef = useRef<Company | null>(null)
useEffect(() => {

View File

@ -196,32 +196,27 @@ export function SimulatorRessourceCard({
const guidesUrssaf = [
{
url:
'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf',
url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf',
associatedRule: "dirigeant . indépendant . PL . métier = 'santé . médecin'",
title: 'Guide Urssaf pour les médecins libéraux',
},
{
url:
'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf',
url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf',
associatedRule: 'entreprise . activité . libérale réglementée',
title: 'Guide Urssaf pour les professions libérales réglementées',
},
{
url:
'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf',
url: 'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf',
associatedRule: 'dirigeant . auto-entrepreneur',
title: 'Guide Urssaf pour les auto-entrepreneurs',
},
{
url:
'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf',
url: 'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf',
associatedRule: "dirigeant = 'artiste-auteur'",
title: 'Guide Urssaf pour les artistes-auteurs',
},
{
url:
'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf',
url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf',
associatedRule: 'dirigeant',
title: 'Guide Urssaf pour les indépendants',
},

View File

@ -4,7 +4,6 @@ objectifs:
objectifs cachés:
- contrat salarié . rémunération . net
- contrat salarié . prix du travail
questions:
liste:

View File

@ -1,18 +1,17 @@
objectifs:
- dirigeant . rémunération . totale
- dirigeant . rémunération . totale
- contrat salarié . cotisations
- contrat salarié . rémunération . net
- impôt
- contrat salarié . rémunération . net après impôt
questions:
à l'affiche:
ACRE: entreprise . ACRE
Commune: établissement . localisation
Avantages en nature: contrat salarié . rémunération . avantages en nature
Impôt sur le revenu: impôt . méthode de calcul
liste noire:
- entreprise . charges
- entreprise . imposition

View File

@ -3,7 +3,7 @@ objectifs:
- dirigeant . rémunération . totale
- dirigeant . rémunération . nette
- dirigeant . rémunération . nette après impôt
questions:
à l'affiche:
Type d'activité: entreprise . activité

View File

@ -41,9 +41,9 @@ export default function VotreSituation() {
}
const déclarations = déclarationsSelector(state)
const régimeGénéralDisponible = activitésEffectuéesSelector(
state
).some((activité) => régimeGénéralDisponibleSelector(state, activité))
const régimeGénéralDisponible = activitésEffectuéesSelector(state).some(
(activité) => régimeGénéralDisponibleSelector(state, activité)
)
return (
<Animate.fromBottom>

View File

@ -6,8 +6,8 @@ Location meublée:
- Abritel
- Guest room
- classified tourism
Location meublée standard:
Location meublée standard:
titre: Standard furnished rental
explication: You have rented furnished accommodation for short periods of time to a visiting clientele who do not elect domicile there (excluding guest rooms or furnished tourist accommodation)
exonérations:
@ -21,7 +21,7 @@ Location meublée de tourisme classé:
titre: Furnished rental of classified tourism
explication: The property must have previously been declared to the municipality where it is located. At the end of this procedure, a declaration number (13 characters) is issued. Any change is subject to a new declaration.
Location de chambre d'hôtes:
Location de chambre d'hôtes:
titre: Rental of guest rooms
explication: You are a B&B rental company and meet the requirements of the Tourism Code
@ -52,7 +52,7 @@ Vente de biens occasionnelle:
exonérée sauf si:
- titre: You sell precious metals (gold, silver, ingots)
explication: For the transfer of precious metals, you are subject to the flat-rate tax on precious metals, which you must pay within one month of the transfer.
Vente de biens professionnelle:
titre: Sale of professional goods
explication: |
@ -74,5 +74,3 @@ Co-consommation:
- titre: You exceed the limit of the kilometric scale (for carpooling)
explication: |
When it comes to carpooling, there is a third condition: the full fare must not exceed the current kilometric rate and must be divided by the number of people transported, including the car owner.

View File

@ -24,7 +24,7 @@
> Vous louez à Paris, dans votre résidence principale, une chambre de 18 m² à un étudiant. Pour être exonéré d'impôt, le loyer mensuel hors charges ne doit pas dépasser en 2019 (187 x 18) / 12 = 280 €.
- titre: Location meublée de longue durée
icônes: 🏠 📆
explication: Vous avez loué un logement meublé de longue durée
explication: Vous avez loué un logement meublé de longue durée
plateformes:
- Leboncoin
- pap.fr

View File

@ -1,12 +1,14 @@
import { hasConditions } from './activitésData'
const filterActivités = (filter = () => true) => (state) =>
Object.entries(state)
.filter(
([activitéTitle, activitéData]) =>
activitéData.effectuée && filter(activitéData, activitéTitle)
)
.map(([activité]) => activité)
const filterActivités =
(filter = () => true) =>
(state) =>
Object.entries(state)
.filter(
([activitéTitle, activitéData]) =>
activitéData.effectuée && filter(activitéData, activitéTitle)
)
.map(([activité]) => activité)
export const nextActivitéSelector = (state, currentActivité) =>
filterActivités(

View File

@ -22,7 +22,7 @@ import { formatDay, formatMonth, Indicators, Indicator } from './utils'
import SatisfactionChart from './SatisfactionChart'
import { StatsStruct, PageChapter2, Page, PageSatisfaction } from './types'
const stats = (statsJson as unknown) as StatsStruct
const stats = statsJson as unknown as StatsStruct
type Period = 'mois' | 'jours'
type Chapter2 = PageChapter2 | 'PAM'

View File

@ -103,9 +103,9 @@ function simulation(
unfoldedStep: null,
}
case 'BATCH_UPDATE_SITUATION': {
return (Object.entries(action.situation as any) as Array<
[Names, unknown]
>).reduce<Simulation | null>(
return (
Object.entries(action.situation as any) as Array<[Names, unknown]>
).reduce<Simulation | null>(
(newState, [fieldName, value]) =>
simulation(newState, {
type: 'UPDATE_SITUATION',

View File

@ -97,21 +97,21 @@ const QUESTION_LIST: Array<Question> = keys(
mergeAll(flatten(Object.values(LEGAL_STATUS_DETAILS)))
)
const isCompatibleStatusWith = (answers: any) => (
statusRequirements: LegalStatusRequirements
): boolean => {
const stringify = map((x) => (!isNil(x) ? JSON.stringify(x) : x))
const answerCompatibility = Object.values(
mergeWith(
(answer, statusValue) =>
isNil(answer) || isNil(statusValue) || answer === statusValue,
stringify(statusRequirements as any),
stringify(answers)
const isCompatibleStatusWith =
(answers: any) =>
(statusRequirements: LegalStatusRequirements): boolean => {
const stringify = map((x) => (!isNil(x) ? JSON.stringify(x) : x))
const answerCompatibility = Object.values(
mergeWith(
(answer, statusValue) =>
isNil(answer) || isNil(statusValue) || answer === statusValue,
stringify(statusRequirements as any),
stringify(answers)
)
)
)
const isCompatibleStatus = answerCompatibility.every((x) => x !== false)
return isCompatibleStatus
}
const isCompatibleStatus = answerCompatibility.every((x) => x !== false)
return isCompatibleStatus
}
const possibleStatus = (
answers: Array<LegalStatusRequirements> | LegalStatusRequirements
): Record<LegalStatus, boolean> =>
@ -140,24 +140,23 @@ export const nextQuestionSelector = (state: RootState): Question | null => {
).filter(isCompatibleStatusWith(legalStatusRequirements) as any)
const unansweredQuestions = difference(QUESTION_LIST, questionAnswered)
const shannonEntropyByQuestion = unansweredQuestions.map((question): [
typeof question,
number
] => {
const answerPopulation = Object.values(possibleStatusList).map(
(status: any) => status[question]
)
const frequencyOfAnswers = Object.values(
countBy(
(x) => x,
answerPopulation.filter((x) => x !== undefined)
const shannonEntropyByQuestion = unansweredQuestions.map(
(question): [typeof question, number] => {
const answerPopulation = Object.values(possibleStatusList).map(
(status: any) => status[question]
)
).map((numOccurrence) => numOccurrence / answerPopulation.length)
const shannonEntropy = -frequencyOfAnswers
.map((p) => p * Math.log2(p))
.reduce(add, 0)
return [question, shannonEntropy]
})
const frequencyOfAnswers = Object.values(
countBy(
(x) => x,
answerPopulation.filter((x) => x !== undefined)
)
).map((numOccurrence) => numOccurrence / answerPopulation.length)
const shannonEntropy = -frequencyOfAnswers
.map((p) => p * Math.log2(p))
.reduce(add, 0)
return [question, shannonEntropy]
}
)
const sortedPossibleNextQuestions = sortBy(
([, entropy]) => -entropy,

View File

@ -1,9 +1,8 @@
import * as Sentry from '@sentry/react'
import { Integrations } from '@sentry/tracing'
let branch: string | undefined = process.env.GITHUB_REF?.split('/')?.slice(
-1
)?.[0]
let branch: string | undefined =
process.env.GITHUB_REF?.split('/')?.slice(-1)?.[0]
if (branch === 'merge') {
branch = process.env.GITHUB_HEAD_REF
@ -28,8 +27,7 @@ export const productionMode = ['master', 'next'].includes(branch ?? '')
if (productionMode) {
Sentry.init({
dsn:
'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615',
dsn: 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615',
integrations: [new Integrations.BrowserTracing()],
release,
// Set tracesSampleRate to 1.0 to capture 100%

View File

@ -15,5 +15,4 @@ AGFF:
lien: http://www.agff-info.fr/
CNAV:
image: cnav.png
lien:
https://fr.wikipedia.org/wiki/Caisse_nationale_de_l%27assurance_vieillesse_des_travailleurs_salari%C3%A9s
lien: https://fr.wikipedia.org/wiki/Caisse_nationale_de_l%27assurance_vieillesse_des_travailleurs_salari%C3%A9s

View File

@ -1,3 +1,3 @@
env:
mocha: true
jest: true
jest: true

View File

@ -13,11 +13,8 @@ let runExamples = (examples, rule) =>
const situation = Object.entries(ex.situation).reduce(
(acc, [name, value]) => ({
...acc,
[disambiguateRuleReference(
engine.parsedRules,
rule.dottedName,
name
)]: value,
[disambiguateRuleReference(engine.parsedRules, rule.dottedName, name)]:
value,
}),
{}
)

View File

@ -35,7 +35,6 @@ ACRE:
entreprise . date de création: 01/06/2019
entreprise . ACRE: oui
activité mixte:
- dirigeant . auto-entrepreneur . chiffre d'affaires: 20000 €/an
entreprise . activité . mixte: oui
@ -45,4 +44,3 @@ activité mixte:
- dirigeant . auto-entrepreneur . chiffre d'affaires: 20000 €/an
entreprise . activité . mixte: oui
entreprise . activité: "'artisanale'"

View File

@ -49,19 +49,18 @@ conjoint collaborateur:
dirigeant . rémunération . nette: 50000 €/an
dirigeant . indépendant . conjoint collaborateur: oui
- <<: *conjoint-collab
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
- <<: *conjoint-collab
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: "'moitié'"
- <<: *conjoint-collab
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'"
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'"
- <<: *conjoint-collab
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'"
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'"
dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: "'moitié'"
- <<: *conjoint-collab
dirigeant . rémunération . nette: 500000 €/an
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'"
cotisations facultatives:
# Cas retraite: la cotisation Madelin est inferieure au plafond => le revenu net de
@ -69,12 +68,12 @@ cotisations facultatives:
# cotisations ne change pas:
- dirigeant . rémunération . totale: 30000 €/an
dirigeant . indépendant . cotisations facultatives: oui
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 3800 €/an # plafond: 10% PSS donc environ 4100
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 3800 €/an # plafond: 10% PSS donc environ 4100
# Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de
# cotisations est affecté car l'assiette des cotisations est plus élevée
- dirigeant . rémunération . totale: 30000 €/an
dirigeant . indépendant . cotisations facultatives: oui
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 5000 €/an # plafond: 10% PSS donc environ 4100
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 5000 €/an # plafond: 10% PSS donc environ 4100
# Cas mutuelle
- dirigeant . rémunération . totale: 30000 €/an
dirigeant . indépendant . cotisations facultatives: oui
@ -89,18 +88,16 @@ cotisations facultatives:
dirigeant . indépendant . cotisations facultatives: oui
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1500 €/an
dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an
# Cas madelin + PER grand
# Cas madelin + PER grand
- dirigeant . rémunération . totale: 300000 €/an
dirigeant . indépendant . cotisations facultatives: oui
dirigeant . indépendant . cotisations facultatives . PER: 3500 €/an
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1500 €/an
dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an
imposition à l'IS :
imposition à l'IS:
- entreprise . chiffre d'affaires: 100000 €/an
entreprise . imposition: "'IS'"
entreprise . imposition: "'IS'"
- entreprise . chiffre d'affaires: 100000 €/an
entreprise . imposition: "'IS'"
entreprise . imposition: "'IS'"
impôt . méthode de calcul: "'barème standard'"

View File

@ -47,13 +47,13 @@ Contrats Madelin:
- dirigeant . rémunération . totale: 30000 €/an
entreprise . charges: 10000 €/an
dirigeant . indépendant . cotisations facultatives: oui
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 3800 €/an # plafond: 10% PSS donc environ 4100
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 3800 €/an # plafond: 10% PSS donc environ 4100
# Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de
# cotisations est affecté car l'assiette des cotisations est plus élevée
- dirigeant . rémunération . totale: 30000 €/an
entreprise . charges: 10000 €/an
dirigeant . indépendant . cotisations facultatives: oui
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 5000 €/an # plafond: 10% PSS donc environ 4100
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 5000 €/an # plafond: 10% PSS donc environ 4100
# Cas mutuelle
- dirigeant . rémunération . totale: 30000 €/an
entreprise . charges: 10000 €/an

View File

@ -119,7 +119,6 @@ aides:
contrat salarié . ancienneté . date d'embauche: 01/03/2021
contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés . situation de handicap: oui
aides embauche covid:
- contrat salarié . ancienneté . date d'embauche: 01/08/2020
contrat salarié . jeune de moins de 26 ans: oui
@ -316,7 +315,6 @@ frais pro - transports personnels seul:
contrat salarié . déduction forfaitaire spécifique: oui
contrat salarié . déduction forfaitaire spécifique . taux: 20%
frais pro - abo transports + transports personnels:
- contrat salarié . rémunération . brut de base: 3200 €/mois
contrat salarié . frais professionnels . abonnement transports publics . montant: 80€/an

View File

@ -295,16 +295,14 @@ const traversePlancherNode: TraverseFunction<'plancher'> = (fn, node) => ({
},
})
const traverseRésoudreRéférenceCirculaireNode: TraverseFunction<'résoudre référence circulaire'> = (
fn,
node
) => ({
...node,
explanation: {
...node.explanation,
valeur: fn(node.explanation.valeur),
},
})
const traverseRésoudreRéférenceCirculaireNode: TraverseFunction<'résoudre référence circulaire'> =
(fn, node) => ({
...node,
explanation: {
...node.explanation,
valeur: fn(node.explanation.valeur),
},
})
const traversePlafondNode: TraverseFunction<'plafond'> = (fn, node) => ({
...node,

View File

@ -2,33 +2,35 @@ import { Evaluation, Unit } from './AST/types'
import { simplifyNodeUnit } from './nodeUnits'
import { formatUnit, serializeUnit } from './units'
export const numberFormatter = ({
style,
maximumFractionDigits = 2,
minimumFractionDigits = 0,
language,
}: {
style?: string
maximumFractionDigits?: number
minimumFractionDigits?: number
language?: string
}) => (value: number) => {
// When we format currency we don't want to display a single decimal digit
// ie 8,1€ but we want to display 8,10€
const adaptedMinimumFractionDigits =
style === 'currency' &&
maximumFractionDigits >= 2 &&
minimumFractionDigits === 0 &&
!Number.isInteger(value)
? 2
: minimumFractionDigits
return Intl.NumberFormat(language, {
export const numberFormatter =
({
style,
currency: 'EUR',
maximumFractionDigits,
minimumFractionDigits: adaptedMinimumFractionDigits,
}).format(value)
}
maximumFractionDigits = 2,
minimumFractionDigits = 0,
language,
}: {
style?: string
maximumFractionDigits?: number
minimumFractionDigits?: number
language?: string
}) =>
(value: number) => {
// When we format currency we don't want to display a single decimal digit
// ie 8,1€ but we want to display 8,10€
const adaptedMinimumFractionDigits =
style === 'currency' &&
maximumFractionDigits >= 2 &&
minimumFractionDigits === 0 &&
!Number.isInteger(value)
? 2
: minimumFractionDigits
return Intl.NumberFormat(language, {
style,
currency: 'EUR',
maximumFractionDigits,
minimumFractionDigits: adaptedMinimumFractionDigits,
}).format(value)
}
export const formatCurrency = (
nodeValue: number | undefined,
@ -168,9 +170,10 @@ export function serializeValue(
{ nodeValue, unit }: { nodeValue: Evaluation; unit?: Unit },
{ format }: { format: formatUnit }
) {
const serializedUnit = (unit && typeof nodeValue === 'number'
? serializeUnit(unit, nodeValue, format)
: ''
const serializedUnit = (
unit && typeof nodeValue === 'number'
? serializeUnit(unit, nodeValue, format)
: ''
)?.replace(/\s*\/\s*/g, '/')
return `${nodeValue} ${serializedUnit}`.trim()
}

View File

@ -2,19 +2,23 @@
The advantage of putting them here is to get prettier's JS formatting, since Nealrey doesn't support it https://github.com/kach/nearley/issues/310 */
import { normalizeDateString } from './date'
export let binaryOperation = (operationType) => ([A, , operator, , B]) => ({
[operator]: {
operationType,
explanation: [A, B],
},
})
export let binaryOperation =
(operationType) =>
([A, , operator, , B]) => ({
[operator]: {
operationType,
explanation: [A, B],
},
})
export let unaryOperation = (operationType) => ([operator, , A]) => ({
[operator]: {
operationType,
explanation: [number([{ value: '0' }]), A],
},
})
export let unaryOperation =
(operationType) =>
([operator, , A]) => ({
[operator]: {
operationType,
explanation: [number([{ value: '0' }]), A],
},
})
export let variable = ([firstFragment, nextFragment], _, reject) => {
const fragments = [firstFragment, ...nextFragment].map(({ value }) => value)

View File

@ -18,7 +18,7 @@ export type RecalculNode = {
const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) {
if (this.cache._meta.inRecalcul) {
return (defaultNode(null) as any) as RecalculNode & EvaluatedNode
return defaultNode(null) as any as RecalculNode & EvaluatedNode
}
const amendedSituation = node.explanation.amendedSituation

View File

@ -14,83 +14,82 @@ export type RésoudreRéférenceCirculaireNode = {
nodeKind: 'résoudre référence circulaire'
}
export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoudre référence circulaire'> = function (
node
) {
const originalCache = this.cache
let inversionNumberOfIterations = 0
export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoudre référence circulaire'> =
function (node) {
const originalCache = this.cache
let inversionNumberOfIterations = 0
const evaluateWithValue = (
n: number,
unit: Unit = { numerators: [], denominators: [] }
) => {
inversionNumberOfIterations++
this.resetCache()
const evaluateWithValue = (
n: number,
unit: Unit = { numerators: [], denominators: [] }
) => {
inversionNumberOfIterations++
this.resetCache()
this.parsedSituation[node.explanation.ruleToSolve] = {
unit: unit,
nodeKind: 'unité',
explanation: {
nodeKind: 'constant',
nodeValue: n,
type: 'number',
} as ConstantNode,
} as UnitéNode
return this.evaluate(node.explanation.valeur)
}
let nodeValue: number | null | undefined = null
const x0 = 0
let valeur = evaluateWithValue(x0)
const y0 = valeur.nodeValue as number
const unit = valeur.unit
const missingVariables = valeur.missingVariables
let i = 0
if (y0 !== null) {
// The `uniroot` function parameter. It will be called with its `min` and
// `max` arguments, so we can use our cached nodes if the function is called
// with the already computed x1 or x2.
const test = (x: number): number => {
if (x === x0) {
return y0 - x0
}
valeur = evaluateWithValue(x, unit)
const y = valeur.nodeValue
i++
return (y as number) - x
this.parsedSituation[node.explanation.ruleToSolve] = {
unit: unit,
nodeKind: 'unité',
explanation: {
nodeKind: 'constant',
nodeValue: n,
type: 'number',
} as ConstantNode,
} as UnitéNode
return this.evaluate(node.explanation.valeur)
}
const defaultMin = -1_000_000
const defaultMax = 100_000_000
let nodeValue: number | null | undefined = null
nodeValue = uniroot(test, defaultMin, defaultMax, 0.5, 30, 2)
}
const x0 = 0
let valeur = evaluateWithValue(x0)
this.cache = originalCache
const y0 = valeur.nodeValue as number
const unit = valeur.unit
const missingVariables = valeur.missingVariables
let i = 0
if (y0 !== null) {
// The `uniroot` function parameter. It will be called with its `min` and
// `max` arguments, so we can use our cached nodes if the function is called
// with the already computed x1 or x2.
const test = (x: number): number => {
if (x === x0) {
return y0 - x0
}
valeur = evaluateWithValue(x, unit)
const y = valeur.nodeValue
i++
return (y as number) - x
}
if (nodeValue === undefined) {
nodeValue = null
this.cache._meta.inversionFail = true
}
if (nodeValue !== null) {
valeur = evaluateWithValue(nodeValue, unit)
}
delete this.parsedSituation[node.explanation.ruleToSolve]
const defaultMin = -1_000_000
const defaultMax = 100_000_000
return {
...node,
unit,
nodeValue,
explanation: {
...node.explanation,
valeur,
inversionNumberOfIterations,
},
missingVariables,
nodeValue = uniroot(test, defaultMin, defaultMax, 0.5, 30, 2)
}
this.cache = originalCache
if (nodeValue === undefined) {
nodeValue = null
this.cache._meta.inversionFail = true
}
if (nodeValue !== null) {
valeur = evaluateWithValue(nodeValue, unit)
}
delete this.parsedSituation[node.explanation.ruleToSolve]
return {
...node,
unit,
nodeValue,
explanation: {
...node.explanation,
valeur,
inversionNumberOfIterations,
},
missingVariables,
}
}
}
export default function parseRésoudreRéférenceCirculaire(v, context: Context) {
return {

View File

@ -101,13 +101,12 @@ const equals = <T>(a: T, b: T) => {
}
}
export const removeOnce = <T>(
element: T,
eqFn: (a: T, b: T) => boolean = equals
) => (list: Array<T>): Array<T> => {
const index = list.findIndex((e) => eqFn(e, element))
return list.filter((_, i) => i !== index)
}
export const removeOnce =
<T>(element: T, eqFn: (a: T, b: T) => boolean = equals) =>
(list: Array<T>): Array<T> => {
const index = list.findIndex((e) => eqFn(e, element))
return list.filter((_, i) => i !== index)
}
const simplify = (
unit: Unit,

View File

@ -16,7 +16,6 @@ prévoyance obligatoire cadre:
statut cadre: non
valeur attendue: false
variable:
par défaut: oui
applicable comme mécanisme chainé:

View File

@ -1,4 +1,3 @@
arrondi oui:
formule:
valeur: 30.4167 jours
@ -24,7 +23,7 @@ arrondi décimales:
demie part:
formule:
valeur: 0.5 * 100.2
arrondi: oui
arrondi: oui
exemples:
- valeur attendue: 50
@ -48,7 +47,7 @@ cotisation retraite:
Arrondi:
formule:
valeur: cotisation retraite
arrondi: oui
arrondi: oui
exemples:
- nom: arrondi en dessous

View File

@ -27,7 +27,6 @@ Conversion de variable:
douches par mois: 30
valeur attendue: 45
unité attendue: kCo2/mois
Conversion de variable et expressions:
unité: kCo2/an

View File

@ -47,10 +47,9 @@ plancher:
exemples:
- valeur attendue: 2500
encadrement inférieur et supérieur:
formule:
somme:
somme:
- 500
- 400
plafond: 800

View File

@ -306,17 +306,16 @@ chaine de charactère:
chaine de charactère: "'je t'y vois'"
valeur attendue: je t'y vois
a: oui
b: 5
a . b: b + 5
a . c: b + 5
désambiguation du nom de règle 1:
formule: a . b
exemples:
exemples:
- valeur attendue: 10
désambiguation du nom de règle 2:
formule: a . c
exemples:
- valeur attendue: 15
exemples:
- valeur attendue: 15

View File

@ -9,13 +9,13 @@ test:
paramètre nommés:
formule: test
exemples:
- situation:
- situation:
test: cotisation . assiette
valeur attendue: 1000
- situation:
test: cotisation . taux employeur
valeur attendue: 4
cotisation 2:
formule:
multiplication:
@ -28,12 +28,11 @@ paramètre nommés imbriqués:
formule: cotisation 2 . assiette . plafond
exemples:
- valeur attendue: 100
paramètre nommé utilisé dans la règle:
formule:
valeur [ref assiette] : 500
abattement:
valeur [ref assiette]: 500
abattement:
valeur: assiette * 10%
plancher: 100
exemples:

View File

@ -1,16 +1,16 @@
fx:
fx:
x:
résoudre la référence circulaire: oui
valeur: fx
exemples:
- nom: affine
situation:
fx: 200 - x
situation:
fx: 200 - x
valeur attendue: 100
- nom: quadratique
situation:
situation:
fx: 0.2 * x * x - 400 * x + 500
valeur attendue: 2003.743
valeur attendue: 2003.743
# CF https://www.wolframalpha.com/input/?i=x%3D0.2x%C2%B2-400x%2B500
CA:
@ -18,17 +18,16 @@ CA:
plancher: 0
formule:
inversion numérique:
avec:
avec:
- net
net:
résoudre la référence circulaire: oui
unité:
formule: CA - 50% * net
formule: CA - 50% * net
net après impôt:
formule: 80% * net
net après impôt:
formule: 80% * net
unité:
cycle avec inversion et situation vide:
@ -59,7 +58,6 @@ cycle avec la règle du cycle fixée dans la situation:
- situation:
net: 1000
valeur attendue: 1500
# TODO : à corriger
# cycle avec une règle reliée fixée dans la situation:
# valeur: net

View File

@ -3,11 +3,10 @@ cotisation retraite:
valeur sans unité:
formule:
valeur: 100
unité:
unité:
exemples:
- unité attendue:
conversion d'unité:
formule:
valeur: 12 mois
@ -18,7 +17,7 @@ conversion d'unité:
unité chainée:
formule:
produit:
produit:
assiette: 10 €/mois
taux: 50%
unité: €/an

View File

@ -166,7 +166,7 @@ variations sans unité:
exemples:
- valeur attendue: 7
unité attendue: '%'
taux réduit:
variations dans un produit:
formule:
@ -184,4 +184,4 @@ variations dans un produit:
valeur attendue: 79.35
- situation:
taux réduit: non
valeur attendue: 120.75
valeur attendue: 120.75

View File

@ -3,8 +3,8 @@ applicable si:
description: >-
Renvoie `non` si la condition est égale à `non`. Renvoie la valeur sinon.
Permet de désactiver une règle ou une valeur.
Permet de désactiver une règle ou une valeur.
retourne: Valeur | non
exemples:
base: >-
@ -18,8 +18,8 @@ non applicable si:
description: >-
Renvoit `non` si la condition n'est pas égale à `non`
Permet de désactiver une règle ou une valeur.
Permet de désactiver une règle ou une valeur.
retourne: Valeur | non
exemples:
base: >-
@ -65,7 +65,7 @@ toutes ces conditions:
produit:
description: >-
C'est une multiplication adaptée pour exprimer au mieux les cotisations.
Sa propriété `assiette` est multipliée par un pourcentage `taux`, ou par un
`facteur` quand ce nom est plus approprié.
@ -111,7 +111,7 @@ variations:
`non`.
Ce mécanisme peut aussi être utilisé au sein d'un autre mécanisme avec des attributs,
Ce mécanisme peut aussi être utilisé au sein d'un autre mécanisme avec des attributs,
tel que `produit` ou `barème`.
arguments:
- si: condition à vérifier
@ -185,7 +185,7 @@ le maximum de:
mécanisme `encadrement`.
exemples:
base: >-
max:
max:
le maximum de:
- 50
- 100
@ -199,7 +199,7 @@ le minimum de:
Pour plafonner une valeur, préférer l'utilisation du mécanisme `encadrement`.
exemples:
base: >-
min:
min:
le minimum de:
- 50
- 100
@ -277,7 +277,6 @@ barème:
- taux: 0.6%
arrondi: oui
grille:
description: >-
C'est un barème sous la forme d'une grille de correspondance simple. C'est
@ -345,7 +344,7 @@ composantes:
méthode de calcul mais diffèrent selons certains paramètres. Pour ne pas
définir deux variables quasi-redondantes, on utilise ce mécanisme.
Cela permet d'avoir une écriture factorisée, plus facile à lire.
Cela permet d'avoir une écriture factorisée, plus facile à lire.
Dans les calculs, `composantes` se comporte **exactement comme une somme**.
La documentation, elle, sera adaptée pour montrer chaque composante.
@ -356,9 +355,9 @@ composantes:
Chaque composante peut également contenir un champs `attributs` de type objet
contenant les mécanismes chainés à appliquer à la composante en question.
Lorsque l'on utilise l'attribut `nom`, cela aboutit à la définition de règles
Lorsque l'on utilise l'attribut `nom`, cela aboutit à la définition de règles
imbriquées pour chacun des termes de la somme.
exemples:
base: >-
composante:
@ -368,36 +367,36 @@ composantes:
- taux: 2%
- taux: 4%
plafond: plafond sécurité sociale
Cotisations: >-
cotisation 1:
produit:
assiette: assiette de base
composantes:
- attributs:
nom: employeur
taux: 5%
- attributs:
nom: salarié
taux: 1%
cotisation 1:
produit:
assiette: assiette de base
composantes:
- attributs:
nom: employeur
taux: 5%
- attributs:
nom: salarié
taux: 1%
cotisations salariales :
somme:
- cotisation 1 . salarié
# ...
cotisations salariales :
somme:
- cotisation 1 . salarié
# ...
TVA: >-
prix:
produit:
assiette: 50
composantes:
- attributs:
nom: HT
- attributs:
nom: TVA
taux: 20%
prix:
produit:
assiette: 50
composantes:
- attributs:
nom: HT
- attributs:
nom: TVA
taux: 20%
vérification:
prix = prix . HT + prix . TVA
vérification:
prix = prix . HT + prix . TVA
abattement:
chainable: oui
@ -458,13 +457,12 @@ unité:
Permet de convertir explicitement une unité.
Affiche un avertissement si la conversion n'est pas possible à cause d'unités incompatibles.
exemples:
base: >-
salaire:
salaire:
valeur: 35 k€/an
unité: €/mois
par défaut:
chainable: oui
@ -472,19 +470,16 @@ par défaut:
Permet de donner une valeur par défaut pour le calcul, sans influer sur les variables manquantes retournées.
Utile dans le cas d'une situation incomplète où l'on veut quand même retourner une première estimation.
exemples:
base: >-
prix TTC:
prix TTC:
assiette: prix HT * (100% + TVA)
TVA:
TVA:
par défaut: 20%
synchronisation:
description: >-
description: >-
Permet de récupérer certaines informations, telles que les
codes postaux des villes, à partir d'APIs externes, telles que l'[API
des communes de France](https://geo.api.gouv.fr/decoupage-administratif/communes).
@ -527,34 +522,33 @@ inversion numérique:
résoudre la référence circulaire:
description: |
Active le calcul itératif pour trouver la valeur de la règle qui résout
Active le calcul itératif pour trouver la valeur de la règle qui résout
la référence circulaire.
Il est possible pour une règle de se référencer elle-même. Par défaut, le
Il est possible pour une règle de se référencer elle-même. Par défaut, le
moteur considère qu'il s'agit d'un cycle non voulu, et renvoie 'null' comme valeur
pour la règle en question, en affichant un avertissement.
Mais dans certains cas, la formule est bonne et le cycle est voulu. La valeur de la
Mais dans certains cas, la formule est bonne et le cycle est voulu. La valeur de la
règle attendue est donc celle qui résout l'équation obtenue via la référence cyclique.
Lorsque l'on active cette fonctionnalité, le moteur va procéder par essai-erreur jusqu'à
Lorsque l'on active cette fonctionnalité, le moteur va procéder par essai-erreur jusqu'à
trouver cette valeur.
Note : la résolution de cycle est coûteuse en temps de calcul. Il faut donc veiller à
ne pas la cumuler avec l'évaluation d'un autre mécanisme coûteux comme l'inversion numérique
par exemple.
exemples:
base: >-
x:
x:
valeur: 4 * x - 5
résoudre la référence circulaire: oui
calcul du revenu professionnel: >-
chiffre d'affaires: 10000 €/an
cotisations: 25% * revenu professionnel
revenu professionnel:
revenu professionnel:
valeur: chiffre d'affaires - cotisations
résoudre la référence circulaire: oui

View File

@ -1,8 +1,8 @@
douche:
titre: Impact carbone d'une douche
description: Impact carbone liée aux douches prise au cours de l'année
icônes: 🚿 🍃
note: A titre de comparaison, l'empreinte carbone d'un burger est estimée à 0.279kg
icônes: 🚿 🍃
note: A titre de comparaison, l'empreinte carbone d'un burger est estimée à 0.279kg
unité: kgCO2eq / an
valeur: fréquence * impact par litre * litres consommés
@ -14,9 +14,8 @@ douche . fréquence:
5 par semaine: 5 douche/semaine * 52 semaines/an # Publicodes ne gère pas encore nativement l'unité semaine
2 par jour: 2 douche/jour
douche . impact par litre:
somme:
somme:
- eau . impact par litre froid
- chauffage . impact par litre
@ -34,7 +33,6 @@ chauffage:
chauffage . type:
par défaut: "'électricité'"
chauffage . impact par kWh:
notes: |
La base carbone de l'ADEME ne permet malheureusement pas de faire des liens profonds vers les chiffres utilisés.
@ -50,7 +48,7 @@ chauffage . énergie consommée par litre:
analyse du prix d'une douche: https://www.econologie.com/forums/plomberie-et-sanitaire/prix-reel-d-un-bain-ou-d-une-douche-pour-l-eau-et-chauffage-t12727.html
chauffage . impact par litre:
produit:
produit:
assiette: 0.0325 kWh/litre
facteur:
unité: kgCO2eq/kWh
@ -60,13 +58,13 @@ chauffage . impact par litre:
- si: type = 'fioul'
alors: 0.324
- si: type = 'électricité'
alors: 0.059
alors: 0.059
douche . litres consommés:
produit:
assiette: durée moyenne
facteur: débit
douche . durée moyenne:
question: Combien de temps dure votre douche en général ?
par défaut: 10 min/douche
@ -74,14 +72,14 @@ douche . durée moyenne:
expresse: 5 min/douche
moyenne: 10 min/douche
lente: 20 min/douche
douche . débit:
valeur: 18 litre/min
références:
économise l'eau: https://www.jeconomiseleau.org/index.php/particuliers/economies-par-usage/la-douche-et-le-bain
douche . pomme de douche économe:
remplace:
remplace:
règle: débit
par: 9 litre/min
question: Utilisez-vous une pomme de douche économe ?

View File

@ -8,8 +8,7 @@ import 'regenerator-runtime/runtime'
import App from './components/App'
Sentry.init({
dsn:
'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615',
dsn: 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615',
integrations: [new Integrations.BrowserTracing()],
// Set tracesSampleRate to 1.0 to capture 100%

View File

@ -1,7 +1,7 @@
{
"applicable si": {
"chainable": "oui",
"description": "Renvoie `non` si la condition est égale à `non`. Renvoie la valeur sinon.\nPermet de désactiver une règle ou une valeur. ",
"description": "Renvoie `non` si la condition est égale à `non`. Renvoie la valeur sinon.\nPermet de désactiver une règle ou une valeur.",
"retourne": "Valeur | non",
"exemples": {
"base": "ancienneté: 4 mois prime de vacances:\n applicable si: ancienneté >= 1 an\n valeur: 200€"
@ -9,7 +9,7 @@
},
"non applicable si": {
"chainable": "oui",
"description": "Renvoit `non` si la condition n'est pas égale à `non`\nPermet de désactiver une règle ou une valeur. ",
"description": "Renvoit `non` si la condition n'est pas égale à `non`\nPermet de désactiver une règle ou une valeur.",
"retourne": "Valeur | non",
"exemples": {
"base": "ancienneté: 4 mois prime de vacances:\n non applicable si: ancienneté < 1 an\n valeur: 200€"
@ -46,7 +46,7 @@
}
},
"variations": {
"description": "Contient une liste de conditions (`si`) et leurs conséquences associées (`alors`), ainsi qu'un cas par défaut (`sinon`).\n\nPour la première condition vraie dans la liste, on retient la valeur qui lui est associée.\n\nSi aucune condition n'est vraie, alors ce mécanisme renvoie implicitement `non`.\n\nCe mécanisme peut aussi être utilisé au sein d'un autre mécanisme avec des attributs, tel que `produit` ou `barème`.",
"description": "Contient une liste de conditions (`si`) et leurs conséquences associées (`alors`), ainsi qu'un cas par défaut (`sinon`).\n\nPour la première condition vraie dans la liste, on retient la valeur qui lui est associée.\n\nSi aucune condition n'est vraie, alors ce mécanisme renvoie implicitement `non`.\n\nCe mécanisme peut aussi être utilisé au sein d'un autre mécanisme avec des attributs, tel que `produit` ou `barème`.",
"arguments": [
{
"si": "condition à vérifier",
@ -76,13 +76,13 @@
"le maximum de": {
"description": "Renvoie la valeur numérique de la liste de propositions fournie qui est la plus grande.\n\nPour ajouter un plancher à une valeur, préférer l'utilisation du mécanisme `encadrement`.",
"exemples": {
"base": "max: \n le maximum de:\n - 50\n - 100"
"base": "max:\n le maximum de:\n - 50\n - 100"
}
},
"le minimum de": {
"description": "Renvoie la valeur numérique de la liste de propositions fournie qui est la plus petite.\n\nPour plafonner une valeur, préférer l'utilisation du mécanisme `encadrement`.",
"exemples": {
"base": "min: \n le minimum de:\n - 50\n - 100"
"base": "min:\n le minimum de:\n - 50\n - 100"
}
},
"arrondi": {
@ -119,11 +119,11 @@
}
},
"composantes": {
"description": "Beaucoup de cotisations sont composées de deux parties qui partagent la méthode de calcul mais diffèrent selons certains paramètres. Pour ne pas définir deux variables quasi-redondantes, on utilise ce mécanisme.\nCela permet d'avoir une écriture factorisée, plus facile à lire. \nDans les calculs, `composantes` se comporte **exactement comme une somme**. La documentation, elle, sera adaptée pour montrer chaque composante.\nIl est possible par exemple pour le mécanisme `produit` de garder en commun l'assiette, et de déclarer des composantes pour le taux.\nChaque composante peut également contenir un champs `attributs` de type objet contenant les mécanismes chainés à appliquer à la composante en question.\nLorsque l'on utilise l'attribut `nom`, cela aboutit à la définition de règles imbriquées pour chacun des termes de la somme.\n ",
"description": "Beaucoup de cotisations sont composées de deux parties qui partagent la méthode de calcul mais diffèrent selons certains paramètres. Pour ne pas définir deux variables quasi-redondantes, on utilise ce mécanisme.\nCela permet d'avoir une écriture factorisée, plus facile à lire.\nDans les calculs, `composantes` se comporte **exactement comme une somme**. La documentation, elle, sera adaptée pour montrer chaque composante.\nIl est possible par exemple pour le mécanisme `produit` de garder en commun l'assiette, et de déclarer des composantes pour le taux.\nChaque composante peut également contenir un champs `attributs` de type objet contenant les mécanismes chainés à appliquer à la composante en question.\nLorsque l'on utilise l'attribut `nom`, cela aboutit à la définition de règles imbriquées pour chacun des termes de la somme.",
"exemples": {
"base": "composante:\n produit:\n assiette: assiette de base\n composantes:\n - taux: 2%\n - taux: 4%\n plafond: plafond sécurité sociale",
"Cotisations": "cotisation 1:\n produit:\n assiette: assiette de base\n composantes:\n - attributs:\n nom: employeur\n taux: 5%\n - attributs:\n nom: salarié\n taux: 1%\n\ncotisations salariales :\n somme: \n - cotisation 1 . salarié\n # ...",
"TVA": "prix:\n produit:\n assiette: 50€\n composantes:\n - attributs:\n nom: HT\n - attributs:\n nom: TVA\n taux: 20%\n\nvérification:\n prix = prix . HT + prix . TVA "
"Cotisations": "cotisation 1:\n produit:\n assiette: assiette de base\n composantes:\n - attributs:\n nom: employeur\n taux: 5%\n - attributs:\n nom: salarié\n taux: 1%\n\ncotisations salariales :\n somme:\n - cotisation 1 . salarié\n # ...",
"TVA": "prix:\n produit:\n assiette: 50€\n composantes:\n - attributs:\n nom: HT\n - attributs:\n nom: TVA\n taux: 20%\n\nvérification:\n prix = prix . HT + prix . TVA"
}
},
"abattement": {
@ -159,14 +159,14 @@
"chainable": "oui",
"description": "Permet de convertir explicitement une unité.\n\nAffiche un avertissement si la conversion n'est pas possible à cause d'unités incompatibles.\n",
"exemples": {
"base": "salaire: \n valeur: 35 k€/an\n unité: €/mois"
"base": "salaire:\n valeur: 35 k€/an\n unité: €/mois"
}
},
"par défaut": {
"chainable": "oui",
"description": "Permet de donner une valeur par défaut pour le calcul, sans influer sur les variables manquantes retournées.\n\nUtile dans le cas d'une situation incomplète où l'on veut quand même retourner une première estimation.\n",
"exemples": {
"base": "prix TTC: \n assiette: prix HT * (100% + TVA)\nTVA: \n par défaut: 20%"
"base": "prix TTC:\n assiette: prix HT * (100% + TVA)\nTVA:\n par défaut: 20%"
}
},
"synchronisation": {
@ -177,10 +177,10 @@
"description": "Il est souhaitable de rédiger les règles de calcul en publicodes de la même façon qu'elles sont décrites dans la loi ou les interprétations administratives ou juridiques existantes. En conséquence, certaines variables n'auront donc pas de méthode de calcul clairement explicitée, il s'agira donc de la déduire des autres valeurs renseignées.\n\nDe façon simplifiée, il s'agira donc, à partir d'une règle existante explicitant `y = ƒ(x)` de calculer `x` à partir de `y`.\n\nL'inversion numérique permet d'estimer la valeur de la variable en question au plus près à partir d'un des _objectifs_, listés dans la propriété `avec`. Il faut alors renseigner une valeur cible pour ces objectifs.\n\nL'algorithme utilisé est la [méthode de Brent](https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Brent). L'idée générale est de prendre une valeur au hasard pour la variable en question, et d'améliorer mathématiquement le choix jusqu'à ce que les valeurs cibles soient toutes suffisamment proches des objectifs.\n\nSi on demande au moteur la valeur d'une variable qui a pour formule une inversion, il va vérifier qu'une des variables `avec` a bien une valeur (calculée ou saisie), et procéder à l'inversion décrite plus haut à partir de celle-ci. Sinon, ces possibilités d'inversions seront listées comme manquantes."
},
"résoudre la référence circulaire": {
"description": "Active le calcul itératif pour trouver la valeur de la règle qui résout \nla référence circulaire.\n\nIl est possible pour une règle de se référencer elle-même. Par défaut, le \nmoteur considère qu'il s'agit d'un cycle non voulu, et renvoie 'null' comme valeur\npour la règle en question, en affichant un avertissement.\n\nMais dans certains cas, la formule est bonne et le cycle est voulu. La valeur de la \nrègle attendue est donc celle qui résout l'équation obtenue via la référence cyclique.\n\nLorsque l'on active cette fonctionnalité, le moteur va procéder par essai-erreur jusqu'à \ntrouver cette valeur.\n\nNote : la résolution de cycle est coûteuse en temps de calcul. Il faut donc veiller à\nne pas la cumuler avec l'évaluation d'un autre mécanisme coûteux comme l'inversion numérique\npar exemple.\n",
"description": "Active le calcul itératif pour trouver la valeur de la règle qui résout\nla référence circulaire.\n\nIl est possible pour une règle de se référencer elle-même. Par défaut, le\nmoteur considère qu'il s'agit d'un cycle non voulu, et renvoie 'null' comme valeur\npour la règle en question, en affichant un avertissement.\n\nMais dans certains cas, la formule est bonne et le cycle est voulu. La valeur de la\nrègle attendue est donc celle qui résout l'équation obtenue via la référence cyclique.\n\nLorsque l'on active cette fonctionnalité, le moteur va procéder par essai-erreur jusqu'à\ntrouver cette valeur.\n\nNote : la résolution de cycle est coûteuse en temps de calcul. Il faut donc veiller à\nne pas la cumuler avec l'évaluation d'un autre mécanisme coûteux comme l'inversion numérique\npar exemple.\n",
"exemples": {
"base": "x: \n valeur: 4 * x - 5\n résoudre la référence circulaire: oui",
"calcul du revenu professionnel": "chiffre d'affaires: 10000 €/an\ncotisations: 25% * revenu professionnel\n \nrevenu professionnel: \n valeur: chiffre d'affaires - cotisations\n résoudre la référence circulaire: oui"
"base": "x:\n valeur: 4 * x - 5\n résoudre la référence circulaire: oui",
"calcul du revenu professionnel": "chiffre d'affaires: 10000 €/an\ncotisations: 25% * revenu professionnel\nrevenu professionnel:\n valeur: chiffre d'affaires - cotisations\n résoudre la référence circulaire: oui"
}
}
}

View File

@ -2,8 +2,9 @@ import { VariationNode } from 'publicodes/source/mecanisms/variations'
import Explanation from '../Explanation'
export default function Replacement(node: VariationNode) {
const applicableReplacement = node.explanation.find((ex) => ex.satisfied)
?.consequence
const applicableReplacement = node.explanation.find(
(ex) => ex.satisfied
)?.consequence
const replacedNode = node.explanation.slice(-1)[0].consequence
return <Explanation node={applicableReplacement || replacedNode} />
}