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"
`;