Merge branch 'master' into bundlesize

pull/918/head
Loic GUILLOIS 2020-03-10 11:41:40 +01:00 committed by GitHub
commit 94847f2932
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 1423 additions and 755 deletions

View File

@ -54,6 +54,7 @@
"react-router-dom": "^5.1.1",
"react-spring": "=8.0.27",
"react-syntax-highlighter": "^10.1.1",
"react-to-print": "^2.5.1",
"react-transition-group": "^2.2.1",
"react-virtualized": "^9.20.0",
"react-virtualized-select": "^3.1.3",

View File

@ -6,6 +6,7 @@ import artisteAuteur from './rules/artiste-auteur.yaml'
import base from './rules/base.yaml'
import conventionsCollectives from './rules/conventions-collectives.yaml'
import dirigeant from './rules/dirigeant.yaml'
import déclarationIndépendant from './rules/déclaration-revenu-indépendant.yaml'
import entrepriseEtablissement from './rules/entreprise-établissement.yaml'
import impot from './rules/impôt.yaml'
import protectionSociale from './rules/protection-sociale.yaml'
@ -17,6 +18,7 @@ const rules = {
// TODO: rule order shouldn't matter but there is a bug if "impot" is after
// "dirigeant".
...impot,
...déclarationIndépendant,
...artisteAuteur,
...dirigeant,
...entrepriseEtablissement,

View File

@ -366,7 +366,6 @@ dirigeant . rémunération totale:
somme:
- indépendant . revenu net de cotisations
- indépendant . cotisations et contributions
- (- situation personnelle . IJSS . total)
- si: auto-entrepreneur
alors:
inversion numérique:
@ -418,11 +417,7 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ACRE .
plafond: 100%
dirigeant . indépendant . revenu net de cotisations:
formule:
somme:
- revenu professionnel
- situation personnelle . IJSS . défiscalisées
- (- cotisations et contributions . CSG et CRDS .non déductible)
formule: revenu professionnel - cotisations et contributions . CSG et CRDS .non déductible
résumé: Avant déduction de l'impôt sur le revenu
question: Quel revenu avant impôt voulez-vous toucher ?
description: Il s'agit du revenu net de cotisations et de charges, avant le paiement de l'impôt sur le revenu.
@ -438,6 +433,7 @@ dirigeant . indépendant . revenu professionnel:
- revenu net après impôt
- entreprise . chiffre d'affaires
- entreprise . chiffre d'affaires minimum
valeurs négatives possibles: oui
dirigeant . indépendant . assiette des cotisations:
unité par défaut: €/an
@ -889,7 +885,7 @@ dirigeant . indépendant . cotisations et contributions . cotisations . retraite
- entreprise . catégorie d'activité = 'libérale'
- rattachement CIPAV = non
titre: taux spécifique profession libérale non reglementée
question: Avez-vous opté pour des taux spécifique de cotisation retraite complémentaire ?
question: Avez-vous opté pour des taux spécifiques de cotisation retraite complémentaire ?
description: |
Les professions libérales non règlementées qui ont débuté leur activité à compter du 1er janvier 2019 ou ceux qui ont débuté leur activité avant la date du 1er janvier 2019  et ont opté pour le régime général des travailleurs indépendants  ont la possibilité dopter pour des taux spécifique de la cotisation retraite complémentaire.
références:
@ -958,12 +954,12 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS:
- attributs:
nom: revenus de remplacement
impôt sur le revenu: non déductible
assiette: situation personnelle . IJSS . total
assiette: dirigeant . indépendant . IJSS . total
taux: 2.9%
- attributs:
nom: revenus de remplacement
impôt sur le revenu: déductible
assiette: situation personnelle . IJSS . total
assiette: dirigeant . indépendant . IJSS . total
taux: 3.8%
références:
@ -987,13 +983,20 @@ dirigeant . indépendant . revenus étrangers . montant:
par défaut: 0
dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette:
note: >-
Seule la partie imposable des IJSS est retranchée de l'assiette de la CSG,
puisque la partie non imposable a déjà été retranchée du revenu net fiscal fourni
formule:
somme:
- revenu professionnel
- cotisations
- conjoint collaborateur . cotisations
- (- revenus étrangers . montant)
- (- situation personnelle . IJSS . fiscalisées)
allègement:
assiette:
somme:
- revenu professionnel
- cotisations
- conjoint collaborateur . cotisations
abattement:
somme:
- revenus étrangers . montant
- dirigeant . indépendant . IJSS . imposable
dirigeant . indépendant . cotisations et contributions . formation professionnelle:
formule:
@ -1044,7 +1047,7 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ZFU:
plafond:
recalcul:
avec:
indépendant . revenu net de cotisations: 3042 heures/an * SMIC horaire
dirigeant . indépendant . revenu professionnel: 3042 heures/an * SMIC horaire
dirigeant . indépendant . cotisations et contributions . exonérations . âge:
question: Bénéficiez-vous du dispositif d'exonération "âge"
@ -1054,7 +1057,7 @@ dirigeant . indépendant . cotisations et contributions . exonérations . âge:
rend non applicable: cotisations . invalidité et décès
dirigeant . indépendant . cotisations et contributions . exonérations . invalidité:
question: Êtes-vous titulaire dune pension dinvalidité du régime des travailleurs indépendants ?
question: Êtes-vous titulaire dune pension dinvalidité à titre de travailleur indépendant ?
description: Les personnes titulaires dune pension dinvalidité versée par un régime des travailleurs non-salariés non agricoles bénéficient dune exonération totale des cotisations maladie et retraite complémentaire.
par défaut: non
rend non applicable:
@ -1111,3 +1114,64 @@ dirigeant . indépendant . cotisations et contributions . cotisations . maladie
multiplication:
assiette: maladie . assiette
taux: 14.5%
dirigeant . indépendant . IJSS:
titre: indemnités journalières de sécurité sociale
description: >-
En cas de maladie, maternité, ou accident, le régime général de Sécurité
sociale ainsi que les régimes spéciaux assurent 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
question: Avez-vous perçu des indemnités journalières de maladie, maternité ou paternité au titre de votre activité indépendante ?
par défaut: non
dirigeant . indépendant . IJSS . total:
titre: indemnités journalières
question: >-
Quel est le montant total brut de toutes vos indemnités journalières ?
description: >-
Indiquez uniquement le montant brut de vos revenus de remplacement,
imposables et non imposables qui figure sur le relevé de prestations fourni
pas votre caisse d'assurance maladie.
> Les revenus de remplacement sont : l'allocation forfaitaire de repos
maternel, l'indemnité journalière forfaitaire d'interruption d'activité,
l'indemnité de remplacement pour maternité, paternité ou adoption et
l'indemnité journalière maladie.
par défaut: 0
unité: €/an
dirigeant . indépendant . IJSS . imposable:
titre: indemnités journalières imposable
résumé: Uniquement si vous ne relevez pas du régime micro-fiscal
question: Quel est le montant brut des indemnités journalières imposables perçues?
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)**.
Ces revenus seront déduits de votre assiette des contributions, afin de ne
pas être soumis deux fois à la CSG-CRDS :
- Les revenus de remplacement qui ont été précomptés de la CSG-CRDS doivent
être indiqués pour leur montant net de la part de CSG déductible.
- Les revenus de remplacement qui nont pas été précomptés de la CSG-CRDS
doivent être indiqués pour leur montant brut tel que perçu.
> Les revenus de remplacement sont : l'allocation forfaitaire de repos
maternel, l'indemnité journalière forfaitaire d'interruption d'activité,
lindemnité de remplacement pour maternité, paternité ou adoption et
l'indemnité journalière maladie.
par défaut: 0
unité: €/an

View File

@ -0,0 +1,117 @@
# AIDE A LA DECLARATION DES INDEPENDANTS
aide déclaration revenu indépendant 2019:
description: >-
Ces règles calculent les montants demandés dans les déclarations sociale et
fiscale des indépendants de 2020 sur les revenus 2019
formule: non
aide déclaration revenu indépendant 2019 . nature de l'activité:
remplace: entreprise . catégorie d'activité
question: Quelle est la nature de votre activité ?
par défaut: commerciale ou industrielle
formule:
une possibilité:
choix obligatoire: oui
possibilités:
- artisanale
- commerciale ou industrielle
- libérale
références:
Vérifier la nature de son activité: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/verifier-nature-son-activite
Comment déterminer la nature de l'activité d'une entreprise ?: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32887
aide déclaration revenu indépendant 2019 . nature de l'activité . libérale:
remplace:
- règle: dirigeant . rattachement CIPAV
par: non
- entreprise . catégorie d'activité . libérale
titre: Libérale rattachée au régime général
description: |
Ce sont les professions "intellectuelles", qui ne sont rattachée à aucune
caisse spécifique de retraite.
C'est le cas de toutes les professions libérale non reglementée depuis le
1er janvier 2019.
références:
fiche Wikipedia: https://fr.m.wikipedia.org/wiki/Profession_libérale
aide déclaration revenu indépendant 2019 . nature de l'activité . commerciale ou industrielle:
remplace: entreprise . catégorie d'activité . commerciale ou industrielle
description: |
### Activité commerciale
- Achats de biens pour leur revente en l'état (commerce en gros ou de détail)
- Vente de prestations de services commerciales (location de matériel, transport, agence immobilière, hôtellerie-restauration, entreprise de spectacles, activité de sécurité privée, location, etc.)
### Activité industrielle
Activité de production ou de transformation grâce à l'utilisation d'outils industriels, extraction, industries minières, manutention, magasinage et stockage
aide déclaration revenu indépendant 2019 . nature de l'activité . artisanale:
remplace: entreprise . catégorie d'activité . artisanale
description: |
C'est une activité de service, de production, de transformation, ou de réparation exercée par un professionnel qualifié, et qui nécessite des compétences et un savoir-faire spécifiques.
> Par exemple : les travaux, les activités liées au bâtiment, la réparation de produits fournis par le client, les coiffeurs...
- L'entreprise ne doit pas employer plus de 10 salariés (l'activité devient commerciale au-delà)
- Les activités artisanales sont répertoriées par un décret
références:
liste des activités artisanales: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/activites-artisanales-0<Paste>
aide déclaration revenu indépendant 2019 . plafond sécurité sociale 2019:
remplace: plafond sécurité sociale temps plein
formule: 3377 €/mois
aide déclaration revenu indépendant 2019 . SMIC 2019:
remplace: SMIC horaire
formule: 10.03 €/heure
aide déclaration revenu indépendant 2019 . revenu net fiscal:
titre: revenu net fiscal
résumé: avant déduction des charges sociales et exonérations fiscales [A]
unité par défaut: €/an
formule: dirigeant . rémunération totale
aide déclaration revenu indépendant 2019 . CSG déductible:
titre: CSG déductible
résumé: '[B]'
formule: dirigeant . indépendant . cotisations et contributions . CSG et CRDS .déductible
aide déclaration revenu indépendant 2019 . cotisations sociales déductible:
titre: cotisations sociales obligatoires déductibles
résumé: '[C]'
description: >-
Montant à reporter dans la case XI de votre déclaration sociale et rubrique
326 du formulaire 2033-D-SD (pour le réel simplifié) ou rubrique A5 du
formulaire 2053-SD (pour le réel normal) de votre déclaration fiscale.
formule:
somme:
- dirigeant . indépendant . cotisations et contributions . cotisations
- dirigeant . indépendant . conjoint collaborateur . cotisations
- (- dirigeant . indépendant . cotisations et contributions . exonérations)
aide déclaration revenu indépendant 2019 . CFP:
résumé: contribution à la formation professionnelle [D]
formule: dirigeant . indépendant . cotisations et contributions . formation professionnelle
aide déclaration revenu indépendant 2019 . total charges sociales déductible:
titre: total charges sociales obligatoires déductibles fiscalement
résumé: '[B + C + D]'
formule:
somme:
- CSG déductible
- CFP
- cotisations sociales déductible
description: >-
Montant à reporter dans la rubrique 252 du formulaire 2033-B-SD (pour le
réel simplifié) ou en rubrique FZ du formulaire 2052-SD (pour le réel
normal) de votre déclaration fiscale.
aide déclaration revenu indépendant 2019 . assiette sociale:
titre: assiette sociale
résumé: 'pour information [A - (B + C + D)]'
formule:
allègement:
assiette: revenu net fiscal
abattement: total charges sociales déductible

