diff --git a/modele-social/règles/entreprise/catégorie-juridique.yaml b/modele-social/règles/entreprise/catégorie-juridique.yaml
index 11a0183e8..e08f764b9 100644
--- a/modele-social/règles/entreprise/catégorie-juridique.yaml
+++ b/modele-social/règles/entreprise/catégorie-juridique.yaml
@@ -1,5 +1,4 @@
entreprise . associés:
- possiblement non applicable: non
une possibilité:
choix obligatoire: oui
possibilités:
@@ -48,26 +47,26 @@ entreprise . catégorie juridique . EI:
valeur: catégorie juridique = 'EI'
avec:
auto-entrepreneur:
- applicable si: associés . unique
- acronyme: AE
- non applicable si:
- une de ces conditions:
- - entreprise . imposition . IR . type de bénéfices = 'BA'
- - toutes ces conditions:
- - activité . nature . libérale . réglementée
- - dirigeant . indépendant . PL . métier . rattaché CIPAV = non
-
question: Êtes-vous auto-entrepreneur ?
-
+ acronyme: AE
par défaut:
+ applicable si: associés . unique
+ non applicable si:
+ une de ces conditions:
+ - entreprise . imposition . IR . type de bénéfices = 'BA'
+ - toutes ces conditions:
+ - activité . nature . libérale . réglementée
+ - dirigeant . indépendant . PL . métier . rattaché CIPAV = non
nom: par défaut
experimental: oui
+ valeur: oui
EI:
- applicable si: associés . unique
titre: entreprise individuelle
acronyme: EI
valeur: auto-entrepreneur = non
+ par défaut:
+ applicable si: associés . unique
### (niveau 1 code 5) Société commerciale ###
@@ -76,12 +75,13 @@ entreprise . catégorie juridique . SARL:
code insee: 5499
titre: SARL ou EURL
valeur: catégorie juridique = 'SARL'
- non applicable si: activité . nature . libérale . réglementée
+ par défaut:
+ non applicable si: activité . nature . libérale . réglementée
avec:
SARL:
titre: Société à responsabilité limitée
acronyme: SARL
- applicable si: associés . multiples
+ valeur: associés . multiples
description: |
La société à responsabilité limitée (SARL) comprend au minimum deux associés. Cette forme juridique est la plus répandue pour les sociétés. En revanche, elle ne peut être choisie pour les professions juridiques, judiciaires ou de santé (hors pharmaciens).
@@ -104,7 +104,7 @@ entreprise . catégorie juridique . SARL:
EURL:
titre: Entreprise unipersonnelle à responsabilité limitée
acronyme: EURL
- applicable si: associés . unique
+ valeur: associés . unique
description: |
L'entreprise unipersonnelle à responsabilité limitée (EURL) est une société à responsabilité limitée (SARL) constituée d'un seul associé. Elle est également appelée SARL unipersonnelle.
@@ -127,31 +127,24 @@ entreprise . catégorie juridique . SARL:
déprécié: oui
valeur: EURL
-entreprise . catégorie juridique . SNC:
- titre: Société en nom collectif
- acronyme: SNC
- valeur: catégorie juridique = 'SNC'
- applicable si: associés . multiples
- meta:
- code insee: 5202
-
entreprise . catégorie juridique . SAS:
- non applicable si: activité . nature . libérale . réglementée
titre: SAS ou SASU
acronyme: SAS(U)
valeur: catégorie juridique = 'SAS'
+ par défaut:
+ non applicable si: activité . nature . libérale . réglementée
meta:
code insee: 5710
avec:
SASU:
titre: Société par actions simplifiée unipersonnelle
acronyme: SASU
- applicable si: associés . unique
+ valeur: associés . unique
SAS:
titre: Société par actions simplifiée
acronyme: SAS
- applicable si: associés . multiples
+ valeur: associés . multiples
unipersonnelle:
déprécié: oui
@@ -160,40 +153,42 @@ entreprise . catégorie juridique . SAS:
### (niveau 1 code 6) Autre personne morale immatriculée au RCS ###
entreprise . catégorie juridique . SELARL:
- applicable si: activité . nature . libérale . réglementée
acronyme: SELARL(U)
titre: SELARL ou SELARLU
description: Société d'exercice libéral à responsabilité limitée
valeur: catégorie juridique = 'SELARL'
+ par défaut:
+ applicable si: activité . nature . libérale . réglementée
meta:
code insee: 5485
avec:
SELARLU:
acronyme: SELARLU
titre: Société d'exercice libéral à responsabilité limitée unipersonnelle
- applicable si: associés . unique
+ valeur: associés . unique
SELARL:
acronyme: SELARL
titre: Société d'exercice libéral à responsabilité limitée
- applicable si: associés . multiples
+ valeur: associés . multiples
entreprise . catégorie juridique . SELAS:
- applicable si: activité . nature . libérale . réglementée
acronyme: SELAS(U)
titre: SELAS ou SELASU
description: Société d'exercice libéral par actions simplifiées
valeur: catégorie juridique = 'SELAS'
+ par défaut:
+ applicable si: activité . nature . libérale . réglementée
meta:
code insee: 5785
avec:
SELASU:
acronyme: SELASU
titre: Société d'exercice libéral par action simplifiée unipersonnelle
- applicable si: associés . unique
+ valeur: associés . unique
SELAS:
acronyme: SELAS
titre: Société d'exercice libéral par action simplifiée
- applicable si: associés . multiples
+ valeur: associés . multiples
entreprise . catégorie juridique . association:
valeur: catégorie juridique = 'association'
@@ -206,20 +201,14 @@ entreprise . catégorie juridique . autre:
Ce simulateur ne gère pas encore tout les types d'entreprises, le montant affiché pourrait être incorrect.
entreprise . catégorie juridique . remplacements:
- # On extrait tous les remplacements dans un espace de nom que l'on peut désactiver pour l'aide au choix du statut par exemple
- # Cela permet d'éviter des boucles de dans les missingVariables
-
# Ces remplacements mette à jour les régimes d'imposition et la nature d'activité en fonctions de ceux compatibles avec le statut juridique connu.
experimental: oui
- valeur: non
+ valeur: oui
avec:
régime micro-entreprise:
privé: oui
-
- applicable si:
- toutes ces conditions:
- - remplacements
- - EI . auto-entrepreneur
+ valeur: oui
+ applicable si: EI . auto-entrepreneur
remplace:
- règle: imposition . régime
par: "'micro-entreprise'"
@@ -232,45 +221,20 @@ entreprise . catégorie juridique . remplacements:
associé unique:
privé: oui
-
- applicable si:
- toutes ces conditions:
- - remplacements
- - une de ces conditions:
- - EI
- - SARL . EURL
- - SAS . SASU
- - SELAS . SELASU
- - SELARL . SELARLU
+ toutes ces conditions:
+ - remplacements
+ - EI
remplace:
- règle: associés
par: "'unique'"
- associé multiples:
- privé: oui
-
- applicable si:
- toutes ces conditions:
- - remplacements
- - une de ces conditions:
- - SNC
- - SARL . SARL
- - SAS . SAS
- - SELAS . SELAS
- - SELARL . SELARL
- remplace:
- - règle: associés
- par: "'multiples'"
-
profession libérale reglementée:
- privé: oui
-
+ # privé: oui
+ valeur: oui
applicable si:
- toutes ces conditions:
- - remplacements
- - une de ces conditions:
- - SELARL
- - SELAS
+ une de ces conditions:
+ - SELARL
+ - SELAS
remplace:
- règle: activités . libérale
par: oui
@@ -288,9 +252,9 @@ entreprise . catégorie juridique . remplacements:
pas profession libérale reglementée:
privé: oui
+ valeur: oui
non applicable si:
une de ces conditions:
- - remplacements = non
- SELARL
- SELAS
rend non applicable: activités . libérale . réglementée
diff --git a/site/source/components/EngineDocumentationRoutes.tsx b/site/source/components/EngineDocumentationRoutes.tsx
new file mode 100644
index 000000000..1aecd6346
--- /dev/null
+++ b/site/source/components/EngineDocumentationRoutes.tsx
@@ -0,0 +1,44 @@
+import { Route, Routes, useNavigate } from 'react-router-dom'
+
+import Popover from '@/design-system/popover/Popover'
+import Documentation from '@/pages/Documentation'
+import { EngineComparison } from '@/pages/simulateurs/comparaison-statuts/components/Comparateur'
+import { useSitePaths } from '@/sitePaths'
+
+export function EngineDocumentationRoutes({
+ namedEngines,
+}: {
+ namedEngines: EngineComparison
+}) {
+ const navigate = useNavigate()
+ const { absoluteSitePaths } = useSitePaths()
+
+ return (
+
+ {namedEngines.map(({ engine, name }) => (
+
+ {
+ navigate(absoluteSitePaths.simulateurs.comparaison, {
+ replace: true,
+ })
+ }}
+ >
+
+
+
+ }
+ />
+ ))}
+
+ )
+}
diff --git a/site/source/components/StatutTag.tsx b/site/source/components/StatutTag.tsx
index 173e2a75c..86753a222 100644
--- a/site/source/components/StatutTag.tsx
+++ b/site/source/components/StatutTag.tsx
@@ -27,7 +27,6 @@ const TAG_DATA = {
SASU: {
color: 'secondary',
longName: 'Société par actions simplifiée unipersonnelle',
-
acronym: 'SASU',
icon: HexagonIcon,
},
diff --git a/site/source/pages/assistants/choix-du-statut/détails-activité.tsx b/site/source/pages/assistants/choix-du-statut/détails-activité.tsx
index 1a4e7ed41..3e9ac68a3 100644
--- a/site/source/pages/assistants/choix-du-statut/détails-activité.tsx
+++ b/site/source/pages/assistants/choix-du-statut/détails-activité.tsx
@@ -186,8 +186,16 @@ function useUpdateSituationWithGuichet(guichetEntries: GuichetEntry[] | null) {
batchUpdateSituation({
'entreprise . activités . principale . code guichet': `'${guichet.code}'`,
'entreprise . imposition . IR . type de bénéfices': `'${guichet.typeBénéfice}'`,
- 'entreprise . activité . nature': PLRMétier
+ 'entreprise . activité . nature': guichet.catégorieActivité.includes(
+ 'LIBERALE'
+ )
? "'libérale'"
+ : guichet.catégorieActivité.includes('ARTISANALE')
+ ? "'artisanale'"
+ : guichet.catégorieActivité.includes('COMMERCIALE')
+ ? "'commerciale'"
+ : guichet.catégorieActivité.includes('AGRICOLE')
+ ? "'agricole'"
: undefined,
'entreprise . activité . nature . libérale . réglementée': PLRMétier
? 'oui'
diff --git a/site/source/pages/assistants/choix-du-statut/rémunération.tsx b/site/source/pages/assistants/choix-du-statut/rémunération.tsx
index cf929455e..16935df36 100644
--- a/site/source/pages/assistants/choix-du-statut/rémunération.tsx
+++ b/site/source/pages/assistants/choix-du-statut/rémunération.tsx
@@ -109,11 +109,15 @@ function useRémunérationState(): [
setState(newState)
dispatch(
batchUpdateSituation({
- "entreprise . chiffre d'affaires": {
- valeur: newState.CA,
- unité: '€/an',
- },
- 'entreprise . charges': { valeur: newState.charges, unité: '€/an' },
+ "entreprise . chiffre d'affaires": newState.CA
+ ? {
+ valeur: newState.CA,
+ unité: '€/an',
+ }
+ : undefined,
+ 'entreprise . charges': newState.charges
+ ? { valeur: newState.charges, unité: '€/an' }
+ : undefined,
})
)
}
diff --git a/site/source/pages/simulateurs/comparaison-statuts/components/Comparateur.tsx b/site/source/pages/simulateurs/comparaison-statuts/components/Comparateur.tsx
index a99678eff..422bf8a1a 100644
--- a/site/source/pages/simulateurs/comparaison-statuts/components/Comparateur.tsx
+++ b/site/source/pages/simulateurs/comparaison-statuts/components/Comparateur.tsx
@@ -1,31 +1,34 @@
import Engine from 'publicodes'
import { useTranslation } from 'react-i18next'
-import { Route, Routes, useNavigate } from 'react-router-dom'
import { DottedName } from '@/../../modele-social'
+import { EngineDocumentationRoutes } from '@/components/EngineDocumentationRoutes'
import PeriodSwitch from '@/components/PeriodSwitch'
import Simulation, {
SimulationGoal,
SimulationGoals,
} from '@/components/Simulation'
+import { Statut } from '@/components/StatutTag'
import { Spacing } from '@/design-system/layout'
-import Popover from '@/design-system/popover/Popover'
-import Documentation from '@/pages/Documentation'
-import { useSitePaths } from '@/sitePaths'
import Détails from './Détails'
import Résultats from './Résultats'
-type ComparateurProps = {
- engines: [Engine, Engine, Engine]
+type NamedEngine = {
+ engine: Engine
+ name: Statut
}
-function Comparateur({ engines }: ComparateurProps) {
- const { t } = useTranslation()
- const navigate = useNavigate()
- const [assimiléEngine, autoEntrepreneurEngine, indépendantEngine] = engines
+export type EngineComparison = [NamedEngine, NamedEngine, NamedEngine]
- const { absoluteSitePaths } = useSitePaths()
+function Comparateur({ namedEngines }: { namedEngines: EngineComparison }) {
+ const { t } = useTranslation()
+
+ const engines = namedEngines.map(({ engine }) => engine) as [
+ Engine,
+ Engine,
+ Engine
+ ]
return (
<>
@@ -49,73 +52,9 @@ function Comparateur({ engines }: ComparateurProps) {
-
-
-
-
- {
- navigate(absoluteSitePaths.simulateurs.comparaison, {
- replace: true,
- })
- }}
- >
-
-
-
- }
- />
-
- {
- navigate(absoluteSitePaths.simulateurs.comparaison, {
- replace: true,
- })
- }}
- >
-
-
-
- }
- />
-
- {
- navigate(absoluteSitePaths.simulateurs.comparaison, {
- replace: true,
- })
- }}
- >
-
-
-
- }
- />
-
+
+
+
>
)
}
diff --git a/site/source/pages/simulateurs/comparaison-statuts/components/DetailsRowCards.tsx b/site/source/pages/simulateurs/comparaison-statuts/components/DetailsRowCards.tsx
index 11e70230e..8a5e10661 100644
--- a/site/source/pages/simulateurs/comparaison-statuts/components/DetailsRowCards.tsx
+++ b/site/source/pages/simulateurs/comparaison-statuts/components/DetailsRowCards.tsx
@@ -12,80 +12,49 @@ import { HelpIcon } from '@/design-system/icons'
import { Grid } from '@/design-system/layout'
import { getBestOption, OptionType } from '../utils'
+import { EngineComparison } from './Comparateur'
import StatusCard from './StatusCard'
-const getStatusLabelsArray = (statusArray: OptionType[]) =>
- statusArray.map(
- (statusOption) => statusOption.type.toUpperCase() as 'SASU' | 'EI' | 'AE'
- )
-
const getGridSizes = (statusArray: OptionType[]) => {
return { sizeXs: 12, sizeLg: 4 * statusArray.length }
}
const DetailsRowCards = ({
- engines: [assimiléEngine, autoEntrepreneurEngine, indépendantEngine],
+ namedEngines,
dottedName,
unit,
bestOption,
evolutionDottedName,
evolutionLabel,
- footers,
label,
- warnings,
+ footer,
+ warning,
}: {
- engines: [Engine, Engine, Engine]
+ namedEngines: EngineComparison
dottedName: DottedName
unit?: string
- bestOption?: 'sasu' | 'ei' | 'ae'
+ bestOption?: 1 | 2 | 3
evolutionDottedName?: DottedName
evolutionLabel?: ReactNode | string
- footers?: { sasu: ReactNode; ei: ReactNode; ae: ReactNode }
label?: ReactNode | string
- warnings?: { sasu?: ReactNode; ei?: ReactNode; ae?: ReactNode }
+ warning?: (engine: Engine) => ReactNode
+ footer?: (engine: Engine) => ReactNode
}) => {
- const assimiléEvaluation = assimiléEngine.evaluate({
- valeur: dottedName,
- ...(unit && { unité: unit }),
- })
-
- const indépendantEvaluation = indépendantEngine.evaluate({
- valeur: dottedName,
- ...(unit && { unité: unit }),
- })
-
- const autoEntrepreneurEvaluation = autoEntrepreneurEngine.evaluate({
- valeur: dottedName,
- ...(unit && { unité: unit }),
- })
-
- const options: OptionType[] = [
- {
- type: 'sasu',
- value: Math.round(assimiléEvaluation.nodeValue as number),
- engine: assimiléEngine,
- documentationPath: '/simulateurs/comparaison-régimes-sociaux/SASU',
- },
- {
- type: 'ei',
- value: Math.round(indépendantEvaluation.nodeValue as number),
- engine: indépendantEngine,
- documentationPath: '/simulateurs/comparaison-régimes-sociaux/EI',
- },
- {
- type: 'ae',
- value: Math.round(autoEntrepreneurEvaluation.nodeValue as number),
- engine: autoEntrepreneurEngine,
- documentationPath:
- '/simulateurs/comparaison-régimes-sociaux/auto-entrepreneur',
- },
- ]
+ console.log(namedEngines)
+ const options = namedEngines.map(({ engine, name }) => ({
+ engine,
+ name,
+ value: engine.evaluate({
+ valeur: dottedName,
+ ...(unit && { unité: unit }),
+ }).nodeValue,
+ })) as [OptionType, OptionType, OptionType]
const bestOptionValue = bestOption ?? getBestOption(options)
- const sortedStatus = [...options]
- .reduce((acc: OptionType[][], option: OptionType) => {
+ const groupedOptions = options
+ .reduce((acc, option) => {
const newAcc = [...acc]
const sameValues = options.filter(
(optionFiltered) => optionFiltered.value === option.value
@@ -94,7 +63,7 @@ const DetailsRowCards = ({
if (
!newAcc.find((arrayOfStatus) =>
arrayOfStatus.some(
- (statusObject: OptionType) => statusObject.value === option.value
+ (statusObject) => statusObject.value === option.value
)
)
) {
@@ -102,30 +71,31 @@ const DetailsRowCards = ({
}
return newAcc
- }, [] as OptionType[][])
- .filter((arrayOfStatus: OptionType[]) => arrayOfStatus.length > 0)
+ }, [] as (typeof options)[0][][])
+
+ .filter((arrayOfStatus) => arrayOfStatus.length > 0)
return (
- {sortedStatus.map((statusArray: OptionType[]) => {
- const statusObject: OptionType = statusArray[0]
+ {groupedOptions.map((sameValueOptions) => {
+ const statusObject = sameValueOptions[0]
- const { sizeXs, sizeLg } = getGridSizes(statusArray)
+ const { sizeXs, sizeLg } = getGridSizes(sameValueOptions)
return (
name)}
+ footerContent={footer?.(statusObject.engine)}
isBestOption={
- statusArray.length !== 3 &&
- bestOptionValue === statusObject.type
+ sameValueOptions.length !== 3 &&
+ bestOptionValue === statusObject.name
}
>
Ne s'applique pas
+
+
+
- {warnings?.[statusObject.type] &&
- warnings?.[statusObject.type]}
+ {warning?.(statusObject.engine)}
{evolutionDottedName && (
diff --git a/site/source/pages/simulateurs/comparaison-statuts/components/Détails.tsx b/site/source/pages/simulateurs/comparaison-statuts/components/Détails.tsx
index 2112b97cd..3e9f67aac 100644
--- a/site/source/pages/simulateurs/comparaison-statuts/components/Détails.tsx
+++ b/site/source/pages/simulateurs/comparaison-statuts/components/Détails.tsx
@@ -1,32 +1,23 @@
-import Engine from 'publicodes'
import { Trans } from 'react-i18next'
import styled from 'styled-components'
-import { DottedName } from '@/../../modele-social'
import { ExplicableRule } from '@/components/conversation/Explicable'
-import Value, {
- WhenAlreadyDefined,
- WhenValueEquals,
-} from '@/components/EngineValue'
+import Value, { Condition } from '@/components/EngineValue'
import { Accordion, Item } from '@/design-system'
import { Emoji } from '@/design-system/emoji'
import { ExternalLinkIcon, PlusCircleIcon } from '@/design-system/icons'
-import { Container, Grid, Spacing } from '@/design-system/layout'
+import { Container, Spacing } from '@/design-system/layout'
import { Strong } from '@/design-system/typography'
import { H2, H4 } from '@/design-system/typography/heading'
import { StyledLink } from '@/design-system/typography/link'
import { Body } from '@/design-system/typography/paragraphs'
+import { EngineComparison } from './Comparateur'
import DetailsRowCards from './DetailsRowCards'
import ItemTitle from './ItemTitle'
-import StatusCard from './StatusCard'
import WarningTooltip from './WarningTooltip'
-const Détails = ({
- engines: [assimiléEngine, autoEntrepreneurEngine, indépendantEngine],
-}: {
- engines: [Engine, Engine, Engine]
-}) => {
+const Détails = ({ namedEngines }: { namedEngines: EngineComparison }) => {
return (
@@ -78,11 +69,7 @@ const Détails = ({
@@ -108,11 +95,7 @@ const Détails = ({
au bout de 10 ans}
/>
@@ -157,40 +140,36 @@ const Détails = ({