Evalue les questions pour afficher un texte dynamique

pull/2080/head
Johan Girod 2022-03-31 11:16:59 +02:00
parent ab51ddc6c9
commit 383676843d
11 changed files with 57 additions and 117 deletions

View File

@ -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:

View File

@ -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

View File

@ -12,7 +12,13 @@ situation personnelle . domiciliation fiscale à l'étranger:
Si votre résidence fiscale est située hors de France, vos revenus dactivité 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

View File

@ -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) {
`}
>
<H3>
{engine.getRule(currentQuestion).rawNode.question}
{evaluateQuestion(engine, engine.getRule(currentQuestion))}
<ExplicableRule light dottedName={currentQuestion} />
</H3>
</div>

View File

@ -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 (

View File

@ -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;
}
}

View File

@ -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({
<FromTop>
<Question>
<Intro>
{question ?? rule.rawNode.question}&nbsp;
{evaluateQuestion(engine, rule)}&nbsp;
<ExplicableRule dottedName={dottedName} />
</Intro>
<SmallBody>{summary ?? rule.rawNode.résumé}</SmallBody>

View File

@ -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))

View File

@ -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) => (
<FromTop key={question.dottedName}>
<H4>{question.rawNode.question}</H4>
<H4>{evaluateQuestion(engine, question)}</H4>
<RuleInput
dottedName={question.dottedName}
onChange={onQuestionAnswered(question.dottedName)}

View File

@ -1,4 +1,4 @@
import { formatValue, Rule } from 'publicodes'
import Engine, { formatValue, Rule, RuleNode } from 'publicodes'
export function capitalise0(name: undefined): undefined
export function capitalise0(name: string): string
@ -203,3 +203,17 @@ export async function getIframeOffset(): Promise<number> {
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
}

View File

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