diff --git a/modele-social/règles/profession-libérale.yaml b/modele-social/règles/profession-libérale.yaml index 9cddab342..c66c5afa7 100644 --- a/modele-social/règles/profession-libérale.yaml +++ b/modele-social/règles/profession-libérale.yaml @@ -467,7 +467,8 @@ dirigeant . indépendant . PL . PAMC . proportion recette activité non conventi La proportion ne peut pas être supérieure à 100% dirigeant . indépendant . PL . PAMC . remplaçant: - question: Au 1er janvier 2020, exerciez-vous votre activité exclusivement en tant que remplaçant ? + question: + texte: Au {{ période . début d'année }}, exerciez-vous votre activité exclusivement en tant que remplaçant ? description: | Les practicien et auxiliaire médical exerçant une activité de remplacement ne sont pas redevables de la contribution aux unions régionales des professionnels de santé (CURPS) par défaut: non @@ -491,7 +492,7 @@ dirigeant . indépendant . PL . PAMC . CURPS: acronyme: CURPS applicable si: toutes ces conditions: - - entreprise . date de création < 01/2020 + - entreprise . date de création < période . début d'année - revenu professionnel > 0 non applicable si: une de ces conditions: diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index ba32d5678..2bb0ad585 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -2425,8 +2425,14 @@ contrat salarié . temps de travail . heures complémentaires . seuil légal: contrat salarié . statut JEI: titre: Statut JEI - question: >- - La personne bénéficie-t-elle de l'exonération Jeune Entreprise Innovante (JEI) ? + question: + variations: + - si: dirigeant + alors: + texte: Bénéficiez-vous de l'exonération Jeune Entreprise Innovante (JEI) ? + - sinon: + texte: Le salarié bénéficie-t-il de l'exonération Jeune Entreprise Innovante (JEI) ? + description: >- Le statut de jeune entreprise innovante (JEI) a été créé par la loi de finances pour 2004 et permet aux PME de moins de 8 ans consacrant 15% au diff --git a/modele-social/règles/situation-personnelle.yaml b/modele-social/règles/situation-personnelle.yaml index ef35109d0..79b308df9 100644 --- a/modele-social/règles/situation-personnelle.yaml +++ b/modele-social/règles/situation-personnelle.yaml @@ -12,7 +12,13 @@ situation personnelle . domiciliation fiscale à l'étranger: Si votre résidence fiscale est située hors de France, vos revenus d’activité ne sont pas soumis à la CSG-CRDS. Une cotisation maladie majorée de 14,5% sera en revanche applicable. - question: La résidence fiscale de la personne est-elle située à l'étranger ? + question: + variations: + - si: dirigeant + alors: + texte: Votre résidence fiscale est-elle située à l'étranger ? + - sinon: + texte: La résidence fiscale du salarié est-elle située à l'étranger ? rend non applicable: - dirigeant . indépendant . cotisations et contributions . CSG et CRDS - contrat salarié . CSG et CRDS diff --git a/site/source/components/conversation/Conversation.tsx b/site/source/components/conversation/Conversation.tsx index fc241ac55..5a5d93435 100644 --- a/site/source/components/conversation/Conversation.tsx +++ b/site/source/components/conversation/Conversation.tsx @@ -19,9 +19,9 @@ import { situationSelector, } from '@/selectors/simulationSelectors' import { TrackPage } from '../../ATInternetTracking' -import './conversation.css' import { ExplicableRule } from './Explicable' import SeeAnswersButton from './SeeAnswersButton' +import { evaluateQuestion } from '@/utils' export type ConversationProps = { customEndMessages?: React.ReactNode @@ -66,7 +66,7 @@ export default function Conversation({ customEndMessages }: ConversationProps) { `} >

- {engine.getRule(currentQuestion).rawNode.question} + {evaluateQuestion(engine, engine.getRule(currentQuestion))}

diff --git a/site/source/components/conversation/SeeAnswersButton.tsx b/site/source/components/conversation/SeeAnswersButton.tsx index 1e32775a7..242989bf5 100644 --- a/site/source/components/conversation/SeeAnswersButton.tsx +++ b/site/source/components/conversation/SeeAnswersButton.tsx @@ -2,7 +2,6 @@ import { Button } from '@/design-system/buttons' import PopoverWithTrigger from '@/design-system/PopoverWithTrigger' import { Trans } from 'react-i18next' import Answers from './AnswerList' -import './conversation.css' export default function SeeAnswersButton() { return ( diff --git a/site/source/components/conversation/conversation.css b/site/source/components/conversation/conversation.css deleted file mode 100644 index abe0fe4d5..000000000 --- a/site/source/components/conversation/conversation.css +++ /dev/null @@ -1,91 +0,0 @@ -.step fieldset { - display: flex; - justify-content: flex-end; - flex-wrap: wrap; - align-items: baseline; -} - -.step fieldset ul { - list-style-type: none; -} - -.step fieldset .step.question .variantLeaf, -.step fieldset .step.question { - justify-content: flex-end; -} - -.step.question .variant { - margin-bottom: 1em; -} - -.step.question .variant > ul { - border-right: 1px dashed #333; - text-align: right; - padding-right: 0.6em; - padding-top: 0.6em; - padding-left: 2em; - margin-left: 1rem; -} -.step.question .variant > div { - padding-right: 0.6em; - font-weight: 600; - text-align: right; -} - -.step.question fieldset span { - white-space: nowrap; -} -.step.question .variantLeaf { - display: flex; -} - -.step.question .variant .variantLeaf { - display: inline-flex; - align-items: center; -} - -.step.question .variant .variantLeaf:not(:first-child) { - margin-left: 0.6rem; -} -.step.question .variantLeaf.aucun label { - font-weight: 800; - text-decoration: underline; -} - -.step .input > :first-child { - text-align: right; -} - -.step label.suffix { - vertical-align: baseline; - transition: color 0.1s; - margin-left: 0.6rem; -} -.step label.userAnswerButton { - margin-bottom: 0.6rem; - background: none; - border: 1px solid var(--color) !important; - text-transform: none !important; - background-color: white; - color: var(--textColorOnWhite) !important; -} -.step label.userAnswerButton.selected { - background: var(--lightColor); - color: var(--textColor) !important; -} - -@media print { - .step label.userAnswerButton.selected { - border: none; - } - - .step label.userAnswerButton:not(.selected) { - display: none; - } -} -@media (hover) { - .step label.userAnswerButton:hover:not(.selected) { - background: var(--lighterColor); - transition: all 0.05s; - } -} diff --git a/site/source/pages/Gerer/AideDéclarationIndépendant/Fields.tsx b/site/source/pages/Gerer/AideDéclarationIndépendant/Fields.tsx index f2bf3397f..0b58e8d16 100644 --- a/site/source/pages/Gerer/AideDéclarationIndépendant/Fields.tsx +++ b/site/source/pages/Gerer/AideDéclarationIndépendant/Fields.tsx @@ -12,6 +12,7 @@ import { useCallback, useContext } from 'react' import { useDispatch, useSelector } from 'react-redux' import { situationSelector } from '@/selectors/simulationSelectors' import { Question } from './PreviousVersion' +import { evaluateQuestion } from '@/utils' type SubSectionProp = { dottedName: DottedName @@ -86,7 +87,7 @@ export function SimpleField({ - {question ?? rule.rawNode.question}  + {evaluateQuestion(engine, rule)}  {summary ?? rule.rawNode.résumé} diff --git a/site/source/pages/Gerer/DemandeMobilite/index.tsx b/site/source/pages/Gerer/DemandeMobilite/index.tsx index 4b7744d57..20365311b 100644 --- a/site/source/pages/Gerer/DemandeMobilite/index.tsx +++ b/site/source/pages/Gerer/DemandeMobilite/index.tsx @@ -63,7 +63,9 @@ const useFields = ( return ( evaluation.nodeValue !== null && - (rule.rawNode.question || rule.rawNode.API || rule.rawNode.type) + (evaluateQuestion(engine, rule) || + rule.rawNode.API || + rule.rawNode.type) ) }) .map((dottedName) => engine.getRule(dottedName)) diff --git a/site/source/pages/Gerer/Home.tsx b/site/source/pages/Gerer/Home.tsx index 3c3827af4..15f645cf4 100644 --- a/site/source/pages/Gerer/Home.tsx +++ b/site/source/pages/Gerer/Home.tsx @@ -14,6 +14,7 @@ import { Container, Spacing } from '@/design-system/layout' import { H2, H3, H4 } from '@/design-system/typography/heading' import { Body, Intro } from '@/design-system/typography/paragraphs' import { useQuestionList } from '@/hooks/useQuestionList' +import { evaluateQuestion } from '@/utils' import { Grid } from '@mui/material' import Engine, { Evaluation } from 'publicodes' import { useContext } from 'react' @@ -256,6 +257,7 @@ export const AskCompanyMissingDetails = () => { useSimulationConfig(companyDetailsConfig) const [questions, onQuestionAnswered] = useQuestionList() + const engine = useEngine() return ( <> @@ -273,7 +275,7 @@ export const AskCompanyMissingDetails = () => { {questions.map((question) => ( -

{question.rawNode.question}

+

{evaluateQuestion(engine, question)}

{ window.addEventListener('message', returnOffset) }) } + +export function evaluateQuestion( + engine: Engine, + question: RuleNode +): string | undefined | number { + if ( + question.rawNode.question && + typeof question.rawNode.question === 'object' + ) { + return engine.evaluate(question.rawNode.question).nodeValue as string + } + + return question.rawNode.question +} diff --git a/site/test/regressions/__snapshots__/simulations.test.ts.snap b/site/test/regressions/__snapshots__/simulations.test.ts.snap index e43f0c4f7..ae1d77021 100644 --- a/site/test/regressions/__snapshots__/simulations.test.ts.snap +++ b/site/test/regressions/__snapshots__/simulations.test.ts.snap @@ -319,11 +319,11 @@ exports[`calculate simulations-professions-libérales > CIPAV 8`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement" `; -exports[`calculate simulations-professions-libérales > auxiliaire médical 1`] = `"[30000,0,8060,21940,1212,20728]"`; +exports[`calculate simulations-professions-libérales > auxiliaire médical 1`] = `"[30000,0,8078,21922,1208,20714]"`; -exports[`calculate simulations-professions-libérales > auxiliaire médical 2`] = `"[30000,0,8381,21619,1160,20459]"`; +exports[`calculate simulations-professions-libérales > auxiliaire médical 2`] = `"[30000,0,8398,21602,1157,20445]"`; -exports[`calculate simulations-professions-libérales > auxiliaire médical 3`] = `"[300000,0,62709,237291,89754,147537]"`; +exports[`calculate simulations-professions-libérales > auxiliaire médical 3`] = `"[300000,0,62883,237117,89673,147444]"`; exports[`calculate simulations-professions-libérales > avocat 1`] = ` "[50000,0,11135,38865,5988,32877] @@ -342,45 +342,45 @@ exports[`calculate simulations-professions-libérales > expert-comptable 2`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement" `; -exports[`calculate simulations-professions-libérales > médecin 1`] = `"[50000,0,14246,35754,5055,30699]"`; +exports[`calculate simulations-professions-libérales > médecin 1`] = `"[50000,0,14385,35615,5011,30604]"`; -exports[`calculate simulations-professions-libérales > médecin 2`] = `"[50000,0,21962,28038,2740,25298]"`; +exports[`calculate simulations-professions-libérales > médecin 2`] = `"[50000,0,22059,27941,2710,25231]"`; -exports[`calculate simulations-professions-libérales > médecin 3`] = `"[300000,0,87748,212252,78486,133766]"`; +exports[`calculate simulations-professions-libérales > médecin 3`] = `"[300000,0,87915,212085,78409,133676]"`; -exports[`calculate simulations-professions-libérales > médecin 4`] = `"[400000,0,107868,292132,117244,174888]"`; +exports[`calculate simulations-professions-libérales > médecin 4`] = `"[400000,0,108031,291969,117164,174805]"`; exports[`calculate simulations-professions-libérales > médecin 5`] = ` "[120000,0,36415,83585,21327,62258] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement" `; -exports[`calculate simulations-professions-libérales > médecin 6`] = `"[50000,0,14246,35754,5055,30699]"`; +exports[`calculate simulations-professions-libérales > médecin 6`] = `"[50000,0,14385,35615,5011,30604]"`; -exports[`calculate simulations-professions-libérales > sage-femme 1`] = `"[50000,0,12451,37549,5593,31956]"`; +exports[`calculate simulations-professions-libérales > sage-femme 1`] = `"[50000,0,12479,37521,5584,31937]"`; exports[`calculate simulations-professions-libérales > sage-femme 2`] = ` -"[20000,0,5178,14822,31,14791] +"[20000,0,5190,14810,29,14781] Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; exports[`calculate simulations-professions-libérales > sage-femme 3`] = ` -"[4000,0,1313,2687,0,2687] +"[4000,0,1315,2685,0,2685] Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable, dirigeant . indépendant . PL . CARCDSF . sage-femme . exonération PCV" `; exports[`calculate simulations-professions-libérales > sage-femme 4`] = ` -"[20000,0,5178,14822,31,14791] +"[20000,0,5190,14810,29,14781] Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; exports[`calculate simulations-professions-libérales > sage-femme 5`] = ` -"[20000,0,5255,14745,18,14727] +"[20000,0,5267,14733,17,14716] Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; exports[`calculate simulations-professions-libérales > sage-femme 6`] = ` -"[20000,0,5332,14668,6,14662] +"[20000,0,5343,14657,4,14653] Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `;