feat(lodeom): ajout de la sélection de barème

Alice Dahan 2024-12-23 12:23:03 +01:00
parent 8c2f85b6e5
commit c839b189e3
7 changed files with 143 additions and 2 deletions

View File

@ -80,6 +80,32 @@ describe('Simulateur lodeom', { testIsolation: false }, function () {
).should('have.text', '0 €')
})
it('should allow to select a scale', function () {
cy.get('div[aria-label="Barème à appliquer"]')
.contains('Barème de compétitivité renforcée')
.click()
cy.get(
'p[id="salarié___cotisations___exonérations___lodeom___montant-value"]'
).should('include.text', '958,20 €')
cy.get('div[aria-label="Barème à appliquer"]')
.contains("Barème d'innovation et croissance")
.click()
cy.contains('Modifier mes réponses').click()
cy.get('div[data-cy="modal"]')
.eq(0)
.contains("Barème d'innovation et croissance")
.next()
.contains('oui')
cy.get('div[data-cy="modal"]').eq(0).contains('Fermer').click()
cy.get('div[aria-label="Barème à appliquer"]')
.contains('Barème de compétitivité')
.click()
})
it('should display remuneration and Lodeom month by month', function () {
cy.contains('Exonération annuelle').click()
cy.get(inputSelector).first().type('{selectall}36000')

View File

@ -0,0 +1,44 @@
import { useDispatch } from 'react-redux'
import { useEngine } from '@/components/utils/EngineContext'
import { toOuiNon } from '@/domaine/engine/toOuiNon'
import { batchUpdateSituation } from '@/store/actions/actions'
const barèmesPossibles = [
'barème compétitivité',
'barème compétitivité renforcée',
'barème innovation et croissance',
]
type Barème = (typeof barèmesPossibles)[number]
export const useBaremeLodeom = () => {
const dottedName = 'salarié . cotisations . exonérations . lodeom . zone un'
const engine = useEngine()
const dispatch = useDispatch()
let currentBarème
for (let i = 0; i < barèmesPossibles.length; i++) {
const barème = barèmesPossibles[i]
const barèmeValue = engine.evaluate(`${dottedName} . ${barème}`).nodeValue
if (barèmeValue) {
currentBarème = barème
break
}
}
const updateBarème = (newBarème: Barème): void => {
const newSituation = barèmesPossibles.reduce((situation, barème) => {
return {
...situation,
[`${dottedName} . ${barème}`]: toOuiNon(barème === newBarème),
}
}, {})
dispatch(batchUpdateSituation(newSituation))
}
return {
barèmesPossibles,
currentBarème,
updateBarème,
}
}

View File

@ -1447,6 +1447,7 @@ pages:
included in the simulator.</5>
title: Corporate tax simulator
lodeom:
bareme-label: Scale to be applied
legend: Employee's gross salary and applicable Lodeom exemption
meta:
description: Estimated amount of Lodeom exemption. This exemption applies, under

View File

@ -1540,6 +1540,7 @@ pages:
pas intégrés dans le simulateur.</5>
title: Simulateur d'impôt sur les sociétés
lodeom:
bareme-label: Barème à appliquer
legend: Rémunération brute du salarié et exonération Lodeom applicable
meta:
description: Estimation du montant de l'exonération Lodeom. Cette exonération

View File

@ -9,6 +9,7 @@ import SimulateurWarning from '@/components/SimulateurWarning'
import Simulation from '@/components/Simulation'
import { RégularisationMethod } from '@/utils/réductionDeCotisations'
import BarèmeSwitch from './components/BarèmeSwitch'
import LodeomSimulationGoals from './Goals'
export default function LodeomSimulation() {
@ -50,6 +51,7 @@ export default function LodeomSimulation() {
)}
toggles={
<>
<BarèmeSwitch />
<RégularisationSwitch
régularisationMethod={régularisationMethod}
setRégularisationMethod={setRégularisationMethod}

View File

@ -0,0 +1,69 @@
import { DottedName } from 'modele-social'
import { useTranslation } from 'react-i18next'
import { styled } from 'styled-components'
import { ExplicableRule } from '@/components/conversation/Explicable'
import { useEngine } from '@/components/utils/EngineContext'
import { Radio, ToggleGroup } from '@/design-system'
import { FlexCenter } from '@/design-system/global-style'
import { useBaremeLodeom } from '@/hooks/useBaremeLodeom'
export default function BarèmeSwitch() {
const { t } = useTranslation()
const engine = useEngine()
const { barèmesPossibles, currentBarème, updateBarème } = useBaremeLodeom()
return (
<Container>
<StyledToggleGroup
value={currentBarème}
onChange={updateBarème}
aria-label={t(
'pages.simulateurs.lodeom.bareme-label',
'Barème à appliquer'
)}
>
{barèmesPossibles.map((barème, index) => {
const dottedName =
`salarié . cotisations . exonérations . lodeom . zone un . ${barème}` as DottedName
const rule = engine.getRule(dottedName)
return (
<StyledRadio key={index} value={barème}>
{rule.title}
<ExplicableRule
light
dottedName={
`salarié . cotisations . exonérations . lodeom . zone un . ${barème}` as DottedName
}
aria-label={t("Plus d'informations sur {{ title }}", {
title: barème,
})}
/>
</StyledRadio>
)
})}
</StyledToggleGroup>
</Container>
)
}
const Container = styled.div`
${FlexCenter}
flex-wrap: wrap;
justify-content: center;
column-gap: ${({ theme }) => theme.spacings.sm};
`
const StyledToggleGroup = styled(ToggleGroup)`
> * {
display: flex;
flex-direction: column;
text-align: left;
}
`
const StyledRadio = styled(Radio)`
white-space: nowrap;
> span {
width: 100%;
}
`

View File

@ -42,7 +42,5 @@ export const configRéductionGénérale: SimulationConfig = {
'entreprise . catégorie juridique': "''",
'entreprise . imposition': 'non',
'salarié . cotisations . exonérations . lodeom . zone un': "'oui'",
'salarié . cotisations . exonérations . lodeom . zone un . barème compétitivité':
"'oui'",
},
}