diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx new file mode 100644 index 000000000..e679a2f92 --- /dev/null +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx @@ -0,0 +1,148 @@ +import { Explicable } from 'Components/conversation/Explicable' + +export function ExplicationsResultatFiscal() { + return ( + + <> +

Quelles exonérations inclure ?

+

+ Pour calculer le montant du résultat fiscal avant déduction des + exonérations et des charges sociales à indiquer dans ce simulateur, + vous pouvez utiliser votre liasse fiscale, en reprenant les montants + indiqués dans les lignes fiscales du tableau ci-dessous, en fonction + de votre situation (imposition au réel normal ou au réel simplifié). +

+

L’opération à effectuer est la suivante :

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Exonérations (2) +
+ Résultat fiscal (1) + + Exonérations liées aux zones / activités + + Exonérations Madelin et plan d’épargne retraite + + Exonérations de plus-values à court terme + Suramortissement productif
BIC réel normal + 2058-A-SD +
+ Ligne XN (bénéfice) Ligne XO (déficit) +
+ 2058-A-SD +
+ Lignes K9 / L6 / ØV / PP / L2 / 1F / PC / L5 / PA / XC / PB +
+ 2053-SD +
+ Lignes A7 et A8 +
+ 2058-A-SD +
+ Ligne XG (montant inclus) +
+ 2058-A-SD +
+ Lignes X9 et YA +
BIC réel simplifié + 2033-B-SD +
+ Ligne 370 (bénéfice) Ligne 372 (déficit) +
+ 2033 B-SD +
+ Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 138 / 990 / 993 +
+ 2033-SD +
+ Lignes 325 et 327 +
+ 2033 B-SD +
+ Ligne 350 (montant inclus) +
+ 2033 B-SD +
+ Lignes 655 et 643 +
BNC déclaration contrôlée + 2035-B-SD +
+ Ligne CP (bénéfice) Ligne CR (déficit) +
+ 2035-B-SD +
+ Lignes CS / AW / CU / CI / AX / CQ +
+ 2035-A-SD +
+ Lignes BZ et BU +
+ 2035-A-SD +
+ Ligne CL (montant inclus) +
+ +
+ ) +} diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx new file mode 100644 index 000000000..6386f000e --- /dev/null +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx @@ -0,0 +1,108 @@ +import { updateSituation } from 'Actions/actions' +import { ExplicableRule } from 'Components/conversation/Explicable' +import RuleInput from 'Components/conversation/RuleInput' +import Animate from 'Components/ui/animate' +import { EngineContext } from 'Components/utils/EngineContext' +import { useNextQuestions } from 'Components/utils/useNextQuestion' +import { DottedName } from 'modele-social' +import { RuleNode } from 'publicodes' +import { useCallback, useContext } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { situationSelector } from 'Selectors/simulationSelectors' +import { Question } from './index' + +type SubSectionProp = { + dottedName: DottedName + hideTitle?: boolean +} +export function SubSection({ + dottedName: sectionDottedName, + hideTitle = false, +}: SubSectionProp) { + const engine = useContext(EngineContext) + const ruleTitle = engine.getRule(sectionDottedName)?.title + const nextSteps = useNextQuestions() + const situation = useSelector(situationSelector) + const title = hideTitle ? null : ruleTitle + const subQuestions = [ + ...(Object.keys(situation) as Array), + ...nextSteps, + ].filter((nextStep) => { + const { + dottedName, + rawNode: { question }, + } = engine.getRule(nextStep) + return !!question && dottedName.startsWith(sectionDottedName) + }) + + return ( + <> + {!!subQuestions.length && title &&

{title}

} + {subQuestions.map((dottedName) => ( + + ))} + + ) +} +type SimpleFieldProps = { + dottedName: DottedName + summary?: RuleNode['rawNode']['résumé'] + question?: RuleNode['rawNode']['question'] + showSuggestions?: boolean +} +export function SimpleField({ + dottedName, + question, + summary, + showSuggestions, +}: SimpleFieldProps) { + const dispatch = useDispatch() + const engine = useContext(EngineContext) + const evaluation = engine.evaluate(dottedName) + const rule = engine.getRule(dottedName) + const situation = useSelector(situationSelector) + + const dispatchValue = useCallback( + (value, dottedName) => { + dispatch(updateSituation(dottedName, value)) + }, + [dispatch] + ) + + if ( + !(dottedName in situation) && + evaluation.nodeValue === false && + !(dottedName in evaluation.missingVariables) + ) { + return null + } + return ( +
+ + +
+

+ {question ?? rule.rawNode.question}  + +

+

{summary ?? rule.rawNode.résumé}

+
+ +
+
+
+ ) +} diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index ba933c89d..8e5db7ffe 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -1,6 +1,5 @@ import { updateSituation } from 'Actions/actions' import Aide from 'Components/conversation/Aide' -import { Explicable, ExplicableRule } from 'Components/conversation/Explicable' import RuleInput from 'Components/conversation/RuleInput' import Value, { Condition, WhenAlreadyDefined } from 'Components/EngineValue' import PageHeader from 'Components/PageHeader' @@ -9,13 +8,10 @@ import RuleLink from 'Components/RuleLink' import 'Components/TargetSelection.css' import Animate from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' -import { EngineContext, useEngine } from 'Components/utils/EngineContext' +import { useEngine } from 'Components/utils/EngineContext' import { Markdown } from 'Components/utils/markdown' -import { useNextQuestions } from 'Components/utils/useNextQuestion' import useSimulationConfig from 'Components/utils/useSimulationConfig' -import { DottedName } from 'modele-social' -import { RuleNode } from 'publicodes' -import { useCallback, useContext } from 'react' +import { useCallback } from 'react' import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -25,6 +21,8 @@ import styled from 'styled-components' import { TrackPage } from '../../../ATInternetTracking' import { CompanySection } from '../Home' import simulationConfig from './config.yaml' +import { ExplicationsResultatFiscal } from './ExplicationResultatFiscal' +import { SimpleField, SubSection } from './Fields' import illustration from './undraw_fill_in_mie5.svg' export default function AideDéclarationIndépendant() { useSimulationConfig(simulationConfig) @@ -211,6 +209,9 @@ export default function AideDéclarationIndépendant() { dottedName="dirigeant . indépendant . cotisations et contributions . exonérations" hideTitle /> + + +

