Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: Nouveau simulateur Réduction Générale #3100

Merged
merged 15 commits into from
Oct 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 25 additions & 4 deletions modele-social/règles/salarié/cotisations.publicodes
Original file line number Diff line number Diff line change
Expand Up @@ -315,10 +315,11 @@ salarié . cotisations . exonérations . réduction générale:
description: |
Dans le cadre du pacte de responsabilité et de solidarité, le dispositif zéro cotisation Urssaf permet à l'employeur d'un salarié au Smic de ne plus payer aucune cotisation. Le montant de l'allègement est égal au produit de la rémunération annuelle brute par un coefficient. Il n'y a pas de formalité particulière à effectuer.
références:
Simulateur actuel: https://www.declaration.urssaf.fr/calcul/
Fiche service-public.fr: https://entreprendre.service-public.fr/vosdroits/F24542
Fiche Urssaf: https://www.urssaf.fr/accueil/employeur/beneficier-exonerations/reduction-generale-cotisation.html
Simulateur: https://www.declaration.urssaf.fr/calcul/
Cumuls: https://www.legisocial.fr/actualites-sociales/2068-comment-declarer-les-cotisations-dallocations-familiales-si-lentreprise-beneficie-du-regime-jei.html
Bulletin Officiel de la Sécurité Sociale: https://boss.gouv.fr/portail/accueil/exonerations/allegements-generaux.html#titre-chapitre-1--la-reduction-general
produit:
- cotisations . assiette
- coefficient
Expand All @@ -327,15 +328,17 @@ salarié . cotisations . exonérations . réduction générale:

avec:
coefficient:
privé: oui
produit:
- temps de travail . SMIC / cotisations . assiette * 1.6 - 1
- 1.6 * temps de travail . SMIC / cotisations . assiette - 1
- T / 0.6
plancher: 0%
plafond: T
arrondi: 4 décimales
unité: '%'
arrondi: 2 décimales
références:
Code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000048852497
Urssaf.fr: https://www.urssaf.fr/accueil/employeur/beneficier-exonerations/reduction-generale-cotisation.html#ancre-les-trois-etapes-de-calcul
Bulletin Officiel de la Sécurité Sociale: https://boss.gouv.fr/portail/accueil/exonerations/allegements-generaux.html#titre-chapitre-1--la-reduction-general-section-2---determination-du-mon-ii-calcul-du-montant-de-la-reduc-a-formule-de-calcul-de-la-reduct

imputation retraite complémentaire:
privé: oui
Expand All @@ -357,6 +360,23 @@ salarié . cotisations . exonérations . réduction générale:
régimes spécifiques . DFS: non
- 130%

part Urssaf:
produit:
- réduction générale
- T . sécurité sociale et chômage
- 1 / T

avec:
part chômage:
produit:
- réduction générale
- chômage . employeur . taux
- 1 / T

part retraite:
valeur: réduction générale
abattement: part Urssaf

salarié . cotisations . exonérations . T:
privé: oui
titre: Coefficient T
Expand Down Expand Up @@ -388,6 +408,7 @@ salarié . cotisations . assiette:
somme:
- sans prévoyance
- prévoyances . employeur . non déductible socialement
unité: €/mois

