feat: ajoute un onglet mois par mois au simulateur RGCP

pull/3197/head
Alice Dahan 2024-10-15 16:12:25 +02:00 committed by liliced
parent e1f0c9c4f7
commit efa20c9c07
4 changed files with 111 additions and 73 deletions

View File

@ -38,15 +38,15 @@ describe('Réduction générale', { testIsolation: false }, function () {
})
it('should allow to change time period', function () {
cy.contains('Montant mensuel').click()
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}2000')
cy.contains('Montant annuel').click()
cy.contains('Réduction annuelle').click()
cy.get(inputSelector).first().should('have.value', '24000 €')
})
it('should display values for the réduction générale', function () {
cy.contains('Montant mensuel').click()
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}1900')
cy.get(
@ -64,7 +64,7 @@ describe('Réduction générale', { testIsolation: false }, function () {
})
it('should display a warning for a salary too high', function () {
cy.contains('Montant mensuel').click()
cy.contains('Réduction mensuelle').click()
cy.get(inputSelector).first().type('{selectall}3000')
cy.get('div[id="simulator-legend"]').should(

View File

@ -274,6 +274,9 @@ Revenu disponible: Disposable income
Revenu du dirigeant par statut: Executive income by status
Revenu net mensuel après impôts: Net monthly income after tax
Règles de calculs: Calculation rules
Réduction annuelle: Annual discount
Réduction mensuelle: Monthly discount
Réduction mois par mois: Monthly discount
Régime d'imposition: Taxation system
Réinitialiser: Reset
Réinitialiser la situation enregistrée: Reset registered situation

View File

@ -290,6 +290,9 @@ Revenu disponible: Revenu disponible
Revenu du dirigeant par statut: Revenu du dirigeant par statut
Revenu net mensuel après impôts: Revenu net mensuel après impôts
Règles de calculs: Règles de calculs
Réduction annuelle: Réduction annuelle
Réduction mensuelle: Réduction mensuelle
Réduction mois par mois: Réduction mois par mois
Régime d'imposition: Régime d'imposition
Réinitialiser: Réinitialiser
Réinitialiser la situation enregistrée: Réinitialiser la situation enregistrée

View File

@ -1,3 +1,4 @@
import { useCallback, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { styled } from 'styled-components'
@ -18,16 +19,37 @@ import { Body } from '@/design-system/typography/paragraphs'
import EffectifSwitch from './components/EffectifSwitch'
export default function RéductionGénéraleSimulation() {
const { t } = useTranslation()
const [monthByMonth, setMonthByMonth] = useState(false)
const periods = [
{
label: t('Réduction mensuelle'),
unit: '€/mois',
},
{
label: t('Réduction annuelle'),
unit: '€/an',
},
{
label: t('Réduction mois par mois'),
unit: '€',
},
]
const onPeriodSwitch = useCallback((unit: string) => {
setMonthByMonth(unit === '€')
}, [])
return (
<>
<Simulation afterQuestionsSlot={<SelectSimulationYear />}>
<SimulateurWarning simulateur="réduction-générale" />
<RéductionGénéraleSimulationGoals
monthByMonth={monthByMonth}
legend="Salaire brut du salarié et réduction générale applicable"
toggles={
<>
<EffectifSwitch />
<PeriodSwitch />
<PeriodSwitch periods={periods} onSwitch={onPeriodSwitch} />
</>
}
/>
@ -45,6 +67,7 @@ const StyledLi = styled(Li)`
}
`
function RéductionGénéraleSimulationGoals({
monthByMonth,
toggles = (
<>
<EffectifSwitch />
@ -53,6 +76,7 @@ function RéductionGénéraleSimulationGoals({
),
legend,
}: {
monthByMonth: boolean
toggles?: React.ReactNode
legend: string
}) {
@ -60,81 +84,89 @@ function RéductionGénéraleSimulationGoals({
return (
<SimulationGoals toggles={toggles} legend={legend}>
{/* TODO: remplacer "salarié . cotisations . assiette" par "salarié . rémunération . brut"
lorsqu'elle n'incluera plus les frais professionnels. */}
<SimulationGoal
dottedName="salarié . cotisations . assiette"
round={false}
label={t('Rémunération brute', 'Rémunération brute')}
/>
{monthByMonth ? (
<div>
Réduction générale mensuelle
</div>
) : (
<>
{/* TODO: remplacer "salarié . cotisations . assiette" par "salarié . rémunération . brut"
lorsqu'elle n'incluera plus les frais professionnels. */}
<SimulationGoal
dottedName="salarié . cotisations . assiette"
round={false}
label={t('Rémunération brute', 'Rémunération brute')}
/>
<Condition expression="salarié . cotisations . exonérations . JEI = oui">
<Message type="info">
<Body>
<Trans>
La réduction générale n'est pas cumulable avec l'exonération Jeune
Entreprise Innovante (JEI).
</Trans>
</Body>
</Message>
</Condition>
<Condition expression="salarié . cotisations . exonérations . JEI = oui">
<Message type="info">
<Body>
<Trans>
La réduction générale n'est pas cumulable avec l'exonération
Jeune Entreprise Innovante (JEI).
</Trans>
</Body>
</Message>
</Condition>
<Condition expression="salarié . contrat = 'stage'">
<Message type="info">
<Body>
<Trans>
La réduction générale ne s'applique pas sur les gratifications de
stage.
</Trans>
</Body>
</Message>
</Condition>
<Condition expression="salarié . contrat = 'stage'">
<Message type="info">
<Body>
<Trans>
La réduction générale ne s'applique pas sur les gratifications
de stage.
</Trans>
</Body>
</Message>
</Condition>
<Condition expression="salarié . cotisations . exonérations . réduction générale = 0">
<Message type="info">
<Body>
<Trans>
La RGCP concerne uniquement les salaires inférieurs à 1,6 SMIC.
C'est-à-dire, pour 2024, une rémunération totale qui ne dépasse
pas <strong>2 827,07 </strong> bruts par mois.
</Trans>
</Body>
</Message>
</Condition>
<Condition expression="salarié . cotisations . exonérations . réduction générale = 0">
<Message type="info">
<Body>
<Trans>
La RGCP concerne uniquement les salaires inférieurs à 1,6
SMIC. C'est-à-dire, pour 2024, une rémunération totale qui ne
dépasse pas <strong>2 827,07 </strong> bruts par mois.
</Trans>
</Body>
</Message>
</Condition>
<Condition expression="salarié . cotisations . exonérations . réduction générale >= 0">
<SimulationValue
dottedName="salarié . cotisations . exonérations . réduction générale"
isInfoMode={true}
round={false}
/>
<Spacing md />
<StyledUl>
<StyledLi>
<Condition expression="salarié . cotisations . exonérations . réduction générale >= 0">
<SimulationValue
dottedName={
'salarié . cotisations . exonérations . réduction générale . part retraite'
}
dottedName="salarié . cotisations . exonérations . réduction générale"
isInfoMode={true}
round={false}
/>
</StyledLi>
<StyledLi>
<SimulationValue
dottedName={
'salarié . cotisations . exonérations . réduction générale . part Urssaf'
}
round={false}
/>
<SimulationValue
dottedName={
'salarié . cotisations . exonérations . réduction générale . part Urssaf . part chômage'
}
round={false}
label={t('dont chômage', 'dont chômage')}
/>
</StyledLi>
</StyledUl>
</Condition>
<Spacing md />
<StyledUl>
<StyledLi>
<SimulationValue
dottedName={
'salarié . cotisations . exonérations . réduction générale . part retraite'
}
round={false}
/>
</StyledLi>
<StyledLi>
<SimulationValue
dottedName={
'salarié . cotisations . exonérations . réduction générale . part Urssaf'
}
round={false}
/>
<SimulationValue
dottedName={
'salarié . cotisations . exonérations . réduction générale . part Urssaf . part chômage'
}
round={false}
label={t('dont chômage', 'dont chômage')}
/>
</StyledLi>
</StyledUl>
</Condition>
</>
)}
</SimulationGoals>
)
}