diff --git a/api/package.json b/api/package.json index 0f3e51838..2d570d15c 100644 --- a/api/package.json +++ b/api/package.json @@ -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" }, diff --git a/exoneration-covid/package.json b/exoneration-covid/package.json index dd31c5e24..0e50f9054 100644 --- a/exoneration-covid/package.json +++ b/exoneration-covid/package.json @@ -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" diff --git a/modele-social/package.json b/modele-social/package.json index 95716c032..bac20200b 100644 --- a/modele-social/package.json +++ b/modele-social/package.json @@ -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" diff --git a/site/package.json b/site/package.json index 5452cec83..48d8969a7 100644 --- a/site/package.json +++ b/site/package.json @@ -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", diff --git a/site/source/components/Notifications.tsx b/site/source/components/Notifications.tsx index 22f899cb0..b3bf17664 100644 --- a/site/source/components/Notifications.tsx +++ b/site/source/components/Notifications.tsx @@ -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 = ( - 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) + getNotifications(engine) as Array ).filter(({ dottedName }) => !hiddenNotifications?.includes(dottedName)) const isMultiline = (str: string) => str.trim().split('\n').length > 1 @@ -74,6 +65,22 @@ export default function Notifications() { }} > + {inversionFail && ( + } type="info"> + + + Le montant demandé n'est pas calculable... + + + + 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. + + + + )} {messages.map(({ sévérité, dottedName, résumé, description }) => ( ` margin-bottom: ${({ theme }) => theme.spacings.xxs}; } ` + +const StyledEmoji = styled(Emoji)` + transform: scale(1.5); +` diff --git a/site/source/components/utils/EngineContext.tsx b/site/source/components/utils/EngineContext.tsx index 44b44a78a..cb37098e1 100644 --- a/site/source/components/utils/EngineContext.tsx +++ b/site/source/components/utils/EngineContext.tsx @@ -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) => { } 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 & diff --git a/site/source/locales/ui-en.yaml b/site/source/locales/ui-en.yaml index c49bfe999..3bcd4bb9d 100644 --- a/site/source/locales/ui-en.yaml +++ b/site/source/locales/ui-en.yaml @@ -20,6 +20,11 @@ <0>Activité mixte: <0>Mixed activity <0>Impôt sur le revenu (IR): <0>Income tax (IR) <0>Impôt sur les sociétés (IS): <0>Corporate income tax (IS) +<0>Le montant demandé n'est <1>pas calculable...<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.: + <0>The amount requested <1>cannot be calculated...<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. <0>Versement libératoire de l'impôt sur le revenu: <0>Payment in full discharge 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 pensions). - 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: diff --git a/site/source/locales/ui-fr.yaml b/site/source/locales/ui-fr.yaml index e83a3cb9a..cfedbf4ea 100644 --- a/site/source/locales/ui-fr.yaml +++ b/site/source/locales/ui-fr.yaml @@ -22,6 +22,11 @@ <0>Activité mixte: <0>Activité mixte <0>Impôt sur le revenu (IR): <0>Impôt sur le revenu (IR) <0>Impôt sur les sociétés (IS): <0>Impôt sur les sociétés (IS) +<0>Le montant demandé n'est <1>pas calculable...<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.: + <0>Le montant demandé n'est <1>pas calculable...<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. <0>Versement libératoire de l'impôt sur le revenu: <0>Versement libératoire 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: L’Urssaf recouvre les cotisations servant au financement de la sécurité sociale (assurance maladie, allocations familiales, dépendance<1> et retraite <3> de base). - 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: diff --git a/site/source/pages/budget/budget.md b/site/source/pages/budget/budget.md index a2bb300d6..4bae2d5a4 100644 --- a/site/source/pages/budget/budget.md +++ b/site/source/pages/budget/budget.md @@ -65,7 +65,7 @@ En complément du financement apporté par l’Urssaf, 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. --- diff --git a/yarn.lock b/yarn.lock index 2adabafd1..a2bf3b95e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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