View File

@ -3,7 +3,7 @@ entreprise:
Le contrat lie une entreprise, identifiée par un code SIREN, et un employé.
entreprise . date de création:
question: Quelle est la date de début d'activité ?
question: Quelle est votre date de début d'activité ?
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
@ -282,16 +282,17 @@ entreprise . taxe sur les salaires:
abattement: abattement associations
entreprise . catégorie d'activité:
question: Quelle est votre catégorie d'activité ?
titre: nature de l'activité
question: Quelle est la nature de votre activité ?
description: Votre catégorie d'activité va déterminer une grande partie des calculs de cotisation, contribution et impôt.
par défaut: commerciale ou industrielle
formule:
une possibilité:
choix obligatoire: oui
possibilités:
- libérale
- commerciale ou industrielle
- artisanale
- commerciale ou industrielle
- libérale
références:
Vérifier la nature de son activité: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/verifier-nature-son-activite
Comment déterminer la nature de l'activité d'une entreprise ?: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32887
@ -433,7 +434,7 @@ entreprise . catégorie d'activité . libérale règlementée . type d'activité
entreprise . catégorie d'activité . débit de tabac:
applicable si: catégorie d'activité = 'commerciale ou industrielle'
question: Votre entreprise est-elle un débit de tabac ?
question: Exercez-vous une activité de vente de tabac ?
par défaut: non
entreprise . rattachée à la CIPAV:

View File

