Revert "Réorganisation de la page /simulateur"

revert-1135-pam-johan
Johan Girod 2020-09-29 15:16:42 +02:00 committed by GitHub
parent 8c061b3c09
commit 0a33071b8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
58 changed files with 1301 additions and 1546 deletions

View File

@ -25,13 +25,13 @@ describe('Formulaire demande mobilité', function() {
.type('1991-07-25')
.tab()
.type('Pouts')
.wait(1500)
.wait(1000)
.type('{enter}')
.tab()
.type('3 rue de la Rhumerie')
.tab()
.type('Brest')
.wait(1500)
.wait(1000)
.type('{enter}')
.tab()
.type('jean.deaux@gmail.com')
@ -46,7 +46,7 @@ describe('Formulaire demande mobilité', function() {
.type('14 chemin des Docks')
.tab()
.type('Bre')
.wait(1500)
.wait(1000)
cy.contains('29240').click()
cy.contains('Organisme Urssaf').click()
cy.focused()
@ -67,7 +67,7 @@ describe('Formulaire demande mobilité', function() {
.next()
.click()
cy.get('label[for="détachement . pays"]')
.wait(1500)
.wait(1000)
.click()
cy.focused()
.select('Irlande')

View File

@ -37,6 +37,6 @@ describe('Manage page test', function() {
})
it('should be able to navigate to the hiring simulator', function() {
cy.contains(fr ? 'une embauche' : 'hiring').click()
cy.contains(fr ? 'salarié' : 'employee')
cy.contains(fr ? 'salarié' : 'employees')
})
})

View File

@ -125,8 +125,7 @@ async function fetchSimulators(dt) {
'/comparaison-régimes-sociaux',
'/dirigeant-sasu',
'/aide-declaration-independants',
'/demande-mobilité',
'/économie-collaborative'
'/demande-mobilité'
].includes(label)
)
@ -156,13 +155,9 @@ async function fetchSimulators(dt) {
const dataIframes = await responseIframes.json()
const resultIframes = dataIframes.filter(x =>
[
'/simulateur-embauche',
'/simulateur-autoentrepreneur',
'/simulateur-assimilesalarie',
'/simulateur-artiste-auteur',
'/simulateur-independant',
'/demande-mobilite'
].some(path => x.label.startsWith(path))
'/simulateur-embauche?couleur=',
'/simulateur-autoentrepreneur?couleur='
].includes(x.label)
)
const groupSimulateursIframesVisits = ({ label }) =>
@ -173,15 +168,8 @@ async function fetchSimulators(dt) {
? '/salaire-brut-net'
: label.startsWith('/simulateur-autoentrepreneur')
? '/auto-entrepreneur'
: label.startsWith('/assimilé-salarié') ||
label.startsWith('/simulateur-assimilesalarie')
: label.startsWith('/assimilé-salarié')
? '/dirigeant-sasu'
: label.startsWith('/simulateur-independant')
? '/indépendant'
: label.startsWith('/simulateur-artiste-auteur')
? '/artiste-auteur'
: label.startsWith('/demande-mobilite')
? '/demande-mobilité'
: label
const sumVisits = (acc, { nb_visits }) => acc + nb_visits

View File

@ -16,7 +16,7 @@ export default function MoreInfosOnUs() {
return (
<section
className="ui__ full-width light-bg box-container"
className="ui__ full-width light-bg center-flex"
css={`
margin-top: 3rem;
`}

View File

@ -31,7 +31,6 @@ export default function Notifications() {
engine.evaluate(notification.dottedName).isApplicable
)
)
console.log(notifications.map(n => engine.evaluate(n.dottedName)))
const inversionFail = useInversionFail()
const hiddenNotifications = useSelector(

View File

@ -7,7 +7,7 @@ import classnames from 'classnames'
import Conversation from 'Components/conversation/Conversation'
import SeeAnswersButton from 'Components/conversation/SeeAnswersButton'
import Value from 'Components/EngineValue'
import dirigeantComparaison from '../sites/mon-entreprise.fr/pages/Simulateurs/configs/rémunération-dirigeant.yaml'
import dirigeantComparaison from 'Components/simulationConfigs/rémunération-dirigeant.yaml'
import Engine from 'publicodes'
import revenusSVG from 'Images/revenus.svg'
import {

View File

@ -1,20 +1,24 @@
import { setSimulationConfig } from 'Actions/actions'
import Notifications from 'Components/Notifications'
import Conversation, {
ConversationProps
} from 'Components/conversation/Conversation'
import SeeAnswersButton from 'Components/conversation/SeeAnswersButton'
import PageFeedback from 'Components/Feedback/PageFeedback'
import Notifications from 'Components/Notifications'
import SearchButton from 'Components/SearchButton'
import TargetSelection from 'Components/TargetSelection'
import { useSimulationProgress } from 'Components/utils/useNextQuestion'
import React, { useEffect } from 'react'
import { Trans } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { useLocation } from 'react-router'
import { SimulationConfig } from 'Reducers/rootReducer'
import { firstStepCompletedSelector } from 'Selectors/simulationSelectors'
import * as Animate from 'Components/ui/animate'
import Progress from 'Components/ui/Progress'
import { useSimulationProgress } from 'Components/utils/useNextQuestion'
import React from 'react'
import { Trans } from 'react-i18next'
import { useSelector } from 'react-redux'
import { firstStepCompletedSelector } from 'Selectors/simulationSelectors'
type SimulationProps = {
config: SimulationConfig
explanations?: React.ReactNode
results?: React.ReactNode
customEndMessages?: ConversationProps['customEndMessages']
@ -22,11 +26,17 @@ type SimulationProps = {
}
export default function Simulation({
config,
explanations,
results,
customEndMessages,
showPeriodSwitch
}: SimulationProps) {
const dispatch = useDispatch()
const location = useLocation<{ fromGérer?: boolean }>()
useEffect(() => {
dispatch(setSimulationConfig(config, location.state?.fromGérer))
}, [config])
const firstStepCompleted = useSelector(firstStepCompletedSelector)
return (
<>

View File

@ -5,6 +5,7 @@ import React from 'react'
import { animated, useSpring } from 'react-spring'
import { DottedName } from 'Rules'
import styled from 'styled-components'
import { capitalise0 } from '../utils'
const BarStack = styled.div`
display: flex;

View File

@ -1,47 +0,0 @@
import StackedBarChart from 'Components/StackedBarChart'
import { ThemeColorsContext } from 'Components/utils/colors'
import { EngineContext } from 'Components/utils/EngineContext'
import { default as React, useContext } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import { targetUnitSelector } from 'Selectors/simulationSelectors'
export default function AutoEntrepreneurExplanation() {
const engine = useContext(EngineContext)
const { t } = useTranslation()
const { palettes } = useContext(ThemeColorsContext)
const targetUnit = useSelector(targetUnitSelector)
const impôt = engine.evaluate('impôt', { unit: targetUnit })
return (
<section>
<h2>
<Trans>Répartition du chiffre d'affaires</Trans>
</h2>
<StackedBarChart
data={[
{
...engine.evaluate(
'dirigeant . auto-entrepreneur . net après impôt',
{ unit: targetUnit }
),
title: t("Revenu (incluant les dépenses liées à l'activité)"),
color: palettes[0][0]
},
...(impôt.nodeValue
? [{ ...impôt, title: t('impôt'), color: palettes[1][0] }]
: []),
{
...engine.evaluate(
'dirigeant . auto-entrepreneur . cotisations et contributions',
{ unit: targetUnit }
),
title: t('Cotisations'),
color: palettes[1][1]
}
]}
/>
</section>
)
}

View File

@ -1,34 +0,0 @@
import StackedBarChart from 'Components/StackedBarChart'
import { ThemeColorsContext } from 'Components/utils/colors'
import { EngineContext } from 'Components/utils/EngineContext'
import { default as React, useContext } from 'react'
import { useTranslation } from 'react-i18next'
export default function IndépendantExplanation() {
const engine = useContext(EngineContext)
const { t } = useTranslation()
const { palettes } = useContext(ThemeColorsContext)
return (
<section>
<h2>Répartition de la rémunération totale</h2>
<StackedBarChart
data={[
{
...engine.evaluate('revenu net après impôt'),
title: t('Revenu disponible'),
color: palettes[0][0]
},
{ ...engine.evaluate('impôt'), color: palettes[1][0] },
{
...engine.evaluate(
'dirigeant . indépendant . cotisations et contributions'
),
title: t('Cotisations'),
color: palettes[1][1]
}
]}
/>
</section>
)
}

View File

@ -93,27 +93,30 @@
}
.ui__.card.box {
min-width: 14.333rem;
flex: 0.3;
max-width: 18rem;
max-width: 17rem;
display: flex;
flex-direction: column;
text-align: center;
margin: 0.6rem;
padding: 1rem;
margin: 1rem;
padding-top: 1rem;
padding-bottom: 1rem;
text-decoration: none;
align-items: center;
color: inherit;
font-size: inherit !important;
}
.ui__.card.box .ui__.box-icon > img {
margin: 0.4rem !important;
margin: 0.8rem !important;
transform: scale(1.5) translateY(0.1rem);
}
.ui__.card.box:active .ui__.box-icon > img {
transform: scale(1.5) translateY(0.1rem);
}
.ui__.card.box .ui__.big.box-icon > img {
transform: scale(2.3) translateY(0.2rem);
margin: 0.6rem !important;
}
.ui__.card.box.inverted-colors {
@ -124,49 +127,9 @@
color: #f3f3f3;
}
.ui__.box-container {
display: grid;
justify-items: stretch;
}
.ui__.box-container:not(.full-width) {
margin: 0 -0.6rem;
}
.ui__.small.box-container {
grid-template-columns: repeat(2, 1fr);
}
@media (max-width: 400px) {
@media (max-width: 500px) {
.ui__.card.box {
max-width: 100%;
}
}
@media (min-width: 400px) {
.ui__.small.box-container {
grid-template-columns: repeat(3, 1fr);
}
.ui__.box-container {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 700px) {
.ui__.small.box-container {
grid-template-columns: repeat(4, 1fr);
}
.ui__.box-container {
grid-template-columns: repeat(3, 1fr);
}
}
@media (min-width: 1000px) {
.ui__.full-width.small.box-container {
grid-template-columns: repeat(5, auto);
}
.ui__.full-width.box-container {
--padding: calc((100vw - 1300px) / 2);
grid-template-columns: repeat(4, auto);
padding-right: var(--padding);
padding-left: var(--padding);
justify-content: center;
flex: 1;
}
}

View File

@ -82,11 +82,6 @@ blockquote {
color: #f3f3f3;
}
.ui__.light-border {
border: 4px solid var(--lighterColor);
border-radius: 0.3rem;
}
.ui__.center-flex {
display: flex;
justify-content: center;

View File

@ -3787,18 +3787,6 @@ dirigeant . auto-entrepreneur . net de cotisations:
résumé.fr: Avant impôt
titre.en: Net contribution income
titre.fr: Revenu net de cotisations
dirigeant . auto-entrepreneur . notification valeur annuelle:
description.en: >
[automatic] The ACRE rate used is the one corresponding to the current
month. The
simulator does not yet take into account the overlap of 2 periods
of an acre in a single year.
description.fr: |
Le taux ACRE utilisé est celui correspondant au mois courant. Le
simulateur ne prends pas encore en compte le chevauchement de 2 période
d'acre sur une meme année.
dirigeant . auto-entrepreneur . plafond:
description.en: >
The status of microentrepreneur applies as long as the annual turnover
@ -3954,18 +3942,12 @@ dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . exonération PCV
de cotisation pour la prestation complémentaire de vieillesse (PCV) si vous
en 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
? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . exonération PCV . prix d'une consultation
: titre.en: '[automatic] consulting fee'
titre.fr: prix d'une consultation
dirigeant . indépendant . PL . CARCDSF . retraite complémentaire:
titre.en: '[automatic] supplementary pension (CARCDSF)'
titre.fr: retraite complémentaire (CARCDSF)
? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire
: titre.en: '[automatic] flat-rate contribution'
titre.fr: cotisation forfaitaire
? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation proportionnelle
: titre.en: '[automatic] proportional contribution'
titre.fr: cotisation proportionnelle
? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . réduction de la cotisation forfaitaire
: description.en: >
[automatic] You have the possibility of benefiting from a contribution

View File

@ -17,7 +17,6 @@ Au-dessus de: Above
Aucun résultat: No result$
Auto-entrepreneur: Auto-entrepreneur
Auto-entrepreneur en EIRL: Auto-entrepreneur with EIRL option
Autres outils: Other tools
Avec chômage partiel: With partial unemployment
Calcul: Formula
Cette commune n'existe pas: This commune does not exist
@ -78,7 +77,6 @@ International: International
Intégrer l'interface de simulation: Integrate the simulation interface
Intégrer la bibliothèque de calcul: Integrate the calculation library
Intégrer nos simulateurs: Integrate our simulators
Intégrer un simulateur: Integrating a simulator
J'ai compris: understood
Janvier 2019: January 2019
La somme de: This rule is the sum of
@ -96,7 +94,6 @@ Nous n'avons rien trouvé: We didn't find any matching registered company.
Oui: Yes
Outils pour les développeurs: Tools for developers
Pages associées: Related pages
Par statut: By status
Part du salaire net maintenue: Share of net salary maintained
Part employeur: Employer share
Part salariale: Employee share
@ -112,7 +109,6 @@ Plus d'informations: More information (fr)
Plusieurs associés: Several partners
Prise en charge du revenu net avec chômage partiel: Net income support with short-time working
Prochaines questions: Next questions
Professionnels de santé: Health Care Professionals
Protection sociale: Social security
Précédent: Previous
Prévisualisation: Preview
@ -147,7 +143,6 @@ Salaire: Salary
Salaire net: Net Salary
Salaire net et brut: Net and gross salary
Salarié: Employee
Salariés et employeurs: Employees and employers
Sans responsabilité limitée: Without limited liability
Si: If
Simulateur de salaire: Employee salary simulation
@ -814,13 +809,6 @@ oui: yes
page:
documentation:
title: Documentation
simulateurs:
accueil:
description: <0>All the simulators on this site are :</0><1><0><0>Maintained
up</0> to date with the latest legislative
developments</0><1><0>Continuously improved</0> to increase the number
of devices considered</1><2><0>Easily and freely integrates</0> on any
website. <3>Learn more about</3> it.</2></1>
pages:
common:
ressources-auto-entrepreneur:
@ -910,31 +898,7 @@ pages:
attribute <1>data-lang="en"</1> allows you to choose English as the
simulator language.</3>
module: What module?
gérer:
aide-déclaration-indépendant:
meta:
description: Easily calculate the amount of payroll taxes to report on your 2019
income tax return.
title: 'Self-employed tax return: calculation of the amount of contributions'
shortname: Income tax return assistance
title: Help with your 2019 income tax return
demande-mobilité:
meta:
description: Interactive form to be completed for self-employed persons wishing
to carry out their activity in other European countries
title: 'Self-employed: demand for mobility in Europe'
shortname: Demand for mobility in Europe
simulateurs:
accueil:
header: All the simulators on this site are kept up to date with the latest
legislative developments.
titre: Simulators available
artiste-auteur:
meta:
description: Estimate social contributions on copyright and BNC income
title: 'Artist-author: calculation of URSSAF membership fees'
shortname: Artist-author
title: Estimate my artist/author dues
auto-entrepreneur:
meta:
description: Calculation of your income based on turnover, after deduction of
@ -973,15 +937,7 @@ pages:
account the actual expenses incurred in the activity.</8><9><0></0>
<2>See details of the calculation of the income allowance for an
auto-entrepreneur</2></9><10>Useful resources</10><11><0></0></11>'''
shortname: Auto-entrepreneur
title: Self-entrepreneur Income Simulator
titre: Auto-entrepreneur income simulator
auxiliaire:
shortname: Medical Axiliary
title: Income simulator for a private medical assistant
chirurgien-dentiste:
shortname: Dental surgeon
title: Income simulator for a private dental surgeon
chômage-partiel:
explications seo: >-
[👨 Integrate this simulator on your
@ -1026,45 +982,6 @@ pages:
ogTitle: 'Short-time working simulator: find out the impact on the net salaried
income and the total employer cost.'
titre: Calculation of the short-time working allowance in France
seo: <0>How is the partial activity allowance calculated?</0><1>The basic
partial activity allowance is fixed by law at <2>70% of gross</2>
salary. It is prorated according to the number of hours off work. For an
employee at € 2300 gross monthly, who works 50% of his usual time, this
gives <5>€ 2300 × 50% × 70% = € 805</5>.</1><2>In addition to this basic
allowance, there is a supplementary allowance for salaries close to the
minimum wage. This additional allowance is paid when the combined
remuneration and basic allowance are below a net SMIC. These allowances
are paid by the employer, who will then be reimbursed in part or in full
by the State.</2><3>👉 <2>See the details of the calculation of</2> the
allowance</3><4> How to calculate the part reimbursed by the
State?</4><5>The State covers part of the partial compensation for wages
up to **4.5 SMIC**, with a minimum of €8.03 per unemployed hour. In
concrete terms, this results in 100% coverage for salaries close to the
SMIC. This gradually decreases until it stabilizes at **93%** for wages
<3>between €2,000 and €7,000</3> (wage corresponding to the limit of 4.5
SMIC).</5><6>👉 <2>See details of the calculation of the reimbursement
of the allowance</2></6><7> How to report a partial activity?</7><8>In
response to the coronavirus crisis, the conditions for partial
employment have been eased. The employer is allowed to place his
employees in partial activity before the official application is filed.
The employee then has a period of <2>30 days</2> to comply with the
regulations. Benefits will be paid retroactively from the date of the
partial unemployment.</8><9>👉 <2>Applying for partial unemployment</2>
benefit</9><10> What social security contributions must be paid for the
partial activity allowance?</10><11>The partial activity allowance is
subject to the CSG/CRDS and to a sickness contribution in certain cases.
For more information, see the explanatory page on the <2>URSSAF
website</2>.</11>
shortname: Partial unemployment
title: 'Covid-19: Short-time work simulator'
comparaison:
meta:
description: Self-employed, self-employed or similarly employed? With this
comparison, find the plan that suits you best
title: 'Starting a business: a comparison of social schemes'
shortname: Status Comparison
title: 'Self-employed, assimilated employee or auto-entrepreneur: which plan to
choose?'
dirigean sasu:
explication seo: '<0>How to calculate the salary of a SASU executive? </0><1>As
for a conventional employee, the SASU <1>manager</1> pays social
@ -1084,26 +1001,6 @@ pages:
this, simply enter the announced compensation in the total loaded box.
The simulation can then be refined by answering the various
questions.</4>'
indépendant:
meta:
description: Calculation of net income after tax and contributions based on
turnover and vice versa
title: 'Independent: Urssaf income simulator'
shortname: Independent
title: Income simulator for the self-employed
médecin:
shortname: Doctor
title: Income simulator for private practitioners
profession-libérale:
meta:
description: Net Income Calculation for Self-Employed Persons in Liberal Income
Tax (IR, BNC)
title: 'Liberal professions: the Urssaf simulator'
shortname: Liberal profession
title: Professional Income Simulator
sage-femme:
shortname: Midwife
title: Income simulator for private midwives
salarié:
explication seo: <0>Calculate your net salary</0><1>During the job interview,
the employer usually offers a "gross" remuneration. The announced amount
@ -1142,32 +1039,6 @@ pages:
ogTitle: 'Gross, net, net after-tax salary, total cost: the ultimate simulator
for employees and employers'
titre: 'Gross / net salary: the Urssaf converter'
seo: <0>How is the net salary calculated?</0><1>At the job interview, the
employer usually proposes a "gross" remuneration. The amount announced
thus includes employee contributions, which are used to finance the
employee's social protection and which are deducted from the "net"
salary received by the employee.</1><2>You can use our simulator to
convert the <2>gross salary into net</2> salary. Simply enter the
advertised remuneration in the gross salary box. The simulation can be
refined by answering the various questions (fixed-term contract,
executive status, overtime, part-time, meal vouchers,
etc.).</2><3></3><4>Moreover, since 2019,<1> income tax</1> is deducted
at source. To do this, the Directorate General of Public Finance (DGFiP)
sends the employer the tax rate calculated from the employee's income
tax return. If this rate is unknown, for example in the first year of
employment, the employer uses the <4>neutral rate</4>.</4><5>How to
calculate the cost of hiring?</5><6>If you are looking to hire, you can
calculate the total cost of your employee's remuneration, as well as the
corresponding employer and employee contribution amounts. This enables
you to define the remuneration level by knowing the overall amount of
expense this represents for your company.</6><7>In addition to the
salary, our simulator takes into account the calculation of benefits in
kind (telephone, company car, etc.), as well as the compulsory health
insurance.</7><8>There are <2>deferred</2> hiring <2>aids</2> which are
not all taken into account by our simulator, you can find them on <6>the
official portal</6>.</8>
shortname: Employee
title: Employee income simulator
titre: Income simulator for employees
sasu:
meta:
@ -1176,31 +1047,7 @@ pages:
net income after tax from the total allocated to your compensation.
ogTitle: 'SASU executive compensation: a simulator to find out your net salary'
titre: 'Head of SASU: Urssaf revenue simulator'
seo-explanation: '<0>How to calculate the salary of a SASU executive? </0><1>As
for a classic employee, the SASU <2>manager</2> pays social security
contributions on the remuneration he pays himself. The contributions are
calculated in the same way as for the employee: they are broken down
into the employer and employee parts and are expressed as a percentage
of the gross salary.</1><2>The assimilated manager-employee does not pay
<2>unemployment contributions</2>. Furthermore, they do not benefit from
the <5>general reduction</5> in contributions or from the provisions of
the French Labour Code, such as <9>overtime</9> or
bonuses.</2><3>However, the employee is entitled to the <2>ACRE
reduction</2> at the start of employment, under certain
conditions.</3><4>You can use our simulator to calculate the <2>net
remuneration</2> from a super-gross amount allocated to the executive''s
remuneration. To do this, simply enter the total amount allocated in the
"total charged" box. The simulation can then be refined by answering
the various questions.</4>'
shortname: Head of SASU
title: Income simulator for SASU manager
titre: Revenue simulator for SAS(U) executive
économie-collaborative:
meta:
description: Airbnb, Drivy, Blablacar, Leboncoin... Find out how to be in order
in your declarations
title: 'Online platform income tax return: interactive guide'
shortname: Collaborative Economy Guide
par: per
payslip:
disclaimer: It takes into account national law but not union negotiated rules.
@ -1275,6 +1122,85 @@ selectionRégime:
page:
titre: Social scheme selection
titre: Which social scheme would you like to explore?
simulateurs:
accueil:
description: >-
<0>All the simulators on this site are:</0>
<1><0>Maintained with the latest legislation</0> <1>Continuously improved to increase the number of devices taken into account</1> <2>Developed in partnership with the Urssaf (the contribution collector entity in France)<2> </1>
titre: Available simulators
artiste-auteur:
titre: Estimate my artist/author contributions
assimilé-salarié:
explications: The equal or minority directors of SARL or the directors of SA and
SAS are considered as "assimilé salarié" and are subject to the general
regime. Consequently, the director has the same social protection as an
employee, apart from unemployment coverage.
page:
description: Estimate your income as a SASU or SAS director based on your
turnover. All contributions and income tax are taken into account.
Official URSSAF simulator
titre: Official salary simulator for SASU and SAS directors
titre: SAS and SASU directors income simulator
auto-entrepreneur:
page:
description: Estimate your income as an auto-entrepreneur based on your
turnover. All contributions and income tax are taken into account.
Official URSSAF simulator.
titre: Official income simulator for auto-entrepreneur
titre: Auto-entrepreneur income simulator
indépendant:
explication1: Our estimate takes into account the <1>actual contributions</1>
due by the self-employed person. During the first year of his activity, he
will pay a reduced flat rate (a sum of around 1300€ / year for a craftsman
benefiting from ACRE)... but it will be regularized the following year
according to this real amount.
explication2: Unemployment and occupational accident insurance are not covered
by the Social Security for the self-employed. Retirement based on
professional income is generally lower. To be covered, the professional
may take out additional insurance.
page:
description: Estimate your income as a self-employed person based on your
turnover (for EI, EURL and SARL majority directors). All contributions
and income tax are taken into account. Official URSSAF simulator
titre: Official income simulator for self-employed person
titre: Self-employed income simulator
inversionFail: |
The amount entered results in an impossible result. This is due to a
threshold effect in the calculation of contributions.
We invite you to try again by slightly modifying the amount entered (a few euros more for example).
profession-libérale:
page:
description: simulators.profession-liberal.page.description
titre: simulators.profession-liberal.page.title
titre: Income simulator for {professionName}.
précision:
bonne: Good accuracy
défaut: 'Refine the simulation by answering the following questions:'
faible: Low accuracy
moyenne: Medium accuracy
résumé:
aide-déclaration-revenu-indep: Easily calculate the amount of payroll taxes to
report on your 2019 income tax return.
artiste-auteur: Estimating the social security contributions of an artist or author
assimilé: |
Calculate the income of an officer of a minority SAS, SASU or SARL
auto: |
Calculate the income (or turnover) of an auto-entrepreneur
chômage-partiel: Simulate the net income paid to the employee, as well as the
total remaining cost to the company if the partial activity is used.
comparaison: >
Simulate the differences between the plans (contributions, retirement,
maternity, illness, etc.)
demande-mobilité: Application form for mobility in Europe for self-employed workers
indépendant: |
Calculate the income of a majority manager of EURL, EI, or SARL
salarié: >
Calculate the net, gross, or total salary of an employee, trainee, or
similar
économie-collaborative: A guide to know how to declare your income from online
platforms (AirBnb, leboncoin, blablacar, etc.).
warning:
artiste-auteur: This estimate is proposed for information only. It is based on
the applicable regulatory elements and the elements that you have entered,
@ -1292,35 +1218,6 @@ selectionRégime:
titre: Before starting...
urssaf: The figures are indicative and do not replace the actual accounts of the
Urssaf, impots.gouv.fr, etc
simulateurs:
inversionFail: >-
The amount entered results in an impossible result. This is due to a
threshold effect in the calculation of contributions.
We invite you to try again by slightly modifying the amount entered (a few euros more for example).
précision:
défaut: 'Refine the simulation by answering the questions:'
warning:
artiste-auteur:
'1': This estimate is provided for information purposes. It is based on the
applicable regulatory elements and the elements that you have entered,
but it does not take into account your entire situation. The actual
amount of your contributions may therefore be different.
'2': This simulator allows you to estimate the amount of your contributions for
the year 2020 based on your projected income.
auto-entrepreneur: ' Self-entrepreneurs cannot deduct their expenses from their
turnover. Therefore, <3>all costs related to the business</3> must be
<3>netted out to obtain the income actually received</3>.'
cfe: The simulator does not include the business property tax (CFE), which is
due from the second year of the fiscal year. Its amount varies greatly
depending on the company's turnover and domiciliation. <2>More
information.</2>
plus: Read the details
sasu: Corporate income tax and dividend management are not yet implemented.
titre: Before we start...
urssaf: The calculations are indicative and are not a substitute for the actual
statements of URSSAF, impots.gouv.fr, or others.
simulation-end:
cta: Know the steps to take
hiring:

View File

@ -311,14 +311,6 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . tau
dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . plafond ACRE:
formule: plafond sécurité sociale temps plein / impôt . abattement . taux inversé
dirigeant . auto-entrepreneur . notification valeur annuelle:
applicable si: entreprise . ACRE
type: notification
description: |
Le taux ACRE utilisé est celui correspondant au mois courant. Le
simulateur ne prends pas encore en compte le chevauchement de 2 période
d'acre sur une meme année.
dirigeant . auto-entrepreneur . impôt:
dirigeant . auto-entrepreneur . impôt . abattement:

View File

@ -317,8 +317,6 @@ dirigeant . indépendant . PL . PAMC:
- conjoint collaborateur
- entreprise . franchise de TVA
- dirigeant . indépendant . revenus étrangers
- dirigeant . indépendant . cotisations et contributions . exonération de cotisations minimales
- dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger
formule: oui
dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée:
@ -663,36 +661,28 @@ dirigeant . indépendant . PL . CARCDSF:
- métier = 'santé . chirurgien-dentiste'
- métier = 'santé . sage-femme'
références:
Site CARMF: http://www.carcdsf.fr
Site CARMF: https://www.carcdsf.fr
dirigeant . indépendant . PL . CARCDSF . retraite complémentaire:
titre: retraite complémentaire (CARCDSF)
remplace: cotisations et contributions . retraite complémentaire
formule:
somme:
- cotisation forfaitaire
- cotisation proportionnelle
- produit:
assiette: 2960.40 €/an
taux: réduction de la cotisation forfaitaire
arrondi: oui
- barème:
assiette: assiette des cotisations
multiplicateur: plafond sécurité sociale temps plein
tranches:
- taux: 0%
plafond: 0.85
- taux: 10.65%
plafond: 5
arrondi: oui
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:
barème:
assiette: assiette des cotisations
multiplicateur: plafond sécurité sociale temps plein
tranches:
- taux: 0%
plafond: 0.85
- taux: 10.65%
plafond: 5
arrondi: oui
dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire:
formule:
produit:
assiette: 2960.40 €/an
taux: réduction de la cotisation forfaitaire
arrondi: oui
Site CARCDSF: www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . réduction de la cotisation forfaitaire:
applicable si: assiette des cotisations < 85% * plafond sécurité sociale temps plein
@ -716,7 +706,7 @@ dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . réduction
formule: assiette des cotisations / (85% * plafond sécurité sociale temps plein)
références:
Site CARCDSF: http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
Site CARCDSF: www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste:
applicable si: métier = 'santé . chirurgien-dentiste'
@ -750,24 +740,22 @@ dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV:
taux: 0.725 %
arrondi: oui
références:
Site CARCDSF: http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
Site CARCDSF: www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . exonération PCV:
type: notification
applicable si: (assiette des cotisations / prix d'une consultation) <= 500 consultation/an
formule: oui
description: >-
Vous avez la possibilité de bénéficier d'une exonération totale de
cotisation pour la prestation complémentaire de vieillesse (PCV) si vous en
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:
dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . exonération PCV . prix d'une consultation:
formule: 23 €/consultation
dirigeant . indépendant . PL . CARCDSF . sage-femme:
applicable si: métier = 'santé . sage-femme'
formule: oui
applicable si: métier = 'PAM . sage-femme'
dirigeant . indépendant . PL . CARCDSF . sage-femme . RID:
titre: invalidité et décès (CARCDSF sage-femme)
@ -790,7 +778,7 @@ dirigeant . indépendant . PL . CARCDSF . sage-femme . RID:
- si: classe = 'C'
alors: 273 €/an
références:
Montant des cotisations: http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
Montant des cotisations: www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
dirigeant . indépendant . PL . CARCDSF . sage-femme . RID . classe:
titre: Classe de cotisation
@ -827,7 +815,7 @@ dirigeant . indépendant . PL . CARCDSF . sage-femme . PCV:
taux: 1 / 3
arrondi: oui
références:
Site CARCDSF: http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
Site CARCDSF: www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations
note: |
Une dispense peut être accordée lorsque les revenus professionnels sont
inférieurs ou égaux à 3120 €.
@ -842,7 +830,6 @@ dirigeant . indépendant . PL . CARCDSF . sage-femme . PCV:
dirigeant . indépendant . PL . CARCDSF . sage-femme . exonération PCV:
type: notification
applicable si: assiette des cotisations <= 3120 €/an
formule: oui
description: >-
Vous avez la possibilité de bénéficier d'une exonération totale de
cotisation pour la prestation complémentaire de vieillesse (PCV) si vous en

View File

@ -53,7 +53,7 @@ const moduleToSitePath = {
}
const simulateurLink = (fr ? process.env.FR_SITE : process.env.EN_SITE).replace(
'${path}',
moduleToSitePath[moduleName] ?? ''
moduleToSitePath[moduleName]
)
links.innerHTML = `
<div style="text-align: center; margin-bottom: 2rem">

View File

@ -452,10 +452,19 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
<h2>
{emoji('🧰')} <Trans>Ressources utiles</Trans>
</h2>
<div className="ui__ box-container">
<div
css={`
display: flex;
margin-right: -1rem;
flex-wrap: wrap;
> * {
flex: 1;
}
`}
>
{isAutoentrepreneur && (
<Link
className="ui__ interactive card small box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={{
pathname: sitePaths.simulateurs['auto-entrepreneur'],
state: { fromCréer: true }
@ -463,16 +472,16 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
>
<Trans i18nKey="entreprise.ressources.simu.autoEntrepreneur">
<p>Simulateur de revenus auto-entrepreneur</p>
<p className="ui__ notice">
<small>
Simuler le montant de vos cotisations sociales et de votre impôt
et estimez votre futur revenu net.
</p>
</small>
</Trans>
</Link>
)}
{['EI', 'EIRL', 'EURL'].includes(statut) && (
<Link
className="ui__ interactive card small box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={{
pathname: sitePaths.simulateurs.indépendant,
state: { fromCréer: true }
@ -480,16 +489,16 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
>
<Trans i18nKey="entreprise.ressources.simu.indépendant">
<p>Simulateur de cotisations indépendant</p>
<p className="ui__ notice">
<small>
Simuler le montant de vos cotisations sociales pour bien
préparer votre business plan.
</p>
</small>
</Trans>
</Link>
)}
{['SAS', 'SASU'].includes(statut) && (
<Link
className="ui__ interactive card small box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={{
pathname: sitePaths.simulateurs.SASU,
state: { fromCréer: true }
@ -497,38 +506,38 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {
>
<Trans i18nKey="entreprise.ressources.simu.assimilé">
<p>Simulateur de rémunération pour dirigeant de SASU</p>
<p className="ui__ notice">
<small>
Simuler le montant de vos cotisations sociales pour bien
préparer votre business plan.
</p>
</small>
</Trans>
</Link>
)}
<Link
className="ui__ interactive card small box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={sitePaths.créer.après}
>
<Trans i18nKey="entreprise.ressources.après">
<p>Après la création</p>
<p className="ui__ notice">
<small>
SIREN, SIRET, code APE, KBis. Un petit glossaire des termes que
vous pourrez (éventuellement) rencontrer après la création.
</p>
</small>
</Trans>
</Link>
{isAutoentrepreneur && <RessourceAutoEntrepreneur />}
{i18n.language === 'fr' && ['EI', 'EIRL', 'EURL'].includes(statut) && (
<a
target="_blank"
className="ui__ interactive card small box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
href="https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Guide-Travailleurs-independants.pdf"
>
<p>Guide Urssaf pour les travailleur indépendant</p>
<p className="ui__ notice">
<p>Guide Urssaf pour les travailleur indépendant 2020</p>
<small>
Des conseils sur comment préparer son projet pour se lancer dans
la création et une présentation détaillée de votre protection
sociale.
</p>
</small>
<br />
<div css="text-align: right">
<small className="ui__ label">PDF</small>
@ -568,31 +577,31 @@ export function RessourceAutoEntrepreneur() {
<>
<Trans i18nKey="pages.common.ressources-auto-entrepreneur.FAQ">
<a
className="ui__ interactive card small box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
href="https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html"
target="_blank"
>
<p>Questions fréquentes</p>
<p className="ui__ notice">
<small>
Une liste exhaustive et maintenue à jour de toutes les questions
fréquentes (et moins fréquentes) que l'on est amené à poser en tant
qu'auto-entrepreneur
</p>
</small>
</a>
</Trans>
{i18n.language === 'fr' && (
<a
className="ui__ interactive card small box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
href={GuideAutoEntrepreneurUrl}
download="guide-devenir-auto-entrepreneur-en-2020"
>
<p>Guide pratique Urssaf</p>
<p className="ui__ notice">
<p>Guide partique Urssaf 2020</p>
<small>
Des conseils pour les auto-entrepreneurs : comment préparer son
projet pour se lancer dans la création et une présentation détaillée
de votre protection sociale.
</p>
</small>
<br />
<div css="text-align: right">
<small className="ui__ label">PDF</small>
</div>
@ -600,15 +609,15 @@ export function RessourceAutoEntrepreneur() {
)}
<Trans i18nKey="pages.common.ressources-auto-entrepreneur.impôt">
<a
className="ui__ interactive card small box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
target="_blank"
href="https://www.impots.gouv.fr/portail/professionnel/je-choisis-le-regime-du-micro-entrepreneur-auto-entrepreneur"
>
<p>Comment déclarer son revenu aux impôts ?</p>
<p className="ui__ notice">
<small>
Les informations officielles de l'administration fiscale concernant
les auto-entrepreneurs et le régime de la micro-entreprise.
</p>
</small>
</a>
</Trans>
</>

View File

@ -66,9 +66,18 @@ export default function Créer() {
<h2>
<Trans>Ressources utiles</Trans>
</h2>
<div className="ui__ box-container">
<div
css={`
display: flex;
margin-right: -1rem;
flex-wrap: wrap;
> * {
flex: 1;
}
`}
>
<Link
className="ui__ interactive card box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={sitePaths.créer.guideStatut.liste}
>
<Trans i18nKey="créer.ressources.listeStatuts">
@ -80,7 +89,7 @@ export default function Créer() {
</Trans>
</Link>
<Link
className="ui__ interactive card box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={{
pathname: sitePaths.simulateurs.comparaison,
state: { fromCréer: true }
@ -96,7 +105,7 @@ export default function Créer() {
</Link>
<Link
className="ui__ interactive card box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={sitePaths.créer['auto-entrepreneur']}
>
<Trans i18nKey="créer.ressources.autoEntrepreneur">

View File

@ -1,16 +1,19 @@
import React, { Suspense, useMemo } from 'react'
import useSimulatorsData from '../Simulateurs/metadata'
import React, { Suspense } from 'react'
const LazyColorPicker = React.lazy(() => import('./ColorPicker'))
export const integrableModuleNames = [
'simulateur-embauche',
'simulateur-autoentrepreneur',
'simulateur-independant',
'simulateur-assimilesalarie',
'simulateur-artiste-auteur',
'simulateur-chomage-partiel'
]
// Intégrations "cachées" (non diffusées)
const privateModuleNames = ['demande-mobilite']
export default function IntegrationTest() {
const simulators = useSimulatorsData()
const integrableModuleNames = useMemo(
() =>
Object.values(simulators)
.map(s => s.iframe)
.filter(Boolean),
[simulators]
)
const [currentModule, setCurrentModule] = React.useState(
integrableModuleNames[0]
)
@ -33,7 +36,7 @@ export default function IntegrationTest() {
<>
<h2>Quel module ?</h2>
<select onChange={event => setCurrentModule(event.target.value)}>
{integrableModuleNames.map(name => (
{[...integrableModuleNames, ...privateModuleNames].map(name => (
<option key={name}>{name}</option>
))}
</select>

View File

@ -24,7 +24,7 @@ import RuleLink from 'Components/RuleLink'
import { formatValue } from 'publicodes'
import Skeleton from 'Components/ui/Skeleton'
export default function AideDéclarationIndépendant() {
export default function() {
const dispatch = useDispatch()
const rules = useContext(EngineContext).getParsedRules()
const company = useSelector(

View File

@ -12,7 +12,7 @@ import formulaire from './formulaire-détachement.yaml'
const LazyEndBlock = React.lazy(() => import('./EndBlock'))
export default function FormulaireMobilitéIndépendant() {
export default function formulaireMobilitéIndépendant() {
const engine = new Engine(formulaire)
return (
<>

View File

@ -81,12 +81,12 @@ export default function SocialSecurity() {
/>
</div>
<>
<section>
<div className="ui__ full-width box-container">
<section className="ui__ full-width light-bg">
<div className="ui__ center-flex">
{company?.statutJuridique === 'EI' &&
!company.isAutoEntrepreneur && (
<Link
className="ui__ interactive card box light-border"
className="ui__ interactive card box"
to={{
pathname: sitePaths.gérer.déclarationIndépendant
}}
@ -108,7 +108,7 @@ export default function SocialSecurity() {
{!!dirigeant && (
<Link
className="ui__ interactive card box light-border"
className="ui__ interactive card box"
to={{
pathname: sitePaths.simulateurs[dirigeant],
state: {
@ -132,7 +132,8 @@ export default function SocialSecurity() {
{dirigeant !== 'auto-entrepreneur' && (
<>
<Link
className="ui__ interactive card box light-border"
className="ui__ interactive card box"
css="width: 100%"
to={{
pathname: sitePaths.simulateurs['chômage-partiel']
}}
@ -145,13 +146,14 @@ export default function SocialSecurity() {
lorsque vous activez le dispositif pour un employé.
</p>
</Trans>
<span className="ui__ label">Covid-19</span>
<div className="ui__ small simple button hide-mobile">
<Trans>Découvrir</Trans>
</div>
<span className="ui__ label">Covid-19</span>
</Link>
<Link
className="ui__ interactive card box light-border"
className="ui__ interactive card box"
css="width: 100%"
to={{
pathname: sitePaths.simulateurs.salarié,
state: {
@ -181,12 +183,21 @@ export default function SocialSecurity() {
{emoji('🧰 ')}
<Trans>Ressources utiles</Trans>
</h2>
<div className="ui__ box-container">
<div
css={`
display: flex;
margin-right: -1rem;
flex-wrap: wrap;
> * {
flex: 1;
}
`}
>
{dirigeant === 'indépendant' &&
i18n.language === 'fr' &&
process.env.HEAD !== 'master' && (
<Link
className="ui__ interactive card box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={sitePaths.gérer.formulaireMobilité}
>
<Trans i18nKey="gérer.ressources.embaucher">
@ -200,7 +211,7 @@ export default function SocialSecurity() {
)}
{!company?.isAutoEntrepreneur && (
<Link
className="ui__ interactive card box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={sitePaths.gérer.embaucher}
>
<Trans i18nKey="gérer.ressources.embaucher">
@ -214,7 +225,7 @@ export default function SocialSecurity() {
)}
{company?.isAutoEntrepreneur && (
<a
className="ui__ interactive card box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
href="https://autoentrepreneur.urssaf.fr"
>
<Trans i18nKey="gérer.ressources.autoEntrepreneur">
@ -229,7 +240,7 @@ export default function SocialSecurity() {
</a>
)}
<Link
className="ui__ interactive card box lighter-bg"
className="ui__ interactive card button-choice lighter-bg"
to={sitePaths.gérer.sécuritéSociale}
>
<Trans i18nKey="gérer.ressources.sécuritéSociale">

View File

@ -0,0 +1,16 @@
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import React, { useContext } from 'react'
import { Helmet } from 'react-helmet'
import { SalarySimulation } from '../Simulateurs/Salarié'
export default function IframeSimulateurEmbauche() {
const sitePaths = useContext(SitePathsContext)
return (
<>
<Helmet>
<link rel="canonical" href={sitePaths.simulateurs.salarié} />
</Helmet>
<SalarySimulation />
</>
)
}

View File

@ -1,41 +1,50 @@
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import React from 'react'
import { Route, Switch } from 'react-router-dom'
import { Route } from 'react-router-dom'
import { inIframe } from '../../../../utils'
import useSimulatorsData from '../Simulateurs/metadata'
import SimulateurPage from '../Simulateurs/Page'
import SimulateurChômagePartiel from '../Simulateurs/ChômagePartiel'
import SimulateurArtisteAuteur from '../Simulateurs/ArtisteAuteur'
import SimulateurAssimiléSalarié from '../Simulateurs/RémunérationSASU'
import SimulateurAutoEntrepreneur from '../Simulateurs/AutoEntrepreneur'
import SimulateurIndépendant from '../Simulateurs/Indépendant'
import DemandeMobilite from '../Gérer/DemandeMobilite'
import IframeFooter from './IframeFooter'
import { Helmet } from 'react-helmet'
import SimulateurEmbauche from './SimulateurEmbauche'
export default function Iframes() {
const simulators = useSimulatorsData()
return (
<IsEmbeddedContext.Provider value={true}>
{/** Open external links in the parent frame.
This behavior can be configured on individual link, eg <a target="_blank" />.
Our own link are handled in-app by the router, and aren't affected by this directive.
*/}
Our own link are handled in-app by the router, and aren't affected by this directive. */}
<base target="_parent" />
<div className="ui__ container">
<Switch>
{Object.values(simulators)
.filter(({ iframe }) => !!iframe)
.map(s => (
<Route
key={s.iframe}
path={`/iframes/${s.iframe}`}
render={() => (
<>
<Helmet>
<link rel="canonical" href={s.path} />
</Helmet>
<SimulateurPage {...s} />
</>
)}
/>
))}
</Switch>
<Route
path="/iframes/simulateur-embauche"
component={SimulateurEmbauche}
/>
<Route
path="/iframes/simulateur-autoentrepreneur"
component={SimulateurAutoEntrepreneur}
/>
<Route
path="/iframes/simulateur-independant"
component={SimulateurIndépendant}
/>
<Route
path="/iframes/simulateur-assimilesalarie"
component={SimulateurAssimiléSalarié}
/>
<Route
path="/iframes/simulateur-artiste-auteur"
component={SimulateurArtisteAuteur}
/>
<Route
path="/iframes/simulateur-chomage-partiel"
component={SimulateurChômagePartiel}
/>
<Route path="/iframes/demande-mobilite" component={DemandeMobilite} />
{inIframe() && <IframeFooter />}
</div>
</IsEmbeddedContext.Provider>

View File

@ -1,3 +1,4 @@
.landing-title {
margin-bottom: 1rem;
display: flex;
@ -7,9 +8,9 @@
.landing-title__img {
align-self: flex-end;
margin-top: 2rem;
max-width: 19.5rem;
margin-left: 1.5rem;
margin-bottom: -3.5rem;
max-width: 18rem;
margin-left: 1rem;
margin-bottom: -2rem;
}
@media (min-width: 500px) {
.landing-title__logo {
@ -19,8 +20,10 @@
@media (max-width: 900px) {
.landing-title__img {
margin: 0;
margin-bottom: -3.5rem;
margin-top: 2rem;
margin-right: -5rem;
margin-left: -1rem;
max-height: 25rem;
}
.landing-header__brand-logo {
height: 4rem;

View File

@ -17,8 +17,8 @@ export default function Landing() {
)
return (
<>
<div className="app-content ui__ container">
<section className="landing-title">
<div className="app-content">
<section className="ui__ container landing-title">
<img
alt="logo mon-entreprise.fr"
className="landing-title__logo"
@ -40,9 +40,9 @@ export default function Landing() {
<img src={illustrationSvg} className="landing-title__img" />
</section>
<section className="ui__ full-width box-container">
<section className="ui__ full-width light-bg center-flex">
<Link
className="ui__ interactive card light-border box"
className="ui__ interactive card box"
to={
statutChoisi
? sitePaths.créer[statutChoisi]
@ -66,7 +66,7 @@ export default function Landing() {
</div>
</Link>
<Link
className="ui__ interactive card light-border box "
className="ui__ interactive card box "
to={sitePaths.gérer.index}
>
<div className="ui__ big box-icon">{emoji('💶')}</div>
@ -82,7 +82,7 @@ export default function Landing() {
</div>
</Link>
<Link
className="ui__ interactive card light-border box"
className="ui__ interactive card box"
to={sitePaths.simulateurs.index}
>
<div className="ui__ big box-icon">{emoji('🧮')}</div>
@ -98,7 +98,7 @@ export default function Landing() {
</div>
</Link>
</section>
<section>
<section className="ui__ container">
<Trans i18nKey="landing.aboutUs">
<h2>Qui sommes-nous ?</h2>
<p>

View File

@ -1,18 +1,20 @@
import { setSimulationConfig, updateSituation } from 'Actions/actions'
import RuleInput from 'Components/conversation/RuleInput'
import { DistributionBranch } from 'Components/Distribution'
import Value, { Condition } from 'Components/EngineValue'
import { Condition } from 'Components/EngineValue'
import SimulateurWarning from 'Components/SimulateurWarning'
import config from 'Components/simulationConfigs/artiste-auteur.yaml'
import 'Components/TargetSelection.css'
import Animate from 'Components/ui/animate'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import { EngineContext, useEvaluation } from 'Components/utils/EngineContext'
import Value from 'Components/EngineValue'
import RuleInput from 'Components/conversation/RuleInput'
import React, { createContext, useContext, useEffect, useState } from 'react'
import { Trans } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { DottedName } from 'Rules'
import { situationSelector } from 'Selectors/simulationSelectors'
import styled from 'styled-components'
import config from './configs/artiste-auteur.yaml'
import Animate from 'Components/ui/animate'
const InitialRenderContext = createContext(false)
function useInitialRender() {
@ -29,9 +31,17 @@ export default function ArtisteAuteur() {
dispatch(setSimulationConfig(config))
}, [])
const initialRender = useInitialRender()
const inIframe = useContext(IsEmbeddedContext)
return (
<>
{!inIframe && (
<h1>
<Trans i18nKey="simulateurs.artiste-auteur.titre">
Estimer mes cotisations dartiste-auteur
</Trans>
</h1>
)}
<SimulateurWarning simulateur="artiste-auteur" />
<section className="ui__ light card">
<div id="targetSelection">

View File

@ -0,0 +1,172 @@
import Warning from 'Components/SimulateurWarning'
import Simulation from 'Components/Simulation'
import autoEntrepreneurConfig from 'Components/simulationConfigs/auto-entrepreneur.yaml'
import StackedBarChart from 'Components/StackedBarChart'
import { ThemeColorsContext } from 'Components/utils/colors'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import { EngineContext } from 'Components/utils/EngineContext'
import Meta from 'Components/utils/Meta'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { default as React, useContext } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import { targetUnitSelector } from 'Selectors/simulationSelectors'
import AutoEntrepreneurPreview from './images/AutoEntrepreneurPreview.png'
import Emoji from 'Components/utils/Emoji'
import { RessourceAutoEntrepreneur } from '../Créer/CreationChecklist'
import RuleLink from 'Components/RuleLink'
export default function AutoEntrepreneur() {
const inIframe = useContext(IsEmbeddedContext)
const { t, i18n } = useTranslation()
const META = {
title: t(
'pages.simulateurs.auto-entrepreneur.meta.titre',
'Auto-entrepreneurs : simulateur de revenus'
),
description: t(
'pages.simulateurs.auto-entrepreneur.meta.description',
"Calcul de votre revenu à partir du chiffre d'affaires, après déduction des cotisations et de l'impôt sur le revenu."
),
ogTitle: t(
'pages.simulateurs.auto-entrepreneur.meta.ogTitle',
'Auto-entrepreneur : calculez rapidement votre revenu net à partir du CA et vice-versa'
),
ogDescription: t(
'pages.simulateurs.auto-entrepreneur.meta.ogDescription',
"Grâce au simulateur de revenu auto-entrepreneur développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaire mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu."
),
...(i18n.language === 'fr' && { ogImage: AutoEntrepreneurPreview })
}
const isEmbedded = React.useContext(IsEmbeddedContext)
return (
<>
<Meta {...META} />
{!inIframe && (
<h1>
<Trans i18nKey="pages.simulateurs.auto-entrepreneur.titre">
Simulateur de revenus auto-entrepreneur
</Trans>
</h1>
)}
<Warning simulateur="auto-entrepreneur" />
<Simulation
config={autoEntrepreneurConfig}
explanations={<ExplanationSection />}
/>
{!isEmbedded && <SeoExplanations />}
</>
)
}
function ExplanationSection() {
const engine = useContext(EngineContext)
const { t } = useTranslation()
const { palettes } = useContext(ThemeColorsContext)
const targetUnit = useSelector(targetUnitSelector)
const impôt = engine.evaluate('impôt', { unit: targetUnit })
return (
<section>
<h2>
<Trans>Répartition du chiffre d'affaires</Trans>
</h2>
<StackedBarChart
data={[
{
...engine.evaluate(
'dirigeant . auto-entrepreneur . net après impôt',
{ unit: targetUnit }
),
title: t("Revenu (incluant les dépenses liées à l'activité)"),
color: palettes[0][0]
},
...(impôt.nodeValue
? [{ ...impôt, title: t('impôt'), color: palettes[1][0] }]
: []),
{
...engine.evaluate(
'dirigeant . auto-entrepreneur . cotisations et contributions',
{ unit: targetUnit }
),
title: t('Cotisations'),
color: palettes[1][1]
}
]}
/>
</section>
)
}
function SeoExplanations() {
const sitePaths = useContext(SitePathsContext)
return (
<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 sociales à
l'administration. Ces cotisations servent au financement de la sécurité
sociale, et ouvrent des droits pour la retraite ou pour l'assurance
maladie. Elle 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ère 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 abattu">
Voir le détail du calcul du revenu abattu pour un auto-entrepreneur
</RuleLink>
</p>
<h2>
<Trans>Ressources utiles</Trans>
</h2>
<div style={{ display: 'flex', flexWrap: 'wrap' }}>
<RessourceAutoEntrepreneur />
</div>
</Trans>
)
}

View File

@ -1,15 +1,20 @@
import RuleLink from 'Components/RuleLink'
import Simulation from 'Components/Simulation'
import chomagePartielConfig from 'Components/simulationConfigs/chômage-partiel.yaml'
import Animate from 'Components/ui/animate'
import Warning from 'Components/ui/WarningBlock'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import { useEvaluation } from 'Components/utils/EngineContext'
import { Markdown } from 'Components/utils/markdown'
import { ScrollToTop } from 'Components/utils/Scroll'
import { EvaluatedRule, formatValue } from 'publicodes'
import React, { useContext, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Trans, useTranslation } from 'react-i18next'
import { DottedName } from 'Rules'
import styled from 'styled-components'
import { productionMode } from '../../../../utils'
import ChômagePartielPreview from './images/ChômagePartielPreview.png'
import Meta from 'Components/utils/Meta'
declare global {
interface Window {
@ -32,8 +37,37 @@ export default function ChômagePartiel() {
document.body.removeChild(script)
}
}, [])
const { t, i18n } = useTranslation()
const META = {
title: t(
'pages.simulateurs.chômage-partiel.meta.titre',
"Calcul de l'indemnité chômage partiel : le simulateur Urssaf"
),
description: t(
'pages.simulateurs.chômage-partiel.meta.description',
"Calcul du revenu net pour l'employé et du reste à charge pour l'employeur après remboursement de l'Etat, en prenant en compte toutes les cotisations sociales."
),
ogTitle: t(
'pages.simulateurs.chômage-partiel.meta.ogTitle',
"Simulateur chômage partiel : découvrez l'impact sur le revenu net salarié et le coût total employeur."
),
ogDescription: t(
'pages.simulateurs.chômage-partiel.meta.ogDescription',
"Accédez à une première estimation en saisissant à partir d'un salaire brut. Vous pourrez ensuite personaliser votre situation (temps partiel, convention, etc). Prends en compte la totalité des cotisations, y compris celles spécifiques à l'indemnité (CSG et CRDS)."
),
...(i18n.language === 'fr' && { ogImage: ChômagePartielPreview })
}
return (
<>
<Meta {...META} />
<ScrollToTop />
{!inIframe && (
<Trans i18nKey="coronavirus.description">
<h1>Covid-19 : Simulateur de chômage partiel</h1>
</Trans>
)}
<Warning localStorageKey="covid19">
<ul>
<li>
@ -43,12 +77,14 @@ export default function ChômagePartiel() {
</ul>
</Warning>
<Simulation
config={chomagePartielConfig}
results={<ExplanationSection />}
customEndMessages={
<span className="ui__ notice">Voir les résultats au-dessus</span>
}
showPeriodSwitch={false}
/>
{!inIframe && <TextExplanations />}
</>
)
}
@ -317,3 +353,58 @@ const ResultTable = styled.table`
background: var(--lighterColor);
}
`
function TextExplanations() {
const { t } = useTranslation()
return (
<Markdown
css={`
margin-top: 2rem;
`}
source={t(
'pages.simulateurs.chômage-partiel.explications seo',
`
[👨💻 Intégrer ce simulateur sur votre site](/intégration/iframe?module=simulateur-chomage-partiel)
## Comment calculer l'indemnité d'activité partielle ?
L'indemnité d'activité partielle de base est fixée par la loi à **70% du brut**. 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 **2300 × 50% × 70% = 805 **
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'Etat.
👉 [Voir le détail du calcul de l'indemnité](/documentation/contrat-salarié/activité-partielle/indemnités)
## Comment calculer la part remboursée par l'État ?
L'Etat prend en charge une partie de l'indemnité partielle pour les salaires allant jusqu'à **4,5 SMIC**, avec un minimum à 8,03 par heures chômée.
Concrètement, cela abouti à une prise en charge à **100%** pour les salaires proches du SMIC. Celle-ci diminue progressivement jusqu'à se stabiliser à **93%** pour les salaires compris **entre 2000 et 7000 ** (salaire correspondant à la limite de 4.5 SMIC).
👉 [Voir le détail du calcul du remboursement de l'indemnité](/documentation/contrat-salarié/activité-partielle/indemnisation-entreprise)
## Comment déclarer une activité partielle ?
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 **30 jours** 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.
👉 [Effectuer la demande de chômage partiel](https://www.service-public.fr/professionnels-entreprises/vosdroits/R31001)
## Quelles sont les cotisations sociales à payer pour l'indemnité d'activité partielle ?
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 [le site de l'URSSAF](https://www.urssaf.fr/portail/home/actualites/toute-lactualite-employeur/activite-partielle--nouveau-disp.html).
`
)}
/>
)
}

View File

@ -1,89 +1,164 @@
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import React, { useContext } from 'react'
import emoji from 'react-easy-emoji'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
import classnames from 'classnames'
import simulatorSvg from './images/illustration-simulateur.svg'
import useSimulatorsData, { SimulatorData } from './metadata'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
export function useSimulatorsMetadata() {
const { t } = useTranslation()
const sitePaths = useContext(SitePathsContext)
type SimulatorMetaData = {
name: string
icône: string
description?: string
sitePath: string
label?: string
}
return [
{
name: t('Assimilé salarié'),
icône: '☂️',
description: t(
'simulateurs.résumé.assimilé',
"Calculer le revenu d'un dirigeant de SAS, SASU ou SARL minoritaire"
),
sitePath: sitePaths.simulateurs.SASU
},
{
name: t('Indépendant'),
icône: '👩‍🔧',
description: t(
'simulateurs.résumé.indépendant',
"Calculer le revenu d'un dirigeant de EURL, EI, ou SARL majoritaire"
),
sitePath: sitePaths.simulateurs.indépendant
},
{
name: t('Auto-entrepreneur'),
icône: '🚶‍♂️',
description: t(
'simulateurs.résumé.auto',
"Calculer le revenu (ou le chiffre d'affaires) d'un auto-entrepreneur"
),
sitePath: sitePaths.simulateurs['auto-entrepreneur']
},
{
name: t('Salarié'),
icône: '🤝',
description: t(
'simulateurs.résumé.salarié',
"Calculer le salaire net, brut, ou total d'un salarié, stagiaire, ou assimilé"
),
sitePath: sitePaths.simulateurs.salarié
},
{
name: t('Artiste-auteur'),
icône: '👩‍🎨',
description: t(
'simulateurs.résumé.artiste-auteur',
"Estimer les cotisations sociales d'un artiste ou auteur"
),
sitePath: sitePaths.simulateurs['artiste-auteur']
},
{
name: t('Comparaison statuts'),
icône: '📊',
description: t(
'simulateurs.résumé.comparaison',
'Découvrir les différences entre les régimes (cotisations,retraite, maternité, maladie, etc.)'
),
sitePath: sitePaths.simulateurs.comparaison
},
{
name: t('Économie collaborative'),
description: t(
'simulateurs.résumé.économie-collaborative',
'Un guide pour savoir comment déclarer vos revenus issus de plateformes en ligne (AirBnb, leboncoin, blablacar, etc.)'
),
icône: '🙋',
sitePath: sitePaths.simulateurs.économieCollaborative.index
},
{
name: t('Chômage partiel'),
description: t(
'simulateurs.résumé.chômage-partiel',
"Simuler le revenu net versé au salarié, ainsi que le coût total restant à charge pour l'entreprise en cas de recours à l'activité partielle."
),
icône: '😷',
label: t('Covid 19'),
sitePath: sitePaths.simulateurs['chômage-partiel']
},
{
name: t('Aide à la déclaration de revenu'),
description: t(
'simulateurs.résumé.aide-déclaration-revenu-indep',
'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2019.'
),
icône: '✍️',
label: t('Indépendant'),
sitePath: sitePaths.gérer.déclarationIndépendant
},
{
name: t('Demande de mobilité'),
description: t(
'simulateurs.résumé.demande-mobilité',
'Formulaire de demande de mobilité en Europe pour les travailleurs indépendants'
),
icône: '🧳',
label: t('Indépendant'),
sitePath: sitePaths.gérer.formulaireMobilité
}
] as Array<SimulatorMetaData>
}
export default function Simulateurs() {
const { t } = useTranslation()
const sitePaths = useContext(SitePathsContext)
const simulators = useSimulatorsData()
const titre = t('pages.simulateurs.accueil.titre', 'Simulateurs disponibles')
const simulatorsMetadata = useSimulatorsMetadata()
const titre = t('simulateurs.accueil.titre', 'Simulateurs disponibles')
return (
<>
<Helmet>
<title>{titre}</title>
</Helmet>
<section css="display: flex; align-items: flex-start; justify-content: space-between">
<div>
<h1>{titre}</h1>
<p className="ui__ lead">
<Trans i18nKey="pages.simulateurs.accueil.header">
Tous les simulateurs sur ce site sont maintenus à jour avec les
dernières évolutions législatives.
</Trans>
</p>
</div>
<img
className="ui__ hide-mobile"
src={simulatorSvg}
css="margin-left: 3rem; max-width: 15rem; transform: translateX(2rem) translateY(3rem) scale(1.4);"
/>
</section>
<section>
<h2>
<Trans>Salariés et employeurs</Trans>
</h2>
<div className="ui__ box-container">
<SimulateurCard {...simulators.salarié} />
<SimulateurCard {...simulators['chômage-partiel']} />
</div>
<h2>
<Trans>Par statut</Trans>
</h2>
<div className="ui__ box-container">
<SimulateurCard {...simulators['auto-entrepreneur']} />
<SimulateurCard {...simulators.indépendant} />
<SimulateurCard {...simulators.sasu} />
<SimulateurCard {...simulators['artiste-auteur']} />
{process.env.HEAD !== 'master' && (
<SimulateurCard {...simulators['profession-libérale']} />
<section className="ui__ full-width light-bg">
<h1 css="min-width: 100%; text-align: center">{titre}</h1>
<div
className="ui__ center-flex"
// Il y a actuellement 6 simulateurs affichés, c'est plus beau
// d'afficher une grille de 3x2 sur les écrans larges.
//
// TODO: on pourrait généraliser cette logique sur toutes les grilles
// avec des blocs centrés pour éviter d'avoir 1 seul élements sur la
// dernière ligne.
style={{ maxWidth: 1100, margin: 'auto' }}
>
{simulatorsMetadata.map(
({ name, description, sitePath, icône, label }) => (
<Link
className="ui__ interactive card box"
key={sitePath}
to={{
state: { fromSimulateurs: true },
pathname: sitePath
}}
>
<div className="ui__ big box-icon">{emoji(icône)}</div>
<h3>{name}</h3>
<p className="ui__ notice" css="flex: 1">
{description}
</p>
{label && <span className="ui__ label">{label}</span>}
</Link>
)
)}
</div>
{process.env.HEAD !== 'master' && (
<>
<h3>
<small>
<Trans>Professionnels de santé</Trans> {emoji('🏥')}
</small>
</h3>
<div className="ui__ small box-container">
<SimulateurCard small {...simulators['auxiliaire-médical']} />
<SimulateurCard small {...simulators['chirurgien-dentiste']} />
<SimulateurCard small {...simulators.médecin} />
<SimulateurCard small {...simulators['sage-femme']} />
</div>
</>
)}
<h2>
<Trans>Autres outils</Trans>
</h2>
<div className="ui__ box-container">
<SimulateurCard {...simulators['demande-mobilité']} />
<SimulateurCard {...simulators['comparaison-statuts']} />
<SimulateurCard {...simulators['économie-collaborative']} />
<SimulateurCard {...simulators['aide-déclaration-indépendant']} />
</div>
</section>
<section>
<Trans i18nKey="page.simulateurs.accueil.description">
<Trans i18nKey="simulateurs.accueil.description">
<p>Tous les simulateurs sur ce site sont :</p>
<ul>
<li>
@ -95,9 +170,7 @@ export default function Simulateurs() {
de dispositifs pris en compte
</li>
<li>
<strong>Intégrable facilement et gratuitement</strong> sur
n'importe quel site internet.{' '}
<Link to={sitePaths.integration.iframe}>En savoir plus</Link>.
Développés en <strong>partenariat avec l'Urssaf</strong>
</li>
</ul>
</Trans>
@ -105,34 +178,3 @@ export default function Simulateurs() {
</>
)
}
function SimulateurCard({
small = false,
shortName,
meta,
path,
icône
}: SimulatorData[keyof SimulatorData] & { small?: boolean }) {
return (
<Link
className={classnames('ui__ interactive card box light-border', {
small
})}
key={path}
to={{
state: { fromSimulateurs: true },
pathname: path
}}
>
<div className={classnames('ui__ box-icon', { big: !small })}>
{emoji(icône)}
</div>
{small ? shortName : <h3>{shortName}</h3>}
{!small && meta?.description && (
<p className="ui__ notice" css="flex: 1">
{meta.description}
</p>
)}
</Link>
)
}

View File

@ -0,0 +1,76 @@
import Warning from 'Components/SimulateurWarning'
import Simulation from 'Components/Simulation'
import indépendantConfig from 'Components/simulationConfigs/indépendant.yaml'
import StackedBarChart from 'Components/StackedBarChart'
import { ThemeColorsContext } from 'Components/utils/colors'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import { EngineContext } from 'Components/utils/EngineContext'
import { default as React, useContext } from 'react'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
export default function Indépendant() {
const { t } = useTranslation()
const inIframe = useContext(IsEmbeddedContext)
return (
<>
<Helmet>
<title>
{t(
'simulateurs.indépendant.page.titre',
'Indépendant : simulateur officiel de revenus et de cotisations'
)}
</title>
<meta
name="description"
content={t(
'simulateurs.indépendant.page.description',
"Estimez vos revenus en tant qu'indépendant à partir de votre chiffre d'affaire (pour les EI et les gérants EURL et SARL majoritaires). Prise en compte de toutes les cotisations et de l'impôt sur le revenu. Simulateur officiel de l'Urssaf"
)}
/>
</Helmet>
{!inIframe && (
<h1>
<Trans i18nKey="simulateurs.indépendant.titre">
Simulateur de revenus pour indépendants
</Trans>
</h1>
)}
<Warning simulateur="indépendant" />
<Simulation
config={indépendantConfig}
explanations={<ExplanationSection />}
/>
</>
)
}
function ExplanationSection() {
const engine = useContext(EngineContext)
const { t } = useTranslation()
const { palettes } = useContext(ThemeColorsContext)
return (
<section>
<h2>Répartition de la rémunération totale</h2>
<StackedBarChart
data={[
{
...engine.evaluate('revenu net après impôt'),
title: t('Revenu disponible'),
color: palettes[0][0]
},
{ ...engine.evaluate('impôt'), color: palettes[1][0] },
{
...engine.evaluate(
'dirigeant . indépendant . cotisations et contributions'
),
title: t('Cotisations'),
color: palettes[1][1]
}
]}
/>
</section>
)
}

View File

@ -1,12 +0,0 @@
import SimulateurWarning from 'Components/SimulateurWarning'
import Simulation from 'Components/Simulation'
import IndépendantExplanation from 'Components/simulationExplanation/IndépendantExplanation'
import React from 'react'
export default function IndépendantSimulation() {
return (
<>
<SimulateurWarning simulateur="indépendant" />
<Simulation explanations={<IndépendantExplanation />} />
</>
)
}

View File

@ -1,34 +0,0 @@
import { setSimulationConfig } from 'Actions/actions'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import Meta from 'Components/utils/Meta'
import { default as React, useContext, useEffect } from 'react'
import { useDispatch } from 'react-redux'
import { useLocation } from 'react-router-dom'
import { SimulatorData } from './metadata'
export default function SimulateurPage({
meta,
title,
config,
component: Component,
seoExplanations
}: SimulatorData[keyof SimulatorData]) {
const inIframe = useContext(IsEmbeddedContext)
const dispatch = useDispatch()
const fromGérer = !!useLocation<{ fromGérer?: boolean }>().state?.fromGérer
useEffect(() => {
if (!config) {
return
}
dispatch(setSimulationConfig(config, fromGérer))
}, [config])
return (
<>
{meta && <Meta {...meta} />}
{title && !inIframe && <h1>{title}</h1>}
<Component />
{seoExplanations && !inIframe && seoExplanations}
</>
)
}

View File

@ -0,0 +1,135 @@
import Simulation from 'Components/Simulation'
import professionLibéraleConfig from 'Components/simulationConfigs/profession-libérale.yaml'
import StackedBarChart from 'Components/StackedBarChart'
import { ThemeColorsContext } from 'Components/utils/colors'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import { EngineContext } from 'Components/utils/EngineContext'
import React, { useContext, useEffect } from 'react'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { useHistory, useParams, useRouteMatch } from 'react-router-dom'
import { useDispatch } from 'react-redux'
import { updateSituation } from 'Actions/actions'
import { DottedName } from 'Rules'
import { utils } from 'publicodes'
import { capitalise0 } from '../../../../utils'
// The subsimulator feature allow to customize a simulator page content (title,
// description) and url based on the answer to a multiple-choice question.
// Arguments:
// - `namespace` correspond to the question in the rule set
// - `sitepath` is a React Router path descriptor which must contain a
// `:subsimulator?` argument
function useSubSimulators(
namespace: DottedName,
sitepath: string
): string | undefined {
const engine = useContext(EngineContext)
const history = useHistory()
const dispatch = useDispatch()
const subsimulatorUrlParam = '/:subsimulator?'
if (!sitepath.includes(subsimulatorUrlParam)) {
throw new Error('sitepath must contain the subsimulator param.')
}
const urlState = useRouteMatch<{ subsimulator: string }>({ path: sitepath })
?.params?.subsimulator
const defaultUrl = sitepath.replace(subsimulatorUrlParam, '')
// TODO: ajouter le support de l'attribut "titre" de la règle
const situationState = engine.situation[namespace]?.nodeValue
const encodedSituationState = utils.encodeRuleName(situationState)
const subSimulatorsList = Object.keys(engine.getParsedRules())
.filter(dottedname => dottedname.startsWith(namespace))
.map(dottedname => dottedname.replace(`${namespace} . `, ''))
.map(rulename => utils.encodeRuleName(rulename))
useEffect(() => {
if (urlState && !subSimulatorsList.includes(urlState)) {
history.push(defaultUrl)
} else if (encodedSituationState && encodedSituationState !== urlState) {
history.push(`${defaultUrl}/${encodedSituationState}`)
} else if (urlState && urlState !== encodedSituationState) {
dispatch(updateSituation(namespace, `'${urlState}'`))
}
}, [urlState, encodedSituationState])
if (typeof situationState !== 'string') {
return
}
return situationState
}
export default function ProfessionLibérale() {
const { t } = useTranslation()
const inIframe = useContext(IsEmbeddedContext)
const sitePaths = useContext(SitePathsContext)
const professionName = 'profession libérale'
// useSubSimulators(
// 'dirigeant . indépendant . PL . métier . santé',
// sitePaths.simulateurs['profession-libérale']
// ) ?? 'profession libérale'
return (
<>
<Helmet>
<title>
{t(
'simulateurs.profession-libérale.page.titre',
`${capitalise0(
professionName
)} : simulateur de revenus et de cotisations`
)}
</title>
<meta
name="description"
content={t(
'simulateurs.profession-libérale.page.description',
`Estimez vos revenus en tant que ${professionName} à partir de votre chiffre d'affaire (pour les EI et les gérants EURL et SARL majoritaires). Prise en compte de toutes les cotisations et de l'impôt sur le revenu. Simulateur officiel de l'Urssaf`
)}
/>
</Helmet>
{!inIframe && (
<h1>
<Trans i18nKey="simulateurs.profession-libérale.titre">
Simulateur de revenus pour {professionName}
</Trans>
</h1>
)}
{/* <Warning simulateur="professionnelSanté" /> */}
<Simulation
config={professionLibéraleConfig}
explanations={<ExplanationSection />}
/>
</>
)
}
function ExplanationSection() {
const engine = useContext(EngineContext)
const { t } = useTranslation()
const { palettes } = useContext(ThemeColorsContext)
return (
<section>
<h2>Répartition de la rémunération totale</h2>
<StackedBarChart
data={[
{
...engine.evaluate('revenu net après impôt'),
title: t('Revenu disponible'),
color: palettes[0][0]
},
{ ...engine.evaluate('impôt'), color: palettes[1][0] },
{
...engine.evaluate(
'dirigeant . indépendant . cotisations et contributions'
),
title: t('Cotisations'),
color: palettes[1][1]
}
]}
/>
</section>
)
}

View File

@ -0,0 +1,98 @@
import RuleLink from 'Components/RuleLink'
import SalaryExplanation from 'Components/SalaryExplanation'
import Warning from 'Components/SimulateurWarning'
import Simulation from 'Components/Simulation'
import assimiléConfig from 'Components/simulationConfigs/assimilé.yaml'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import Meta from 'Components/utils/Meta'
import React, { useContext } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import RémunérationSASUPreview from './images/RémunérationSASUPreview.png'
export default function RémunérationSASU() {
const { t } = useTranslation()
const META = {
title: t(
'pages.simulateurs.sasu.meta.titre',
'Dirigeant de SASU : simulateur de revenus Urssaf'
),
description: t(
'pages.simulateurs.sasu.meta.description',
"Calcul du salaire net à partir du chiffre d'affaires + charges et vice-versa."
),
ogTitle: t(
'pages.simulateurs.sasu.meta.ogTitle',
'Rémunération du dirigeant de SASU : un simulateur pour connaître votre salaire net'
),
ogDescription: t(
'pages.simulateurs.sasu.meta.ogDescription',
'En tant que dirigeant assimilé-salarié, calculez immédiatement votre revenu net après impôt à partir du total alloué à votre rémunération.'
),
ogImage: RémunérationSASUPreview
}
const inIframe = useContext(IsEmbeddedContext)
return (
<>
<Meta {...META} />
{!inIframe && (
<h1>
<Trans i18nKey="pages.simulateurs.sasu.titre">
Simulateur de revenus pour dirigeant de SASU
</Trans>
</h1>
)}
<Warning simulateur="SASU" />
<Simulation
config={assimiléConfig}
explanations={<SalaryExplanation />}
/>
{!inIframe && <SeoExplanations />}
</>
)
}
function SeoExplanations() {
return (
<Trans i18nKey="pages.simulateurs.dirigean sasu.explication seo">
<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>
</Trans>
)
}

View File

@ -0,0 +1,168 @@
import Banner from 'Components/Banner'
import PreviousSimulationBanner from 'Components/PreviousSimulationBanner'
import RuleLink from 'Components/RuleLink'
import SalaryExplanation from 'Components/SalaryExplanation'
import Simulation from 'Components/Simulation'
import salariéConfig from 'Components/simulationConfigs/salarié.yaml'
import { IsEmbeddedContext } from 'Components/utils/embeddedContext'
import Meta from 'Components/utils/Meta'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { default as React, useContext } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
import urlIllustrationNetBrutEn from './images/illustration-net-brut-en.png'
import urlIllustrationNetBrut from './images/illustration-net-brut.png'
import salaireBrutNetPreviewEN from './images/SalaireBrutNetPreviewEN.png'
import salaireBrutNetPreviewFR from './images/SalaireBrutNetPreviewFR.png'
export default function Salarié() {
const { t, i18n } = useTranslation()
const META = {
title: t(
'pages.simulateurs.salarié.meta.titre',
'Salaire brut / net : le convertisseur Urssaf'
),
description: t(
'pages.simulateurs.salarié.meta.description',
"Calcul du salaire net, net après impôt et coût total employeur. Beaucoup d'options disponibles (cadre, stage, apprentissage, heures supplémentaires, etc.)"
),
ogTitle: t(
'pages.simulateurs.salarié.meta.ogTitle',
'Salaire brut, net, net après impôt, coût total : le simulateur ultime pour salariés et employeurs'
),
ogDescription: t(
'pages.simulateurs.salarié.meta.ogDescription',
"En tant que salarié, calculez immédiatement votre revenu net après impôt à partir du brut mensuel ou annuel. En tant qu'employé, estimez le coût total d'une embauche à partir du brut. Ce simulateur est développé avec les experts de l'Urssaf, et il adapte les calculs à votre situation (statut cadre, stage, apprentissage, heures supplémentaire, titre-restaurants, mutuelle, temps partiel, convention collective, etc.)"
),
ogImage:
i18n.language === 'fr' ? salaireBrutNetPreviewFR : salaireBrutNetPreviewEN
}
const isEmbedded = React.useContext(IsEmbeddedContext)
return (
<>
<Meta {...META} />
<h1>
<Trans i18nKey="pages.simulateurs.salarié.titre">
Simulateur de revenus pour salarié
</Trans>
</h1>
<div style={{ margin: '2rem' }} />
<SalarySimulation />
{!isEmbedded && <SeoExplanations />}
</>
)
}
function SeoExplanations() {
const { i18n } = useTranslation()
return (
<Trans i18nKey="pages.simulateurs.salarié.explication 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={
i18n.language === 'fr'
? urlIllustrationNetBrut
: urlIllustrationNetBrutEn
}
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 correspondants. 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>
</Trans>
)
}
export const SalarySimulation = () => {
const sitePaths = useContext(SitePathsContext)
return (
<>
<Simulation
config={salariéConfig}
explanations={<SalaryExplanation />}
customEndMessages={
<>
<Trans i18nKey="simulation-end.hiring.text">
Vous pouvez maintenant concrétiser votre projet d'embauche.
</Trans>
<div style={{ textAlign: 'center', margin: '1rem' }}>
<Link
className="ui__ plain button"
to={sitePaths.gérer.embaucher}
>
<Trans i18nKey="simulation-end.cta">
Connaître les démarches
</Trans>
</Link>
</div>
</>
}
/>
<br />
<PreviousSimulationBanner />
<Banner icon={'👨‍✈️'}>
<Trans>
Vous êtes dirigeant d'une SAS(U) ?{' '}
<Link to={sitePaths.simulateurs.SASU}>
Accéder au simulateur de revenu dédié
</Link>
</Trans>
</Banner>
</>
)
}

View File

@ -1,46 +0,0 @@
import Banner from 'Components/Banner'
import PreviousSimulationBanner from 'Components/PreviousSimulationBanner'
import Simulation from 'Components/Simulation'
import SalaryExplanation from 'Components/simulationExplanation/SalaryExplanation'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { default as React, useContext } from 'react'
import { Trans } from 'react-i18next'
import { Link } from 'react-router-dom'
export default function SalariéSimulation() {
const sitePaths = useContext(SitePathsContext)
return (
<>
<Simulation
explanations={<SalaryExplanation />}
customEndMessages={
<>
<Trans i18nKey="simulation-end.hiring.text">
Vous pouvez maintenant concrétiser votre projet d'embauche.
</Trans>
<div style={{ textAlign: 'center', margin: '1rem' }}>
<Link
className="ui__ plain button"
to={sitePaths.gérer.embaucher}
>
<Trans i18nKey="simulation-end.cta">
Connaître les démarches
</Trans>
</Link>
</div>
</>
}
/>
<br />
<PreviousSimulationBanner />
<Banner icon={'👨‍✈️'}>
<Trans>
Vous êtes dirigeant d'une SAS(U) ?{' '}
<Link to={sitePaths.simulateurs.SASU}>
Accéder au simulateur de revenu dédié
</Link>
</Trans>
</Banner>
</>
)
}

View File

@ -1,11 +1,34 @@
import SchemeComparaison from 'Components/SchemeComparaison'
import React from 'react'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
export default function SchemeComparaisonPage() {
const { t } = useTranslation()
return (
<>
<Helmet>
<title>
{t(
'comparaisonRégimes.page.titre',
'Indépendant, assimilé salarié ou auto-entrepreneur : découvrez le régime qui vous correspond le mieux'
)}
</title>
<meta
name="description"
content={t(
'comparaisonRégimes.page.description',
'Quel est le meilleur régime pour votre situation ? Découvrez leur différences et simulez vos revenus et votre retraite en une minute pour chacune des possibilités.'
)}
/>
</Helmet>
<h1>
<Trans i18nKey="comparaisonRégimes.titre">
Indépendant, assimilé salarié ou{' '}
<span style={{ whiteSpace: 'nowrap' }}>auto-entrepreneur</span> : quel
régime choisir ?
</Trans>
</h1>
<p>
<Trans i18nKey="comparaisonRégimes.description">
Lorsque vous créez votre société, le choix du statut juridique va

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 29 KiB

View File

@ -1,12 +1,19 @@
import { usePersistingState } from 'Components/utils/persistState'
import { ScrollToTop } from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { default as React, useContext, useEffect, useMemo } from 'react'
import React, { useContext, useEffect } from 'react'
import { Trans } from 'react-i18next'
import { Link, Route, Switch, useLocation } from 'react-router-dom'
import useSimulatorsData from './metadata'
import SimulateurPage from './Page'
import ArtisteAuteur from './ArtisteAuteur'
import AssimiléSalarié from './RémunérationSASU'
import ChômagePartiel from './ChômagePartiel'
import ProfessionLibérale from './ProfessionLibérale'
import AutoEntrepreneur from './AutoEntrepreneur'
import Home from './Home'
import Indépendant from './Indépendant'
import Salarié from './Salarié'
import SchemeComparaison from './SchemeComparaison'
import ÉconomieCollaborative from './ÉconomieCollaborative'
export default function Simulateurs() {
const sitePaths = useContext(SitePathsContext)
@ -19,20 +26,7 @@ export default function Simulateurs() {
setLastState(state)
}
}, [setLastState, state])
const simulatorsData = useSimulatorsData()
const simulatorRoutes = useMemo(
() =>
Object.values(simulatorsData)
.filter(({ path }) => path.startsWith(sitePaths.simulateurs.index))
.map(s => (
<Route
key={s.path}
path={s.path}
render={() => <SimulateurPage {...s} />}
/>
)),
[simulatorsData, sitePaths]
)
return (
<>
<ScrollToTop key={pathname} />
@ -66,7 +60,36 @@ export default function Simulateurs() {
)}
<Switch>
<Route exact path={sitePaths.simulateurs.index} component={Home} />
{simulatorRoutes}
<Route path={sitePaths.simulateurs.salarié} component={Salarié} />
<Route
path={sitePaths.simulateurs.comparaison}
component={SchemeComparaison}
/>
<Route path={sitePaths.simulateurs.SASU} component={AssimiléSalarié} />
<Route
path={sitePaths.simulateurs.indépendant}
component={Indépendant}
/>
<Route
path={sitePaths.simulateurs['auto-entrepreneur']}
component={AutoEntrepreneur}
/>
<Route
path={sitePaths.simulateurs['artiste-auteur']}
component={ArtisteAuteur}
/>
<Route
path={sitePaths.simulateurs['chômage-partiel']}
component={ChômagePartiel}
/>
<Route
path={sitePaths.simulateurs['profession-libérale']}
component={ProfessionLibérale}
/>
<Route
path={sitePaths.simulateurs.économieCollaborative.index}
component={ÉconomieCollaborative}
/>
</Switch>
</>
)

View File

@ -1,745 +0,0 @@
import RuleLink from 'Components/RuleLink'
import SimulateurWarning from 'Components/SimulateurWarning'
import Simulation from 'Components/Simulation'
import AutoEntrepreneurExplanation from 'Components/simulationExplanation/AutoEntrepreneurExplanation'
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 { Trans, useTranslation } from 'react-i18next'
import { SimulationConfig } from 'Reducers/rootReducer'
import { constructLocalizedSitePath } from '../../sitePaths'
import { RessourceAutoEntrepreneur } from '../Créer/CreationChecklist'
import AideDéclarationIndépendant from '../Gérer/AideDéclarationIndépendant'
import FormulaireMobilitéIndépendant from '../Gérer/DemandeMobilite'
import ArtisteAuteur from './ArtisteAuteur'
import ChômagePartielComponent from './ChômagePartiel'
import autoEntrepreneurConfig from './configs/auto-entrepreneur.yaml'
import chômageParielConfig from './configs/chômage-partiel.yaml'
import sasuConfig from './configs/dirigeant-sasu.yaml'
import indépendantConfig from './configs/indépendant.yaml'
import professionLibéraleConfig from './configs/profession-libérale.yaml'
import salariéConfig from './configs/salarié.yaml'
import AutoEntrepreneurPreview from './images/AutoEntrepreneurPreview.png'
import ChômagePartielPreview from './images/ChômagePartielPreview.png'
import urlIllustrationNetBrutEn from './images/illustration-net-brut-en.png'
import urlIllustrationNetBrut from './images/illustration-net-brut.png'
import RémunérationSASUPreview from './images/RémunérationSASUPreview.png'
import salaireBrutNetPreviewEN from './images/SalaireBrutNetPreviewEN.png'
import salaireBrutNetPreviewFR from './images/SalaireBrutNetPreviewFR.png'
import IndépendantSimulation from './IndépendantSimulation'
import SalariéSimulation from './SalariéSimulation'
import SchemeComparaisonPage from './SchemeComparaison'
import ÉconomieCollaborative from './ÉconomieCollaborative'
const simulateurs = [
'salarié',
'auto-entrepreneur',
'indépendant',
'sasu',
'chômage-partiel',
'artiste-auteur',
'comparaison-statuts',
'économie-collaborative',
'aide-déclaration-indépendant',
'demande-mobilité',
'profession-libérale',
'médecin',
'chirurgien-dentiste',
'sage-femme',
'auxiliaire-médical'
] as const
export type SimulatorData = Record<
typeof simulateurs[number],
{
meta?: {
title: string
description: string
ogTitle?: string
ogDescription?: string
ogImage?: string
}
icône: string
shortName: string
path: string
iframe?: string
title?: string
config?: SimulationConfig
seoExplanations?: React.ReactNode
private?: true
component: () => JSX.Element
}
>
export function getSimulatorsData({
t = (_, text) => text,
sitePaths = constructLocalizedSitePath('fr'),
language = 'fr'
}): SimulatorData {
return {
salarié: {
config: salariéConfig,
component: SalariéSimulation,
icône: '🤝',
title: t(
'pages.simulateurs.salarié.title',
'Simulateur de revenus pour salarié'
),
iframe: 'simulateur-embauche',
meta: {
description: t(
'pages.simulateurs.salarié.meta.description',
"Calcul du salaire net, net après impôt et coût total employeur. Beaucoup d'options disponibles (cadre, stage, apprentissage, heures supplémentaires, etc.)"
),
ogDescription: t(
'pages.simulateurs.salarié.meta.ogDescription',
"En tant que salarié, calculez immédiatement votre revenu net après impôt à partir du brut mensuel ou annuel. En tant qu'employé, estimez le coût total d'une embauche à partir du brut. Ce simulateur est développé avec les experts de l'Urssaf, et il adapte les calculs à votre situation (statut cadre, stage, apprentissage, heures supplémentaire, titre-restaurants, mutuelle, temps partiel, convention collective, etc.)"
),
ogImage:
language === 'fr' ? salaireBrutNetPreviewFR : salaireBrutNetPreviewEN,
ogTitle: t(
'pages.simulateurs.salarié.meta.ogTitle',
'Salaire brut, net, net après impôt, coût total : le simulateur ultime pour salariés et employeurs'
),
title: t(
'pages.simulateurs.salarié.meta.titre',
'Salaire brut / net : le convertisseur Urssaf'
)
},
path: sitePaths.simulateurs.salarié,
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
}
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 correspondants. 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>
</Trans>
)
},
'auto-entrepreneur': {
config: autoEntrepreneurConfig,
icône: '🚶‍♂️',
iframe: 'simulateur-autoentrepreneur',
meta: {
description: t(
'pages.simulateurs.auto-entrepreneur.meta.description',
"Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts"
),
ogDescription: t(
'pages.simulateurs.auto-entrepreneur.meta.ogDescription',
"Grâce au simulateur de revenu auto-entrepreneur développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaire mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu."
),
ogImage: AutoEntrepreneurPreview,
ogTitle: t(
'pages.simulateurs.auto-entrepreneur.meta.ogTitle',
'Auto-entrepreneur : calculez rapidement votre revenu net à partir du CA et vice-versa'
),
title: t(
'pages.simulateurs.auto-entrepreneur.meta.titre',
'Auto-entrepreneurs : simulateur de revenus'
)
},
component: function AutoEntrepreneurSimulation() {
return (
<>
<SimulateurWarning simulateur="auto-entrepreneur" />
<Simulation explanations={<AutoEntrepreneurExplanation />} />
</>
)
},
path: sitePaths.simulateurs['auto-entrepreneur'],
shortName: t(
'pages.simulateurs.auto-entrepreneur.shortname',
'Auto-entrepreneur'
),
title: t(
'pages.simulateurs.auto-entrepreneur.title',
'Simulateur de revenus auto-entrepreneur'
),
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 sociales à
l'administration. Ces cotisations servent au financement de la
sécurité sociale, et ouvrent des droits pour la retraite ou pour
l'assurance maladie. Elle 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ère
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 abattu">
Voir le détail du calcul du revenu abattu pour un
auto-entrepreneur
</RuleLink>
</p>
<h2>
<Trans>Ressources utiles</Trans>
</h2>
<div style={{ display: 'flex', flexWrap: 'wrap' }}>
<RessourceAutoEntrepreneur />
</div>
</Trans>
)
},
indépendant: {
config: indépendantConfig,
icône: '🏃',
iframe: 'simulateur-independant',
path: sitePaths.simulateurs.indépendant,
shortName: t('pages.simulateurs.indépendant.shortname', 'Indépendant'),
title: t(
'pages.simulateurs.indépendant.title',
'Simulateur de revenus pour indépendant'
),
meta: {
title: t(
'pages.simulateurs.indépendant.meta.title',
'Indépendant : simulateur de revenus Urssaf'
),
description: t(
'pages.simulateurs.indépendant.meta.description',
"Calcul du revenu net après impôt et des cotisations à partir du chiffre d'affaires et inversement"
)
},
component: IndépendantSimulation
},
sasu: {
config: sasuConfig,
icône: '👨‍✈️',
iframe: 'simulateur-assimilesalarie',
meta: {
description: t(
'pages.simulateurs.sasu.meta.description',
'Calcul du salaire net à partir du total alloué à la rémunération et inversement'
),
ogDescription: t(
'pages.simulateurs.sasu.meta.ogDescription',
'En tant que dirigeant assimilé-salarié, calculez immédiatement votre revenu net après impôt à partir du total alloué à votre rémunération.'
),
ogImage: RémunérationSASUPreview,
ogTitle: t(
'pages.simulateurs.sasu.meta.ogTitle',
'Rémunération du dirigeant de SASU : un simulateur pour connaître votre salaire net'
),
title: t(
'pages.simulateurs.sasu.meta.titre',
'Dirigeant de SASU : simulateur de revenus Urssaf'
)
},
path: sitePaths.simulateurs.SASU,
shortName: t('pages.simulateurs.sasu.shortname', 'Dirigeant de SASU'),
title: t(
'pages.simulateurs.sasu.title',
'Simulateur de revenus pour dirigeant de SASU'
),
component: function SasuSimulation() {
return (
<>
<SimulateurWarning simulateur="SASU" />
<Simulation explanations={<SalaryExplanation />} />
</>
)
},
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>
</Trans>
)
},
'artiste-auteur': {
icône: '👩‍🎨',
iframe: 'simulateur-artiste-auteur',
meta: {
title: t(
'pages.simulateurs.artiste-auteur.meta.title',
'Artiste-auteur: calcul des cotisations Urssaf'
),
description: t(
'pages.simulateurs.artiste-auteur.meta.description',
"Estimez les cotisations sociales sur les droits d'auteur et sur le revenu BNC"
),
ogTitle: 'Artiste-auteur : estimez vos cotisations Urssaf',
ogDescription:
"Renseignez vos revenus (droits d'auteur et bnc) et découvrez immédiatement le montant des cotisations que vous aurez à payer sur l'année."
},
path: sitePaths.simulateurs['artiste-auteur'],
title: t(
'pages.simulateurs.artiste-auteur.title',
'Estimer mes cotisations dartiste-auteur'
),
shortName: t(
'pages.simulateurs.artiste-auteur.shortname',
'Artiste-auteur'
),
component: ArtisteAuteur
},
'chômage-partiel': {
component: ChômagePartielComponent,
config: chômageParielConfig,
path: sitePaths.simulateurs['chômage-partiel'],
icône: '😷',
iframe: 'simulateur-chomage-partiel',
meta: {
description: t(
'pages.simulateurs.chômage-partiel.meta.description',
"Calcul du revenu net pour l'employé et du reste à charge pour l'employeur après remboursement de l'Etat, en prenant en compte toutes les cotisations sociales."
),
ogDescription: t(
'pages.simulateurs.chômage-partiel.meta.ogDescription',
"Accédez à une première estimation en saisissant à partir d'un salaire brut. Vous pourrez ensuite personaliser votre situation (temps partiel, convention, etc). Prends en compte la totalité des cotisations, y compris celles spécifiques à l'indemnité (CSG et CRDS)."
),
ogImage: ChômagePartielPreview,
ogTitle: t(
'pages.simulateurs.chômage-partiel.meta.ogTitle',
"Simulateur chômage partiel : découvrez l'impact sur le revenu net salarié et le coût total employeur."
),
title: t(
'pages.simulateurs.chômage-partiel.meta.titre',
"Calcul de l'indemnité chômage partiel : le simulateur Urssaf"
)
},
shortName: t(
'pages.simulateurs.chômage-partiel.shortname',
'Chômage partiel'
),
title: t(
'pages.simulateurs.chômage-partiel.title',
'Covid-19 : Simulateur de chômage partiel'
),
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'Etat.
</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'Etat prend en charge une partie de l'indemnité partielle pour les
salaires allant jusqu'à **4,5 SMIC**, 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 à **93%** 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/actualites/toute-lactualite-employeur/activite-partielle--nouveau-disp.html">
le site de l'URSSAF
</a>
.
</p>
</Trans>
)
},
'comparaison-statuts': {
component: SchemeComparaisonPage,
icône: '📊',
path: sitePaths.simulateurs.comparaison,
title: t(
'pages.simulateurs.comparaison.title',
'Indépendant, assimilé salarié ou auto-entrepreneur : quel régime choisir ?'
),
meta: {
description: t(
'pages.simulateurs.comparaison.meta.description',
'Auto-entrepreneur, indépendant ou assimilé salarié ? Avec ce comparatif, trouvez le régime qui vous correspond le mieux'
),
title: t(
'pages.simulateurs.comparaison.meta.title',
"Création d'entreprise : le comparatif des régimes sociaux"
)
},
shortName: t(
'pages.simulateurs.comparaison.shortname',
'Comparaison des statuts'
)
},
'économie-collaborative': {
component: ÉconomieCollaborative,
meta: {
title: t(
'pages.économie-collaborative.meta.title',
'Déclaration des revenus des plateforme en ligne : guide intéractif'
),
description: t(
'pages.économie-collaborative.meta.description',
'Airbnb, Drivy, Blablacar, Leboncoin... Découvrez comment être en règle dans vos déclarations'
)
},
icône: '🙋',
path: sitePaths.simulateurs.économieCollaborative.index,
shortName: t(
'pages.économie-collaborative.shortname',
'Guide économie collaborative'
)
},
'aide-déclaration-indépendant': {
component: AideDéclarationIndépendant,
icône: '✍️',
meta: {
description: t(
'pages.gérer.aide-déclaration-indépendant.meta.description',
'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2019.'
),
title: t(
'pages.gérer.aide-déclaration-indépendant.meta.title',
'Déclaration de revenus indépendant : calcul du montant des cotisations'
)
},
path: sitePaths.gérer.déclarationIndépendant,
shortName: t(
'pages.gérer.aide-déclaration-indépendant.shortname',
'Aide à la déclaration de revenu'
),
title: t(
'pages.gérer.aide-déclaration-indépendant.title',
"Aide à la déclaration de revenus au titre de l'année 2019"
)
},
'demande-mobilité': {
component: FormulaireMobilitéIndépendant,
icône: '🧳',
meta: {
title: t(
'pages.gérer.demande-mobilité.meta.title',
'Travailleur indépendant : demande de mobilité en Europe'
),
description: t(
'pages.gérer.demande-mobilité.meta.description',
"Formulaire interactif à compléter pour les indépendants souhaitant exercer leur activité dans d'autres pays d'Europe"
)
},
path: sitePaths.gérer.formulaireMobilité,
shortName: t(
'pages.gérer.demande-mobilité.shortname',
'Demande de mobilité en Europe'
),
private: true,
iframe: 'demande-mobilité'
},
médecin: {
config: médecinConfig,
private: true,
icône: '⚕️',
iframe: 'médecin',
path: sitePaths.simulateurs['profession-libérale'].médecin,
shortName: t('pages.simulateurs.médecin.shortname', 'Médecin'),
title: t(
'pages.simulateurs.médecin.title',
'Simulateur de revenus pour médecin en libéral'
),
component: IndépendantSimulation
},
'chirurgien-dentiste': {
private: true,
config: dentisteConfig,
icône: '🦷',
iframe: 'chirurgien-dentiste',
path: sitePaths.simulateurs['profession-libérale']['chirurgien-dentiste'],
shortName: t(
'pages.simulateurs.chirurgien-dentiste.shortname',
'Chirurgien-dentiste'
),
title: t(
'pages.simulateurs.chirurgien-dentiste.title',
'Simulateur de revenus pour chirurgien-dentiste en libéral'
),
component: IndépendantSimulation
},
'sage-femme': {
private: true,
config: sageFemmeConfig,
icône: '👶',
iframe: 'sage-femme',
path: sitePaths.simulateurs['profession-libérale']['sage-femme'],
shortName: t('pages.simulateurs.sage-femme.shortname', 'Sage-femme'),
title: t(
'pages.simulateurs.sage-femme.title',
'Simulateur de revenus pour sage-femme en libéral'
),
component: IndépendantSimulation
},
'auxiliaire-médical': {
private: true,
config: auxiliaireConfig,
icône: '🩹',
iframe: 'auxiliaire-médical',
path: sitePaths.simulateurs['profession-libérale'].auxiliaire,
shortName: t(
'pages.simulateurs.auxiliaire.shortname',
'Axiliaire médical'
),
title: t(
'pages.simulateurs.auxiliaire.title',
'Simulateur de revenus pour auxiliaire médical en libéral'
),
component: IndépendantSimulation
},
'profession-libérale': {
private: true,
config: professionLibéraleConfig,
icône: '💻',
meta: {
title: t(
'pages.simulateurs.profession-libérale.meta.title',
'Professions libérale : le simulateur Urssaf'
),
description: t(
'pages.simulateurs.profession-libérale.meta.description',
"Calcul du revenu net pour les indépendants en libéral à l'impôt sur le revenu (IR, BNC)"
)
},
iframe: 'profession-liberale',
path: sitePaths.simulateurs['profession-libérale'].index,
shortName: t(
'pages.simulateurs.profession-libérale.shortname',
'Profession libérale'
),
title: t(
'pages.simulateurs.profession-libérale.title',
'Simulateur de revenus pour profession libérale'
),
component: IndépendantSimulation
}
}
}
export default function useSimulatorsData(): SimulatorData {
const { t, i18n } = useTranslation()
const sitePaths = useContext(SitePathsContext)
return useMemo(
() => getSimulatorsData({ t, sitePaths, language: i18n.language }),
[t, sitePaths, i18n.language]
)
}
professionLibéraleConfig as SimulationConfig
const auxiliaireConfig: SimulationConfig = {
...professionLibéraleConfig,
situation: {
...professionLibéraleConfig.situation,
"entreprise . catégorie d'activité . libérale règlementée": 'oui',
'dirigeant . indépendant . PL . métier': "'santé . auxiliaire médical'"
}
}
const dentisteConfig: SimulationConfig = {
...professionLibéraleConfig,
situation: {
...professionLibéraleConfig.situation,
"entreprise . catégorie d'activité . libérale règlementée": 'oui',
'dirigeant . indépendant . PL . métier': "'santé . chirurgien-dentiste'"
}
}
const médecinConfig: SimulationConfig = {
...professionLibéraleConfig,
situation: {
...professionLibéraleConfig.situation,
"entreprise . catégorie d'activité . libérale règlementée": 'oui',
'dirigeant . indépendant . PL . métier': "'santé . médecin'"
}
}
const sageFemmeConfig: SimulationConfig = {
...professionLibéraleConfig,
situation: {
...professionLibéraleConfig.situation,
"entreprise . catégorie d'activité . libérale règlementée": 'oui',
'dirigeant . indépendant . PL . métier': "'santé . sage-femme'"
}
}

View File

@ -1,14 +1,15 @@
import classnames from 'classnames'
import Animate from 'Components/ui/animate'
import Checkbox from 'Components/ui/Checkbox'
import InfoBulle from 'Components/ui/InfoBulle'
import { ScrollToTop } from 'Components/utils/Scroll'
import { SitePathsContext } from 'Components/utils/SitePathsContext'
import { intersection } from 'ramda'
import React, { useCallback, useContext } from 'react'
import emoji from 'react-easy-emoji'
import { Helmet } from 'react-helmet'
import { Trans, useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
import Animate from 'Components/ui/animate'
import Checkbox from 'Components/ui/Checkbox'
import InfoBulle from 'Components/ui/InfoBulle'
import { debounce } from '../../../../../utils'
import { toggleActivité } from './actions'
import { activités, getTranslatedActivité } from './activitésData'
@ -27,6 +28,9 @@ export default function ActivitésSelection() {
)
return (
<>
<Helmet>
<title>{titre}</title>
</Helmet>
<Animate.fromBottom>
<ScrollToTop />
<h1>{titre}</h1>
@ -146,15 +150,11 @@ export const ActivitéCard = ({
selected,
interactive
}),
style: {
flex: 1,
minWidth: '15rem'
},
key: title,
...(interactive && { tabIndex: -1 }),
onMouseDown: toggle
},
<div css="display: flex; flex-direction: column; height: 100%; width: 100%; align-items: center">
<div css="display: flex; flex-direction: column; height: 100%; width: 100%">
{selected !== undefined && (
<div css="font-size: 1.5rem;">
<Checkbox name={title} id={title} checked={selected} readOnly />

View File

@ -24,7 +24,7 @@ import styled from 'styled-components'
import statsJson from '../../../../data/stats.json'
import { capitalise0 } from '../../../../utils'
import Privacy from '../../layout/Footer/Privacy'
import useSimulatorsData from '../Simulateurs/metadata'
import { useSimulatorsMetadata } from '../Simulateurs/Home'
const stats: StatsData = statsJson as any
@ -78,7 +78,7 @@ export default function Stats() {
'oneMonthAgo'
)
const { palettes } = useContext(ThemeColorsContext)
const simulators = Object.values(useSimulatorsData())
const simulatorsMetadata = useSimulatorsMetadata()
return (
<>
<ScrollToTop />
@ -130,7 +130,9 @@ export default function Stats() {
{stats.simulators[choicesimulators].visites.map(
({ label, nb_visits }) => {
const details = simulators.find(({ path }) => path.includes(label))
const details = simulatorsMetadata.find(({ sitePath }) =>
sitePath.includes(label)
)
if (!details) {
return null
}
@ -140,12 +142,12 @@ export default function Stats() {
value={nb_visits}
title={
<>
{details.shortName}{' '}
{details.name}{' '}
<Link
className="distribution-chart__link_icone"
to={{
state: { fromSimulateurs: true },
pathname: details.path
pathname: details.sitePath
}}
title="Accéder au simulateur"
css="font-size:0.75em"

View File

@ -4,12 +4,12 @@ import {
} from 'Components/utils/colors'
import { ScrollToTop } from 'Components/utils/Scroll'
import urssafLogo from 'Images/urssaf.svg'
import React, { Suspense, useContext, useMemo, useRef, useState } from 'react'
import React, { Suspense, useContext, useRef, useState } from 'react'
import emoji from 'react-easy-emoji'
import { Trans } from 'react-i18next'
import { MemoryRouter, useLocation } from 'react-router-dom'
import { integrableModuleNames } from '../Dev/IntegrationTest'
import Iframes from '../Iframes'
import useSimulatorsData from '../Simulateurs/metadata'
import './iframe.css'
import apecLogo from './images/apec.png'
import cciLogo from './images/cci.png'
@ -20,14 +20,6 @@ const LazyColorPicker = React.lazy(() => import('../Dev/ColorPicker'))
function IntegrationCustomizer() {
const { search } = useLocation()
const simulators = useSimulatorsData()
const integrableModuleNames = useMemo(
() =>
Object.values(simulators)
.filter(s => s.iframe && !s.private)
.map(s => s.iframe),
[simulators]
)
const defaultModuleFromUrl =
new URLSearchParams(search ?? '').get('module') ?? ''
const [currentModule, setCurrentModule] = React.useState(

View File

@ -16,11 +16,16 @@ export default function Integration() {
<ScrollToTop />
{pathname !== sitePaths.integration.index && (
<div className="ui__ card dark-bg" css="text-align: center">
🛠{' '}
<Link className="ui__ simple button" to={sitePaths.integration.index}>
<Trans>Outils pour les développeurs</Trans>
</Link>{' '}
🛠
<h2>
🛠{' '}
<Link
className="ui__ simple button"
to={sitePaths.integration.index}
>
<Trans>Outils pour les développeurs</Trans>
</Link>{' '}
🛠
</h2>
</div>
)}
<Switch>

View File

@ -55,14 +55,8 @@ const sitePathsFr = {
comparaison: '/comparaison-régimes-sociaux',
salarié: '/salaire-brut-net',
'artiste-auteur': '/artiste-auteur',
'profession-libérale': {
index: '/profession-liberale',
médecin: '/medecin',
auxiliaire: '/auxiliaire-médical',
'chirurgien-dentiste': '/chirurgien-dentiste',
'sage-femme': '/sage-femme'
},
'chômage-partiel': '/chômage-partiel',
'profession-libérale': '/profession-libérale/:subsimulator?',
économieCollaborative: {
index: '/économie-collaborative',
votreSituation: '/votre-situation'
@ -113,13 +107,6 @@ const sitePathsEn = {
salarié: '/salary',
'artiste-auteur': '/artist-author',
'chômage-partiel': '/partial-unemployement',
'profession-libérale': {
index: '/liberal-profession',
médecin: '/doctor',
auxiliaire: '/medical-auxiliary',
'chirurgien-dentiste': '/dental-surgeon',
'sage-femme': '/midwife'
},
économieCollaborative: {
index: '/sharing-economy',
votreSituation: '/your-situation'

View File

@ -83,30 +83,15 @@ exports[`calculate simulations-artiste-auteur: salarié 2`] = `"[1603]"`;
exports[`calculate simulations-artiste-auteur: salarié 3`] = `"[12410]"`;
exports[`calculate simulations-auto-entrepreneur: ACRE 1`] = `
"[20686,57,1667,0,20000]
Notifications affichées : dirigeant . auto-entrepreneur . notification valeur annuelle"
`;
exports[`calculate simulations-auto-entrepreneur: ACRE 1`] = `"[20686,57,1667,0,20000]"`;
exports[`calculate simulations-auto-entrepreneur: ACRE 2`] = `
"[33228,269,2500,0,30000]
Notifications affichées : dirigeant . auto-entrepreneur . notification valeur annuelle"
`;
exports[`calculate simulations-auto-entrepreneur: ACRE 2`] = `"[33228,269,2500,0,30000]"`;
exports[`calculate simulations-auto-entrepreneur: ACRE 3`] = `
"[45267,439,3333,0,40000]
Notifications affichées : dirigeant . auto-entrepreneur . notification valeur annuelle"
`;
exports[`calculate simulations-auto-entrepreneur: ACRE 3`] = `"[45267,439,3333,0,40000]"`;
exports[`calculate simulations-auto-entrepreneur: aides 1`] = `
"[5171,14,417,0,5000]
Notifications affichées : dirigeant . auto-entrepreneur . notification valeur annuelle"
`;
exports[`calculate simulations-auto-entrepreneur: aides 1`] = `"[5171,14,417,0,5000]"`;
exports[`calculate simulations-auto-entrepreneur: aides 2`] = `
"[51714,143,4167,0,50000]
Notifications affichées : dirigeant . auto-entrepreneur . notification valeur annuelle"
`;
exports[`calculate simulations-auto-entrepreneur: aides 2`] = `"[51714,143,4167,0,50000]"`;
exports[`calculate simulations-auto-entrepreneur: impôt sur le revenu 1`] = `"[32092,591,2083,706,24294]"`;
@ -289,20 +274,11 @@ exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): é
exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 8`] = `"[4751,0,0,52684,4,46]"`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 1`] = `
"[0,0,806,2046,2,0]
Notifications affichées : dirigeant . auto-entrepreneur . notification valeur annuelle"
`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 1`] = `"[0,0,806,2046,2,0]"`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 2`] = `
"[0,0,1611,4093,3,8]
Notifications affichées : dirigeant . auto-entrepreneur . notification valeur annuelle"
`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 2`] = `"[0,0,1611,4093,3,8]"`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 3`] = `
"[0,0,2337,6139,4,12]
Notifications affichées : dirigeant . auto-entrepreneur . notification valeur annuelle"
`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 3`] = `"[0,0,2337,6139,4,12]"`;
exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 1`] = `"[0,0,2070,8186,4,16]"`;

View File

@ -8,11 +8,11 @@
/* eslint-disable no-undef */
import Engine from 'publicodes'
import rules from '../../source/rules'
import artisteAuteurConfig from '../../source/sites/mon-entreprise.fr/pages/Simulateurs/configs/artiste-auteur.yaml'
import autoentrepreneurConfig from '../../source/sites/mon-entreprise.fr/pages/Simulateurs/configs/auto-entrepreneur.yaml'
import independantConfig from '../../source/sites/mon-entreprise.fr/pages/Simulateurs/configs/indépendant.yaml'
import remunerationDirigeantConfig from '../../source/sites/mon-entreprise.fr/pages/Simulateurs/configs/rémunération-dirigeant.yaml'
import employeeConfig from '../../source/sites/mon-entreprise.fr/pages/Simulateurs/configs/salarié.yaml'
import artisteAuteurConfig from '../../source/components/simulationConfigs/artiste-auteur.yaml'
import autoentrepreneurConfig from '../../source/components/simulationConfigs/auto-entrepreneur.yaml'
import independantConfig from '../../source/components/simulationConfigs/indépendant.yaml'
import remunerationDirigeantConfig from '../../source/components/simulationConfigs/rémunération-dirigeant.yaml'
import employeeConfig from '../../source/components/simulationConfigs/salarié.yaml'
import aideDéclarationConfig from '../../source/sites/mon-entreprise.fr/pages/Gérer/AideDéclarationIndépendant/config.yaml'
import artisteAuteurSituations from './simulations-artiste-auteur.yaml'
import autoEntrepreneurSituations from './simulations-auto-entrepreneur.yaml'