feat: ajoute un onglet mois par mois au simulateur RGCP
parent
e1f0c9c4f7
commit
efa20c9c07
|
@ -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', '24 000 €')
|
||||
})
|
||||
|
||||
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(
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue