Modifie le parcours pour les entreprises à associés multiples

pull/2782/head
Johan Girod 2023-08-02 12:10:08 +02:00
parent f14584753b
commit b0cb1ef96a
4 changed files with 187 additions and 38 deletions

View File

@ -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 navez 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 dune pension invalidité <2>en cas de maladie ou daccident conduisant à une incapacité à poursuivre votre activité professionnelle</2>.:
@ -528,6 +529,16 @@ choix-statut:
expenses necessary for the smooth running of your business</2>:
accountancy, telephone subscription, internet subscription, health
insurance, provident fund, work tools, etc.</0></1></0>"
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.</0></1>
chomagePartiel:
tableCaption: Table showing net salary and cost to the employer with or without
short-time working.

View File

@ -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 navez pas été satisfait(e) de votre expérience, nous en sommes désolé(e)s.":
Vous navez 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</2> :
expertise-comptable, abonnement téléphonique, abonnement internet,
mutuelle, prévoyance, outils de travail, etc.</0></1></0>"
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.</0></1>
chomagePartiel:
tableCaption: Tableau indiquant le salaire net et le coût pour l'employeur avec
ou sans chômage partiel.

View File

@ -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 ? (
<RémunérationSociétéAssociésMultiples />
) : (
<RémunérationEntrepriseUnipersonnelle />
)
}
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<State>) => void,
function RémunérationSociétéAssociésMultiples() {
const { t } = useTranslation()
const [{ rémunérationTotale }, setState, reset, isComplete] =
useRémunérationTotaleState()
return (
<>
<Layout
title={
<Trans i18nKey="choix-statut.rémunération.totale.title">
En tant que dirigeant, je souhaite que l'entreprise me rémunère en
dépensant au total...
<HelpButtonWithPopover
title={t(
'choix-statut.rémunération.totale.help.title',
'Rémunération totale du dirigeant'
)}
type="info"
>
<Body>
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.
</Body>
</HelpButtonWithPopover>
</Trans>
}
>
<NumberField
value={rémunérationTotale}
onChange={(value) => 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"
/>
<Navigation currentStepIsComplete={isComplete} onPreviousStep={reset} />
</Layout>
</>
)
}
type CAState = { CA: number | undefined; charges: number | undefined }
function useChiffreAffairesState(): [
state: CAState,
setState: (value: Partial<CAState>) => void,
reset: () => void,
isComplete: boolean
] {
const defaultState = { CA: undefined, charges: undefined }
const [state, setState] = usePersistingState<State>(
const [state, setState] = usePersistingState<CAState>(
'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<State>) => {
const handleChange = (value: Partial<CAState>) => {
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<RémunérationState>) => void,
reset: () => void,
isComplete: boolean
] {
const defaultState = { rémunérationTotale: undefined }
const [state, setState] = usePersistingState<RémunérationState>(
'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<RémunérationState>) => {
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]
}

View File

@ -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
>
<Grid container>
<Grid
css={`
padding-right: 1.5rem;
`}
item
xs={12}
sm={6}
lg={3}
>
<Label>
<Trans>Votre chiffre d'affaires estimé</Trans>
</Label>
<StyledValue
linkToRule={false}
expression="entreprise . chiffre d'affaires"
/>
</Grid>
<WhenAlreadyDefined dottedName="entreprise . chiffre d'affaires">
<Grid
css={`
padding-right: 1.5rem;
`}
item
xs={12}
sm={6}
lg={3}
>
<Label>
<Trans>Votre chiffre d'affaires estimé</Trans>
</Label>
<StyledValue
linkToRule={false}
expression="entreprise . chiffre d'affaires"
/>
</Grid>
<StyledGrid item xs={12} sm={6} lg={5}>
<Label>
<Trans>Vos charges estimées</Trans>
</Label>
<StyledValue
linkToRule={false}
unit="€/an"
expression="entreprise . charges"
/>
</StyledGrid>
</WhenAlreadyDefined>
<WhenNotAlreadyDefined dottedName="entreprise . chiffre d'affaires">
<Grid item xs>
<Label>
<Trans>Votre rémunération totale estimée</Trans>
</Label>
<StyledValue
linkToRule={false}
expression="dirigeant . rémunération . totale"
/>
</Grid>
</WhenNotAlreadyDefined>
<StyledGrid item xs={12} sm={6} lg={5}>
<Label>
<Trans>Vos charges estimées</Trans>
</Label>
<StyledValue
linkToRule={false}
unit="€/an"
expression="entreprise . charges"
/>
</StyledGrid>
<GridEditLink item xs={12} lg={3}>
<GridEditLink item xs={12} sm="auto">
<Link
to={absoluteSitePaths.assistants['choix-du-statut'].rémunération}
// $noUnderline