feat(lodeom): ajout de la sélection de barème
parent
8c2f85b6e5
commit
c839b189e3
|
@ -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')
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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%;
|
||||
}
|
||||
`
|
|
@ -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'",
|
||||
},
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue