diff --git a/site/source/hooks/useBaremeLodeom.ts b/site/source/hooks/useBaremeLodeom.ts
deleted file mode 100644
index d3c3a764f..000000000
--- a/site/source/hooks/useBaremeLodeom.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-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',
-]
-
-export type Barème = (typeof barèmesPossibles)[number]
-
-type ReturnType = {
- barèmesPossibles: Barème[]
- currentBarème?: Barème
- updateBarème: (barème: Barème) => void
-}
-
-export const useBaremeLodeom = (): ReturnType => {
- 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/hooks/useBarèmeLodeom.ts b/site/source/hooks/useBarèmeLodeom.ts
new file mode 100644
index 000000000..fc122eb15
--- /dev/null
+++ b/site/source/hooks/useBarèmeLodeom.ts
@@ -0,0 +1,77 @@
+import { DottedName } from 'modele-social'
+import { useDispatch } from 'react-redux'
+
+import { useEngine } from '@/components/utils/EngineContext'
+import { toOuiNon } from '@/domaine/engine/toOuiNon'
+import {
+ batchUpdateSituation,
+ deleteFromSituation,
+} from '@/store/actions/actions'
+
+import { useZoneLodeom, ZoneLodeom as Zone } from './useZoneLodeom'
+
+const barèmes = {
+ ['zone un' as Zone]: [
+ 'barème compétitivité',
+ 'barème compétitivité renforcée',
+ 'barème innovation et croissance',
+ ],
+ ['zone deux' as Zone]: [
+ 'barème moins de 11 salariés',
+ 'barème sectoriel',
+ 'barème compétitivité',
+ ],
+}
+
+export type Barème = (typeof barèmes)[Zone][number]
+
+type ReturnType = {
+ barèmes: Barème[]
+ currentBarème?: Barème
+ updateBarème: (barème?: Barème) => void
+}
+
+export const useBarèmeLodeom = (): ReturnType => {
+ const dottedName = 'salarié . cotisations . exonérations . lodeom'
+ const { currentZone } = useZoneLodeom()
+ const engine = useEngine()
+ const dispatch = useDispatch()
+
+ const barèmesPossibles = currentZone ? barèmes[currentZone] : []
+
+ const currentBarème = barèmesPossibles.find((barème) => {
+ const barèmeValue = engine.evaluate(
+ `${dottedName} . ${currentZone} . ${barème}`
+ ).nodeValue
+
+ return !!barèmeValue
+ })
+
+ const updateBarème = (newBarème?: Barème): void => {
+ if (!newBarème) {
+ barèmesPossibles.forEach((barème) => {
+ dispatch(
+ deleteFromSituation(
+ `${dottedName} . ${currentZone} . ${barème}` as DottedName
+ )
+ )
+ })
+ } else {
+ const newSituation = barèmesPossibles.reduce((situation, barème) => {
+ return {
+ ...situation,
+ [`${dottedName} . ${currentZone} . ${barème}`]: toOuiNon(
+ barème === newBarème
+ ),
+ }
+ }, {})
+ dispatch(batchUpdateSituation(newSituation))
+ }
+ }
+
+ return {
+ barèmes: barèmesPossibles,
+ currentBarème,
+ updateBarème,
+ }
+}
diff --git a/site/source/hooks/useZoneLodeom.ts b/site/source/hooks/useZoneLodeom.ts
new file mode 100644
index 000000000..1487a5e82
--- /dev/null
+++ b/site/source/hooks/useZoneLodeom.ts
@@ -0,0 +1,38 @@
+import { useDispatch } from 'react-redux'
+
+import { useEngine } from '@/components/utils/EngineContext'
+import { toOuiNon } from '@/domaine/engine/toOuiNon'
+import { batchUpdateSituation } from '@/store/actions/actions'
+
+const zones = ['zone un', 'zone deux']
+
+export type ZoneLodeom = (typeof zones)[number]
+
+type ReturnType = {
+ currentZone?: ZoneLodeom
+ updateZone: (zone: ZoneLodeom) => void
+}
+
+export const useZoneLodeom = (): ReturnType => {
+ const engine = useEngine()
+ const dispatch = useDispatch()
+ const dottedName = 'salarié . cotisations . exonérations . lodeom'
+
+ const currentZone = zones.find((zone) => {
+ const zoneValue = engine.evaluate(`${dottedName} . ${zone}`).nodeValue
+
+ return !!zoneValue
+ })
+
+ const updateZone = (newZone: ZoneLodeom): void => {
+ const newSituation = zones.reduce((situation, zone) => {
+ return {
+ ...situation,
+ [`${dottedName} . ${zone}`]: toOuiNon(zone === newZone),
+ }
+ }, {})
+ dispatch(batchUpdateSituation(newSituation))
+ }
+
+ return { currentZone, updateZone }
+}
diff --git a/site/source/pages/simulateurs/lodeom/Goals.tsx b/site/source/pages/simulateurs/lodeom/Goals.tsx
index 0a1c3d596..b798584e4 100644
--- a/site/source/pages/simulateurs/lodeom/Goals.tsx
+++ b/site/source/pages/simulateurs/lodeom/Goals.tsx
@@ -7,7 +7,8 @@ import RéductionMoisParMois from '@/components/RéductionDeCotisations/Réducti
import { SimulationGoals } from '@/components/Simulation'
import { useEngine } from '@/components/utils/EngineContext'
import useYear from '@/components/utils/useYear'
-import { Barème, useBaremeLodeom } from '@/hooks/useBaremeLodeom'
+import { Barème, useBarèmeLodeom } from '@/hooks/useBarèmeLodeom'
+import { useZoneLodeom, ZoneLodeom } from '@/hooks/useZoneLodeom'
import { situationSelector } from '@/store/selectors/simulationSelectors'
import {
getDataAfterOptionsChange,
@@ -41,7 +42,8 @@ export default function LodeomSimulationGoals({
const year = useYear()
const situation = useSelector(situationSelector) as SituationType
const previousSituation = useRef(situation)
- const { currentBarème } = useBaremeLodeom()
+ const { currentZone } = useZoneLodeom()
+ const { currentBarème } = useBarèmeLodeom()
const { t } = useTranslation()
const initializeLodeomMoisParMoisData = useCallback(() => {
@@ -102,17 +104,51 @@ export default function LodeomSimulationGoals({
}
const codesByBareme = {
- ['barème compétitivité' as Barème]: {
- réduction: t('pages.simulateurs.lodeom.recap.code.462', 'code 462'),
- régularisation: t('pages.simulateurs.lodeom.recap.code.684', 'code 684'),
+ ['zone un' as ZoneLodeom]: {
+ ['barème compétitivité' as Barème]: {
+ réduction: t('pages.simulateurs.lodeom.recap.code.462', 'code 462'),
+ régularisation: t(
+ 'pages.simulateurs.lodeom.recap.code.684',
+ 'code 684'
+ ),
+ },
+ ['barème compétitivité renforcée' as Barème]: {
+ réduction: t('pages.simulateurs.lodeom.recap.code.463', 'code 463'),
+ régularisation: t(
+ 'pages.simulateurs.lodeom.recap.code.538',
+ 'code 538'
+ ),
+ },
+ ['barème innovation et croissance' as Barème]: {
+ réduction: t('pages.simulateurs.lodeom.recap.code.473', 'code 473'),
+ régularisation: t(
+ 'pages.simulateurs.lodeom.recap.code.685',
+ 'code 685'
+ ),
+ },
},
- ['barème compétitivité renforcée' as Barème]: {
- réduction: t('pages.simulateurs.lodeom.recap.code.463', 'code 463'),
- régularisation: t('pages.simulateurs.lodeom.recap.code.538', 'code 538'),
- },
- ['barème innovation et croissance' as Barème]: {
- réduction: t('pages.simulateurs.lodeom.recap.code.473', 'code 473'),
- régularisation: t('pages.simulateurs.lodeom.recap.code.685', 'code 685'),
+ ['zone deux' as ZoneLodeom]: {
+ ['barème moins de 11 salariés' as Barème]: {
+ réduction: t('pages.simulateurs.lodeom.recap.code.463', 'code 463'),
+ régularisation: t(
+ 'pages.simulateurs.lodeom.recap.code.538',
+ 'code 538'
+ ),
+ },
+ ['barème sectoriel' as Barème]: {
+ réduction: t('pages.simulateurs.lodeom.recap.code.473', 'code 473'),
+ régularisation: t(
+ 'pages.simulateurs.lodeom.recap.code.685',
+ 'code 685'
+ ),
+ },
+ ['barème compétitivité' as Barème]: {
+ réduction: t('pages.simulateurs.lodeom.recap.code.462', 'code 462'),
+ régularisation: t(
+ 'pages.simulateurs.lodeom.recap.code.684',
+ 'code 684'
+ ),
+ },
},
}
@@ -132,10 +168,14 @@ export default function LodeomSimulationGoals({
warningCondition={`${lodeomDottedName} = 0`}
warningTooltip={}
codeRéduction={
- currentBarème && codesByBareme[currentBarème].réduction
+ currentZone &&
+ currentBarème &&
+ codesByBareme[currentZone][currentBarème].réduction
}
codeRégularisation={
- currentBarème && codesByBareme[currentBarème].régularisation
+ currentZone &&
+ currentBarème &&
+ codesByBareme[currentZone][currentBarème].régularisation
}
/>
) : (
diff --git a/site/source/pages/simulateurs/lodeom/Lodeom.tsx b/site/source/pages/simulateurs/lodeom/Lodeom.tsx
index 17e8d7124..57178606a 100644
--- a/site/source/pages/simulateurs/lodeom/Lodeom.tsx
+++ b/site/source/pages/simulateurs/lodeom/Lodeom.tsx
@@ -7,9 +7,11 @@ import RégularisationSwitch from '@/components/RéductionDeCotisations/Régular
import { SelectSimulationYear } from '@/components/SelectSimulationYear'
import SimulateurWarning from '@/components/SimulateurWarning'
import Simulation from '@/components/Simulation'
+import { useZoneLodeom } from '@/hooks/useZoneLodeom'
import { RégularisationMethod } from '@/utils/réductionDeCotisations'
import BarèmeSwitch from './components/BarèmeSwitch'
+import ZoneSwitch from './components/ZoneSwitch'
import LodeomSimulationGoals from './Goals'
export default function LodeomSimulation() {
@@ -39,10 +41,14 @@ export default function LodeomSimulation() {
const [régularisationMethod, setRégularisationMethod] =
useState('progressive')
+ const { currentZone } = useZoneLodeom()
+
return (
<>
}>
+
+
-
-
-
+ {currentZone === 'zone un' && (
+ <>
+
+
+ >
+ )}
>
}
diff --git a/site/source/pages/simulateurs/lodeom/components/BarèmeSwitch.tsx b/site/source/pages/simulateurs/lodeom/components/BarèmeSwitch.tsx
index fd3c46764..880b53b0b 100644
--- a/site/source/pages/simulateurs/lodeom/components/BarèmeSwitch.tsx
+++ b/site/source/pages/simulateurs/lodeom/components/BarèmeSwitch.tsx
@@ -6,12 +6,14 @@ 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'
+import { useBarèmeLodeom } from '@/hooks/useBarèmeLodeom'
+import { useZoneLodeom } from '@/hooks/useZoneLodeom'
export default function BarèmeSwitch() {
const { t } = useTranslation()
const engine = useEngine()
- const { barèmesPossibles, currentBarème, updateBarème } = useBaremeLodeom()
+ const { currentZone } = useZoneLodeom()
+ const { barèmes, currentBarème, updateBarème } = useBarèmeLodeom()
return (
@@ -23,9 +25,9 @@ export default function BarèmeSwitch() {
'Barème à appliquer'
)}
>
- {barèmesPossibles.map((barème, index) => {
+ {barèmes.map((barème, index) => {
const dottedName =
- `salarié . cotisations . exonérations . lodeom . zone un . ${barème}` as DottedName
+ `salarié . cotisations . exonérations . lodeom . ${currentZone} . ${barème}` as DottedName
const rule = engine.getRule(dottedName)
return (
@@ -33,9 +35,7 @@ export default function BarèmeSwitch() {
{rule.title}
diff --git a/site/source/pages/simulateurs/lodeom/components/ZoneSwitch.tsx b/site/source/pages/simulateurs/lodeom/components/ZoneSwitch.tsx
new file mode 100644
index 000000000..2d8baff6b
--- /dev/null
+++ b/site/source/pages/simulateurs/lodeom/components/ZoneSwitch.tsx
@@ -0,0 +1,27 @@
+import { useTranslation } from 'react-i18next'
+
+import { Radio, ToggleGroup } from '@/design-system'
+import { useBarèmeLodeom } from '@/hooks/useBarèmeLodeom'
+import { useZoneLodeom } from '@/hooks/useZoneLodeom'
+
+export default function ZoneSwitch() {
+ const { currentZone, updateZone } = useZoneLodeom()
+ const { updateBarème } = useBarèmeLodeom()
+ const { t } = useTranslation()
+
+ return (
+ {
+ updateBarème()
+ updateZone(value)
+ }}
+ aria-label={t("Zone de l'entreprise")}
+ >
+
+ {t('Guadeloupe, Guyane, Martinique, La Réunion')}
+
+ {t('Saint-Barthélémy, Saint-Martin')}
+
+ )
+}
diff --git a/site/source/pages/simulateurs/lodeom/simulationConfig.ts b/site/source/pages/simulateurs/lodeom/simulationConfig.ts
index d5352827d..7f842c4b6 100644
--- a/site/source/pages/simulateurs/lodeom/simulationConfig.ts
+++ b/site/source/pages/simulateurs/lodeom/simulationConfig.ts
@@ -29,6 +29,9 @@ export const configRéductionGénérale: SimulationConfig = {
},
],
'liste noire': [
+ 'établissement . commune',
+ 'salarié . cotisations . exonérations . lodeom . zone un . barème compétitivité renforcée',
+ 'salarié . cotisations . exonérations . lodeom . zone un . barème innovation et croissance',
'entreprise . salariés . effectif . seuil',
'salarié . contrat . CDD . motif',
'salarié . rémunération . primes . activité . base',
@@ -41,6 +44,5 @@ export const configRéductionGénérale: SimulationConfig = {
dirigeant: 'non',
'entreprise . catégorie juridique': "''",
'entreprise . imposition': 'non',
- 'salarié . cotisations . exonérations . lodeom . zone un': "'oui'",
},
}