Transform and refacto gérer to assistants

pull/2529/head
Jérémy Rialland 2023-03-01 18:49:17 +01:00 committed by Johan Girod
parent 7d2575d46f
commit 9996d69b95
55 changed files with 346 additions and 277 deletions

View File

@ -17,27 +17,26 @@ import {
useSetupSafeSituation,
} from '@/components/utils/EngineContext'
import { Container, Spacing } from '@/design-system/layout'
import { useAxeCoreAnalysis } from '@/hooks/useAxeCoreAnalysis'
import { useGetFullURL } from '@/hooks/useGetFullURL'
import { useIsEmbedded } from '@/hooks/useIsEmbedded'
import { useSaveAndRestoreScrollPosition } from '@/hooks/useSaveAndRestoreScrollPosition'
import Accessibilité from '@/pages/Accessibilité'
import Budget from '@/pages/Budget/Budget'
import Créer from '@/pages/Creer'
import IntegrationTest from '@/pages/Dev/IntegrationTest'
import Documentation from '@/pages/Documentation'
import Iframes from '@/pages/Iframes'
import Landing from '@/pages/Landing/Landing'
import Nouveautés from '@/pages/Nouveautes/Nouveautes'
import Offline from '@/pages/Offline'
import Plan from '@/pages/Plan'
import Simulateurs from '@/pages/Simulateurs'
import Stats from '@/pages/Stats/LazyStats'
import Assistants from '@/pages/assistants/index'
import Integration from '@/pages/integration/index'
import { useSitePaths } from '@/sitePaths'
import { useAxeCoreAnalysis } from '../hooks/useAxeCoreAnalysis'
import { useGetFullURL } from '../hooks/useGetFullURL'
import { useSaveAndRestoreScrollPosition } from '../hooks/useSaveAndRestoreScrollPosition'
import Accessibilité from '../pages/Accessibilité'
import Budget from '../pages/Budget/Budget'
import Créer from '../pages/Creer'
import IntegrationTest from '../pages/Dev/IntegrationTest'
import Documentation from '../pages/Documentation'
import Iframes from '../pages/Iframes'
import Landing from '../pages/Landing/Landing'
import Nouveautés from '../pages/Nouveautes/Nouveautes'
import Offline from '../pages/Offline'
import Plan from '../pages/Plan'
import Simulateurs from '../pages/Simulateurs'
import Stats from '../pages/Stats/LazyStats'
import Assistants from '../pages/assistants'
import Gérer from '../pages/gerer'
import Integration from '../pages/integration/index'
import { useSitePaths } from '../sitePaths'
import Provider, { ProviderProps } from './Provider'
type RootProps = {
@ -89,14 +88,16 @@ const Redirections = ({ children }: { children: React.ReactNode }) => {
'/gérer/aide-declaration-independants/beta',
'/manage/declaration-aid-independent/beta',
],
to: absoluteSitePaths.gérer.déclarationIndépendant.index,
to: absoluteSitePaths.assistants.déclarationIndépendant.index,
},
{
paths: [
'/gérer/aide-declaration-independants',
'/manage/declaration-aid-independent',
],
to: absoluteSitePaths.gérer['déclaration-charges-sociales-indépendant'],
to: absoluteSitePaths.assistants[
'déclaration-charges-sociales-indépendant'
],
},
] satisfies { paths: string[]; to: string }[]
@ -169,10 +170,6 @@ const App = () => {
path={relativeSitePaths.créer.index + '/*'}
element={<Créer />}
/>
<Route
path={relativeSitePaths.gérer.index + '/*'}
element={<Gérer />}
/>
<Route
path={relativeSitePaths.assistants.index + '/*'}
element={<Assistants />}

View File

@ -29,7 +29,7 @@ export const useFeedback = () => {
// Exclure les pages et sous-pages
![
absoluteSitePaths.documentation.index,
absoluteSitePaths.gérer.index,
absoluteSitePaths.assistants.index,
absoluteSitePaths.créer.index,
absoluteSitePaths.nouveautés,
absoluteSitePaths.stats,

View File

@ -1492,6 +1492,29 @@ pages:
to:<1></1>Défenseur des droits<3></3>Libre réponse 71120<5></5>75342 Paris
CEDEX 07</2></21><22>Updated on 29/01/2021</22>
assistants:
pour-mon-entreprise:
avertissement-entreprise-non-traitée: <0>There is not yet an income simulator
for your type of business on this site.</0><1>If you would like us to
develop a new simulator, please leave us a message by clicking on the
"<1></1>" button on the right of your screen.</1>
description: Do you want to pay yourself an income or hire someone? You will
have to pay contributions and taxes. Anticipate their amounts thanks to
the simulators adapted to your situation.
info:
PdE: "<0>Discuss with the consultant who can help you according to your
problem</0><1><0>You wish to :</0><1><0>recruit, train your
employees</0><1>finance your investment projects</1><2>solve a cash
flow problem</2><3>be advised on labor law</3><4>develop your
commercial activity</4><5>sell on the internet</5><6>sell or take over
a company</6><7>improve health and safety at work</7><8>enter into an
ecological and CSR transition process</8></1></1><2><0>Quick and easy
public service: you are called back by THE advisor who can help
you.</0></2><3>More than 40 public partners are mobilized to assist
you according to your problem.<1></1>The competent advisor near you
will call you back within 5 days.</3>"
meta:
description: Simulators and wizards adapted to your company
title: Manage my business
recherche-code-ape:
description: This wizard allows you to quickly find the APE code (main activity)
that corresponds to your activity. This code is assigned by INSEE to

View File

@ -1300,6 +1300,31 @@ pages:
71120<5></5>75342&nbsp;Paris CEDEX 07</2></21><22>Mis à jour le
29/01/2021</22>
assistants:
pour-mon-entreprise:
avertissement-entreprise-non-traitée: <0>Il n'existe pas encore de simulateur de
revenu pour votre type d'entreprise sur ce site.</0><1>Si vous souhaitez
que nous développions un nouveau simulateur, laissez-nous message en
cliquant sur le bouton "<1></1>" à droite de votre écran.</1>
description: Vous souhaitez vous verser un revenu ou embaucher ? Vous aurez à
payer des cotisations et des impôts. Anticipez leurs montants grâce aux
simulateurs adaptés à votre situation.
info:
PdE: "<0>Échanger avec le conseiller qui peut vous aider selon votre
problématique</0><1><0>Vous souhaitez :</0><1><0>recruter, former vos
salariés</0><1>financer vos projets d'investissement</1><2>résoudre un
problème de trésorerie</2><3>être conseillé(e) en droit du
travail</3><4>développer votre activité commerciale</4><5>vendre sur
internet</5><6>vendre ou reprendre une entreprise</6><7>améliorer la
santé et sécurité au travail</7><8>entrer dans une démarche de
transition écologique & RSE</8></1></1><2><0>Service public simple et
rapide : vous êtes rappelé(e) par LE conseiller qui peut vous
aider.</0></2><3>Plus de 40 partenaires publics sont mobilisés pour
vous accompagner en fonction de votre problématique.<1></1>Le
conseiller compétent proche de chez vous vous rappelle sous 5
jours.</3>"
meta:
description: Simulateurs et assistants adaptés à votre entreprise
title: Gérer mon activité
recherche-code-ape:
description: Cet assistant vous permet de trouver rapidement le code APE
(activité principale exercée) qui correspond à votre activité. Ce code

View File

@ -48,9 +48,11 @@ export default function SearchOrCreate() {
<AnswerGroup role="list">
<Button
role="link"
to={generatePath(absoluteSitePaths.gérer.entreprise, {
entreprise: companySIREN as string,
})}
to={generatePath(
absoluteSitePaths.assistants['pour-mon-entreprise']
.entreprise,
{ entreprise: companySIREN as string }
)}
data-test-id="cta-see-custom-simulators"
aria-label={t(
'Voir les simulateurs personnalisés, accéder à la page de gestion de mon entreprise'
@ -145,12 +147,13 @@ function useHandleCompanySubmit() {
}
setEntreprise(établissement)
const entreprise = établissement.siren
const path = generatePath(absoluteSitePaths.gérer.entreprise, {
entreprise,
})
const path = generatePath(
absoluteSitePaths.assistants['pour-mon-entreprise'].entreprise,
{ entreprise }
)
navigate(path)
},
[navigate, setEntreprise, absoluteSitePaths.gérer.entreprise]
[absoluteSitePaths.assistants, navigate, setEntreprise]
)
return handleCompanySubmit

View File

@ -64,7 +64,7 @@ export default function Plan() {
</Li>
<Li>
<H3 as="h2">
<HeaderLink to={absoluteSitePaths.gérer.index}>
<HeaderLink to={absoluteSitePaths.assistants.index}>
<Trans>Gérer mon activité</Trans>
</HeaderLink>
</H3>
@ -72,14 +72,14 @@ export default function Plan() {
<Ul>
<Li>
<H3>
<Link to={absoluteSitePaths.gérer.embaucher}>
<Link to={absoluteSitePaths.assistants.embaucher}>
<Trans>Embaucher</Trans>
</Link>
</H3>
</Li>
<Li>
<H3>
<Link to={absoluteSitePaths.gérer.sécuritéSociale}>
<Link to={absoluteSitePaths.assistants.sécuritéSociale}>
<Trans>Protection sociale</Trans>
</Link>
</H3>
@ -88,7 +88,7 @@ export default function Plan() {
<H3>
<Link
to={
absoluteSitePaths.gérer[
absoluteSitePaths.assistants[
'déclaration-charges-sociales-indépendant'
]
}
@ -102,7 +102,7 @@ export default function Plan() {
</Li>
<Li>
<H3>
<Link to={absoluteSitePaths.gérer.formulaireMobilité}>
<Link to={absoluteSitePaths.assistants.formulaireMobilité}>
<Trans>Demande de mobilité internationale</Trans>
</Link>
</H3>

View File

@ -56,7 +56,7 @@ export default function Simulateurs() {
{pathname !== absoluteSitePaths.simulateurs.index &&
(lastState?.fromGérer ? (
<Link to={absoluteSitePaths.gérer.index} noUnderline>
<Link to={absoluteSitePaths.assistants.index} noUnderline>
<span aria-hidden></span> <Trans>Retour à mon activité</Trans>
</Link>
) : lastState?.fromCréer ? (

View File

@ -1,10 +1,11 @@
import { ImmutableType } from '@/types/utils'
import { choixStatutConfig } from '../Creer/choix-statut/config'
import { déclarationChargesSocialesIndépendantConfig } from '../assistants/declaration-charges-sociales-independant/config'
import { déclarationRevenuIndépendantBetaConfig } from '../assistants/declaration-revenu-independants/config'
import { demandeMobilitéConfig } from '../assistants/demande-mobilité/config'
import { pourMonEntrepriseConfig } from '../assistants/pour-mon-entreprise/config'
import { rechercheCodeApeConfig } from '../assistants/recherche-code-ape/config'
import { déclarationChargesSocialesIndépendantConfig } from '../gerer/declaration-charges-sociales-independant/config'
import { déclarationRevenuIndépendantBetaConfig } from '../gerer/declaration-revenu-independants/config'
import { demandeMobilitéConfig } from '../gerer/demande-mobilité/config'
import { artisteAuteurConfig } from './artiste-auteur/config'
import { autoEntrepreneurConfig } from './auto-entrepreneur/config'
import { auxiliaireMédicalConfig } from './auxiliaire-médical/config'
@ -32,12 +33,13 @@ import { sasuConfig } from './sasu/config'
import { économieCollaborativeConfig } from './économie-collaborative/config'
/**
* Contient l'intégralité des données concernant les différents simulateurs
* Contient l'intégralité des données concernant les différents simulateurs et assistants
* sans dépendance qui compliquerait leur import dans le script de mise à jour
* des données pour Algolia.
*/
const getMetadataSrc = (params: SimulatorsDataParams) => {
const data = {
// simulateurs:
...salariéConfig(params),
...entrepriseIndividuelleConfig(params),
...eirlConfig(params),
@ -50,9 +52,6 @@ const getMetadataSrc = (params: SimulatorsDataParams) => {
...comparaisonStatutsConfig(params),
...économieCollaborativeConfig(params),
...choixStatutConfig(params),
...déclarationChargesSocialesIndépendantConfig(params),
...déclarationRevenuIndépendantBetaConfig(params),
...demandeMobilitéConfig(params),
...pharmacienConfig(params),
...médecinConfig(params),
...chirurgienDentisteConfig(params),
@ -66,7 +65,13 @@ const getMetadataSrc = (params: SimulatorsDataParams) => {
...coûtCréationEntrepriseConfig(params),
...impôtSociétéConfig(params),
...cipavConfig(params),
// assistants:
...déclarationChargesSocialesIndépendantConfig(params),
...déclarationRevenuIndépendantBetaConfig(params),
...demandeMobilitéConfig(params),
...rechercheCodeApeConfig(params),
...pourMonEntrepriseConfig(params),
} as const
return data satisfies ImmutableType<Record<string, PageConfig>>

View File

@ -51,7 +51,7 @@ export default function SalariéSimulation() {
Vous pouvez maintenant concrétiser votre projet d'embauche.
</Trans>
<ButtonContainer>
<Button to={absoluteSitePaths.gérer.embaucher}>
<Button to={absoluteSitePaths.assistants.embaucher}>
<Trans i18nKey="simulation-end.cta">
Connaître les démarches
</Trans>

View File

@ -14,7 +14,9 @@ export function DeclarationIndedependantsCard() {
'Déclaration de revenus (indépendants)'
)}
ctaLabel={t('gérer.choix.déclaration.cta', 'Remplir ma déclaration')}
to={absoluteSitePaths.gérer['déclaration-charges-sociales-indépendant']}
to={
absoluteSitePaths.assistants['déclaration-charges-sociales-indépendant']
}
>
<Trans i18nKey="gérer.choix.déclaration.body">
Calculez facilement les montants des charges sociales à reporter dans

View File

@ -8,12 +8,14 @@ export function déclarationChargesSocialesIndépendantConfig({
}: SimulatorsDataParams) {
return config({
id: 'déclaration-charges-sociales-indépendant',
path: sitePaths.gérer['déclaration-charges-sociales-indépendant'],
pathId: 'assistants.déclaration-charges-sociales-indépendant',
path: sitePaths.assistants['déclaration-charges-sociales-indépendant'],
iframePath: 'déclaration-charges-sociales-indépendant',
icône: '📑',
tracking: {
chapter1: 'gerer',
chapter2: 'declaration_charges_sociales_independant',
},
icône: '📑',
meta: {
description: t(
'pages.gérer.declaration_charges_sociales_indépendant.meta.description',
@ -24,12 +26,10 @@ export function déclarationChargesSocialesIndépendantConfig({
'Détermination des charges sociales déductibles'
),
},
pathId: 'gérer.déclaration-charges-sociales-indépendant',
shortName: t(
'pages.gérer.declaration_charges_sociales_indépendant.shortname',
'Détermination des charges sociales déductibles'
),
iframePath: 'déclaration-charges-sociales-indépendant',
title: t(
'pages.gérer.declaration_charges_sociales_indépendant.title',
'Assistant à la détermination des charges sociales déductibles'

View File

@ -48,7 +48,9 @@ const config: SimulationConfig = {
export default function AideDéclarationIndépendant() {
const { absoluteSitePaths } = useSitePaths()
useSimulationConfig({
path: absoluteSitePaths.gérer['déclaration-charges-sociales-indépendant'],
path: absoluteSitePaths.assistants[
'déclaration-charges-sociales-indépendant'
],
config,
autoloadLastSimulation: true,
})

View File

@ -179,7 +179,8 @@ export function DéclarationRevenuSection({ progress }: { progress: number }) {
size="XL"
isDisabled={progress !== 1}
to={
absoluteSitePaths.gérer.déclarationIndépendant.cotisations
absoluteSitePaths.assistants.déclarationIndépendant
.cotisations
}
>
Continuer vers l'estimation des cotisations pour 2022

View File

@ -41,7 +41,7 @@ export default function NotHandledCase({
</Grid>
<Grid item lg={2} />
<Grid item md="auto">
<Button color="tertiary" to={absoluteSitePaths.gérer.index}>
<Button color="tertiary" to={absoluteSitePaths.assistants.index}>
Découvrir les simulateur et assistant pour mon entreprise
</Button>
</Grid>

View File

@ -9,8 +9,8 @@ export function déclarationRevenuIndépendantBetaConfig({
return config({
beta: true,
id: 'déclaration-revenu-indépendant',
pathId: 'gérer.déclarationIndépendant.index',
path: sitePaths.gérer.déclarationIndépendant.index,
pathId: 'assistants.déclarationIndépendant.index',
path: sitePaths.assistants.déclarationIndépendant.index,
iframePath: 'déclaration-revenu-indépendant',
icône: '✍️',
tracking: {

View File

@ -192,7 +192,8 @@ export default function Accueil() {
<Button
size="XL"
to={
absoluteSitePaths.gérer.déclarationIndépendant.imposition
absoluteSitePaths.assistants.déclarationIndépendant
.imposition
}
>
Continuer avec cette entreprise

View File

@ -349,7 +349,8 @@ function ResultSection() {
>
<Button
to={
absoluteSitePaths.gérer.déclarationIndépendant.déclaration
absoluteSitePaths.assistants.déclarationIndépendant
.déclaration
}
onPress={() => {
dispatchValue('non', 'DRI . déclaration revenus manuelle')
@ -389,7 +390,7 @@ function ResultSection() {
size="XS"
color="tertiary"
to={
absoluteSitePaths.gérer[
absoluteSitePaths.assistants[
'déclaration-charges-sociales-indépendant'
]
}
@ -424,7 +425,8 @@ function ResultSection() {
light
size="XS"
to={
absoluteSitePaths.gérer.déclarationIndépendant.déclaration
absoluteSitePaths.assistants.déclarationIndépendant
.déclaration
}
onPress={() => {
dispatchValue('oui', 'DRI . déclaration revenus manuelle')
@ -475,7 +477,7 @@ function ResultSection() {
light
size="XS"
to={
absoluteSitePaths.gérer[
absoluteSitePaths.assistants[
'déclaration-charges-sociales-indépendant'
]
}

View File

@ -41,7 +41,7 @@ const config: SimulationConfig = {
export default function AideDéclarationIndépendant() {
const { absoluteSitePaths } = useSitePaths()
useSimulationConfig({
path: absoluteSitePaths.gérer.déclarationIndépendant.index,
path: absoluteSitePaths.assistants.déclarationIndépendant.index,
config,
autoloadLastSimulation: true,
})
@ -96,7 +96,7 @@ export default function AideDéclarationIndépendant() {
function useSteps() {
const sitePaths =
useSitePaths().relativeSitePaths.gérer.déclarationIndépendant
useSitePaths().relativeSitePaths.assistants.déclarationIndépendant
const { t } = useTranslation()
const step1Progress = useProgress(Step1Objectifs)
const step2Progress = useProgress(Step2Objectifs)

View File

@ -4,12 +4,16 @@ import { SimulatorsDataParams } from '../../Simulateurs/configs/types'
export function demandeMobilitéConfig({ t, sitePaths }: SimulatorsDataParams) {
return config({
private: true,
id: 'demande-mobilité',
pathId: 'assistants.formulaireMobilité',
iframePath: 'demande-mobilite',
path: sitePaths.assistants.formulaireMobilité,
icône: '🧳',
tracking: {
chapter1: 'gerer',
chapter2: 'demande_mobilite',
},
icône: '🧳',
meta: {
title: t(
'pages.gérer.demande-mobilité.meta.title',
@ -20,7 +24,6 @@ export function demandeMobilitéConfig({ t, sitePaths }: SimulatorsDataParams) {
"Formulaire interactif à compléter en cas d'exercice d'une activité professionnelle à l'étranger"
),
},
pathId: 'gérer.formulaireMobilité',
shortName: t(
'pages.gérer.demande-mobilité.shortname',
'Demande de mobilité internationale'
@ -29,9 +32,6 @@ export function demandeMobilitéConfig({ t, sitePaths }: SimulatorsDataParams) {
'pages.gérer.demande-mobilité.title',
'Demande de mobilité internationale'
),
private: true,
iframePath: 'demande-mobilite',
path: sitePaths.gérer.formulaireMobilité,
component: FormulaireMobilitéIndépendant,
} as const)
}

View File

@ -1,32 +1,73 @@
import { Route, Routes } from 'react-router-dom'
import { Trans } from 'react-i18next'
import { Route, Routes, useLocation } from 'react-router-dom'
import { TrackChapter } from '@/components/ATInternetTracking'
import PageData from '@/components/PageData'
import Route404 from '@/components/Route404'
import { ScrollToTop } from '@/components/utils/Scroll'
import { Link } from '@/design-system/typography/link'
import useSimulatorsData from '@/hooks/useSimulatorsData'
import { useSitePaths } from '@/sitePaths'
import SimulateurPage from '../../components/PageData'
import Embaucher from './embaucher'
import SocialSecurity from './sécurité-sociale'
export default function Assistants() {
const sitePaths = useSitePaths()
const simulatorsData = useSimulatorsData()
export default function Gérer() {
const { relativeSitePaths, absoluteSitePaths } = useSitePaths()
const location = useLocation()
const simulateurs = useSimulatorsData()
const routes = Object.entries(simulatorsData)
.filter(([, simu]) => simu.pathId.startsWith('assistants.'))
.map(([, simu]) => (
<Route
key={simu.path}
path={simu.path.replace(
sitePaths.absoluteSitePaths.assistants.index,
''
)}
element={<SimulateurPage />}
/>
))
const back = (
<Link noUnderline to={absoluteSitePaths.assistants.index}>
<span aria-hidden></span> <Trans>Retour à mon activité</Trans>
</Link>
)
return (
<Routes>
{routes}
<Route path="*" element={<Route404 />} />
</Routes>
<>
<ScrollToTop key={location.pathname} />
<TrackChapter chapter1="gerer">
<Routes>
{/* <Route index element={<Home />} /> Navigate to /simu-et-assist */}
<Route
path={relativeSitePaths.assistants.sécuritéSociale}
element={
<>
{back}
<SocialSecurity />
</>
}
/>
<Route
path={relativeSitePaths.assistants.embaucher}
element={
<>
{back}
<Embaucher />
</>
}
/>
{Object.entries(simulateurs)
.filter(([, simu]) => simu.pathId.startsWith('assistants.'))
.map(([, simu]) => (
<Route
key={simu.path}
path={
simu.path.replace(absoluteSitePaths.assistants.index, '') +
'/*'
}
element={
<>
{back}
<PageData />
</>
}
/>
))}
<Route path="*" element={<Route404 />} />
</Routes>
</TrackChapter>
</>
)
}

View File

@ -17,7 +17,7 @@ export function DemarcheEmbaucheCard() {
'gérer.ressources.embaucher.cta',
'Voir la liste des démarches'
)}
to={absoluteSitePaths.gérer.embaucher}
to={absoluteSitePaths.assistants.embaucher}
>
<Trans i18nKey="gérer.ressources.embaucher.body">
La liste des choses à faire pour être sûr de ne rien oublier lors de

View File

@ -14,7 +14,7 @@ export function MobiliteCard() {
'Exporter son activité en Europe'
)}
ctaLabel={t('gérer.ressources.export.cta', 'Remplir le formulaire')}
to={absoluteSitePaths.gérer.formulaireMobilité}
to={absoluteSitePaths.assistants.formulaireMobilité}
>
<Trans i18nKey="gérer.ressources.export.body">
Le formulaire pour effectuer une demande de mobilité internationale

View File

@ -17,7 +17,7 @@ export function SecuriteSocialeCard() {
</h3>
}
ctaLabel={t('gérer.ressources.sécuritéSociale.cta', 'Lire le guide')}
to={absoluteSitePaths.gérer.sécuritéSociale}
to={absoluteSitePaths.assistants.sécuritéSociale}
>
<Trans i18nKey="gérer.ressources.sécuritéSociale.body">
A quoi servent les cotisations sociales ? Le point sur le système de

View File

@ -0,0 +1,37 @@
import { config } from '@/pages/Simulateurs/configs/config'
import { SimulatorsDataParams } from '@/pages/Simulateurs/configs/types'
import PourMonEntreprise from '.'
export function pourMonEntrepriseConfig({
t,
sitePaths,
}: SimulatorsDataParams) {
return config({
id: 'pour-mon-entreprise',
pathId: 'assistants.pour-mon-entreprise.index',
path: sitePaths.assistants['pour-mon-entreprise'].index,
iframePath: 'pour-mon-entreprise',
icône: '🏢',
title: t(
'pages.assistants.pour-mon-entreprise.title',
'Gérer mon activité'
),
shortName: t(
'pages.assistants.pour-mon-entreprise.title',
'Gérer mon activité'
),
meta: {
title: t(
'pages.assistants.pour-mon-entreprise.title',
'Gérer mon activité'
),
description: t(
'pages.assistants.pour-mon-entreprise.meta.description',
'Simulateurs et assistants adaptés à votre entreprise'
),
},
tracking: {},
component: PourMonEntreprise as () => JSX.Element, // avoid types loop error
} as const)
}

View File

Before

Width:  |  Height:  |  Size: 744 B

After

Width:  |  Height:  |  Size: 744 B

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -9,7 +9,6 @@ import {
Route,
Routes,
generatePath,
useLocation,
useParams,
} from 'react-router-dom'
import styled from 'styled-components'
@ -18,13 +17,12 @@ import {
FabriqueSocialEntreprise,
searchDenominationOrSiren,
} from '@/api/fabrique-social'
import { TrackChapter, TrackPage } from '@/components/ATInternetTracking'
import { TrackPage } from '@/components/ATInternetTracking'
import {
Condition,
WhenApplicable,
WhenNotApplicable,
} from '@/components/EngineValue'
import PageData from '@/components/PageData'
import PageHeader from '@/components/PageHeader'
import { PlaceDesEntreprisesButton } from '@/components/PlaceDesEntreprises'
import { CompanyDetails } from '@/components/company/Details'
@ -33,7 +31,6 @@ import { FromTop } from '@/components/ui/animate'
import { ForceThemeProvider } from '@/components/utils/DarkModeContext'
import DefaultHelmet from '@/components/utils/DefaultHelmet'
import { useEngine } from '@/components/utils/EngineContext'
import { ScrollToTop } from '@/components/utils/Scroll'
import { Markdown } from '@/components/utils/markdown'
import { Message, Popover } from '@/design-system'
import { Button } from '@/design-system/buttons'
@ -41,163 +38,51 @@ import { Emoji } from '@/design-system/emoji'
import { Container, Grid, Spacing } from '@/design-system/layout'
import { Strong } from '@/design-system/typography'
import { H2, H3 } from '@/design-system/typography/heading'
import { Link } from '@/design-system/typography/link'
import { Body, Intro } from '@/design-system/typography/paragraphs'
import { useQuestionList } from '@/hooks/useQuestionList'
import { useSetEntreprise } from '@/hooks/useSetEntreprise'
import useSimulationConfig from '@/hooks/useSimulationConfig'
import useSimulatorsData, { SimulatorData } from '@/hooks/useSimulatorsData'
import { SimulateurCard } from '@/pages/Simulateurs/Home'
import { useSitePaths } from '@/sitePaths'
import { resetCompany } from '@/store/actions/companyActions'
import { companySituationSelector } from '@/store/selectors/simulationSelectors'
import { evaluateQuestion } from '@/utils'
import { SimulateurCard } from '../Simulateurs/Home'
import { AnnuaireEntreprises } from './components/AnnuaireEntreprises'
import { AutoEntrepreneurCard } from './components/AutoEntrepeneurCard'
import { DemarcheEmbaucheCard } from './components/DemarcheEmbauche'
import { MobiliteCard } from './components/MobiliteCard'
import { SecuriteSocialeCard } from './components/SecuriteSocialeCard'
import forms from './components/forms.svg'
import growth from './components/growth.svg'
import Embaucher from './embaucher'
import SocialSecurity from './sécurité-sociale'
import { AnnuaireEntreprises } from './AnnuaireEntreprises'
import { AutoEntrepreneurCard } from './AutoEntrepeneurCard'
import { DemarcheEmbaucheCard } from './DemarcheEmbauche'
import { MobiliteCard } from './MobiliteCard'
import { SecuriteSocialeCard } from './SecuriteSocialeCard'
import forms from './forms.svg'
import growth from './growth.svg'
export default function Gérer() {
const { relativeSitePaths, absoluteSitePaths } = useSitePaths()
const location = useLocation()
const simulateurs = useSimulatorsData()
const back = (
<Link noUnderline to={absoluteSitePaths.gérer.index}>
<span aria-hidden></span> <Trans>Retour à mon activité</Trans>
</Link>
)
export default function PourMonEntrepriseHome() {
const { relativeSitePaths } = useSitePaths()
return (
<>
<ScrollToTop key={location.pathname} />
<TrackChapter chapter1="gerer">
<Routes>
<Route index element={<Home />} />
<Route path={relativeSitePaths.gérer.entreprise} element={<Home />} />
<Route
path={relativeSitePaths.gérer.sécuritéSociale}
element={
<>
{back}
<SocialSecurity />
</>
}
/>
<Route
path={relativeSitePaths.gérer.embaucher}
element={
<>
{back}
<Embaucher />
</>
}
/>
{[
simulateurs['déclaration-charges-sociales-indépendant'],
simulateurs['déclaration-revenu-indépendant'],
simulateurs['demande-mobilité'],
].map((p) => (
<Route
key={p.shortName}
path={p.path.replace(absoluteSitePaths.gérer.index, '') + '/*'}
element={
<>
{back}
<PageData />
</>
}
/>
))}
</Routes>
</TrackChapter>
</>
<Routes>
<Route index element={<PourMonEntreprise />} />
<Route
path={relativeSitePaths.assistants['pour-mon-entreprise'].entreprise}
element={<PourMonEntreprise />}
/>
</Routes>
)
}
const infereSimulateurRevenuFromSituation = (
engine: Engine<DottedName>
): keyof SimulatorData | null => {
if (
engine.evaluate('entreprise . catégorie juridique . EI . auto-entrepreneur')
.nodeValue
) {
return 'auto-entrepreneur'
}
if (
engine.evaluate('entreprise . catégorie juridique . SARL . EURL').nodeValue
) {
return 'eurl'
}
if (
engine.evaluate('entreprise . catégorie juridique . SAS . SASU').nodeValue
) {
return 'sasu'
}
if (engine.evaluate('entreprise . catégorie juridique . EI').nodeValue) {
return 'eirl'
}
if (engine.evaluate('entreprise . catégorie juridique . EI').nodeValue) {
const métierProfessionLibéral = engine.evaluate(
'dirigeant . indépendant . PL . métier'
).nodeValue
switch (métierProfessionLibéral) {
case 'avocat':
return 'avocat'
case 'expert-comptable':
return 'expert-comptable'
case 'santé . médecin':
return 'médecin'
case 'santé . chirurgien-dentiste':
return 'chirurgien-dentiste'
case 'santé . sage-femme':
return 'sage-femme'
case 'santé . auxiliaire médical':
return 'auxiliaire-médical'
case 'santé . pharmacien':
return 'pharmacien'
}
if (engine.evaluate('dirigeant . indépendant . PL').nodeValue) {
return 'profession-libérale'
}
return 'entreprise-individuelle'
}
const régimeSocial = engine.evaluate('dirigeant . régime social').nodeValue
if (régimeSocial === 'indépendant') {
return 'indépendant'
}
// TODO : assimilé-salarié
// if (
// régimeSocial === 'assimilé-salarié'
// ) {
// return 'assimilé-salarié'
// }
return null
}
function Home() {
function PourMonEntreprise() {
const { t, i18n } = useTranslation()
const dirigeantSimulateur = infereSimulateurRevenuFromSituation(useEngine())
const simulateurs = useSimulatorsData()
const { absoluteSitePaths } = useSitePaths()
const engine = useEngine()
const dispatch = useDispatch()
const engineSiren = engine.evaluate('entreprise . SIREN').nodeValue
const prevSiren = useRef(engineSiren)
const [overwrite, setOverwrite] = useState(engineSiren === undefined)
const { param, entreprise, entrepriseNotFound, entreprisePending } =
useSirenFromParams(overwrite)
const gérerPath = useGérerPath()
const gérerPath = usePourMonEntreprisePath()
const setEntreprise = useSetEntreprise()
@ -219,25 +104,25 @@ function Home() {
gérerPath &&
(param == null || (entreprise?.siren && entreprise.siren !== param))
) {
return <Navigate to={gérerPath} />
return <Navigate to={gérerPath} replace />
}
if (
(!param && !engineSiren) ||
(!engineSiren && !overwrite && prevSiren.current) ||
(param && entrepriseNotFound) ||
(entreprise && !overwrite && !engineSiren)
) {
return <Navigate to={absoluteSitePaths.index} />
return <Navigate to={'/'} />
}
return (
<>
<DefaultHelmet>
<title>{t('gérer.titre', 'Gérer mon activité')}</title>
<meta name="robots" content="noindex" />
</DefaultHelmet>
{param && param !== engineSiren && !overwrite && (
{param && engineSiren && param !== engineSiren && !overwrite && (
<PopoverOverwriteSituation
onOverwrite={() => {
dispatch(resetCompany())
@ -247,12 +132,9 @@ function Home() {
)}
<TrackPage name="accueil" />
<PageHeader
picture={growth}
titre={<Trans i18nKey="gérer.titre">Gérer mon activité</Trans>}
>
<PageHeader picture={growth}>
<Intro>
<Trans i18nKey="gérer.description">
<Trans i18nKey="pages.assistants.pour-mon-entreprise.description">
Vous souhaitez vous verser un revenu ou embaucher ? Vous aurez à
payer des cotisations et des impôts. Anticipez leurs montants grâce
aux simulateurs adaptés à votre situation.
@ -296,7 +178,7 @@ function Home() {
`}
>
<Message border={false} type="info">
<Trans i18nKey="gérer.avertissement-entreprise-non-traitée">
<Trans i18nKey="pages.assistants.pour-mon-entreprise.avertissement-entreprise-non-traitée">
<Intro>
Il n'existe pas encore de simulateur de revenu pour votre
type d'entreprise sur ce site.
@ -349,7 +231,7 @@ function Home() {
</FromTop>
)}
<Trans i18nKey="gérer.PdE">
<Trans i18nKey="pages.assistants.pour-mon-entreprise.info.PdE">
<H2>
Échanger avec le conseiller qui peut vous aider selon votre
problématique
@ -440,10 +322,10 @@ const UlInColumns = styled.ul`
}
`
export const AskCompanyMissingDetails = () => {
const AskCompanyMissingDetails = () => {
const { absoluteSitePaths } = useSitePaths()
useSimulationConfig({
path: absoluteSitePaths.gérer.index,
path: absoluteSitePaths.assistants.index,
config: configCompanyDetails,
})
@ -483,6 +365,70 @@ export const AskCompanyMissingDetails = () => {
)
}
const infereSimulateurRevenuFromSituation = (
engine: Engine<DottedName>
): keyof SimulatorData | null => {
if (
engine.evaluate('entreprise . catégorie juridique . EI . auto-entrepreneur')
.nodeValue
) {
return 'auto-entrepreneur'
}
if (
engine.evaluate('entreprise . catégorie juridique . SARL . EURL').nodeValue
) {
return 'eurl'
}
if (
engine.evaluate('entreprise . catégorie juridique . SAS . SASU').nodeValue
) {
return 'sasu'
}
if (engine.evaluate('entreprise . catégorie juridique . EI').nodeValue) {
return 'eirl'
}
if (engine.evaluate('entreprise . catégorie juridique . EI').nodeValue) {
const métierProfessionLibéral = engine.evaluate(
'dirigeant . indépendant . PL . métier'
).nodeValue
switch (métierProfessionLibéral) {
case 'avocat':
return 'avocat'
case 'expert-comptable':
return 'expert-comptable'
case 'santé . médecin':
return 'médecin'
case 'santé . chirurgien-dentiste':
return 'chirurgien-dentiste'
case 'santé . sage-femme':
return 'sage-femme'
case 'santé . auxiliaire médical':
return 'auxiliaire-médical'
case 'santé . pharmacien':
return 'pharmacien'
}
if (engine.evaluate('dirigeant . indépendant . PL').nodeValue) {
return 'profession-libérale'
}
return 'entreprise-individuelle'
}
const régimeSocial = engine.evaluate('dirigeant . régime social').nodeValue
if (régimeSocial === 'indépendant') {
return 'indépendant'
}
// TODO : assimilé-salarié
// if (
// régimeSocial === 'assimilé-salarié'
// ) {
// return 'assimilé-salarié'
// }
return null
}
const PopoverOverwriteSituation = ({
onOverwrite,
onCancel,
@ -552,16 +498,17 @@ const PopoverOverwriteSituation = ({
)
}
const useGérerPath = () => {
const usePourMonEntreprisePath = () => {
const { absoluteSitePaths } = useSitePaths()
const company = useSelector(companySituationSelector)
if (company['entreprise . SIREN']) {
const siren = (company['entreprise . SIREN'] as string).replace(/'/g, '')
return generatePath(absoluteSitePaths.gérer.entreprise, {
entreprise: siren,
})
return generatePath(
absoluteSitePaths.assistants['pour-mon-entreprise'].entreprise,
{ entreprise: siren }
)
}
return null
@ -572,27 +519,17 @@ const useSirenFromParams = (overwrite: boolean) => {
const [entreprise, setEntreprise] = useState<FabriqueSocialEntreprise | null>(
null
)
const engine = useEngine()
const engineSiren = engine.evaluate('entreprise . SIREN').nodeValue
const [entreprisePending, setEntreprisePending] = useState(false)
const [entrepriseNotFound, setEntrepriseNotFound] = useState(false)
const pass = param && param !== engineSiren && !overwrite
const once = useRef(false)
useEffect(() => {
let canceled = false
if (!param || pass || once.current) {
if (!param || !overwrite) {
return
}
once.current = true
setEntreprisePending(true)
searchDenominationOrSiren(param)
.then((entreprises) => {
if (canceled) {
return
}
setEntreprisePending(false)
if (!entreprises || !entreprises.length) {
return setEntrepriseNotFound(true)
@ -600,19 +537,12 @@ const useSirenFromParams = (overwrite: boolean) => {
setEntreprise(entreprises[0])
})
.catch((error) => {
if (canceled) {
return
}
setEntrepriseNotFound(true)
setEntreprisePending(false)
// eslint-disable-next-line no-console
console.error(error)
})
return () => {
canceled = true
}
}, [setEntreprise, param, pass])
}, [param, overwrite])
return {
param,

View File

@ -35,9 +35,12 @@ const rawSitePathsFr = {
minorityDirector: 'gérant-majoritaire-ou-minoritaire',
},
},
gérer: {
index: 'gérer',
entreprise: ':entreprise',
assistants: {
index: 'assistants',
'pour-mon-entreprise': {
index: 'pour-mon-entreprise',
entreprise: ':entreprise',
},
embaucher: 'embaucher',
sécuritéSociale: 'sécurité-sociale',
'déclaration-charges-sociales-indépendant':
@ -50,9 +53,6 @@ const rawSitePathsFr = {
cotisations: 'cotisations',
},
formulaireMobilité: 'demande-mobilité',
},
assistants: {
index: 'assistants',
'recherche-code-ape': 'recherche-code-ape',
},
simulateurs: {
@ -120,9 +120,12 @@ const rawSitePathsEn = {
minorityDirector: 'chairman-or-managing-director',
},
},
gérer: {
index: 'manage',
entreprise: ':entreprise',
assistants: {
index: 'assistants',
'pour-mon-entreprise': {
index: 'for-my-business',
entreprise: ':entreprise',
},
embaucher: 'hiring',
sécuritéSociale: 'social-security',
'déclaration-charges-sociales-indépendant':
@ -135,9 +138,6 @@ const rawSitePathsEn = {
cotisations: 'contributions',
},
formulaireMobilité: 'posting-demand',
},
assistants: {
index: 'assistants',
'recherche-code-ape': 'search-code-ape',
},
simulateurs: {