@ -1,75 +1,21 @@
situation personnelle:
situation personnelle . RSA:
titre: allocataire RSA
question: Êtes-vous allocataire du RSA ?
titre: bénéficiaire RSA ou prime d'activité
question: >-
Etes-vous bénéficiaire du RSA ou de la prime dactivité ?
par défaut: non
situation personnelle . IJSS:
titre: indemnités journalières de sécurité sociale
description: |
En cas de maladie, maternité, ou accident, le régime général de Sécurité sociale ainsi que les régimes spéciaux assurent 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
question: Avez-vous touché des indemnités journalières de sécurité sociale (maladie, maternité, paternité, etc.) ?
par défaut: non
situation personnelle . IJSS . montant:
non applicable si: ALD
titre: indemnités journalières fiscalisées
par défaut: 0
question: Quel était leur montant total brut ?
unité par défaut: €/an
situation personnelle . IJSS . ALD:
question: Avez-vous touché des indemnités dans le cas d'une affection longue durée (ALD) dite "exonérante" ?
description:
L'affection longue durée (ALD) est mise en place par la loi du 13 août 2004 relative à l'assurance maladie. Ce statut offre aux personnes malades chroniques qui remplissent certaines conditions une prise en charge spécifique de leurs soins médicaux.
L'affection longue durée est une maladie de longue durée, présentant un caractère grave ou chronique et nécessitant un traitement long dont le coût est élevé.
La liste des ALD dites "exonérante" est disponible sur le site [ameli.fr](https://www.ameli.fr/assure/droits-demarches/maladie-accident-hospitalisation/affection-longue-duree-ald/affection-longue-duree-ald)
Les indemnité versée dans le cadre d'une ALD dites "éxonérante" ne sont pas imposable.
par défaut: non
situation personnelle . IJSS . ALD . autres indemnités:
question: Avez-vous également touché des indemnités non liées à votre ALD (maternité, paternité, autre maladie) ?
par défaut: non
situation personnelle . IJSS . ALD . autres indemnités . montant:
question: Quel était le montant de vos autres indemnités ?
par défaut: 0
unité: €/an
situation personnelle . IJSS . défiscalisées:
applicable si: ALD
titre: indemnités journalières défiscalisées
question: Quel était le montant de vos indemnités ALD ?
par défaut: 0
unité: €/an
situation personnelle . IJSS . fiscalisées:
titre: indemnités journalières fiscalisées
formule:
somme:
- IJSS . montant
- ALD . autres indemnités . montant
situation personnelle . IJSS . total:
titre: total indemnités journalières
formule:
somme:
- fiscalisées
- défiscalisées
situation personnelle . domiciliation fiscale à l'étranger:
description: |
Ces assurés ne sont pas redevables de la CSG/CRDS mais, en contrepartie ils sont redevables de la cotisation maladie sur la base dun taux plus elevé.
question: La résidence fiscale de l'assuré est-elle domiciliée à l'étranger ?
par défaut: non
rend non applicable:
description: >-
Ces assurés ne sont pas redevables de la CSG/CRDS mais, en contrepartie ils
sont redevables de la cotisation maladie sur la base dun taux plus elevé.
question: La résidence fiscale est-elle située à l'étranger ?
rend non applicable:
- dirigeant . indépendant . cotisations et contributions . CSG et CRDS
- contrat salarié . CSG
- contrat salarié . CRDS
- impôt
références:
par défaut: non
références:
urssaf.fr: https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/les-taux-de-cotisations/la-csg-crds/qui-en-est-redevable.html

View File

@ -1,6 +1,5 @@
import { usePersistingState } from 'Components/utils/persistState'
import Warning from 'Components/ui/WarningBlock'
import React from 'react'
import emoji from 'react-easy-emoji'
import { Trans } from 'react-i18next'
import { SitePaths } from './utils/withSitePaths'
@ -11,102 +10,66 @@ type SimulateurWarningProps = {
export default function SimulateurWarning({
simulateur
}: SimulateurWarningProps) {
let [folded, fold] = usePersistingState(
'app::simulateurs:warning-folded:v1:' + simulateur,
false
)
return (
<div
id="SimulateurWarning"
css={`
margin-bottom: 1rem;
`}
<Warning
localStorageKey={'app::simulateurs:warning-folded:v1:' + simulateur}
>
<p>
{emoji('🚩 ')}
<strong>
<Trans i18nKey="simulateurs.warning.titre">Avant de commencer...</Trans>
</strong>{' '}
{folded && (
<button
className="ui__ button simple small"
onClick={() => fold(false)}
>
<Trans i18nKey="simulateurs.warning.plus">Lire les précisions</Trans>
</button>
<ul>
{simulateur == 'auto-entrepreneur' && (
<>
<li>
<Trans i18nKey="simulateurs.warning.auto-entrepreneur">
{' '}
Les auto-entrepreneurs ne peuvent pas déduire leurs charges de
leur chiffre d'affaires. Il faut donc{' '}
<strong>
retrancher au net tous les coûts liés à l'entreprise pour
obtenir le revenu réellement perçu.
</strong>
</Trans>
</li>
<li>
<Trans i18nKey="simulateurs.warning.cfe">
Le simulateur n'intègre pas la cotisation foncière des
entreprise (CFE) qui est dûe dès la deuxième année d'exercice.
Son montant varie fortement en fonction du chiffre d'affaire et
de la domiciliation de l'entreprise.{' '}
<a href="https://www.service-public.fr/professionnels-entreprises/vosdroits/F23547">
Plus d'infos.
</a>
</Trans>
</li>
</>
)}
{simulateur !== 'artiste-auteur' && (
<li>
<Trans i18nKey="simulateurs.warning.urssaf">
Les calculs sont indicatifs et ne se substituent pas aux décomptes
réels des Urssaf, impots.gouv.fr, ou autres.
</Trans>
</li>
)}
</p>
{!folded && (
<div
className="ui__ card light-bg"
css="padding-top: 1rem; padding-bottom: 0.4rem"
>
<ul>
{simulateur == 'auto-entrepreneur' && (
<>
<li>
<Trans i18nKey="simulateurs.warning.auto-entrepreneur">
{' '}
Les auto-entrepreneurs ne peuvent pas déduire leurs charges
de leur chiffre d'affaires. Il faut donc{' '}
<strong>
retrancher au net tous les coûts liés à l'entreprise pour
obtenir le revenu réellement perçu.
</strong>
</Trans>
</li>
<li>
<Trans i18nKey="simulateurs.warning.cfe">
Le simulateur n'intègre pas la cotisation foncière des
entreprise (CFE) qui est dûe dès la deuxième année
d'exercice. Son montant varie fortement en fonction du
chiffre d'affaire et de la domiciliation de l'entreprise.{' '}
<a href="https://www.service-public.fr/professionnels-entreprises/vosdroits/F23547">
Plus d'infos.
</a>
</Trans>
</li>
</>
)}
{simulateur !== 'artiste-auteur' && (
<li>
<Trans i18nKey="simulateurs.warning.urssaf">
Les calculs sont indicatifs et ne se substituent pas aux
décomptes réels des Urssaf, impots.gouv.fr, ou autres.
</Trans>
</li>
)}
{simulateur === 'artiste-auteur' && (
<>
<li>
<Trans i18nKey="simulateurs.warning.artiste-auteur">
Cette estimation est proposée à titre indicatif. Elle est
faite à partir des éléments réglementaires applicables et
des éléments que vous avez saisis, mais elle ne tient pas
compte de l'ensemble de votre situation. Le montant réel de
vos cotisations peut donc être différent.
</Trans>
</li>
<li>
<Trans i18nKey="simlateurs.warning.artiste-auteur">
Ce simulateur permet d'estimer le montant de vos cotisations
pour l'année 2020 à partir de votre revenu projeté
</Trans>
</li>
</>
)}
</ul>
<div className="ui__ answer-group">
<button
className="ui__ button simple small"
onClick={() => fold(true)}
>
<Trans>J'ai compris</Trans>
</button>
</div>
</div>
)}
</div>
{simulateur === 'artiste-auteur' && (
<>
<li>
<Trans i18nKey="simulateurs.warning.artiste-auteur">
Cette estimation est proposée à titre indicatif. Elle est faite
à partir des éléments réglementaires applicables et des éléments
que vous avez saisis, mais elle ne tient pas compte de
l'ensemble de votre situation. Le montant réel de vos
cotisations peut donc être différent.
</Trans>
</li>
<li>
<Trans i18nKey="simlateurs.warning.artiste-auteur">
Ce simulateur permet d'estimer le montant de vos cotisations
pour l'année 2020 à partir de votre revenu projeté
</Trans>
</li>
</>
)}
</ul>
</Warning>
)
}

View File

@ -1,9 +1,8 @@
import { explainVariable } from 'Actions/actions'
import Animate from 'Components/ui/animate'
import Overlay from 'Components/Overlay'
import { Markdown } from 'Components/utils/markdown'
import { findRuleByDottedName } from 'Engine/rules'
import React from 'react'
import emoji from 'react-easy-emoji'
import { useDispatch, useSelector } from 'react-redux'
import { RootState } from 'Reducers/rootReducer'
import { flatRulesSelector } from 'Selectors/analyseSelectors'
@ -17,45 +16,29 @@ export default function Aide() {
const stopExplaining = () => dispatch(explainVariable())
if (!explained) return <section id="helpWrapper" />
if (!explained) return null
let rule = findRuleByDottedName(flatRules, explained),
text = rule.description,
refs = rule.références
return (
<Animate.fromTop>
<Overlay onClose={stopExplaining}>
<div
css={`
display: flex;
align-items: center;
img {
margin: 0 1em 0 !important;
width: 1.6em !important;
height: 1.6em !important;
}
padding: 0.6rem;
`}
>
{emoji('')}
<div
className="controlText ui__ card"
css="padding: 0.6rem 0; flex: 1;"
>
<h4>{rule.title}</h4>
<p>
<Markdown source={text} />
</p>
{refs && (
<div>
<References refs={refs} />
</div>
)}
<button className="hide" aria-label="close" onClick={stopExplaining}>
×
</button>
</div>
<h2>{rule.title}</h2>
<p>
<Markdown source={text} />
</p>
{refs && (
<div>
<References refs={refs} />
</div>
)}
</div>
</Animate.fromTop>
</Overlay>
)
}

View File

@ -1,6 +1,6 @@
import { goToQuestion, validateStepWithValue } from 'Actions/actions'
import QuickLinks from 'Components/QuickLinks'
import InputComponent from 'Engine/RuleInput'
import RuleInput from 'Engine/RuleInput'
import { findRuleByDottedName } from 'Engine/rules'
import React from 'react'
import emoji from 'react-easy-emoji'
@ -44,7 +44,7 @@ export default function Conversation({ customEndMessages }: ConversationProps) {
setDefault()
}
}
const DecoratedInputComponent = FormDecorator(InputComponent)
const DecoratedInputComponent = FormDecorator(RuleInput)
return flatRules && nextSteps.length ? (
<>

View File

@ -1,3 +1,8 @@
@media print {
.explicable {
display: none;
}
}
.explicable .icon {
display: inline-block;
padding: 0.15rem 0.6rem;
@ -12,7 +17,6 @@
filter: brightness(90%);
}
.variantLeaf .explicable .icon img {
width: 1.5em !important;
height: 1.5em !important;

View File

@ -1,5 +1,4 @@
import { explainVariable } from 'Actions/actions'
import classNames from 'classnames'
import { findRuleByDottedName } from 'Engine/rules'
import React, { useContext } from 'react'
import emoji from 'react-easy-emoji'
@ -25,23 +24,22 @@ export default function Explicable({ dottedName }: { dottedName: DottedName }) {
//TODO montrer les variables de type 'une possibilité'
return dottedName === explained ? null : (
<span
className={classNames('explicable', {
explained: dottedName === explained
})}
return (
<button
className="ui__ link-button"
onClick={e => {
tracker.push(['trackEvent', 'help', dottedName])
dispatch(explainVariable(dottedName))
e.preventDefault()
e.stopPropagation()
}}
css={`
margin-left: 0.3rem !important;
vertical-align: middle;
font-size: 110% !important;
`}
>
<span
className="icon"
onClick={e => {
tracker.push(['trackEvent', 'help', dottedName])
dispatch(explainVariable(dottedName))
e.preventDefault()
e.stopPropagation()
}}
>
{emoji('')}
</span>
</span>
{emoji('')}
</button>
)
}

View File

@ -125,6 +125,15 @@
border: 1px solid var(--color);
color: var(--textColor) !important;
}
@media print {
.step label.userAnswerButton.selected {
border: none;
}
.step label.userAnswerButton:not(.selected) {
display: none;
}
}
@media (hover) {
.step label.userAnswerButton:hover:not(.selected) {
background: var(--color);

View File

@ -23,14 +23,6 @@ questions:
liste noire:
- entreprise . charges
# TODO : quand les questions indeps sont validés, enlever le block ci-dessous de la liste noire
- entreprise . catégorie d'activité . débit de tabac
- établissement . ZFU
- dirigeant . indépendant . cotisations et contributions . exonérations . âge
- dirigeant . indépendant . cotisations et contributions . cotisations . retraite complémentaire . taux spécifique PLNR
- dirigeant . indépendant . cotisations et contributions . exonérations . invalidité
- dirigeant . indépendant . revenus étrangers
- situation personnelle . IJSS
- situation personnelle . domiciliation fiscale à l'étranger
non prioritaires:
- entreprise . catégorie d'activité . débit de tabac
- entreprise . ZFU

View File

@ -0,0 +1,55 @@
import { usePersistingState } from 'Components/utils/persistState'
import React, { ReactNode } from 'react'
import emoji from 'react-easy-emoji'
import { Trans } from 'react-i18next'
type WarningProps = {
localStorageKey: string
children: ReactNode
}
export default function Warning({ localStorageKey, children }: WarningProps) {
let [folded, fold] = usePersistingState(localStorageKey, false)
return (
<div
css={`
margin-bottom: 1rem;
`}
>
<p>
{emoji('🚩 ')}
<strong>
<Trans i18nKey="simulateurs.warning.titre">
Avant de commencer...
</Trans>
</strong>{' '}
{folded && (
<button
className="ui__ button simple small"
onClick={() => fold(false)}
>
<Trans i18nKey="simulateurs.warning.plus">
Lire les précisions
</Trans>
</button>
)}
</p>
{!folded && (
<div
className="ui__ card light-bg"
css="padding-top: 1rem; padding-bottom: 0.4rem"
>
{children}
<div className="ui__ answer-group">
<button
className="ui__ button simple small"
onClick={() => fold(true)}
>
<Trans>J'ai compris</Trans>
</button>
</div>
</div>
)}
</div>
)
}

View File

@ -3,8 +3,12 @@ import { useEffect, useRef, useState } from 'react'
export default function({
root = null,
rootMargin,
threshold = 0
}: IntersectionObserverInit): [React.RefObject<HTMLDivElement>, boolean] {
threshold = 0,
unobserve = true
}: IntersectionObserverInit & { unobserve?: boolean }): [
React.RefObject<HTMLDivElement>,
boolean
] {
const ref = useRef<HTMLDivElement>(null)
const [wasOnScreen, setWasOnScreen] = useState(false)
@ -13,7 +17,10 @@ export default function({
([entry]) => {
if (entry.isIntersecting) {
setWasOnScreen(entry.isIntersecting)
ref.current && observer.unobserve(ref.current)
ref.current && unobserve && observer.unobserve(ref.current)
}
if (!entry.isIntersecting && !unobserve) {
setWasOnScreen(entry.isIntersecting)
}
},
{
@ -27,9 +34,9 @@ export default function({
observer.observe(node)
}
return () => {
node && observer.unobserve(node)
node && unobserve && observer.unobserve(node)
}
}, [root, rootMargin, threshold])
}, [root, rootMargin, threshold, ref.current])
return [ref, wasOnScreen]
}

View File

@ -24,6 +24,7 @@ type Props = {
onChange: (value: Value) => void
useSwitch?: boolean
isTarget?: boolean
autoFocus?: boolean
value?: Value
className?: string
onSubmit?: (value: Value) => void
@ -33,13 +34,14 @@ type Props = {
// be displayed to get a user input through successive if statements
// That's not great, but we won't invest more time until we have more diverse
// input components and a better type system.
export default function InputComponent({
export default function RuleInput({
rules,
dottedName,
onChange,
value,
useSwitch = false,
isTarget = false,
autoFocus = false,
className,
onSubmit
}: Props) {
@ -53,6 +55,7 @@ export default function InputComponent({
value,
onChange,
onSubmit,
autoFocus,
className,
title: rule.title,
question: rule.question,

View File

@ -127,11 +127,11 @@ export let defaultNode = nodeValue => ({
export let parseObject = (recurse, objectShape, value) => {
let recurseOne = key => defaultValue => {
if (!value[key] && !defaultValue)
if (value[key] == null && !defaultValue)
throw new Error(
`Il manque une clé '${key}' dans ${JSON.stringify(value)} `
)
return value[key] ? recurse(value[key]) : defaultValue
return value[key] != null ? recurse(value[key]) : defaultValue
}
let transforms = fromPairs(map(k => [k, recurseOne(k)], keys(objectShape)))
return evolve(transforms, objectShape)

View File

@ -202,10 +202,10 @@ let doInversion = (oldCache, situationGate, parsedRules, v, dottedName) => {
return v
}
// si fx renvoie null pour une valeur numérique standard, disons 1000, on peut
// si fx renvoie null pour une valeur numérique standard, disons 2000, on peut
// considérer que l'inversion est impossible du fait de variables manquantes
// TODO fx peut être null pour certains x, et valide pour d'autres : on peut implémenter ici le court-circuit
let attempt = fx(1000)
let attempt = fx(2000)
if (attempt.nodeValue == null) {
return attempt
}
@ -217,19 +217,12 @@ let doInversion = (oldCache, situationGate, parsedRules, v, dottedName) => {
let y = fx(x)
return y.nodeValue - fixedObjectiveValue
},
0.1,
1000000000,
v['valeurs négatives possibles'] === 'oui' ? -1000000 : 0,
10000000,
tolerance,
10
)
// Si aucune des valeurs ne fonctionne, on test la valeur 0.
if (nodeValue == null) {
attempt = fx(0)
if (Math.abs(attempt.nodeValue - fixedObjectiveValue) < 0.1) {
nodeValue = 0
}
}
return {
nodeValue,
missingVariables: {},
@ -489,7 +482,7 @@ export let mecanismProduct = (recurse, k, v) => {
}
}
let mult = (base, rate, facteur, plafond) =>
Math.min(base, plafond) * rate * facteur
Math.min(base, plafond === false ? Infinity : plafond) * rate * facteur
const unit = inferUnit(
'*',
[assiette, taux, facteur].map(el => el.unit)

View File

@ -4,6 +4,7 @@
<0>Oui</0>: <0>Yes</0>
A quoi servent mes cotisations ?: What's included in my contributions?
Accueil: Home
Aide à la déclaration de revenus au titre de l'année 2019: Help with your 2019 income tax return
Alors: Then
Année d'activité: Years of activity
Assimilé salarié: '"Assimilé-salarié"'
@ -43,6 +44,7 @@ Entrée: Enter
Envoyer: Send
Exemples: Examples
Exemples de simulation de salaire: Examples of salary simulations
Exonérations: Exemptions
Explorez notre documentation: Explore our documentation
Faire une simulation: Launch a simulation
Fiche de paie: Payslip
@ -52,6 +54,7 @@ Gérant minoritaire: Managing director
Imprimer: Print
Impôts: Taxes
Indépendant: Independent
International: International
Intégrer l'interface de simulation: Integrate the simulation interface
Intégrer la bibliothèque de calcul: Integrate the calculation library
Intégrer nos simulateurs: Integrate our simulators
@ -100,10 +103,12 @@ Responsabilité limitée: Limited liability
Ressources utiles: Helpful resources
Retour: Back
Retour à la création: Back to creation
Retour à ma déclaration: Back to my statement
Retour à mon activité: Back to my business
Revenir à la documentation: Go back to documentation
Revenu (incluant les dépenses liées à l'activité): Revenue (including expenses related to the activity)
Revenu disponible: Disposable income
Récapitulatif: Summary
Rémunération du dirigeant: Director's remuneration
Répartition du chiffre d'affaires: Breakdown of turnover
Résultat: Result
@ -117,6 +122,7 @@ Si: If
Simulateur de salaire: Employee salary simulation
Simulations personnalisées: Customized simulations
Sinon: Else
Situation personnelle: Personal situation
Suivant: Next
Taux: Rate
Taux calculé: Calculated rate
@ -134,6 +140,26 @@ Votre adresse e-mail: Your email address
Votre entreprise: Your company
Votre forme juridique: Your legal status
aide: aid or subsidy
aide-déclaration-indépendant:
description: >-
<0>Help with your 2019 income tax return </0><1>This tool is a tax (income)
and social security (ISD) declaration aid for self-employed workers. It
allows you to find out the amount of social security charges deductible from
your net fiscal result.</1><2><0>This tool is for you if you are in any of
the following cases :</0><1><0>you contribute to the general scheme for
self-employed persons</0><1>your business is in the actual tax system and in
accrual accounting</1></1><2>It does not concern you if you are in one of
the following cases:</2><3><0>you are a regulated liberal
profession</0><1>you are a liberal profession contributing to the
CIPAV</1><2>your company is domiciled in the DOMs</2></3></2><3>What is your
professional income in 2019?</3><4>Indicate your net fiscal result before
deduction of social security charges and tax exemptions.</4>
entreprise:
description: You can fill in your company to pre-fill in the form
titre: <0>Company and activity</0>
results:
ongoing: Calculation in progress...
title: "Reporting help \U0001F4C4"
an: year
année: year
applicable si: applicable if
@ -677,6 +703,9 @@ gérant minoritaire:
titre: Chairman or managing director
gérer:
choix:
déclaration: >-
<0>Completing my tax return</0><1>Easily calculate the amounts to carry
forward on your 2019 tax return</1>
embauche: >
<0>Estimate the amount spent for hiring</0>
@ -721,6 +750,7 @@ gérer:
titre: Manage my business
heure: hour
heures: hours
imprimer: Print
impôt: tax
impôt sur le revenu: income tax
indemnité: benefit
@ -845,6 +875,9 @@ path:
exemples: /examples
index: /documentation
gérer:
déclaration-indépendant:
index: /declaration-aid-independent
récapitulatif: /summary
embaucher: /hiring
index: /manage
sécuritéSociale: /social-security
@ -858,7 +891,6 @@ path:
assimilé-salarié: /assimile-salarie
auto-entrepreneur: /auto-entrepreneur
comparaison: /social-scheme-comparaison
dnrti: /dnrti
index: /simulators
indépendant: /independant
salarié: /salaried

View File

@ -1,6 +1,160 @@
SMIC horaire:
titre.en: hourly minimum wage (SMIC)
titre.fr: SMIC horaire
aide déclaration revenu indépendant 2019:
description.en: >-
[automatic] These rules calculate the amounts claimed in the 2020 social and
tax returns of self-employed persons on the 2019 income 2019
description.fr: >-
Ces règles calculent les montants demandés dans les déclarations sociale et
fiscale des indépendants de 2020 sur les revenus 2019
titre.en: '[automatic] self-employment income assistance 2019'
titre.fr: aide déclaration revenu indépendant 2019
aide déclaration revenu indépendant 2019 . CFP:
résumé.en: '[automatic] contribution to vocational training [D]'
résumé.fr: 'contribution à la formation professionnelle [D]'
titre.en: '[automatic] PSC'
titre.fr: CFP
aide déclaration revenu indépendant 2019 . CSG déductible:
résumé.en: '[automatic] [B]'
résumé.fr: '[B]'
titre.en: '[automatic] deductible MSA'
titre.fr: CSG déductible
aide déclaration revenu indépendant 2019 . SMIC 2019:
titre.en: '[automatic] MINIMUM WAGE 2019'
titre.fr: SMIC 2019
aide déclaration revenu indépendant 2019 . assiette sociale:
résumé.en: '[automatic] for information [A - (B + C + D)].'
résumé.fr: 'pour information [A - (B + C + D)]'
titre.en: '[automatic] social base'
titre.fr: assiette sociale
aide déclaration revenu indépendant 2019 . cotisations sociales déductible:
description.en: >-
[automatic] Amount to be reported in Box XI of your social security return
and Item 326 of Form 2033-D-SD (for the simplified actual) or Item A5 of
Form 2053-SD (for the normal actual) of your tax return.
description.fr: >-
Montant à reporter dans la case XI de votre déclaration sociale et rubrique
326 du formulaire 2033-D-SD (pour le réel simplifié) ou rubrique A5 du
formulaire 2053-SD (pour le réel normal) de votre déclaration fiscale.
résumé.en: '[automatic] [C]'
résumé.fr: '[C]'
titre.en: '[automatic] deductible compulsory social security contributions'
titre.fr: cotisations sociales obligatoires déductibles
aide déclaration revenu indépendant 2019 . nature de l'activité:
question.en: '[automatic] What is the nature of your business?'
question.fr: Quelle est la nature de votre activité ?
titre.en: '[automatic] nature of business'
titre.fr: nature de l'activité
aide déclaration revenu indépendant 2019 . nature de l'activité . artisanale:
description.en: >
[automatic] It is a service, production, transformation, or repair activity
carried out by a qualified professional, and which requires specific skills
and know-how.
&gt; For example: works, activities related to the building, repair of
products supplied by the client, hairdressers, etc.
- The company must not employ more than 10 employees (the activity becomes
commercial beyond that).
- Craft activities are listed by a decree.
description.fr: >
C'est une activité de service, de production, de transformation, ou de
réparation exercée par un professionnel qualifié, et qui nécessite des
compétences et un savoir-faire spécifiques.
> Par exemple : les travaux, les activités liées au bâtiment, la réparation
de produits fournis par le client, les coiffeurs...
- L'entreprise ne doit pas employer plus de 10 salariés (l'activité devient
commerciale au-delà)
- Les activités artisanales sont répertoriées par un décret
titre.en: '[automatic] artisanal'
titre.fr: artisanale
aide déclaration revenu indépendant 2019 . nature de l'activité . commerciale ou industrielle:
description.en: >
[automatic] ### Commercial activity
- Purchases of goods for resale in the same condition (wholesale or retail
trade)
- Sale of commercial services (equipment rental, transport, real estate
agency, hotel and catering, entertainment business, private security
activity, rental, etc.).
### Industrial activity
Production or processing activity through the use of industrial tools,
extraction, mining, handling, storage and warehousing
description.fr: >
### Activité commerciale
- Achats de biens pour leur revente en l'état (commerce en gros ou de
détail)
- Vente de prestations de services commerciales (location de matériel,
transport, agence immobilière, hôtellerie-restauration, entreprise de
spectacles, activité de sécurité privée, location, etc.)
### Activité industrielle
Activité de production ou de transformation grâce à l'utilisation d'outils
industriels, extraction, industries minières, manutention, magasinage et
stockage
titre.en: '[automatic] commercial or industrial'
titre.fr: commerciale ou industrielle
aide déclaration revenu indépendant 2019 . nature de l'activité . libérale:
description.en: >
[automatic] These are the "intellectual" professions, which are not attached
to any
specific pension fund.
This has been the case for all unregulated professions since the
January 1, 2019.
description.fr: |
Ce sont les professions "intellectuelles", qui ne sont rattachée à aucune
caisse spécifique de retraite.
C'est le cas de toutes les professions libérale non reglementée depuis le
1er janvier 2019.
titre.en: '[automatic] Liberal attached to the general regime'
titre.fr: Libérale rattachée au régime général
aide déclaration revenu indépendant 2019 . plafond sécurité sociale 2019:
titre.en: '[automatic] social security ceiling 2019'
titre.fr: plafond sécurité sociale 2019
aide déclaration revenu indépendant 2019 . revenu net fiscal:
résumé.en: >-
[automatic] before deduction of social security charges and tax exemptions
[A].
résumé.fr: 'avant déduction des charges sociales et exonérations fiscales [A]'
titre.en: '[automatic] net taxable income'
titre.fr: revenu net fiscal
aide déclaration revenu indépendant 2019 . total charges sociales déductible:
description.en: >-
[automatic] Amount to be reported in Item 252 of Form 2033-B-SD (for
Simplified Actual) or Item FZ of Form 2052-SD (for Regular Actual) on your
tax return.
description.fr: >-
Montant à reporter dans la rubrique 252 du formulaire 2033-B-SD (pour le
réel simplifié) ou en rubrique FZ du formulaire 2052-SD (pour le réel
normal) de votre déclaration fiscale.
résumé.en: '[automatic] [B + C + D]'
résumé.fr: '[B + C + D]'
titre.en: '[automatic] total tax-deductible compulsory social security charges'
titre.fr: total charges sociales obligatoires déductibles fiscalement
artiste-auteur:
description.en: The artist-author regime
description.fr: Le régime des artistes-auteurs
@ -3394,6 +3548,86 @@ dirigeant . auto-entrepreneur . plafond:
dirigeant . indépendant:
titre.en: indépendant
titre.fr: indépendant
dirigeant . indépendant . IJSS:
description.en: >-
[automatic] In the event of illness, maternity or accident, the general
social security system and special schemes provide "cash" benefits.
These are per diems from Social Security (IJSS).
Compensation in addition to the Social Security daily allowances paid under
a provident fund contract does not constitute replacement income.
Note: Disability benefits paid by disability/death plans are not affected.
description.fr: >-
En cas de maladie, maternité, ou accident, le régime général de Sécurité
sociale ainsi que les régimes spéciaux assurent 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
question.en: >-
[automatic] Have you received daily allowances for sickness, maternity or
paternity as a result of your self-employed activity?
question.fr: "Avez-vous perçu des indemnités journalières de maladie, maternité ou paternité au titre de votre activité indépendante\_?"
titre.en: '[automatic] social security daily allowances'
titre.fr: indemnités journalières de sécurité sociale
dirigeant . indépendant . IJSS . imposable:
description.en: >-
[automatic] Indicate only the taxable replacement income received, i.e. all
replacement income received **except for daily allowances in connection with
a Long-Term Affection (LTA)**.
This income will be deducted from your contribution base, so as not to be
submitted twice to the CSG-CRDS :
- Replacement income that has been deducted from the CSG-CRDS must be shown
for the net amount of the deductible CSG share.
- Replacement income that has not been deducted from the CSG-CRDS must be
shown for the gross amount as received.
&gt; Replacement income is: the flat-rate maternal rest allowance, the
flat-rate daily allowance for interruption of activity, the replacement
allowance for maternity, paternity or adoption and the daily sickness
allowance.
description.fr: "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)**. \n\nCes revenus seront déduits de votre assiette des contributions, afin de ne pas être soumis deux fois à la CSG-CRDS\_:\n- Les revenus de remplacement qui ont été précomptés de la CSG-CRDS doivent être indiqués pour leur montant net de la part de CSG déductible. \n- Les revenus de remplacement qui nont pas été précomptés de la CSG-CRDS doivent être indiqués pour leur montant brut tel que perçu. \n> Les revenus de remplacement sont : l'allocation forfaitaire de repos maternel, l'indemnité journalière forfaitaire d'interruption d'activité, lindemnité de remplacement pour maternité, paternité ou adoption et l'indemnité journalière maladie."
question.en: '[automatic] What is the gross amount of taxable daily allowances received?'
question.fr: Quel est le montant brut des indemnités journalières imposables perçues?
résumé.en: '[automatic] Only if you do not fall under the micro-fiscal regime.'
résumé.fr: Uniquement si vous ne relevez pas du régime micro-fiscal
titre.en: '[automatic] taxable per diems'
titre.fr: indemnités journalières imposable
dirigeant . indépendant . IJSS . total:
description.en: >-
[automatic] Indicate only the gross amount of your replacement income,
taxable and non-taxable, as shown on the statement of benefits provided by
your health insurance fund.
&gt; Replacement income is: the flat-rate maternal rest allowance, the
flat-rate daily allowance for interruption of activity, the replacement
allowance for maternity, paternity or adoption and the daily sickness
allowance.
description.fr: >-
Indiquez uniquement le montant brut de vos revenus de remplacement,
imposables et non imposables qui figure sur le relevé de prestations fourni
pas votre caisse d'assurance maladie.
> Les revenus de remplacement sont : l'allocation forfaitaire de repos
maternel, l'indemnité journalière forfaitaire d'interruption d'activité,
l'indemnité de remplacement pour maternité, paternité ou adoption et
l'indemnité journalière maladie.
question.en: '[automatic] What is the total gross amount of all your per diems?'
question.fr: "Quel est le montant total brut de toutes vos indemnités journalières\_?"
titre.en: '[automatic] sick pay'
titre.fr: indemnités journalières
dirigeant . indépendant . PLNR régime général:
description.en: rattaché au régime général plutôt que la CIPAV
description.fr: >-
@ -3534,6 +3768,14 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS:
titre.en: CSG and CRDS
titre.fr: CSG et CRDS
dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette:
note.en: >-
[automatic] Only the taxable portion of the IJSS is deducted from the MSA
base, since the non-taxable portion has already been deducted from the net
tax income provided.
note.fr: >-
Seule la partie imposable des IJSS est retranchée de l'assiette de la CSG,
puisque la partie non imposable a déjà été retranchée du revenu net fiscal
fourni
titre.en: basis
titre.fr: assiette
dirigeant . indépendant . cotisations et contributions . cotisations:
@ -3708,9 +3950,11 @@ dirigeant . indépendant . cotisations et contributions . cotisations . retraite
and opted for the general scheme for self-employed persons have the
possibility to opt for specific rates of supplementary pension contribution.
description.fr: "Les professions libérales non règlementées qui ont débuté leur activité à compter du 1er janvier 2019 ou ceux qui ont débuté leur activité avant la date du 1er janvier 2019\_ et ont opté pour le régime général des travailleurs indépendants\_ ont la possibilité dopter pour des taux spécifique de la cotisation retraite complémentaire.\n"
question.en: complémentaire ?
question.en: >-
[automatic] Have you opted for specific supplementary pension contribution
rates?
question.fr: >-
Avez-vous opté pour des taux spécifique de cotisation retraite
Avez-vous opté pour des taux spécifiques de cotisation retraite
complémentaire ?
titre.en: unregulated specific rate for unregulated professions
titre.fr: taux spécifique profession libérale non reglementée
@ -3782,10 +4026,8 @@ dirigeant . indépendant . cotisations et contributions . exonérations . invali
self-employed workers' scheme enjoy full exemption from sickness and
supplementary pension contributions.
description.fr: "Les personnes titulaires dune pension dinvalidité versée par un régime des travailleurs non-salariés non agricoles bénéficient dune exonération totale des cotisations\_maladie et retraite complémentaire."
question.en: indépendants ?
question.fr: >-
Êtes-vous titulaire dune pension dinvalidité du régime des travailleurs
indépendants ?
question.en: '[automatic] Do you receive a disability pension as a self-employed person?'
question.fr: "Êtes-vous titulaire dune pension dinvalidité à titre de travailleur indépendant\_?"
titre.en: disability
titre.fr: invalidité
dirigeant . indépendant . cotisations et contributions . exonérations . âge:
@ -3847,7 +4089,9 @@ dirigeant . indépendant . revenus étrangers:
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.en: '?'
question.en: >-
[automatic] Have you received any income abroad in connection with your
business?
question.fr: Avez-vous perçu des revenus à l'étranger dans le cadre de votre activité ?
titre.en: foreign income
titre.fr: revenus étrangers
@ -4049,10 +4293,10 @@ entreprise . catégorie d'activité:
description.fr: >-
Votre catégorie d'activité va déterminer une grande partie des calculs de
cotisation, contribution et impôt.
question.en: What is your category of activity?
question.fr: Quelle est votre catégorie d'activité ?
titre.en: activity category
titre.fr: catégorie d'activité
question.en: '[automatic] What is the nature of your business?'
question.fr: Quelle est la nature de votre activité ?
titre.en: '[automatic] nature of business'
titre.fr: nature de l'activité
entreprise . catégorie d'activité . artisanale:
description.en: >
It is an activity of service, production, processing, or by a qualified
@ -4120,8 +4364,8 @@ entreprise . catégorie d'activité . commerciale ou industrielle:
titre.en: commercial or industrial
titre.fr: commerciale ou industrielle
entreprise . catégorie d'activité . débit de tabac:
question.en: Is your business a tobacco store?
question.fr: Votre entreprise est-elle un débit de tabac ?
question.en: '[automatic] Do you engage in tobacco sales?'
question.fr: "Exercez-vous une activité de vente de tabac\_?"
titre.en: tobacco shop
titre.fr: débit de tabac
entreprise . catégorie d'activité . libérale:
@ -4387,8 +4631,8 @@ entreprise . date de création:
Si vous n'avez pas le jour exact, le mois suffit en général pour une bonne
approximation.
question.en: When did you create your company?
question.fr: Quelle est la date de début d'activité ?
question.en: '[automatic] What is your start date?'
question.fr: Quelle est votre date de début d'activité ?
suggestions.Début 2019.en: '[automatic] Early 2019'
suggestions.Début 2019.fr: Début 2019
suggestions.Début 2020.en: '[automatic] Early 2020'
@ -5233,104 +5477,20 @@ revenus net de cotisations:
situation personnelle:
titre.en: personal situation
titre.fr: situation personnelle
situation personnelle . IJSS:
description.en: >
[automatic] In the event of illness, maternity or accident, the general
social security system and special schemes provide "cash" benefits. These
are per diems from Social Security (IJSS),
Compensation in addition to the Social Security daily allowances paid under
a provident fund contract does not constitute replacement income.
Note: Disability benefits paid by disability/death plans are not affected.
description.fr: >
En cas de maladie, maternité, ou accident, le régime général de Sécurité
sociale ainsi que les régimes spéciaux assurent 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
question.en: 'maternité, paternité, etc.) ?'
question.fr: >-
Avez-vous touché des indemnités journalières de sécurité sociale (maladie,
maternité, paternité, etc.) ?
titre.en: social security daily allowances
titre.fr: indemnités journalières de sécurité sociale
situation personnelle . IJSS . ALD:
description.en: >-
[automatic] Long-term affection (ALD) is introduced by the Law of 13 August
2004 on health insurance. This status offers chronically ill people who meet
certain conditions specific medical care. Long-term condition is a
long-term, severe or chronic illness requiring long-term treatment at high
cost. The list of "exempt" DTAs is available on the website
[ameli.fr](https://www.ameli.fr/assure/droits-demarches/maladie-accident-hospitalisation/affection-longue-duree-ald/affection-longue-duree-ald)
Compensation paid under an "exempt" DTA is not taxable.
description.fr: >-
L'affection longue durée (ALD) est mise en place par la loi du 13 août 2004
relative à l'assurance maladie. Ce statut offre aux personnes malades
chroniques qui remplissent certaines conditions une prise en charge
spécifique de leurs soins médicaux. L'affection longue durée est une maladie
de longue durée, présentant un caractère grave ou chronique et nécessitant
un traitement long dont le coût est élevé. La liste des ALD dites
"exonérante" est disponible sur le site
[ameli.fr](https://www.ameli.fr/assure/droits-demarches/maladie-accident-hospitalisation/affection-longue-duree-ald/affection-longue-duree-ald)
Les indemnité versée dans le cadre d'une ALD dites "éxonérante" ne sont pas
imposable.
question.en: (ALD) dite "exonérante" ?
question.fr: >-
Avez-vous touché des indemnités dans le cas d'une affection longue durée
(ALD) dite "exonérante" ?
titre.en: ALD
titre.fr: ALD
situation personnelle . IJSS . ALD . autres indemnités:
question.en: '(maternité, paternité, autre maladie) ?'
question.fr: >-
Avez-vous également touché des indemnités non liées à votre ALD (maternité,
paternité, autre maladie) ?
titre.en: other compensation
titre.fr: autres indemnités
situation personnelle . IJSS . ALD . autres indemnités . montant:
question.en: How much was your other compensation?
question.fr: Quel était le montant de vos autres indemnités ?
titre.en: amount
titre.fr: montant
situation personnelle . IJSS . défiscalisées:
question.en: What was the amount of your ALD benefits?
question.fr: Quel était le montant de vos indemnités ALD ?
titre.en: tax-free per diems
titre.fr: indemnités journalières défiscalisées
situation personnelle . IJSS . fiscalisées:
titre.en: taxable daily allowances
titre.fr: indemnités journalières fiscalisées
situation personnelle . IJSS . montant:
question.en: What was their total gross amount?
question.fr: Quel était leur montant total brut ?
titre.en: taxable daily allowances
titre.fr: indemnités journalières fiscalisées
situation personnelle . IJSS . total:
titre.en: total daily allowances
titre.fr: total indemnités journalières
situation personnelle . RSA:
question.en: Are you a beneficiary of the RSA (active solidarity income)?
question.fr: Êtes-vous allocataire du RSA ?
titre.en: RSA recipient
titre.fr: allocataire RSA
question.en: '[automatic] Are you a beneficiary of the RSA or the activity bonus?'
question.fr: "Etes-vous bénéficiaire du RSA ou de la prime dactivité\_?"
titre.en: '[automatic] beneficiary RSA or activity bonus'
titre.fr: bénéficiaire RSA ou prime d'activité
situation personnelle . domiciliation fiscale à l'étranger:
description.en: >
description.en: >-
[automatic] These insured persons are not liable for the CSG/CRDS but, in
return, they are liable for the health contribution at a higher rate.
description.fr: >
description.fr: >-
Ces assurés ne sont pas redevables de la CSG/CRDS mais, en contrepartie ils
sont redevables de la cotisation maladie sur la base dun taux plus elevé.
question.en: Is the insured's tax residence abroad?
question.fr: La résidence fiscale de l'assuré est-elle domiciliée à l'étranger ?
question.en: '[automatic] Is the tax residence located abroad?'
question.fr: La résidence fiscale est-elle située à l'étranger ?
titre.en: tax domicile abroad
titre.fr: domiciliation fiscale à l'étranger
établissement:
@ -5343,7 +5503,9 @@ situation personnelle . domiciliation fiscale à l'étranger:
titre.en: establishment
titre.fr: établissement
établissement . ZFU:
question.en: (ZFU) ?
question.en: >-
[automatic] Does your establishment benefit from the Urban Free Zone (ZFU)
scheme?
question.fr: >-
Votre établissement bénéficie-t-il du dispositif zone franche urbaine (ZFU)
?

View File

@ -0,0 +1,87 @@
import RuleLink from 'Components/RuleLink'
import { SitePathsContext } from 'Components/utils/withSitePaths'
import { formatValue } from 'Engine/format'
import React, { useContext } from 'react'
import emoji from 'react-easy-emoji'
import { Trans } from 'react-i18next'
import Skeleton from 'react-loading-skeleton'
import ReactToPrint from 'react-to-print'
import Animate from 'Ui/animate'
import { useRule } from '../../Simulateurs/ArtisteAuteur'
import simulationConfig from './config.yaml'
type ResultsProp = {
componentRef?: any
}
export function Results({ componentRef }: ResultsProp) {
const results = simulationConfig.objectifs.map(dottedName =>
useRule(dottedName)
)
const onGoingComputation = !results.filter(node => node.nodeValue != null)
.length
const sitePaths = useContext(SitePathsContext)
return (
<div
className="ui__ card lighter-bg"
css="margin-top: 3rem; padding: 1rem 0"
>
<h1 css="text-align: center; margin-bottom: 2rem">
<Trans i18nKey="aide-déclaration-indépendant.results.title">
Aide à la déclaration
</Trans>
{emoji('📄')}
</h1>
{onGoingComputation && (
<h2>
<small>
<Trans i18nKey="aide-déclaration-indépendant.results.ongoing">
Calcul en cours...
</Trans>
</small>
</h2>
)}
<>
<Animate.fromTop>
{results.map(r => (
<React.Fragment key={r.title}>
<h4>
{r.title} <small>{r.summary}</small>
</h4>
{r.description && <p className="ui__ notice">{r.description}</p>}
<p className="ui__ lead" css="margin-bottom: 1rem;">
<RuleLink dottedName={r.dottedName}>
{r.nodeValue != null ? (
formatValue({
value: r.nodeValue || 0,
language: 'fr',
unit: '€',
maximumFractionDigits: 0
})
) : (
<Skeleton width={80} />
)}
</RuleLink>
</p>
</React.Fragment>
))}
<p className="ui__ notice">
Résultats calculés le {new Date().toLocaleDateString()}
</p>
{!onGoingComputation && (
<div css="text-align: center">
<style>{`@media print {.button.print{display: none;} body {margin: 40px;}}`}</style>
<ReactToPrint
trigger={() => (
<button className="ui__ simple button print">
{emoji('🖨')} Imprimer
</button>
)}
content={() => componentRef.current}
/>
</div>
)}
</Animate.fromTop>
</>
</div>
)
}

View File

@ -0,0 +1,124 @@
import CompanyDetails from 'Components/CompanyDetails'
import { formatValue } from 'Engine/format'
import React, { useRef } from 'react'
import { Trans } from 'react-i18next'
import { useSelector } from 'react-redux'
import { RootState } from 'Reducers/rootReducer'
import { situationSelector } from 'Selectors/analyseSelectors'
import { Results } from './Result'
export function AideDéclarationIndépendantsRécapitulatif() {
const situation = useSelector(situationSelector)
const siren = useSelector(
(state: RootState) => state.inFranceApp.existingCompany?.siren
)
console.log(useSelector((state: RootState) => state.rules))
const componentRef = useRef<HTMLDivElement>(null)
return (
<div ref={componentRef}>
<h1>
<Trans>Aide à la déclaration de revenus au titre de l'année 2019</Trans>
</h1>
<p>
Ce document atteste de votre bonne foi concernant votre déclaration
selon les éléments transmis.
</p>
<h2>
<Trans>Récapitulatif</Trans>
</h2>
<SimpleField dottedName={'dirigeant . rémunération totale'} unit="€" />
{siren && <CompanyDetails siren={siren} />}
<SimpleField
dottedName={
"aide déclaration revenu indépendant 2019 . nature de l'activité"
}
/>
<SimpleField dottedName={'situation personnelle . RSA'} />
{!situation[
"situation personnelle . domiciliation fiscale à l'étranger"
] && (
<>
<SimpleField dottedName={'dirigeant . indépendant . IJSS'} />
<SimpleField
dottedName={'dirigeant . indépendant . IJSS . total'}
unit="€"
/>
<SimpleField
dottedName={'dirigeant . indépendant . IJSS . imposable'}
unit="€"
/>
</>
)}
<SimpleField
dottedName={'dirigeant . indépendant . conjoint collaborateur'}
/>
<SimpleField
label="Il cotise sur la base"
dottedName={
'dirigeant . indépendant . conjoint collaborateur . assiette'
}
/>
<SimpleField
dottedName={
'dirigeant . indépendant . cotisations et contributions . exonérations . invalidité'
}
/>
<SimpleField
dottedName={
"situation personnelle . domiciliation fiscale à l'étranger"
}
/>
<SimpleField dottedName={'dirigeant . indépendant . revenus étrangers'} />
<Results componentRef={componentRef} />
</div>
)
}
type SimpleFieldProps = {
label?: string
dottedName: string
unit?: string
}
function SimpleField({ label, dottedName, unit }: SimpleFieldProps) {
const situation = useSelector(situationSelector)
const rules = useSelector((state: RootState) => state.rules)
const value = situation[dottedName]
return value && (value === 'oui' || unit === '€') ? (
<p>
<span>
{rules.find(rule => rule.dottedName === dottedName)?.question}
</span>
<span>
&nbsp;
<strong>
{value !== null && unit === '€' ? (
formatValue({
value: value || 0,
language: 'fr',
unit: unit,
maximumFractionDigits: 0
})
) : (
<>{value}</>
)}
</strong>
</span>
</p>
) : null
}

View File

@ -0,0 +1,11 @@
objectifs:
- aide déclaration revenu indépendant 2019 . revenu net fiscal
- aide déclaration revenu indépendant 2019 . CSG déductible
- aide déclaration revenu indépendant 2019 . cotisations sociales déductible
- aide déclaration revenu indépendant 2019 . CFP
- aide déclaration revenu indépendant 2019 . total charges sociales déductible
- aide déclaration revenu indépendant 2019 . assiette sociale
situation:
dirigeant: 'indépendant'
aide déclaration revenu indépendant 2019: true
unités par défaut: ['€/an']

View File

@ -0,0 +1,337 @@
import { setSimulationConfig, updateSituation } from 'Actions/actions'
import Aide from 'Components/conversation/Aide'
import Explicable from 'Components/conversation/Explicable'
import 'Components/TargetSelection.css'
import Warning from 'Components/ui/WarningBlock'
import { ScrollToTop } from 'Components/utils/Scroll'
import useDisplayOnIntersecting from 'Components/utils/useDisplayOnIntersecting'
import RuleInput from 'Engine/RuleInput'
import React, { useCallback, useEffect, useRef, useState } from 'react'
import { Trans } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { RootState } from 'Reducers/rootReducer'
import {
flatRulesSelector,
nextStepsSelector,
ruleAnalysisSelector,
situationSelector
} from 'Selectors/analyseSelectors'
import styled from 'styled-components'
import { DottedName, Rule } from 'Types/rule'
import Animate from 'Ui/animate'
import { useRule } from '../../Simulateurs/ArtisteAuteur'
import { CompanySection } from '../Home'
import simulationConfig from './config.yaml'
import { Results } from './Result'
const lauchComputationWhenResultsInViewport = () => {
const dottedName = 'dirigeant . rémunération totale'
const [resultsRef, resultsInViewPort] = useDisplayOnIntersecting({
threshold: 0.5,
unobserve: false
})
const value = useSelector(situationSelector)[dottedName]
const [currentIncome, setCurrentIncome] = useState(value)
const [displayForm, setDisplayForm] = useState(currentIncome != null)
const updateIncome = useCallback(
income => {
setDisplayForm(income != null)
setCurrentIncome(income)
},
[setDisplayForm, setCurrentIncome]
)
const dispatch = useDispatch()
useEffect(() => {
if (resultsInViewPort && displayForm) {
dispatch(updateSituation(dottedName, currentIncome))
} else {
dispatch(updateSituation(dottedName, null))
}
}, [resultsInViewPort, displayForm, currentIncome])
return { updateIncome, resultsRef, displayForm, currentIncome }
}
export default function AideDéclarationIndépendant() {
const dispatch = useDispatch()
const rules = useSelector(flatRulesSelector)
const company = useSelector(
(state: RootState) => state.inFranceApp.existingCompany
)
dispatch(setSimulationConfig(simulationConfig, true))
const {
resultsRef,
displayForm,
updateIncome,
currentIncome
} = lauchComputationWhenResultsInViewport()
const printComponentRef = useRef<HTMLDivElement>(null)
return (
<div ref={printComponentRef}>
<ScrollToTop />
<Trans i18nKey="aide-déclaration-indépendant.description">
<h1>Aide à la déclaration de revenus au titre de l'année 2019</h1>
<p>
Cet outil est une aide aux déclarations fiscale (revenu) et sociale
(DSI) à destination des travailleurs indépendants. Il vous permet de
connaître le montant des charges sociales déductibles à partir de
votre résultat net fiscal.
</p>
<div
css={`
@media print {
display: none;
}
`}
>
<Warning localStorageKey="aide-déclaration-indépendant.warning">
<h3>
Cet outil vous concerne si vous êtes dans tous les cas suivants :
</h3>
<ul>
<li>
vous cotisez au régime général des travailleurs indépendants
</li>
<li>
votre entreprise est au régime réel d'imposition et en
comptabilité d'engagement
</li>
</ul>
<h3>
Il ne vous concerne pas si vous êtes dans un des cas suivants :
</h3>
<ul>
<li>
vous exercez une activité libérale relevant dun régime de
retraite des professions libérales
</li>
<li>
vous êtes gérants de société relevant de limpôt sur les
sociétés
</li>
<li>vous avez opté pour le régime micro-fiscal</li>
<li>votre entreprise est domiciliée dans les DOM</li>
</ul>
</Warning>
</div>
<h2>
Quel est votre résultat fiscal en 2019 ?<br />
<small>Charges sociales et exonérations fiscales non incluses</small>
</h2>
<p className="ui__ notice">
Le résultat fiscal correspond aux produits moins les charges. Il peut
être positif (bénéfice) ou négatif (pertes).
</p>
</Trans>
<BigInput>
<RuleInput
rules={rules}
dottedName="dirigeant . rémunération totale"
onChange={updateIncome}
value={currentIncome}
autoFocus
/>
</BigInput>
{displayForm && (
<>
<Animate.fromTop>
<FormBlock>
<Trans i18nKey="aide-déclaration-indépendant.entreprise.titre">
<h2>Entreprise et activité</h2>
</Trans>
<div
css={`
@media print {
display: none;
}
`}
>
{!company && (
<p className="ui__ notice">
<Trans i18nKey="aide-déclaration-indépendant.entreprise.description">
<strong>Facultatif : </strong>Vous pouvez renseigner votre
entreprise pour pré-remplir le formulaire
</Trans>
</p>
)}
<CompanySection company={company} />
</div>
<SimpleField dottedName="entreprise . date de création" />
<SubSection dottedName="aide déclaration revenu indépendant 2019 . nature de l'activité" />
{/* PLNR */}
<SimpleField dottedName="dirigeant . indépendant . cotisations et contributions . cotisations . retraite complémentaire . taux spécifique PLNR" />
<SimpleField dottedName="dirigeant . indépendant . cotisations et contributions . cotisations . déduction tabac" />
<h2>
<Trans>Situation personnelle</Trans>
</h2>
<SimpleField dottedName="situation personnelle . RSA" />
<SubSection dottedName="dirigeant . indépendant . IJSS" />
<SubSection dottedName="dirigeant . indépendant . conjoint collaborateur" />
<h2>
<Trans>Exonérations</Trans>
</h2>
<SimpleField dottedName="entreprise . ACRE" />
<SimpleField dottedName="établissement . ZFU" />
<SubSection
hideTitle
dottedName="entreprise . effectif . seuil"
/>
<SubSection
dottedName="dirigeant . indépendant . cotisations et contributions . exonérations"
hideTitle
/>
<h2>
<Trans>International</Trans>
</h2>
<SimpleField dottedName="situation personnelle . domiciliation fiscale à l'étranger" />
<SubSection
dottedName="dirigeant . indépendant . revenus étrangers"
hideTitle
/>
</FormBlock>
</Animate.fromTop>
<div ref={resultsRef}>
<Results componentRef={printComponentRef} />
</div>
<Aide />
</>
)}
</div>
)
}
type SubSectionProp = {
dottedName: DottedName
hideTitle?: boolean
}
function SubSection({
dottedName: sectionDottedName,
hideTitle = false
}: SubSectionProp) {
const flatRules = useSelector(flatRulesSelector)
const ruleTitle = useRule(sectionDottedName)?.title
const nextSteps = useSelector(nextStepsSelector)
const situation = useSelector(situationSelector)
const title = hideTitle ? null : ruleTitle
const subQuestions = flatRules.filter(
({ dottedName, question }) =>
Boolean(question) &&
dottedName.startsWith(sectionDottedName) &&
(Object.keys(situation).includes(dottedName) ||
nextSteps.includes(dottedName))
)
return (
<>
{!!subQuestions.length && title && <h3>{title}</h3>}
{subQuestions.map(({ dottedName }) => (
<SimpleField key={dottedName} dottedName={dottedName} />
))}
</>
)
}
type SimpleFieldProps = {
dottedName: DottedName
summary?: Rule['summary']
question?: Rule['question']
}
function SimpleField({ dottedName, question, summary }: SimpleFieldProps) {
const dispatch = useDispatch()
const evaluatedRule = useSelector((state: RootState) => {
return ruleAnalysisSelector(state, { dottedName })
})
const rules = useSelector(flatRulesSelector)
const value = useSelector(situationSelector)[dottedName]
const [currentValue, setCurrentValue] = useState(value)
const dispatchValue = useCallback(
value => {
dispatch(updateSituation(dottedName, value))
dispatch({
type: 'STEP_ACTION',
name: 'fold',
step: dottedName
})
},
[dispatch, dottedName]
)
const update = (value: unknown) => {
dispatchValue(value)
setCurrentValue(value)
}
useEffect(() => {
setCurrentValue(value)
}, [value])
if (!evaluatedRule.isApplicable) {
return null
}
return (
<div
css={`
break-inside: avoid;
`}
>
<Animate.fromTop>
<Question>
<div
css={`
border-left: 3px solid var(--lightColor);
padding-left: 0.6rem;
@media print {
padding-left: 0 !important;
}
`}
>
<p>
{question ?? evaluatedRule.question}
<Explicable dottedName={dottedName} />
</p>
<p className="ui__ notice">{summary ?? evaluatedRule.summary}</p>
</div>
<RuleInput
rules={rules}
dottedName={dottedName}
onChange={update}
value={currentValue}
/>
</Question>
</Animate.fromTop>
</div>
)
}
const FormBlock = styled.section`
max-width: 500px;
padding: 0;
h3 {
margin-top: 2rem;
}
h2 {
border-top: 1px solid var(--lighterColor);
padding-top: 2rem;
break-after: avoid;
}
select,
input[type='text'] {
font-size: 1.05em;
padding: 5px 10px;
}
ul {
padding: 0;
margin: 0;
}
`
const Question = styled.div`
margin-top: 1em;
`
const BigInput = styled.div`
font-size: 130%;
`

View File

@ -9,6 +9,7 @@ import Overlay from 'Components/Overlay'
import { ScrollToTop } from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/withSitePaths'
import React, { useContext, useEffect, useRef, useState } from 'react'
import emoji from 'react-easy-emoji'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
@ -79,58 +80,84 @@ export default function SocialSecurity() {
<img
className="ui__ hide-mobile"
src={businessPlan}
css="margin-left: 3rem; max-width: 15rem; transform: translateX(2rem) scale(1.4);"
css="margin-left: 3rem; max-width: 15rem; transform: translateX(2rem) translateY(-2.3rem) scale(1.4);"
/>
</div>
<>
<h2>
<Trans i18nKey="gérer.choix.titre">
Que souhaitez-vous faire ?
</Trans>
</h2>
{!!régime && (
<Link
className="ui__ interactive card button-choice lighter-bg"
css="width: 100%"
to={{
pathname: sitePaths.simulateurs[régime],
state: {
fromGérer: true
}
}}
>
<Trans i18nKey="gérer.choix.revenus">
<p>Calculer mon revenu net</p>
<small>
Estimez précisément le montant de vos cotisations grâce au
simulateur {{ régime }} de l'Urssaf
</small>
<section className="ui__ full-width light-bg">
<h2 className="ui__ center-flex">
<Trans i18nKey="gérer.choix.titre">
Que souhaitez-vous faire ?
</Trans>
</Link>
)}
{régime !== 'auto-entrepreneur' && (
<Link
className="ui__ interactive card button-choice lighter-bg "
css="width: 100%"
to={{
pathname: sitePaths.simulateurs.salarié,
state: {
fromGérer: true
}
}}
>
<Trans i18nKey="gérer.choix.embauche">
<p>Estimer le montant dune embauche</p>
<small>
Calculez le montant total que votre entreprise devra dépenser
pour rémunérer votre prochain employé
</small>
</Trans>
</Link>
)}
</h2>
<div className="ui__ center-flex">
{company?.statutJuridique === 'EI' &&
!company.isAutoEntrepreneur &&
process.env.MASTER === false && (
<Link
className="ui__ interactive card box"
to={{
pathname: sitePaths.gérer.déclarationIndépendant.index
}}
>
<div className="ui__ big box-icon">{emoji('✍')}</div>
<Trans i18nKey="gérer.choix.déclaration">
<h3>Remplir ma déclaration de revenus</h3>
<p className="ui__ notice">
Calculez facilement les montants des charges sociales à
reporter dans votre déclaration de revenu au titre de
2019
</p>
</Trans>
</Link>
)}
{!!régime && (
<Link
className="ui__ interactive card box"
to={{
pathname: sitePaths.simulateurs[régime],
state: {
fromGérer: true
}
}}
>
<div className="ui__ big box-icon">{emoji('💶')}</div>
<Trans i18nKey="gérer.choix.revenus">
<h3>Calculer mon revenu net de cotisations</h3>
<p className="ui__ notice">
Estimez précisément le montant de vos cotisations grâce au
simulateur {{ régime }} de l'Urssaf
</p>
</Trans>
</Link>
)}
{régime !== 'auto-entrepreneur' && (
<Link
className="ui__ interactive card box"
css="width: 100%"
to={{
pathname: sitePaths.simulateurs.salarié,
state: {
fromGérer: true
}
}}
>
<div className="ui__ big box-icon">{emoji('🤝')}</div>
<Trans i18nKey="gérer.choix.embauche">
<h3>Estimer le montant dune embauche</h3>
<p className="ui__ notice">
Calculez le montant total que votre entreprise devra
dépenser pour rémunérer votre prochain employé
</p>
</Trans>
</Link>
)}
</div>
</section>
<AideOrganismeLocal />
<h2>
{emoji('🧰 ')}
<Trans>Ressources utiles</Trans>
</h2>
<div
@ -150,10 +177,10 @@ export default function SocialSecurity() {
>
<Trans i18nKey="gérer.ressources.embaucher">
<p>Découvrir les démarches dembauche </p>
<small>
<p className="ui__ notice">
La liste des choses à faire pour être sûr de ne rien oublier
lors de lembauche dun nouveau salarié
</small>
</p>
</Trans>
</Link>
)}
@ -164,12 +191,12 @@ export default function SocialSecurity() {
>
<Trans i18nKey="gérer.ressources.autoEntrepreneur">
<p>Accéder au site officiel auto-entrepreneur</p>
<small>
<p className="ui__ notice">
Vous pourrez effectuer votre déclaration de chiffre
d'affaire, payer vos cotisations, et plus largement trouver
toutes les informations relatives au statut
d'auto-entrepreneur
</small>
</p>
</Trans>
</a>
)}
@ -179,11 +206,11 @@ export default function SocialSecurity() {
>
<Trans i18nKey="gérer.ressources.sécuritéSociale">
<p>Comprendre la sécurité sociale </p>
<small>
<p className="ui__ notice">
A quoi servent les cotisations sociales ? Le point sur le
système de protection sociale dont bénéficient tous les
travailleurs en France
</small>
</p>
</Trans>
</Link>
</div>

View File

@ -4,6 +4,8 @@ import React, { useContext } from 'react'
import { Trans } from 'react-i18next'
import { Route, Switch } from 'react-router'
import { NavLink, useLocation } from 'react-router-dom'
import AideDéclarationIndépendant from './AideDéclarationIndépendant/index'
import { AideDéclarationIndépendantsRécapitulatif } from './AideDéclarationIndépendant/Récapitulatif'
import Embaucher from './Embaucher'
import Home from './Home'
import SécuritéSociale from './SécuritéSociale'
@ -15,14 +17,26 @@ export default function Gérer() {
<>
<ScrollToTop key={location.pathname} />
<div css="transform: translateY(2rem)">
<NavLink
to={sitePaths.gérer.index}
exact
activeClassName="ui__ hide"
className="ui__ simple push-left small button"
>
<Trans>Retour à mon activité</Trans>
</NavLink>
{location.pathname ===
'/gérer/aide-declaration-independants/récapitulatif' ? (
<NavLink
to={sitePaths.gérer.déclarationIndépendant.index}
exact
activeClassName="ui__ hide"
className="ui__ simple push-left small button"
>
<Trans>Retour à ma déclaration</Trans>
</NavLink>
) : (
<NavLink
to={sitePaths.gérer.index}
exact
activeClassName="ui__ hide"
className="ui__ simple push-left small button"
>
<Trans>Retour à mon activité</Trans>
</NavLink>
)}
</div>
<Switch>
<Route exact path={sitePaths.gérer.index} component={Home} />
@ -31,6 +45,15 @@ export default function Gérer() {
component={SécuritéSociale}
/>
<Route path={sitePaths.gérer.embaucher} component={Embaucher} />
<Route
exact
path={sitePaths.gérer.déclarationIndépendant.index}
component={AideDéclarationIndépendant}
/>
<Route
path={sitePaths.gérer.déclarationIndépendant.récapitulatif}
component={AideDéclarationIndépendantsRécapitulatif}
/>
</Switch>
</>
)

View File

@ -6,7 +6,7 @@ import config from 'Components/simulationConfigs/artiste-auteur.yaml'
import 'Components/TargetSelection.css'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import { formatValue } from 'Engine/format'
import InputComponent from 'Engine/RuleInput'
import RuleInput from 'Engine/RuleInput'
import { getRuleFromAnalysis } from 'Engine/rules'
import React, { createContext, useContext, useEffect, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next'
@ -104,7 +104,7 @@ function SimpleField({ dottedName }: SimpleFieldProps) {
</label>
</div>
<div className="targetInputOrValue">
<InputComponent
<RuleInput
className="targetInput"
isTarget
dottedName={dottedName}

View File

@ -1,295 +0,0 @@
import { setSimulationConfig, updateSituation } from 'Actions/actions'
import RuleLink from 'Components/RuleLink'
import 'Components/TargetSelection.css'
import { formatValue } from 'Engine/format'
import InputComponent from 'Engine/RuleInput'
import React, { useEffect, useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { RootState } from 'Reducers/rootReducer'
import {
analysisWithDefaultsSelector,
flatRulesSelector,
nextStepsSelector,
ruleAnalysisSelector,
situationSelector
} from 'Selectors/analyseSelectors'
import styled from 'styled-components'
import { DottedName, Rule } from 'Types/rule'
import Animate from 'Ui/animate'
import { CompanySection } from '../Gérer/Home'
import { useRule } from './ArtisteAuteur'
const simulationConfig = {
objectifs: [
'dirigeant . indépendant . cotisations et contributions',
'dirigeant . rémunération totale'
],
situation: {
dirigeant: 'indépendant'
},
'unités par défaut': ['€/an']
}
export default function DNRTI() {
const dispatch = useDispatch()
const analysis = useSelector(analysisWithDefaultsSelector)
const company = useSelector(
(state: RootState) => state.inFranceApp.existingCompany
)
dispatch(setSimulationConfig(simulationConfig, true))
return (
<>
<h1>
Aide à la déclaration de revenus au titre de l'année 2019{' '}
<img src="https://img.shields.io/badge/-beta-blue" />
<br />
<small>Travailleurs indépendants</small>
</h1>
<p>
Nous mettons à disposition un outil d'aide aux déclarations fiscale
(revenu) et sociale (DSI). Il vous permet de connaître le montant des
charges sociales déductibles à partir de votre résultat net fiscal.
</p>
<p>
Cet outil vous concerne <strong>uniquement</strong> si vous êtes dans
les cas suivants :
</p>
<ul>
<li>vous cotisez au régime général des travailleurs indépendants</li>
<li>
votre entreprise est au régime réel d'imposition et en comptabilité
d'engagement
</li>
</ul>
<FormBlock>
<CompanySection company={company} />
<h2>Revenus d'activité</h2>
<SimpleField
dottedName="dirigeant . rémunération totale"
question="Quel est votre revenu professionnel en 2019 ?"
// summary="Indiquez votre résultat net fiscal avant déduction des charges sociales et exonérations fiscales."
/>
<SimpleField dottedName="entreprise . date de création" />
<SubSection dottedName="entreprise . catégorie d'activité" />
{/* PLNR */}
<SimpleField dottedName="dirigeant . indépendant . PLNR régime général" />
<SimpleField dottedName="dirigeant . indépendant . cotisations et contributions . cotisations . retraite complémentaire . taux spécifique PLNR" />
<SimpleField dottedName="dirigeant . indépendant . cotisations et contributions . cotisations . déduction tabac" />
<h3>Situation personnelle</h3>
<SimpleField dottedName="situation personnelle . RSA" />
<SubSection dottedName="situation personnelle . IJSS" />
<SubSection dottedName="dirigeant . indépendant . conjoint collaborateur" />
<h3>Exonérations</h3>
<SimpleField dottedName="entreprise . ACRE" />
<SimpleField dottedName="établissement . ZFU" />
<SubSection
dottedName="dirigeant . indépendant . cotisations et contributions . exonérations"
hideTitle
/>
<h3>International</h3>
<SimpleField dottedName="situation personnelle . domiciliation fiscale à l'étranger" />
<SubSection
dottedName="dirigeant . indépendant . revenus étrangers"
hideTitle
/>
{/* <h3>DOM - Départements d'Outre-Mer</h3>
<p>
<em>Pas encore implémenté</em>
</p> */}
</FormBlock>
<Results />
</>
)
}
type SubSectionProp = {
dottedName: DottedName
hideTitle?: boolean
}
function SubSection({
dottedName: sectionDottedName,
hideTitle = false
}: SubSectionProp) {
const flatRules = useSelector(flatRulesSelector)
const ruleTitle = useRule(sectionDottedName)?.title
const nextSteps = useSelector(nextStepsSelector)
const situation = useSelector(situationSelector)
const title = hideTitle ? null : ruleTitle
const subQuestions = flatRules
.filter(
({ dottedName, question }) =>
Boolean(question) &&
dottedName.startsWith(sectionDottedName) &&
(Object.keys(situation).includes(dottedName) ||
nextSteps.includes(dottedName))
)
.sort(
(rule1, rule2) =>
nextSteps.indexOf(rule1.dottedName) -
nextSteps.indexOf(rule2.dottedName)
)
return (
<>
{!!subQuestions.length && title && <h3>{title}</h3>}
{subQuestions.map(({ dottedName }) => (
<SimpleField key={dottedName} dottedName={dottedName} />
))}
</>
)
}
type SimpleFieldProps = {
dottedName: DottedName
question?: Rule['question']
}
function SimpleField({ dottedName, question }: SimpleFieldProps) {
const dispatch = useDispatch()
const analysis = useSelector((state: RootState) => {
return ruleAnalysisSelector(state, { dottedName })
})
const rules = useSelector((state: RootState) => state.rules)
const value = useSelector(situationSelector)[dottedName]
const [currentValue, setCurrentValue] = useState(value)
const update = (value: unknown) => {
dispatch(updateSituation(dottedName, value))
dispatch({
type: 'STEP_ACTION',
name: 'fold',
step: dottedName
})
setCurrentValue(value)
}
useEffect(() => {
setCurrentValue(value)
}, [value])
if (!analysis.isApplicable) {
return null
}
return (
<Animate.fromTop>
<Question>
<p
css={`
border-left: 4px solid var(--lightColor);
border-radius: 3px;
padding-left: 12px;
margin-left: -12px;
`}
>
{question ?? analysis.question}
</p>
<InputComponent
rules={rules}
dottedName={dottedName}
onChange={update}
value={currentValue}
/>
{/* <Field dottedName={dottedName} onChange={onChange} /> */}
</Question>
</Animate.fromTop>
)
}
function Results() {
const cotisationsRule = useRule(
'dirigeant . indépendant . cotisations et contributions'
)
const revenusNet = useRule(
'dirigeant . indépendant . revenu net de cotisations'
)
const nonDeductible = useRule(
'dirigeant . indépendant . cotisations et contributions . CSG et CRDS'
)
function Link({ cotisation }) {
return (
<p className="ui__ lead">
<RuleLink dottedName={cotisation.dottedName}>
{cotisation.nodeValue
? formatValue({
value: cotisation.nodeValue,
language: 'fr',
unit: '€',
maximumFractionDigits: 0
})
: '-'}
</RuleLink>
</p>
)
}
if (!cotisationsRule.nodeValue) {
return null
}
return (
<ResultBlock>
<Animate.fromTop>
<ResultSubTitle>Vos cotisations</ResultSubTitle>
<Link cotisation={cotisationsRule} />
<ResultSubTitle>Vos revenus net</ResultSubTitle>
<Link cotisation={revenusNet} />
<ResultSubTitle>Cotisations non déductibles</ResultSubTitle>
<p className="ui__ notice">
Ce montant doit être réintégré au revenu net dans votre déclaration
fiscale.
</p>
<Link cotisation={nonDeductible} />
</Animate.fromTop>
</ResultBlock>
)
}
const FormWrapper = styled.div`
display: flex;
justify-content: space-between;
align-items: flex-start;
ul {
padding: 0;
}
`
const FormBlock = styled.section`
width: 63%;
padding: 0;
h3 {
margin-top: 50px;
}
select,
input[type='text'] {
font-size: 1.05em;
padding: 5px 10px;
}
`
const Question = styled.div`
margin-top: 1em;
`
const ResultBlock = styled.section`
position: sticky;
top: 3%;
padding: 3%;
width: 34%;
background: var(--lightestColor);
`
const ResultSubTitle = styled.h4`
&:not(:first-child) {
margin-top: 2em;
}
`
const ResultNumber = styled.strong`
display: block;
text-align: right;
`

View File

@ -8,7 +8,6 @@ import { Link, useLocation } from 'react-router-dom'
import ArtisteAuteur from './ArtisteAuteur'
import AssimiléSalarié from './AssimiléSalarié'
import AutoEntrepreneur from './AutoEntrepreneur'
import DNRTI from './dnrti'
import Home from './Home'
import Indépendant from './Indépendant'
import Salarié from './Salarié'
@ -28,7 +27,7 @@ export default function Simulateurs() {
return (
<>
<ScrollToTop key={pathname} />
{pathname !== sitePaths.simulateurs.index && !pathname.match('dnrti') && (
{pathname !== sitePaths.simulateurs.index && (
<div css="transform: translateY(2rem);">
{lastState?.fromGérer && (
<Link
@ -79,7 +78,6 @@ export default function Simulateurs() {
path={sitePaths.simulateurs['artiste-auteur']}
component={ArtisteAuteur}
/>
<Route path={sitePaths.simulateurs.dnrti} component={DNRTI} />
</Switch>
</>
)

View File

@ -88,7 +88,17 @@ export const constructLocalizedSitePath = (language: string) => {
gérer: {
index: t('path.gérer.index', '/gérer'),
embaucher: t('path.gérer.embaucher', '/embaucher'),
sécuritéSociale: t('path.gérer.sécuritéSociale', '/sécurité-sociale')
sécuritéSociale: t('path.gérer.sécuritéSociale', '/sécurité-sociale'),
déclarationIndépendant: {
index: t(
'path.gérer.déclaration-indépendant.index',
'/aide-declaration-independants'
),
récapitulatif: t(
'path.gérer.déclaration-indépendant.récapitulatif',
'/récapitulatif'
)
}
},
simulateurs: {
index: t('path.simulateurs.index', '/simulateurs'),
@ -106,8 +116,7 @@ export const constructLocalizedSitePath = (language: string) => {
'/comparaison-régimes-sociaux'
),
salarié: t('path.simulateurs.salarié', '/salarié'),
'artiste-auteur': t('path.simulateurs.artiste-auteur', '/artiste-auteur'),
dnrti: t('path.simulateurs.dnrti', '/dnrti')
'artiste-auteur': t('path.simulateurs.artiste-auteur', '/artiste-auteur')
},
économieCollaborative: {
index: t('path.économieCollaborative.index', '/économie-collaborative'),

View File

@ -7,6 +7,7 @@ export type Rule = {
unité: string
unit: string
name?: string
summary?: string
title?: string
defaultValue: any
icons: string

View File

@ -11,7 +11,7 @@ plafonnement inactif:
formule:
encadrement:
valeur: 1000
plafond: false
plafond: non
exemples:
- valeur attendue: 1000

View File

@ -106,19 +106,21 @@ exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - a
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - avec charges 2`] = `"[10982,10982,10742,4,19,23]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 1`] = `"[169,169,139,0,1,1]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 1`] = `"[0,0,2488,0,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 2`] = `"[738,738,323,0,2,2]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 2`] = `"[169,169,139,0,1,1]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 3`] = `"[2446,2446,2588,2,5,6]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 3`] = `"[738,738,323,0,2,2]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 4`] = `"[5291,5291,5306,4,10,12]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 4`] = `"[2446,2446,2588,2,5,6]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 5`] = `"[10982,10982,10742,4,19,23]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 5`] = `"[5291,5291,5306,4,10,12]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 6`] = `"[25971,28055,27050,4,46,59]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 6`] = `"[10982,10982,10742,4,19,23]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 7`] = `"[46812,57017,52684,4,46,119]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 7`] = `"[25971,28055,27050,4,46,59]"`;
exports[`calculate simulations-rémunération-dirigeant: Assimilé salarié - échelle de rémunération 8`] = `"[46812,57017,52684,4,46,119]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - ACRE 1`] = `"[9349,9349,2046,2,0,0]"`;
@ -140,19 +142,21 @@ exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - av
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - avec charges 2`] = `"[15480,15480,7163,4,14,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 1`] = `"[871,871,60,0,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 1`] = `"[87,87,6,0,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 2`] = `"[1742,1742,119,0,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 2`] = `"[871,871,60,0,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 3`] = `"[4354,4354,1023,1,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 3`] = `"[1742,1742,119,0,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 4`] = `"[8709,8709,2046,2,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 4`] = `"[4354,4354,1023,1,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 5`] = `"[17417,17417,4093,3,8,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 5`] = `"[8709,8709,2046,2,0,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 6`] = `"[43543,43543,10232,4,20,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 6`] = `"[17417,17417,4093,3,8,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 7`] = `"[84367,87085,20465,4,40,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 7`] = `"[43543,43543,10232,4,20,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Auto-entrepreneur - échelle de rémunération 8`] = `"[84367,87085,20465,4,40,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - ACRE 1`] = `"[8215,8215,6018,4,21,0]"`;
@ -174,19 +178,21 @@ exports[`calculate simulations-rémunération-dirigeant: Indépendant - avec ch
exports[`calculate simulations-rémunération-dirigeant: Indépendant - avec charges 2`] = `"[13769,13769,10084,4,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 1`] = `"[null,null,0,3,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 1`] = `"[-1044,-1044,0,3,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 2`] = `"[616,616,470,3,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 2`] = `"[-225,-225,0,3,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 3`] = `"[3084,3084,2267,3,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 3`] = `"[616,616,470,3,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 4`] = `"[6795,6795,4977,4,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 4`] = `"[3084,3084,2267,3,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 5`] = `"[13769,13769,10084,4,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 5`] = `"[6795,6795,4977,4,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 6`] = `"[30434,33997,24912,4,48,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 6`] = `"[13769,13769,10084,4,21,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 7`] = `"[56273,69895,36431,4,56,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 7`] = `"[30434,33997,24912,4,48,0]"`;
exports[`calculate simulations-rémunération-dirigeant: Indépendant - échelle de rémunération 8`] = `"[56273,69895,36431,4,56,0]"`;
exports[`calculate simulations-salarié: JEI 1`] = `"[3440,0,0,3000,2353,2187]"`;

View File

@ -1,4 +1,5 @@
échelle de rémunération:
- dirigeant . rémunération totale: 100
- dirigeant . rémunération totale: 1000
- dirigeant . rémunération totale: 2000
- dirigeant . rémunération totale: 5000

View File

@ -9322,6 +9322,13 @@ react-test-renderer@^16.0.0-0:
react-is "^16.8.6"
scheduler "^0.18.0"
react-to-print@^2.5.1:
version "2.5.1"
resolved "https://registry.yarnpkg.com/react-to-print/-/react-to-print-2.5.1.tgz#eaaff4248910f179788ab15a593ceb3e07527b8c"
integrity sha512-HhuujwTmuGYB+yBq52y1pwiv0aooaLTqksMJ6cGKWy+aT+x6zponitZd54swiAeILndxJ7oO+X1F/93XyfT/JA==
dependencies:
prop-types "^15.7.2"
react-transition-group@^1.2.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6"