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 = ({ - - - Votre rémunération est{' '} - trop faible pour bénéficier d’arrêt - maladie en SASU. - - - } - id="tooltip-sasu-arrêt-maladie" - /> - - ), - }} - footers={{ - sasu: ( + warning={(engine) => ( + + + + Votre rémunération est{' '} + trop faible pour bénéficier d’arrêt + maladie. + + + } + id="tooltip-sasu-arrêt-maladie" + /> + + )} + footer={(engine) => ( + Pour y prétendre, vous devez voir cotisé au moins{' '} - 3 mois + + + - ), - ei: ( - - - - - Pour y prétendre, vous devez voir cotisé au moins{' '} - 12 mois - - - - ), - ae: ( - - - - - Pour y prétendre, vous devez voir cotisé au moins{' '} - 12 mois - - - - ), - }} + + )} /> @@ -264,11 +210,7 @@ const Détails = ({ à partir du 29ème jour} @@ -308,11 +250,7 @@ const Détails = ({ @@ -332,11 +270,7 @@ const Détails = ({ versés en deux fois} /> @@ -356,11 +290,7 @@ const Détails = ({ versés en une fois} /> @@ -417,11 +347,7 @@ const Détails = ({ @@ -448,11 +374,7 @@ const Détails = ({ @@ -469,11 +391,7 @@ const Détails = ({ - + {/* maximum - + */} @@ -541,11 +455,7 @@ const Détails = ({ @@ -623,7 +533,7 @@ const Détails = ({ */ } - + {/* Dépôt de capital @@ -648,9 +558,9 @@ const Détails = ({ - + */} - + {/* Statut du conjoint @@ -678,7 +588,7 @@ const Détails = ({ Conjoint collaborateur - + */} diff --git a/site/source/pages/simulateurs/comparaison-statuts/components/RevenuAprèsImpot.tsx b/site/source/pages/simulateurs/comparaison-statuts/components/RevenuAprèsImpot.tsx index 353182fba..5ed1a2429 100644 --- a/site/source/pages/simulateurs/comparaison-statuts/components/RevenuAprèsImpot.tsx +++ b/site/source/pages/simulateurs/comparaison-statuts/components/RevenuAprèsImpot.tsx @@ -1,59 +1,31 @@ -import Engine from 'publicodes' import { Trans, useTranslation } from 'react-i18next' import styled from 'styled-components' -import { DottedName } from '@/../../modele-social' -import Value, { Condition, WhenAlreadyDefined } from '@/components/EngineValue' import RuleLink from '@/components/RuleLink' -import { CheckList } from '@/design-system' -import { ExternalLinkIcon, HelpIcon } from '@/design-system/icons' -import { Grid } from '@/design-system/layout' +import { ExternalLinkIcon } from '@/design-system/icons' import { H2 } from '@/design-system/typography/heading' import { StyledLink } from '@/design-system/typography/link' import { Body } from '@/design-system/typography/paragraphs' import { getBestOption, OptionType } from '../utils' -import AllerPlusLoinRevenus from './AllerPlusLoinRevenus' -import StatusCard from './StatusCard' -import WarningTooltip from './WarningTooltip' +import { EngineComparison } from './Comparateur' const RevenuAprèsImpot = ({ - engines, + namedEngines, }: { - engines: [Engine, Engine, Engine] + namedEngines: EngineComparison }) => { - const [assimiléEngine, autoEntrepreneurEngine, indépendantEngine] = engines + const [assimiléEngine, autoEntrepreneurEngine, indépendantEngine] = + namedEngines const { t } = useTranslation() - - const assimiléValue = assimiléEngine.evaluate({ - valeur: 'dirigeant . rémunération . net . après impôt', - unité: '€/mois', - }).nodeValue - - const indépendantValue = indépendantEngine.evaluate({ - valeur: 'dirigeant . rémunération . net . après impôt', - unité: '€/mois', - }).nodeValue - - const autoEntrepreneurValue = autoEntrepreneurEngine.evaluate({ - valeur: 'dirigeant . rémunération . net . après impôt', - unité: '€/mois', - }).nodeValue - - const options: OptionType[] = [ - { - type: 'sasu', - value: assimiléValue, - }, - { - type: 'ei', - value: indépendantValue, - }, - { - type: 'ae', - value: autoEntrepreneurValue, - }, - ] + const options = namedEngines.map(({ engine, name }) => ({ + engine, + name, + value: engine.evaluate({ + valeur: 'dirigeant . rémunération . net . après impôt', + unité: '€/mois', + }).nodeValue, + })) as [OptionType, OptionType, OptionType] const bestOption = getBestOption(options) @@ -62,12 +34,12 @@ const RevenuAprèsImpot = ({

Revenu après impôt

- + {/* - + */} ) } diff --git a/site/source/pages/simulateurs/comparaison-statuts/components/Résultats.tsx b/site/source/pages/simulateurs/comparaison-statuts/components/Résultats.tsx index 0c075bc27..8653149b3 100644 --- a/site/source/pages/simulateurs/comparaison-statuts/components/Résultats.tsx +++ b/site/source/pages/simulateurs/comparaison-statuts/components/Résultats.tsx @@ -1,17 +1,12 @@ -import Engine from 'publicodes' import styled from 'styled-components' -import { DottedName } from '@/../../modele-social' import { Container } from '@/design-system/layout' +import { EngineComparison } from './Comparateur' import RevenuAprèsImpot from './RevenuAprèsImpot' import RevenuEstimé from './RevenuEstimé' -const Résultats = ({ - engines, -}: { - engines: [Engine, Engine, Engine] -}) => { +const Résultats = ({ namedEngines }: { namedEngines: EngineComparison }) => { return ( @@ -21,7 +16,7 @@ const Résultats = ({ } > - + ) } diff --git a/site/source/pages/simulateurs/comparaison-statuts/components/StatusCard.tsx b/site/source/pages/simulateurs/comparaison-statuts/components/StatusCard.tsx index fc98bb74a..be8db7638 100644 --- a/site/source/pages/simulateurs/comparaison-statuts/components/StatusCard.tsx +++ b/site/source/pages/simulateurs/comparaison-statuts/components/StatusCard.tsx @@ -2,7 +2,7 @@ import { ReactNode, useRef } from 'react' import { Trans } from 'react-i18next' import styled from 'styled-components' -import { StatutTag } from '@/components/StatutTag' +import { Statut, StatutTag } from '@/components/StatutTag' import { CardContainer } from '@/design-system/card/Card' import { Emoji } from '@/design-system/emoji' import { Grid } from '@/design-system/layout' @@ -11,7 +11,7 @@ import { Body } from '@/design-system/typography/paragraphs' import { generateUuid } from '@/utils' type StatutCardType = { - statut: ('SASU' | 'EI' | 'AE')[] + statut: Statut[] footerContent?: ReactNode isBestOption?: boolean children: ReactNode @@ -31,7 +31,7 @@ const StatusCard = ({ {status.map((statusString) => ( - + ))} diff --git a/site/source/pages/simulateurs/comparaison-statuts/index.tsx b/site/source/pages/simulateurs/comparaison-statuts/index.tsx index 24d5e406f..80a2eb400 100644 --- a/site/source/pages/simulateurs/comparaison-statuts/index.tsx +++ b/site/source/pages/simulateurs/comparaison-statuts/index.tsx @@ -1,5 +1,3 @@ -import { DottedName } from 'modele-social' -import Engine from 'publicodes' import { useMemo } from 'react' import { Trans } from 'react-i18next' @@ -7,7 +5,7 @@ import { useEngine, useRawSituation } from '@/components/utils/EngineContext' import { Strong } from '@/design-system/typography' import { Intro } from '@/design-system/typography/paragraphs' -import Comparateur from './components/Comparateur' +import Comparateur, { EngineComparison } from './components/Comparateur' import { CasParticuliersProvider, useCasParticuliers, @@ -58,10 +56,10 @@ function ComparateurStatutsUI() { ) const engines = [ - assimiléEngine, - autoEntrepreneurEngine, - indépendantEngine, - ] as [Engine, Engine, Engine] + { engine: assimiléEngine, name: 'SASU' }, + { engine: indépendantEngine, name: 'EI' }, + { engine: autoEntrepreneurEngine, name: 'AE' }, + ] as EngineComparison return ( <> @@ -76,7 +74,7 @@ function ComparateurStatutsUI() { correspond le mieux. - + ) } diff --git a/site/source/pages/simulateurs/comparaison-statuts/utils.ts b/site/source/pages/simulateurs/comparaison-statuts/utils.ts index 5d9cc520c..95949e1f3 100644 --- a/site/source/pages/simulateurs/comparaison-statuts/utils.ts +++ b/site/source/pages/simulateurs/comparaison-statuts/utils.ts @@ -1,18 +1,12 @@ -import Engine from 'publicodes' +import Engine, { Evaluation } from 'publicodes' import { DottedName } from '@/../../modele-social' +import { Statut } from '@/components/StatutTag' -export type ValueType = - | string - | number - | boolean - | null - | Record export type OptionType = { - type: 'sasu' | 'ei' | 'ae' - value?: ValueType - engine?: Engine - documentationPath?: string + engine: Engine + name: Statut + value: Evaluation } export const getBestOption = (options: OptionType[]) => { const sortedOptions = [...options].sort( @@ -30,5 +24,5 @@ export const getBestOption = (options: OptionType[]) => { } ) - return sortedOptions?.[0]?.type + return sortedOptions?.[0]?.name } diff --git a/site/source/pages/simulateurs/cout-creation-entreprise/config.ts b/site/source/pages/simulateurs/cout-creation-entreprise/config.ts index 944b71ca5..e726ff0bc 100644 --- a/site/source/pages/simulateurs/cout-creation-entreprise/config.ts +++ b/site/source/pages/simulateurs/cout-creation-entreprise/config.ts @@ -46,6 +46,9 @@ export function coûtCréationEntrepriseConfig({ 'oui', 'dirigeant . indépendant . PL . métier . santé . vétérinaire . par défaut': 'oui', + 'entreprise . catégorie juridique . association': { + 'applicable si': 'non', + }, }, }, component: CoutCreationEntreprise,