From b0cb1ef96a45b0bc8ab46ec8d575e6759a96fcab Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 2 Aug 2023 12:10:08 +0200 Subject: [PATCH] =?UTF-8?q?Modifie=20le=20parcours=20pour=20les=20entrepri?= =?UTF-8?q?ses=20=C3=A0=20associ=C3=A9s=20multiples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/source/locales/ui-en.yaml | 11 ++ site/source/locales/ui-fr.yaml | 11 ++ .../choix-du-statut/rémunération.tsx | 129 ++++++++++++++++-- .../components/RevenuEstimé.tsx | 74 ++++++---- 4 files changed, 187 insertions(+), 38 deletions(-) diff --git a/site/source/locales/ui-en.yaml b/site/source/locales/ui-en.yaml index 66fcd6d68..38676a108 100644 --- a/site/source/locales/ui-en.yaml +++ b/site/source/locales/ui-en.yaml @@ -349,6 +349,7 @@ Votre chiffre d'affaires estimé: Your estimated sales Votre couverture invalidité et décès: Your disability and death coverage Votre domaine d'activité: Your field of activity Votre message (requis): Your message (required) +Votre rémunération totale estimée: Your estimated total remuneration Vous allez dépasser le plafond de la micro-entreprise: You will exceed the micro-business limit "Vous n’avez pas été satisfait(e) de votre expérience, nous en sommes désolé(e)s.": We're sorry you weren't satisfied with your experience. Vous pouvez bénéficier d’une pension invalidité <2>en cas de maladie ou d’accident conduisant à une incapacité à poursuivre votre activité professionnelle.: @@ -528,6 +529,16 @@ choix-statut: expenses necessary for the smooth running of your business: accountancy, telephone subscription, internet subscription, health insurance, provident fund, work tools, etc." + rémunérationTotale: + label: Total compensation + totale: + help: + title: Total executive compensation + title: As a manager, I want the company to pay me a total of...<1><0>This is the + total amount the company spends on the executive's remuneration. This + "super-gross" remuneration includes all social security contributions + payable. It can also be considered as the monetary value of the + executive's work. chomagePartiel: tableCaption: Table showing net salary and cost to the employer with or without short-time working. diff --git a/site/source/locales/ui-fr.yaml b/site/source/locales/ui-fr.yaml index c8ebe3870..3c5e20ac5 100644 --- a/site/source/locales/ui-fr.yaml +++ b/site/source/locales/ui-fr.yaml @@ -364,6 +364,7 @@ Votre chiffre d'affaires estimé: Votre chiffre d'affaires estimé Votre couverture invalidité et décès: Votre couverture invalidité et décès Votre domaine d'activité: Votre domaine d'activité Votre message (requis): Votre message (requis) +Votre rémunération totale estimée: Votre rémunération totale estimée Vous allez dépasser le plafond de la micro-entreprise: Vous allez dépasser le plafond de la micro-entreprise "Vous n’avez pas été satisfait(e) de votre expérience, nous en sommes désolé(e)s.": Vous n’avez pas été satisfait(e) de votre expérience, nous en sommes @@ -556,6 +557,16 @@ choix-statut: dépenses nécessaires au bon fonctionnement de votre entreprise : expertise-comptable, abonnement téléphonique, abonnement internet, mutuelle, prévoyance, outils de travail, etc." + rémunérationTotale: + label: Montant de la rémunération totale + totale: + help: + title: Rémunération totale du dirigeant + title: En tant que dirigeant, je souhaite que l'entreprise me rémunère en + dépensant au total...<1><0>C'est ce que l'entreprise dépense en tout + pour la rémunération du dirigeant. Cette rémunération "super-brute" + inclut toutes les cotisations sociales à payer. On peut aussi considérer + que c'est la valeur monétaire du travail du dirigeant. chomagePartiel: tableCaption: Tableau indiquant le salaire net et le coût pour l'employeur avec ou sans chômage partiel. 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 90386eb9b..59df16dd5 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 @@ -15,11 +15,22 @@ import { debounce } from '@/utils' import Layout from './_components/Layout' import Navigation from './_components/Navigation' -type State = { CA: number | undefined; charges: number | undefined } - export default function Rémunération() { + const multipleAssociés = useEngine().evaluate( + 'entreprise . associés . multiples' + ).nodeValue + + return multipleAssociés ? ( + + ) : ( + + ) +} + +function RémunérationEntrepriseUnipersonnelle() { const { t } = useTranslation() - const [{ CA, charges }, setState, reset, isComplete] = useRémunérationState() + const [{ CA, charges }, setState, reset, isComplete] = + useChiffreAffairesState() return ( <> @@ -93,21 +104,68 @@ export default function Rémunération() { ) } -function useRémunérationState(): [ - state: State, - setState: (value: Partial) => void, +function RémunérationSociétéAssociésMultiples() { + const { t } = useTranslation() + const [{ rémunérationTotale }, setState, reset, isComplete] = + useRémunérationTotaleState() + + return ( + <> + + En tant que dirigeant, je souhaite que l'entreprise me rémunère en + dépensant au total... + + + C'est ce que l'entreprise dépense en tout pour la rémunération + du dirigeant. Cette rémunération "super-brute" inclut toutes les + cotisations sociales à payer. On peut aussi considérer que c'est + la valeur monétaire du travail du dirigeant. + + + + } + > + setState({ rémunérationTotale: value })} + label={t( + 'choix-statut.rémunération.rémunérationTotale.label', + 'Montant de la rémunération totale' + )} + displayedUnit="€/an" + id="rémunérationTotale" + /> + + + + + ) +} + +type CAState = { CA: number | undefined; charges: number | undefined } +function useChiffreAffairesState(): [ + state: CAState, + setState: (value: Partial) => void, reset: () => void, isComplete: boolean ] { const defaultState = { CA: undefined, charges: undefined } - const [state, setState] = usePersistingState( + const [state, setState] = usePersistingState( 'choix-statut:associés', defaultState ) const dispatch = useDispatch() const debouncedUpdateSituation = useCallback( - debounce(1000, (newState: State) => { + debounce(1000, (newState: CAState) => { dispatch( batchUpdateSituation({ "entreprise . chiffre d'affaires": newState.CA @@ -119,13 +177,14 @@ function useRémunérationState(): [ 'entreprise . charges': newState.charges ? { valeur: newState.charges, unité: '€/an' } : undefined, + 'dirigeant . rémunération . totale': undefined, }) ) }), [] ) - const handleChange = (value: Partial) => { + const handleChange = (value: Partial) => { const newState = { ...state, ...value } setState(newState) debouncedUpdateSituation(newState) @@ -146,3 +205,55 @@ function useRémunérationState(): [ return [state, handleChange, reset, isComplete] } + +type RémunérationState = { rémunérationTotale: number | undefined } +function useRémunérationTotaleState(): [ + state: RémunérationState, + setState: (value: Partial) => void, + reset: () => void, + isComplete: boolean +] { + const defaultState = { rémunérationTotale: undefined } + const [state, setState] = usePersistingState( + 'choix-statut:associés', + defaultState + ) + + const dispatch = useDispatch() + const debouncedUpdateSituation = useCallback( + debounce(1000, (newState: RémunérationState) => { + dispatch( + batchUpdateSituation({ + "entreprise . chiffre d'affaires": undefined, + 'entreprise . charges': undefined, + 'dirigeant . rémunération . totale': newState.rémunérationTotale + ? { + valeur: newState.rémunérationTotale, + unité: '€/an', + } + : undefined, + }) + ) + }), + [] + ) + + const handleChange = (value: Partial) => { + const newState = { ...state, ...value } + setState(newState) + debouncedUpdateSituation(newState) + } + + useEffect(() => { + handleChange(state) + }, []) + const reset = () => { + handleChange(defaultState) + } + + const engine = useEngine() + const isComplete = + engine.evaluate('dirigeant . rémunération . totale').nodeValue !== undefined + + return [state, handleChange, reset, isComplete] +} diff --git a/site/source/pages/simulateurs/comparaison-statuts/components/RevenuEstimé.tsx b/site/source/pages/simulateurs/comparaison-statuts/components/RevenuEstimé.tsx index 6646a6ef2..ac8779bd8 100644 --- a/site/source/pages/simulateurs/comparaison-statuts/components/RevenuEstimé.tsx +++ b/site/source/pages/simulateurs/comparaison-statuts/components/RevenuEstimé.tsx @@ -1,7 +1,10 @@ import { Trans } from 'react-i18next' import styled from 'styled-components' -import Value from '@/components/EngineValue' +import Value, { + WhenAlreadyDefined, + WhenNotAlreadyDefined, +} from '@/components/EngineValue' import { CardContainer } from '@/design-system/card/Card' import { EditIcon } from '@/design-system/icons' import { Grid } from '@/design-system/layout' @@ -20,35 +23,48 @@ const RevenuEstimé = () => { $inert > - - - - + + + + + + + + + + + + + + + + - - - - - +