🏗Add export as Pdf button on simulators

pull/1691/head
Pierre-Yves Dezaunay 2021-06-10 13:53:18 +02:00 committed by Johan Girod
parent 8c7a14cb54
commit 5359392d70
76 changed files with 1549 additions and 1210 deletions

View File

@ -24,8 +24,8 @@ contrat salarié . convention collective . BTP . catégorie . ouvrier:
icônes: 👨‍🔧
formule: catégorie = 'ouvrier'
contrat salarié . convention collective . BTP . catégorie . ouvrier . prévoyance complémentaire:
produit:
? contrat salarié . convention collective . BTP . catégorie . ouvrier . prévoyance complémentaire
: produit:
assiette: rémunération . brut de base
plafond: 3 * plafond sécurité sociale
composantes:
@ -55,8 +55,8 @@ contrat salarié . convention collective . BTP . catégorie . etam:
note: >-
Répartition conventionnelle fixée par larticle 5 de lAccord du BTP du 13 décembre 1990.
contrat salarié . convention collective . BTP . catégorie . etam . prévoyance complémentaire:
produit:
? contrat salarié . convention collective . BTP . catégorie . etam . prévoyance complémentaire
: produit:
assiette: rémunération . brut de base
plafond: 3 * plafond sécurité sociale
composantes:
@ -77,8 +77,8 @@ contrat salarié . convention collective . BTP . catégorie . cadre:
- règle: statut cadre
par: oui
contrat salarié . convention collective . BTP . catégorie . cadre . prévoyance complémentaire:
barème:
? contrat salarié . convention collective . BTP . catégorie . cadre . prévoyance complémentaire
: barème:
assiette: rémunération . brut de base
multiplicateur: plafond sécurité sociale
composantes:
@ -138,8 +138,8 @@ contrat salarié . convention collective . BTP . congés intempéries:
CIBTP: https://www.cibtp.fr/
Article L3141-30 du Code du Travail: https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=DF6E6424807679A6EDC2915496BEA32D.tplgfr22s_2?idArticle=LEGIARTI000033020675&cidTexte=LEGITEXT000006072050&dateTexte=20200320
contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement:
question: À quelle caisse l'entreprise est-elle rattachée pour le versement de la cotisation congés intempéries ?
? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement
: question: À quelle caisse l'entreprise est-elle rattachée pour le versement de la cotisation congés intempéries ?
formule:
une possibilité:
choix obligatoire: oui
@ -155,8 +155,8 @@ contrat salarié . convention collective . BTP . congés intempéries . caisse d
- sud ouest
par défaut: "'idf'"
contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . idf:
titre: Île-de-France
? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . idf
: titre: Île-de-France
contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . nord ouest:
contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . grand ouest:
contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . centre ouest:

View File

@ -10,8 +10,8 @@ contrat salarié . convention collective . compta:
Légifrance: https://www.legifrance.gouv.fr/affichIDCC.do?idConvention=KALICONT000005635826
Synthèse Dicotravail: https://www.dicotravail.com/convention-collective/experts-comptables-jo-3020-idcc-787/
contrat salarié . convention collective . compta . majoration heures supplémentaires:
remplace: temps de travail . heures supplémentaires . majoration
? contrat salarié . convention collective . compta . majoration heures supplémentaires
: remplace: temps de travail . heures supplémentaires . majoration
formule:
barème:
assiette: temps de travail . heures supplémentaires

View File

@ -9,8 +9,8 @@ contrat salarié . convention collective . HCR . montant forfaitaire d'un repas:
règle: rémunération . avantages en nature . nourriture . montant . repas forfaitaire
formule: 3.62 €/repas
contrat salarié . convention collective . HCR . majoration heures supplémentaires:
remplace: temps de travail . heures supplémentaires . majoration
? contrat salarié . convention collective . HCR . majoration heures supplémentaires
: remplace: temps de travail . heures supplémentaires . majoration
formule:
barème:
assiette: temps de travail . heures supplémentaires

View File

@ -25,8 +25,8 @@ contrat salarié . convention collective . optique . prime d'ancienneté:
références:
Légifrance: https://www.legifrance.gouv.fr/affichIDCC.do?idSectionTA=KALISCTA000005736434&cidTexte=KALITEXT000005649634&idConvention=KALICONT000005635912
contrat salarié . convention collective . optique . salaire minimum conventionnel:
unité: €/mois
? contrat salarié . convention collective . optique . salaire minimum conventionnel
: unité: €/mois
formule:
variations:
- si: coefficient < 110

View File

@ -85,8 +85,8 @@ contrat salarié . intermittents du spectacle . caisse des congés spectacle:
audiens.org: https://www.audiens.org/files/live/sites/siteAudiens/files/03_documents/entreprise/Fiches-techniques/Conges-Spectacles-Mode-d-emploi-employeur-2019.pdf
Article L3141-30 du Code du Travail: https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=DF6E6424807679A6EDC2915496BEA32D.tplgfr22s_2?idArticle=LEGIARTI000033020675&cidTexte=LEGITEXT000006072050&dateTexte=20200320
contrat salarié . intermittents du spectacle . retraite complémentaire techniciens et cadre:
applicable si:
? contrat salarié . intermittents du spectacle . retraite complémentaire techniciens et cadre
: applicable si:
une de ces conditions:
- statut cadre
- technicien
@ -191,16 +191,16 @@ contrat salarié . intermittents du spectacle . artiste . réduction de taux:
par: FNAL . taux * réduction de taux
formule: 70%
contrat salarié . intermittents du spectacle . artiste . réduction de taux . ATMP:
remplace: ATMP . taux
? contrat salarié . intermittents du spectacle . artiste . réduction de taux . ATMP
: remplace: ATMP . taux
formule:
variations:
- si: régime alsace moselle
alors: 1.54%
- sinon: 1.12%
contrat salarié . intermittents du spectacle . artiste . nombre jours travaillés:
question: Pour combien de jours continus l'artiste est-il engagé ?
? contrat salarié . intermittents du spectacle . artiste . nombre jours travaillés
: question: Pour combien de jours continus l'artiste est-il engagé ?
par défaut: 5 jours
contrat salarié . intermittents du spectacle . artiste . plafond proratisé:
@ -222,12 +222,12 @@ contrat salarié . intermittents du spectacle . artiste . acteur de complément:
question: L'artiste est-il un acteur de complément engagé à la journée pour une production cinématographique ?
par defaut: non
contrat salarié . intermittents du spectacle . artiste . acteur de complément . nombre jours travaillés:
remplace: artiste . nombre jours travaillés
? contrat salarié . intermittents du spectacle . artiste . acteur de complément . nombre jours travaillés
: remplace: artiste . nombre jours travaillés
formule: 1
contrat salarié . intermittents du spectacle . artiste . acteur de complément . assiette forfaitaire:
applicable si: rémunération . brut < 6% * plafond sécurité sociale temps plein
? contrat salarié . intermittents du spectacle . artiste . acteur de complément . assiette forfaitaire
: applicable si: rémunération . brut < 6% * plafond sécurité sociale temps plein
remplace:
- contrat salarié . cotisations . assiette forfaitaire
- règle: nombre jours travaillés

View File

@ -17,8 +17,8 @@ contrat salarié . convention collective . sport . cotisations . patronales:
- prévoyance . employeur
- financement du paritarisme
contrat salarié . convention collective . sport . cotisations . financement du paritarisme:
# TODO
? contrat salarié . convention collective . sport . cotisations . financement du paritarisme
: # TODO
note: se calcule sur la masse salariale
formule:
produit:
@ -49,15 +49,15 @@ contrat salarié . convention collective . sport . cotisations . prévoyance:
références:
Article 10.8 de la CCNS (IDCC 2511): https://www.legifrance.gouv.fr/affichIDCCArticle.do;?idArticle=KALIARTI000033304755&cidTexte=KALITEXT000017577657&dateTexte=29990101&categorieLien=id
contrat salarié . convention collective . sport . cotisations . régime frais de santé:
remplace: contrat salarié . complémentaire santé . forfait
? contrat salarié . convention collective . sport . cotisations . régime frais de santé
: remplace: contrat salarié . complémentaire santé . forfait
formule:
produit:
assiette: plafond sécurité sociale temps plein
taux: taux
contrat salarié . convention collective . sport . cotisations . régime frais de santé . taux:
formule:
? contrat salarié . convention collective . sport . cotisations . régime frais de santé . taux
: formule:
variations:
- si: régime alsace moselle
alors:
@ -80,8 +80,8 @@ contrat salarié . convention collective . sport . cotisations . régime frais d
unamens.fr: https://www.umanens.fr/reglementation-couverture-sante-obligatoire/ccn-sport
unamens (notice pdf): https://www.umanens.fr/documents/doc-offres-2018/sport/juin-2019/CCN_SPORT_PLAQ_EMPLOYEUR_2019.pdf
contrat salarié . convention collective . sport . cotisations . régime frais de santé . option:
question: Quel option a été choisi pour le régime des frais de santé ?
? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option
: question: Quel option a été choisi pour le régime des frais de santé ?
formule:
une possibilité:
choix obligatoire: oui
@ -92,15 +92,15 @@ contrat salarié . convention collective . sport . cotisations . régime frais d
par défaut: "'R1'"
références:
unamens.fr: https://www.umanens.fr/reglementation-couverture-sante-obligatoire/ccn-sport
contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R1:
formule: option = 'R1'
contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R2:
formule: option = 'R2'
contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R3:
formule: option = 'R3'
? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R1
: formule: option = 'R1'
? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R2
: formule: option = 'R2'
? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R3
: formule: option = 'R3'
contrat salarié . convention collective . sport . cotisations . formation professionnelle:
remplace: contrat salarié . formation professionnelle
? contrat salarié . convention collective . sport . cotisations . formation professionnelle
: remplace: contrat salarié . formation professionnelle
formule:
somme:
- plan de formation
@ -110,8 +110,8 @@ contrat salarié . convention collective . sport . cotisations . formation profe
références:
Article 8.6 de la CCNS (IDCC2511): https://www.legifrance.gouv.fr/affichIDCCArticle.do;?idArticle=KALIARTI000034406905&cidTexte=KALITEXT000017577657&dateTexte=29990101&categorieLien=id
contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation:
formule:
? contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation
: formule:
produit:
assiette: cotisations . assiette
taux:
@ -122,12 +122,12 @@ contrat salarié . convention collective . sport . cotisations . formation profe
alors: 0.90%
plancher: versement minimum
contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation . versement minimum:
applicable si: entreprise . effectif < 10
? contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation . versement minimum
: applicable si: entreprise . effectif < 10
formule: 30 €/mois
contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation:
formule:
? contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation
: formule:
produit:
assiette: cotisations . assiette
taux:
@ -138,12 +138,12 @@ contrat salarié . convention collective . sport . cotisations . formation profe
alors: 0.50%
plancher: versement minimum
contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation . versement minimum:
applicable si: entreprise . effectif < 10
? contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation . versement minimum
: applicable si: entreprise . effectif < 10
formule: 5 €/mois
contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDI:
applicable si:
? contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDI
: applicable si:
toutes ces conditions:
- CDI
- entreprise . effectif >= 20
@ -152,15 +152,15 @@ contrat salarié . convention collective . sport . cotisations . formation profe
assiette: cotisations . assiette
taux: 0.20%
contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDD:
applicable si: CDD
? contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDD
: applicable si: CDD
formule:
produit:
assiette: cotisations . assiette
taux: 1%
contrat salarié . convention collective . sport . cotisations . assiette franchisée:
formule:
? contrat salarié . convention collective . sport . cotisations . assiette franchisée
: formule:
valeur: cotisations . assiette
abattement: franchise
@ -178,13 +178,13 @@ contrat salarié . convention collective . sport . exonération cotisation AT:
par: non
formule: oui
contrat salarié . convention collective . sport . exonération cotisation AT . refus:
titre: refus exonération AT
? contrat salarié . convention collective . sport . exonération cotisation AT . refus
: titre: refus exonération AT
question: L'employeur a-t'il refusé d'être exonéré de cotisations AT ?
par défaut: non
contrat salarié . convention collective . sport . cotisations . assiette forfaitaire:
applicable si: assiette franchisée < SMIC horaire * 115 heures/mois
? contrat salarié . convention collective . sport . cotisations . assiette forfaitaire
: applicable si: assiette franchisée < SMIC horaire * 115 heures/mois
remplace: contrat salarié . cotisations . assiette forfaitaire
formule:
grille:
@ -203,8 +203,8 @@ contrat salarié . convention collective . sport . cotisations . assiette forfai
- montant: 50 * SMIC horaire
plafond: 115 heures
contrat salarié . convention collective . sport . primes . nombre de manifestations:
question: Combien de manifestations rémunérées le joueur a-t'il effectué ?
? contrat salarié . convention collective . sport . primes . nombre de manifestations
: question: Combien de manifestations rémunérées le joueur a-t'il effectué ?
#TODO : gérer la période
par défaut: 0 manifestations
@ -227,8 +227,8 @@ contrat salarié . convention collective . sport . primes . manifestation 1:
applicable si: nombre de manifestations > 0
par défaut: 100
contrat salarié . convention collective . sport . primes . manifestation 1 . franchise:
titre: franchise manifestation 1
? contrat salarié . convention collective . sport . primes . manifestation 1 . franchise
: titre: franchise manifestation 1
formule:
valeur: manifestation 1
plafond: 70% * plafond journalier sécurité sociale
@ -238,8 +238,8 @@ contrat salarié . convention collective . sport . primes . manifestation 2:
applicable si: nombre de manifestations > 1
par défaut: 100
contrat salarié . convention collective . sport . primes . manifestation 2 . franchise:
titre: franchise manifestation 2
? contrat salarié . convention collective . sport . primes . manifestation 2 . franchise
: titre: franchise manifestation 2
formule:
valeur: manifestation 2
plafond: 70% * plafond journalier sécurité sociale
@ -249,8 +249,8 @@ contrat salarié . convention collective . sport . primes . manifestation 3:
applicable si: nombre de manifestations > 2
par défaut: 100
contrat salarié . convention collective . sport . primes . manifestation 3 . franchise:
titre: franchise manifestation 3
? contrat salarié . convention collective . sport . primes . manifestation 3 . franchise
: titre: franchise manifestation 3
formule:
valeur: manifestation 3
plafond: 70% * plafond journalier sécurité sociale
@ -260,8 +260,8 @@ contrat salarié . convention collective . sport . primes . manifestation 4:
applicable si: nombre de manifestations > 3
par défaut: 100
contrat salarié . convention collective . sport . primes . manifestation 4 . franchise:
titre: franchise manifestation 4
? contrat salarié . convention collective . sport . primes . manifestation 4 . franchise
: titre: franchise manifestation 4
formule:
valeur: manifestation 4
plafond: 70% * plafond journalier sécurité sociale
@ -271,14 +271,14 @@ contrat salarié . convention collective . sport . primes . manifestation 5:
applicable si: nombre de manifestations > 4
par défaut: 100
contrat salarié . convention collective . sport . primes . manifestation 5 . franchise:
titre: franchise manifestation 5
? contrat salarié . convention collective . sport . primes . manifestation 5 . franchise
: titre: franchise manifestation 5
formule:
valeur: manifestation 5
plafond: 70% * plafond journalier sécurité sociale
contrat salarié . convention collective . sport . primes . autres manifestations:
question: Quelles primes pour les autres manifestations ?
? contrat salarié . convention collective . sport . primes . autres manifestations
: question: Quelles primes pour les autres manifestations ?
applicable si: nombre de manifestations > 5
par défaut: 100

View File

