From c839b189e3c45564d85d71fe00244713dde60594 Mon Sep 17 00:00:00 2001 From: Alice Dahan Date: Mon, 23 Dec 2024 12:23:03 +0100 Subject: [PATCH] =?UTF-8?q?feat(lodeom):=20ajout=20de=20la=20s=C3=A9lectio?= =?UTF-8?q?n=20de=20bar=C3=A8me?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integration/mon-entreprise/lodeom.ts | 26 +++++++ site/source/hooks/useBaremeLodeom.ts | 44 ++++++++++++ site/source/locales/ui-en.yaml | 1 + site/source/locales/ui-fr.yaml | 1 + .../pages/simulateurs/lodeom/Lodeom.tsx | 2 + .../lodeom/components/BarèmeSwitch.tsx | 69 +++++++++++++++++++ .../simulateurs/lodeom/simulationConfig.ts | 2 - 7 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 site/source/hooks/useBaremeLodeom.ts create mode 100644 site/source/pages/simulateurs/lodeom/components/BarèmeSwitch.tsx diff --git a/site/cypress/integration/mon-entreprise/lodeom.ts b/site/cypress/integration/mon-entreprise/lodeom.ts index 38b5ea061..3969d3b25 100755 --- a/site/cypress/integration/mon-entreprise/lodeom.ts +++ b/site/cypress/integration/mon-entreprise/lodeom.ts @@ -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') diff --git a/site/source/hooks/useBaremeLodeom.ts b/site/source/hooks/useBaremeLodeom.ts new file mode 100644 index 000000000..57dfc1e8f --- /dev/null +++ b/site/source/hooks/useBaremeLodeom.ts @@ -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, + } +} diff --git a/site/source/locales/ui-en.yaml b/site/source/locales/ui-en.yaml index cc1d2b577..ea7a68de2 100644 --- a/site/source/locales/ui-en.yaml +++ b/site/source/locales/ui-en.yaml @@ -1447,6 +1447,7 @@ pages: included in the simulator. 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 diff --git a/site/source/locales/ui-fr.yaml b/site/source/locales/ui-fr.yaml index b4c939eda..ec6c4d893 100644 --- a/site/source/locales/ui-fr.yaml +++ b/site/source/locales/ui-fr.yaml @@ -1540,6 +1540,7 @@ pages: pas intégrés dans le simulateur. 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 diff --git a/site/source/pages/simulateurs/lodeom/Lodeom.tsx b/site/source/pages/simulateurs/lodeom/Lodeom.tsx index 48cba3376..17e8d7124 100644 --- a/site/source/pages/simulateurs/lodeom/Lodeom.tsx +++ b/site/source/pages/simulateurs/lodeom/Lodeom.tsx @@ -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èmesPossibles.map((barème, index) => { + const dottedName = + `salarié . cotisations . exonérations . lodeom . zone un . ${barème}` as DottedName + const rule = engine.getRule(dottedName) + + return ( + + {rule.title} + + + ) + })} + + + ) +} + +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%; + } +` diff --git a/site/source/pages/simulateurs/lodeom/simulationConfig.ts b/site/source/pages/simulateurs/lodeom/simulationConfig.ts index 312a17771..d5352827d 100644 --- a/site/source/pages/simulateurs/lodeom/simulationConfig.ts +++ b/site/source/pages/simulateurs/lodeom/simulationConfig.ts @@ -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'", }, }