avec:
sans prévoyance:
Expand Down
1 change: 1 addition & 0 deletions site/build/prerender.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ export const pagesToPrerender: {
sitePathFr.simulateurs['profession-libérale'].avocat,
sitePathFr.simulateurs['profession-libérale']['chirurgien-dentiste'],
sitePathFr.simulateurs['profession-libérale'].index,
sitePathFr.simulateurs['réduction-générale'],
].map((val) => encodeURI(val)),
infrance: [
sitePathEn.index,
Expand Down
2 changes: 1 addition & 1 deletion site/cypress/integration/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
Les jeux de tests qu'on souhaite faire tourner avec le langage FR et EN doivent aller dans le
sous-dossier `mon-entreprise/english`.

Les autres jeux ne seront testés qu'avent le langage FR.
Les autres jeux ne seront testés qu'avec le langage FR.
89 changes: 89 additions & 0 deletions site/cypress/integration/mon-entreprise/reduction-generale.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { checkA11Y, fr } from '../../support/utils'

describe('Réduction générale', { testIsolation: false }, function () {
if (!fr) {
return
}

const inputSelector = 'div[id="simulator-legend"] input[inputmode="numeric"]'

before(function () {
return cy.visit('/simulateurs/réduction-générale')
})

it('should not crash', function () {
cy.contains('Salaire brut')
})

it('should allow to select a company size', function () {
cy.get(inputSelector).first().type('{selectall}2000')

cy.contains('Plus de 50 salariés').click()
cy.contains('Modifier mes réponses').click()
cy.get('div[data-cy="modal"]')
.eq(0)
.contains('Effectif')
.next()
.contains('100')
cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click()

cy.contains('Moins de 50 salariés').click()
cy.contains('Modifier mes réponses').click()
cy.get('div[data-cy="modal"]')
.eq(0)
.contains('Effectif')
.next()
.contains('10')
cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click()
})

it('should allow to change time period', function () {
cy.contains('Montant mensuel').click()
cy.get(inputSelector).first().type('{selectall}2000')

cy.contains('Montant annuel').click()
cy.get(inputSelector).first().should('have.value', '24 000 €')
})

it('should display values for the réduction générale', function () {
cy.contains('Montant mensuel').click()
cy.get(inputSelector).first().type('{selectall}1900')

cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale-value"]'
).should('include.text', '493,43 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]'
).should('include.text', '92,85 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]'
).should('include.text', '400,58 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]'
).should('include.text', '62,57 €')
})

it('should display a warning for a salary too high', function () {
cy.contains('Montant mensuel').click()
cy.get(inputSelector).first().type('{selectall}3000')

cy.get('div[id="simulator-legend"]').should(
'include.text',
'La RGCP concerne uniquement les salaires inférieurs à 1,6 SMIC.'
)

cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_retraite-value"]'
).should('include.text', '0 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf-value"]'
).should('include.text', '0 €')
cy.get(
'p[id="salarié___cotisations___exonérations___réduction_générale___part_Urssaf___part_chômage-value"]'
).should('include.text', '0 €')
})

it('should be RGAA compliant', function () {
checkA11Y()
})
})
136 changes: 99 additions & 37 deletions site/source/components/SimulateurWarning.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { Trans } from 'react-i18next'
import { styled } from 'styled-components'

import Warning from '@/components/ui/WarningBlock'
import { Spacing } from '@/design-system/layout'
import { Strong } from '@/design-system/typography'
import { Link } from '@/design-system/typography/link'
import { Li, Ul } from '@/design-system/typography/list'
Expand Down Expand Up @@ -58,16 +57,6 @@ export default function SimulateurWarning({
</StyledLi>
</Ul>
)}
{simulateur !== 'artiste-auteur' && simulateur !== 'salarié' && (
<Body>
<Trans i18nKey="simulateurs.warning.urssaf">
Les calculs sont indicatifs. Ils ne se substituent pas aux décomptes
réels de l’Urssaf, de l’administration fiscale ou de toute autre
organisme.
</Trans>
</Body>
)}

{simulateur === 'profession-libérale' && (
<Ul>
<StyledLi>
Expand All @@ -92,23 +81,12 @@ export default function SimulateurWarning({
</Ul>
)}
{simulateur === 'artiste-auteur' && (
<Ul>
<StyledLi>
<Trans i18nKey="simulateurs.warning.artiste-auteur.1">
Cette estimation est proposée à titre indicatif. Elle est faite à
partir des éléments réglementaires applicables et des éléments que
vous avez saisis, mais elle ne tient pas compte de l'ensemble de
votre situation. Le montant réel de vos cotisations peut donc être
différent.
</Trans>
</StyledLi>
<StyledLi>
<Trans i18nKey="simulateurs.warning.artiste-auteur.2">
Ce simulateur permet d'estimer le montant de vos cotisations à
partir de votre revenu projeté
</Trans>
</StyledLi>
</Ul>
<Body>
<Trans i18nKey="simulateurs.warning.artiste-auteur">
Ce simulateur permet d'estimer le montant de vos cotisations à
partir de votre revenu projeté.
</Trans>
</Body>
)}
{simulateur === 'coût-création-entreprise' && (
<Ul>
Expand Down Expand Up @@ -155,15 +133,7 @@ export default function SimulateurWarning({
)}
{simulateur === 'salarié' && (
<Body>
<Trans i18nKey="simulateurs.warning.salarié.1">
<Strong>Cette estimation est proposée à titre indicatif</Strong>.
Elle est faite à partir des éléments que vous avez saisis et des
éléments réglementaires applicables, mais elle ne tient pas compte
de l'ensemble de votre situation.{' '}
<Strong>Les montants réels peuvent donc être différents</Strong>.
</Trans>
<Spacing md />
<Trans i18nKey="simulateurs.warning.salarié.2">
<Trans i18nKey="simulateurs.warning.salarié">
Le simulateur ne prend pour l'instant pas en compte les accords et
conventions collectives, ni la myriade d'aides aux entreprises.
Trouvez votre convention collective{' '}
Expand All @@ -184,6 +154,98 @@ export default function SimulateurWarning({
</Trans>
</Body>
)}
{simulateur === 'chômage-partiel' && (
<Ul>
<StyledLi>
<Trans i18nKey="simulateurs.warning.chômage-partiel.1">
Ce simulateur ne prend pas en compte les rémunérations brutes
définies sur 39h hebdomadaires.
</Trans>
</StyledLi>
<StyledLi>
<Trans i18nKey="simulateurs.warning.chômage-partiel.2">
De même, il ne prend pas en compte les indemnités complémentaire
d'activité partielle prévue par une convention/accord collectif ou
une décision unilatérale de l'employeur.
</Trans>
</StyledLi>
</Ul>
)}
{simulateur === 'is' && (
<Body>
<Trans i18nKey="simulateurs.warning.is">
Ce simulateur s’adresse aux{' '}
<abbr title="Très Petites Entreprises">TPE</abbr> : il prend en
compte les taux réduits de l’impôt sur les sociétés.
</Trans>
</Body>
)}
{simulateur === 'dividendes' && (
<Ul>
<StyledLi>
<Trans i18nKey="simulateurs.warning.dividendes.1">
Cette simulation ne concerne que les sociétés françaises à l’impôt
sur les sociétés (IS), et ne concerne pas les travailleurs
indépendants non salariés.
</Trans>
</StyledLi>
<StyledLi>
<Trans i18nKey="simulateurs.warning.dividendes.2">
Le montant de l'impôt sur les dividendes est calculé en plus de
l’impôt sur les autres revenus imposables.
</Trans>
</StyledLi>
</Ul>
)}
{simulateur === 'réduction-générale' && (
<>
<Body>
<Trans i18nKey="simulateurs.warning.réduction-générale.beta">
<Strong>Ce simulateur est en cours de développement.</Strong> Il
propose uniquement le calcul de la{' '}
<abbr title="Réduction Générale des Cotisations Patronales">
RGCP
</abbr>{' '}
à partir d'une rémunération mensuelle ou annuelle. Pour une
version complète, utilisez{' '}
<Link
aria-label="Simulateur de calcul de la réduction générale des cotisations sur urssaf.fr, nouvelle fenêtre"
href="https://www.declaration.urssaf.fr/calcul/"
>
le simulateur d'urssaf.fr.
</Link>
</Trans>
</Body>
<Ul>
<StyledLi>
<Trans i18nKey="simulateurs.warning.réduction-générale.1">
La rémunération brute inclue : le paiement des heures
supplémentaires et complémentaires, les primes et les indemnités
de CDD.
</Trans>
</StyledLi>
<StyledLi>
<Trans i18nKey="simulateurs.warning.réduction-générale.2">
Ce simulateur n'intègre pas toutes les règles de calcul
spécifiques (Entreprises de Travail Temporaire, salariés des
transports routiers soumis à un horaire d'équivalence). Il ne
tient pas non plus compte des taux et/ou répartition
particuliers de la cotisation de retraite complémentaire
appliqués dans certaines entreprises.
</Trans>
</StyledLi>
</Ul>
</>
)}
<Body>
<Trans i18nKey="simulateurs.warning.general">
<Strong>Les calculs sont indicatifs.</Strong> Ils sont faits à partir
des éléments que vous avez saisis et des éléments réglementaires
applicables, mais ils ne tiennent pas compte de l'ensemble de votre
situation. Ils ne se substituent pas aux décomptes réels de l’Urssaf,
de l'administration fiscale ou de toute autre organisme.
</Trans>
</Body>
</Warning>
)
}
Expand Down
4 changes: 2 additions & 2 deletions site/source/components/Simulation/SimulationGoal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export function SimulationGoal({
id={`${dottedName.replace(/\s|\./g, '_')}-label`}
dottedName={dottedName}
>
{label}
{label || rule.title}
</RuleLink>
)}

Expand Down Expand Up @@ -167,7 +167,7 @@ export function SimulationGoal({
</Grid>
) : (
<Grid item>
<Body>
<Body id={`${dottedName.replace(/\s|\./g, '_')}-value`}>
{formatValue(evaluation, {
displayedUnit,
precision: round ? 0 : 2,
Expand Down
Loading
Loading