@ -227,8 +227,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers:
références:
service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32847
dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Alsace:
remplace:
? dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Alsace
: remplace:
- règle: taux service
par: 0.65%
- règle: taux vente
@ -239,8 +239,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers .
références:
service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32847
dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Moselle:
remplace:
? dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Moselle
: remplace:
- règle: taux service
par: 0.83%
- règle: taux vente
@ -249,8 +249,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers .
références:
service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32847
dirigeant . auto-entrepreneur . cotisations et contributions . contribution formation professionnelle:
titre: Contribution à la formation professionnelle
? dirigeant . auto-entrepreneur . cotisations et contributions . contribution formation professionnelle
: titre: Contribution à la formation professionnelle
description: |
En plus des charges sociales, les auto-entrepreneurs sont redevables dune
contribution à la formation professionnelle leur permettant de bénéficier du
@ -310,8 +310,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations:
economie.gouv.fr: https://www.economie.gouv.fr/entreprises/micro-entreprise-auto-entreprise-charges-sociales
actualité urssaf.fr (2019): https://www.autoentrepreneur.urssaf.fr/portail/accueil/sinformer-sur-le-statut/toutes-les-actualites/nouveautes-2019--ce-qui-change-e.html
dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE:
titre: taux ACRE auto-entrepreneur
? dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE
: titre: taux ACRE auto-entrepreneur
applicable si: entreprise . ACRE
remplace:
règle: taux vente restauration hébergement
@ -356,8 +356,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . tau
FAQ Urssaf avant 04/2020: https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html#quest-ce-qui-change-pour-moi-si
service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32318
dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE . prestation de service:
remplace: taux prestation de service
? dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE . prestation de service
: remplace: taux prestation de service
titre: taux prestation de service avec ACRE
variations:
- si:
@ -553,8 +553,8 @@ dirigeant . indépendant . cotisations et contributions . PSS proratisé:
plafond: 100%
arrondi: oui
dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . prorata sur l'année:
description: |
? dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . prorata sur l'année
: description: |
Comme le calcul des cotisations indépendants s'effectue sur l'année entière,
l'exonération est proratisée en fonction de la durée effective de l'ACRE sur l'année courante.
@ -565,8 +565,8 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ACRE .
formule: (1 an - entreprise . durée d'activité . en début d'année) / 1 an
dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . taux:
formule:
? dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . taux
: formule:
taux progressif:
assiette: assiette des cotisations
multiplicateur: PSS proratisé
@ -601,8 +601,8 @@ dirigeant . indépendant . conjoint collaborateur . assiette . forfaitaire:
une assiette équivalente à 40% du PASS.
formule: assiette = 'forfaitaire'
dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec partage:
description: |
? dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec partage
: description: |
Le conjoint collaborateur et le gérant paieront des cotisations sociales chacun sur une part du revenu professionnel.
**Cette option baisse le montant des cotisations à payer pour le gérant, mais elle diminue également ses contreparties sociales (pension de retraite, indemnité décès, etc)**
formule: assiette = 'revenu avec partage'
@ -613,8 +613,8 @@ dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec parta
- cotisations et contributions . retraite de base
- cotisations et contributions . retraite complémentaire
- cotisations et contributions . invalidité et décès
dirigeant . indépendant . conjoint collaborateur . assiette . revenu sans partage:
description: Le conjoint collaborateur paiera des cotisations sociales calculées sur une base d'un pourcentage du assiette des cotisations du gérant de l'entreprise (un tiers ou la moitié).
? dirigeant . indépendant . conjoint collaborateur . assiette . revenu sans partage
: description: Le conjoint collaborateur paiera des cotisations sociales calculées sur une base d'un pourcentage du assiette des cotisations du gérant de l'entreprise (un tiers ou la moitié).
formule: assiette = 'revenu sans partage'
dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage:
@ -627,12 +627,12 @@ dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage:
- tiers
- moitié
dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . tiers:
formule: pourcentage = 'tiers'
? dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . tiers
: formule: pourcentage = 'tiers'
titre: '1/3'
dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . moitié:
formule: pourcentage = 'moitié'
? dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . moitié
: formule: pourcentage = 'moitié'
titre: '1/2'
dirigeant . indépendant . conjoint collaborateur . cotisations . assiette:
@ -660,16 +660,16 @@ dirigeant . indépendant . conjoint collaborateur . cotisations:
- invalidité et décès
- indemnités journalières maladie
dirigeant . indépendant . conjoint collaborateur . cotisations . assiette retraite:
le maximum de:
? dirigeant . indépendant . conjoint collaborateur . cotisations . assiette retraite
: le maximum de:
- cotisations . assiette
- 5.25% * plafond sécurité sociale temps plein
- 200 heures/an * SMIC horaire
unité: €/an
arrondi: oui
dirigeant . indépendant . conjoint collaborateur . cotisations . retraite de base:
unité: €/an
? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite de base
: unité: €/an
barème:
assiette: assiette retraite
multiplicateur: plafond sécurité sociale temps plein
@ -679,8 +679,8 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . retraite de ba
- taux: 0.6%
arrondi: oui
dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire:
unité: €/an
? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire
: unité: €/an
barème:
assiette: retraite complémentaire . assiette
tranches:
@ -690,8 +690,8 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . retraite compl
plafond: 4 * plafond sécurité sociale temps plein
arrondi: oui
dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire . assiette:
titre: assiette retraite complémentaire
? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire . assiette
: titre: assiette retraite complémentaire
unité: €/an
valeur: assiette retraite
plafond:
@ -700,22 +700,22 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . retraite compl
alors: 4 * plafond sécurité sociale temps plein
- sinon: 3 * plafond sécurité sociale temps plein
dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès . assiette:
titre: assiette invalidité et décès
? dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès . assiette
: titre: assiette invalidité et décès
formule:
le maximum de:
- cotisations . assiette
- 20% * plafond sécurité sociale temps plein
dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès:
unité: €/an
? dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès
: unité: €/an
produit:
assiette: assiette
taux: 1.3%
plafond: plafond sécurité sociale temps plein
arrondi: oui
dirigeant . indépendant . conjoint collaborateur . cotisations . indemnités journalières maladie:
produit:
? dirigeant . indépendant . conjoint collaborateur . cotisations . indemnités journalières maladie
: produit:
assiette:
valeur: 40% * plafond sécurité sociale temps plein
unité: €/an
@ -789,8 +789,8 @@ dirigeant . indépendant . assiette minimale . retraite:
références:
cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/
dirigeant . indépendant . cotisations et contributions . contributions spéciales:
description: |
? dirigeant . indépendant . cotisations et contributions . contributions spéciales
: description: |
Certains régimes spéciaux peuvent ajouter des contributions additionnelles
(par exemple, la CURPS pour les CPAM)
formule: non
@ -816,8 +816,8 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac:
Si vous exercez une activité de débit de tabac simultanément à une activité commerciale, vous avez la possibilité dopter pour le calcul de votre cotisation dassurance vieillesse sur le seul revenu tiré de votre activité commerciale (en effet, les remises pour débit de tabac sont soumises par ailleurs à un prélèvement vieillesse particulier). Nous attirons cependant votre attention sur le fait quen cotisant sur une base moins importante, excluant les revenus de débit de tabac, vos droits à retraite pour lassurance vieillesse des commerçants en seront diminués.
par défaut: 0 €/an
dirigeant . indépendant . cotisations et contributions . déduction tabac . revenus déduits:
titre: assiette des cotisations (avec déduction tabac)
? dirigeant . indépendant . cotisations et contributions . déduction tabac . revenus déduits
: titre: assiette des cotisations (avec déduction tabac)
applicable si: déduction tabac
remplace:
règle: assiette des cotisations
@ -879,8 +879,8 @@ dirigeant . indépendant . cotisations facultatives . contrats madelin:
- prévoyance
- retraite
dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance:
titre: Souscription à un contrat de prévoyance complémentaire Madelin
? dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance
: titre: Souscription à un contrat de prévoyance complémentaire Madelin
question: Quel est le montant que vous versez pour vos contrats Madelin de prévoyance complémentaire (santé, perte d'emploi subie) ?
unité: €/an
description: |
@ -912,8 +912,8 @@ dirigeant . indépendant . cotisations facultatives . plafond prévoyance:
Réassurez-moi: https://reassurez-moi.fr/guide/pro/tns/plafond#le_plafond_de_deduction_madelin_pour_une_mutuelle_santenbsp
note: |
Normalement c'est le résultat fiscal qui devrait être utilisé pour l'assiette du plafond, mais on utilise le revenu professionnel pour éviter un cycle.
dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite:
titre: Souscription à une retraite Madelin
? dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite
: titre: Souscription à une retraite Madelin
question: Quel est le montant que vous versez pour votre contrat Madelin retraite complémentaire ?
description: |
Si vous cotisez au titre d'un contrat retraite de type loi Madelin,
@ -925,8 +925,8 @@ dirigeant . indépendant . cotisations facultatives . contrats madelin . retrait
Article de loi: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000029042287&cidTexte=LEGITEXT000006069577&dateTexte=20140530&fastReqId=1900907951&nbResultRech=1
par défaut: 0 €/an
dirigeant . indépendant . cotisations facultatives . plafond retraite complémentaire:
unité: €/an
? dirigeant . indépendant . cotisations facultatives . plafond retraite complémentaire
: unité: €/an
formule:
le maximum de:
- barème:
@ -981,8 +981,8 @@ dirigeant . indépendant . cotisations et contributions . début activité:
références:
Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/lajustement-et-la-regularisation.html
dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire:
produit:
? dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire
: produit:
assiette: PSS proratisé
taux: 19%
unité: €/an
@ -1016,8 +1016,8 @@ dirigeant . indépendant . cotisations et contributions . régularisation:
Article L131-6-2 du Code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000037062224/
Article D131-3 du Code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000038786941/2021-03-01/?isSuggest=true
dirigeant . indépendant . cotisations et contributions . indemnités journalières maladie:
synonyme: maladie 2
? dirigeant . indépendant . cotisations et contributions . indemnités journalières maladie
: synonyme: maladie 2
description: |
Cotisations pour les indemnités journalières des indépendants. Si l'état de
santé des artisans, commerçants, industriels et conjoints collaborateurs
@ -1061,8 +1061,8 @@ dirigeant . indépendant . cotisations et contributions . maladie:
Le terme "lorsque" laisse entendre qu'en cas de dépassement du seuil 5xPSS, tout le revenu est soumis à 6.5%. Il semblerait qu'une interprétation inverse soit à privilégier : seule la part supérieure à ce seuil est soumise à ce taux, et c'est cette implémentation que nous avons retenue.
dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire:
description: |
? dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire
: description: |
La réduction supplémentaire du taux maladie pour les revenu inférieurs à 40% du plafond de la sécurité sociale
non applicable si: situation personnelle . RSA
remplace:
@ -1080,8 +1080,8 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux progres
Taux de cotisations: https://www.secu-independants.fr/cotisations/calcul-cotisations/taux-de-cotisations/
décret formule de calcul: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000036342439&categorieLien=id
dirigeant . indépendant . cotisations et contributions . maladie . taux progressif:
taux progressif:
? dirigeant . indépendant . cotisations et contributions . maladie . taux progressif
: taux progressif:
assiette:
nom: assiette
valeur: assiette des cotisations
@ -1109,8 +1109,8 @@ dirigeant . indépendant . cotisations et contributions . retraite de base:
références:
Cotisation minimale: https://www.secu-independants.fr/cotisations/calcul-des-cotisations/cotisations-minimales/
dirigeant . indépendant . cotisations et contributions . retraite complémentaire:
formule:
? dirigeant . indépendant . cotisations et contributions . retraite complémentaire
: formule:
barème:
assiette: assiette des cotisations
tranches:
@ -1199,8 +1199,8 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette
- dirigeant . indépendant . IJSS . imposable
plancher: 0 €/mois
dirigeant . indépendant . cotisations et contributions . formation professionnelle:
acronyme: CFP
? dirigeant . indépendant . cotisations et contributions . formation professionnelle
: acronyme: CFP
produit:
assiette: plafond sécurité sociale temps plein
taux:
@ -1261,8 +1261,8 @@ dirigeant . indépendant . cotisations et contributions . exonérations . âge:
applicable si: entreprise . date de création < 01/2016
rend non applicable: invalidité et décès
dirigeant . indépendant . cotisations et contributions . exonérations . invalidité:
question: Êtes-vous titulaire dune pension dinvalidité à titre de travailleur indépendant ?
? dirigeant . indépendant . cotisations et contributions . exonérations . invalidité
: 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:
@ -1271,8 +1271,8 @@ dirigeant . indépendant . cotisations et contributions . exonérations . invali
- indemnités journalières maladie
- retraite complémentaire
dirigeant . indépendant . cotisations et contributions . exonérations . ZFU . taux:
titre: taux exonération ZFU
? dirigeant . indépendant . cotisations et contributions . exonérations . ZFU . taux
: titre: taux exonération ZFU
formule:
taux progressif:
assiette: établissement . ZFU . durée d'implantation en fin d'année
@ -1310,8 +1310,8 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ZFU .
- plafond: 9 ans
taux: 0%
dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger:
applicable si: situation personnelle . domiciliation fiscale à l'étranger
? dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger
: applicable si: situation personnelle . domiciliation fiscale à l'étranger
titre: Maladie (domiciliation fiscale à l'étranger)
description: En contrepartie de l'exonération de CSG, les cotisants ont un taux maladie plus elevé. Contrairement aux autres assurés commerçants/artisans ils ne bénéficient pas de la réduction du taux de la cotisation maladie en fonction du revenu déclaré.
remplace: maladie

View File

@ -53,8 +53,8 @@ aide déclaration revenu indépendant 2020 . cotisations payées:
non applicable si: résultat simple
valeur: oui
aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociales:
remplace:
? aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociales
: remplace:
règle: dirigeant . indépendant . cotisations et contributions
par:
somme:
@ -83,8 +83,8 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductib
3. Puis, "attestation CSG/CRDS"
4. Reportez dans ce champs le total de la colonne "Montant déductible CSG" (dernière ligne)
aide déclaration revenu indépendant 2020 . cotisations payées . CSG non déductible:
question: Quel est le montant total de CSG non déductible payé cette année ?
? aide déclaration revenu indépendant 2020 . cotisations payées . CSG non déductible
: question: Quel est le montant total de CSG non déductible payé cette année ?
unité: €/an
description: |
Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre :
@ -107,8 +107,8 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CRDS:
3. Puis, "attestation CSG/CRDS"
4. Reportez dans ce champs le total de la colonne "Montant non déductible : CRDS" (dernière ligne)
aide déclaration revenu indépendant 2020 . cotisations payées . cotisations obligatoires déductibles:
remplace: cotisations obligatoires déductibles
? aide déclaration revenu indépendant 2020 . cotisations payées . cotisations obligatoires déductibles
: remplace: cotisations obligatoires déductibles
unité: €/an
valeur: cotisations payées . total charges sociales
abattement:
@ -133,20 +133,20 @@ aide déclaration revenu indépendant 2020 . cotisations payées version simple:
- cotisations payées version simple . cotisations sociales
- cotisations payées version simple . CSG déductible et CFP
aide déclaration revenu indépendant 2020 . cotisations payées version simple . CSG déductible et CFP:
question: Quel est le montant total de CSG déductible et CFP payées cette année ?
? aide déclaration revenu indépendant 2020 . cotisations payées version simple . CSG déductible et CFP
: question: Quel est le montant total de CSG déductible et CFP payées cette année ?
unité: €/an
description: |
Indiquez le montant de la part de CSG déductible et de CFP que vous avez payé en 2020 (peu importe lannée à laquelle ces contributions se rapportent).
aide déclaration revenu indépendant 2020 . cotisations payées version simple . cotisations sociales:
question: Quel est le montant de vos cotisations sociales payées cette année ?
? aide déclaration revenu indépendant 2020 . cotisations payées version simple . cotisations sociales
: question: Quel est le montant de vos cotisations sociales payées cette année ?
unité: €/an
description: |
Indiquez le montant des cotisations sociales aux régimes obligatoires (maladie-maternité, vieillesse, invalidité-décès, famille) que vous avez payées en 2020 (peu importe lannée à laquelle ces cotisations se rapportent).
aide déclaration revenu indépendant 2020 . régime d'imposition: oui
aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée:
titre: régime de la déclaration contrôlée
? aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée
: titre: régime de la déclaration contrôlée
applicable si: entreprise . activité . libérale
non applicable si:
une de ces conditions:
@ -178,8 +178,8 @@ aide déclaration revenu indépendant 2020 . régime d'imposition . réel:
- simplifié
- normal
aide déclaration revenu indépendant 2020 . régime d'imposition . réel . simplifié:
description: |
? aide déclaration revenu indépendant 2020 . régime d'imposition . réel . simplifié
: description: |
Les entreprises soumises au régime d'imposition réel simplifié doivent tenir une comptabilité classique : un bilan, un compte de résultat et des annexes. Des dispositions particulières sappliquent pour alléger vos obligations comptables :
- le livre journal nenregistre journellement que les recettes encaissées et les dépenses payées
@ -353,8 +353,8 @@ aide déclaration revenu indépendant 2020 . réduction covid . montant:
somme:
- printemps 2020
- automne 2020
aide déclaration revenu indépendant 2020 . réduction covid . conjoint collaborateur:
applicable si: dirigeant . indépendant . conjoint collaborateur
? aide déclaration revenu indépendant 2020 . réduction covid . conjoint collaborateur
: applicable si: dirigeant . indépendant . conjoint collaborateur
remplace:
règle: dirigeant . indépendant . conjoint collaborateur . cotisations
par:
@ -377,23 +377,23 @@ aide déclaration revenu indépendant 2020 . réduction covid . part cotisations
assiette: montant
taux: pourcentage cotisations
aide déclaration revenu indépendant 2020 . réduction covid . pourcentage cotisations:
unité: '%'
? aide déclaration revenu indépendant 2020 . réduction covid . pourcentage cotisations
: unité: '%'
valeur: dirigeant . indépendant . cotisations et contributions . cotisations / (dirigeant . indépendant . cotisations et contributions . cotisations + dirigeant . indépendant . cotisations et contributions . CSG et CRDS)
aide déclaration revenu indépendant 2020 . réduction covid . part CSG:
titre: Part réduction Covid sur CSG
valeur: montant - part cotisations
aide déclaration revenu indépendant 2020 . réduction covid . part CSG . déductible:
titre: Part réduction Covid sur CSG/CRDS déductible
? aide déclaration revenu indépendant 2020 . réduction covid . part CSG . déductible
: titre: Part réduction Covid sur CSG/CRDS déductible
produit:
assiette: part CSG
taux: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible . taux / taux CSG
arrondi: oui
aide déclaration revenu indépendant 2020 . réduction covid . part CSG . non déductible:
titre: Part réduction Covid sur CSG/CRDS non déductible
? aide déclaration revenu indépendant 2020 . réduction covid . part CSG . non déductible
: titre: Part réduction Covid sur CSG/CRDS non déductible
valeur: part CSG - part CSG . déductible
aide déclaration revenu indépendant 2020 . réduction covid . taux CSG:
@ -403,16 +403,16 @@ aide déclaration revenu indépendant 2020 . réduction covid . taux CSG:
- dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible . taux
- dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible . taux
aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020:
applicable si: éligible aide printemps 2020
? aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020
: applicable si: éligible aide printemps 2020
formule:
variations:
- si: secteur d'activité = 'S2'
alors: 1800 €/an
- sinon: 2400 €/an
aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020:
applicable si: éligible aide automne 2020
? aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020
: applicable si: éligible aide automne 2020
formule: nombre de mois éligibles * 600 €/an/mois éligibles
aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité:
@ -449,22 +449,22 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi
- S2
par défaut: non
aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1:
titre: Secteur dit S1
? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1
: titre: Secteur dit S1
description: |
Secteurs du tourisme, de lhôtellerie, de la restauration, du sport, de la culture, du transport aérien et de lévénementiel.
aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis:
titre: Secteur dit S1 bis
? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis
: titre: Secteur dit S1 bis
description: |
Secteurs dont lactivité dépend de celle des secteurs 1 et qui ont subi une très forte baisse de leur chiffre daffaires.
aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2:
titre: Secteur dit S2
? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2
: titre: Secteur dit S2
description: Autres secteurs dactivité qui ont fait lobjet dune interdiction affectant de manière prépondérante la poursuite de leur activité.
aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020:
applicable si: secteur d'activité
? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020
: applicable si: secteur d'activité
question: Êtes-vous éligibles au dispositif de réduction prévu au titre de la première vague de la crise sanitaire du printemps 2020 ?
par défaut: non
description: |
@ -499,8 +499,8 @@ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide p
Votre activité doit avoir débuté avant le 1er juin 2020.
Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020.
aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020:
applicable si: secteur d'activité
? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020
: applicable si: secteur d'activité
question: Êtes-vous éligibles au dispositif de réduction prévu au titre de la première vague de la crise sanitaire de l'automne 2020 ?
par défaut: non
description: |
@ -553,15 +553,15 @@ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide a
Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition dinterdiction.
aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles:
formule:
? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles
: formule:
somme:
- S1 et S1bis
- S2
arrondi: oui
aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 et S1bis:
applicable si:
? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 et S1bis
: applicable si:
toutes ces conditions:
- éligible aide automne 2020
- une de ces conditions:
@ -574,8 +574,8 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois
unité: mois éligibles
plafond: 6 mois éligibles
aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2:
applicable si:
? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2
: applicable si:
toutes ces conditions:
- éligible aide automne 2020
- secteur d'activité = 'S2'
@ -806,39 +806,39 @@ aide déclaration revenu indépendant 2020 . informations résultat par formulai
applicable si: comptabilité . engagement
non applicable si: entreprise . imposition . IR . micro-fiscal
valeur: oui
aide déclaration revenu indépendant 2020 . informations résultat par formulaire . réduction Covid:
description: La réduction de cotisation applicable dans le cas du dispositif Covid
? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . réduction Covid
: description: La réduction de cotisation applicable dans le cas du dispositif Covid
valeur: réduction covid . total
aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération totale:
titre: Total rémunération dirigeant
? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération totale
: titre: Total rémunération dirigeant
résumé: '[A]'
description: La rémunération "superbrute" du dirigeant, incluant toutes les cotisations et contributions sociales.
valeur: dirigeant . rémunération . totale
aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations déductibles:
résumé: '[C1]'
? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations déductibles
: résumé: '[C1]'
description: "Cotisations et contributions sociales déductibles pour le calcul de l'assiette sociale"
somme:
- cotisations obligatoires déductibles
- dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible
- dirigeant . indépendant . cotisations et contributions . formation professionnelle
aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations non déductibles:
résumé: '[C2]'
? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations non déductibles
: résumé: '[C2]'
description: Cotisations et contributions sociales non déductibles pour le calcul de l'assiette sociale
valeur:
somme:
- dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible
- dirigeant . indépendant . cotisations facultatives . total
aide déclaration revenu indépendant 2020 . informations résultat par formulaire . assiette sociale:
résumé: '[A - C1]'
? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . assiette sociale
: résumé: '[A - C1]'
description: Assiette utilisée pour le calcul des cotisations sociales.
valeur: dirigeant . indépendant . assiette des cotisations
aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération nette:
résumé: '[A - C1 - C2]'
? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération nette
: résumé: '[A - C1 - C2]'
description: Le revenu net du dirigeant avant impôt sur le revenu. C'est la rémunération effectivement versée.
valeur: dirigeant . rémunération . nette
@ -850,8 +850,8 @@ aide déclaration revenu indépendant 2020 . résultat simple . revenu net fisca
description: Résultat avant déduction des charges sociales et exonérations fiscales
valeur: dirigeant . rémunération . totale
aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires:
titre: Cotisations sociales obligatoires déductibles
? aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires
: titre: Cotisations sociales obligatoires déductibles
résumé: '[C]'
description: |
À reporter dans :
@ -881,8 +881,8 @@ aide déclaration revenu indépendant 2020 . résultat simple . CFP:
description: Contribution à la formation professionnelle
valeur: dirigeant . indépendant . cotisations et contributions . formation professionnelle
aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible:
non applicable si: entreprise . imposition . IR . micro-fiscal
? aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible
: non applicable si: entreprise . imposition . IR . micro-fiscal
titre: charges sociales obligatoires déductibles fiscalement
résumé: '[B + C + D]'
somme:

View File

@ -90,8 +90,8 @@ impôt . revenu imposable . abattement contrat court:
références:
Bofip - dispositions spécifiques aux contrats courts: https://bofip.impots.gouv.fr/bofip/11252-PGP.html?identifiant=BOI-IR-PAS-20-20-30-10-20180515
impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique:
icônes: 🇬🇵🇷🇪 🇲🇶
? impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique
: icônes: 🇬🇵🇷🇪 🇲🇶
formule:
grille:
assiette: revenu imposable
@ -426,8 +426,8 @@ impôt . foyer fiscal . impôt sur le revenu . quotient familial:
unité: €/part/an
formule: revenu imposable / nombre de parts
impôt . foyer fiscal . impôt sur le revenu . quotient familial . plafond avantage:
formule:
? impôt . foyer fiscal . impôt sur le revenu . quotient familial . plafond avantage
: formule:
somme:
- produit:
assiette:

View File

@ -143,8 +143,8 @@ dirigeant . indépendant . PL . régime général:
- CIPAV = non
- entreprise . activité . libérale réglementée = non
dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire:
titre: taux spécifique profession libérale non reglementée
? dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire
: titre: taux spécifique profession libérale non reglementée
question: Avez-vous opté pour des taux spécifiques de cotisation retraite complémentaire ?
par défaut: non
description: |
@ -156,8 +156,8 @@ dirigeant . indépendant . PL . régime général . taux spécifique retraite co
références:
Guide PL urssaf: https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf
dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire . montant:
titre: retraite complémentaire (taux PLNR)
? dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire . montant
: titre: retraite complémentaire (taux PLNR)
remplace: cotisations et contributions . retraite complémentaire
formule:
barème:
@ -276,8 +276,8 @@ dirigeant . indépendant . PL . CIPAV . invalidité et décès:
- si: classe de cotisation = 'C'
alors: 380 €/an
dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation:
question: Dans quelle classe cotisez-vous pour le régime invalidité-décès de la CIPAV ?
? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation
: question: Dans quelle classe cotisez-vous pour le régime invalidité-décès de la CIPAV ?
description: >-
La Cipav gère un régime de prévoyance versant une pension en cas
d'invalidité permanente et un capital décès ainsi quune rente pour les
@ -293,12 +293,12 @@ dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotis
- C
par défaut: "'A'"
dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . A:
titre: classe A
dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . B:
titre: classe B
dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . C:
titre: classe C
? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . A
: titre: classe A
? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . B
: titre: classe B
? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . C
: titre: classe C
dirigeant . indépendant . PL . retraite CNAVPL:
non applicable si:
@ -360,8 +360,8 @@ dirigeant . indépendant . PL . PAMC:
- dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger
formule: oui
dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée:
question: |
? dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée
: question: |
Quel est la part de votre chiffre d'affaires liée à une activité non
conventionnée (estimation) ?
par défaut: 0%
@ -383,8 +383,8 @@ dirigeant . indépendant . PL . PAMC . proportion recette activité non conventi
(aide à la télétransmission, indemnisation, indemnisation de la formation
continue, prime à linstallation, ...)
dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée . notification:
type: notification
? dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée . notification
: type: notification
sévérité: avertissement
formule: proportion recette activité non conventionnée > 100%
description: |
@ -529,8 +529,8 @@ dirigeant . indépendant . PL . PAMC . allocations familiales:
références:
Fiche Urssaf: https://www.urssaf.fr/portail/home/taux-et-baremes/taux-de-cotisations/les-praticiens-et-auxiliaires-me/taux-de-cotisations-medecin-sect.html
dirigeant . indépendant . PL . PAMC . allocations familiales . participation CPAM:
titre: Participation CPAM aux allocations familiales
? dirigeant . indépendant . PL . PAMC . allocations familiales . participation CPAM
: titre: Participation CPAM aux allocations familiales
formule:
produit:
assiette: cotisations et contributions . allocations familiales
@ -546,8 +546,8 @@ dirigeant . indépendant . PL . PAMC . allocations familiales . participation CP
- montant: 60%
arrondi: oui
dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste:
applicable si: métier = 'santé . chirurgien-dentiste'
? dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste
: applicable si: métier = 'santé . chirurgien-dentiste'
titre: assiette participation CPAM (chirurgien dentiste)
remplace: assiette participation CPAM
formule:
@ -558,8 +558,8 @@ dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentist
Fiche Urssaf: https://www.urssaf.fr/portail/home/praticien-et-auxiliaire-medical/mes-cotisations/le-calcul-de-mes-cotisations/la-participation-de-la-cpam-a-me/je-suis-chirurgien-dentiste/assiette-de-participation-de-la.html
Texte de loi: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000020429271&categorieLien=id
dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf:
description: |
? dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf
: description: |
Le « taux Urssaf » (taux UR) permet de calculer la part de votre
cotisation dassurance maladie-maternité prise en charge par la CPAM.
@ -578,8 +578,8 @@ dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentist
unité: ''
par défaut: 1
dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf . notification:
formule: taux Urssaf >= 100
? dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf . notification
: formule: taux Urssaf >= 100
type: notification
sévérité: avertissement
description: Le taux Urssaf doit être inférieur à 100
@ -848,8 +848,8 @@ dirigeant . indépendant . PL . CARCDSF . retraite complémentaire:
références:
Site CARCDSF: http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation proportionnelle:
formule:
? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation proportionnelle
: formule:
barème:
assiette: assiette des cotisations
multiplicateur: plafond sécurité sociale temps plein
@ -860,8 +860,8 @@ dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation
plafond: 5
arrondi: oui
dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire:
formule:
? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire
: formule:
produit:
assiette: 2960.40 €/an
facteur:
@ -871,16 +871,16 @@ dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation
- sinon: 100%
arrondi: oui
dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable:
formule: assiette des cotisations < 85% * plafond sécurité sociale temps plein
? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable
: formule: assiette des cotisations < 85% * plafond sécurité sociale temps plein
description: |
Vous avez la possibilité de bénéficier d'une réduction de cotisation
pour la retraite complémentaire si vous en faites la demande. [En savoir
plus](/documentation/dirigeant/indépendant/PL/CARCDSF/retraite-complémentaire/cotisation-forfaitaire/taux-réduction)
type: notification
dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . taux réduction:
applicable si: réduction applicable
? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . taux réduction
: applicable si: réduction applicable
description: |
Les affiliés dont les revenus professionnels nets sur l'année N-1 sont inférieurs à 85
% du PASS en vigueur au 1er janvier de lannée considérée (34 966 € en 2020)
@ -927,18 +927,18 @@ dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV:
- proportionnelle
arrondi: oui
dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . forfaitaire:
formule: 1440.60 €/an
dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . proportionnelle:
formule:
? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . forfaitaire
: formule: 1440.60 €/an
? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . proportionnelle
: formule:
produit:
assiette: assiette des cotisations
plafond: 5 * plafond sécurité sociale temps plein
taux: 0.725 %
références:
Site CARCDSF: http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . participation CPAM:
titre: Participation CPAM à la prestation complémentaire vieillesse
? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . participation CPAM
: titre: Participation CPAM à la prestation complémentaire vieillesse
formule:
somme:
- 2 * forfaitaire
@ -955,8 +955,8 @@ dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . exonération PCV
faites la demande. [En savoir
plus](http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations)
dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . prix d'une consultation:
formule: 23 €/consultation
? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . prix d'une consultation
: formule: 23 €/consultation
dirigeant . indépendant . PL . CARCDSF . sage-femme:
applicable si: métier = 'santé . sage-femme'
@ -1074,8 +1074,8 @@ dirigeant . indépendant . PL . CNBF . retraite de base . cotisation forfaitaire
plafond: 5 ans
- montant: 1586 €/an
dirigeant . indépendant . PL . CNBF . retraite de base . cotisation proportionnelle:
formule:
? dirigeant . indépendant . PL . CNBF . retraite de base . cotisation proportionnelle
: formule:
produit:
taux: 3.1%
assiette: assiette des cotisations

View File

@ -102,8 +102,8 @@ protection sociale . retraite . trimestres validés . trimestres indépendant:
valeur: barème trimestres générique
plancher: 3
protection sociale . retraite . trimestres validés . barème trimestres générique:
unité: trimestres validés/an
? protection sociale . retraite . trimestres validés . barème trimestres générique
: unité: trimestres validés/an
formule:
grille:
unité: trimestres validés/an
@ -122,8 +122,8 @@ protection sociale . retraite . trimestres validés . barème trimestres génér
références:
cnav.fr: https://www.legislation.cnav.fr/Pages/bareme.aspx?Nom=salaire_validant_un_trimestre_montant_bar
Article R351-9 du code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000028751530/2014-03-21
protection sociale . retraite . trimestres validés . trimestres auto-entrepreneur:
applicable si: dirigeant . auto-entrepreneur
? protection sociale . retraite . trimestres validés . trimestres auto-entrepreneur
: applicable si: dirigeant . auto-entrepreneur
description: Les seuils de chiffre d'affaires minimum pour la validation des trimestres pour la retraite en auto-entrepreneur. En-dessous du montant minimum, vous n'aurez accès qu'à l'allocation de solidarité.
unité: trimestres validés/an
somme:
@ -218,15 +218,15 @@ protection sociale . retraite . complémentaire indépendants . valeur du point:
références:
secu-independants.fr: https://www.secu-independants.fr/baremes/prestations-vieillesse-et-invalidite-deces
protection sociale . retraite . complémentaire indépendants . total points acquis:
formule: points acquis * mois cotisés
? protection sociale . retraite . complémentaire indépendants . total points acquis
: formule: points acquis * mois cotisés
protection sociale . retraite . complémentaire indépendants . points acquis:
unité: points/an
valeur: dirigeant . indépendant . cotisations et contributions . retraite complémentaire / prix d'achat du point
protection sociale . retraite . complémentaire indépendants . prix d'achat du point:
formule: 17.765 €/point
? protection sociale . retraite . complémentaire indépendants . prix d'achat du point
: formule: 17.765 €/point
références:
secu-independants.fr: https://www.secu-independants.fr/baremes/baremes-2018/baremesprestations-maladie-maternite/?reg=ile-de-france-centre&ae=oui

View File

@ -146,8 +146,8 @@ contrat salarié . frais professionnels . titres-restaurant . montant unitaire:
moyenne: 8 €/titre-restaurant
max exonéré: 11.10 €/titre-restaurant
contrat salarié . frais professionnels . titres-restaurant . taux participation employeur:
description: >-
? contrat salarié . frais professionnels . titres-restaurant . taux participation employeur
: description: >-
Part du titre-restaurant payée par l'employeur. Doit être de 50% minimum et
de 60% maximum.
question: Quelle est la participation de l'employeur ?
@ -156,14 +156,14 @@ contrat salarié . frais professionnels . titres-restaurant . taux participation
50%: 50 %
60%: 60 %
contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur min:
type: notification
? contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur min
: type: notification
sévérité: avertissement
formule: taux participation employeur < 50%
description: La part employeur du titre-restaurant doit être de 50% au minimum
contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur max:
type: notification
? contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur max
: type: notification
sévérité: avertissement
formule: taux participation employeur > 60%
description: La part employeur du titre-restaurant doit être de 60% au maximum
@ -172,8 +172,8 @@ contrat salarié . frais professionnels . abonnement transports publics:
icônes: 🚍
valeur: oui
contrat salarié . frais professionnels . abonnement transports publics . montant:
titre: Abonnement aux transports publics
? contrat salarié . frais professionnels . abonnement transports publics . montant
: titre: Abonnement aux transports publics
question: Quel montant le salarié dépense-t-il en abonnement aux transports publics chaque mois ?
unité: €/mois
par défaut: 0 €/mois
@ -193,11 +193,11 @@ contrat salarié . frais professionnels . abonnement transports publics . montan
Tisséo: 42.50 €/mois
TBM: 42.20 €/mois
contrat salarié . frais professionnels . abonnement transports publics . taux de participation employeur:
valeur: 50%
? contrat salarié . frais professionnels . abonnement transports publics . taux de participation employeur
: valeur: 50%
contrat salarié . frais professionnels . abonnement transports publics . taux de prise en charge:
titre: Taux de prise en charge
? contrat salarié . frais professionnels . abonnement transports publics . taux de prise en charge
: titre: Taux de prise en charge
valeur:
produit:
assiette:
@ -206,8 +206,8 @@ contrat salarié . frais professionnels . abonnement transports publics . taux d
- 50%
taux: 2 * taux de participation employeur
contrat salarié . frais professionnels . abonnement transports publics . prise en charge:
titre: Abonnement transports publics, part prise en charge par l'employeur (déductible)
? contrat salarié . frais professionnels . abonnement transports publics . prise en charge
: titre: Abonnement transports publics, part prise en charge par l'employeur (déductible)
unité: €/mois
valeur: taux de prise en charge * montant
@ -224,14 +224,14 @@ contrat salarié . frais professionnels . transports personnels . montant:
- carburant faible émission . montant
- forfait mobilités durables . montant
contrat salarié . frais professionnels . transports personnels . part déductible:
valeur:
? contrat salarié . frais professionnels . transports personnels . part déductible
: valeur:
somme:
- carburant faible émission . part déductible
- forfait mobilités durables . part déductible
contrat salarié . frais professionnels . transports personnels . proportion déduction:
titre: Facteur de proportion de la déductibilité
? contrat salarié . frais professionnels . transports personnels . proportion déduction
: titre: Facteur de proportion de la déductibilité
valeur:
produit:
assiette:
@ -242,11 +242,11 @@ contrat salarié . frais professionnels . transports personnels . proportion dé
références:
Article R3261-14 du code du travail, version 11/05/2020: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000041865023/2020-05-11/
contrat salarié . frais professionnels . transports personnels . carburant faible émission:
valeur: oui
? contrat salarié . frais professionnels . transports personnels . carburant faible émission
: valeur: oui
contrat salarié . frais professionnels . transports personnels . carburant faible émission . montant:
titre: Prise en charge du carburant pour véhicule électrique, hybride rechargeable ou hydrogène
? contrat salarié . frais professionnels . transports personnels . carburant faible émission . montant
: titre: Prise en charge du carburant pour véhicule électrique, hybride rechargeable ou hydrogène
question: Quel montant l'employeur prend-il en charge des dépenses en carburant pour véhicule électrique, hybride rechargeable ou hydrogènes?
unité: €/an
par défaut: 0 €/an
@ -266,8 +266,8 @@ contrat salarié . frais professionnels . transports personnels . carburant faib
Articles R3261-11 à -13 du code du travail, version 11/05/2020: https://www.legifrance.gouv.fr/codes/section_lc/LEGITEXT000006072050/LEGISCTA000018487476/2020-05-11
Article 81 du code des impôts, version en vigueur au 31/12/2020: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000042910732/2020-12-31/
contrat salarié . frais professionnels . transports personnels . carburant faible émission . part déductible:
titre: Prise en charge du carburant pour véhicule électrique, hybride rechargeable ou hydrogène (part déductible)
? contrat salarié . frais professionnels . transports personnels . carburant faible émission . part déductible
: titre: Prise en charge du carburant pour véhicule électrique, hybride rechargeable ou hydrogène (part déductible)
unité: €/an
valeur: montant
plafond:
@ -276,11 +276,11 @@ contrat salarié . frais professionnels . transports personnels . carburant faib
- valeur: proportion déduction * 500€/an
abattement: abonnement transports publics . prise en charge
contrat salarié . frais professionnels . transports personnels . forfait mobilités durables:
valeur: oui
? contrat salarié . frais professionnels . transports personnels . forfait mobilités durables
: valeur: oui
contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . montant:
titre: Prise en charge des frais de transports forfait mobilités durables
? contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . montant
: titre: Prise en charge des frais de transports forfait mobilités durables
question: Quel montant l'employeur prend-il en charge dans le cadre du forfait mobilités durables ?
unité: €/an
par défaut: 0 €/an
@ -312,8 +312,8 @@ contrat salarié . frais professionnels . transports personnels . forfait mobili
Articles R3261-13-1 à -13-2 du code du travail, version 11/05/2020: https://www.legifrance.gouv.fr/codes/section_lc/LEGITEXT000006072050/LEGISCTA000018487476/2020-05-11
Article 81 du code des impôts, version en vigueur au 31/12/2020: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000042910732/2020-12-31/
contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . part déductible:
titre: Prise en charge des frais de transports forfait mobilités durables (part déductible)
? contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . part déductible
: titre: Prise en charge des frais de transports forfait mobilités durables (part déductible)
unité: €/an
valeur: montant
plafond:
@ -377,8 +377,8 @@ contrat salarié . activité partielle . heures travaillées:
20 h/semaine: 86.6666 heures/mois
10 h/semaine: 43.3333 heures/mois
contrat salarié . activité partielle . heures travaillées . contrôle temps de travail:
type: notification
? contrat salarié . activité partielle . heures travaillées . contrôle temps de travail
: type: notification
sévérité: avertissement
formule: heures travaillées > temps de travail . temps contractuel
description: >-
@ -455,8 +455,8 @@ contrat salarié . activité partielle . indemnités . conventionnelle:
Legifrance: https://www.legifrance.gouv.fr/affichIDCCArticle.do?idArticle=KALIARTI000028465400&cidTexte=KALITEXT000028465378&dateTexte=29990101&categorieLien=id
Juritravail: https://www.juritravail.com/Actualite/Hygiene-securite-travail-employeur/Id/327284
contrat salarié . activité partielle . indemnités . conventionnelle . part soumise à cotisation:
applicable si:
? contrat salarié . activité partielle . indemnités . conventionnelle . part soumise à cotisation
: applicable si:
toutes ces conditions:
- indemnités . conventionnelle > 0
- indemnités . conventionnelle + indemnités . base > 3.15 * SMIC
@ -496,8 +496,8 @@ contrat salarié . activité partielle . indemnisation entreprise:
avec:
rémunération . brut de base: 4.5 * SMIC
contrat salarié . activité partielle . indemnisation entreprise . taux d'indemnisation:
description: >-
? contrat salarié . activité partielle . indemnisation entreprise . taux d'indemnisation
: description: >-
Depuis le 1er juin, le taux d'indemnisation de l'entreprise passe à 60%.
L'indemnité versée à l'employé reste inchangée et c'est donc l'entreprise
qui devra prendre en charge la différence.
@ -613,8 +613,8 @@ contrat salarié . déduction forfaitaire spécifique . profession . journaliste
Concerne les journalistes, rédacteurs, photographes, directeurs de journaux
Critiques dramatiques et musicaux.
contrat salarié . déduction forfaitaire spécifique . profession . journaliste . réduction de taux:
applicable si: déduction forfaitaire spécifique . profession = 'journaliste'
? contrat salarié . déduction forfaitaire spécifique . profession . journaliste . réduction de taux
: applicable si: déduction forfaitaire spécifique . profession = 'journaliste'
remplace:
- règle: vieillesse . employeur . plafonnée . taux
par: vieillesse . employeur . plafonnée . taux * réduction de taux
@ -635,29 +635,29 @@ contrat salarié . déduction forfaitaire spécifique . profession . journaliste
par: ATMP . taux minimum * réduction de taux
formule: 80%
contrat salarié . déduction forfaitaire spécifique . profession . journaliste . abattement fiscal:
applicable si: déduction forfaitaire spécifique . profession = 'journaliste'
? contrat salarié . déduction forfaitaire spécifique . profession . journaliste . abattement fiscal
: applicable si: déduction forfaitaire spécifique . profession = 'journaliste'
remplace: rémunération . net imposable
titre: net imposable journaliste
formule:
valeur: rémunération . net imposable
abattement: 7650€/an
contrat salarié . déduction forfaitaire spécifique . profession . ouvrier du bâtiment:
icônes: 👷‍♂️
? contrat salarié . déduction forfaitaire spécifique . profession . ouvrier du bâtiment
: icônes: 👷‍♂️
description: >-
Concerne les ouvriers du bâtiment visés aux paragraphes 1er et 2 de
larticle 1er du décret du 17 novembre 1936, à lexclusion de ceux qui
travaillent en usine ou en atelier.
contrat salarié . déduction forfaitaire spécifique . profession . artiste musicien:
icônes: 🎼
? contrat salarié . déduction forfaitaire spécifique . profession . artiste musicien
: icônes: 🎼
description: >-
Concerne les artistes musiciens, choristes, chefs dorchestre, régisseurs de
théâtre
contrat salarié . déduction forfaitaire spécifique . profession . pilote de ligne ou personnel navigant:
icônes:
? contrat salarié . déduction forfaitaire spécifique . profession . pilote de ligne ou personnel navigant
: icônes:
description: >-
Concerne les pilotes, radios, mécaniciens navigants des compagnies de
transports aériens ; pilotes et mécaniciens employés par les maisons de
@ -1482,8 +1482,8 @@ contrat salarié . rémunération . primes . fin d'année:
assiette: assiette de vérification du SMIC * temps de travail . quotité de travail / 1 an
facteur: prime de fin d'année en mois
contrat salarié . rémunération . primes . fin d'année . prime de fin d'année en mois:
applicable si: treizième mois
? contrat salarié . rémunération . primes . fin d'année . prime de fin d'année en mois
: applicable si: treizième mois
formule: 13 mois - 1 an
note: >
Certaines entreprises proposent une prime de fin d'année sur une base de
@ -1674,8 +1674,8 @@ contrat salarié . rémunération . avantages en nature . nourriture . montant:
références:
urssaf.fr: https://www.urssaf.fr/portail/home/taux-et-baremes/avantages-en-nature/nourriture.html
contrat salarié . rémunération . avantages en nature . nourriture . repas par mois:
question: >
? contrat salarié . rémunération . avantages en nature . nourriture . repas par mois
: question: >
Combien de repas par mois sont payés par l'entreprise ?
par défaut: 21 repas/mois
suggestions:
@ -1837,8 +1837,8 @@ contrat salarié . rémunération . net imposable:
références:
DSN: https://dsn-info.custhelp.com/app/answers/detail/a_id/2110
contrat salarié . rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées:
unité: €/mois
? contrat salarié . rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées
: unité: €/mois
formule:
valeur:
somme:
@ -1961,8 +1961,8 @@ contrat salarié . cotisations . patronales . réductions de cotisations:
urssaf.fr (cumul réduction générale): https://www.urssaf.fr/portail/home/employeur/beneficier-dune-exoneration/exonerations-generales/la-reduction-generale/les-regles-relatives-au-cumul.html
urssaf.fr (cumul JEI): https://www.urssaf.fr/portail/home/employeur/beneficier-dune-exoneration/exonerations-ou-aides-liees-au-s/jeunes-entreprises-innovantes/regles-de-cumul.html
contrat salarié . cotisations . patronales . réductions de cotisations . déduction heures supplémentaires:
applicable si: entreprise . effectif < 20
? contrat salarié . cotisations . patronales . réductions de cotisations . déduction heures supplémentaires
: applicable si: entreprise . effectif < 20
titre: déduction forfaitaire pour heures supplémentaires
formule:
produit:
@ -1982,8 +1982,8 @@ contrat salarié . cotisations . salariales . réduction heures supplémentaires
références:
Code de la sécurité sociale - Article D241-21: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000038056813&cidTexte=LEGITEXT000006073189
contrat salarié . cotisations . salariales . réduction heures supplémentaires . taux des cotisations réduites:
unité: '%'
? contrat salarié . cotisations . salariales . réduction heures supplémentaires . taux des cotisations réduites
: unité: '%'
description: le taux effectif des cotisations d'assurance vieillesse à la charge du salarié
formule:
valeur:
@ -2072,8 +2072,8 @@ contrat salarié . aides employeur . aide à l'embauche d'apprentis:
références:
Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F23556
contrat salarié . aides employeur . aide exceptionnelle à l'embauche d'apprentis:
description: >-
? contrat salarié . aides employeur . aide exceptionnelle à l'embauche d'apprentis
: description: >-
Dans le cadre du plan de relance de l'économie de la rentrée 2020, le
gouvernement met en place une aide exceptionnelle au recrutement des
apprentis.
@ -2135,8 +2135,8 @@ contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeune
références:
Plan \#1jeune1solution: https://travail-emploi.gouv.fr/le-ministere-en-action/relance-activite/plan-1jeune-1solution/aide-embauche-jeunes
contrat salarié . aides employeur . aide à l'embauche senior professionnalisation:
description: |
? contrat salarié . aides employeur . aide à l'embauche senior professionnalisation
: description: |
Les employeurs peuvent obtenir une aide de 2000 € pour l'embauche d'un
demandeur d'emploi de plus de 45 ans en contrat de professionnalisation.
applicable si: professionnalisation . salarié de 45 ans et plus
@ -2213,8 +2213,8 @@ contrat salarié . temps de travail:
- heures complémentaires
description: En France, la base légale du travail est de 35h/semaine. Mais un grand nombre de dispositions existantes permettent de faire varier ce nombre. Vous pouvez les retrouver sur la page [service-public.fr](https://www.service-public.fr/particuliers/vosdroits/N458) dédiée.
contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés:
non applicable si: aides employeur . emploi franc
? contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés
: non applicable si: aides employeur . emploi franc
description: >-
Dans le cadre du plan de relance, le gouvernement a décidé de créer une aide
à lembauche visant à favoriser lemploi des personnes en situation de
@ -2360,8 +2360,8 @@ contrat salarié . temps de travail . heures complémentaires:
question: Combien d'heures complémentaires (non récupérées en repos) sont effectuées par mois ?
par défaut: 0 heure/mois
contrat salarié . temps de travail . contrôle heures complémentaires 10 pourcents:
type: notification
? contrat salarié . temps de travail . contrôle heures complémentaires 10 pourcents
: type: notification
formule: heures complémentaires > heures complémentaires . seuil légal
description: Sauf disposition conventionnelle, le nombre d'heures complémentaires ne peut être supérieur à un dixième de la durée contractuelle du temps partiel.
@ -2653,8 +2653,8 @@ contrat salarié . retraite supplémentaire . part déductible:
valeur: retraite supplémentaire . employeur
abattement: plafond d'exonération sociale employeur
contrat salarié . retraite supplémentaire . plafond d'exonération sociale employeur:
formule:
? contrat salarié . retraite supplémentaire . plafond d'exonération sociale employeur
: formule:
valeur: 5% * rémunération . brut
plafond: 5% * plafond sécurité sociale
références:
@ -2929,8 +2929,8 @@ contrat salarié . CSG et CRDS . assiette revenu remplacements:
taux: 98.25%
assiette: rémunération . revenus de remplacement
contrat salarié . CSG et CRDS . assiette heures supplémentaires et complémentaires défiscalisées:
formule:
? contrat salarié . CSG et CRDS . assiette heures supplémentaires et complémentaires défiscalisées
: formule:
produit:
assiette: rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées
taux: 98.25%

View File

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

View File

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

View File

@ -10,6 +10,7 @@ type BannerProps = {
hidden?: boolean
hideAfterFirstStep?: boolean
icon?: string
className?: string
}
export default function Banner({
@ -17,13 +18,14 @@ export default function Banner({
hidden: hiddenProp = false,
hideAfterFirstStep = true,
icon,
className,
}: BannerProps) {
const hiddenState = useSelector(firstStepCompletedSelector)
const hidden = hiddenProp || (hideAfterFirstStep && hiddenState)
return !hidden ? (
<Animate.fadeIn>
<div className="ui__ banner">
<Animate.fadeIn className={className}>
<div className={'ui__ banner ' + className}>
{icon && emoji(icon)}
<div className="ui__ banner-content">{children}</div>
</div>

View File

@ -1,4 +1,4 @@
import React, { useContext } from 'react'
import React, { useContext, useState } from 'react'
import emoji from 'react-easy-emoji'
import { animated, config, useSpring } from 'react-spring'
import useDisplayOnIntersecting from 'Components/utils/useDisplayOnIntersecting'
@ -51,6 +51,7 @@ type BarChartBranchProps = {
maximum: number
description?: string
unit?: string
disableAnimation: boolean
}
export default function BarChartBranch({
@ -60,11 +61,11 @@ export default function BarChartBranch({
maximum,
description,
unit,
disableAnimation,
}: BarChartBranchProps) {
const [intersectionRef, brancheInViewport] = useDisplayOnIntersecting({
threshold: 0.5,
})
const { color } = useContext(ThemeColorsContext)
const numberToPlot = brancheInViewport ? value : 0
const styles = useSpring({
config: ANIMATION_SPRING,
@ -74,12 +75,53 @@ export default function BarChartBranch({
},
}) as { flex: number; opacity: number } // TODO: problème avec les types de react-spring ?
return (
return !disableAnimation ? (
<animated.div
ref={intersectionRef}
className="distribution-chart__item"
style={{ opacity: styles.opacity }}
>
<InnerBarChartBranch
value={numberToPlot}
maximum={maximum}
title={title}
unit={unit}
icon={icon}
description={description}
/>
</animated.div>
) : (
<InnerBarChartBranch
value={value}
maximum={maximum}
title={title}
unit={unit}
icon={icon}
description={description}
/>
)
}
type InnerBarChartBranchProps = {
title: React.ReactNode
icon?: string
maximum: number
description?: string
unit?: string
value: number
}
function InnerBarChartBranch({
value,
title,
icon,
maximum,
description,
unit,
}: InnerBarChartBranchProps) {
const { color } = useContext(ThemeColorsContext)
return (
<>
{icon && <BranchIcon icon={icon} />}
<div className="distribution-chart__item-content">
<p className="distribution-chart__counterparts">
@ -90,12 +132,12 @@ export default function BarChartBranch({
<ChartItemBar
style={{
backgroundColor: color,
flex: styles.flex,
flex: value / maximum,
}}
numberToPlot={numberToPlot}
numberToPlot={value}
unit={unit}
/>
</div>
</animated.div>
</>
)
}

View File

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

View File

@ -10,22 +10,24 @@ import './PaySlip'
import { getCotisationsBySection } from './PaySlip'
import RuleLink from './RuleLink'
export default function Distribution() {
interface DistributionProps {
disableAnimation: boolean
}
export default function Distribution({ disableAnimation }: DistributionProps) {
const targetUnit = useSelector(targetUnitSelector)
const engine = useContext(EngineContext)
const distribution = (
getCotisationsBySection(useEngine().getParsedRules()).map(
([section, cotisations]) => [
section,
cotisations
.map((c) => engine.evaluate({ valeur: c, unité: targetUnit }))
.reduce(
(acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0),
0
),
]
) as Array<[DottedName, number]>
)
const distribution = (getCotisationsBySection(
useEngine().getParsedRules()
).map(([section, cotisations]) => [
section,
cotisations
.map((c) => engine.evaluate({ valeur: c, unité: targetUnit }))
.reduce(
(acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0),
0
),
]) as Array<[DottedName, number]>)
.filter(([, value]) => value > 0)
.sort(([, a], [, b]) => b - a)
@ -39,6 +41,7 @@ export default function Distribution() {
dottedName={sectionName}
value={value}
maximum={maximum}
disableAnimation={disableAnimation}
/>
))}
</div>
@ -49,8 +52,8 @@ type DistributionBranchProps = {
dottedName: DottedName
value: number
maximum: number
icon?: string
disableAnimation: boolean
}
export function DistributionBranch({
@ -58,6 +61,7 @@ export function DistributionBranch({
value,
icon,
maximum,
disableAnimation,
}: DistributionBranchProps) {
const branche = useContext(EngineContext).getRule(dottedName)
@ -69,6 +73,7 @@ export function DistributionBranch({
icon={icon ?? branche.rawNode.icônes}
description={branche.rawNode.résumé}
unit="€"
disableAnimation={disableAnimation}
/>
)
}

View File

@ -0,0 +1,43 @@
import { LinkButton } from 'Components/ui/Button'
import React, { useEffect, useState } from 'react'
import { Trans } from 'react-i18next'
import Banner from './Banner'
interface ExportSimulationBannerProps {
userWillExport: () => void
disableAnimation: boolean
}
export default function ExportSimulationBanner({
userWillExport,
disableAnimation,
}: ExportSimulationBannerProps) {
const [printRequired, setPrintRequired] = useState(false)
useEffect(() => {
if (printRequired) {
window.print()
setPrintRequired(false)
}
}, [disableAnimation])
return (
<Banner
hideAfterFirstStep={false}
icon="🖨"
className="ui__ print-display-none"
>
{
<Trans i18nKey="ExportSimulation.Banner">
Pour conserver cette simulation :{' '}
<LinkButton
onClick={() => {
setPrintRequired(true)
disableAnimation ? window.print() : userWillExport()
}}
>
Imprimer ou sauvegarder en PDF
</LinkButton>
</Trans>
}
</Banner>
)
}

View File

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

View File

@ -61,7 +61,7 @@ export default function NewsletterRegister() {
}
return (
<>
<div className="ui__ print-display-none">
<h2>
<Trans i18nKey="newsletter.register.titre">Restez au courant</Trans>
</h2>
@ -97,6 +97,6 @@ export default function NewsletterRegister() {
</div>
</form>
</div>
</>
</div>
)
}

View File

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

View File

@ -1,8 +1,7 @@
import { updateUnit } from 'Actions/actions'
import { Trans } from 'react-i18next'
import { Trans, useTranslation } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { targetUnitSelector } from 'Selectors/simulationSelectors'
import { useTranslation } from 'react-i18next'
import './PeriodSwitch.css'
export default function PeriodSwitch() {
@ -25,7 +24,10 @@ export default function PeriodSwitch() {
<div id="PeriodSwitch">
<span className="base ui__ small radio toggle">
{periods.map(({ label, unit }) => (
<label key={unit}>
<label
key={unit}
className={currentUnit !== unit ? 'ui__ print-display-none' : ''}
>
<input
name="defaultUnit"
type="radio"

View File

@ -1,10 +1,10 @@
import { loadPreviousSimulation } from 'Actions/actions'
import { LinkButton } from 'Components/ui/Button'
import { Trans } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { RootState } from 'Reducers/rootReducer'
import { LinkButton } from 'Components/ui/Button'
import Banner from './Banner'
import { firstStepCompletedSelector } from 'Selectors/simulationSelectors'
import Banner from './Banner'
export default function PreviousSimulationBanner() {
const previousSimulation = useSelector(
@ -14,15 +14,17 @@ export default function PreviousSimulationBanner() {
const dispatch = useDispatch()
return (
<Banner hidden={!previousSimulation || newSimulationStarted} icon="💾">
<Trans i18nKey="previousSimulationBanner.info">
Votre précédente simulation a été sauvegardée :
</Trans>{' '}
<LinkButton onClick={() => dispatch(loadPreviousSimulation())}>
<Trans i18nKey="previousSimulationBanner.retrieveButton">
Retrouver ma simulation
</Trans>
</LinkButton>
</Banner>
<div className="ui__ print-display-none">
<Banner hidden={!previousSimulation || newSimulationStarted} icon="💾">
<Trans i18nKey="previousSimulationBanner.info">
Votre précédente simulation a été sauvegardée :
</Trans>{' '}
<LinkButton onClick={() => dispatch(loadPreviousSimulation())}>
<Trans i18nKey="previousSimulationBanner.retrieveButton">
Retrouver ma simulation
</Trans>
</LinkButton>
</Banner>
</div>
)
}

View File

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

View File

@ -8,24 +8,24 @@ import { TrackingContext } from '../ATInternetTracking'
import Banner from './Banner'
import { useParamsFromSituation } from './utils/useSearchParamsSimulationSharing'
export function useUrl() {
const situation = useSelector(situationSelector)
const searchParams = useParamsFromSituation(situation)
searchParams.set('utm_source', 'sharing')
return [
window.location.origin,
window.location.pathname,
'?',
searchParams.toString(),
].join('')
}
export default function ShareSimulationBanner() {
const [opened, setOpened] = useState(false)
const { t } = useTranslation()
const tracker = useContext(TrackingContext)
const situation = useSelector(situationSelector)
const searchParams = useParamsFromSituation(situation)
searchParams.set('utm_source', 'sharing')
const shareAPIAvailable = !!window?.navigator?.share
const getUrl = () =>
[
window.location.origin,
window.location.pathname,
'?',
searchParams.toString(),
].join('')
const url = useUrl()
const startSharing = async () => {
if (shareAPIAvailable) {
try {
@ -35,7 +35,7 @@ export default function ShareSimulationBanner() {
'shareSimulation.navigatorShare',
'Ma simulation Mon Entreprise'
),
url: getUrl(),
url,
})
} catch {
setOpened(true)
@ -46,7 +46,11 @@ export default function ShareSimulationBanner() {
}
return (
<Banner hideAfterFirstStep={false} icon="💬">
<Banner
hideAfterFirstStep={false}
icon="💬"
className="ui__ print-display-none"
>
{opened ? (
<Animate.fromTop>
<div>
@ -66,21 +70,21 @@ export default function ShareSimulationBanner() {
simulation.
</Trans>
</p>
<ShareSimulationPopup url={getUrl()} />
<ShareSimulationPopup url={url} />
</div>
</Animate.fromTop>
) : (
<Trans i18nKey="shareSimulation.banner">
Pour partager cette simulation :{' '}
<LinkButton
onClick={async () => {
onClick={() => {
tracker.click.set({
chapter1: 'feature:partage',
type: 'action',
name: 'démarré',
})
tracker.dispatch()
await startSharing()
startSharing()
}}
>
Générer un lien dédié

View File

@ -1,6 +1,7 @@
import Conversation, {
ConversationProps,
} from 'Components/conversation/Conversation'
import ExportSimulationBanner from 'Components/ExportSimulationBanner'
import PageFeedback from 'Components/Feedback'
import SearchButton from 'Components/SearchButton'
import ShareSimulationBanner from 'Components/ShareSimulationBanner'
@ -21,6 +22,8 @@ type SimulationProps = {
children?: React.ReactNode
customEndMessages?: ConversationProps['customEndMessages']
showPeriodSwitch?: boolean
userWillExport: () => void
disableAnimation: boolean
}
export default function Simulation({
@ -29,6 +32,8 @@ export default function Simulation({
children,
customEndMessages,
showPeriodSwitch,
userWillExport,
disableAnimation,
}: SimulationProps) {
const firstStepCompleted = useSelector(firstStepCompletedSelector)
@ -46,6 +51,10 @@ export default function Simulation({
<Animate.fromTop>
{results}
<ShareSimulationBanner />
<ExportSimulationBanner
userWillExport={userWillExport}
disableAnimation={disableAnimation}
/>
<Questions customEndMessages={customEndMessages} />
<br />
<div className="ui__ full-width">
@ -68,7 +77,7 @@ export default function Simulation({
</>
)}
<div
className="ui__ side-block"
className="ui__ side-block print-display-none"
css={!explanations ? 'justify-content: center;' : ''}
>
<div
@ -104,7 +113,7 @@ export function Questions({
const progress = useSimulationProgress()
return (
<>
<div className="ui__ print-display-none">
<section className="ui__ full-width lighter-bg">
<div className="ui__ container">
<div
@ -141,6 +150,6 @@ export function Questions({
{progress < 1 && (
<Progress progress={progress} className="ui__ full-width" />
)}
</>
</div>
)
}

View File

@ -83,7 +83,29 @@ export function roundedPercentages(values: Array<number>) {
)
}
type StackedBarChartProps = {
type StackedBarChartProps = InnerStackedBarChartProps & {
disableAnimation: boolean
}
export function StackedBarChart({
data,
disableAnimation,
}: StackedBarChartProps) {
const [intersectionRef, displayChart] = useDisplayOnIntersecting({
threshold: 0.5,
})
const styles = useSpring({ opacity: displayChart ? 1 : 0 })
return !disableAnimation ? (
<animated.div ref={intersectionRef} style={styles}>
<InnerStackedBarChart data={data} />
</animated.div>
) : (
<InnerStackedBarChart data={data} />
)
}
type InnerStackedBarChartProps = {
data: Array<{
color?: string
value: EvaluatedNode['nodeValue']
@ -92,10 +114,7 @@ type StackedBarChartProps = {
}>
}
export function StackedBarChart({ data }: StackedBarChartProps) {
const [intersectionRef, displayChart] = useDisplayOnIntersecting({
threshold: 0.5,
})
function InnerStackedBarChart({ data }: InnerStackedBarChartProps) {
const percentages = roundedPercentages(
data.map((d) => (typeof d.value === 'number' && d.value) || 0)
)
@ -103,11 +122,9 @@ export function StackedBarChart({ data }: StackedBarChartProps) {
...data,
percentage: percentages[index],
}))
const styles = useSpring({ opacity: displayChart ? 1 : 0 })
return (
<animated.div ref={intersectionRef} style={styles}>
<BarStack>
<>
<BarStack className="ui__ print-background-force">
{dataWithPercentage
// <BarItem /> has a border so we don't want to display empty bars
// (even with width 0).
@ -122,7 +139,7 @@ export function StackedBarChart({ data }: StackedBarChartProps) {
/>
))}
</BarStack>
<BarStackLegend>
<BarStackLegend className="ui__ print-background-force">
{dataWithPercentage.map(({ key, percentage, color, legend }) => (
<BarStackLegendItem key={key}>
<SmallCircle style={{ backgroundColor: color }} />
@ -131,15 +148,19 @@ export function StackedBarChart({ data }: StackedBarChartProps) {
</BarStackLegendItem>
))}
</BarStackLegend>
</animated.div>
</>
)
}
type StackedRulesChartProps = {
data: Array<{ color?: string; dottedName: Names; title?: string }>
disableAnimation: boolean
}
export default function StackedRulesChart({ data }: StackedRulesChartProps) {
export default function StackedRulesChart({
data,
disableAnimation,
}: StackedRulesChartProps) {
const engine = useEngine()
const targetUnit = useSelector(targetUnitSelector)
return (
@ -151,6 +172,7 @@ export default function StackedRulesChart({ data }: StackedRulesChartProps) {
legend: <RuleLink dottedName={dottedName}>{title}</RuleLink>,
color,
}))}
disableAnimation={disableAnimation}
/>
)
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -51,7 +51,7 @@ export default function Footer() {
const hrefLink = hrefLangLink[language][uri] || []
return (
<div>
<div className="ui__ print-display-none">
<Helmet>
{hrefLink.map(({ href, hrefLang }) => (
<link

View File

@ -30,7 +30,7 @@ export default function NewsBanner() {
lastViewedRelease !== lastRelease.name && i18n.language === 'fr'
return showBanner ? (
<div className="ui__ banner news">
<div className="ui__ banner news print-display-none">
<span>
{emoji('✨')} Découvrez les nouveautés {determinant(lastRelease.name)}
<Link to={sitePaths.nouveautés}>{lastRelease.name.toLowerCase()}</Link>

View File

@ -0,0 +1,33 @@
import { useUrl } from 'Components/ShareSimulationBanner'
import React from 'react'
import { Trans } from 'react-i18next'
export default function ExportRecover() {
return (
<section className="screen-display-none print-break-avoid">
<h2>
<Trans i18nKey="pages.simulateurs.print-info.title">
Vous souhaitez retrouver cette simulation ?
</Trans>
</h2>
<p>
<Trans i18nKey="pages.simulateurs.print-info.recover">
Retrouvez la, ainsi que d'autres outils d'aide à la création et à la
gestion d'entreprise, sur{' '}
<a href={useUrl()} target="_blank">
mon-entreprise.fr
</a>
.
</Trans>
</p>
<p>
<Trans i18nKey="pages.simulateurs.print-info.date">
Cette simulation a été effectuée le
</Trans>{' '}
{new Date().toLocaleDateString()}.
</p>
</section>
)
}

View File

@ -20,7 +20,13 @@ import CotisationsRégularisation from './IndépendantCotisationsRégularisation
import PLExplanation from './PLExplanation'
import { DistributionSection } from './SalaryExplanation'
export default function IndépendantExplanation() {
interface IndépendantExplanationProps {
disableAnimation: boolean
}
export default function IndépendantExplanation({
disableAnimation,
}: IndépendantExplanationProps) {
const { t } = useTranslation()
const { palettes } = useContext(ThemeColorsContext)
@ -39,6 +45,7 @@ export default function IndépendantExplanation() {
<section>
<h2>Répartition du revenu</h2>
<StackedBarChart
disableAnimation={disableAnimation}
data={[
{
dottedName: 'dirigeant . rémunération . nette après impôt',
@ -96,8 +103,8 @@ export default function IndépendantExplanation() {
</ul>
</Trans>
<DistributionSection>
<Distribution />
<DistributionSection disableAnimation={disableAnimation}>
<Distribution disableAnimation={disableAnimation} />
</DistributionSection>
</>
)
@ -130,20 +137,24 @@ const CotisationsSection: Partial<Record<DottedName, Array<string>>> = {
],
}
function Distribution() {
interface DistributionProps {
disableAnimation: boolean
}
function Distribution({ disableAnimation }: DistributionProps) {
const targetUnit = useSelector(targetUnitSelector)
const engine = useEngine()
const distribution = (
Object.entries(CotisationsSection).map(([section, cotisations]) => [
section,
(cotisations as string[])
.map((c) => engine.evaluate({ valeur: c, unité: targetUnit }))
.reduce(
(acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0),
0
),
]) as Array<[DottedName, number]>
)
const distribution = (Object.entries(
CotisationsSection
).map(([section, cotisations]) => [
section,
cotisations
.map((c) => engine.evaluate({ valeur: c, unité: targetUnit }))
.reduce(
(acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0),
0
),
]) as Array<[DottedName, number]>)
.filter(([, value]) => value > 0)
.sort(([, a], [, b]) => b - a)
@ -158,6 +169,7 @@ function Distribution() {
dottedName={sectionName}
value={value}
maximum={maximum}
disableAnimation={disableAnimation}
/>
))}
</div>
@ -169,8 +181,8 @@ type DistributionBranchProps = {
dottedName: DottedName
value: number
maximum: number
icon?: string
disableAnimation: boolean
}
function DistributionBranch({
@ -178,6 +190,7 @@ function DistributionBranch({
value,
icon,
maximum,
disableAnimation,
}: DistributionBranchProps) {
const branche = useEngine().getRule(dottedName)
@ -189,6 +202,7 @@ function DistributionBranch({
icon={icon ?? branche.rawNode.icônes}
description={branche.rawNode.résumé}
unit="€"
disableAnimation={disableAnimation}
/>
)
}

View File

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

View File

@ -9,7 +9,13 @@ import { useContext, useRef } from 'react'
import emoji from 'react-easy-emoji'
import { Trans, useTranslation } from 'react-i18next'
export default function SalaryExplanation() {
interface SalaryExplanationProps {
disableAnimation: boolean
}
export default function SalaryExplanation({
disableAnimation,
}: SalaryExplanationProps) {
const payslipRef = useRef<HTMLDivElement>(null)
if (useInversionFail()) {
@ -25,9 +31,10 @@ export default function SalaryExplanation() {
block: 'start',
})
}
disableAnimation={disableAnimation}
/>
<DistributionSection />
<DistributionSection disableAnimation={disableAnimation} />
<div ref={payslipRef}>
<PaySlipSection />
</div>
@ -56,7 +63,10 @@ export default function SalaryExplanation() {
)
}
function RevenueRepartitionSection(props: { onSeePayslip: () => void }) {
function RevenueRepartitionSection(props: {
onSeePayslip: () => void
disableAnimation: boolean
}) {
const { t } = useTranslation()
const { palettes } = useContext(ThemeColorsContext)
@ -78,7 +88,7 @@ function RevenueRepartitionSection(props: { onSeePayslip: () => void }) {
</Trans>
</h2>
<button
className="ui__ small simple button"
className="ui__ small simple button print-display-none"
onClick={props.onSeePayslip}
>
{emoji('📊')} <Trans>Voir la fiche de paie</Trans>
@ -101,6 +111,7 @@ function RevenueRepartitionSection(props: { onSeePayslip: () => void }) {
color: palettes[1][1],
},
]}
disableAnimation={props.disableAnimation}
/>
</section>
)
@ -108,7 +119,7 @@ function RevenueRepartitionSection(props: { onSeePayslip: () => void }) {
function PaySlipSection() {
return (
<section>
<section className="ui__ print-break-avoid">
<h2>
<Trans>Fiche de paie</Trans>
</h2>
@ -118,11 +129,13 @@ function PaySlipSection() {
}
export const DistributionSection = ({
children = <Distribution />,
disableAnimation,
children = <Distribution disableAnimation={disableAnimation} />,
}: {
disableAnimation: boolean
children?: React.ReactNode
}) => (
<section>
<section className="ui__ print-break-avoid">
<h2>
<Trans>À quoi servent mes cotisations ?</Trans>
</h2>

View File

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

View File

@ -16,7 +16,7 @@ export default function Warning({ localStorageKey, children }: WarningProps) {
margin-bottom: 1rem;
`}
>
<p>
<p className={folded ? 'ui__ print-display-none' : ''}>
{emoji('🚩 ')}
<strong>
<Trans i18nKey="simulateurs.warning.titre">
@ -40,7 +40,7 @@ export default function Warning({ localStorageKey, children }: WarningProps) {
css="padding-top: 1rem; padding-bottom: 0.4rem"
>
{children}
<div className="ui__ answer-group">
<div className="ui__ answer-group print-display-none">
<button
className="ui__ button simple small"
onClick={() => fold(true)}

View File

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

View File

@ -208,3 +208,29 @@ input.ui__::placeholder {
opacity: 0.6;
color: grey;
}
@media screen {
.screen-display-none {
display: none !important;
}
}
@media print {
.ui__ print-display-none {
display: none !important;
}
.print-break-avoid {
page-break-inside: avoid;
break-inside: avoid;
}
.print-background-force {
color-adjust: exact !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.ui__.toggle input[type='radio']:checked ~ * {
box-shadow: none;
}
}

View File

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

View File

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

View File

@ -71,6 +71,8 @@ Exemples: Examples
Exemples de simulation de salaire: Examples of salary simulations
Exonérations: Exemptions
Explorez notre documentation: Explore our documentation
ExportSimulation:
Banner: "To save this simulation: <2>Print or export as PDF</2>"
Faire une simulation: Launch a simulation
Fiche de paie: Payslip
Gestion des données personnelles: Management of personal data
@ -1354,6 +1356,10 @@ pages:
title: PAMC diet simulators
shortname: PAMC
title: "PAMC: contribution and income simulators"
print-info:
recover: Find it, as well as other tools to help create and manage a business on <2>mycompanyinfrance.fr</2>
date: This simulation was performed on
title: Would you like to recover this simulation?
profession-libérale:
meta:
description: Net Income Calculation for Self-Employed Persons in Liberal Income

View File

@ -24,6 +24,8 @@ En savoir plus: En savoir plus
Entreprise Individuelle: Entreprise Individuelle
Exonérations: Exonérations
Explorez notre documentation: Explorez notre documentation
ExportSimulation:
Banner: "Pour conserver cette simulation : <2>Imprimer ou sauvegarder en PDF</2>"
Fiche de paie: Fiche de paie
Gestion des données personnelles: Gestion des données personnelles
Gérant majoritaire: Gérant majoritaire
@ -1006,6 +1008,10 @@ pages:
title: Simulateurs régime PAMC
shortname: PAMC
title: "PAMC : simulateurs de cotisations et de revenu"
print-info:
recover: Retrouvez la, ainsi que d'autres outils d'aide à la création et à la gestion d'entreprise, sur <2>mon-entreprise.fr</2>
date: Cette simulation a été effectuée le
title: Vous souhaitez retrouver cette simulation ?
profession-libérale:
meta:
description: Calcul du revenu net pour les indépendants en libéral à l'impôt sur

View File

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

View File

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

View File

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

View File

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

View File

@ -222,15 +222,15 @@ activité transfrontalière simultanée . activité salariée . profession:
activité transfrontalière simultanée . activité salariée . période:
type: groupe
formule: oui
activité transfrontalière simultanée . activité salariée . période . date de début du contrat:
? activité transfrontalière simultanée . activité salariée . période . date de début du contrat
: type: date
? activité transfrontalière simultanée . activité salariée . période . date de fin connue
: question: Votre contrat salarié a-t'il une date de fin ?
? activité transfrontalière simultanée . activité salariée . période . date de fin
: applicable si: date de fin connue
type: date
activité transfrontalière simultanée . activité salariée . période . date de fin connue:
question: Votre contrat salarié a-t'il une date de fin ?
activité transfrontalière simultanée . activité salariée . période . date de fin:
applicable si: date de fin connue
type: date
activité transfrontalière simultanée . activité salariée . période . vérification:
titre: Date d'activité salariée non valides
? activité transfrontalière simultanée . activité salariée . période . vérification
: titre: Date d'activité salariée non valides
formule: date de début du contrat > date de fin
type: notification
description: La date de fin du contrat ne peut être antérieure à la date de début
@ -246,32 +246,32 @@ activité transfrontalière simultanée . activité salariée . employeur . adre
type: texte
activité transfrontalière simultanée . activité salariée . employeur . ville:
type: texte
activité transfrontalière simultanée . activité salariée . employeur . code postal:
type: texte
? activité transfrontalière simultanée . activité salariée . employeur . code postal
: type: texte
activité transfrontalière simultanée . activité salariée . lieu d'exercice:
titre: Lieu effectif d'activité
type: groupe
formule: oui
activité transfrontalière simultanée . activité salariée . lieu d'exercice . employeur:
question: Exercerez-vous effectivement cette activité salariée dans le pays de votre employeur ?
? activité transfrontalière simultanée . activité salariée . lieu d'exercice . employeur
: question: Exercerez-vous effectivement cette activité salariée dans le pays de votre employeur ?
description: Votre activité salariée peut-être exercé depuis un autre pays que celui de l'employeur par exemple en cas de télétravail.
activité transfrontalière simultanée . activité salariée . lieu d'exercice . lieu de résidence:
question: Exercerez-vous cette activité salariée dans votre pays de résidence ?
? activité transfrontalière simultanée . activité salariée . lieu d'exercice . lieu de résidence
: question: Exercerez-vous cette activité salariée dans votre pays de résidence ?
non applicable si: employeur
activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays:
non applicable si:
? activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays
: non applicable si:
une de ces conditions:
- lieu de résidence
- employeur
question: Quel sera le pays dans lequel vous exercerez cette activité salariée ?
API: pays européen
activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays . autre:
applicable si: pays = 'Autre'
? activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays . autre
: applicable si: pays = 'Autre'
titre: Nom du pays
type: texte
@ -280,12 +280,12 @@ activité transfrontalière simultanée . activité salariée . revenus:
type: groupe
formule: oui
activité transfrontalière simultanée . activité salariée . revenus . taux horaire:
type: texte
? activité transfrontalière simultanée . activité salariée . revenus . taux horaire
: type: texte
question: Quel est le taux horaire brut (dans la monnaie du pays d'accueil) ?
activité transfrontalière simultanée . activité salariée . revenus . nombre d'heures:
type: nombre
? activité transfrontalière simultanée . activité salariée . revenus . nombre d'heures
: type: nombre
unité: heures/semaine
question: Quel est le temps de travail hebdomadaire inscrit au contrat de travail ?
@ -294,16 +294,16 @@ activité transfrontalière simultanée . activité salariée . revenus . revenu
type: nombre
unité: €/an
activité transfrontalière simultanée . activité salariée . revenus . activité substantielle:
question: >
? activité transfrontalière simultanée . activité salariée . revenus . activité substantielle
: question: >
Considérez-vous que votre activité salariée représentera plus de 5% de votre activité professionnelle pour les 12 prochains mois ?
activité transfrontalière simultanée . activité salariée . revenus . articulation activité indépendante:
question: Comment votre activité salariée s'articulera-t-elle avec votre activité indépendante au cours des 12 prochains mois (périodes, revenu, etc.) ?
? activité transfrontalière simultanée . activité salariée . revenus . articulation activité indépendante
: question: Comment votre activité salariée s'articulera-t-elle avec votre activité indépendante au cours des 12 prochains mois (périodes, revenu, etc.) ?
type: paragraphe
activité transfrontalière simultanée . activité salariée . activité indépendante additionnelle:
question: >
? activité transfrontalière simultanée . activité salariée . activité indépendante additionnelle
: question: >
Exercez-vous également une activité non salariée à l'étranger ?
activité transfrontalière simultanée . part substantielle France:
@ -336,21 +336,21 @@ activité transfrontalière simultanée . activité non salariée . n°1:
formule: oui
activité transfrontalière simultanée . activité non salariée . n°1 . pays:
API: pays européen
activité transfrontalière simultanée . activité non salariée . n°1 . pays . autre:
applicable si: pays = 'Autre'
? activité transfrontalière simultanée . activité non salariée . n°1 . pays . autre
: applicable si: pays = 'Autre'
titre: Nom du pays
type: texte
activité transfrontalière simultanée . activité non salariée . n°1 . nom de l'entreprise:
type: texte
? activité transfrontalière simultanée . activité non salariée . n°1 . nom de l'entreprise
: type: texte
activité transfrontalière simultanée . activité non salariée . n°1 . adresse:
type: texte
activité transfrontalière simultanée . activité non salariée . n°1 . ville:
type: texte
activité transfrontalière simultanée . activité non salariée . n°1 . code postal:
type: texte
activité transfrontalière simultanée . activité non salariée . n°1 . date de début d'activité:
type: date
? activité transfrontalière simultanée . activité non salariée . n°1 . code postal
: type: texte
? activité transfrontalière simultanée . activité non salariée . n°1 . date de début d'activité
: type: date
activité transfrontalière simultanée . activité non salariée . n°2:
titre: activité non salarié n°2
@ -359,20 +359,20 @@ activité transfrontalière simultanée . activité non salariée . n°2:
formule: oui
activité transfrontalière simultanée . activité non salariée . n°2 . pays:
API: pays européen
activité transfrontalière simultanée . activité non salariée . n°2 . pays . autre:
applicable si: pays = 'Autre'
? activité transfrontalière simultanée . activité non salariée . n°2 . pays . autre
: applicable si: pays = 'Autre'
titre: Nom du pays
type: texte
activité transfrontalière simultanée . activité non salariée . n°2 . nom de l'entreprise:
type: texte
? activité transfrontalière simultanée . activité non salariée . n°2 . nom de l'entreprise
: type: texte
activité transfrontalière simultanée . activité non salariée . n°2 . adresse:
type: texte
activité transfrontalière simultanée . activité non salariée . n°2 . ville:
type: texte
activité transfrontalière simultanée . activité non salariée . n°2 . code postal:
type: texte
activité transfrontalière simultanée . activité non salariée . n°2 . date de début d'activité:
type: date
? activité transfrontalière simultanée . activité non salariée . n°2 . code postal
: type: texte
? activité transfrontalière simultanée . activité non salariée . n°2 . date de début d'activité
: type: date
activité transfrontalière simultanée . activité non salariée . n°3:
titre: activité non salarié n°3
@ -381,23 +381,23 @@ activité transfrontalière simultanée . activité non salariée . n°3:
formule: oui
activité transfrontalière simultanée . activité non salariée . n°3 . pays:
API: pays européen
activité transfrontalière simultanée . activité non salariée . n°3 . pays . autre:
applicable si: pays = 'Autre'
? activité transfrontalière simultanée . activité non salariée . n°3 . pays . autre
: applicable si: pays = 'Autre'
titre: Nom du pays
type: texte
activité transfrontalière simultanée . activité non salariée . n°3 . nom de l'entreprise:
type: texte
? activité transfrontalière simultanée . activité non salariée . n°3 . nom de l'entreprise
: type: texte
activité transfrontalière simultanée . activité non salariée . n°3 . adresse:
type: texte
activité transfrontalière simultanée . activité non salariée . n°3 . ville:
type: texte
activité transfrontalière simultanée . activité non salariée . n°3 . code postal:
type: texte
activité transfrontalière simultanée . activité non salariée . n°3 . date de début d'activité:
type: date
? activité transfrontalière simultanée . activité non salariée . n°3 . code postal
: type: texte
? activité transfrontalière simultanée . activité non salariée . n°3 . date de début d'activité
: type: date
activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt:
type: groupe
? activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt
: type: groupe
formule: oui
titre: Quel sera votre pays "centre d'intêret" pour les 12 prochains mois ?
non applicable si:
@ -430,11 +430,11 @@ activité transfrontalière simultanée . activité non salariée . pays centre
circonstances (notamment ses projets), de faire des Pays-Bas le centre
dintérêt de son activité.
activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt . pays:
API: pays européen
? activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt . pays
: API: pays européen
titre: Pays "centre d'intêret"
activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt . pays . autre:
applicable si: pays = 'Autre'
? activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt . pays . autre
: applicable si: pays = 'Autre'
titre: Nom du pays
type: texte
commentaires additionnels:

View File

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

View File

@ -9,18 +9,27 @@ import 'Components/TargetSelection.css'
import { EngineContext, useEngine } from 'Components/utils/EngineContext'
import useSimulationConfig from 'Components/utils/useSimulationConfig'
import ircecSrc from 'Images/logos-caisses-retraite/ircec.jpg'
import { useContext } from 'react'
import { useContext, useState } from 'react'
import { Trans } from 'react-i18next'
import styled from 'styled-components'
import config from './configs/artiste-auteur.yaml'
export default function ArtisteAuteur() {
useSimulationConfig(config)
const [animationDisabled, setAnimationDisabled] = useState(false)
return (
<>
<SimulateurWarning simulateur="artiste-auteur" />
<Simulation explanations={<CotisationsResult />}>
<Simulation
userWillExport={() => {
setAnimationDisabled(true)
}}
disableAnimation={animationDisabled}
explanations={
<CotisationsResult disableAnimation={animationDisabled} />
}
>
<PeriodSwitch />
<SimulationGoals className="plain">
@ -32,12 +41,17 @@ export default function ArtisteAuteur() {
</>
)
}
function CotisationsResult() {
interface CotisationResultProps {
disableAnimation: boolean
}
function CotisationsResult({ disableAnimation }: CotisationResultProps) {
return (
<>
<CotisationsParOrganisme />
<Condition expression="artiste-auteur . cotisations > 0">
<RepartitionCotisations />
<RepartitionCotisations disableAnimation={disableAnimation} />
</Condition>
</>
)
@ -98,7 +112,13 @@ const branches = [
},
] as const
function RepartitionCotisations() {
interface RepartitionCotisationsProps {
disableAnimation: boolean
}
function RepartitionCotisations({
disableAnimation,
}: RepartitionCotisationsProps) {
const engine = useContext(EngineContext)
const cotisations = branches.map((branch) => ({
...branch,
@ -117,6 +137,7 @@ function RepartitionCotisations() {
<DistributionBranch
key={cotisation.dottedName}
maximum={maximum}
disableAnimation={disableAnimation}
{...cotisation}
/>
))}

View File

@ -6,14 +6,21 @@ import Simulation from 'Components/Simulation'
import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals'
import StackedBarChart from 'Components/StackedBarChart'
import { ThemeColorsContext } from 'Components/utils/colors'
import { default as React, useContext } from 'react'
import { default as React, useContext, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next'
export default function AutoEntrepreneur() {
const [animationDisabled, setAnimationDisabled] = useState(false)
return (
<>
<SimulateurWarning simulateur="auto-entrepreneur" />
<Simulation explanations={<Explanation />}>
<Simulation
userWillExport={() => {
setAnimationDisabled(true)
}}
disableAnimation={animationDisabled}
explanations={<Explanation disableAnimation={animationDisabled} />}
>
<PeriodSwitch />
<SimulationGoals className="plain">
<ChiffreAffairesActivitéMixte dottedName="dirigeant . auto-entrepreneur . chiffre d'affaires" />
@ -36,8 +43,11 @@ export default function AutoEntrepreneur() {
</>
)
}
interface ExplanationProps {
disableAnimation: boolean
}
function Explanation() {
function Explanation({ disableAnimation }: ExplanationProps) {
const { t } = useTranslation()
const { palettes } = useContext(ThemeColorsContext)
return (
@ -46,6 +56,7 @@ function Explanation() {
<Trans>Répartition du chiffre d'affaires</Trans>
</h2>
<StackedBarChart
disableAnimation={disableAnimation}
data={[
{
dottedName: 'dirigeant . auto-entrepreneur . net après impôt',

View File

@ -27,6 +27,7 @@ declare global {
export default function ChômagePartiel() {
const inIframe = useContext(IsEmbeddedContext)
const [animationDisabled, setAnimationDisabled] = useState(false)
useEffect(() => {
if (inIframe) {
return
@ -56,6 +57,10 @@ export default function ChômagePartiel() {
</ul>
</Warning>
<Simulation
userWillExport={() => {
setAnimationDisabled(true)
}}
disableAnimation={animationDisabled}
results={<ExplanationSection />}
customEndMessages={
<span className="ui__ notice">Voir les résultats au-dessus</span>

View File

@ -10,16 +10,31 @@ import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals'
import { useEngine } from 'Components/utils/EngineContext'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { DottedName } from 'modele-social'
import { useContext } from 'react'
import { useContext, useState } from 'react'
import { Trans } from 'react-i18next'
import { useDispatch } from 'react-redux'
import { Link } from 'react-router-dom'
export function IndépendantPLSimulation() {
interface IndépendantSimulationProps {
disableAnimation: boolean
}
export function IndépendantPLSimulation({
disableAnimation,
}: IndépendantSimulationProps) {
const [animationDisabled, setAnimationDisabled] = useState(false)
return (
<>
<SimulateurWarning simulateur="profession-libérale" />
<Simulation explanations={<IndépendantExplanation />}>
<Simulation
userWillExport={() => {
setAnimationDisabled(true)
}}
disableAnimation={animationDisabled}
explanations={
<IndépendantExplanation disableAnimation={animationDisabled} />
}
>
<PeriodSwitch />
<IndépendantSimulationGoals />
</Simulation>
@ -27,11 +42,22 @@ export function IndépendantPLSimulation() {
)
}
export function EntrepriseIndividuelle() {
export function EntrepriseIndividuelle({
disableAnimation,
}: IndépendantSimulationProps) {
const [animationDisabled, setAnimationDisabled] = useState(false)
return (
<>
<SimulateurWarning simulateur="entreprise-individuelle" />
<Simulation explanations={<IndépendantExplanation />}>
<Simulation
userWillExport={() => {
setAnimationDisabled(true)
}}
disableAnimation={animationDisabled}
explanations={
<IndépendantExplanation disableAnimation={animationDisabled} />
}
>
<PeriodSwitch />
<IndépendantSimulationGoals />
</Simulation>
@ -39,12 +65,23 @@ export function EntrepriseIndividuelle() {
)
}
export default function IndépendantSimulation() {
export default function IndépendantSimulation({
disableAnimation,
}: IndépendantSimulationProps) {
const sitePaths = useContext(SitePathsContext)
const [animationDisabled, setAnimationDisabled] = useState(false)
return (
<>
<SimulateurWarning simulateur="indépendant" />
<Simulation explanations={<IndépendantExplanation />}>
<Simulation
userWillExport={() => {
setAnimationDisabled(true)
}}
disableAnimation={animationDisabled}
explanations={
<IndépendantExplanation disableAnimation={animationDisabled} />
}
>
<div
css={`
display: flex;
@ -134,7 +171,12 @@ function ImpositionSwitch() {
return (
<span className="base ui__ small radio toggle">
{(['IR', 'IS'] as const).map((imposition) => (
<label key={imposition}>
<label
key={imposition}
className={
currentImposition !== imposition ? 'ui__ print-display-none' : ''
}
>
<input
name="entreprise . imposition"
type="radio"

View File

@ -1,5 +1,6 @@
import { Condition } from 'Components/EngineValue'
import PreviousSimulationBanner from 'Components/PreviousSimulationBanner'
import ExportRecover from 'Components/simulationExplanation/ExportRecover'
import { ThemeColorsProvider } from 'Components/utils/colors'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import Emoji from 'Components/utils/Emoji'
@ -89,6 +90,7 @@ export default function PageData({
{!inIframe && (
<>
{seoExplanations}
<ExportRecover></ExportRecover>
<NextSteps
iframePath={privateIframe ? undefined : iframePath}
nextSteps={nextSteps}
@ -118,7 +120,7 @@ function NextSteps({ iframePath, nextSteps }: NextStepsProps) {
return null
}
return (
<section>
<section className="ui__ print-display-none">
<h2 className="ui__ h h3">
<Trans>Ressources utiles</Trans>
</h2>
@ -196,27 +198,32 @@ export function SimulatorRessourceCard({
const guidesUrssaf = [
{
url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf',
url:
'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf',
associatedRule: "dirigeant . indépendant . PL . métier = 'santé . médecin'",
title: 'Guide Urssaf pour les médecins libéraux',
},
{
url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf',
url:
'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf',
associatedRule: 'entreprise . activité . libérale réglementée',
title: 'Guide Urssaf pour les professions libérales réglementées',
},
{
url: 'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf',
url:
'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf',
associatedRule: 'dirigeant . auto-entrepreneur',
title: 'Guide Urssaf pour les auto-entrepreneurs',
},
{
url: 'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf',
url:
'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf',
associatedRule: "dirigeant = 'artiste-auteur'",
title: 'Guide Urssaf pour les artistes-auteurs',
},
{
url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf',
url:
'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf',
associatedRule: 'dirigeant',
title: 'Guide Urssaf pour les indépendants',
},

View File

@ -1,4 +1,5 @@
import Banner from 'Components/Banner'
import { useState } from 'react'
import Simulation from 'Components/Simulation'
import SalaryExplanation from 'Components/simulationExplanation/SalaryExplanation'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
@ -7,12 +8,19 @@ import { Trans } from 'react-i18next'
import { Link } from 'react-router-dom'
export default function SalariéSimulation() {
const [animationDisabled, setAnimationDisabled] = useState(false)
const sitePaths = useContext(SitePathsContext)
return (
<>
<Simulation
explanations={<SalaryExplanation />}
userWillExport={() => {
setAnimationDisabled(true)
}}
disableAnimation={animationDisabled}
explanations={
<SalaryExplanation disableAnimation={animationDisabled} />
}
customEndMessages={
<>
<Trans i18nKey="simulation-end.hiring.text">

View File

@ -59,7 +59,7 @@ export default function Simulateurs() {
{(!lastState || lastState?.fromSimulateurs) && (
<Link
to={sitePaths.simulateurs.index}
className="ui__ simple small push-left button"
className="ui__ simple small push-left button print-display-none"
>
<Trans>Voir les autres simulateurs</Trans>
</Link>

View File

@ -4,7 +4,7 @@ import Simulation from 'Components/Simulation'
import SalaryExplanation from 'Components/simulationExplanation/SalaryExplanation'
import Emoji from 'Components/utils/Emoji'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import React, { useContext, useMemo } from 'react'
import React, { useContext, useMemo, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { SimulationConfig } from 'Reducers/rootReducer'
import { constructLocalizedSitePath } from '../../sitePaths'
@ -139,74 +139,77 @@ export function getSimulatorsData({
shortName: t('pages.simulateurs.salarié.shortname', 'Salarié'),
seoExplanations: (
<Trans i18nKey="pages.simulateurs.salarié.seo">
<h2>Comment calculer le salaire net ?</h2>
<p>
Lors de l'entretien d'embauche l'employeur propose en général une
rémunération exprimée en « brut ». Le montant annoncé inclut ainsi
les cotisations salariales, qui servent à financer la protection
sociale du salarié et qui sont retranchées du salaire « net » perçu
par le salarié.
</p>
<p>
Vous pouvez utiliser notre simulateur pour convertir le{' '}
<strong>salaire brut en net</strong> : il vous suffit pour cela
saisir la rémunération annoncée dans la case salaire brut. La
simulation peut-être affinée en répondant aux différentes questions
(CDD, statut cadre, heures supplémentaires, temps partiel,
titre-restaurants, etc.).
</p>
<img
src={
language === 'fr'
? urlIllustrationNetBrut
: urlIllustrationNetBrutEn
}
alt={t(
'pages.simulateurs.salarié.alt-image1',
'Salaire net (perçu par le salarié) = Salaire brut (inscrit dans le contrat de travail) - cotisations salariales (retraite, csg, etc)'
)}
css={`
width: 100%;
`}
/>
<p>
Par ailleurs depuis 2019, l'
<RuleLink dottedName="impôt">impôt sur le revenu</RuleLink> est
prélevé à la source. Pour ce faire, la direction générale des
finances publiques (DGFiP) transmet à l'employeur le taux
d'imposition calculé à partir de la déclaration de revenu du
salarié. Si ce taux est inconnu, par exemple lors d'une première
année d'activité, l'employeur utilise le{' '}
<RuleLink dottedName="impôt . taux neutre d'impôt sur le revenu">
taux neutre
</RuleLink>
.
</p>
<h2>Comment calculer le coût d'embauche ?</h2>
<p>
Si vous cherchez à embaucher, vous pouvez calculer le coût total de
la rémunération de votre salarié, ainsi que les montants de
cotisations patronales et salariales correspondant. Cela vous permet
de définir le niveau de rémunération en connaissant le montant
global de charge que cela représente pour votre entreprise.
</p>
<p>
En plus du salaire, notre simulateur prend en compte le calcul des
avantages en nature (téléphone, véhicule de fonction, etc.), ainsi
que la mutuelle santé obligatoire.
</p>
<p>
Il existe des{' '}
<RuleLink dottedName="contrat salarié . aides employeur">
aides différées
</RuleLink>{' '}
à l'embauche qui ne sont pas toutes prises en compte par notre
simulateur, vous pouvez les retrouver sur{' '}
<a href="http://www.aides-entreprises.fr" target="_blank">
le portail officiel
</a>
.
</p>
<section className="ui__ print-break-avoid">
<h2>Comment calculer le salaire net ?</h2>
<p>
Lors de l'entretien d'embauche l'employeur propose en général une
rémunération exprimée en « brut ». Le montant annoncé inclut ainsi
les cotisations salariales, qui servent à financer la protection
sociale du salarié et qui sont retranchées du salaire « net »
perçu par le salarié.
</p>
<p>
Vous pouvez utiliser notre simulateur pour convertir le{' '}
<strong>salaire brut en net</strong> : il vous suffit pour cela
saisir la rémunération annoncée dans la case salaire brut. La
simulation peut-être affinée en répondant aux différentes
questions (CDD, statut cadre, heures supplémentaires, temps
partiel, titre-restaurants, etc.).
</p>
<img
src={
language === 'fr'
? urlIllustrationNetBrut
: urlIllustrationNetBrutEn
}
alt={t(
'pages.simulateurs.salarié.alt-image1',
'Salaire net (perçu par le salarié) = Salaire brut (inscrit dans le contrat de travail) - cotisations salariales (retraite, csg, etc)'
)}
css={`
width: 100%;
`}
/>
<p>
Par ailleurs depuis 2019, l'
<RuleLink dottedName="impôt">impôt sur le revenu</RuleLink> est
prélevé à la source. Pour ce faire, la direction générale des
finances publiques (DGFiP) transmet à l'employeur le taux
d'imposition calculé à partir de la déclaration de revenu du
salarié. Si ce taux est inconnu, par exemple lors d'une première
année d'activité, l'employeur utilise le{' '}
<RuleLink dottedName="impôt . taux neutre d'impôt sur le revenu">
taux neutre
</RuleLink>
.
</p>
<h2>Comment calculer le coût d'embauche ?</h2>
<p>
Si vous cherchez à embaucher, vous pouvez calculer le coût total
de la rémunération de votre salarié, ainsi que les montants de
cotisations patronales et salariales correspondant. Cela vous
permet de définir le niveau de rémunération en connaissant le
montant global de charge que cela représente pour votre
entreprise.
</p>
<p>
En plus du salaire, notre simulateur prend en compte le calcul des
avantages en nature (téléphone, véhicule de fonction, etc.), ainsi
que la mutuelle santé obligatoire.
</p>
<p>
Il existe des{' '}
<RuleLink dottedName="contrat salarié . aides employeur">
aides différées
</RuleLink>{' '}
à l'embauche qui ne sont pas toutes prises en compte par notre
simulateur, vous pouvez les retrouver sur{' '}
<a href="http://www.aides-entreprises.fr" target="_blank">
le portail officiel
</a>
.
</p>
</section>
</Trans>
),
nextSteps: ['chômage-partiel', 'aides-embauche'],
@ -244,7 +247,9 @@ export function getSimulatorsData({
'Entreprise individuelle (EI) : simulateur de revenus'
),
},
component: EntrepriseIndividuelle,
component: () => {
return <EntrepriseIndividuelle disableAnimation={false} />
},
path: sitePaths.simulateurs['entreprise-individuelle'],
shortName: t('pages.simulateurs.ei.shortname', 'EI'),
title: t(
@ -253,67 +258,70 @@ export function getSimulatorsData({
),
seoExplanations: (
<Trans i18nKey="pages.simulateurs.ei.seo explanation">
<h2>
Comment calculer le revenu net d'un dirigeant d'entreprise
individuelle (EI) ?
</h2>
<p>
Un dirigeant d'entreprise individuelle doit payer des cotisations et
contributions sociales à l'administration. Ces cotisations servent
au financement de la sécurité sociale, et ouvrent des droits
notamment pour la retraite et pour l'assurance maladie. Elles
permettent également de financer la formation professionnelle.
</p>
<p>
<Emoji emoji="👉" />{' '}
<RuleLink dottedName="dirigeant . indépendant . cotisations et contributions">
Voir le détail du calcul des cotisations
</RuleLink>
</p>
<p>
Il ne faut pas oublier de retrancher toutes les dépenses effectuées
dans le cadre de l'activité professionnelle (équipements, matières
premières, local, transport). Ces dernières sont déductibles du
résultat de l'entreprise, cela veut dire que vous ne payerez pas
d'impôt ou de cotisations sur leur montant (sauf si vous avez opté
pour l'option micro-fiscal).
</p>
<p>
La formule de calcul complète est donc :
<blockquote>
<strong>
Revenu net = Chiffres d'affaires Dépenses professionnelles -
Cotisations sociales
</strong>
</blockquote>
</p>
<h2>
Comment calculer les cotisations sociales d'une entreprise
individuelle ?
</h2>
<p>
Le dirigeant d'une entreprise individuelle paye des cotisations
sociales, proportionnelle au{' '}
<RuleLink dottedName="entreprise . résultat fiscal">
résultat fiscal
</RuleLink>{' '}
de l'entreprise. Leur montant varie également en fonction du type
d'activité (profession libérale, artisan, commerçants, etc), où des
éventuelles exonérations accordées (ACRE, ZFU, RSA, etc.).
</p>
<p>
{' '}
Comme le résultat d'une entreprise n'est connu qu'à la fin de
l'exercice comptable, le dirigeant paye des cotisations
provisionnelles qui seront ensuite régularisée une fois le revenu
réel déclaré, l'année suivante.
</p>
<p>
Ce simulateur permet de calculer le montant exact des cotisations
sociale en partant d'un chiffre d'affaires ou d'un revenu net
souhaité. Vous pourrez préciser votre situation en répondant aux
questions s'affichant en dessous de la simulation.
</p>
<section className="ui__ print-break-avoid">
<h2>
Comment calculer le revenu net d'un dirigeant d'entreprise
individuelle (EI) ?
</h2>
<p>
Un dirigeant d'entreprise individuelle doit payer des cotisations
et contributions sociales à l'administration. Ces cotisations
servent au financement de la sécurité sociale, et ouvrent des
droits notamment pour la retraite et pour l'assurance maladie.
Elles permettent également de financer la formation
professionnelle.
</p>
<p>
<Emoji emoji="👉" />{' '}
<RuleLink dottedName="dirigeant . indépendant . cotisations et contributions">
Voir le détail du calcul des cotisations
</RuleLink>
</p>
<p>
Il ne faut pas oublier de retrancher toutes les dépenses
effectuées dans le cadre de l'activité professionnelle
(équipements, matières premières, local, transport). Ces dernières
sont déductibles du résultat de l'entreprise, cela veut dire que
vous ne payerez pas d'impôt ou de cotisations sur leur montant
(sauf si vous avez opté pour l'option micro-fiscal).
</p>
<p>
La formule de calcul complète est donc :
<blockquote>
<strong>
Revenu net = Chiffres d'affaires Dépenses professionnelles -
Cotisations sociales
</strong>
</blockquote>
</p>
<h2>
Comment calculer les cotisations sociales d'une entreprise
individuelle ?
</h2>
<p>
Le dirigeant d'une entreprise individuelle paye des cotisations
sociales, proportionnelle au{' '}
<RuleLink dottedName="entreprise . résultat fiscal">
résultat fiscal
</RuleLink>{' '}
de l'entreprise. Leur montant varie également en fonction du type
d'activité (profession libérale, artisan, commerçants, etc), où
des éventuelles exonérations accordées (ACRE, ZFU, RSA, etc.).
</p>
<p>
{' '}
Comme le résultat d'une entreprise n'est connu qu'à la fin de
l'exercice comptable, le dirigeant paye des cotisations
provisionnelles qui seront ensuite régularisée une fois le revenu
réel déclaré, l'année suivante.
</p>
<p>
Ce simulateur permet de calculer le montant exact des cotisations
sociale en partant d'un chiffre d'affaires ou d'un revenu net
souhaité. Vous pourrez préciser votre situation en répondant aux
questions s'affichant en dessous de la simulation.
</p>
</section>
</Trans>
),
nextSteps: ['comparaison-statuts'],
@ -345,7 +353,9 @@ export function getSimulatorsData({
'EIRL : simulateur de revenus pour dirigeant'
),
},
component: IndépendantSimulation,
component: () => {
return <IndépendantSimulation disableAnimation={false} />
},
path: sitePaths.simulateurs.eirl,
shortName: t('pages.simulateurs.eirl.shortname', 'EIRL'),
title: t('pages.simulateurs.eirl.title', "Simulateur d'EIRL"),
@ -383,52 +393,63 @@ export function getSimulatorsData({
shortName: t('pages.simulateurs.sasu.shortname', 'SASU'),
title: t('pages.simulateurs.sasu.title', 'Simulateur de SASU'),
component: function SasuSimulation() {
const [animationDisabled, setAnimationDisabled] = useState(false)
return (
<>
<SimulateurWarning simulateur="sasu" />
<Simulation explanations={<SalaryExplanation />} />
<Simulation
userWillExport={() => {
setAnimationDisabled(true)
}}
disableAnimation={animationDisabled}
explanations={
<SalaryExplanation disableAnimation={animationDisabled} />
}
/>
</>
)
},
seoExplanations: (
<Trans i18nKey="pages.simulateurs.sasu.seo-explanation">
<h2>Comment calculer le salaire d'un dirigeant de SASU ? </h2>
<p>
Comme pour un salarié classique, le{' '}
<strong>dirigeant de sasu</strong> paye des cotisations sociales sur
la rémunération qu'il se verse. Les cotisations sont calculées de la
même manière que pour le salarié : elles sont décomposées en partie
employeur et partie salarié et sont exprimées comme un pourcentage
du salaire brut.
</p>
<p>
Le dirigeant assimilé-salarié ne paye pas de{' '}
<strong>cotisations chômage</strong>. Par ailleurs, il ne bénéficie
pas de la{' '}
<RuleLink dottedName="contrat salarié . réduction générale">
réduction générale de cotisations
</RuleLink>{' '}
ni des dispositifs encadrés par le code du travail comme les{' '}
<RuleLink dottedName="contrat salarié . temps de travail . heures supplémentaires">
heures supplémentaires
</RuleLink>{' '}
ou les primes.
</p>
<p>
Il peut en revanche prétendre à la{' '}
<RuleLink dottedName="dirigeant . assimilé salarié . réduction ACRE">
réduction ACRE
</RuleLink>{' '}
en debut d'activité, sous certaines conditions.
</p>
<p>
Vous pouvez utiliser notre simulateur pour calculer la{' '}
<strong>rémunération nette</strong> à partir d'un montant superbrut
alloué à la rémunération du dirigeant. Il vous suffit pour cela
saisir le montant total alloué dans la case "total chargé". La
simulation peut ensuite être affinée en répondant aux différentes
questions.
</p>
<section className="ui__ print-break-avoid">
<h2>Comment calculer le salaire d'un dirigeant de SASU ? </h2>
<p>
Comme pour un salarié classique, le{' '}
<strong>dirigeant de sasu</strong> paye des cotisations sociales
sur la rémunération qu'il se verse. Les cotisations sont calculées
de la même manière que pour le salarié : elles sont décomposées en
partie employeur et partie salarié et sont exprimées comme un
pourcentage du salaire brut.
</p>
<p>
Le dirigeant assimilé-salarié ne paye pas de{' '}
<strong>cotisations chômage</strong>. Par ailleurs, il ne
bénéficie pas de la{' '}
<RuleLink dottedName="contrat salarié . réduction générale">
réduction générale de cotisations
</RuleLink>{' '}
ni des dispositifs encadrés par le code du travail comme les{' '}
<RuleLink dottedName="contrat salarié . temps de travail . heures supplémentaires">
heures supplémentaires
</RuleLink>{' '}
ou les primes.
</p>
<p>
Il peut en revanche prétendre à la{' '}
<RuleLink dottedName="dirigeant . assimilé salarié . réduction ACRE">
réduction ACRE
</RuleLink>{' '}
en debut d'activité, sous certaines conditions.
</p>
<p>
Vous pouvez utiliser notre simulateur pour calculer la{' '}
<strong>rémunération nette</strong> à partir d'un montant
superbrut alloué à la rémunération du dirigeant. Il vous suffit
pour cela saisir le montant total alloué dans la case "total
chargé". La simulation peut ensuite être affinée en répondant aux
différentes questions.
</p>
</section>
</Trans>
),
nextSteps: ['is', 'comparaison-statuts'],
@ -469,7 +490,9 @@ export function getSimulatorsData({
path: sitePaths.simulateurs.eurl,
shortName: t('pages.simulateurs.sasu.shortname', 'EURL'),
title: t('pages.simulateurs.sasu.title', "Simulateur d'EURL"),
component: IndépendantSimulation,
component: () => {
return <IndépendantSimulation disableAnimation={false} />
},
nextSteps: ['is', 'comparaison-statuts'],
},
'auto-entrepreneur': {
@ -508,67 +531,70 @@ export function getSimulatorsData({
),
seoExplanations: (
<Trans i18nKey="pages.simulateurs.auto-entrepreneur.seo explanation">
<h2>Comment calculer le revenu net d'un auto-entrepreneur ?</h2>
<p>
Un auto-entrepreneur doit payer des cotisations et contributions
sociales à l'administration. Ces cotisations servent au financement
de la sécurité sociale, et ouvrent des droits notamment pour la
retraite et pour l'assurance maladie. Elles permettent également de
financer la formation professionnelle. Leur montant varie en
fonction du type d'activité.
</p>
<p>
<Emoji emoji="👉" />{' '}
<RuleLink dottedName="dirigeant . auto-entrepreneur . cotisations et contributions">
Voir le détail du calcul des cotisations
</RuleLink>
</p>
<p>
Il ne faut pas oublier de retrancher toutes les dépenses effectuées
dans le cadre de l'activité professionnelle (équipements, matières
premières, local, transport). Bien qu'elles ne soient pas utilisées
pour le calcul des cotisations et de l'impôt, elles doivent être
prises en compte pour vérifier si l'activité est viable
économiquement.
</p>
<p>
La formule de calcul complète est donc :
<blockquote>
<strong>
Revenu net = Chiffres d'affaires Cotisations sociales
Dépenses professionnelles
</strong>
</blockquote>
</p>
<h2>
Comment calculer l'impôt sur le revenu pour un auto-entrepreneur ?
</h2>
<p>
Si vous avez opté pour le versement libératoire lors de la création
de votre auto-entreprise, l'impôt sur le revenu est payé en même
temps que les cotisations sociales.
</p>
<p>
<Emoji emoji="👉" />{' '}
<RuleLink dottedName="dirigeant . auto-entrepreneur . impôt . versement libératoire . montant">
Voir comment est calculé le montant du versement libératoire
</RuleLink>
</p>
<p>
Sinon, vous serez imposé selon le barème standard de l'impôt sur le
revenu. Le revenu imposable est alors calculé comme un pourcentage
du chiffre d'affaires. C'est qu'on appel l'abattement forfaitaire.
Ce pourcentage varie en fonction du type d'activité excercé. On dit
qu'il est forfaitaire car il ne prends pas en compte les dépenses
réelles effectuées dans le cadre de l'activité.
</p>
<p>
<Emoji emoji="👉" />{' '}
<RuleLink dottedName="dirigeant . auto-entrepreneur . impôt . revenu imposable">
Voir le détail du calcul du revenu abattu pour un
auto-entrepreneur
</RuleLink>
</p>
<section className="ui__ print-break-avoid">
<h2>Comment calculer le revenu net d'un auto-entrepreneur ?</h2>
<p>
Un auto-entrepreneur doit payer des cotisations et contributions
sociales à l'administration. Ces cotisations servent au
financement de la sécurité sociale, et ouvrent des droits
notamment pour la retraite et pour l'assurance maladie. Elles
permettent également de financer la formation professionnelle.
Leur montant varie en fonction du type d'activité.
</p>
<p>
<Emoji emoji="👉" />{' '}
<RuleLink dottedName="dirigeant . auto-entrepreneur . cotisations et contributions">
Voir le détail du calcul des cotisations
</RuleLink>
</p>
<p>
Il ne faut pas oublier de retrancher toutes les dépenses
effectuées dans le cadre de l'activité professionnelle
(équipements, matières premières, local, transport). Bien qu'elles
ne soient pas utilisées pour le calcul des cotisations et de
l'impôt, elles doivent être prises en compte pour vérifier si
l'activité est viable économiquement.
</p>
<p>
La formule de calcul complète est donc :
<blockquote>
<strong>
Revenu net = Chiffres d'affaires Cotisations sociales
Dépenses professionnelles
</strong>
</blockquote>
</p>
<h2>
Comment calculer l'impôt sur le revenu pour un auto-entrepreneur ?
</h2>
<p>
Si vous avez opté pour le versement libératoire lors de la
création de votre auto-entreprise, l'impôt sur le revenu est payé
en même temps que les cotisations sociales.
</p>
<p>
<Emoji emoji="👉" />{' '}
<RuleLink dottedName="dirigeant . auto-entrepreneur . impôt . versement libératoire . montant">
Voir comment est calculé le montant du versement libératoire
</RuleLink>
</p>
<p>
Sinon, vous serez imposé selon le barème standard de l'impôt sur
le revenu. Le revenu imposable est alors calculé comme un
pourcentage du chiffre d'affaires. C'est qu'on appel l'abattement
forfaitaire. Ce pourcentage varie en fonction du type d'activité
excercé. On dit qu'il est forfaitaire car il ne prends pas en
compte les dépenses réelles effectuées dans le cadre de
l'activité.
</p>
<p>
<Emoji emoji="👉" />{' '}
<RuleLink dottedName="dirigeant . auto-entrepreneur . impôt . revenu imposable">
Voir le détail du calcul du revenu abattu pour un
auto-entrepreneur
</RuleLink>
</p>
</section>
</Trans>
),
nextSteps: ['indépendant', 'comparaison-statuts'],
@ -594,7 +620,9 @@ export function getSimulatorsData({
"Calcul du revenu net après impôt et des cotisations à partir du chiffre d'affaires et inversement"
),
},
component: IndépendantSimulation,
component: () => {
return <IndépendantSimulation disableAnimation={false} />
},
nextSteps: ['comparaison-statuts', 'is'],
},
@ -662,74 +690,77 @@ export function getSimulatorsData({
),
seoExplanations: (
<Trans i18nKey="pages.simulateurs.chômage-partiel.seo">
<h2>Comment calculer l'indemnité d'activité partielle ?</h2>
<p>
L'indemnité d'activité partielle de base est fixée par la loi à{' '}
<strong>70% du brut</strong>. Elle est proratisée en fonction du
nombre d'heures chômées. Pour un salarié à 2300 brut mensuel, qui
travaille à 50% de son temps usuel, cela donne{' '}
<strong>2300 × 50% × 70% = 805 </strong>
</p>
<p>
A cette indemnité de base s'ajoute l'indemnité complémentaire pour
les salaires proches du SMIC. Ce complément intervient lorsque le
cumul de la rémunération et de l'indemnité de base est en dessous
d'un SMIC net. Ces indemnités sont prises en charge par l'employeur,
qui sera ensuite remboursé en parti ou en totalité par l'État.
</p>
<p>
👉{' '}
<RuleLink dottedName="contrat salarié . activité partielle . indemnités">
Voir le détail du calcul de l'indemnité
</RuleLink>
</p>
<h2>Comment calculer la part remboursée par l'État ?</h2>
<p>
L'État prend en charge une partie de l'indemnité partielle pour les
salaires allant jusqu'à <strong>4,5 SMIC</strong>, avec un minimum à
8,03 par heures chômée. Concrètement, cela abouti à une prise en
charge à<strong>100%</strong> pour les salaires proches du SMIC.
Celle-ci diminue progressivement jusqu'à se stabiliser à{' '}
<strong>93%</strong> pour les salaires compris{' '}
<strong>entre 2000 et 7000 </strong> (salaire correspondant à la
limite de 4,5 SMIC).
</p>
<p>
👉{' '}
<RuleLink dottedName="contrat salarié . activité partielle . indemnisation entreprise">
Voir le détail du calcul du remboursement de l'indemnité
</RuleLink>
</p>
<h2>Comment déclarer une activité partielle ?</h2>
<p>
Face à la crise du coronavirus, les modalités de passage en activité
partielle ont été allégées. L'employeur est autorisé a placer ses
salariés en activité partielle avant que la demande officielle ne
soit déposée. Celui-ci dispose ensuite d'un délai de{' '}
<strong>30 jours</strong> pour se mettre en règle. Les indemnités
seront versées avec un effet rétro-actif débutant à la mise en place
du chômage partiel.
</p>
<p>
👉{' '}
<a href="https://www.service-public.fr/professionnels-entreprises/vosdroits/R31001">
Effectuer la demande de chômage partiel
</a>
</p>
<h2>
{' '}
Quelles sont les cotisations sociales à payer pour l'indemnité
d'activité partielle ?
</h2>
<p>
L'indemnité d'activité partielle est soumise à la CSG/CRDS et à une
contribution maladie dans certains cas. Pour en savoir plus, voir la
page explicative sur{' '}
<a href="https://www.urssaf.fr/portail/home/employeur/reduire-ou-cesser-lactivite/la-reduction-ou-la-cessation-tem/lactivite-partielle-dispositif-d/le-regime-social-de-lindemnite-d.html">
le site de l'Urssaf
</a>
.
</p>
<section className="ui__ print-break-avoid">
<h2>Comment calculer l'indemnité d'activité partielle ?</h2>
<p>
L'indemnité d'activité partielle de base est fixée par la loi à{' '}
<strong>70% du brut</strong>. Elle est proratisée en fonction du
nombre d'heures chômées. Pour un salarié à 2300 brut mensuel,
qui travaille à 50% de son temps usuel, cela donne{' '}
<strong>2300 × 50% × 70% = 805 </strong>
</p>
<p>
A cette indemnité de base s'ajoute l'indemnité complémentaire pour
les salaires proches du SMIC. Ce complément intervient lorsque le
cumul de la rémunération et de l'indemnité de base est en dessous
d'un SMIC net. Ces indemnités sont prises en charge par
l'employeur, qui sera ensuite remboursé en parti ou en totalité
par l'État.
</p>
<p>
👉{' '}
<RuleLink dottedName="contrat salarié . activité partielle . indemnités">
Voir le détail du calcul de l'indemnité
</RuleLink>
</p>
<h2>Comment calculer la part remboursée par l'État ?</h2>
<p>
L'État prend en charge une partie de l'indemnité partielle pour
les salaires allant jusqu'à <strong>4,5 SMIC</strong>, avec un
minimum à 8,03 par heures chômée. Concrètement, cela abouti à une
prise en charge à<strong>100%</strong> pour les salaires proches
du SMIC. Celle-ci diminue progressivement jusqu'à se stabiliser à{' '}
<strong>93%</strong> pour les salaires compris{' '}
<strong>entre 2000 et 7000 </strong> (salaire correspondant à
la limite de 4,5 SMIC).
</p>
<p>
👉{' '}
<RuleLink dottedName="contrat salarié . activité partielle . indemnisation entreprise">
Voir le détail du calcul du remboursement de l'indemnité
</RuleLink>
</p>
<h2>Comment déclarer une activité partielle ?</h2>
<p>
Face à la crise du coronavirus, les modalités de passage en
activité partielle ont été allégées. L'employeur est autorisé a
placer ses salariés en activité partielle avant que la demande
officielle ne soit déposée. Celui-ci dispose ensuite d'un délai de{' '}
<strong>30 jours</strong> pour se mettre en règle. Les indemnités
seront versées avec un effet rétro-actif débutant à la mise en
place du chômage partiel.
</p>
<p>
👉{' '}
<a href="https://www.service-public.fr/professionnels-entreprises/vosdroits/R31001">
Effectuer la demande de chômage partiel
</a>
</p>
<h2>
{' '}
Quelles sont les cotisations sociales à payer pour l'indemnité
d'activité partielle ?
</h2>
<p>
L'indemnité d'activité partielle est soumise à la CSG/CRDS et à
une contribution maladie dans certains cas. Pour en savoir plus,
voir la page explicative sur{' '}
<a href="https://www.urssaf.fr/portail/home/employeur/reduire-ou-cesser-lactivite/la-reduction-ou-la-cessation-tem/lactivite-partielle-dispositif-d/le-regime-social-de-lindemnite-d.html">
le site de l'Urssaf
</a>
.
</p>
</section>
</Trans>
),
nextSteps: ['salarié', 'aides-embauche'],
@ -844,7 +875,9 @@ export function getSimulatorsData({
'pages.simulateurs.médecin.title',
'Simulateur de revenus pour médecin en libéral'
),
component: IndépendantPLSimulation,
component: () => {
return <IndépendantPLSimulation disableAnimation={false} />
},
},
'chirurgien-dentiste': {
config: dentisteConfig,
@ -863,7 +896,9 @@ export function getSimulatorsData({
'pages.simulateurs.chirurgien-dentiste.title',
'Simulateur de revenus pour chirurgien-dentiste en libéral'
),
component: IndépendantPLSimulation,
component: () => {
return <IndépendantPLSimulation disableAnimation={false} />
},
},
'sage-femme': {
config: sageFemmeConfig,
@ -879,7 +914,9 @@ export function getSimulatorsData({
'pages.simulateurs.sage-femme.title',
'Simulateur de revenus pour sage-femme en libéral'
),
component: IndépendantPLSimulation,
component: () => {
return <IndépendantPLSimulation disableAnimation={false} />
},
},
'auxiliaire-médical': {
config: auxiliaireConfig,
@ -899,7 +936,9 @@ export function getSimulatorsData({
'pages.simulateurs.auxiliaire.title',
'Simulateur de revenus pour auxiliaire médical en libéral'
),
component: IndépendantPLSimulation,
component: () => {
return <IndépendantPLSimulation disableAnimation={false} />
},
},
avocat: {
config: avocatConfig,
@ -915,7 +954,9 @@ export function getSimulatorsData({
'pages.simulateurs.avocat.title',
'Simulateur de revenus pour avocat en libéral'
),
component: IndépendantPLSimulation,
component: () => {
return <IndépendantPLSimulation disableAnimation={false} />
},
},
'expert-comptable': {
config: expertComptableConfig,
@ -934,7 +975,9 @@ export function getSimulatorsData({
'pages.simulateurs.expert-comptable.title',
'Simulateur de revenus pour expert comptable et commissaire aux comptes en libéral'
),
component: IndépendantPLSimulation,
component: () => {
return <IndépendantPLSimulation disableAnimation={false} />
},
},
'profession-libérale': {
config: professionLibéraleConfig,
@ -962,7 +1005,9 @@ export function getSimulatorsData({
'pages.simulateurs.profession-libérale.title',
'Simulateur de revenus pour profession libérale'
),
component: IndépendantPLSimulation,
component: () => {
return <IndépendantPLSimulation disableAnimation={false} />
},
},
pamc: {
private: true,
@ -1063,35 +1108,40 @@ export function getSimulatorsData({
component: ISSimulation,
seoExplanations: (
<Trans i18nKey="pages.simulateurs.is.seo">
<h2>Comment est calculé limpôt sur les sociétés ?</h2>
<p>
Limpôt sur les sociétés sapplique aux bénéfices réalisés par les
sociétés de capitaux (SA, SAS, SASU, SARL, etc.) et sur option
facultative pour certaines autres sociétés (EIRL, EURL, SNC, etc.).
</p>
<p>
Il est calculé sur la base des bénéfices réalisés en France au cours
de lexercice comptable. La durée dun exercice est normalement dun
an mais il peut être plus court ou plus long (notamment en début
dactivité ou à la dissolution de lentreprise). Dans ce cas le
barème de limpôt est pro-ratisé en fonction de la durée de
lexercice, ce qui est pris en compte dans le simulateur en
modifiant les dates de début et de fin de lexercice.
</p>
<h2>Taux réduit et régimes spécifiques</h2>
<p>
Les PME réalisant moins de 7,63 millions deuros de chiffre
daffaires et dont le capital est détenu à 75% par des personnes
physiques bénéficient dun taux réduit dimpôt sur les sociétés. Ce
taux est pris en compte sur le simulateur et il nest pour linstant
pas possible de simuler linéligibilité aux taux réduits.
</p>
<p>
Enfin il existe des régimes dimpositions spécifiques avec des taux
dédiés pour certains types de plus-values (cession de titres,
cession de brevets). Ces régimes ne sont pas intégrés dans le
simulateur.
</p>
<section className="ui__ print-break-avoid">
<h2>Comment est calculé limpôt sur les sociétés ?</h2>
<p>
Limpôt sur les sociétés sapplique aux bénéfices réalisés par les
sociétés de capitaux (SA, SAS, SASU, SARL, etc.) et sur option
facultative pour certaines autres sociétés (EIRL, EURL, SNC,
etc.).
</p>
<p>
Il est calculé sur la base des bénéfices réalisés en France au
cours de lexercice comptable. La durée dun exercice est
normalement dun an mais il peut être plus court ou plus long
(notamment en début dactivité ou à la dissolution de
lentreprise). Dans ce cas le barème de limpôt est pro-ratisé en
fonction de la durée de lexercice, ce qui est pris en compte dans
le simulateur en modifiant les dates de début et de fin de
lexercice.
</p>
<h2>Taux réduit et régimes spécifiques</h2>
<p>
Les PME réalisant moins de 7,63 millions deuros de chiffre
daffaires et dont le capital est détenu à 75% par des personnes
physiques bénéficient dun taux réduit dimpôt sur les sociétés.
Ce taux est pris en compte sur le simulateur et il nest pour
linstant pas possible de simuler linéligibilité aux taux
réduits.
</p>
<p>
Enfin il existe des régimes dimpositions spécifiques avec des
taux dédiés pour certains types de plus-values (cession de titres,
cession de brevets). Ces régimes ne sont pas intégrés dans le
simulateur.
</p>
</section>
</Trans>
),
nextSteps: ['salarié', 'comparaison-statuts'],

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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