Implémente la logique de navigation

pull/2782/head
Johan Girod 2023-04-20 16:52:36 +02:00
parent b22f9d621f
commit 02b1db3a06
33 changed files with 268 additions and 2072 deletions

View File

@ -11,11 +11,6 @@ import { Grid, Spacing } from '@/design-system/layout'
import { H2, H3 } from '@/design-system/typography/heading'
import { Intro } from '@/design-system/typography/paragraphs'
import { useSitePaths } from '@/sitePaths'
import {
defineDirectorStatus,
isAutoentrepreneur,
useDispatchAndGoToNextQuestion,
} from '@/store/actions/companyStatusActions'
type SchemeComparaisonProps = {
hideAutoEntrepreneur?: boolean
@ -28,7 +23,6 @@ export default function SchemeComparaison({
}: SchemeComparaisonProps) {
const { absoluteSitePaths } = useSitePaths()
const dispatch = useDispatchAndGoToNextQuestion()
const { t } = useTranslation()
const [showMore, setShowMore] = useState(false)
@ -40,8 +34,7 @@ export default function SchemeComparaison({
<Button
key="assimiléSalarié"
onPress={() => {
dispatch(defineDirectorStatus('SALARIED'))
!hideAutoEntrepreneur && dispatch(isAutoentrepreneur(false))
/* TODO */
}}
aria-label={t(
'comparaisonRégimes.choix.AS.aria-label',
@ -57,9 +50,8 @@ export default function SchemeComparaison({
<Button
key="EI"
onPress={() => {
!hideAssimiléSalarié &&
dispatch(defineDirectorStatus('SELF_EMPLOYED'))
!hideAutoEntrepreneur && dispatch(isAutoentrepreneur(false))
/* TODO */
}}
aria-label={
hideAssimiléSalarié
@ -88,9 +80,8 @@ export default function SchemeComparaison({
<Button
key="auto-entrepreneur"
onPress={() => {
!hideAssimiléSalarié &&
dispatch(defineDirectorStatus('SELF_EMPLOYED'))
dispatch(isAutoentrepreneur(true))
/* TODO */
}}
aria-label={t(
'comparaisonRégimes.choix.auto.aria-label',

View File

@ -12,6 +12,7 @@ export {
CarretDownIcon,
ChevronIcon,
CircleIcon,
ClockIcon,
EditIcon,
ErrorIcon,
HexagonIcon,

View File

@ -12,13 +12,6 @@ export const baseParagraphStyle = css`
css`
color: ${theme.colors.extended.grey[100]};
`}
/* Hack for text color in Message component in documentation */
&& {
color: ${({ theme }) =>
theme.darkMode
? theme.colors.extended.grey[100]
: theme.colors.extended.grey[800]};
}
}
`
@ -34,10 +27,26 @@ export const Body = styled.p`
line-height: 1.5rem;
`
export const SmallBody = styled.p`
export const SmallBody = styled.p<{ grey: boolean }>`
${baseParagraphStyle}
font-size: 0.875rem;
line-height: 1.25rem;
${({ grey }) =>
grey &&
css`
color: ${({ theme }) =>
theme.darkMode
? theme.colors.extended.grey[500]
: theme.colors.extended.grey[600]};
svg {
fill: ${({ theme }) =>
theme.darkMode
? theme.colors.extended.grey[500]
: theme.colors.extended.grey[600]};
}
`}
`
export const ExtraSmallBody = styled.p`

View File

@ -1,674 +0,0 @@
import { Trans, useTranslation } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { TrackPage } from '@/components/ATInternetTracking'
import { FromBottom } from '@/components/ui/animate'
import { CheckItem, Checklist } from '@/components/ui/Checklist'
import DefaultHelmet from '@/components/utils/DefaultHelmet'
import Scroll from '@/components/utils/Scroll'
import { Button } from '@/design-system/buttons'
import { Article } from '@/design-system/card'
import { Emoji } from '@/design-system/emoji'
import { Grid, Spacing } from '@/design-system/layout'
import { H1, H2 } from '@/design-system/typography/heading'
import { Link } from '@/design-system/typography/link'
import { Li, Ul } from '@/design-system/typography/list'
import { Body, SmallBody } from '@/design-system/typography/paragraphs'
import { useSitePaths } from '@/sitePaths'
import {
checkCompanyCreationItem,
initializeCompanyCreationChecklist,
} from '@/store/actions/companyCreationChecklistActions'
import { resetCompanyStatusChoice } from '@/store/actions/companyStatusActions'
import { RootState } from '@/store/reducers/rootReducer'
import { LegalStatus } from '@/store/selectors/companyStatusSelectors'
import StatutDescription from './StatutDescription'
type CreateCompanyProps = {
statut: LegalStatus
}
export default function CreateCompany({ statut }: CreateCompanyProps) {
const { t, i18n } = useTranslation()
const { absoluteSitePaths } = useSitePaths()
const companyCreationChecklist = useSelector(
(state: RootState) => state.choixStatutJuridique.companyCreationChecklist
)
const dispatch = useDispatch()
// TODO : add this logic inside selector
const isAutoentrepreneur = statut.startsWith('auto-entrepreneur')
const multipleAssociates = ['SARL', 'SAS', 'SA'].includes(statut)
const isEI = isAutoentrepreneur || statut.startsWith('EI')
const titre = isAutoentrepreneur
? t(
'entreprise.page.autoEntrepreneur.titre',
'Devenir {{autoEntrepreneur}}',
{ autoEntrepreneur: statut }
)
: t('entreprise.page.entreprise.titre', 'Créer une {{status}}', {
status: statut,
})
return (
<FromBottom>
<TrackPage chapter2="statut" name={statut} />
<DefaultHelmet>
<title>{titre}</title>
<meta
name="description"
content={
isAutoentrepreneur
? t(
'entreprise.page.autoEntrepreneur.description',
'La liste complète des démarches à faire pour devenir {{autoEntrepreneur}}.',
{ autoEntrepreneur: statut }
)
: t(
'entreprise.page.description',
"La liste complète des démarches à faire pour créer une {{statut}} auprès de l'administration française.",
{ statut }
)
}
/>
</DefaultHelmet>
<Scroll.toTop />
<Link
to={absoluteSitePaths.assistants['choix-du-statut'].index}
onPress={() => {
dispatch(resetCompanyStatusChoice())
}}
>
<span aria-hidden></span>
<Trans i18nKey="entreprise.retour">Choisir un autre statut</Trans>
</Link>
<H1>{titre}</H1>
<Body>
<StatutDescription statut={statut} />
</Body>
<H2>
<Trans i18nKey="entreprise.tâches.titre">
À faire pour créer votre entreprise
</Trans>{' '}
<Emoji emoji="📋" />
</H2>
<Body>
<Trans i18nKey="entreprise.tâches.avancement">
Utilisez cette liste pour suivre votre avancement dans les démarches.
Votre progression est automatiquement sauvegardée dans votre
navigateur.
</Trans>
</Body>
<Checklist
key={statut}
onInitialization={(items) =>
dispatch(initializeCompanyCreationChecklist(statut, items))
}
onItemCheck={(name, isChecked) =>
dispatch(checkCompanyCreationItem(name, isChecked))
}
defaultChecked={companyCreationChecklist}
>
<CheckItem
name="legalStatus"
defaultChecked={true}
title={t(
'entreprise.tâches.formeJuridique.titre',
'Choisir la forme juridique'
)}
/>
{!isEI && (
<CheckItem
name="corporateName"
title={t(
'entreprise.tâches.nom.titre',
"Trouver un nom d'entreprise"
)}
explanations={
<Trans i18nKey="entreprise.tâches.nom.description">
<SmallBody>
<strong>La dénomination sociale</strong> est le nom de votre
entreprise aux yeux de la loi, écrit sur tous vos documents
administratifs. Il peut être différent de votre nom
commercial.
</SmallBody>
<SmallBody>
Il est conseillé de vérifier que le nom est disponible,
c'est-à-dire qu'il ne porte pas atteinte à un nom déjà protégé
par une marque, une raison sociale, un nom commercial, un nom
de domaine Internet, etc. Vous pouvez vérifier dans la base de
données{' '}
<Link
href="https://bases-marques.inpi.fr/"
aria-label="INPI, accéder à la base données de marques de l'INPI, nouvelle fenêtre"
>
INPI
</Link>
.
</SmallBody>
</Trans>
}
/>
)}
<CheckItem
name="corporatePurpose"
title={t(
'entreprise.tâches.objetSocial.titre',
"Déterminer l'objet social"
)}
explanations={
<SmallBody>
<Trans i18nKey="entreprise.tâches.objetSocial.description">
L'
<strong>objet social</strong> est l'activité principale de
l'entreprise. Une activité secondaire peut être enregistrée.
</Trans>
</SmallBody>
}
/>
{!isAutoentrepreneur && (
<CheckItem
name="companyAddress"
title={t(
'entreprise.tâches.adresse.titre',
'Choisir une adresse pour le siège'
)}
explanations={
<Trans i18nKey="entreprise.tâches.adresse.description">
<SmallBody>
<strong>L'adresse</strong> est l'espace physique où votre
entreprise sera incorporée. Dans certains lieux et certaines
situations, vous pouvez bénéficier d'un financement public
important (exonération de charges, de taxes, etc.).{' '}
<Link
href="https://www.service-public.fr/professionnels-entreprises/vosdroits/F2160"
aria-label="Plus d'infos, voir plus d'informations sur service-public.fr, nouvelle fenêtre"
>
Plus d'infos
</Link>
</SmallBody>
</Trans>
}
/>
)}
{!isEI && (
<CheckItem
name="statut"
title={t('entreprise.tâches.statuts.titre', 'Écrire les statuts')}
explanations={
<SmallBody>
<Trans i18nKey="entreprise.tâches.statuts.description">
Il s'agit d'un document officiel qui intègre la forme
juridique, nomme les associés et leurs contributions au
capital.{' '}
<span
style={{
display: multipleAssociates ? 'visible' : 'none',
}}
>
Dans le cas d'une création d'entreprise avec plusieurs
associés, il est recommandé de faire appel à un juriste pour
les rédiger.{' '}
</span>
</Trans>
{['SARL', 'EURL'].includes(statut) && (
<StatutsExample statut={statut} />
)}
</SmallBody>
}
/>
)}
<CheckItem
name="openBankAccount"
title={t(
'entreprise.tâches.banque.titre',
'Ouvrir un compte bancaire'
)}
explanations={
<>
<SmallBody>
<Trans i18nKey="entreprise.tâches.banque.description.1">
Le but d'un <strong>compte bancaire d'entreprise</strong> est
de séparer les actifs de l'entreprise des vôtres.
</Trans>{' '}
{statut === 'EI' && (
<Trans i18nKey="entreprise.tâches.banque.description.EI">
Si son ouverture n'est pas obligatoire pour une entreprise
individuelle, elle reste fortement recommandée.{' '}
</Trans>
)}
<Trans i18nKey="entreprise.tâches.banque.description.2">
Le compte d'entreprise vous permet de :
</Trans>
</SmallBody>
<Ul size="XS">
<Trans i18nKey="entreprise.tâches.banque.description.liste">
<Li>
Différencier vos opérations privées et professionnelles
</Li>
<Li>Faciliter les déclarations fiscales</Li>
</Trans>
</Ul>
</>
}
/>
{!isEI && (
<CheckItem
name="fundsDeposit"
title={t('entreprise.tâches.capital.titre', 'Déposer le capital')}
explanations={
<Trans i18nKey="entreprise.tâches.capital.description">
<SmallBody>
Le <strong>dépôt du capital social</strong> doit être fait au
moment de la constitution d'une société par une personne
agissant au nom de la société et ayant reçu des apports en
numéraire (somme d'argent) de la part des créanciers de la
société (actionnaire ou associé).
</SmallBody>
<SmallBody>
Le dépôt consiste en un transfert d'une somme d'argent sur un
compte bloqué auprès d'une banque ou de la{' '}
<Link
href="https://consignations.caissedesdepots.fr/entreprise/creer-votre-entreprise/creation-dentreprise-deposez-votre-capital-social"
aria-label="Caisse des dépôts et consignations, en savoir plus sur consignations.caissedesdepots.fr, nouvelle fenêtre"
>
Caisse des dépôts et consignations
</Link>{' '}
ou d'un notaire, qui doit alors fournir un certificat de dépôt
du capital.
</SmallBody>
</Trans>
}
/>
)}
{statut.includes('EIRL') && (
<CheckItem
name="declarationOfAssignement"
title={t(
'entreprise.tâches.affectation.titre',
"Effectuer une déclaration d'affectation de patrimoine"
)}
explanations={
<Trans i18nKey="entreprise.tâches.affectation.description">
<SmallBody>
La <strong>déclaration d'affectation du patrimoine</strong>{' '}
permet de séparer le patrimoine professionnel de votre
patrimoine personnel, qui devient alors insaisissable. Cette
démarche est gratuite si elle est effectué au moment de la
création d'entreprise.
</SmallBody>
<SmallBody>
Pour cela, il suffit simplement de déclarer quelles biens sont
affectés au patrimoine de votre entreprise. Tous les apports
nécessaires à votre activité professionnelle doivent y figurer
(par exemple : fond de commerce, marque, brevet, ou encore
matériel professionnel). Vous pouvez vous charger vous-même de
l'évaluation de la valeur du bien si celle ci ne dépasse pas
les 30 000 .
</SmallBody>
<SmallBody>
<Link
href="https://www.service-public.fr/professionnels-entreprises/vosdroits/F31538"
aria-label="Plus d'infos, voir plus d'informations sur service-public.fr, nouvelle fenêtre"
>
Plus d'informations
</Link>
</SmallBody>
</Trans>
}
/>
)}
{!isEI && (
<CheckItem
title={t(
'entreprise.tâches.journal.titre',
'Publier une annonce de création dans un journal'
)}
name="publishCreationNotice"
explanations={
<Trans i18nKey="entreprise.tâches.journal.description">
<SmallBody>
Vous devez publier la création de votre entreprise dans un
journal d'annonces légales (« JAL »), pour un coût de
publication qui dépend du volume de l'annonce et des tarifs
pratiqués par le journal choisi{' '}
</SmallBody>
<SmallBody>
<Link
href="https://actulegales.fr/journaux-annonces-legales"
aria-label="Trouver un journal d'annonces légales (JAL), nouvelle fenêtre"
>
Trouver un journal d'annonces légales (JAL)
</Link>
</SmallBody>
<SmallBody>
Cette annonce doit contenir les informations suivantes :{' '}
</SmallBody>
<Ul size="XS">
<Li>Le nom de l'entreprise et éventuellement son acronyme</Li>
<Li>La forme juridique</Li>
<Li>Le capital de l'entreprise</Li>
<Li>L'adresse du siège</Li>
<Li>L'objet social</Li>
<Li>La durée de l'entreprise</Li>
<Li>
Les noms, prénoms et adresses des dirigeants et des
personnes ayant le pouvoir d'engager la société envers les
tiers
</Li>
<Li>
Le lieu et le numéro du RCS auprès duquel la société est
immatriculée
</Li>
</Ul>
</Trans>
}
/>
)}
<CheckItem
name="registerCompanyOnline"
title={t(
'entreprise.tâches.formulaire.titre',
'Créer mon entreprise en ligne'
)}
explanations={
<Trans i18nKey="entreprise.tâches.formulaire.description">
<SmallBody>
Vous pouvez faire votre inscription en ligne à tout moment,
l'enregistrer et y revenir comme vous le souhaitez.
</SmallBody>
<Spacing lg />
<Button
href={
isAutoentrepreneur
? 'https://www.autoentrepreneur.urssaf.fr/portail/accueil/creer-mon-auto-entreprise.html'
: 'https://formalites.entreprises.gouv.fr/'
}
>
Faire la démarche en ligne
</Button>
</Trans>
}
/>
</Checklist>
<H2>
<Trans i18nKey="entreprise.tâches.titre2">
Recommandé avant le début de l'activité
</Trans>{' '}
<Emoji emoji="💭" />
</H2>
<Checklist>
{!isAutoentrepreneur && (
<CheckItem
name="chooseCertifiedAccountant"
title={t(
'entreprise.tâches.comptable.titre',
'Choisir un expert-comptable'
)}
explanations={
<SmallBody>
<Trans i18nKey="entreprise.tâches.comptable.description">
La gestion d'une entreprise impose un certain nombre d'
<Link
href="https://www.economie.gouv.fr/entreprises/obligations-comptables"
aria-label="obligations comptables, voir le détail sur economie.gouv.fr, nouvelle fenêtre"
>
obligations comptables
</Link>
. Il est conseillé de faire appel aux services d'un
expert-comptable ou d'un logiciel de comptabilité en ligne.
</Trans>
</SmallBody>
}
/>
)}
<CheckItem
name="checkoutProfessionalAssuranceNeeds"
title={t(
'entreprise.tâches.assurance.titre',
'Juger de la nécessité de prendre une assurance'
)}
explanations={
<Trans i18nKey="entreprise.tâches.assurance.description">
<SmallBody>
Une PME ou un travailleur indépendant doit se protéger contre
les principaux risques auxquels il est exposé et souscrire des
contrats de garantie. Qu'elle soit locataire ou propriétaire de
ses murs, l'entreprise doit assurer ses immeubles, son matériel
professionnel, ses biens, ses matières premières, ses véhicules,
ainsi qu'en matière de responsabilité civile de l'entreprise et
de ses dirigeants ou en matière de perte d'exploitation.
</SmallBody>
<Link
href="https://www.economie.gouv.fr/entreprises/assurances-obligatoires"
aria-label="Plus d'infos, voir plus d'informations sur economie.gouv.fr, nouvelle fenêtre"
>
Plus d'infos
</Link>
</Trans>
}
/>
</Checklist>
<H2>
<Trans i18nKey="common.useful-resources">Ressources utiles</Trans>{' '}
<Emoji emoji="🧰" />
</H2>
<Grid container role="list">
{isAutoentrepreneur && (
<Grid item xs={12} sm={6} lg={4} role="listitem">
<Article
title={
<h3>
{t(
'entreprise.ressources.simu.autoEntrepreneur.title',
'Simulateur de revenus auto-entrepreneur'
)}
</h3>
}
to={{
pathname: absoluteSitePaths.simulateurs['auto-entrepreneur'],
}}
state={{ fromCréer: true }}
ctaLabel={t(
'entreprise.ressources.simu.autoEntrepreneur.cta',
'Simuler les revenus'
)}
aria-label={t(
'entreprise.ressources.simu.autoEntrepreneur.aria-label',
'Auto-entrepreneur, simuler mes revenus'
)}
>
<Trans i18nKey="entreprise.ressources.simu.autoEntrepreneur.body">
Simuler le montant de vos cotisations sociales et de votre impôt
et estimez votre futur revenu net.
</Trans>
</Article>
</Grid>
)}
{['EI', 'EIRL', 'EURL'].includes(statut) && (
<Grid item xs={12} sm={6} lg={4} role="listitem">
<Article
title={
<h3>
{t(
'entreprise.ressources.simu.indépendant.title',
'Simulateur de cotisations indépendant'
)}
</h3>
}
to={{ pathname: absoluteSitePaths.simulateurs.indépendant }}
state={{ fromCréer: true }}
ctaLabel={t(
'entreprise.ressources.simu.indépendant.cta',
'Simuler les cotisations'
)}
aria-label={t(
'entreprise.ressources.simu.indépendant.aria-label',
'Indépendant, simuler mes revenus'
)}
>
<Trans i18nKey="entreprise.ressources.simu.indépendant.body">
Simuler le montant de vos cotisations sociales pour bien
préparer votre business plan.
</Trans>
</Article>
</Grid>
)}
{['SAS', 'SASU'].includes(statut) && (
<Grid item xs={12} sm={6} lg={4} role="listitem">
<Article
title={
<h3>
{t(
'entreprise.ressources.simu.assimilé.title',
'Simulateur de rémunération pour dirigeant de SASU'
)}
</h3>
}
to={{ pathname: absoluteSitePaths.simulateurs.sasu }}
state={{ fromCréer: true }}
ctaLabel={t(
'entreprise.ressources.simu.assimilé.cta',
'Simuler la rémunération'
)}
aria-label={t(
'entreprise.ressources.simu.assimilé.aria-label',
'SASU, simuler la rémunération'
)}
>
<Trans i18nKey="entreprise.ressources.simu.assimilé.body">
Simuler le montant de vos cotisations sociales pour bien
préparer votre business plan.
</Trans>
</Article>
</Grid>
)}
<Grid item xs={12} sm={6} lg={4} role="listitem">
<Article
title={
<h3>
<Trans i18nKey="entreprise.ressources.après.title">
Après la création
</Trans>
</h3>
}
to={absoluteSitePaths.assistants['choix-du-statut'].après}
ctaLabel={t('entreprise.ressources.après.cta', 'Voir le glossaire')}
aria-label={t(
'entreprise.ressources.après.aria-label',
'Après la création, voir le glossaire'
)}
>
<Trans i18nKey="entreprise.ressources.après.body">
SIREN, SIRET, code APE, KBis. Un petit glossaire des termes que
vous pourrez (éventuellement) rencontrer après la création.
</Trans>
</Article>
</Grid>
{i18n.language === 'fr' && isAutoentrepreneur && (
<Grid item xs={12} sm={6} lg={4} role="listitem">
<Article
title={<h3>Guide pratique Urssaf</h3>}
href="https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/UrssafAutoEntrepreneurMetro.pdf"
ctaLabel="Consulter le guide Urssaf"
>
Des conseils pour les auto-entrepreneurs : comment préparer son
projet pour se lancer dans la création et une présentation
détaillée de votre protection sociale.
</Article>
</Grid>
)}
{isAutoentrepreneur && (
<Grid item xs={12} sm={6} lg={4} role="listitem">
<FAQAutoEntrepreneurArticle />
</Grid>
)}
{i18n.language === 'fr' && ['EI', 'EIRL', 'EURL'].includes(statut) && (
<Grid item xs={12} sm={6} lg={4} role="listitem">
<Article
title={<h3>Guide Urssaf pour les travailleur indépendant</h3>}
href="https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf"
ctaLabel="Consulter le guide Urssaf"
aria-label="Travailleurs indépendants, consulter le guide Urssaf"
>
Des conseils sur comment préparer son projet pour se lancer dans
la création et une présentation détaillée de votre protection
sociale.
</Article>
</Grid>
)}
</Grid>
</FromBottom>
)
}
type StatutsExampleProps = {
statut: string
}
const StatutsExample = ({ statut }: StatutsExampleProps) => {
const { t } = useTranslation()
const links = {
SARL: 'https://bpifrance-creation.fr/file/109068/download?token=rmc93Ve3',
EURL: 'https://bpifrance-creation.fr/file/109070/download?token=Ul-rT6Z0',
}
if (!(statut in links)) {
return null
}
return (
<Link
href={links[statut as keyof typeof links]}
aria-label={t(
'entreprise.tâches.statuts.aria-label',
'Exemples de status pour votre {{statut}}, nouvelle fenêtre',
{ statut }
)}
>
<Trans i18nKey="entreprise.tâches.statuts.exemple">
Exemple de statuts pour votre
</Trans>{' '}
{statut}
</Link>
)
}
export const FAQAutoEntrepreneurArticle = () => {
const { t } = useTranslation()
return (
<Article
title={
<h3>
{t(
'pages.common.ressources-auto-entrepreneur.FAQ.title',
'Questions fréquentes'
)}{' '}
<Emoji emoji="❓" />
</h3>
}
href="https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html"
ctaLabel={t(
'pages.common.ressources-auto-entrepreneur.FAQ.cta',
'Voir les réponses'
)}
>
<Trans i18nKey="pages.common.ressources-auto-entrepreneur.FAQ.body">
Une liste exhaustive et maintenue à jour de toutes les questions
fréquentes (et moins fréquentes) que l'on est amené à poser en tant
qu'auto-entrepreneur
</Trans>
</Article>
)
}

View File

@ -1,69 +0,0 @@
import { Trans, useTranslation } from 'react-i18next'
import { TrackPage } from '@/components/ATInternetTracking'
import SchemeComparaison from '@/components/SchemeComparaison'
import DefaultHelmet from '@/components/utils/DefaultHelmet'
import { H2 } from '@/design-system/typography/heading'
import { Link } from '@/design-system/typography/link'
import { Body } from '@/design-system/typography/paragraphs'
export default function Autoentrepreneur() {
const { t } = useTranslation()
return (
<>
<TrackPage name="auto-entrepreneur_ou_independant" />
<DefaultHelmet>
<title>
{t(
'autoentrepreneur.page.titre',
'Choisir entre auto-entrepreneur et entreprise individuelle - Mon entreprise'
)}
</title>
<meta
name="description"
content={t(
'autoentrepreneur.page.description',
"Un auto-entrepreneur bénéficie d'un système simplifié de déclaration et de paiement, pour lesquelles les impôts et cotisations sociales sont basés sur le chiffre d'affaires réalisé chaque mois. C'est un choix intéressant si vous n'avez pas besoin de beaucoup de capital et que vous souhaitez démarrer rapidement."
)}
/>
</DefaultHelmet>
<H2>
<Trans i18nKey="autoentrepreneur.titre">
Entreprise individuelle ou auto-entrepreneur
</Trans>
</H2>
<Trans i18nKey="autoentrepreneur.description">
<Body>
À la différence de l'entreprise individuelle, l'auto-entrepreneur
bénéficie d'un régime simplifié de déclaration et de paiement : les
cotisations sociales et l'impôt sur le revenu sont calculés sur le
chiffre d'affaires encaissé.
</Body>
<Body>
<strong>Note</strong> : Certaines activités sont exclues de ce statut
(
<Link
href="https://www.afecreation.fr/pid10375/pour-quelles-activites.html#principales-exclusions"
aria-label={t('voir la liste sur afecreation.fr, nouvelle fenêtre')}
>
{' '}
voir la liste
</Link>
). Certaines activités sont réglementées avec une qualification ou une
expérience professionnelle (
<Link
href="https://www.afecreation.fr/pid316/activites-reglementees.html"
aria-label={t('voir la liste sur afecreation.fr, nouvelle fenêtre')}
>
voir la liste
</Link>
).
</Body>
</Trans>
<div>
<SchemeComparaison hideAssimiléSalarié />
</div>
</>
)
}

View File

@ -1,44 +0,0 @@
import { Trans, useTranslation } from 'react-i18next'
import { TrackPage } from '@/components/ATInternetTracking'
import SchemeComparaison from '@/components/SchemeComparaison'
import DefaultHelmet from '@/components/utils/DefaultHelmet'
import { H2 } from '@/design-system/typography/heading'
import { Body } from '@/design-system/typography/paragraphs'
export default function DefineDirectorStatus() {
const { t } = useTranslation()
return (
<>
<TrackPage name="independant_ou_assimile-salarie" />
<DefaultHelmet>
<title>
{t('statut du dirigeant.titre', 'Définir le statut du dirigeant')}
</title>
<meta
name="description"
content={t(
'statut du dirigeant.page.description',
"Ce choix est important parce qu'il détermine le régime de sécurité sociale et la couverture sociale de l'administrateur. Chaque option a des implications juridiques et conduit à un statut différent lors de la création de votre entreprise."
)}
/>
</DefaultHelmet>
<H2>
<Trans i18nKey="statut du dirigeant.titre">
Définir le statut du dirigeant
</Trans>
</H2>
<Trans i18nKey="statut du dirigeant.description">
<Body>
Ce choix est important car il détermine le régime de sécurité sociale
et la couverture sociale du dirigeant. Le montant et les modalités de
paiement des cotisations sociales sont également impactés.
</Body>
<div>
<SchemeComparaison hideAutoEntrepreneur />
</div>
</Trans>
</>
)
}

View File

@ -1,86 +0,0 @@
import { Trans, useTranslation } from 'react-i18next'
import { TrackPage } from '@/components/ATInternetTracking'
import DefaultHelmet from '@/components/utils/DefaultHelmet'
import AnswerGroup from '@/design-system/answer-group'
import { Button } from '@/design-system/buttons'
import { H2 } from '@/design-system/typography/heading'
import { Li, Ul } from '@/design-system/typography/list'
import { Body } from '@/design-system/typography/paragraphs'
import {
directorIsInAMinority,
useDispatchAndGoToNextQuestion,
} from '@/store/actions/companyStatusActions'
export default function MinorityDirector() {
const { t } = useTranslation()
const dispatch = useDispatchAndGoToNextQuestion()
return (
<>
<TrackPage name="majoritaire_ou_minoritaire" />
<DefaultHelmet>
<title>
{t(
'gérant minoritaire.page.titre',
'Gérant majoritaire ou minoritaire'
)}{' '}
</title>
<meta
name="description"
content={t(
'gérant minoritaire.page.description',
"Certaines règles particulières s'appliquent en fonction du nombre d'actions détenues par l'administrateur, ce qui peut conduire à un statut différent lors de la création de votre société"
)}
/>
</DefaultHelmet>
<H2>
<Trans i18nKey="gérant minoritaire.titre">
Gérant majoritaire ou minoritaire
</Trans>{' '}
</H2>
<Trans i18nKey="gérant minoritaire.description">
<Body>
Certaines règles spéciales s'appliquent selon le nombre d'actions
détenues.
</Body>
<Ul>
<Li>
<strong>Gérant majoritaire</strong> : Vous êtes l'administrateur
majoritaire (ou faite partie d'un conseil d'administration
majoritaire).
</Li>
<Li>
<strong>Gérant minoritaire</strong> : Vous êtes administrateur
minoritaire ou égalitaire (ou faites partie d'un conseil
d'administration minoritaire ou égalitaire).
</Li>
</Ul>
</Trans>
<AnswerGroup role="list">
<Button
onPress={() => {
dispatch(directorIsInAMinority(false))
}}
aria-label={t(
"Gérant majoritaire, sélectionner l'option et passer à l'étape suivante"
)}
>
<Trans>Gérant majoritaire</Trans>
</Button>
<Button
key="director-minority-true"
onPress={() => {
dispatch(directorIsInAMinority(true))
}}
aria-label={t(
"Gérant minoritaire ou égalitaire, sélectionner l'option et passer à l'étape suivante"
)}
>
<Trans>Gérant minoritaire ou égalitaire</Trans>
</Button>
</AnswerGroup>
</>
)
}

View File

@ -1,78 +0,0 @@
import { Trans, useTranslation } from 'react-i18next'
import { TrackPage } from '@/components/ATInternetTracking'
import DefaultHelmet from '@/components/utils/DefaultHelmet'
import AnswerGroup from '@/design-system/answer-group'
import { Button } from '@/design-system/buttons'
import { H2 } from '@/design-system/typography/heading'
import { Body, SmallBody } from '@/design-system/typography/paragraphs'
import {
companyHasMultipleAssociates,
useDispatchAndGoToNextQuestion,
} from '@/store/actions/companyStatusActions'
export default function NumberOfAssociates() {
const dispatch = useDispatchAndGoToNextQuestion()
const { t } = useTranslation()
return (
<>
<TrackPage name="seul_ou_plusieurs" />
<DefaultHelmet>
<title>
{t(
'associés.page.titre',
"Nombre d'associés pour créer une entreprise"
)}
</title>
<meta
name="description"
content={t(
'associés.page.description',
"Découvrez quels status choisir en fonction du nombre d'associés participant à la création de l'entreprise."
)}
/>
</DefaultHelmet>
<H2>
<Trans i18nKey="associés.titre">Seul ou à plusieurs</Trans>
</H2>
<Trans i18nKey="associés.description">
<Body>
Une entreprise avec un seul associé est plus simple à créer et gérer.
Un associé peut-être une personne physique (un individu) ou une
personne morale (par exemple une société).
</Body>
<SmallBody>
Note : ce choix n'est pas définitif. Vous pouvez tout à fait commencer
votre société seul, et accueillir de nouveaux associés au cours de
votre développement.
</SmallBody>
</Trans>
<AnswerGroup role="list">
<Button
onPress={() => {
dispatch(companyHasMultipleAssociates(false))
}}
aria-label={t(
'associés.choix1-aria-label',
"Seul, sélectionner l'option et passer à l'étape suivante"
)}
>
<Trans i18nKey="associés.choix1">Seul</Trans>
</Button>
<Button
onPress={() => {
dispatch(companyHasMultipleAssociates(true))
}}
aria-label={t(
'associés.choix2-aria-label',
"Plusieurs personnes, sélectionner l'option et passer à l'étape suivante"
)}
>
<Trans i18nKey="associés.choix2">Plusieurs personnes</Trans>
</Button>
</AnswerGroup>
</>
)
}

View File

@ -1,133 +0,0 @@
import { Fragment } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import { TrackPage } from '@/components/ATInternetTracking'
import DefaultHelmet from '@/components/utils/DefaultHelmet'
import { Button } from '@/design-system/buttons'
import { H2, H3 } from '@/design-system/typography/heading'
import { Body } from '@/design-system/typography/paragraphs'
import { useSitePaths } from '@/sitePaths'
import {
LegalStatus,
possibleStatusSelector,
} from '@/store/selectors/companyStatusSelectors'
import StatutDescription from '../StatutDescription'
type StatutButtonProps = {
statut: LegalStatus
}
const StatutButton = ({ statut }: StatutButtonProps) => {
const { absoluteSitePaths } = useSitePaths()
return (
<Button
to={absoluteSitePaths.assistants['choix-du-statut'][statut]}
light
size="XS"
>
<>
{statut.includes('auto-entrepreneur') ? (
<Trans>Devenir</Trans>
) : (
<Trans>Créer une</Trans>
)}{' '}
{statut}
</>
</Button>
)
}
type StatutTitleProps = {
statut: LegalStatus
language: string
}
const StatutTitle = ({ statut, language }: StatutTitleProps) =>
statut === 'EI' ? (
<>
Entreprise individuelle {language !== 'fr' && '(Individual business)'}:{' '}
</>
) : statut === 'EIRL' ? (
<>
Entrepreneur individuel à responsabilité limitée{' '}
{language !== 'fr' && '(Individual entrepreneur with limited liability)'}:{' '}
</>
) : statut === 'EURL' ? (
<>
EURL - Entreprise unipersonnelle à responsabilité limitée{' '}
{language !== 'fr' && '(Limited personal company)'}:{' '}
</>
) : statut === 'SARL' ? (
<>
SARL - Société à responsabilité limitée{' '}
{language !== 'fr' && '(Limited corporation)'}:{' '}
</>
) : statut === 'SAS' ? (
<>
SAS - Société par actions simplifiées{' '}
{language !== 'fr' && '(Simplified joint stock company)'}:{' '}
</>
) : statut === 'SASU' ? (
<>
SASU - Société par action simplifiée unipersonnelle{' '}
{language !== 'fr' && '(Simplified personal joint stock company)'}:{' '}
</>
) : statut === 'SA' ? (
<>SA - Société anonyme {language !== 'fr' && '(Anonymous company)'}: </>
) : (statut as string) === 'SNC' ? (
<>SNC - Société en nom collectif {language !== 'fr' && '(Partnership)'}: </>
) : statut === 'auto-entrepreneur' ? (
<>
<Trans>Auto-entrepreneur</Trans>
{language === 'fr' && ' '}:{' '}
</>
) : statut === 'auto-entrepreneur-EIRL' ? (
<>
<Trans>Auto-entrepreneur en EIRL</Trans>
{language === 'fr' && ' '}
{':'}
</>
) : null
export default function SetMainStatus() {
const { t, i18n } = useTranslation()
const possibleStatus = useSelector(possibleStatusSelector)
return (
<>
<TrackPage chapter2="statut" name="liste" />
<DefaultHelmet>
<title>
{t(
'listeformejuridique.page.titre',
'Liste des statuts juridiques pour la création de votre entreprise'
)}
</title>
</DefaultHelmet>
<H2>
{Object.keys(possibleStatus).every(Boolean) ? (
<Trans>Liste des statuts juridiques</Trans>
) : (
<Trans>Votre forme juridique</Trans>
)}
</H2>
{(Object.entries(possibleStatus) as [LegalStatus, boolean][])
.filter(([, v]) => Boolean(v))
.map(([statut]) => (
<Fragment key={statut}>
<H3>
<StatutTitle statut={statut} language={i18n.language} />
</H3>
<Body>
<StatutDescription statut={statut} />
</Body>
<StatutButton statut={statut} />
</Fragment>
))}
</>
)
}

View File

@ -1,132 +0,0 @@
import { Trans, useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import { useLocation } from 'react-router-dom'
import styled from 'styled-components'
import { Link } from '@/design-system/typography/link'
import { useSitePaths } from '@/sitePaths'
import { RootState } from '@/store/reducers/rootReducer'
import { LegalStatusRequirements } from '@/types/companyTypes'
interface RequirementToTextType {
props: {
children: string
}
}
const requirementToText = (
key: keyof LegalStatusRequirements,
value: string
) => {
switch (key) {
case 'multipleAssociates':
return value ? (
<Trans>Plusieurs associés</Trans>
) : (
<Trans>Un seul associé</Trans>
)
case 'soleProprietorship':
return value ? (
<Trans i18nKey="responsabilité.bouton2">Entreprise individuelle</Trans>
) : (
<Trans i18nKey="responsabilité.bouton1">Société</Trans>
)
case 'directorStatus':
return value === 'SELF_EMPLOYED' ? (
<Trans>Indépendant</Trans>
) : (
<Trans>Assimilé salarié</Trans>
)
case 'autoEntrepreneur':
return value ? (
<Trans>Auto-entrepreneur</Trans>
) : (
<Trans>Pas en auto-entrepreneur</Trans>
)
case 'minorityDirector':
return value ? (
<Trans>Gérant minoritaire</Trans>
) : (
<Trans>Gérant majoritaire</Trans>
)
}
}
const PreviousAnswersList = styled.nav`
font-family: ${({ theme }) => theme.fonts.main};
display: flex;
list-style-type: none;
z-index: 2;
position: relative;
padding: 0;
margin-bottom: -1rem;
`
const PreviousAnswersItem = styled.li`
padding-right: 0.5rem;
&:after {
content: '>';
padding-left: 0.5rem;
}
`
export default function PreviousAnswers() {
const location = useLocation()
const { absoluteSitePaths } = useSitePaths()
const legalStatus = useSelector(
(state: RootState) => state.choixStatutJuridique.companyLegalStatus
)
const { t } = useTranslation()
if (Object.values(legalStatus).length < 1) {
return null
}
return (
<PreviousAnswersList aria-label={t('Étapes du choix du statut juridique')}>
{Object.entries(legalStatus).map(([key, value]) => {
const textObject = requirementToText(
key as keyof LegalStatusRequirements,
value as string
)
const isCurrent =
decodeURI(location.pathname) ===
absoluteSitePaths.assistants['choix-du-statut'].guideStatut[
key as keyof typeof legalStatus
]
return (
value !== undefined && (
<PreviousAnswersItem
key={key}
aria-current={isCurrent ? 'step' : undefined}
>
<Link
to={
absoluteSitePaths.assistants['choix-du-statut'].guideStatut[
key as keyof typeof legalStatus
]
}
aria-label={
(isCurrent
? t("Aller à l'étape actuelle :")
: t("Revenir à l'étape")) +
' ' +
(textObject as RequirementToTextType)?.props?.children || ''
}
style={
isCurrent
? { textDecoration: 'underline' }
: { textDecoration: 'none' }
}
>
{textObject}
</Link>
</PreviousAnswersItem>
)
)
})}
</PreviousAnswersList>
)
}

View File

@ -1,104 +0,0 @@
import { Trans, useTranslation } from 'react-i18next'
import { TrackPage } from '@/components/ATInternetTracking'
import DefaultHelmet from '@/components/utils/DefaultHelmet'
import AnswerGroup from '@/design-system/answer-group'
import { Button } from '@/design-system/buttons'
import { H2 } from '@/design-system/typography/heading'
import { Li, Ul } from '@/design-system/typography/list'
import { Body } from '@/design-system/typography/paragraphs'
import {
isSoleProprietorship,
useDispatchAndGoToNextQuestion,
} from '@/store/actions/companyStatusActions'
export default function SoleProprietorship() {
const dispatch = useDispatchAndGoToNextQuestion()
const { t } = useTranslation()
return (
<>
<TrackPage name="societe_ou_entreprise_individuelle" />
<DefaultHelmet>
<title>
{t(
'responsabilité.page.titre',
'Choisir entre société ou entreprise individuelle'
)}
</title>
<meta
name="description"
content={t(
'responsabilité.description',
'Responsabilité limitée ? entreprise individuelle ? Chaque option a des implications juridiques et conduit à un statut différent pour la création de votre entreprise en France. Ce guide vous aide à choisir entre les différentes forme de responsabilité.'
)}
/>
</DefaultHelmet>
<H2>
<Trans i18nKey="responsabilité.titre">
Entreprise individuelle ou société ?
</Trans>
</H2>
<Body>
<Trans i18nKey="responsabilité.intro">
Ce choix determine votre degré de responsabilité et votre capacité à
accueillir de nouveaux associés dans le futur{' '}
</Trans>
:
</Body>
<Ul>
<Li>
<Trans i18nKey="responsabilité.entreprise-individuelle">
<strong>Entreprise individuelle : </strong>
Une activité économique exercée par une seule personne physique, en
son nom propre. Moins de formalités, mais plus de risques en cas de
faillite, car votre patrimoine personnel peut être mis à
contribution.{' '}
<strong>
Vous ne pouvez pas accueillir de nouveaux associés en entreprise
individuelle.
</strong>
</Trans>
</Li>
<Li>
<Trans i18nKey="responsabilité.société">
<strong>Société : </strong>
Vous ne pouvez pas être tenu personnellement responsable des dettes
ou obligations de la société. En revanche, les démarches de création
sont un peu plus lourdes, puisqu'elles incluent notamment la
rédaction de statuts et le dépôt d'un capital.
</Trans>
</Li>
</Ul>
<AnswerGroup role="list">
<Button
onPress={() => {
dispatch(isSoleProprietorship(true))
}}
aria-label={t(
'responsabilité.bouton2-aria-label',
"Entreprise individuelle, sélectionner l'option et passer à l'étape suivante"
)}
>
<Trans i18nKey="responsabilité.bouton2">
Entreprise individuelle
</Trans>
</Button>
<Button
onPress={() => {
dispatch(isSoleProprietorship(false))
}}
aria-label={t(
'responsabilité.bouton1-aria-label',
"Société, sélectionner l'option et passer à l'étape suivante"
)}
>
<Trans i18nKey="responsabilité.bouton1">Société</Trans>
</Button>
</AnswerGroup>
{/* this is an economic activity conducted by a single natural person, in his own name ; */}
{/* Company : This is an economic activity conducted by a single partner - single member company with limited liability (EURL) - or several partners (limited liability company (SARL), public limited company (SA), simplified joint-stock company (SAS)...). */}
</>
)
}

View File

@ -1,132 +0,0 @@
import { useEffect } from 'react'
import { Trans } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { Navigate, Route, Routes, useLocation } from 'react-router-dom'
import { TrackChapter } from '@/components/ATInternetTracking'
import { FromBottom } from '@/components/ui/animate'
import { H1 } from '@/design-system/typography/heading'
import { Link } from '@/design-system/typography/link'
import { useSitePaths } from '@/sitePaths'
import { resetCompanyStatusChoice } from '@/store/actions/companyStatusActions'
import { RootState } from '@/store/reducers/rootReducer'
import AutoEntrepreneur from './AutoEntrepreneur'
import DirectorStatus from './DirectorStatus'
import MinorityDirector from './MinorityDirector'
import NumberOfAssociate from './NumberOfAssociate'
import PickLegalStatus from './PickLegalStatus'
import PreviousAnswers from './PreviousAnswers'
import SoleProprietorship from './SoleProprietorship'
const useResetFollowingAnswers = () => {
const dispatch = useDispatch()
const { absoluteSitePaths } = useSitePaths()
const location = useLocation()
const answeredQuestion = useSelector(
(state: RootState) =>
Object.keys(
state.choixStatutJuridique.companyLegalStatus
) as (keyof typeof state.choixStatutJuridique.companyLegalStatus)[]
)
useEffect(() => {
const companyStatusCurrentQuestionName = (Object.entries(
absoluteSitePaths.assistants['choix-du-statut'].guideStatut
).find(([, pathname]) => location.pathname === pathname) || [])[0]
if (!companyStatusCurrentQuestionName) {
return
}
const firstAnswerToResetIndex = answeredQuestion.findIndex(
(a) => a === companyStatusCurrentQuestionName
)
if (firstAnswerToResetIndex !== -1) {
dispatch(
resetCompanyStatusChoice(
answeredQuestion.slice(firstAnswerToResetIndex)
)
)
}
}, [location.pathname, dispatch, absoluteSitePaths.assistants])
}
export default function Créer() {
const { relativeSitePaths, absoluteSitePaths } = useSitePaths()
const location = useLocation()
useResetFollowingAnswers()
return (
<>
<Link to={absoluteSitePaths.assistants['choix-du-statut'].index}>
<span aria-hidden></span> <Trans>Retour</Trans>
</Link>
<TrackChapter chapter2="guide">
<H1>
<Trans i18nKey="formeJuridique.titre">
Choix du statut juridique
</Trans>
</H1>
<PreviousAnswers />
<FromBottom key={location.pathname}>
<Routes>
<Route
path={
relativeSitePaths.assistants['choix-du-statut'].guideStatut
.soleProprietorship
}
element={<SoleProprietorship />}
/>
<Route
path={
relativeSitePaths.assistants['choix-du-statut'].guideStatut
.directorStatus
}
element={<DirectorStatus />}
/>
<Route
path={
relativeSitePaths.assistants['choix-du-statut'].guideStatut
.autoEntrepreneur
}
element={<AutoEntrepreneur />}
/>
<Route
path={
relativeSitePaths.assistants['choix-du-statut'].guideStatut
.multipleAssociates
}
element={<NumberOfAssociate />}
/>
<Route
path={
relativeSitePaths.assistants['choix-du-statut'].guideStatut
.minorityDirector
}
element={<MinorityDirector />}
/>
<Route
path={
relativeSitePaths.assistants['choix-du-statut'].guideStatut
.liste
}
element={<PickLegalStatus />}
/>
<Route
index
element={
<Navigate
to={
absoluteSitePaths.assistants['choix-du-statut'].guideStatut
.liste
}
replace
/>
}
/>
</Routes>
</FromBottom>
</TrackChapter>
</>
)
}

View File

@ -1,82 +0,0 @@
import { Trans } from 'react-i18next'
import { LegalStatus } from '@/store/selectors/companyStatusSelectors'
type Props = {
statut: LegalStatus
}
const StatutDescription = ({ statut }: Props) =>
statut === 'EI' ? (
<Trans i18nKey="formeJuridique.EI">
Aucun apport en capital n'est nécessaire. Le capital privé et le capital
de l'entreprise ne font qu'un.
</Trans>
) : statut === 'EIRL' ? (
<Trans i18nKey="formeJuridique.EIRL">
Permet d'attribuer un capital spécifique à son activité professionnelle,
et de choisir le régime d'imposition sur les société (IS) plutôt que
revenu (IR) La société et l'individu constituent la même personne. Ne
convient pas si l'associé unique est une personne morale (entreprise) ou
si vous pensez accueillir d'autres associés au cours de votre
développement (choisissez EURL dans ce cas).
</Trans>
) : statut === 'EURL' ? (
<Trans i18nKey="formeJuridique.EURL">
L'entreprise n'a qu'un associé. La responsabilité est limitée au montant
de l'apport de capital. Evolue en SARL lors de l'arrivée de nouveaux
associés dans la société.
</Trans>
) : statut.includes('SARL') ? (
<Trans i18nKey="formeJuridique.SARL">
Société ayant au moins deux associés dont la responsabilité financière est
limitée au montant de leur apport au capital. Le capital minimum est fixé
librement dans les statuts. Les associés se répartissent des parts
sociales toutes identiques, et la société est dirigée par un ou plusieurs
gérants qui sont forcément des personnes physiques. Le fonctionnement
d'une SARL est encadré par le code du commerce.
</Trans>
) : statut === 'SAS' ? (
<Trans i18nKey="formeJuridique.SAS">
Société ayant au moins deux associés. La responsabilité financière des
associés est limitée au montant de leur apport au capital de la société.
Le capital minimum est fixé librement dans les statuts. Les associés se
répartissent des actions qui peuvent être de plusieurs catégories, et la
société est dirigée par un président qui peut être une personne morale
(une autre société). La SAS se caractérise par une grande souplesse de
fonctionnement (statuts sur mesure).
</Trans>
) : statut === 'SASU' ? (
<Trans i18nKey="formeJuridique.SASU">
L'entreprise n'a qu'un associé. La responsabilité est limitée au montant
de l'apport de capital de l'unique associé (qui peut être une personne
morale).
</Trans>
) : statut === 'SA' ? (
<Trans i18nKey="formeJuridique.SA">
Société ayant au moins deux actionnaires. C'est le seul statut qui permet
d'être coté en bourse (à partir de 7 actionnaires). Le capital social
minimum est de 37.000 .
</Trans>
) : (statut as string) === 'SNC' ? (
<Trans i18nKey="formeJuridique.SNC">
La responsabilité des associés pour les dettes de la société est solidaire
(un seul associé peut être poursuivi pour la totalité de la dette) et
indéfinie (responsable sur la totalité de son patrimoine personnel).
</Trans>
) : statut === 'auto-entrepreneur' ? (
<Trans i18nKey="formeJuridique.micro">
Un auto-entrepreneur exerce son activité en entreprise individuelle, avec
un régime forfaitaire pour ses cotisations sociales et un calcul
spécifique de l'impôt.
</Trans>
) : statut === 'auto-entrepreneur-EIRL' ? (
<Trans i18nKey="formeJuridique.micro-EIRL">
Un auto-entrepreneur option EIRL exerce son activité en entreprise
individuelle en choisissant l'option "Entrepreneur individuel à
responsabilité limitée", avec à un régime forfaitaire pour le calcul des
impôts et le paiement des cotisations de sécurité sociale.
</Trans>
) : /* Otherwise */ null
export default StatutDescription

View File

@ -0,0 +1,85 @@
import { Trans, useTranslation } from 'react-i18next'
import { useMatch } from 'react-router-dom'
import { Button } from '@/design-system/buttons'
import { useSitePaths } from '@/sitePaths'
export const stepOrder = [
'activité',
'département',
'lucratif',
'associé',
'rémunération',
'statuts',
'résultat',
] as const
type Step = (typeof stepOrder)[number]
function useCurrentStep() {
const { relativeSitePaths, absoluteSitePaths } = useSitePaths()
const localizedStep = useMatch(
`${absoluteSitePaths.assistants['choix-du-statut'].index}/:step`
)?.params.step
if (!localizedStep) {
return null
}
const currentStep = Object.entries(
relativeSitePaths.assistants['choix-du-statut']
).find(
([, value]) => value === localizedStep
)?.[0] as keyof (typeof relativeSitePaths.assistants)['choix-du-statut']
if (!stepOrder.includes(currentStep as Step)) {
return null
}
return currentStep as Step
}
export default function Navigation({
currentStepIsComplete,
}: {
currentStepIsComplete: boolean
}) {
const { t } = useTranslation()
const { absoluteSitePaths } = useSitePaths()
const currentStep = useCurrentStep()
if (!currentStep) {
return null
}
const nextStep = stepOrder[stepOrder.indexOf(currentStep) + 1]
const previousStep = stepOrder[stepOrder.indexOf(currentStep) - 1]
return (
<>
<Button
size="XS"
to={
absoluteSitePaths.assistants['choix-du-statut'][
previousStep || 'index'
]
}
>
<span aria-hidden></span> <Trans>Précédent</Trans>
</Button>
{nextStep && (
<Button
size="XS"
to={absoluteSitePaths.assistants['choix-du-statut'][nextStep]}
isDisabled={!currentStepIsComplete}
light
color={'secondary'}
aria-label={t("Suivant, passer à l'étape suivante")}
>
<Trans>Suivant</Trans>
<span aria-hidden></span>
</Button>
)}
</>
)
}

View File

@ -0,0 +1,12 @@
import { H1 } from '@/design-system/typography/heading'
import Navigation from './_components/Navigation'
export default function Activité() {
return (
<>
<H1>Activité</H1>
<Navigation currentStepIsComplete />
</>
)
}

View File

@ -0,0 +1,12 @@
import { H1 } from '@/design-system/typography/heading'
import Navigation from './_components/Navigation'
export default function Associé() {
return (
<>
<H1>Associé</H1>
<Navigation currentStepIsComplete />
</>
)
}

View File

@ -1,6 +1,6 @@
import ChoixDuStatut from '..'
import { config } from '../../../simulateurs/_configs/config'
import { SimulatorsDataParams } from '../../../simulateurs/_configs/types'
import ChoixDuStatut from '.'
import { config } from '../../simulateurs/_configs/config'
import { SimulatorsDataParams } from '../../simulateurs/_configs/types'
export function choixStatutJuridiqueConfig({
t,

View File

@ -0,0 +1,11 @@
import { H1 } from '@/design-system/typography/heading'
import Navigation from './_components/Navigation'
export default function Département() {
return (
<>
<H1>Département</H1> <Navigation currentStepIsComplete />
</>
)
}

View File

@ -1,5 +1,4 @@
import { Trans, useTranslation } from 'react-i18next'
import { useSelector } from 'react-redux'
import styled from 'styled-components'
import { TrackPage } from '@/components/ATInternetTracking'
@ -8,27 +7,20 @@ import { FromBottom } from '@/components/ui/animate'
import Meta from '@/components/utils/Meta'
import { Message } from '@/design-system'
import { Button } from '@/design-system/buttons'
import { Card } from '@/design-system/card'
import { ClockIcon } from '@/design-system/icons'
import { Container, Grid, Spacing } from '@/design-system/layout'
import { H2, H3, H4 } from '@/design-system/typography/heading'
import { H3 } from '@/design-system/typography/heading'
import { Body, Intro, SmallBody } from '@/design-system/typography/paragraphs'
import useSimulatorsData from '@/hooks/useSimulatorsData'
import { SimulateurCard } from '@/pages/simulateurs-et-assistants'
import { useSitePaths } from '@/sitePaths'
import { RootState } from '@/store/reducers/rootReducer'
import { useNextQuestionUrl } from '@/store/selectors/companyStatusSelectors'
import créerSvg from './créer.svg'
import { stepOrder } from './_components/Navigation'
import créerSvg from './_illustrations/créer.svg'
export default function AccueilChoixStatut() {
const { t } = useTranslation()
const { absoluteSitePaths, relativeSitePaths } = useSitePaths()
const nextQuestionUrl = useNextQuestionUrl()
const guideAlreadyStarted = useSelector(
(state: RootState) =>
!!Object.keys(state.choixStatutJuridique.companyLegalStatus).length
)
const simulateurData = useSimulatorsData()
return (
@ -69,13 +61,7 @@ export default function AccueilChoixStatut() {
<Grid item xs={12} sm={'auto'}>
<Button
size="XL"
to={
relativeSitePaths.assistants['choix-du-statut'].assistant
// guideAlreadyStarted && nextQuestionUrl
// ? nextQuestionUrl
// : absoluteSitePaths.assistants['choix-du-statut'].guideStatut
// .multipleAssociates
}
to={relativeSitePaths.assistants['choix-du-statut'][stepOrder[0]]}
>
<Trans i18nKey="choix-statut.home.find-statut">
Trouver le bon statut
@ -84,12 +70,18 @@ export default function AccueilChoixStatut() {
</Grid>
<Grid item>
<StyledSmallBody>
<SmallBody
grey
css={`
display: flex;
gap: 0.5rem;
`}
>
<ClockIcon />
<Trans i18nKey="choix-statut.home.estimated-duration">
Durée estimée : 5 minutes.
</Trans>
</StyledSmallBody>
</SmallBody>
</Grid>
</Grid>
</PageHeader>
@ -112,29 +104,6 @@ export default function AccueilChoixStatut() {
role="listitem"
{...simulateurData['comparaison-statuts']}
/>
<Grid item xs={12} sm={6} lg={4} role="listitem">
<Card
icon="🚶"
title={t(
'créer.ressources.autoEntrepreneur.title',
'Démarche auto-entrepreneur'
)}
to={
absoluteSitePaths.assistants['choix-du-statut'][
'auto-entrepreneur'
]
}
ctaLabel={t(
'créer.ressources.autoEntrepreneur.cta',
'Consulter les démarches'
)}
>
<Trans i18nKey="créer.ressources.autoEntrepreneur.body">
Vous souhaitez devenir auto-entrepreneur ? Découvrez les étapes
pour bien démarrer votre activité
</Trans>
</Card>
</Grid>
</Grid>
</StyledContainer>
</FromBottom>
@ -158,24 +127,3 @@ const StyledContainer = styled(Container)`
margin-bottom: 1.5rem;
}
`
const StyledSmallBody = styled(SmallBody)`
display: inline-flex;
align-items: center;
/* margin: 16rem 1rem; */
&& {
color: ${({ theme }) =>
theme.darkMode
? theme.colors.extended.grey[600]
: theme.colors.extended.grey[500]};
}
svg {
margin-right: 0.5rem;
fill: ${({ theme }) =>
theme.darkMode
? theme.colors.extended.grey[600]
: theme.colors.extended.grey[500]};
}
`

View File

@ -1,112 +1,36 @@
import { useCallback, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { Route, Routes, useLocation } from 'react-router-dom'
import { ScrollToTop } from '@/components/utils/Scroll'
import { Button } from '@/design-system/buttons'
import { useSitePaths } from '@/sitePaths'
import AfterRegistration from './AfterRegistration'
import AccueilChoixStatut from './choix-statut-juridique'
import GuideStatut from './GuideStatut'
type Step =
| 'activité'
| 'département'
| 'lucratif'
| 'associé'
| 'rémunération'
| 'statuts'
| 'résultat'
const stepOrder: Step[] = [
'activité',
'département',
'lucratif',
'associé',
'rémunération',
'statuts',
'résultat',
]
// map stepo
export const AssistantChoixStatut = () => {
const { t } = useTranslation()
const [currentStep, setCurrentStep] = useState<Step>('activité')
const nextStep = useCallback(() => {
setCurrentStep((step) => {
const index = stepOrder.findIndex((s) => s === step)
return stepOrder[index + 1] || stepOrder[index]
})
}, [])
const prevStep = useCallback(() => {
setCurrentStep((step) => {
const index = stepOrder.findIndex((s) => s === step)
return stepOrder[index - 1] || stepOrder[index]
})
}, [])
return (
<>
{currentStep}
<Button light onPress={prevStep} size="XS">
<span aria-hidden></span> <Trans>Précédent</Trans>
</Button>
<Button
size="XS"
onPress={nextStep}
light
color={'secondary'}
aria-label={
t('Suivant, passer à la question suivante')
// : t('Passer, passer la question sans répondre')
}
>
{/* {currentQuestionIsAnswered ? ( */}
<Trans>Suivant</Trans>
{/* ) : (
<Trans>Passer</Trans>
)}{' '} */}
<span aria-hidden></span>
</Button>
</>
)
}
import Activité from './activité'
import AfterRegistration from './après'
import Associé from './associé'
import Département from './département'
import AccueilChoixStatut from './home'
import Lucratif from './lucratif'
import Rémunération from './rémunération'
import Résultat from './résultat'
import Statuts from './statuts'
export default function ChoixDuStatut() {
const { relativeSitePaths } = useSitePaths()
const location = useLocation()
const childrenPaths = relativeSitePaths.assistants['choix-du-statut']
return (
<>
<ScrollToTop key={location.pathname} />
<Routes>
<Route index element={<AccueilChoixStatut />} />
{/* {LANDING_LEGAL_STATUS_LIST.map((statut) => ( */}
<Route
// key={statut}
path={relativeSitePaths.assistants['choix-du-statut'].assistant}
element={<AssistantChoixStatut />}
/>
{/* ))} */}
<Route
path={relativeSitePaths.assistants['choix-du-statut'].après}
element={<AfterRegistration />}
/>
<Route
path={
relativeSitePaths.assistants['choix-du-statut'].guideStatut.index +
'/*'
}
element={<GuideStatut />}
/>
<Route path={childrenPaths.après} element={<AfterRegistration />} />
<Route path={childrenPaths.activité} element={<Activité />} />
<Route path={childrenPaths.département} element={<Département />} />
<Route path={childrenPaths.associé} element={<Associé />} />
<Route path={childrenPaths.lucratif} element={<Lucratif />} />
<Route path={childrenPaths.rémunération} element={<Rémunération />} />
<Route path={childrenPaths.résultat} element={<Résultat />} />
<Route path={childrenPaths.statuts} element={<Statuts />} />
</Routes>
</>
)

View File

@ -0,0 +1,11 @@
import { H1 } from '@/design-system/typography/heading'
import Navigation from './_components/Navigation'
export default function Lucratif() {
return (
<>
<H1>Lucratif</H1> <Navigation currentStepIsComplete />
</>
)
}

View File

@ -0,0 +1,11 @@
import { H1 } from '@/design-system/typography/heading'
import Navigation from './_components/Navigation'
export default function Rémunération() {
return (
<>
<H1>Rémunération</H1> <Navigation currentStepIsComplete />
</>
)
}

View File

@ -0,0 +1,11 @@
import { H1 } from '@/design-system/typography/heading'
import Navigation from './_components/Navigation'
export default function Résultat() {
return (
<>
<H1>Résultat</H1> <Navigation currentStepIsComplete />
</>
)
}

View File

@ -0,0 +1,12 @@
import { H1 } from '@/design-system/typography/heading'
import Navigation from './_components/Navigation'
export default function Statuts() {
return (
<>
<H1>Statuts</H1>
<Navigation currentStepIsComplete />
</>
)
}

View File

@ -6,6 +6,8 @@ import {
WhenNotApplicable,
} from '@/components/EngineValue'
import { useEngine } from '@/components/utils/EngineContext'
// import { Article } from '@/design-system/card'
// import { Emoji } from '@/design-system/emoji'
import { Grid } from '@/design-system/layout'
import { H2 } from '@/design-system/typography/heading'
import { MergedSimulatorDataValues } from '@/hooks/useCurrentSimulatorData'
@ -125,3 +127,32 @@ const guidesUrssaf = [
ctaLabel: 'En savoir plus',
},
]
// const FAQAutoEntrepreneurArticle = () => {
// const { t } = useTranslation()
// return (
// <Article
// title={
// <h3>
// {t(
// 'pages.common.ressources-auto-entrepreneur.FAQ.title',
// 'Questions fréquentes'
// )}{' '}
// <Emoji emoji="❓" />
// </h3>
// }
// href="https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html"
// ctaLabel={t(
// 'pages.common.ressources-auto-entrepreneur.FAQ.cta',
// 'Voir les réponses'
// )}
// >
// <Trans i18nKey="pages.common.ressources-auto-entrepreneur.FAQ.body">
// Une liste exhaustive et maintenue à jour de toutes les questions
// fréquentes (et moins fréquentes) que l'on est amené à poser en tant
// qu'auto-entrepreneur
// </Trans>
// </Article>
// )
// }

View File

@ -1,6 +1,6 @@
import { ImmutableType } from '@/types/utils'
import { choixStatutJuridiqueConfig } from '../assistants/choix-du-statut/choix-statut-juridique/config'
import { choixStatutJuridiqueConfig } from '../assistants/choix-du-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'

View File

@ -1,7 +1,6 @@
import { useTranslation } from 'react-i18next'
import { MetadataSrc } from '@/pages/simulateurs/metadata-src'
import { LegalStatus } from '@/store/selectors/companyStatusSelectors'
// export const LANDING_LEGAL_STATUS_LIST: Array<LegalStatus> = [
// 'EI',
@ -46,18 +45,15 @@ const rawSitePathsFr = {
},
'choix-du-statut': {
index: 'choix-du-statut',
assistant: 'assistant',
activité: 'activité',
département: 'département',
lucratif: 'lucratif',
associé: 'associé',
rémunération: 'rémunération',
statuts: 'statuts',
résultat: 'résultat',
// ...status,
après: 'après-la-création',
guideStatut: {
index: 'statut-juridique',
liste: 'liste',
soleProprietorship: 'responsabilité',
directorStatus: 'dirigeant',
autoEntrepreneur: 'auto-entrepreneur-ou-entreprise-individuelle',
multipleAssociates: 'nombre-associés',
minorityDirector: 'gérant-majoritaire-ou-minoritaire',
},
},
},
simulateurs: {
@ -139,15 +135,14 @@ const rawSitePathsEn = {
index: 'choice-of-status',
assistant: 'assistant',
après: 'after-registration',
guideStatut: {
index: 'legal-status',
liste: 'list',
soleProprietorship: 'liability',
directorStatus: 'director',
autoEntrepreneur: 'auto-entrepreneur',
multipleAssociates: 'multiple-associates',
minorityDirector: 'chairman-or-managing-director',
},
activité: 'activity',
département: 'state',
lucratif: 'lucrative',
associé: 'partnership',
rémunération: 'remuneration',
statuts: 'statuts',
résultat: 'result',
},
},
simulateurs: {

View File

@ -7,7 +7,6 @@ import { buildSituationFromObject } from '@/utils'
import { CompanyActions } from './companyActions'
import { CompanyCreationAction } from './companyCreationChecklistActions'
import { CompanyStatusAction } from './companyStatusActions'
import { HiringChecklistAction } from './hiringChecklistAction'
export type Action =
@ -27,7 +26,6 @@ export type Action =
| typeof updateShouldFocusField
>
| CompanyCreationAction
| CompanyStatusAction
| CompanyActions
| HiringChecklistAction

View File

@ -1,75 +0,0 @@
import { useEffect, useState } from 'react'
import { useDispatch } from 'react-redux'
import { useNavigate } from 'react-router-dom'
import { useNextQuestionUrl } from '@/store/selectors/companyStatusSelectors'
import { LegalStatusRequirements } from '@/types/companyTypes'
import { Action } from './actions'
export type CompanyStatusAction = ReturnType<
| typeof isSoleProprietorship
| typeof defineDirectorStatus
| typeof companyHasMultipleAssociates
| typeof isAutoentrepreneur
| typeof directorIsInAMinority
| typeof resetCompanyStatusChoice
>
// This feels hacky, we should express this "dispatch and navigate" in another way
export const useDispatchAndGoToNextQuestion = () => {
const dispatch = useDispatch()
const navigate = useNavigate()
const nextQuestion = useNextQuestionUrl()
const [dispatched, setDispatched] = useState(false)
useEffect(() => {
if (dispatched) {
navigate(nextQuestion)
}
}, [dispatched])
return (action: Action) => {
dispatch(action)
setDispatched(true)
}
}
export const isSoleProprietorship = (isSoleProprietorship?: boolean) =>
({
type: 'COMPANY_IS_SOLE_PROPRIETORSHIP',
isSoleProprietorship,
} as const)
type DirectorStatus = 'SALARIED' | 'SELF_EMPLOYED'
export const defineDirectorStatus = (status: DirectorStatus) =>
({
type: 'DEFINE_DIRECTOR_STATUS',
status,
} as const)
export const companyHasMultipleAssociates = (multipleAssociates?: boolean) =>
({
type: 'COMPANY_HAS_MULTIPLE_ASSOCIATES',
multipleAssociates,
} as const)
export const isAutoentrepreneur = (autoEntrepreneur?: boolean) =>
({
type: 'COMPANY_IS_MICROENTERPRISE',
autoEntrepreneur,
} as const)
export const directorIsInAMinority = (minorityDirector?: boolean) =>
({
type: 'SPECIFY_DIRECTORS_SHARE',
minorityDirector,
} as const)
export const resetCompanyStatusChoice = (
answersToReset?: (keyof LegalStatusRequirements)[]
) =>
({
type: 'RESET_COMPANY_STATUS_CHOICE',
answersToReset,
} as const)

View File

@ -1,193 +0,0 @@
import { useSelector } from 'react-redux'
import { useSitePaths } from '@/sitePaths'
import { RootState } from '@/store/reducers/rootReducer'
import { LegalStatusRequirements, State } from '@/types/companyTypes'
const LEGAL_STATUS_DETAILS = {
'auto-entrepreneur': {
soleProprietorship: true,
directorStatus: 'SELF_EMPLOYED',
minorityDirector: false,
multipleAssociates: false,
autoEntrepreneur: true,
},
EIRL: {
soleProprietorship: true,
directorStatus: 'SELF_EMPLOYED',
multipleAssociates: false,
autoEntrepreneur: false,
minorityDirector: false,
},
'auto-entrepreneur-EIRL': {
soleProprietorship: true,
directorStatus: 'SELF_EMPLOYED',
multipleAssociates: false,
minorityDirector: false,
autoEntrepreneur: true,
},
EI: {
soleProprietorship: true,
directorStatus: 'SELF_EMPLOYED',
minorityDirector: false,
multipleAssociates: false,
autoEntrepreneur: false,
},
SASU: {
soleProprietorship: false,
directorStatus: 'SALARIED',
minorityDirector: false,
multipleAssociates: false,
autoEntrepreneur: false,
},
SAS: {
soleProprietorship: false,
directorStatus: 'SALARIED',
multipleAssociates: true,
autoEntrepreneur: false,
},
SARL: [
{
soleProprietorship: false,
directorStatus: 'SELF_EMPLOYED',
multipleAssociates: true,
minorityDirector: false,
autoEntrepreneur: false,
},
{
soleProprietorship: false,
directorStatus: 'SALARIED',
multipleAssociates: true,
minorityDirector: true,
autoEntrepreneur: false,
},
] as Array<LegalStatusRequirements>,
EURL: {
soleProprietorship: false,
directorStatus: 'SELF_EMPLOYED',
minorityDirector: false,
multipleAssociates: false,
autoEntrepreneur: false,
},
SA: {
soleProprietorship: false,
directorStatus: 'SALARIED',
multipleAssociates: true,
autoEntrepreneur: false,
},
}
export type LegalStatus = keyof typeof LEGAL_STATUS_DETAILS
type Question = keyof LegalStatusRequirements
type Answers = LegalStatusRequirements
const QUESTION_LIST: Array<Question> = [
'soleProprietorship',
'directorStatus',
'minorityDirector',
'multipleAssociates',
'autoEntrepreneur',
]
function isCompatibleStatusWith(
answers: Answers,
statusRequirements: LegalStatusRequirements
): boolean {
return Object.entries(statusRequirements).reduce<boolean>(
(isCompatible, [question, statusValue]) => {
const answer = answers[question as Question]
return (
isCompatible &&
(answer == null ||
statusValue == null ||
JSON.stringify(answer) === JSON.stringify(statusValue))
)
},
true
)
}
const possibleStatus = (answers: Answers): Record<LegalStatus, boolean> =>
Object.fromEntries(
Object.entries(LEGAL_STATUS_DETAILS).map(([key, statusRequirements]) => [
key,
Array.isArray(statusRequirements)
? !!statusRequirements.some((requirement) =>
isCompatibleStatusWith(answers, requirement)
)
: isCompatibleStatusWith(
answers,
statusRequirements as LegalStatusRequirements
),
])
) as Record<LegalStatus, boolean>
export const possibleStatusSelector = (state: {
choixStatutJuridique: State
}): Record<LegalStatus, boolean> =>
possibleStatus(state.choixStatutJuridique.companyLegalStatus)
export const nextQuestionSelector = (state: RootState): Question | null => {
const legalStatusRequirements = state.choixStatutJuridique.companyLegalStatus
const questionAnswered = Object.keys(
legalStatusRequirements
) as Array<Question>
const possibleStatusList = Object.values(LEGAL_STATUS_DETAILS)
.flat()
.filter((requirement) =>
isCompatibleStatusWith(legalStatusRequirements, requirement as any)
)
const difference = <T>(l1: Array<T>, l2: Array<T>): Array<T> =>
l1.filter((x) => !l2.includes(x))
const unansweredQuestions = difference(QUESTION_LIST, questionAnswered)
const shannonEntropyByQuestion = unansweredQuestions.map(
(question): [typeof question, number] => {
const answerPopulation = Object.values(possibleStatusList).map(
(status: any) => status[question]
)
const frequencyOfAnswers = Object.values<number>(
answerPopulation
.filter((x) => x !== undefined)
.reduce(
(counters: Record<string, number>, i) => ({
...counters,
[i]: (counters?.[i] ?? 0) + 1,
}),
{}
)
).map((numOccurrence) => numOccurrence / answerPopulation.length)
const shannonEntropy = -frequencyOfAnswers
.map((p) => p * Math.log2(p))
.reduce((a, b) => a + b, 0)
return [question, shannonEntropy]
}
)
const sortedPossibleNextQuestions = shannonEntropyByQuestion
.filter(([, entropy]) => entropy !== 0)
.sort(([, entropy1], [, entropy2]) => entropy2 - entropy1)
.map(([question]) => question)
if (sortedPossibleNextQuestions.length === 0) {
return null
}
return sortedPossibleNextQuestions[0]
}
export const useNextQuestionUrl = () => {
const nextQuestion = useSelector(nextQuestionSelector)
const { absoluteSitePaths } = useSitePaths()
if (!nextQuestion) {
return absoluteSitePaths.assistants['choix-du-statut'].guideStatut.liste
}
return absoluteSitePaths.assistants['choix-du-statut'].guideStatut[
nextQuestion
]
}

View File

@ -1,64 +0,0 @@
import { LegalStatus } from '@/store/selectors/companyStatusSelectors'
export type IsSoleProprietorshipAction = {
type: 'COMPANY_IS_SOLE_PROPRIETORSHIP'
isSoleProprietorship?: boolean
}
export type DirectorStatus = 'SALARIED' | 'SELF_EMPLOYED'
export type DefineDirectorStatusAction = {
type: 'DEFINE_DIRECTOR_STATUS'
status?: DirectorStatus
}
export type CompanyHasMultipleAssociatesAction = {
type: 'COMPANY_HAS_MULTIPLE_ASSOCIATES'
multipleAssociates?: boolean
}
export type IsAutoentrepreneurAction = {
type: 'COMPANY_IS_MICROENTERPRISE'
autoEntrepreneur?: boolean
}
export type ChangeChecklistItemAction = {
type: 'CHANGE_CHECKLIST_ITEM'
checklist: string
value: boolean
name: string
}
export type DirectorIsInAMinorityAction = {
type: 'SPECIFY_DIRECTORS_SHARE'
minorityDirector?: boolean
}
export type ResetCompanyStatusAction = {
type: 'RESET_COMPANY_STATUS_CHOICE'
answersToReset?: Array<string>
}
export type State = {
companyLegalStatus: {
/*
Note on the meanings of null / undefined value:
If the key exists and the value is null, the question have been asked, but skipped by the user.
If the key does not exists, the question still hasn't been asked.
*/
soleProprietorship?: boolean
directorStatus?: DirectorStatus
multipleAssociates?: boolean
autoEntrepreneur?: boolean
minorityDirector?: boolean
}
companyStatusChoice?: LegalStatus
}
export type LegalStatusRequirements = State['companyLegalStatus']
export type Action =
| IsSoleProprietorshipAction
| DefineDirectorStatusAction
| IsAutoentrepreneurAction
| CompanyHasMultipleAssociatesAction
| ChangeChecklistItemAction
| DirectorIsInAMinorityAction
| ResetCompanyStatusAction