feat: ajoute un avertissement lorsque le simulateur ne correspond pas à la catégorie juridique de l'entreprise

pull/3252/head
Alice Dahan 2024-12-05 11:14:09 +01:00 committed by liliced
parent 33b51ba4e9
commit 9675dfebf5
23 changed files with 156 additions and 43 deletions

View File

@ -21,6 +21,11 @@ entreprise . associés:
### () La nomenclature des catégories juridiques retenue est celle du niveau III du répertoire Sirene géré par l'Insee ###
### https://www.insee.fr/fr/information/2028129
entreprise . code catégorie juridique:
description: Code représentant la catégorie juridique de l'entreprise, tel que défini par l'INSEE.
références:
Liste des catégories juridique de l'INSEE: https://www.insee.fr/fr/information/2028129
entreprise . catégorie juridique:
question: Quelle est la catégorie juridique de l'entreprise ?
note: On se base ici sur les catégories juridiques définies par l'INSEE

View File

@ -1,24 +1,17 @@
import React from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import { useLocation } from 'react-router-dom'
import { styled } from 'styled-components'
import { ConversationProps } from '@/components/conversation/Conversation'
import ShareOrSaveSimulationBanner from '@/components/ShareSimulationBanner'
import { PopoverWithTrigger } from '@/design-system'
import { Grid, Spacing } from '@/design-system/layout'
import { Link } from '@/design-system/typography/link'
import {
companySituationSelector,
firstStepCompletedSelector,
} from '@/store/selectors/simulationSelectors'
import { firstStepCompletedSelector } from '@/store/selectors/simulationSelectors'
import { TrackPage } from '../ATInternetTracking'
import Banner from '../Banner'
import AnswerList from '../conversation/AnswerList'
import { Feedback, getShouldAskFeedback } from '../Feedback/Feedback'
import PrintExportRecover from '../simulationExplanation/PrintExportRecover'
import SimulationPréremplieBanner from '../SimulationPréremplieBanner'
import PreviousSimulationBanner from './../PreviousSimulationBanner'
import { FromTop } from './../ui/animate'
import EntrepriseSelection from './EntrepriseSelection'
@ -62,13 +55,8 @@ export default function Simulation({
id,
}: SimulationProps) {
const firstStepCompleted = useSelector(firstStepCompletedSelector)
const existingCompany = !!useSelector(companySituationSelector)[
'entreprise . SIREN'
]
const shouldShowFeedback = getShouldAskFeedback(useLocation().pathname)
const { t } = useTranslation()
return (
<>
{!firstStepCompleted && <TrackPage name="accueil" />}
@ -88,29 +76,7 @@ export default function Simulation({
)}
<Spacing md />
{existingCompany && (
<Banner icon="✏">
<Trans>
Ce simulateur a été prérempli avec la situation de votre
entreprise.
</Trans>{' '}
<PopoverWithTrigger
trigger={(buttonProps) => (
<Link
{...buttonProps}
aria-haspopup="dialog"
aria-label={t(
'Voir ma situation, accéder à la page de gestion de mon entreprise'
)}
>
<Trans>Voir ma situation</Trans>
</Link>
)}
>
{(close) => <AnswerList onClose={close} />}
</PopoverWithTrigger>
</Banner>
)}
<SimulationPréremplieBanner />
{!showQuestionsFromBeginning && !firstStepCompleted && (
<PreviousSimulationBanner />

View File

@ -0,0 +1,78 @@
import { Trans, useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import { Message, PopoverWithTrigger } from '@/design-system'
import { Spacing } from '@/design-system/layout'
import { Strong } from '@/design-system/typography'
import { Link } from '@/design-system/typography/link'
import { SmallBody } from '@/design-system/typography/paragraphs'
import { useCurrentSimulatorData } from '@/hooks/useCurrentSimulatorData'
import { PageConfig } from '@/pages/simulateurs/_configs/types'
import { companySituationSelector } from '@/store/selectors/simulationSelectors'
import Banner from './Banner'
import AnswerList from './conversation/AnswerList'
export default function SimulationPréremplieBanner() {
const company = useSelector(companySituationSelector)
const existingCompany = !!company['entreprise . SIREN']
const simulatorData = useCurrentSimulatorData().currentSimulatorData as
| PageConfig
| undefined
const isWrongSimulateur =
simulatorData &&
simulatorData.codesCatégorieJuridique?.length &&
simulatorData.codesCatégorieJuridique.indexOf(
company['entreprise . code catégorie juridique'] as string
) < 0
const { t } = useTranslation()
if (!existingCompany) {
return null
}
return (
<Banner icon="✏">
<Trans i18nKey="simulationPréremplieBanner.info">
Ce simulateur a été prérempli avec la situation de votre entreprise.
</Trans>{' '}
<PopoverWithTrigger
trigger={(buttonProps) => (
<Link
{...buttonProps}
aria-haspopup="dialog"
aria-label={t(
'simulationPréremplieBanner.aria-label',
'Voir ma situation, accéder à la page de gestion de mon entreprise'
)}
>
<Trans i18nKey="simulationPréremplieBanner.button">Voir ma situation</Trans>
</Link>
)}
>
{(close) => <AnswerList onClose={close} />}
</PopoverWithTrigger>
{isWrongSimulateur && (
<>
<Spacing xxs />
<Message type="error">
<SmallBody>
<Trans i18nKey="simulationPréremplieBanner.warning.1">
Votre catégorie juridique est
</Trans>{' '}
<Strong>
{company['entreprise . catégorie juridique'] as string}
</Strong>{' '}
<Trans i18nKey="simulationPréremplieBanner.warning.2">
mais vous êtes sur le simulateur pour{' '}
</Trans>
<Strong>{simulatorData.shortName}</Strong>.
</SmallBody>
</Message>
</>
)}
</Banner>
)
}

View File

@ -5652,6 +5652,14 @@ entreprise . chiffre d'affaires . vente restauration hébergement:
résumé.fr: Chiffre d'affaires hors taxe
titre.en: '[automatic] Sale of goods, catering, accommodation (BIC)'
titre.fr: Vente de biens, restauration, hébergement (BIC)
entreprise . code catégorie juridique:
description.en:
"[automatic] Code representing the company's legal category, as
defined by INSEE."
description.fr: Code représentant la catégorie juridique de l'entreprise, tel
que défini par l'INSEE.
titre.en: '[automatic] legal category code'
titre.fr: code catégorie juridique
entreprise . coût formalités:
titre.en: '[automatic] cost formalities'
titre.fr: coût formalités

View File

@ -63,7 +63,6 @@ Bonjour, je suis boulanger et je n'ai pas trouvé en cherchant "pain" ou "vienno
searched.
Budget: Budget
Calculer vos revenus: Calculate your income
Ce simulateur a été prérempli avec la situation de votre entreprise.: This simulator has been pre-filled with your company's situation.
Cette commune n'existe pas: This commune does not exist
Cette opération n'est pas réversible.: This operation is not reversible.
Charger plus de résultats: Load more results
@ -353,8 +352,6 @@ Voir les autres simulateurs: See other simulators
Voir les nouveautés apportées par la version {{release}}: See what's new in this version {{release}}
Voir les simulateurs personnalisés: See customized simulators
Voir les simulateurs personnalisés, accéder à la page de gestion de mon entreprise: See customized simulators, access my company management page
Voir ma situation: See my situation
Voir ma situation, accéder à la page de gestion de mon entreprise: View my situation, access my company management page
Vos attentes ne sont pas remplies: Your expectations are not met
Vos charges estimées: Your estimated expenses
Vos droits pour la retraite: Your pension rights
@ -1852,6 +1849,13 @@ simulation-end:
text: Now you can make your hiring plans a reality.
text: You now have access to the most accurate estimate possible.
title: You have completed this simulation
simulationPréremplieBanner:
aria-label: View my situation, access my company management page
button: See my situation
info: This simulator has been pre-filled with your company's situation.
warning:
"1": Your legal category is
"2": "but you are on the simulator for "
site:
defaultTitle: My company
meta:

View File

@ -68,7 +68,6 @@ Bonjour, je suis boulanger et je n'ai pas trouvé en cherchant "pain" ou "vienno
"viennoiserie".
Budget: Budget
Calculer vos revenus: Calculer vos revenus
Ce simulateur a été prérempli avec la situation de votre entreprise.: Ce simulateur a été prérempli avec la situation de votre entreprise.
Cette commune n'existe pas: Cette commune n'existe pas
Cette opération n'est pas réversible.: Cette opération n'est pas réversible.
Charger plus de résultats: Charger plus de résultats
@ -370,8 +369,6 @@ Voir les simulateurs personnalisés: Voir les simulateurs personnalisés
Voir les simulateurs personnalisés, accéder à la page de gestion de mon entreprise:
Voir les simulateurs personnalisés, accéder à la page de gestion de mon
entreprise
Voir ma situation: Voir ma situation
Voir ma situation, accéder à la page de gestion de mon entreprise: Voir ma situation, accéder à la page de gestion de mon entreprise
Vos attentes ne sont pas remplies: Vos attentes ne sont pas remplies
Vos charges estimées: Vos charges estimées
Vos droits pour la retraite: Vos droits pour la retraite
@ -1969,6 +1966,13 @@ simulation-end:
text: Vous pouvez maintenant concrétiser votre projet d'embauche.
text: Vous avez maintenant accès à l'estimation la plus précise possible.
title: Vous avez complété cette simulation
simulationPréremplieBanner:
aria-label: Voir ma situation, accéder à la page de gestion de mon entreprise
button: Voir ma situation
info: Ce simulateur a été prérempli avec la situation de votre entreprise.
warning:
"1": Votre catégorie juridique est
"2": "mais vous êtes sur le simulateur pour "
site:
defaultTitle: Mon-entreprise
meta:

View File

@ -78,6 +78,11 @@ export interface PageConfig {
*/
autoloadLastSimulation?: boolean
/** Indique les catégories d'entreprise concernées par le simulateur.
* Un tableau vide indique que le simulateur concerne toutes les catégories d'entreprise.
*/
codesCatégorieJuridique?: string[]
/** Composant React de la page
*
* Note : Le nom du composant doit être en un seul mot pour que le script `yarn build:simulator-data` marche

View File

@ -31,6 +31,7 @@ export function artisteAuteurConfig({ t, sitePaths }: SimulatorsDataParams) {
'pages.simulateurs.artiste-auteur.shortname',
'Artiste-auteur'
),
codesCatégorieJuridique: ['1000'],
component: ArtisteAuteur,
} as const)
}

View File

@ -43,6 +43,7 @@ export function autoEntrepreneurConfig({ t, sitePaths }: SimulatorsDataParams) {
nextSteps: ['indépendant', 'comparaison-statuts'],
path: sitePaths.simulateurs['auto-entrepreneur'],
simulation: configAutoEntrepreneur,
codesCatégorieJuridique: ['1000'],
component: AutoEntrepreneur,
seoExplanations: SeoExplanations,
} as const)

View File

@ -40,6 +40,7 @@ export function auxiliaireMédicalConfig({
},
path: sitePaths.simulateurs['profession-libérale'].auxiliaire,
simulation: configAuxiliaire,
codesCatégorieJuridique: ['1000', '5410'],
component: IndépendantPLSimulation,
} as const)
}

View File

@ -30,6 +30,7 @@ export function avocatConfig({ t, sitePaths }: SimulatorsDataParams) {
},
path: sitePaths.simulateurs['profession-libérale'].avocat,
simulation: configAvocat,
codesCatégorieJuridique: ['1000', '5410', '5499'],
component: IndépendantPLSimulation,
} as const)
}

View File

@ -36,6 +36,7 @@ export function chirurgienDentisteConfig({
),
path: sitePaths.simulateurs['profession-libérale']['chirurgien-dentiste'],
simulation: configDentiste,
codesCatégorieJuridique: ['1000', '5410'],
component: IndépendantPLSimulation,
} as const)
}

View File

@ -31,6 +31,7 @@ export function cipavConfig({ t, sitePaths }: SimulatorsDataParams) {
),
path: sitePaths.simulateurs['profession-libérale'].cipav,
simulation: cipavSimulationConfig,
codesCatégorieJuridique: ['1000', '5410', '5499'],
component: IndépendantPLSimulation,
} as const)
}

View File

@ -38,6 +38,7 @@ export function eirlConfig({ t, sitePaths }: SimulatorsDataParams) {
nextSteps: ['comparaison-statuts'],
path: sitePaths.simulateurs.eirl,
simulation: configEirl,
codesCatégorieJuridique: ['1000'],
component: IndépendantSimulation,
} as const)
}

View File

@ -47,6 +47,7 @@ export function entrepriseIndividuelleConfig({
nextSteps: ['comparaison-statuts'],
path: sitePaths.simulateurs['entreprise-individuelle'],
simulation: configEntrepriseIndividuelle,
codesCatégorieJuridique: ['1000'],
component: EntrepriseIndividuelle,
seoExplanations: SeoExplanationsEI,
} as const)

View File

@ -45,6 +45,25 @@ export function eurlConfig({ t, sitePaths }: SimulatorsDataParams) {
],
path: sitePaths.simulateurs.eurl,
simulation: configEurl,
codesCatégorieJuridique: [
'5410',
'5415',
'5422',
'5426',
'5430',
'5431',
'5432',
'5442',
'5443',
'5451',
'5453',
'5454',
'5455',
'5458',
'5459',
'5460',
'5499',
],
component: IndépendantSimulation,
} as const)
}

View File

@ -33,6 +33,7 @@ export function expertComptableConfig({ t, sitePaths }: SimulatorsDataParams) {
},
path: sitePaths.simulateurs['profession-libérale']['expert-comptable'],
simulation: configExpertComptable,
codesCatégorieJuridique: ['1000', '5410', '5499'],
component: IndépendantPLSimulation,
} as const)
}

View File

@ -30,6 +30,7 @@ export function médecinConfig({ t, sitePaths }: SimulatorsDataParams) {
),
path: sitePaths.simulateurs['profession-libérale'].médecin,
simulation: configMédecin,
codesCatégorieJuridique: ['1000', '5410'],
component: IndépendantPLSimulation,
} as const)
}

View File

@ -30,6 +30,7 @@ export function pharmacienConfig({ t, sitePaths }: SimulatorsDataParams) {
),
path: sitePaths.simulateurs['profession-libérale'].pharmacien,
simulation: configPharmacien,
codesCatégorieJuridique: ['1000', '5410', '5499'],
component: IndépendantPLSimulation,
} as const)
}

View File

@ -35,6 +35,16 @@ export function professionLibéraleConfig({
),
path: sitePaths.simulateurs['profession-libérale'].index,
simulation: configProfessionLibérale,
codesCatégorieJuridique: [
'1000',
'5410',
'5415',
'5422',
'5458',
'5459',
'5460',
'5499',
],
component: IndépendantPLSimulation,
} as const)
}

View File

@ -30,6 +30,7 @@ export function sageFemmeConfig({ t, sitePaths }: SimulatorsDataParams) {
),
path: sitePaths.simulateurs['profession-libérale']['sage-femme'],
simulation: configSageFemme,
codesCatégorieJuridique: ['1000', '5410'],
component: IndépendantPLSimulation,
} as const)
}

View File

@ -41,6 +41,7 @@ export function sasuConfig({ t, sitePaths }: SimulatorsDataParams) {
nextSteps: ['is', 'comparaison-statuts'],
path: sitePaths.simulateurs.sasu,
simulation: configSASU,
codesCatégorieJuridique: ['5710'],
component: SASUSimulation,
seoExplanations: SeoExplanations,
} as const)

View File

@ -87,6 +87,7 @@ export function companySituation(state: Situation = {}, action: Action) {
export function getCompanySituation(entreprise: Entreprise): Situation {
return {
'entreprise . date de création': toPublicodeDate(entreprise.dateDeCréation),
'entreprise . code catégorie juridique': entreprise.codeCatégorieJuridique,
'entreprise . catégorie juridique': `'${getCatégorieFromCode(
entreprise.codeCatégorieJuridique
)}'`,