Ajoute un message explicatif quand la valeur renseignée abouti a un résultat impossible

pull/2828/head
Johan Girod 2023-09-28 15:26:51 +02:00
parent 4d79e18139
commit c69e6ac9b0
10 changed files with 69 additions and 52 deletions

View File

@ -31,7 +31,7 @@
"@apidevtools/swagger-cli": "^4.0.4",
"@koa/cors": "^4.0.0",
"@koa/router": "^12.0.0",
"@publicodes/api": "^1.0.0-beta.75",
"@publicodes/api": "^1.0.0-beta.76",
"@sentry/node": "^7.70.0",
"@sentry/utils": "^7.70.0",
"got": "^13.0.0",
@ -42,7 +42,7 @@
"koa-static": "^5.0.0",
"modele-social": "workspace:^",
"nodemon": "^3.0.1",
"publicodes": "^1.0.0-beta.75",
"publicodes": "^1.0.0-beta.76",
"rate-limiter-flexible": "^2.4.2",
"swagger-ui-dist": "^5.7.2"
},

View File

@ -19,7 +19,7 @@
"devDependencies": {
"js-yaml": "^4.1.0",
"onchange": "^7.1.0",
"publicodes": "^1.0.0-beta.75"
"publicodes": "^1.0.0-beta.76"
},
"peerDependencies": {
"publicodes": "^1.0.0-beta.55"

View File

@ -21,7 +21,7 @@
"devDependencies": {
"js-yaml": "^4.1.0",
"onchange": "^7.1.0",
"publicodes": "^1.0.0-beta.75"
"publicodes": "^1.0.0-beta.76"
},
"peerDependencies": {
"publicodes": "^1.0.0-beta.55"

View File

@ -69,8 +69,8 @@
"isbot": "^3.7.0",
"markdown-to-jsx": "^7.3.2",
"modele-social": "workspace:^",
"publicodes": "^1.0.0-beta.75",
"publicodes-react": "^1.0.0-beta.75",
"publicodes": "^1.0.0-beta.76",
"publicodes-react": "^1.0.0-beta.76",
"react": "^18.2.0",
"react-aria": "^3.24.0",
"react-day-picker": "^8.8.2",

View File

@ -1,13 +1,15 @@
import { DottedName } from 'modele-social'
import Engine, { RuleNode } from 'publicodes'
import { useTranslation } from 'react-i18next'
import { Trans, useTranslation } from 'react-i18next'
import { useDispatch, useSelector } from 'react-redux'
import { styled } from 'styled-components'
import { useEngine, useInversionFail } from '@/components/utils/EngineContext'
import { Message } from '@/design-system'
import { CloseButton } from '@/design-system/buttons'
import { Body } from '@/design-system/typography/paragraphs'
import { Emoji } from '@/design-system/emoji'
import { Strong } from '@/design-system/typography'
import { Body, SmallBody } from '@/design-system/typography/paragraphs'
import { hideNotification } from '@/store/actions/actions'
import { RootState } from '@/store/reducers/rootReducer'
@ -51,18 +53,7 @@ export default function Notifications() {
const dispatch = useDispatch()
const messages: Array<Notification> = (
inversionFail
? [
{
dottedName: 'inversion fail',
description: t(
'simulateurs.inversionFail',
'Le montant saisi abouti à un résultat impossible. Cela est dû à un effet de seuil dans le calcul des cotisations.\n\nNous vous invitons à réessayer en modifiant légèrement le montant renseigné (quelques euros de plus par exemple).'
),
sévérité: 'avertissement',
} as Notification,
]
: (getNotifications(engine) as Array<Notification>)
getNotifications(engine) as Array<Notification>
).filter(({ dottedName }) => !hiddenNotifications?.includes(dottedName))
const isMultiline = (str: string) => str.trim().split('\n').length > 1
@ -74,6 +65,22 @@ export default function Notifications() {
}}
>
<Appear>
{inversionFail && (
<Message icon={<StyledEmoji emoji="🤯" />} type="info">
<Trans i18nkey="simulateurs.inversionFail">
<Body>
Le montant demandé n'est <Strong>pas calculable...</Strong>
</Body>
<SmallBody $grey>
Il n'est pas possible d'obtenir ce montant dans la vrai vie à
cause d'un effet de seuil dans le calcul des cotisations ou de
l'impôt. Vous pouvez réessayer en modifiant la valeur
renseignée.
</SmallBody>
</Trans>
</Message>
)}
{messages.map(({ sévérité, dottedName, résumé, description }) => (
<Message
icon
@ -121,3 +128,7 @@ const Absolute = styled.div<{ $isMultiline: boolean }>`
margin-bottom: ${({ theme }) => theme.spacings.xxs};
}
`
const StyledEmoji = styled(Emoji)`
transform: scale(1.5);
`

View File

@ -12,6 +12,7 @@ import { useDispatch, useSelector } from 'react-redux'
import { deleteFromSituation } from '@/store/actions/actions'
import {
companySituationSelector,
configObjectifsSelector,
configSituationSelector,
situationSelector,
} from '@/store/selectors/simulationSelectors'
@ -186,7 +187,14 @@ export const useSetupSafeSituation = (engine: Engine<DottedName>) => {
}
export function useInversionFail() {
return useContext(EngineContext).inversionFail()
const engine = useEngine()
const objectifs = useSelector(configObjectifsSelector).flatMap(
(objectif) => engine.evaluate(objectif).nodeValue
)
const inversionFail =
engine.inversionFail() && objectifs.some((o) => o === undefined)
return inversionFail
}
export type EvaluatedRule = EvaluatedNode &

View File

@ -20,6 +20,11 @@
<0>Activité mixte</0>: <0>Mixed activity</0>
<0>Impôt sur le revenu</0> (IR): <0>Income tax</0> (IR)
<0>Impôt sur les sociétés</0> (IS): <0>Corporate income tax</0> (IS)
<0>Le montant demandé n'est <1>pas calculable...</1></0><1>Il n'est pas possible d'obtenir ce montant dans la vrai vie à cause d'un effet de seuil dans le calcul des cotisations ou de l'impôt. Vous pouvez réessayer en modifiant la valeur renseignée.</1>:
<0>The amount requested <1>cannot be calculated</1>...</0><1>It is not
possible to obtain this amount in real life due to a threshold effect in the
calculation of contributions or tax. You can try again by changing the
value.</1>
<0>Versement libératoire</0> de l'impôt sur le revenu: <0>Payment in full discharge</0> of income tax
API REST de simulation: Simulation REST API
API REST, en savoir plus sur l'API REST: API REST, more about API REST
@ -1602,12 +1607,6 @@ simulateurs:
urssaf: Urssaf collects contributions used to finance the social security system
(health insurance, family allowances, long-term care<1> and <3>
basic</3> pensions</1>).
inversionFail: >-
The amount entered gives an impossible result. This is due to a threshold
effect in the calculation of contributions.
Please try again, slightly modifying the amount entered (a few euros more, for example).
précision:
défaut: "Improve your simulation by answering the questions below:"
warning:

View File

@ -22,6 +22,11 @@
<0>Activité mixte</0>: <0>Activité mixte</0>
<0>Impôt sur le revenu</0> (IR): <0>Impôt sur le revenu</0> (IR)
<0>Impôt sur les sociétés</0> (IS): <0>Impôt sur les sociétés</0> (IS)
<0>Le montant demandé n'est <1>pas calculable...</1></0><1>Il n'est pas possible d'obtenir ce montant dans la vrai vie à cause d'un effet de seuil dans le calcul des cotisations ou de l'impôt. Vous pouvez réessayer en modifiant la valeur renseignée.</1>:
<0>Le montant demandé n'est <1>pas calculable...</1></0><1>Il n'est pas
possible d'obtenir ce montant dans la vrai vie à cause d'un effet de seuil
dans le calcul des cotisations ou de l'impôt. Vous pouvez réessayer en
modifiant la valeur renseignée.</1>
<0>Versement libératoire</0> de l'impôt sur le revenu: <0>Versement libératoire</0> de l'impôt sur le revenu
API REST de simulation: API REST de simulation
API REST, en savoir plus sur l'API REST: API REST, en savoir plus sur l'API REST
@ -1704,12 +1709,6 @@ simulateurs:
urssaf: LUrssaf recouvre les cotisations servant au financement de la sécurité
sociale (assurance maladie, allocations familiales, dépendance<1> et
retraite <3> de base</3></1>).
inversionFail: >-
Le montant saisi abouti à un résultat impossible. Cela est dû à un effet de
seuil dans le calcul des cotisations.
Nous vous invitons à réessayer en modifiant légèrement le montant renseigné (quelques euros de plus par exemple).
précision:
défaut: "Améliorez votre simulation en répondant aux questions :"
warning:

View File

@ -65,7 +65,7 @@ En complément du financement apporté par lUrssaf, le projet bénéficie du
---
En 2023, le financement complémentaire apporté par le programme [France Relance](https://france-relance.transformation.gouv.fr/) prend fin. Par ailleurs, l'Urssaf réduit sa participation à 250 k€ TTC. Le budget est donc en très net baisse, le plus faible depuis la création du produit.
En 2023, le financement complémentaire apporté par le programme [France Relance](https://france-relance.transformation.gouv.fr/) prend fin. Par ailleurs, l'Urssaf réduit sa participation à 250 k€ TTC. Le budget est donc en très nette baisse, le plus faible depuis la création du produit.
---

View File

@ -7179,9 +7179,9 @@ __metadata:
languageName: node
linkType: hard
"@publicodes/api@npm:^1.0.0-beta.75":
version: 1.0.0-beta.75
resolution: "@publicodes/api@npm:1.0.0-beta.75"
"@publicodes/api@npm:^1.0.0-beta.76":
version: 1.0.0-beta.76
resolution: "@publicodes/api@npm:1.0.0-beta.76"
dependencies:
"@koa/cors": ^3.4.3
"@koa/router": ^10.1.1
@ -7190,7 +7190,7 @@ __metadata:
openapi-validator-middleware: ^3.2.6
peerDependencies:
publicodes: ^1.0.0-beta.47
checksum: f2664f2cd124d2193caaedf7b1842ca5173ddba50e5e519f1b12f7e05e0c227bd982213cbe2a3bd74cfa169a257ff407bed26d0003cc135ee058b66a533ca73d
checksum: b501713a8f3a3dcd0d072550306cd2fce671e3238cc3ca1196f304191e17d5ab195addb1fb6c3cff258482db7e4a1405bd2c29e7bda11a05e057577785078c59
languageName: node
linkType: hard
@ -13440,7 +13440,7 @@ __metadata:
"@apidevtools/swagger-cli": ^4.0.4
"@koa/cors": ^4.0.0
"@koa/router": ^12.0.0
"@publicodes/api": ^1.0.0-beta.75
"@publicodes/api": ^1.0.0-beta.76
"@sentry/node": ^7.70.0
"@sentry/utils": ^7.70.0
"@types/ioredis-mock": ^8.2.2
@ -13459,7 +13459,7 @@ __metadata:
koa-static: ^5.0.0
modele-social: "workspace:^"
nodemon: ^3.0.1
publicodes: ^1.0.0-beta.75
publicodes: ^1.0.0-beta.76
rate-limiter-flexible: ^2.4.2
swagger-ui-dist: ^5.7.2
ts-node: ^10.9.1
@ -18349,7 +18349,7 @@ __metadata:
dependencies:
js-yaml: ^4.1.0
onchange: ^7.1.0
publicodes: ^1.0.0-beta.75
publicodes: ^1.0.0-beta.76
peerDependencies:
publicodes: ^1.0.0-beta.55
languageName: unknown
@ -23840,7 +23840,7 @@ __metadata:
dependencies:
js-yaml: ^4.1.0
onchange: ^7.1.0
publicodes: ^1.0.0-beta.75
publicodes: ^1.0.0-beta.76
peerDependencies:
publicodes: ^1.0.0-beta.55
languageName: unknown
@ -26047,25 +26047,25 @@ __metadata:
languageName: node
linkType: hard
"publicodes-react@npm:^1.0.0-beta.75":
version: 1.0.0-beta.75
resolution: "publicodes-react@npm:1.0.0-beta.75"
"publicodes-react@npm:^1.0.0-beta.76":
version: 1.0.0-beta.76
resolution: "publicodes-react@npm:1.0.0-beta.76"
dependencies:
styled-components: ^6.0.8
peerDependencies:
publicodes: ^1.0.0-beta.71
react: ^17 || ^18
react-dom: ^17 || ^18
checksum: 070875cd63eb1d6cd7a7844eb54f14e4d411631f0d0d0332987dd5274f940c4a0a53345fe26e90dbfb55c44a6e69f0a0a0f34e0db2ab30cdf31a3b1fd3a4e1f5
checksum: 2d1870a134aef4df948cb365bd211484e6430952e70264a027b2b40f81fcaba2ff0b47a05efeef2ac9fb318411a1ce1c762b5ed8d4e597da04d3c116c77a67ec
languageName: node
linkType: hard
"publicodes@npm:^1.0.0-beta.75":
version: 1.0.0-beta.75
resolution: "publicodes@npm:1.0.0-beta.75"
"publicodes@npm:^1.0.0-beta.76":
version: 1.0.0-beta.76
resolution: "publicodes@npm:1.0.0-beta.76"
peerDependencies:
"@types/mocha": ^9.0.0
checksum: 111a52a216fd758e3b9f36da3660b8c3f8d3a7589abf2ab2ad51cb8b731d3302a2ceb41291919f3128f3d87b07af083b020ba2fc59fdffcd5700c2cc5a9195f9
checksum: e36b0a3bf08ddab20dda7e588a9138c1c21e10f013146abef71f693f63b7ba4bf541bbd7a5edb714be47838a3bf81996a7ae79060511447fe3141841e05540be
languageName: node
linkType: hard
@ -28378,8 +28378,8 @@ __metadata:
markdown-to-jsx: ^7.3.2
modele-social: "workspace:^"
netlify-cli: ^16.4.0
publicodes: ^1.0.0-beta.75
publicodes-react: ^1.0.0-beta.75
publicodes: ^1.0.0-beta.76
publicodes-react: ^1.0.0-beta.76
react: ^18.2.0
react-aria: ^3.24.0
react-day-picker: ^8.8.2