International @@ -237,250 +238,6 @@ export default function AideDéclarationIndépendant() { ) } -type SubSectionProp = { - dottedName: DottedName - hideTitle?: boolean -} -function ExplicationsResultatFiscal() { - return ( - - <> -

Quelles exonérations inclure ?

-

- Pour calculer le montant du résultat fiscal avant déduction des - exonérations et des charges sociales à indiquer dans ce simulateur, - vous pouvez utiliser votre liasse fiscale, en reprenant les montants - indiqués dans les lignes fiscales du tableau ci-dessous, en fonction - de votre situation (imposition au réel normal ou au réel simplifié). -

-

L’opération à effectuer est la suivante :

-
    -
  • - Déterminez le résultat fiscal dans votre liasse, sans déduire le - montant de vos cotisations et contributions sociales aux régimes - obligatoires de sécurité sociale. Prenez le résultat fiscal - correspondant (1) -
  • -
  • - Ajoutez les exonérations (2) -
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Exonérations (2) -
- Résultat fiscal (1) - - Exonérations liées aux zones / activités - - Exonérations Madelin et plan d’épargne retraite - - Exonérations de plus-values à court terme - Suramortissement productif
BIC réel normal - 2058-A-SD -
- Ligne XN (bénéfice) Ligne XO (déficit) -
- 2058-A-SD -
- Lignes K9 / L6 / ØV / PP / L2 / 1F / PC / L5 / PA / XC / PB -
- 2053-SD -
- Lignes A7 et A8 -
- 2058-A-SD -
- Ligne XG (montant inclus) -
- 2058-A-SD -
- Lignes X9 et YA -
BIC réel simplifié - 2033-B-SD -
- Ligne 370 (bénéfice) Ligne 372 (déficit) -
- 2033 B-SD -
- Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 138 / 990 / 993 -
- 2033-SD -
- Lignes 325 et 327 -
- 2033 B-SD -
- Ligne 350 (montant inclus) -
- 2033 B-SD -
- Lignes 655 et 643 -
BNC déclaration contrôlée - 2035-B-SD -
- Ligne CP (bénéfice) Ligne CR (déficit) -
- 2035-B-SD -
- Lignes CS / AW / CU / CI / AX / CQ -
- 2035-A-SD -
- Lignes BZ et BU -
- 2035-A-SD -
- Ligne CL (montant inclus) -
- -
- ) -} - -function SubSection({ - dottedName: sectionDottedName, - hideTitle = false, -}: SubSectionProp) { - const engine = useContext(EngineContext) - const ruleTitle = engine.getRule(sectionDottedName)?.title - const nextSteps = useNextQuestions() - const situation = useSelector(situationSelector) - const title = hideTitle ? null : ruleTitle - const subQuestions = [ - ...(Object.keys(situation) as Array), - ...nextSteps, - ].filter((nextStep) => { - const { - dottedName, - rawNode: { question }, - } = engine.getRule(nextStep) - return !!question && dottedName.startsWith(sectionDottedName) - }) - - return ( - <> - {!!subQuestions.length && title &&

{title}

} - {subQuestions.map((dottedName) => ( - - ))} - - ) -} - -type SimpleFieldProps = { - dottedName: DottedName - summary?: RuleNode['rawNode']['résumé'] - question?: RuleNode['rawNode']['question'] - showSuggestions?: boolean -} -function SimpleField({ - dottedName, - question, - summary, - showSuggestions, -}: SimpleFieldProps) { - const dispatch = useDispatch() - const engine = useContext(EngineContext) - const evaluation = engine.evaluate(dottedName) - const rule = engine.getRule(dottedName) - const situation = useSelector(situationSelector) - - const dispatchValue = useCallback( - (value, dottedName) => { - dispatch(updateSituation(dottedName, value)) - }, - [dispatch] - ) - - if ( - !(dottedName in situation) && - evaluation.nodeValue === false && - !(dottedName in evaluation.missingVariables) - ) { - return null - } - return ( -
- - -
-

- {question ?? rule.rawNode.question}  - -

-

{summary ?? rule.rawNode.résumé}

-
- -
-
-
- ) -} - function Results() { const engine = useEngine() @@ -651,7 +408,7 @@ const FormBlock = styled.section` } ` -const Question = styled.div` +export const Question = styled.div` margin-top: 1em; ` const BigInput = styled.div`