From abc9376a7e5b998dfa40cc78043a26bba1c1069a Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 30 Mar 2021 13:42:32 +0200 Subject: [PATCH 001/319] =?UTF-8?q?=F0=9F=93=86=20MAJ=20dates=20aides=20?= =?UTF-8?q?=C3=A0=20l'embauche?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Par ailleurs: - emploi franc+ réservé aux -26ans (contrairement au "emploi franc" pas "plus") - correction sur le simulateur d'aides, pour la selection des aides disponibles --- modele-social/règles/salarié.yaml | 11 +++++----- mon-entreprise/source/locales/rules-en.yaml | 20 +++++-------------- .../pages/Simulateurs/AidesEmbauche.tsx | 19 ++++++++++-------- .../test/regressions/simulations-salarié.yaml | 1 + 4 files changed, 22 insertions(+), 29 deletions(-) diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index dcb60a2cf..c8d59eb21 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -2029,7 +2029,7 @@ contrat salarié . aides employeur . aide exceptionnelle à l'embauche d'apprent - apprentissage - professionnalisation . jeune de moins de 30 ans - ancienneté . date d'embauche >= 01/07/2020 - - ancienneté . date d'embauche <= 28/02/2021 + - ancienneté . date d'embauche <= 31/12/2021 - temps de travail . temps effectif > 0 heures/mois formule: variations: @@ -2094,19 +2094,18 @@ contrat salarié . aides employeur . emploi franc: - *embauche en CDI* : 5000€/an pendant 3 ans, soit un total de 15 000€ - *embauche en CDD d'au moins 6 mois* : 2 500€/an pendant 2 ans, soit 5 000€ au maximum - > Dans le cadre du plan "France Relance", le dispositif est revalorisé pour - une embauche jusqu'au 31 janvier 2021. - [🗺 Vérifier l'éligibilité d'une adresse](https://sig.ville.gouv.fr/recherche-adresses-qp-polville) applicable si: éligible formule: multiplication: assiette: variations: - - si: + - nom: emploi franc+ + si: toutes ces conditions: - ancienneté . date d'embauche >= 15/10/2020 - - ancienneté . date d'embauche <= 31/03/2021 + - ancienneté . date d'embauche <= 31/05/2021 + - contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans alors: variations: - si: CDD diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 79dee3b83..dc4f83c3b 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -1247,24 +1247,19 @@ contrat salarié . aides employeur . aide à l'embauche d'apprentis: titre.fr: aide à l'embauche senior professionnalisation contrat salarié . aides employeur . emploi franc: description.en: > - [automatic] Deferred assistance paid by Pôle emploi for hiring a job seeker + [automatic] Deferred aid paid by Pôle emploi for the hiring of a job seeker - registered with Pôle Emploi and living in a priority district of the city + registered with Pôle Emploi and residing in a priority neighbourhood of the city (QPV). - - *Hiring on permanent contracts*: €5,000/year for 3 years, i.e. a total of €15,000 + - Hiring on a permanent contract*: €5000/year for 3 years, i.e. a total of €15,000 - - * hiring on a fixed-term contract of at least 6 months*: 2,500€/year for 2 years, i.e. 5,000€ maximum + - Hiring on a fixed-term contract of at least 6 months*: €2,500/year for 2 years, i.e. a maximum of €5,000 - > As part of the "France Relance" plan, the scheme is being upgraded to - - hiring until January 31, 2021. - - - [🗺 Check address eligibility](https://sig.ville.gouv.fr/recherche-adresses-qp-polville) + [🗺 Check the eligibility of an address](https://sig.ville.gouv.fr/recherche-adresses-qp-polville) description.fr: > Aide différée versée par Pôle emploi pour l'embauche d'un demandeur d'emploi @@ -1278,11 +1273,6 @@ contrat salarié . aides employeur . emploi franc: - *embauche en CDD d'au moins 6 mois* : 2 500€/an pendant 2 ans, soit 5 000€ au maximum - > Dans le cadre du plan "France Relance", le dispositif est revalorisé pour - - une embauche jusqu'au 31 janvier 2021. - - [🗺 Vérifier l'éligibilité d'une adresse](https://sig.ville.gouv.fr/recherche-adresses-qp-polville) titre.en: '[automatic] open job' titre.fr: emploi franc diff --git a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx index b53b3b198..026c4d37e 100644 --- a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx @@ -38,7 +38,7 @@ const aides = [ 'contrat salarié . professionnalisation . jeune de moins de 30 ans': 'oui', }, - dateFin: new Date('2020/02/28'), + dateFin: new Date('2021/12/31'), versement: mensuel, description: ( @@ -58,7 +58,7 @@ const aides = [ "contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans": 'oui', }, - dateFin: new Date('2020/03/31'), + dateFin: new Date('2021/05/31'), versement: trimestriel, description: ( @@ -76,7 +76,7 @@ const aides = [ situation: { 'contrat salarié . aides employeur . emploi franc . éligible': 'oui', }, - dateFin: new Date('2020/03/31'), + dateFin: new Date('2021/05/31'), versement: tous les 6 mois, description: ( @@ -210,13 +210,16 @@ function Results() { const baseEngine = useEngine() const aidesEngines = aides.map((aide) => { const engine = new Engine(baseEngine.parsedRules) + engine.setSituation({ ...aide.situation, ...baseEngine.parsedSituation }) + const isActive = + typeof engine.evaluate(aide.dottedName).nodeValue === 'number' const situation = { ...baseEngine.parsedSituation, ...aide.situation } - engine.setSituation(situation) - return { ...aide, situation, engine } + return { ...aide, situation, isActive } }) - const [aidesActives, aidesInactives] = partition(({ dottedName, engine }) => { - return typeof engine.evaluate(dottedName).nodeValue === 'number' - }, aidesEngines) + const [aidesActives, aidesInactives] = partition( + ({ isActive }) => isActive, + aidesEngines + ) return progress === 0 ? ( <> diff --git a/mon-entreprise/test/regressions/simulations-salarié.yaml b/mon-entreprise/test/regressions/simulations-salarié.yaml index 5e638938e..daa0dc65b 100644 --- a/mon-entreprise/test/regressions/simulations-salarié.yaml +++ b/mon-entreprise/test/regressions/simulations-salarié.yaml @@ -113,6 +113,7 @@ aides: - contrat salarié . rémunération . brut de base: 2000 €/mois contrat salarié . aides employeur . emploi franc . éligible: oui contrat salarié . ancienneté . date d'embauche: 01/11/2020 + contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans: oui aides embauche covid: - contrat salarié . ancienneté . date d'embauche: 01/08/2020 From bc7a6f925c44cdbc015b2b27976a645ad26ec2ae Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 30 Mar 2021 14:43:07 +0200 Subject: [PATCH 002/319] =?UTF-8?q?=F0=9F=94=A8=20Ajout=20de=20l'aide=20po?= =?UTF-8?q?ur=20les=20travailleurs=20handicap=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/salarié.yaml | 30 ++++++++++++++++++- mon-entreprise/source/locales/rules-en.yaml | 9 ++++++ mon-entreprise/source/locales/ui-en.yaml | 2 ++ .../pages/Simulateurs/AidesEmbauche.tsx | 20 +++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index c8d59eb21..80618a650 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -1990,6 +1990,7 @@ contrat salarié . aides employeur: - aide exceptionnelle à l'embauche d'apprentis - aide exceptionnelle à l'embauche des jeunes - aide à l'embauche senior professionnalisation + - aide à l'embauche des travailleurs handicapés - activité partielle . indemnisation entreprise - emploi franc @@ -2053,7 +2054,7 @@ contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeune applicable si: toutes ces conditions: - ancienneté . date d'embauche >= 01/08/2020 - - ancienneté . date d'embauche <= 31/03/2021 + - ancienneté . date d'embauche <= 31/05/2021 - rémunération . brut de base <= 2 * SMIC - une de ces conditions: - CDI @@ -2146,6 +2147,33 @@ contrat salarié . temps de travail: - heures complémentaires description: En France, la base légale du travail est de 35h/semaine. Mais un grand nombre de dispositions existantes permettent de faire varier ce nombre. Vous pouvez les retrouver sur la page [service-public.fr](https://www.service-public.fr/particuliers/vosdroits/N458) dédiée. +contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés: + non applicable si: aides employeur . emploi franc + description: >- + Dans le cadre du plan de relance, le gouvernement a décidé de créer une aide + à l’embauche visant à favoriser l’emploi des personnes en situation de + handicap quel que soit leur âge. + applicable si: + toutes ces conditions: + - nom: situation de handicap + question: Le salarié a-t'il la reconnaissance de travailleur handicapé (RQTH) ? + par défaut: non + - ancienneté . date d'embauche >= 01/09/2020 + - ancienneté . date d'embauche <= 30/06/2021 + - rémunération . brut de base <= 2 * SMIC + - une de ces conditions: + - CDI + - toutes ces conditions: + - CDD + - CDD . durée contrat >= 3 mois + formule: + produit: + assiette: 4000 €/an + facteur: temps de travail . quotité de travail effective + arrondi: oui + références: + Plan \#1jeune1solution: https://travail-emploi.gouv.fr/le-ministere-en-action/relance-activite/plan-1jeune-1solution/aide-embauche-jeunes + contrat salarié . temps de travail . temps effectif: formule: somme: diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index dc4f83c3b..55e57692a 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -1236,6 +1236,15 @@ contrat salarié . aides employeur . aide à l'embauche d'apprentis: Une fois les démarches d'enregistrement effectuées, l'aide est versée automatiquement tous les mois. titre.en: aid to hire apprentices titre.fr: aide à l'embauche d'apprentis +? contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés +: description.en: '[automatic] As part of the recovery plan, the government has + decided to create a recruitment aid aimed at encouraging the employment of + people with disabilities, regardless of their age.' + description.fr: Dans le cadre du plan de relance, le gouvernement a décidé de + créer une aide à l’embauche visant à favoriser l’emploi des personnes en + situation de handicap quel que soit leur âge. + titre.en: '[automatic] aid for the recruitment of disabled workers' + titre.fr: aide à l'embauche des travailleurs handicapés ? contrat salarié . aides employeur . aide à l'embauche senior professionnalisation : description.en: | [automatic] Employers can get €2,000 for the hiring of an diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 5ec483893..9b02864fa 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1003,6 +1003,8 @@ pages: emploi franc: For the hiring of a young person from a priority district of the city (QPV). The aid can be up to €17,000 over three years.<1>The aid is paid every <3>6 months by Pôle Emploi. + handicapé: For the recruitment of a disabled worker.<1>The aid is paid + <3>quarterly by the Agence de services et de paiement (ASP). jeune: For the hiring of a young person under the age of 26 on a permanent contract or for a fixed-term contract of at least 3 months.<1>The aid is paid <3>quarterly by the Services and Payment Agency (ASP). diff --git a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx index 026c4d37e..193b0fa74 100644 --- a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx @@ -87,6 +87,25 @@ const aides = [ ), }, + { + title: 'Travailleur handicapé', + dottedName: + "contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés", + situation: { + "contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés . situation de handicap": + 'oui', + }, + dateFin: new Date('2021/06/30'), + versement: trimestriel, + description: ( + + Pour l’embauche d’un travailleur en situation de handicap. +
+ L’aide est versée trimestriellement par l’Agence de + services et de paiement (ASP). +
+ ), + }, { title: "Demandeur d'emploi de 45 ans ou plus", dottedName: @@ -133,6 +152,7 @@ const config = { 'contrat salarié . temps de travail . heures complémentaires', 'contrat salarié . rémunération', 'contrat salarié . aides employeur . emploi franc . éligible', + "contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés . situation de handicap", 'contrat salarié . professionnalisation . jeune de moins de 30 ans', 'contrat salarié . professionnalisation . salarié de 45 ans et plus', ], From edb999ee8523c8574c1df3ddeeb319181af31510 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 30 Mar 2021 14:43:07 +0200 Subject: [PATCH 003/319] =?UTF-8?q?=F0=9F=94=A8=20Non=20cumul=20des=20aide?= =?UTF-8?q?s=20=C3=A0=20l'embauche?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/salarié.yaml | 19 ++++++++++++++++--- mon-entreprise/source/locales/rules-en.yaml | 9 +++++++++ .../__snapshots__/simulations.jest.js.snap | 2 ++ .../test/regressions/simulations-salarié.yaml | 5 +++++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index 80618a650..8f120fda2 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -1986,12 +1986,19 @@ contrat salarié . aides employeur: Le simulateur n'intègre pas toutes les innombrables aides disponibles en France. Découvrez-les sur le [portail officiel](http://www.aides-entreprises.fr). formule: somme: + - aides à l'embauche + - activité partielle . indemnisation entreprise + +contrat salarié . aides employeur . aides à l'embauche: + description: | + L'État met en place des aides pour encourager l'embauche de certains publics prioritaires. Ces aides sont non cumulables entre elles. + formule: + le maximum de: - aide à l'embauche d'apprentis - aide exceptionnelle à l'embauche d'apprentis - aide exceptionnelle à l'embauche des jeunes - aide à l'embauche senior professionnalisation - aide à l'embauche des travailleurs handicapés - - activité partielle . indemnisation entreprise - emploi franc contrat salarié . aides employeur . aide à l'embauche d'apprentis: @@ -2064,6 +2071,9 @@ contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeune - nom: jeune de moins de 26 ans question: Le salarié a-t-il moins de 26 ans ? par défaut: non + rend non applicable: + # Dispositifs moins généreux et non cumulables + - aide à l'embauche des travailleurs handicapés formule: produit: assiette: 4000 €/an @@ -2101,13 +2111,13 @@ contrat salarié . aides employeur . emploi franc: multiplication: assiette: variations: - - nom: emploi franc+ - si: + - si: toutes ces conditions: - ancienneté . date d'embauche >= 15/10/2020 - ancienneté . date d'embauche <= 31/05/2021 - contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans alors: + nom: emploi franc plus variations: - si: CDD alors: 5500 €/an @@ -2119,6 +2129,9 @@ contrat salarié . aides employeur . emploi franc: - sinon: 5000 €/an facteur: temps de travail . quotité de travail effective arrondi: oui + rend non applicable: + # Dispositifs moins généreux et non cumulables + - aide à l'embauche des travailleurs handicapés références: Fiche emploi franc: https://travail-emploi.gouv.fr/emploi/emplois-francs/article/embaucher-une-personne-en-emploi-franc diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 55e57692a..19a602ac6 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -1254,6 +1254,15 @@ contrat salarié . aides employeur . aide à l'embauche d'apprentis: demandeur d'emploi de plus de 45 ans en contrat de professionnalisation. titre.en: '[automatic] senior professionalization hiring assistance' titre.fr: aide à l'embauche senior professionnalisation +contrat salarié . aides employeur . aides à l'embauche: + description.en: > + [automatic] The State provides aid to encourage the hiring of certain + priority groups. This aid cannot be combined with other aid. + description.fr: > + L'État met en place des aides pour encourager l'embauche de certains publics + prioritaires. Ces aides sont non cumulables entre elles. + titre.en: '[automatic] hiring aids' + titre.fr: aides à l'embauche contrat salarié . aides employeur . emploi franc: description.en: > [automatic] Deferred aid paid by Pôle emploi for the hiring of a job seeker diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index be303bc9b..a54fa48fd 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -597,6 +597,8 @@ Notifications affichées : contrat salarié . CDD . information" exports[`calculate simulations-salarié: aides 5`] = `"[1883,0,2000,1561,1527]"`; +exports[`calculate simulations-salarié: aides 6`] = `"[2133,0,2000,1561,1527]"`; + exports[`calculate simulations-salarié: aides embauche covid 1`] = ` "[1237,0,1500,1165,1165] Notifications affichées : contrat salarié . rémunération . contrôle smic" diff --git a/mon-entreprise/test/regressions/simulations-salarié.yaml b/mon-entreprise/test/regressions/simulations-salarié.yaml index daa0dc65b..be03557aa 100644 --- a/mon-entreprise/test/regressions/simulations-salarié.yaml +++ b/mon-entreprise/test/regressions/simulations-salarié.yaml @@ -114,6 +114,11 @@ aides: contrat salarié . aides employeur . emploi franc . éligible: oui contrat salarié . ancienneté . date d'embauche: 01/11/2020 contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeunes . jeune de moins de 26 ans: oui + # travailleur handicapé + - contrat salarié . rémunération . brut de base: 2000 €/mois + contrat salarié . ancienneté . date d'embauche: 01/03/2021 + contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés . situation de handicap: oui + aides embauche covid: - contrat salarié . ancienneté . date d'embauche: 01/08/2020 From abba62fcf3a0eedf8a2fb044676cd25c4dec6dfc Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 16 Feb 2021 14:30:42 +0100 Subject: [PATCH 004/319] =?UTF-8?q?=E2=9C=A8=20Simplify=20Engine=20constru?= =?UTF-8?q?ctor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * remove ParsedRules argument to constructor (was undocumented, so no harm for Publicodes users) * replace by Engine.shallowCopy() * simplify EngineContext in mon-entreprise. --- modele-social/README.md | 25 +++++++------- mon-entreprise/source/App.tsx | 12 +++---- .../source/components/SchemeComparaison.tsx | 11 +++--- .../source/components/utils/EngineContext.tsx | 14 +++++--- .../pages/Simulateurs/AidesEmbauche.tsx | 4 +-- mon-entreprise/test/real-rules.test.js | 2 +- .../test/regressions/simulations.jest.js | 5 ++- .../useSearchParamsSimulationSharing.test.js | 9 ++--- publicodes/core/source/index.ts | 34 ++++++++++--------- publicodes/core/test/inversion.test.js | 4 +-- .../ui-react/source/mecanisms/common.tsx | 2 +- 11 files changed, 59 insertions(+), 63 deletions(-) diff --git a/modele-social/README.md b/modele-social/README.md index 2a6cadbce..02e875d4b 100644 --- a/modele-social/README.md +++ b/modele-social/README.md @@ -2,27 +2,28 @@ Ce paquet contient les règles publicodes utilisées sur https://mon-entreprise.fr pour le calcul des cotisations sociales, des impôts et des droits sociaux. + ### Installation + ``` -npm install publicodes modele-social +npm install publicodes modele-social ``` ### Exemple d'utilisation -```js -import Engine, { formatValue } from "publicodes"; -import rules from "modele-social"; -const engine = new Engine(rules); +```js +import Engine, { formatValue } from 'publicodes' +import rules from 'modele-social' + +const engine = new Engine(rules) const net = engine - .setSituation({ - "contrat salarié . rémunération . brut de base": "3000 €/mois", - }) - .evaluate("contrat salarié . rémunération . net"); - -console.log(formatValue(net)); + .setSituation({ + 'contrat salarié . rémunération . brut de base': '3000 €/mois', + }) + .evaluate('contrat salarié . rémunération . net') +console.log(formatValue(net)) ``` - 👉 **[Voir le tutoriel complet](https://mon-entreprise.fr/int%C3%A9gration/biblioth%C3%A8que-de-calcul)** diff --git a/mon-entreprise/source/App.tsx b/mon-entreprise/source/App.tsx index 79080655d..b66e9a37c 100644 --- a/mon-entreprise/source/App.tsx +++ b/mon-entreprise/source/App.tsx @@ -4,14 +4,13 @@ import Header from 'Components/layout/Header' import Route404 from 'Components/Route404' import 'Components/ui/index.css' import { - engineOptions, + engineFactory, EngineProvider, + Rules, SituationProvider, } from 'Components/utils/EngineContext' import { SitePathsContext } from 'Components/utils/SitePathsContext' import 'iframe-resizer' -import { DottedName } from 'modele-social' -import Engine, { Rule } from 'publicodes' import { useContext, useMemo } from 'react' import { Helmet } from 'react-helmet' import { useTranslation } from 'react-i18next' @@ -70,16 +69,13 @@ const middlewares = [createSentryMiddleware(Sentry as any)] type RootProps = { basename: ProviderProps['basename'] - rules: Record + rules: Rules } export default function Root({ basename, rules }: RootProps) { const { language } = useTranslation().i18n const paths = constructLocalizedSitePath(language as 'fr' | 'en') - const engine = useMemo(() => new Engine(rules, engineOptions), [ - rules, - engineOptions, - ]) + const engine = useMemo(() => engineFactory(rules), [rules]) return ( - new Engine(parsedRules, engineOptions).setSituation({ + engine.shallowCopy().setSituation({ ...situation, dirigeant: "'assimilé salarié'", }), @@ -59,7 +56,7 @@ export default function SchemeComparaison({ ) const autoEntrepreneurEngine = useMemo( () => - new Engine(parsedRules, engineOptions).setSituation({ + engine.shallowCopy().setSituation({ ...situation, dirigeant: "'auto-entrepreneur'", }), @@ -67,7 +64,7 @@ export default function SchemeComparaison({ ) const indépendantEngine = useMemo( () => - new Engine(parsedRules, engineOptions).setSituation({ + engine.shallowCopy().setSituation({ ...situation, dirigeant: "'indépendant'", }), diff --git a/mon-entreprise/source/components/utils/EngineContext.tsx b/mon-entreprise/source/components/utils/EngineContext.tsx index 16318ce92..7891de9cb 100644 --- a/mon-entreprise/source/components/utils/EngineContext.tsx +++ b/mon-entreprise/source/components/utils/EngineContext.tsx @@ -1,14 +1,12 @@ -import Engine from 'publicodes' +import Engine, { Rule } from 'publicodes' import React, { createContext, useContext } from 'react' import { DottedName } from 'modele-social' import i18n from '../../locales/i18n' -export const EngineContext = createContext(new Engine({})) -export const EngineProvider = EngineContext.Provider +export type Rules = Record const unitsTranslations = Object.entries(i18n.getResourceBundle('fr', 'units')) - -export const engineOptions = { +const engineOptions = { getUnitKey(unit: string): string { const key = unitsTranslations .find(([, trans]) => trans === unit)?.[0] @@ -19,6 +17,12 @@ export const engineOptions = { return i18n?.t(`units:${unit}`, { count }) }, } +export function engineFactory(rules: Rules) { + return new Engine(rules, engineOptions) +} + +export const EngineContext = createContext(new Engine()) +export const EngineProvider = EngineContext.Provider export function useEngine(): Engine { return useContext(EngineContext) as Engine diff --git a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx index 193b0fa74..e03cc1c1e 100644 --- a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx @@ -10,7 +10,7 @@ import { useSimulationProgress } from 'Components/utils/useNextQuestion' import { useParamsFromSituation } from 'Components/utils/useSearchParamsSimulationSharing' import useSimulationConfig from 'Components/utils/useSimulationConfig' import { DottedName } from 'modele-social' -import Engine, { formatValue } from 'publicodes' +import { formatValue } from 'publicodes' import { partition } from 'ramda' import { useContext } from 'react' import { Trans, useTranslation } from 'react-i18next' @@ -229,7 +229,7 @@ function Results() { const progress = useSimulationProgress() const baseEngine = useEngine() const aidesEngines = aides.map((aide) => { - const engine = new Engine(baseEngine.parsedRules) + const engine = baseEngine.shallowCopy() engine.setSituation({ ...aide.situation, ...baseEngine.parsedSituation }) const isActive = typeof engine.evaluate(aide.dottedName).nodeValue === 'number' diff --git a/mon-entreprise/test/real-rules.test.js b/mon-entreprise/test/real-rules.test.js index dad097818..09ca149e1 100644 --- a/mon-entreprise/test/real-rules.test.js +++ b/mon-entreprise/test/real-rules.test.js @@ -6,7 +6,7 @@ import rules from 'modele-social' // les variables dans les tests peuvent être exprimées relativement à l'espace de nom de la règle, // comme dans sa formule let parsedRules = parsePublicodes(rules) -const engine = new Engine(parsedRules) +const engine = new Engine(rules) let runExamples = (examples, rule) => examples.map((ex) => { const expected = ex['valeur attendue'] diff --git a/mon-entreprise/test/regressions/simulations.jest.js b/mon-entreprise/test/regressions/simulations.jest.js index 4b1777478..4c020a6d9 100644 --- a/mon-entreprise/test/regressions/simulations.jest.js +++ b/mon-entreprise/test/regressions/simulations.jest.js @@ -6,9 +6,8 @@ // renamed the test configuration may be adapted but the persisted snapshot will remain unchanged). /* eslint-disable no-undef */ -import Engine from 'publicodes' import rules from '../../../modele-social' -import { engineOptions } from '../../source/components/utils/EngineContext' +import { engineFactory } from '../../source/components/utils/EngineContext' import aideDéclarationConfig from '../../source/pages/Gérer/AideDéclarationIndépendant/config.yaml' import artisteAuteurConfig from '../../source/pages/Simulateurs/configs/artiste-auteur.yaml' import autoentrepreneurConfig from '../../source/pages/Simulateurs/configs/auto-entrepreneur.yaml' @@ -26,7 +25,7 @@ import remunerationDirigeantSituations from './simulations-rémunération-dirige import employeeSituations from './simulations-salarié.yaml' const roundResult = (arr) => arr.map((x) => Math.round(x)) -const engine = new Engine(rules, engineOptions) +const engine = engineFactory(rules) const runSimulations = (situations, targets, baseSituation = {}) => Object.entries(situations).map(([name, situations]) => situations.forEach((situation) => { diff --git a/mon-entreprise/test/useSearchParamsSimulationSharing.test.js b/mon-entreprise/test/useSearchParamsSimulationSharing.test.js index 02ee5e9bf..d24d0a3e9 100644 --- a/mon-entreprise/test/useSearchParamsSimulationSharing.test.js +++ b/mon-entreprise/test/useSearchParamsSimulationSharing.test.js @@ -26,14 +26,13 @@ describe('identifiant court', () => { }) describe('useSearchParamsSimulationSharing', () => { - const someRules = parsePublicodes(` + const engine = new Engine(` rule with: identifiant court: panta formule: 0 rule without: formule: 0 `) - const engine = new Engine(someRules) const dottedNameParamName = getRulesParamNames(engine.getParsedRules()) describe('getSearchParamsFromSituation', () => { @@ -92,7 +91,7 @@ rule without: }) describe('useSearchParamsSimulationSharing hook', () => { - const someRules = parsePublicodes(` + const parsedRules = parsePublicodes(` rule with: identifiant court: panta formule: 0 @@ -100,9 +99,7 @@ rule without: formule: 0 `) - const dottedNameParamName = getRulesParamNames( - new Engine(someRules).getParsedRules() - ) + const dottedNameParamName = getRulesParamNames(parsedRules) let setSearchParams beforeEach(() => { diff --git a/publicodes/core/source/index.ts b/publicodes/core/source/index.ts index 13d540abc..e61b1b199 100644 --- a/publicodes/core/source/index.ts +++ b/publicodes/core/source/index.ts @@ -67,6 +67,7 @@ export type ParsedRules = Record< Name, RuleNode & { dottedName: Name } > + export default class Engine { parsedRules: ParsedRules parsedSituation: Record = {} @@ -75,25 +76,11 @@ export default class Engine { options: Options constructor( - rules: string | Record | ParsedRules = {}, + rules: string | Record = {}, options: Partial = {} ) { this.options = { ...options, logger: options.logger ?? console } - if (typeof rules === 'string') { - rules = parsePublicodes(rules, this.options) as ParsedRules - } - const firstRuleObject = Object.values(rules)[0] as Rule | RuleNode - if ( - typeof firstRuleObject !== 'object' || - firstRuleObject == null || - !('nodeKind' in firstRuleObject) - ) { - rules = parsePublicodes( - rules as Record, - this.options - ) as ParsedRules - } - this.parsedRules = rules as ParsedRules + this.parsedRules = parsePublicodes(rules, this.options) as ParsedRules this.replacements = getReplacements(this.parsedRules) } @@ -150,6 +137,10 @@ export default class Engine { return this.parsedRules } + getOptions(): Options { + return this.options + } + evaluate(value: N): N & EvaluatedNode evaluate(value: PublicodesExpression): EvaluatedNode evaluate(value: PublicodesExpression | ASTNode): EvaluatedNode { @@ -180,6 +171,17 @@ export default class Engine { this.cache.nodes.set(value, evaluatedNode) return evaluatedNode } + + /** + * Shallow Engine instance copy. Keeps references to the original Engine instance attributes. + */ + shallowCopy(): Engine { + const newEngine = new Engine() + newEngine.options = this.options + newEngine.parsedRules = this.parsedRules + newEngine.replacements = this.replacements + return newEngine + } } /** diff --git a/publicodes/core/test/inversion.test.js b/publicodes/core/test/inversion.test.js index f0c2089d9..2de306c83 100644 --- a/publicodes/core/test/inversion.test.js +++ b/publicodes/core/test/inversion.test.js @@ -51,7 +51,7 @@ describe('inversions', () => { assiette: brut taux: 77% - brut: + brut: formule: inversion numérique: unité: € @@ -147,7 +147,7 @@ describe('inversions', () => { formule: produit: assiette: assiette - taux: + taux: variations: - si: cadre alors: 80% diff --git a/publicodes/ui-react/source/mecanisms/common.tsx b/publicodes/ui-react/source/mecanisms/common.tsx index d96967084..6e4dd8c06 100644 --- a/publicodes/ui-react/source/mecanisms/common.tsx +++ b/publicodes/ui-react/source/mecanisms/common.tsx @@ -64,7 +64,7 @@ export const NodeValuePointer = ({ data, unit }: NodeValuePointerProps) => { }} > {formatValue(simplifyNodeUnit({ nodeValue: data, unit }), { - formatUnit: engine?.options?.formatUnit, + formatUnit: engine?.getOptions()?.formatUnit, })} ) From 25ca91bf0c291f0d794d7da7b7898abecf934bbb Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 16 Feb 2021 12:06:32 +0100 Subject: [PATCH 005/319] =?UTF-8?q?=E2=9C=A8=20Make=20parsePublicodes=20co?= =?UTF-8?q?de=20more=20robust=20and=20remove=20empty=20rule=20case?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/chômage-partiel.yaml | 2 +- publicodes/core/source/index.ts | 2 ++ publicodes/core/source/parsePublicodes.ts | 23 +++++++++++------------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/modele-social/règles/chômage-partiel.yaml b/modele-social/règles/chômage-partiel.yaml index 719f368e1..da61069a8 100644 --- a/modele-social/règles/chômage-partiel.yaml +++ b/modele-social/règles/chômage-partiel.yaml @@ -1,4 +1,4 @@ -chômage partiel: +chômage partiel: oui chômage partiel . revenu net habituel: formule: diff --git a/publicodes/core/source/index.ts b/publicodes/core/source/index.ts index e61b1b199..5827307b4 100644 --- a/publicodes/core/source/index.ts +++ b/publicodes/core/source/index.ts @@ -59,10 +59,12 @@ type Options = { getUnitKey?: getUnitKey formatUnit?: formatUnit } + export type EvaluationFunction = ( this: Engine, node: ASTNode & { nodeKind: Kind } ) => ASTNode & { nodeKind: Kind } & EvaluatedNode + export type ParsedRules = Record< Name, RuleNode & { dottedName: Name } diff --git a/publicodes/core/source/parsePublicodes.ts b/publicodes/core/source/parsePublicodes.ts index 3faf4e57d..08d7e0a61 100644 --- a/publicodes/core/source/parsePublicodes.ts +++ b/publicodes/core/source/parsePublicodes.ts @@ -15,20 +15,17 @@ export type Context = { logger: Logger } -type RawRule = Omit | string | undefined | number -export type RawPublicodes = Record | string +type RawRule = Omit | string | number +export type RawPublicodes = Record export default function parsePublicodes( - rawRules: RawPublicodes, + rawRules: RawPublicodes | string, partialContext: Partial = {} ): ParsedRules { // STEP 1: parse Yaml let rules = typeof rawRules === 'string' - ? (yaml.parse(('' + rawRules).replace(/\t/g, ' ')) as Record< - string, - RawRule - >) + ? (yaml.parse(('' + rawRules).replace(/\t/g, ' ')) as RawPublicodes) : { ...rawRules } // STEP 2: transpile [ref] writing @@ -43,13 +40,15 @@ export default function parsePublicodes( } Object.entries(rules).forEach(([dottedName, rule]) => { - if (rule == null) { - rule = {} + if (typeof rule === 'string' || typeof rule === 'number') { + rule = { + formule: `${rule}`, + } } if (typeof rule !== 'object') { - rule = { - formule: '' + rule, - } + throw new SyntaxError( + `Rule ${dottedName} is incorrectly written. Please give it a proper value.` + ) } parse({ nom: dottedName, ...rule }, context) }) From 4ca9ee36c261682acecf39ff34b1a108094a5936 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 8 Apr 2021 10:37:19 +0200 Subject: [PATCH 006/319] =?UTF-8?q?Ajoute=20un=20nouveau=20m=C3=A9canisme:?= =?UTF-8?q?=20r=C3=A9soudre=20la=20r=C3=A9f=C3=A9rence=20circulaire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ce mécanisme permet d'activer le calcul itératif pour trouver la valeur de la règle qui résout la référence circulaire. Il est possible pour une règle de se référencer elle-même. Par défaut, le moteur considère qu'il s'agit d'un cycle non voulu, et renvoie 'null' comme valeur pour la règle en question, en affichant un avertissement. Mais dans certains cas, la formule est bonne et le cycle est voulu. La valeur de la règle attendue est donc celle qui résout l'équation obtenue via la référence cyclique. Lorsque l'on active cette fonctionnalité, le moteur va procéder par essaie erreur jusqu'à trouver cette valeur. Note : la résolution de cycle est coûteuse en temps de calcul. Il faut donc veiller à ne pas la cumuler avec l'évaluation d'un autre mécanisme coûteux comme l'inversion numérique par exemple. --- mon-entreprise/package.json | 2 +- publicodes/core/source/AST/graph.ts | 2 + publicodes/core/source/AST/index.ts | 13 +++ publicodes/core/source/AST/types.ts | 12 +- publicodes/core/source/evaluation.ts | 4 +- publicodes/core/source/index.ts | 11 +- .../core/source/mecanisms/abattement.ts | 2 +- publicodes/core/source/mecanisms/inversion.ts | 8 +- publicodes/core/source/mecanisms/plafond.ts | 3 +- publicodes/core/source/mecanisms/plancher.ts | 2 +- publicodes/core/source/mecanisms/product.ts | 2 +- .../résoudre-référence-circulaire.ts | 109 ++++++++++++++++++ .../core/source/mecanisms/trancheUtils.ts | 4 +- publicodes/core/source/mecanisms/unité.ts | 2 +- .../core/source/mecanisms/variations.ts | 2 +- publicodes/core/source/parse.ts | 3 + publicodes/core/source/reference.ts | 3 +- publicodes/core/source/rule.ts | 55 ++++++--- publicodes/core/source/uniroot.ts | 4 +- .../résoudre-référence-circulaire.yaml | 68 +++++++++++ publicodes/docs/mecanisms.yaml | 35 ++++++ publicodes/ui-react/source/Explanation.tsx | 8 +- .../mecanisms/RésoudreRéférenceCirculaire.tsx | 19 +++ publicodes/ui-react/source/rule/RulePage.tsx | 1 - 24 files changed, 328 insertions(+), 46 deletions(-) create mode 100644 publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts create mode 100644 publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml create mode 100644 publicodes/ui-react/source/mecanisms/RésoudreRéférenceCirculaire.tsx diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index 8320a0524..2a8ce2e5b 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -109,7 +109,7 @@ "build:stats": "webpack --config webpack.prod.js --profile --json > stats.json", "build:analyze-bundle": "ANALYZE_BUNDLE=1 yarn run build", "build:dev": "FR_BASE_URL='http://localhost:5000${path}' EN_BASE_URL='http://localhost:5001${path}' yarn run build", - "clean": "rimraf dist node_modules source/data", + "clean": "rimraf dist node_modules 'source/data/!(versement-transport.json)'", "test": "yarn test:file \"./{,!(node_modules)/**/}!(webpack).test.{js,ts}\"", "test:file": "yarn mocha-webpack --webpack-config ./webpack.dev.js --include test/componentTestSetup.js --require mock-local-storage --require test/helpers/browser.js", "test:bundlesize": "bundlesize", diff --git a/publicodes/core/source/AST/graph.ts b/publicodes/core/source/AST/graph.ts index 3d072fa66..5429346ae 100644 --- a/publicodes/core/source/AST/graph.ts +++ b/publicodes/core/source/AST/graph.ts @@ -28,6 +28,8 @@ function buildRuleDependancies(rule: RuleNode): Array { return node.explanation.amendedSituation.flatMap((s) => fn(s[1])) case 'reference': return [...acc, node.dottedName as string] + case 'résoudre référence circulaire': + return [] case 'rule': // Cycle from parent dependancies are ignored at runtime, // so we don' detect them statically diff --git a/publicodes/core/source/AST/index.ts b/publicodes/core/source/AST/index.ts index 65a1d9736..f9f42880a 100644 --- a/publicodes/core/source/AST/index.ts +++ b/publicodes/core/source/AST/index.ts @@ -114,6 +114,8 @@ const traverseASTNode: TraverseFunction = (fn, node) => { return traverseArrayNode(fn, node) case 'durée': return traverseDuréeNode(fn, node) + case 'résoudre référence circulaire': + return traverseRésoudreRéférenceCirculaireNode(fn, node) case 'inversion': return traverseInversionNode(fn, node) case 'operation': @@ -261,6 +263,17 @@ const traversePlancherNode: TraverseFunction<'plancher'> = (fn, node) => ({ }, }) +const traverseRésoudreRéférenceCirculaireNode: TraverseFunction<'résoudre référence circulaire'> = ( + fn, + node +) => ({ + ...node, + explanation: { + ...node.explanation, + valeur: fn(node.explanation.valeur), + }, +}) + const traversePlafondNode: TraverseFunction<'plafond'> = (fn, node) => ({ ...node, explanation: { diff --git a/publicodes/core/source/AST/types.ts b/publicodes/core/source/AST/types.ts index 5cfa47b27..92349e638 100644 --- a/publicodes/core/source/AST/types.ts +++ b/publicodes/core/source/AST/types.ts @@ -1,24 +1,23 @@ import { AbattementNode } from '../mecanisms/abattement' import { ApplicableSiNode } from '../mecanisms/applicable' import { ArrondiNode } from '../mecanisms/arrondi' -import { OperationNode } from '../mecanisms/operation' import { BarèmeNode } from '../mecanisms/barème' -import { ReferenceNode } from '../reference' -import { RuleNode } from '../rule' import { TouteCesConditionsNode } from '../mecanisms/condition-allof' import { UneDeCesConditionsNode } from '../mecanisms/condition-oneof' import { DuréeNode } from '../mecanisms/durée' import { GrilleNode } from '../mecanisms/grille' import { InversionNode } from '../mecanisms/inversion' import { MaxNode } from '../mecanisms/max' -import { PlafondNode } from '../mecanisms/plafond' import { MinNode } from '../mecanisms/min' import { NonApplicableSiNode } from '../mecanisms/nonApplicable' +import { PossibilityNode } from '../mecanisms/one-possibility' +import { OperationNode } from '../mecanisms/operation' import { ParDéfautNode } from '../mecanisms/parDéfaut' +import { PlafondNode } from '../mecanisms/plafond' import { PlancherNode } from '../mecanisms/plancher' import { ProductNode } from '../mecanisms/product' import { RecalculNode } from '../mecanisms/recalcul' -import { PossibilityNode } from '../mecanisms/one-possibility' +import { RésoudreRéférenceCiruclaireNode } from '../mecanisms/résoudre-référence-circulaire' import { SituationNode } from '../mecanisms/situation' import { SommeNode } from '../mecanisms/sum' import { SynchronisationNode } from '../mecanisms/synchronisation' @@ -26,7 +25,9 @@ import { TauxProgressifNode } from '../mecanisms/tauxProgressif' import { UnitéNode } from '../mecanisms/unité' import { VariableTemporelleNode } from '../mecanisms/variableTemporelle' import { VariationNode } from '../mecanisms/variations' +import { ReferenceNode } from '../reference' import { ReplacementRule } from '../replacement' +import { RuleNode } from '../rule' import { Temporal } from '../temporal' export type ConstantNode = { @@ -57,6 +58,7 @@ export type ASTNode = ( | PlancherNode | ProductNode | RecalculNode + | RésoudreRéférenceCiruclaireNode | SituationNode | SommeNode | SynchronisationNode diff --git a/publicodes/core/source/evaluation.ts b/publicodes/core/source/evaluation.ts index aef471908..447b67c42 100644 --- a/publicodes/core/source/evaluation.ts +++ b/publicodes/core/source/evaluation.ts @@ -2,8 +2,8 @@ import Engine, { EvaluationFunction } from '.' import { ASTNode, ConstantNode, - Evaluation, EvaluatedNode, + Evaluation, NodeKind, } from './AST/types' import { warning } from './error' @@ -53,7 +53,7 @@ function convertNodesToSameUnit(this: Engine, nodes, mecanismName) { } catch (e) { warning( this.options.logger, - this.cache._meta.ruleStack[0], + this.cache._meta.evaluationRuleStack[0], `Les unités des éléments suivants sont incompatibles entre elles : \n\t\t${ node?.name || node?.rawNode }\n\t\t${firstNodeWithUnit?.name || firstNodeWithUnit?.rawNode}'`, diff --git a/publicodes/core/source/index.ts b/publicodes/core/source/index.ts index 5827307b4..4cbf72475 100644 --- a/publicodes/core/source/index.ts +++ b/publicodes/core/source/index.ts @@ -12,15 +12,18 @@ import { Rule, RuleNode } from './rule' import * as utils from './ruleUtils' import { formatUnit, getUnitKey } from './units' -const emptyCache = () => ({ - _meta: { ruleStack: [] }, +const emptyCache = (): Cache => ({ + _meta: { + parentRuleStack: [], + evaluationRuleStack: [], + }, nodes: new Map(), }) type Cache = { _meta: { - ruleStack: Array - parentEvaluationStack?: Array + parentRuleStack: Array + evaluationRuleStack: Array inversionFail?: | { given: string diff --git a/publicodes/core/source/mecanisms/abattement.ts b/publicodes/core/source/mecanisms/abattement.ts index 956bd0100..33dc9b936 100644 --- a/publicodes/core/source/mecanisms/abattement.ts +++ b/publicodes/core/source/mecanisms/abattement.ts @@ -25,7 +25,7 @@ const evaluateAbattement: EvaluationFunction<'abattement'> = function (node) { } catch (e) { warning( this.options.logger, - this.cache._meta.ruleStack[0], + this.cache._meta.evaluationRuleStack[0], "Impossible de convertir les unités de l'allègement entre elles", e ) diff --git a/publicodes/core/source/mecanisms/inversion.ts b/publicodes/core/source/mecanisms/inversion.ts index aafad83dc..dd540ea0f 100644 --- a/publicodes/core/source/mecanisms/inversion.ts +++ b/publicodes/core/source/mecanisms/inversion.ts @@ -1,9 +1,9 @@ -import parse from '../parse' import { EvaluationFunction } from '..' import { ConstantNode, Unit } from '../AST/types' import { mergeMissing } from '../evaluation' import { registerEvaluationFunction } from '../evaluationFunctions' import { convertNodeToUnit } from '../nodeUnits' +import parse from '../parse' import { Context } from '../parsePublicodes' import { ReferenceNode } from '../reference' import uniroot from '../uniroot' @@ -54,7 +54,6 @@ export const evaluateInversion: EvaluationFunction<'inversion'> = function ( } const evaluatedInversionGoal = this.evaluate(inversionGoal) const unit = 'unit' in node ? node.unit : evaluatedInversionGoal.unit - const originalCache = this.cache const originalSituation = { ...this.parsedSituation } let inversionNumberOfIterations = 0 @@ -63,7 +62,6 @@ export const evaluateInversion: EvaluationFunction<'inversion'> = function ( inversionNumberOfIterations++ this.resetCache() this.cache._meta = { ...originalCache._meta } - this.parsedSituation[node.explanation.ruleToInverse] = { unit: unit, nodeKind: 'unité', @@ -139,9 +137,11 @@ export const evaluateInversion: EvaluationFunction<'inversion'> = function ( // // Uncomment to display the two attempts and their result // console.table([{ x: x1, y: y1 }, { x: x2, y: y2 }]) - // console.log('iteration:', inversionNumberOfIterations) + // console.log('iteration inversion:', inversionNumberOfIterations) + this.cache = originalCache this.parsedSituation = originalSituation + return { ...node, unit, diff --git a/publicodes/core/source/mecanisms/plafond.ts b/publicodes/core/source/mecanisms/plafond.ts index 952a55e23..0743bfe66 100644 --- a/publicodes/core/source/mecanisms/plafond.ts +++ b/publicodes/core/source/mecanisms/plafond.ts @@ -1,4 +1,3 @@ -import { last } from 'ramda' import { EvaluationFunction } from '..' import { ASTNode } from '../AST/types' import { warning } from '../error' @@ -28,7 +27,7 @@ const evaluate: EvaluationFunction<'plafond'> = function (node) { } catch (e) { warning( this.options.logger, - this.cache._meta.ruleStack[0], + this.cache._meta.evaluationRuleStack[0], "L'unité du plafond n'est pas compatible avec celle de la valeur à encadrer", e ) diff --git a/publicodes/core/source/mecanisms/plancher.ts b/publicodes/core/source/mecanisms/plancher.ts index 6f06f4425..c4578e305 100644 --- a/publicodes/core/source/mecanisms/plancher.ts +++ b/publicodes/core/source/mecanisms/plancher.ts @@ -26,7 +26,7 @@ const evaluate: EvaluationFunction<'plancher'> = function (node) { } catch (e) { warning( this.options.logger, - this.cache._meta.ruleStack[0], + this.cache._meta.evaluationRuleStack[0], "L'unité du plancher n'est pas compatible avec celle de la valeur à encadrer", e ) diff --git a/publicodes/core/source/mecanisms/product.ts b/publicodes/core/source/mecanisms/product.ts index 334aac143..612df9b95 100644 --- a/publicodes/core/source/mecanisms/product.ts +++ b/publicodes/core/source/mecanisms/product.ts @@ -44,7 +44,7 @@ const productEffect: EvaluationFunction = function ({ } catch (e) { warning( this.options.logger, - this.cache._meta.ruleStack[0], + this.cache._meta.evaluationRuleStack[0], "Impossible de convertir l'unité du plafond du produit dans celle de l'assiette", e ) diff --git a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts new file mode 100644 index 000000000..b7e4d70d2 --- /dev/null +++ b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts @@ -0,0 +1,109 @@ +import { EvaluationFunction } from '..' +import { ASTNode, ConstantNode, Unit } from '../AST/types' +import { registerEvaluationFunction } from '../evaluationFunctions' +import parse from '../parse' +import { Context } from '../parsePublicodes' +import uniroot from '../uniroot' +import { UnitéNode } from './unité' + +export type RésoudreRéférenceCiruclaireNode = { + explanation: { + ruleToSolve: string + valeur: ASTNode + } + nodeKind: 'résoudre référence circulaire' +} + +export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoudre référence circulaire'> = function ( + node +) { + const originalCache = this.cache + let inversionNumberOfIterations = 0 + + const evaluateWithValue = ( + n: number, + unit: Unit = { numerators: [], denominators: [] } + ) => { + inversionNumberOfIterations++ + this.resetCache() + + this.parsedSituation[node.explanation.ruleToSolve] = { + unit: unit, + nodeKind: 'unité', + explanation: { + nodeKind: 'constant', + nodeValue: n, + type: 'number', + } as ConstantNode, + } as UnitéNode + return this.evaluate(node.explanation.valeur) + } + + let nodeValue: number | null | undefined = null + + const x0 = 0 + let valeur = evaluateWithValue(x0) + + const y0 = valeur.nodeValue as number + const unit = valeur.unit + const missingVariables = valeur.missingVariables + let i = 0 + if (y0 !== null) { + // The `uniroot` function parameter. It will be called with its `min` and + // `max` arguments, so we can use our cached nodes if the function is called + // with the already computed x1 or x2. + const test = (x: number): number => { + if (x === x0) { + return y0 - x0 + } + valeur = evaluateWithValue(x, unit) + const y = valeur.nodeValue + i++ + return (y as number) - x + } + + const defaultMin = -1_000_000 + const defaultMax = 100_000_000 + + nodeValue = uniroot(test, defaultMin, defaultMax, 1, 30, 2) + } + if (nodeValue === undefined) { + nodeValue = null + this.cache._meta.inversionFail = true + } + if (nodeValue != null) { + originalCache.nodes.forEach((v, k) => this.cache.nodes.set(k, v)) + } + console.log('iteration résoudre référence circulaire :', i) + + this.cache = originalCache + delete this.parsedSituation[node.explanation.ruleToSolve] + return { + ...node, + unit, + nodeValue, + explanation: { + ...node.explanation, + valeur, + inversionNumberOfIterations, + }, + missingVariables, + } +} + +export default function parseRésoudreRéférenceCirculaire(v, context: Context) { + return { + explanation: { + ruleToSolve: context.dottedName, + valeur: parse(v.valeur, context), + }, + nodeKind: 'résoudre référence circulaire', + } as RésoudreRéférenceCiruclaireNode +} + +parseRésoudreRéférenceCirculaire.nom = 'résoudre la référence circulaire' + +registerEvaluationFunction( + 'résoudre référence circulaire', + evaluateRésoudreRéférenceCirculaire +) diff --git a/publicodes/core/source/mecanisms/trancheUtils.ts b/publicodes/core/source/mecanisms/trancheUtils.ts index 2b430e06b..415240676 100644 --- a/publicodes/core/source/mecanisms/trancheUtils.ts +++ b/publicodes/core/source/mecanisms/trancheUtils.ts @@ -63,7 +63,7 @@ export function evaluatePlafondUntilActiveTranche( } catch (e) { warning( this.options.logger, - this.cache._meta.ruleStack[0], + this.cache._meta.evaluationRuleStack[0], `L'unité du plafond de la tranche n°${ i + 1 } n'est pas compatible avec celle l'assiette`, @@ -103,7 +103,7 @@ export function evaluatePlafondUntilActiveTranche( ) { evaluationError( this.options.logger, - this.cache._meta.ruleStack[0], + this.cache._meta.evaluationRuleStack[0], `Le plafond de la tranche n°${ i + 1 } a une valeur inférieure à celui de la tranche précédente` diff --git a/publicodes/core/source/mecanisms/unité.ts b/publicodes/core/source/mecanisms/unité.ts index ac57c027c..a27b39e41 100644 --- a/publicodes/core/source/mecanisms/unité.ts +++ b/publicodes/core/source/mecanisms/unité.ts @@ -37,7 +37,7 @@ registerEvaluationFunction(parseUnité.nom, function evaluate(node) { } catch (e) { warning( this.options.logger, - this.cache._meta.ruleStack[0], + this.cache._meta.evaluationRuleStack[0], "Erreur lors de la conversion d'unité explicite", e ) diff --git a/publicodes/core/source/mecanisms/variations.ts b/publicodes/core/source/mecanisms/variations.ts index 7cff54a1c..1c8c3b9c0 100644 --- a/publicodes/core/source/mecanisms/variations.ts +++ b/publicodes/core/source/mecanisms/variations.ts @@ -120,7 +120,7 @@ const evaluate: EvaluationFunction<'variations'> = function (node) { } catch (e) { warning( this.options.logger, - this.cache._meta.ruleStack[0], + this.cache._meta.evaluationRuleStack[0], `L'unité de la branche n° ${ i + 1 } du mécanisme 'variations' n'est pas compatible avec celle d'une branche précédente`, diff --git a/publicodes/core/source/parse.ts b/publicodes/core/source/parse.ts index 04cabbb0d..46bbb96ba 100644 --- a/publicodes/core/source/parse.ts +++ b/publicodes/core/source/parse.ts @@ -22,6 +22,7 @@ import plafond from './mecanisms/plafond' import plancher from './mecanisms/plancher' import { mecanismProduct } from './mecanisms/product' import { mecanismRecalcul } from './mecanisms/recalcul' +import résoudreRéférenceCirculaire from './mecanisms/résoudre-référence-circulaire' import situation from './mecanisms/situation' import { mecanismSum } from './mecanisms/sum' import { mecanismSynchronisation } from './mecanisms/synchronisation' @@ -147,6 +148,7 @@ ${e.message}` } } +// Chainable mecanisme in their composition order (first one is applyied first) const chainableMecanisms = [ applicable, nonApplicable, @@ -156,6 +158,7 @@ const chainableMecanisms = [ plafond, parDéfaut, situation, + résoudreRéférenceCirculaire, abattement, ] function parseChainedMecanisms(rawNode, context: Context): ASTNode { diff --git a/publicodes/core/source/reference.ts b/publicodes/core/source/reference.ts index 6a4a5afaf..8e98ff256 100644 --- a/publicodes/core/source/reference.ts +++ b/publicodes/core/source/reference.ts @@ -1,8 +1,6 @@ -import { EvaluatedNode } from './AST/types' import { InternalError } from './error' import { registerEvaluationFunction } from './evaluationFunctions' import { Context } from './parsePublicodes' -import { RuleNode } from './rule' export type ReferenceNode = { nodeKind: 'reference' @@ -26,6 +24,7 @@ registerEvaluationFunction('reference', function evaluateReference(node) { if (!node.dottedName) { throw new InternalError(node) } + const explanation = this.evaluate(this.parsedRules[node.dottedName]) return { ...node, diff --git a/publicodes/core/source/rule.ts b/publicodes/core/source/rule.ts index d4493aec1..172deed64 100644 --- a/publicodes/core/source/rule.ts +++ b/publicodes/core/source/rule.ts @@ -1,6 +1,8 @@ import { ASTNode, EvaluatedNode } from './AST/types' +import { warning } from './error' import { bonus, mergeMissing } from './evaluation' import { registerEvaluationFunction } from './evaluationFunctions' +import { capitalise0 } from './format' import parse, { mecanismKeys } from './parse' import { Context } from './parsePublicodes' import { ReferenceNode } from './reference' @@ -10,7 +12,6 @@ import { ReplacementRule, } from './replacement' import { nameLeaf, ruleParents } from './ruleUtils' -import { capitalise0 } from './format' export type Rule = { formule?: Record | string @@ -119,25 +120,53 @@ export default function parseRule( } registerEvaluationFunction('rule', function evaluate(node) { - if (this.cache[node.dottedName]) { - return this.cache[node.dottedName] - } const explanation = { ...node.explanation } - - const verifyParentApplicability = !this.cache._meta.ruleStack.includes( - node.dottedName - ) - this.cache._meta.ruleStack.unshift(node.dottedName) let parent: EvaluatedNode | null = null - if (explanation.parent && verifyParentApplicability) { - parent = this.evaluate(explanation.parent) as EvaluatedNode + if (explanation.parent) { + if (this.cache._meta.parentRuleStack.includes(node.dottedName)) { + parent = { nodeValue: null } as EvaluatedNode + } else { + this.cache._meta.parentRuleStack.unshift(node.dottedName) + parent = this.evaluate(explanation.parent) as EvaluatedNode + this.cache._meta.parentRuleStack.shift() + } explanation.parent = parent } let valeur: EvaluatedNode | null = null if (!parent || parent.nodeValue !== false) { - valeur = this.evaluate(explanation.valeur) as EvaluatedNode + if ( + this.cache._meta.evaluationRuleStack.filter( + (dottedName) => dottedName === node.dottedName + ).length > 15 // I don't know why this magic number, but below, cycle are detected "too early", which leads to blank value in brut-net simulator + ) { + warning( + this.options.logger, + node.dottedName, + ` + Un cycle a été détecté dans lors de l'évaluation de cette règle. + Par défaut cette règle sera évaluée à 'null'. + + Pour indiquer au moteur de résoudre la référence circulaire en trouvant le point fixe + de la fonction, il vous suffit d'ajouter l'attribut suivant niveau de la règle : + + ${node.dottedName}: + "résoudre la référence circulaire: oui" + ... + + ` + ) + + valeur = { nodeValue: null } as EvaluatedNode + } else { + this.cache._meta.evaluationRuleStack.unshift(node.dottedName) + valeur = this.evaluate(explanation.valeur) as EvaluatedNode + this.cache._meta.evaluationRuleStack.shift() + } + explanation.valeur = valeur } + // if (valeur.nodeValue === '') { + const evaluation = { ...node, explanation, @@ -148,7 +177,5 @@ registerEvaluationFunction('rule', function evaluate(node) { ), ...(valeur && 'unit' in valeur && { unit: valeur.unit }), } - this.cache._meta.ruleStack.shift() - this.cache[node.dottedName] = evaluation return evaluation }) diff --git a/publicodes/core/source/uniroot.ts b/publicodes/core/source/uniroot.ts index 3023d7f86..e1fd03744 100644 --- a/publicodes/core/source/uniroot.ts +++ b/publicodes/core/source/uniroot.ts @@ -109,7 +109,9 @@ export default function uniroot( if ((fb > 0 && fc > 0) || (fb < 0 && fc < 0)) { ;(c = a), (fc = fa) // Adjust c for it to have a sign opposite to that of b } - + if (Math.abs(fb) < errorTol) { + return b + } if (Math.abs(fb) < acceptableErrorTol) { fallback = b } diff --git a/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml b/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml new file mode 100644 index 000000000..841abfefb --- /dev/null +++ b/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml @@ -0,0 +1,68 @@ +fx: +x: + résoudre la référence circulaire: oui + valeur: fx + exemples: + - nom: affine + situation: + fx: 200 - x + valeur attendue: 100 + - nom: quadratique + situation: + fx: 0.2 * x * x - 400 * x + 500 + valeur attendue: 2003.743 + # CF https://www.wolframalpha.com/input/?i=x%3D0.2x%C2%B2-400x%2B500 + +CA: + unité: € + plancher: 0€ + formule: + inversion numérique: + avec: + - net + +net: + résoudre la référence circulaire: oui + unité: € + formule: CA - 50% * net + + +net après impôt: + formule: 80% * net + unité: € + +cycle avec inversion et situation vide: + exemples: + - nom: CA + situation: + cycle avec inversion et situation vide: CA + valeur attendue: null + # - nom: net + # situation: + # cycle avec inversion et situation vide: net + # valeur attendue: null + # - nom: net après impôt + # situation: + # cycle avec inversion et situation vide: net après impôt + # valeur attendue: null + +cycle avec la règle à inverser fixée dans la situation: + valeur: net + exemples: + - situation: + CA: 10000 + valeur attendue: 6666.666 + +cycle avec la règle du cycle fixée dans la situation: + valeur: CA + exemples: + - situation: + net: 1000 + valeur attendue: 1500 + +# cycle avec une règle reliée fixée dans la situation: +# valeur: net +# exemples: +# - situation: +# net après impôt: 8000 +# valeur attendue: 10000 diff --git a/publicodes/docs/mecanisms.yaml b/publicodes/docs/mecanisms.yaml index 5615c95cc..4bf0ccc36 100644 --- a/publicodes/docs/mecanisms.yaml +++ b/publicodes/docs/mecanisms.yaml @@ -494,6 +494,7 @@ synchronisation: n'est pas stable. Se référer aux exemples existants. inversion numérique: + chainable: oui description: >- Il est souhaitable de rédiger les règles de calcul en publicodes de la même façon qu'elles sont décrites dans la loi ou les @@ -523,3 +524,37 @@ inversion numérique: (calculée ou saisie), et procéder à l'inversion décrite plus haut à partir de celle-ci. Sinon, ces possibilités d'inversions seront listées comme manquantes. + +résoudre la référence circulaire: + description: | + Active le calcul itératif pour trouver la valeur de la règle qui résout + la référence circulaire. + + Il est possible pour une règle de se référencer elle-même. Par défaut, le + moteur considère qu'il s'agit d'un cycle non voulu, et renvoie 'null' comme valeur + pour la règle en question, en affichant un avertissement. + + Mais dans certains cas, la formule est bonne et le cycle est voulu. La valeur de la + règle attendue est donc celle qui résout l'équation obtenue via la référence cyclique. + + Lorsque l'on active cette fonctionnalité, le moteur va procéder par essai-erreur jusqu'à + trouver cette valeur. + + Note : la résolution de cycle est coûteuse en temps de calcul. Il faut donc veiller à + ne pas la cumuler avec l'évaluation d'un autre mécanisme coûteux comme l'inversion numérique + par exemple. + + + exemples: + base: >- + x: + valeur: 4 * x - 5 + résoudre la référence circulaire: oui + calcul du revenu professionnel: >- + chiffre d'affaires: 10000 €/an + + cotisations: 25% * revenu professionnel + + revenu professionnel: + valeur: chiffre d'affaires - cotisations + résoudre la référence circulaire: oui diff --git a/publicodes/ui-react/source/Explanation.tsx b/publicodes/ui-react/source/Explanation.tsx index 76ce028a2..bafe2d689 100644 --- a/publicodes/ui-react/source/Explanation.tsx +++ b/publicodes/ui-react/source/Explanation.tsx @@ -1,8 +1,10 @@ -import { ConstantNode, Leaf } from './mecanisms/common' +import { useContext } from 'react' +import { EngineContext } from './contexts' import Abattement from './mecanisms/Abattement' import ApplicableSi from './mecanisms/Applicable' import Arrondi from './mecanisms/Arrondi' import Barème from './mecanisms/Barème' +import { ConstantNode, Leaf } from './mecanisms/common' import Composantes from './mecanisms/Composantes' import Durée from './mecanisms/Durée' import Grille from './mecanisms/Grille' @@ -19,6 +21,7 @@ import Recalcul from './mecanisms/Recalcul' import Replacement from './mecanisms/Replacement' import ReplacementRule from './mecanisms/ReplacementRule' import Rule from './mecanisms/Rule' +import RésoudreRéférenceCirculaire from './mecanisms/RésoudreRéférenceCirculaire' import Situation from './mecanisms/Situation' import Somme from './mecanisms/Somme' import Synchronisation from './mecanisms/Synchronisation' @@ -28,8 +31,6 @@ import UneDeCesConditions from './mecanisms/UneDeCesConditions' import UnePossibilité from './mecanisms/UnePossibilité' import Unité from './mecanisms/Unité' import Variations from './mecanisms/Variations' -import { useContext } from 'react' -import { EngineContext } from './contexts' const UIComponents = { constant: ConstantNode, @@ -61,6 +62,7 @@ const UIComponents = { 'toutes ces conditions': ToutesCesConditions, 'une de ces conditions': UneDeCesConditions, 'une possibilité': UnePossibilité, + 'résoudre référence circulaire': RésoudreRéférenceCirculaire, unité: Unité, 'variable temporelle': () => '[variable temporelle]', variations: Variations, diff --git a/publicodes/ui-react/source/mecanisms/RésoudreRéférenceCirculaire.tsx b/publicodes/ui-react/source/mecanisms/RésoudreRéférenceCirculaire.tsx new file mode 100644 index 000000000..c02c285f3 --- /dev/null +++ b/publicodes/ui-react/source/mecanisms/RésoudreRéférenceCirculaire.tsx @@ -0,0 +1,19 @@ +import Explanation from '../Explanation' +import { Mecanism } from './common' + +export default function MecanismRésoudreRéférenceCirculaire({ explanation }) { + return ( + +

+ {' '} + Cette valeur a été retrouvé en résolvant la référence circulaire dans la + formule ci dessous :{' '} +

+ + +
+ ) +} diff --git a/publicodes/ui-react/source/rule/RulePage.tsx b/publicodes/ui-react/source/rule/RulePage.tsx index fc354b0fe..ef9e59fc7 100644 --- a/publicodes/ui-react/source/rule/RulePage.tsx +++ b/publicodes/ui-react/source/rule/RulePage.tsx @@ -19,7 +19,6 @@ export default function Rule({ dottedName, engine, language }) { return

Cette règle est introuvable dans la base

} const rule = engine.evaluate(engine.getRule(dottedName)) - const { description, question } = rule.rawNode const { parent, valeur } = rule.explanation return ( From b2b97995702db62fe0d0389e6df23414982ce9bd Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 26 Mar 2021 12:09:18 +0100 Subject: [PATCH 007/319] =?UTF-8?q?Calcul=20de=20la=20r=C3=A9duction=20Cov?= =?UTF-8?q?id=20sur=20l'aide=20=C3=A0=20la=20d=C3=A9claration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les explications sont imbitables mais nous ont été fournies par la DNRTI. --- .../déclaration-revenu-indépendant.yaml | 214 +++++++++++++++++- .../AideDéclarationIndépendant/config.yaml | 1 + .../AideDéclarationIndépendant/index.tsx | 11 +- mon-entreprise/source/pages/Gérer/Home.tsx | 2 +- .../source/pages/Simulateurs/metadata.tsx | 4 +- .../source/mecanisms/UnePossibilité.tsx | 2 +- 6 files changed, 221 insertions(+), 13 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 455345a65..c8166ea50 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -2,9 +2,10 @@ aide déclaration revenu indépendant 2020: description: >- - Ces règles calculent les montants demandés dans les déclarations sociale et - fiscale des indépendants de 2021 sur les revenus 2020 + Ces règles calculent les montants demandés dans la déclaration de revenu des + indépendants de 2021 sur les revenus 2020. formule: non + aide déclaration revenu indépendant 2020 . nature de l'activité: remplace: entreprise . activité question: Quelle est la nature de votre activité ? @@ -66,7 +67,7 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . libérale: Ce sont les professions "intellectuelles", qui ne sont rattachée à aucune caisse spécifique de retraite. - C'est le cas de toutes les professions libérale non reglementée depuis le + C'est le cas de toutes les professions libérale non réglementées depuis le 1er janvier 2020. références: @@ -139,6 +140,7 @@ aide déclaration revenu indépendant 2020 . cotisations sociales déductible: - dirigeant . indépendant . cotisations et contributions . cotisations - dirigeant . indépendant . conjoint collaborateur . cotisations - (- dirigeant . indépendant . cotisations et contributions . exonérations) + - (- réduction covid . montant) aide déclaration revenu indépendant 2020 . CFP: résumé: contribution à la formation professionnelle [D] formule: dirigeant . indépendant . cotisations et contributions . formation professionnelle @@ -162,3 +164,209 @@ aide déclaration revenu indépendant 2020 . assiette sociale: formule: valeur: revenu net fiscal abattement: total charges sociales déductible + +aide déclaration revenu indépendant 2020 . réduction covid: + titre: Réduction de cotisation Covid + description: | + Dans le cadre de la crise sanitaire, le Gouvernement a mis en œuvre plusieurs mesures exceptionnelles concernant les cotisations et contributions sociales des travailleurs indépendants affectés par la crise du coronavirus avec : + + - un premier dispositif de réduction des cotisations et contributions sociales prévu par la 3ème loi de finance rectificative (LFR3) pour 2020(1) dans le cadre de la première période d’état d’urgence sanitaire du printemps 2020, + - un second dispositif de réduction prévu par la loi de financement de la sécurité sociale (LFSS) pour 2021 (2) dans le cadre de la seconde période d’état d’urgence sanitaire de l’automne 2020. + + références: + (1) Décret n° 2020-1103 du 1er septembre 2020: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000042297236/ + (2) Décret 2021-75 du 27 janvier 2021: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000043070140 + + question: Remplissez-vous les conditions pour bénéficier de la réduction de cotisations sociales liées à la crise du Covid-19 ? + par défaut: non + +aide déclaration revenu indépendant 2020 . réduction covid . montant: + titre: Réduction de cotisations Covid + résumé: intégrée dans le montant des cotisations calculé ci-dessus + formule: + somme: + - printemps 2020 + - automne 2020 + plafond: + somme: + - dirigeant . indépendant . cotisations et contributions . cotisations + - dirigeant . indépendant . conjoint collaborateur . cotisations + - (- dirigeant . indépendant . cotisations et contributions . exonérations) + - (- CFP) + +aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020: + applicable si: éligible aide printemps 2020 + formule: + variations: + - si: secteur d'activité = 'S2' + alors: 1800 €/an + - sinon: 2400 €/an + +aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020: + applicable si: éligible aide automne 2020 + formule: nombre de mois éligibles * 600 €/an/mois éligibles + +aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: + question: | + De quel secteur votre activité principale relève-t'elle ? + # Pas d'inéligibilité explicite des PL réglementés à ce dispositif, mais il + # apparaît que les métiers concernés (médecins, avocats...) sont incompatibles + # avec les secteurs d'activités concernés par l'aide (hôtels, restaurants...) + description: | + Les conditions d'éligibilité aux aides "covid" dépendent du secteur + d'activité de l'établissement. + + Les hôtels, restaurants, bars, etc. sont dans + la catégorie dite "S1" et ont le droit aux aides sans autre conditions. + + Les secteurs dont l'activité dépendent de celles du "secteur 1" peuvent + aussi bénéficier des aides à condition d'avoir eu une baisse de chiffre + d'affaires significative pendant le confinement. + + Enfin les secteurs dits "S2" sont ceux impliquant l'accueil du public, et + sont éligibles aux aides à condition d'avoir subit une fermeture + administrative. + + Les modalités sont précisées sur le site de l'Urssaf. + références: + Sécu-indépendant: https://www.secu-independants.fr/cpsti/actualites/actualites-nationales/covid-dispositifs-de-reduction-des-cotisations/ + formule: + une possibilité: + choix obligatoire: oui + possibilités: + - S1 + - S1-bis + - S2 + par défaut: non + +aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1: + titre: Secteur "1" - tourisme, hôtellerie, restauration + +aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis: + titre: Secteur "1 bis" - dont l'activité dépend de celle des secteurs 1 + +aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2: + titre: Secteur "2" - activité impliquant l'accueil du public qui a été interrompue + +aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: + applicable si: secteur d'activité + question: Êtes-vous éligibles au dispositif de réduction prévu au titre de la première vague de la crise sanitaire du printemps 2020 ? + par défaut: non + description: | + Les conditions d’éligibilité à la réduction au titre de la première période d’état d’urgence sanitaire du printemps 2020 dépendent de votre secteur d’activité : + + ### Secteur S1 + + Activité principale exercée relevant des secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel (Voir liste détaillée des activités relevant du secteur S1). + + Votre activité doit avoir débuté avant le 1er juillet 2020. + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020. + + ### Secteur S1 bis + + Activité principale exercée dépendant de celles du secteur S1 (Voir liste détaillée des activités relevant du secteur S1 bis) et ayant subi une forte baisse du chiffre d’affaires à savoir : + + - Soit une baisse de chiffre d’affaires d’au moins 80% durant la période comprise entre le 15 mars et le 15 mai 2020 par rapport à la même période l’année précédente (cas 1) ; + ou, par rapport au chiffre d’affaires mensuel moyen de l’année 2019 ramené sur deux mois (cas 2) ; + ou, pour les entreprises créées après le 15 mars 2019 et avant le 10 mars 2020, par rapport au montant moyen calculé sur deux mois du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 15 mars 2020 (cas 2 bis). + + - Soit à une baisse de chiffre d’affaires durant la période comprise entre le 15 mars et le 15 mai 2020 par rapport à la même période l’année précédente qui représente au moins 30 % du chiffre d’affaires de l’année 2019 (cas 3). + ou, pour les entreprises créées entre le 1er et le 14 mars 2019, une baisse du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 31 décembre 2019 ramené sur 12 mois (cas 3 bis). + + Votre activité doit avoir débuté avant le 1er juillet 2020. + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020. + + ### Secteur S2 + + Activité principale exercée dans un secteur autre que S1 et S1 bis impliquant l’accueil du public et interrompue en application du décret n° 2020-293 du 23 mars 2020, à l’exclusion des fermetures volontaires. + + Votre activité doit avoir débuté avant le 1er juin 2020. + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020. + + +aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020: + applicable si: secteur d'activité + question: Êtes-vous éligibles au dispositif de réduction prévu au titre de la première vague de la crise sanitaire de l'automne 2020 ? + par défaut: non + description: | + Les conditions d’éligibilité à la réduction au titre de la seconde période d’état d’urgence sanitaire de l’automne 2020 s’évaluent mois par mois et dépendent de votre secteur d’activité. + + Vous devez également préciser le nombre de mois où vous remplissez les conditions d’éligibilité. + + ### Secteur dit S1 + Activité principale exercée relevant des secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel + + Mois concerné | Conditions d'éligibilité + --------------|-------------------------- + Octobre 2020 | Activité exercée dans une zone d’application des mesures de couvre-feu Et avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Activité exercée dans une zone d’application des mesures de couvre-feu Et avoir subi une forte baisse du chiffre d’affaires mensuel(ca) + Novembre 2020 à Mars 2021 | Avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Avoir subi une forte baisse du chiffre d’affaires mensuel(ca) + + _(ca) Condition de baisse de chiffre d'affaire:_ + + _Vous devez avoir subi une baisse d’au moins 50% du chiffre d’affaires mensuel par rapport au même mois de l’année précédente, ou si vous le souhaitez par rapport au chiffre d’affaires mensuel moyen de l’année 2019, ou, pour les entreprises créées en 2020, par rapport au montant mensuel moyen du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 31 août 2020._ + + _Cette condition est également satisfaite lorsque la baisse de chiffre d’affaires mensuel par rapport à la même période de l’année précédente représente au moins 15% du chiffre d’affaires de l’année 2019, ou, pour les entreprises créées en 2019, par rapport au chiffre d’affaires de l’année 2019 ramené sur 12 mois._ + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 17 octobre 2020. + + Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction d’accueil du public. + + ### Secteur dit S1 + Activité principale exercée dépendant de celles du secteur S1 + + Mois concerné | Conditions d'éligibilité + --------------|-------------------------- + Octobre 2020 | Avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Avoir subi une forte baisse du chiffre d’affaires mensuel(ca) + + _(ca) Condition de baisse de chiffre d'affaire:_ + + _Vous devez avoir subi une baisse d’au moins 50% du chiffre d’affaires mensuel par rapport au même mois de l’année précédente, ou si vous le souhaitez par rapport au chiffre d’affaires mensuel moyen de l’année 2019, ou, pour les entreprises créées en 2020, par rapport au montant mensuel moyen du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 31 août 2020._ + + _Cette condition est également satisfaite lorsque la baisse de chiffre d’affaires mensuel par rapport à la même période de l’année précédente représente au moins 15% du chiffre d’affaires de l’année 2019, ou, pour les entreprises créées en 2019, par rapport au chiffre d’affaires de l’année 2019 ramené sur 12 mois._ + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 17 octobre 2020. + + Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction d’accueil du public. + + ### Secteur dit S2 + Activité principale exercée dans un secteur autre que S1 et S1 bis + + - **Mois concerné** : novembre 2020, février 2021, mars 2021 + - **Conditions d'éligibilité**: Avoir fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de l’activité, en application du décret n° 2020-1310 du 29 octobre 2020 + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 30 octobre 2020. + + Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction. + +aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles: + formule: + somme: + - S1 + - S2 + arrondi: oui + plafond: + variations: + - si: secteur d'activité = 'S2' + alors: 3 mois éligibles + - sinon: 6 mois éligibles + +aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1: + applicable si: + toutes ces conditions: + - éligible aide automne 2020 + - secteur d'activité = 'S1' + question: | + Précisez le nombre de mois entre octobre 2020* et mars 2021 durant lesquels vous avez subi une interdiction d’accueil du public ou une baisse de 50% de votre chiffre d’affaires + description: | + * Pour octobre 2020, vous activité devait également être située dans une zone d’application des mesures de couvre-feu + unité: mois éligibles + +aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2: + applicable si: + toutes ces conditions: + - éligible aide automne 2020 + - secteur d'activité = 'S2' + question: | + Précisez le nombre de mois (novembre 2020 et/ou février 2021 et/ou mars 2021) durant lesquels vous avez fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de votre activité + unité: mois éligibles diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml index 887e6f1b9..7866253f5 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml @@ -3,6 +3,7 @@ objectifs: - aide déclaration revenu indépendant 2020 . CSG déductible - aide déclaration revenu indépendant 2020 . cotisations sociales déductible - aide déclaration revenu indépendant 2020 . CFP + - aide déclaration revenu indépendant 2020 . réduction covid . montant - aide déclaration revenu indépendant 2020 . total charges sociales déductible - aide déclaration revenu indépendant 2020 . assiette sociale diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 05fbe11b0..7f936918f 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -53,13 +53,10 @@ export default function AideDéclarationIndépendant() {
-

Aide à la déclaration de revenus au titre de l'année 2020

- Cet outil est une aide aux déclarations fiscale (revenu) et sociale ( - DSI) à - destination des travailleurs indépendants. Il vous permet de connaître - le montant des charges sociales déductibles à partir de votre résultat - net fiscal. + Cet outil est une aide aux déclarations de revenus à destination des + travailleurs indépendants. Il vous permet de connaître le montant des + charges sociales déductibles à partir de votre résultat net fiscal.

Vous restez entièrement responsable d'éventuelles omissions ou @@ -147,6 +144,8 @@ export default function AideDéclarationIndépendant() { + +

Situation personnelle

diff --git a/mon-entreprise/source/pages/Gérer/Home.tsx b/mon-entreprise/source/pages/Gérer/Home.tsx index 8a14b5640..b9906d5f4 100644 --- a/mon-entreprise/source/pages/Gérer/Home.tsx +++ b/mon-entreprise/source/pages/Gérer/Home.tsx @@ -99,7 +99,7 @@ export default function Gérer() {

Calculez facilement les montants des charges sociales à reporter dans votre déclaration de revenu au titre de - 2019 + 2020

diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 26ab3c556..e6f6fd732 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -598,7 +598,7 @@ export function getSimulatorsData({ meta: { description: t( 'pages.gérer.aide-déclaration-indépendant.meta.description', - 'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2019.' + 'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2020.' ), title: t( 'pages.gérer.aide-déclaration-indépendant.meta.title', @@ -612,7 +612,7 @@ export function getSimulatorsData({ ), title: t( 'pages.gérer.aide-déclaration-indépendant.title', - "Aide à la déclaration de revenus au titre de l'année 2019" + "Aide à la déclaration de revenus au titre de l'année 2020" ), }, 'demande-mobilité': { diff --git a/publicodes/ui-react/source/mecanisms/UnePossibilité.tsx b/publicodes/ui-react/source/mecanisms/UnePossibilité.tsx index 929d8e7e1..59bc133d7 100644 --- a/publicodes/ui-react/source/mecanisms/UnePossibilité.tsx +++ b/publicodes/ui-react/source/mecanisms/UnePossibilité.tsx @@ -3,7 +3,7 @@ import { Mecanism } from './common' export default function UnePossibilitéMecanism({ explanation }) { return ( - +
    {explanation.map((node, i) => (
  • From 86b7f19027c96abab2e05ac03731af5398d01c3b Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 26 Mar 2021 15:51:59 +0100 Subject: [PATCH 008/319] =?UTF-8?q?=F0=9F=94=A5=20Suppression=20des=20aide?= =?UTF-8?q?s=20covid=20sur=20les=20simulateurs=20de=20revenus=202021?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/artiste-auteur.yaml | 36 -------- modele-social/règles/dirigeant.yaml | 35 -------- .../règles/entreprise-établissement.yaml | 71 --------------- .../simulationExplanation/AidesCovid.tsx | 89 ------------------- .../IndépendantExplanation.tsx | 2 - .../pages/Simulateurs/ArtisteAuteur.tsx | 2 - .../pages/Simulateurs/AutoEntrepreneur.tsx | 3 - 7 files changed, 238 deletions(-) delete mode 100644 mon-entreprise/source/components/simulationExplanation/AidesCovid.tsx diff --git a/modele-social/règles/artiste-auteur.yaml b/modele-social/règles/artiste-auteur.yaml index 213d89d9c..5568e7acd 100644 --- a/modele-social/règles/artiste-auteur.yaml +++ b/modele-social/règles/artiste-auteur.yaml @@ -129,39 +129,3 @@ artiste-auteur . cotisations . formation professionnelle: produit: assiette: assiette taux: 0.35% - -artiste-auteur . cotisations . assiette 2019: - description: | - Nous calculons l'aide covid sur la base d'une assiette des cotisations 2019 - égale à l'assiette 2020. - par défaut: cotisations . assiette - -artiste-auteur . réduction de cotisations covid 2020: - description: | - Afin de tenir compte de l'impact de la crise du Covid-19 le gouvernement a - mis en place une prise en charge des cotisations sociales des - artistes-auteurs dues pour 2020 pouvant aller jusqu'à 2 000€. - - Cette aide est calculée à partir de l'assiette des cotisations sociales de - 2019. - - La prise en charge est automatique et vous n'avez pas de démarche a - effectuer. Vous bénéficierez de cette aide après la déclaration annuelle de - revenus 2020, soit au second trimestre 2021. - applicable si: - toutes ces conditions: - - période . fin d'année = 31/12/2020 - - cotisations . assiette >= 3000 €/an - formule: - # TODO: c'est inférieur ou égal ici - grille: - assiette: cotisations . assiette 2019 - tranches: - - montant: 500 €/an - plafond: 800 heures/an * SMIC horaire - - montant: 1000 €/an - plafond: 2000 heures/an * SMIC horaire - - montant: 2000 €/an - plafond: cotisations - références: - Infographie Urssaf: https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/5761-Infographie-Aide-AA-WEB.pdf diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index ade053828..f63dc02ca 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -534,38 +534,6 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . - taux: 0% plafond: 100% -dirigeant . indépendant . cotisations et contributions . aides covid 2020: - description: | - Le gouvernement et les organismes de sécurité sociale ont mis en place des - dispositifs de réduction de cotisation pour les indépendants impactés par la - crise du Coronavirus. - formule: - somme: - - aide indépendant covid 2020 - - PL . CIPAV . retraite complémentaire . réduction COVID . montant - -dirigeant . indépendant . cotisations et contributions . aide indépendant covid 2020: - description: | - Le montant de la réduction dépend du secteur d'activité dont vous relevez. - Il est plafonné aux montant des cotisations sociales définitives de 2020, - hors CFP (contribution à la formation professionnelle) et CURPS - (contribution aux unions régionales des professionnels de santé). - formule: - variations: - - si: - une de ces conditions: - - établissement . secteur d'activité covid = 'S1' - - établissement . secteur d'activité covid = 'S1-bis' - alors: 2400 €/an - - si: établissement . secteur d'activité covid = 'S2' - alors: 1800 €/an - plafond: - somme: - - cotisations - - CSG et CRDS - références: - Sécu-indépendant: https://www.secu-independants.fr/cpsti/actualites/actualites-nationales/covid-dispositifs-de-reduction-des-cotisations/ - dirigeant . indépendant . revenu net de cotisations: identifiant court: independant-net synonymes: @@ -791,15 +759,12 @@ dirigeant . indépendant . cotisations et contributions: C'est le montant total dû par l'indépendant au titre des cotisations et contributions obligatoires. - Ce montant inclut la réduction de cotisation "covid" en 2020. - formule: somme: - cotisations - CSG et CRDS - contributions spéciales - formation professionnelle - - (- aide indépendant covid 2020) note: | À la différence des cotisations, les contributions ne sont pas réintroduites pour le calcul de la CSG/CRDS. Elles ne bénéficient pas non plus de la diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 1e0d0c6dc..6ed480e75 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -843,74 +843,3 @@ entreprise . activité . débit de tabac: durée: depuis: entreprise . date de création jusqu'à: 31/12/2019 - -établissement . secteur d'activité covid: - question: | - Dispositif de réduction "covid" : votre activité principale relève-t'elle d'un des secteurs suivants ? - # Pas d'inigibilité explicite des PL réglementés à ce dispositif, mais il - # apparaît que les métiers concernés (médecins, avocats...) sont incompatibles - # avec les secteurs d'activités concernés par l'aide (hôtels, restaurants...) - non applicable si: entreprise . activité . libérale réglementée - description: | - Les conditions d'éligibilité aux aides "covid" dépendent du secteur - d'activité de l'établissement. - - Les hôtels, restaurants, bars, etc. sont dans - la catégorie dite "S1" et ont le droit aux aides sans autre conditions. - - Les secteurs dont l'activité dépendent de celles du "secteur 1" peuvent - aussi bénéficier des aides à condition d'avoir eu une baisse de chiffre - d'affaires significative pendant le confinement. - - Enfin les secteurs dits "S2" sont ceux impliquant l'accueil du public, et - sont éligibles aux aides à condition d'avoir subit une fermeture - administrative. - - Les modalités sont précisées sur le site de l'Urssaf. - références: - Sécu-indépendant: https://www.secu-independants.fr/cpsti/actualites/actualites-nationales/covid-dispositifs-de-reduction-des-cotisations/ - par défaut: non - formule: - une possibilité: - choix obligatoire: non - possibilités: - - S1 - - S1-bis - - S2 - -établissement . secteur d'activité covid . S1: - titre: Secteur "1" - tourisme, hôtellerie, restauration - -établissement . secteur d'activité covid . S1-bis: - titre: Secteur "1 bis" - dont l'activité dépend de celle des secteurs 1 - -établissement . secteur d'activité covid . S2: - titre: Secteur "2" - activité impliquant l'accueil du public qui a été interrompue - -établissement . secteur d'activité covid . éligible aide: - formule: - une de ces conditions: - - secteur d'activité covid = 'S1' - - toutes ces conditions: - - secteur d'activité covid = 'S1-bis' - - baisse significative de chiffre d'affaires - - toutes ces conditions: - - secteur d'activité covid = 'S2' - - activité interrompue - références: - Sécu-indépendant: https://www.secu-independants.fr/cpsti/actualites/actualites-nationales/covid-dispositifs-de-reduction-des-cotisations/ - -établissement . secteur d'activité covid . baisse significative de chiffre d'affaires: - question: | - Votre activité a-t-elle subit une baisse d'au moins 80% de chiffre d'affaire - entre le 15 mars et le 15 mai 2020 par rapport à l'année précédentes ? - par défaut: oui - références: - Sécu-indépendant: https://www.secu-independants.fr/cpsti/actualites/actualites-nationales/covid-dispositifs-de-reduction-des-cotisations/ - -établissement . secteur d'activité covid . activité interrompue: - question: | - Votre activité a-t'elle été interrompue à cause de l’épidémie de Covid-19 ? - par défaut: oui - références: - Sécu-indépendant: https://www.secu-independants.fr/cpsti/actualites/actualites-nationales/covid-dispositifs-de-reduction-des-cotisations/ diff --git a/mon-entreprise/source/components/simulationExplanation/AidesCovid.tsx b/mon-entreprise/source/components/simulationExplanation/AidesCovid.tsx deleted file mode 100644 index a82ffc92c..000000000 --- a/mon-entreprise/source/components/simulationExplanation/AidesCovid.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import Value, { Condition } from 'Components/EngineValue' -import emoji from 'react-easy-emoji' -import { Trans } from 'react-i18next' -import { DottedName } from 'modele-social' - -type AidesCovidProps = { - aidesRule?: DottedName -} - -export default function AidesCovid({ aidesRule }: AidesCovidProps) { - return ( - <> -

    - Aides Covid-19 -

    -
    - {aidesRule && ( - -
    - -

    Réduction de cotisations

    -

    - Vous pouvez bénéficier d'une réduction de vos cotisations - définitives sur l'année 2020. -

    -

    - -

    -
    -
    -
    - )} - -
    - -

    Déduction de chiffre d'affaires

    -

    - Les conditions et modalités de la réduction "covid" sont - présentées sur le site de l'Urssaf. -

    - - {emoji('▶')} En savoir plus - -
    -
    -
    -
    - -

    Aides gouvernementales

    -

    - Le ministère de l'Économie propose un portail recensant les - mesures de soutien aux entreprises. -

    - - {emoji('▶')} Mesures de soutien - -
    -
    -
    - -

    Écoute et soutien

    -

    - Une{' '} - - cellule de première écoute et de soutien psychologique - {' '} - a été mise en place pour les chefs d'entreprise fragilisés par la - crise. -

    - - {emoji('📞')} 08 05 65 50 50 - -
    -
    -
    - - ) -} diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index c93c7363c..4f892ebe2 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -17,7 +17,6 @@ import { Trans, useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { targetUnitSelector } from 'Selectors/simulationSelectors' import styled from 'styled-components' -import AidesCovid from './AidesCovid' import { DistributionSection } from './SalaryExplanation' export default function IndépendantExplanation() { @@ -29,7 +28,6 @@ export default function IndépendantExplanation() { -

    Répartition de la rémunération totale

    diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx index 8b929b901..57b9040e5 100644 --- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx @@ -1,7 +1,6 @@ import { DistributionBranch } from 'Components/Distribution' import Value, { Condition } from 'Components/EngineValue' import SimulateurWarning from 'Components/SimulateurWarning' -import AidesCovid from 'Components/simulationExplanation/AidesCovid' import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import 'Components/TargetSelection.css' import Animate from 'Components/ui/animate' @@ -101,7 +100,6 @@ function CotisationsResult() {

- diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index 4b737e64f..b5753abe8 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -14,7 +14,6 @@ import { default as React, useCallback, useContext } from 'react' import { Trans, useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' import { situationSelector } from 'Selectors/simulationSelectors' -import AidesCovid from '../../components/simulationExplanation/AidesCovid' const proportions = { 'entreprise . activité . mixte . proportions . service BIC': @@ -163,8 +162,6 @@ function Explanation() { const { palettes } = useContext(ThemeColorsContext) return (
- -

Répartition du chiffre d'affaires

From c26b1904e2dc0072e5711d3fe54b47b9d9142bdd Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Sat, 27 Mar 2021 18:30:02 +0100 Subject: [PATCH 009/319] =?UTF-8?q?=E2=9C=85=20MAJ=20des=20traductions=20e?= =?UTF-8?q?t=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../déclaration-revenu-indépendant.yaml | 4 +- mon-entreprise/source/locales/rules-en.yaml | 577 +++++++++++++----- mon-entreprise/source/locales/ui-en.yaml | 3 + .../source/pages/Simulateurs/metadata.tsx | 20 +- .../__snapshots__/simulations.jest.js.snap | 66 +- .../aide-déclaration-indépendants.yaml | 14 + 6 files changed, 481 insertions(+), 203 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index c8166ea50..3f594df30 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -355,7 +355,9 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois applicable si: toutes ces conditions: - éligible aide automne 2020 - - secteur d'activité = 'S1' + - une de ces conditions: + - secteur d'activité = 'S1' + - secteur d'activité = 'S1-bis' question: | Précisez le nombre de mois entre octobre 2020* et mars 2021 durant lesquels vous avez subi une interdiction d’accueil du public ou une baisse de 50% de votre chiffre d’affaires description: | diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 19a602ac6..d5edfe2fb 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -10,11 +10,10 @@ SMIC temps plein . net imposable: titre.en: '[automatic] minimum net taxable income' titre.fr: SMIC net imposable aide déclaration revenu indépendant 2020: - description.en: '[automatic] These rules calculate the amounts claimed in the - 2021 social and tax returns of self-employed persons on 2020 income' - description.fr: - Ces règles calculent les montants demandés dans les déclarations - sociale et fiscale des indépendants de 2021 sur les revenus 2020 + description.en: '[automatic] These rules calculate the amounts claimed on the + 2021 self-employed tax return on 2020 income.' + description.fr: Ces règles calculent les montants demandés dans la déclaration + de revenu des indépendants de 2021 sur les revenus 2020. titre.en: '[automatic] assistance declaration independent income 2020' titre.fr: aide déclaration revenu indépendant 2020 aide déclaration revenu indépendant 2020 . ACRE: @@ -169,19 +168,19 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . artisanale: aide déclaration revenu indépendant 2020 . nature de l'activité . libérale: description.en: > [automatic] These are the "intellectual" professions, which are not attached - to any + to any specific specific pension fund. - This has been the case for all unregulated professions since the + This is the case for all unregulated liberal professions since - 1 January 2020. + January 1, 2020. description.fr: | Ce sont les professions "intellectuelles", qui ne sont rattachée à aucune caisse spécifique de retraite. - C'est le cas de toutes les professions libérale non reglementée depuis le + C'est le cas de toutes les professions libérale non réglementées depuis le 1er janvier 2020. titre.en: '[automatic] Liberal attached to the general regime' titre.fr: Libérale rattachée au régime général @@ -197,6 +196,407 @@ aide déclaration revenu indépendant 2020 . revenu net fiscal: résumé.fr: avant déduction des charges sociales et exonérations fiscales [A] titre.en: '[automatic] net taxable income' titre.fr: revenu net fiscal +aide déclaration revenu indépendant 2020 . réduction covid: + description.en: > + [automatic] Within the framework of the health crisis, the Government has + implemented several exceptional measures concerning the social contributions + of self-employed workers affected by the coronavirus crisis, including + + + - a first system of reduction of social security contributions provided for by the 3rd rectifying finance law (LFR3) for 2020(1) within the framework of the first period of health emergency in spring 2020, + + - a second reduction scheme provided for in the Social Security Financing Act (LFSS) for 2021 (2) as part of the second state of health emergency in the autumn of 2020. + description.fr: > + Dans le cadre de la crise sanitaire, le Gouvernement a mis en œuvre + plusieurs mesures exceptionnelles concernant les cotisations et + contributions sociales des travailleurs indépendants affectés par la crise + du coronavirus avec : + + + - un premier dispositif de réduction des cotisations et contributions sociales prévu par la 3ème loi de finance rectificative (LFR3) pour 2020(1) dans le cadre de la première période d’état d’urgence sanitaire du printemps 2020, + + - un second dispositif de réduction prévu par la loi de financement de la sécurité sociale (LFSS) pour 2021 (2) dans le cadre de la seconde période d’état d’urgence sanitaire de l’automne 2020. + question.en: + '[automatic] Do you qualify for the Covid-19 crisis-related payroll + tax reduction?' + question.fr: Remplissez-vous les conditions pour bénéficier de la réduction de + cotisations sociales liées à la crise du Covid-19 ? + titre.en: '[automatic] Covid contribution reduction' + titre.fr: Réduction de cotisation Covid +aide déclaration revenu indépendant 2020 . réduction covid . montant: + résumé.en: '[automatic] included in the amount of contributions calculated above' + résumé.fr: intégrée dans le montant des cotisations calculé ci-dessus + titre.en: '[automatic] Covid contribution reduction' + titre.fr: Réduction de cotisations Covid +? aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020 +: titre.en: '[automatic] Autumn 2020' + titre.fr: automne 2020 +? aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020 +: titre.en: '[automatic] Spring 2020' + titre.fr: printemps 2020 +? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles +: titre.en: '[automatic] number of eligible months' + titre.fr: nombre de mois éligibles +? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 +: description.en: | + [automatic] For October 2020, you must also be located in a curfew zone + description.fr: > + * Pour octobre 2020, vous activité devait également être située dans une + zone d’application des mesures de couvre-feu + question.en: > + [automatic] Specify the number of months between October 2020* and March + 2021 during which you were banned from receiving the public or experienced a + 50% drop in turnover + question.fr: > + Précisez le nombre de mois entre octobre 2020* et mars 2021 durant lesquels + vous avez subi une interdiction d’accueil du public ou une baisse de 50% de + votre chiffre d’affaires + titre.en: '[automatic] S1' + titre.fr: S1 +? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2 +: question.en: > + [automatic] Specify the number of months (November 2020 and/or February 2021 + and/or March 2021) during which you were subject to a prohibition measure + that predominantly affects the continuation of your business + question.fr: > + Précisez le nombre de mois (novembre 2020 et/ou février 2021 et/ou mars + 2021) durant lesquels vous avez fait l’objet d’une mesure d’interdiction + affectant de manière prépondérante la poursuite de votre activité + titre.en: '[automatic] S2' + titre.fr: S2 +aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: + description.en: > + [automatic] The conditions of eligibility for "covid" aid depend on the + sector of activity + + of activity of the establishment. + + + Hotels, restaurants, bars, etc. are in the so-called + + are in the so-called "S1" category and are entitled to the aid without any other conditions. + + + Sectors whose activities depend on those of "sector 1" can also benefit from aid + + can also benefit from aid provided that they have had a significant drop in turnover during + + during the period of confinement. + + + Finally, the sectors known as "S2" are those involving the reception of the public, and + + are eligible for aid provided that they have undergone an administrative + + administrative closure. + + + The procedures are specified on the Urssaf website. + description.fr: | + Les conditions d'éligibilité aux aides "covid" dépendent du secteur + d'activité de l'établissement. + + Les hôtels, restaurants, bars, etc. sont dans + la catégorie dite "S1" et ont le droit aux aides sans autre conditions. + + Les secteurs dont l'activité dépendent de celles du "secteur 1" peuvent + aussi bénéficier des aides à condition d'avoir eu une baisse de chiffre + d'affaires significative pendant le confinement. + + Enfin les secteurs dits "S2" sont ceux impliquant l'accueil du public, et + sont éligibles aux aides à condition d'avoir subit une fermeture + administrative. + + Les modalités sont précisées sur le site de l'Urssaf. + question.en: | + [automatic] In which sector is your main activity? + question.fr: | + De quel secteur votre activité principale relève-t'elle ? + titre.en: '[automatic] line of business' + titre.fr: secteur d'activité +? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1 +: titre.en: '[automatic] Sector "1" - tourism, hotels, restaurants' + titre.fr: Secteur "1" - tourisme, hôtellerie, restauration +? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis +: titre.en: '[automatic] Sector "1a" - whose activity depends on that of sectors 1' + titre.fr: Secteur "1 bis" - dont l'activité dépend de celle des secteurs 1 +? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2 +: titre.en: '[automatic] Sector "2" - activity involving the reception of the + public which has been interrupted' + titre.fr: Secteur "2" - activité impliquant l'accueil du public qui a été interrompue +? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020 +: description.en: > + [automatic] Eligibility for the reduction under the second fall 2020 health + emergency period is assessed month by month and depends on your industry. + + + You must also specify the number of months in which you meet the eligibility requirements. + + + Sector known as S1 + + Main activity in the tourism, hotel, restaurant, sports, culture, air transport and events sectors + + + Month concerned | Conditions of eligibility + + --------------|-------------------------- + + October 2020 | Activity carried out in an area where curfew measures apply And have been subject to a measure prohibiting the reception of the public **OR** Activity carried out in an area where curfew measures apply And have suffered a significant drop in monthly turnover(ca) + + November 2020 to March 2021 | To have been subject to a measure of prohibition of reception of the public **OR** To have undergone a strong fall of the monthly sales (ca) + + + Condition of decrease in turnover:_ + + + You must have suffered a drop in monthly turnover of at least 50% compared to the same month of the previous year, or if you wish, compared to the average monthly turnover of the year 2019, or, for companies created in 2020, compared to the average monthly turnover achieved between the date of creation of the company and August 31, 2020. + + + This condition is also met when the decrease in monthly turnover compared to the same period of the previous year represents at least 15% of the turnover of the year 2019, or, for companies created in 2019, compared to the turnover of the year 2019 over 12 months. + + + If you have ceased your activity, the cessation must be after or equal to 17 October 2020. + + + Good to know: The activities of delivery, withdrawal of order or takeaway sales are not taken into account to assess compliance with the condition of prohibition of reception of the public. + + + Sector known as S1 + + Main activity carried out depending on those of sector S1 + + + Month concerned | Conditions of eligibility + + --------------|-------------------------- + + October 2020 | Have been subject to a measure of prohibition of reception of the public **OR** Have undergone a significant drop in monthly turnover(ca) + + + Condition of decrease in turnover:_ + + + You must have suffered a drop in monthly turnover of at least 50% compared to the same month of the previous year, or if you wish, compared to the average monthly turnover of the year 2019, or, for companies created in 2020, compared to the average monthly turnover achieved between the date of creation of the company and August 31, 2020. + + + This condition is also met when the decrease in monthly turnover compared to the same period of the previous year represents at least 15% of the turnover of the year 2019, or, for companies created in 2019, compared to the turnover of the year 2019 over 12 months. + + + If you have ceased your activity, the cessation must be after or equal to 17 October 2020. + + + Good to know: The activities of delivery, withdrawal of order or takeaway sales are not taken into account to assess compliance with the condition of prohibition of reception of the public. + + + Sector known as S2 + + Main activity carried out in a sector other than S1 and S1 bis + + + - Month concerned** : November 2020, February 2021, March 2021 + + - Conditions of eligibility**: To have been the subject of a prohibition measure that predominantly affects the pursuit of the activity, pursuant to Decree no. 2020-1310 of 29 October 2020 + + + If you have ceased your activity, the cessation must be after or equal to 30 October 2020. + + + Good to know: Delivery activities, order collection or takeaway sales are not taken into account to assess compliance with the prohibition condition. + description.fr: > + Les conditions d’éligibilité à la réduction au titre de la seconde période + d’état d’urgence sanitaire de l’automne 2020 s’évaluent mois par mois et + dépendent de votre secteur d’activité. + + + Vous devez également préciser le nombre de mois où vous remplissez les conditions d’éligibilité. + + + ### Secteur dit S1 + + Activité principale exercée relevant des secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel + + + Mois concerné | Conditions d'éligibilité + + --------------|-------------------------- + + Octobre 2020 | Activité exercée dans une zone d’application des mesures de couvre-feu Et avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Activité exercée dans une zone d’application des mesures de couvre-feu Et avoir subi une forte baisse du chiffre d’affaires mensuel(ca) + + Novembre 2020 à Mars 2021 | Avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Avoir subi une forte baisse du chiffre d’affaires mensuel(ca) + + + _(ca) Condition de baisse de chiffre d'affaire:_ + + + _Vous devez avoir subi une baisse d’au moins 50% du chiffre d’affaires mensuel par rapport au même mois de l’année précédente, ou si vous le souhaitez par rapport au chiffre d’affaires mensuel moyen de l’année 2019, ou, pour les entreprises créées en 2020, par rapport au montant mensuel moyen du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 31 août 2020._ + + + _Cette condition est également satisfaite lorsque la baisse de chiffre d’affaires mensuel par rapport à la même période de l’année précédente représente au moins 15% du chiffre d’affaires de l’année 2019, ou, pour les entreprises créées en 2019, par rapport au chiffre d’affaires de l’année 2019 ramené sur 12 mois._ + + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 17 octobre 2020. + + + Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction d’accueil du public. + + + ### Secteur dit S1 + + Activité principale exercée dépendant de celles du secteur S1 + + + Mois concerné | Conditions d'éligibilité + + --------------|-------------------------- + + Octobre 2020 | Avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Avoir subi une forte baisse du chiffre d’affaires mensuel(ca) + + + _(ca) Condition de baisse de chiffre d'affaire:_ + + + _Vous devez avoir subi une baisse d’au moins 50% du chiffre d’affaires mensuel par rapport au même mois de l’année précédente, ou si vous le souhaitez par rapport au chiffre d’affaires mensuel moyen de l’année 2019, ou, pour les entreprises créées en 2020, par rapport au montant mensuel moyen du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 31 août 2020._ + + + _Cette condition est également satisfaite lorsque la baisse de chiffre d’affaires mensuel par rapport à la même période de l’année précédente représente au moins 15% du chiffre d’affaires de l’année 2019, ou, pour les entreprises créées en 2019, par rapport au chiffre d’affaires de l’année 2019 ramené sur 12 mois._ + + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 17 octobre 2020. + + + Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction d’accueil du public. + + + ### Secteur dit S2 + + Activité principale exercée dans un secteur autre que S1 et S1 bis + + + - **Mois concerné** : novembre 2020, février 2021, mars 2021 + + - **Conditions d'éligibilité**: Avoir fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de l’activité, en application du décret n° 2020-1310 du 29 octobre 2020 + + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 30 octobre 2020. + + + Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction. + question.en: '[automatic] Are you eligible for the first wave of the fall 2020 + health crisis reduction?' + question.fr: + Êtes-vous éligibles au dispositif de réduction prévu au titre de la + première vague de la crise sanitaire de l'automne 2020 ? + titre.en: '[automatic] eligible for aid autumn 2020' + titre.fr: éligible aide automne 2020 +? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020 +: description.en: > + [automatic] Eligibility requirements for the reduction under the first + Spring 2020 State of Health Emergency period depend on your industry: + + + ### Sector S1 + + + Main activity in the tourism, hotel, restaurant, sports, culture, air transport and events sectors (see detailed list of activities in sector S1). + + + Your activity must have started before 1 July 2020. + + + If you have ceased your activity, the cessation must be after or on 15 March 2020. + + + Sector S1 bis + + + Main activity carried out depending on those of sector S1 (See detailed list of activities falling under sector S1 bis) and having suffered a sharp drop in turnover, namely : + + + - Either a drop in turnover of at least 80% during the period between 15 March and 15 May 2020 compared to the same period the previous year (case 1); + + or, in relation to the average monthly turnover of the year 2019 reduced over two months (case 2); + + or, for companies created after 15 March 2019 and before 10 March 2020, in relation to the average turnover over two months between the date of creation of the company and 15 March 2020 (case 2 bis). + + + - Or a drop in turnover during the period between 15 March and 15 May 2020 compared to the same period the previous year that represents at least 30% of the turnover for the year 2019 (case 3). + + or, for companies created between 1 and 14 March 2019, a drop in turnover between the date of creation of the company and 31 December 2019 over 12 months (case 3 bis). + + + Your activity must have started before 1 July 2020. + + If you have ceased your activity, the cessation must be after or equal to 15 March 2020. + + + Sector S2 + + + Main activity carried out in a sector other than S1 and S1 bis involving the reception of the public and interrupted in application of decree n° 2020-293 of 23 March 2020, excluding voluntary closures. + + + Your activity must have started before 1 June 2020. + + If you have ceased your activity, the cessation must be after or equal to 15 March 2020. + description.fr: > + Les conditions d’éligibilité à la réduction au titre de la première période + d’état d’urgence sanitaire du printemps 2020 dépendent de votre secteur + d’activité : + + + ### Secteur S1 + + + Activité principale exercée relevant des secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel (Voir liste détaillée des activités relevant du secteur S1). + + + Votre activité doit avoir débuté avant le 1er juillet 2020. + + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020. + + + ### Secteur S1 bis + + + Activité principale exercée dépendant de celles du secteur S1 (Voir liste détaillée des activités relevant du secteur S1 bis) et ayant subi une forte baisse du chiffre d’affaires à savoir : + + + - Soit une baisse de chiffre d’affaires d’au moins 80% durant la période comprise entre le 15 mars et le 15 mai 2020 par rapport à la même période l’année précédente (cas 1) ; + + ou, par rapport au chiffre d’affaires mensuel moyen de l’année 2019 ramené sur deux mois (cas 2) ; + + ou, pour les entreprises créées après le 15 mars 2019 et avant le 10 mars 2020, par rapport au montant moyen calculé sur deux mois du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 15 mars 2020 (cas 2 bis). + + + - Soit à une baisse de chiffre d’affaires durant la période comprise entre le 15 mars et le 15 mai 2020 par rapport à la même période l’année précédente qui représente au moins 30 % du chiffre d’affaires de l’année 2019 (cas 3). + + ou, pour les entreprises créées entre le 1er et le 14 mars 2019, une baisse du chiffre d’affaires réalisé entre la date de création de l’entreprise et le 31 décembre 2019 ramené sur 12 mois (cas 3 bis). + + + Votre activité doit avoir débuté avant le 1er juillet 2020. + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020. + + + ### Secteur S2 + + + Activité principale exercée dans un secteur autre que S1 et S1 bis impliquant l’accueil du public et interrompue en application du décret n° 2020-293 du 23 mars 2020, à l’exclusion des fermetures volontaires. + + + Votre activité doit avoir débuté avant le 1er juin 2020. + + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020. + question.en: + '[automatic] Are you eligible for the first wave of the Spring 2020 + health crisis reduction scheme?' + question.fr: + Êtes-vous éligibles au dispositif de réduction prévu au titre de la + première vague de la crise sanitaire du printemps 2020 ? + titre.en: '[automatic] eligible for aid spring 2020' + titre.fr: éligible aide printemps 2020 aide déclaration revenu indépendant 2020 . total charges sociales déductible: description.en: '[automatic] Amount to be reported in Item 252 of Form 2033-B-SD @@ -243,17 +643,6 @@ artiste-auteur . cotisations . assiette: catégories. titre.en: base titre.fr: assiette -artiste-auteur . cotisations . assiette 2019: - description.en: > - [automatic] We calculate the covid aid on the basis of a contribution base - 2019 - - equal to the 2020 plate. - description.fr: | - Nous calculons l'aide covid sur la base d'une assiette des cotisations 2019 - égale à l'assiette 2020. - titre.en: '[automatic] plate 2019' - titre.fr: assiette 2019 artiste-auteur . cotisations . assiette surcotisation: titre.en: over-contribution base titre.fr: assiette surcotisation @@ -317,39 +706,6 @@ artiste-auteur . revenus . traitements et salaires: résumé.fr: Le montant brut hors TVA de vos droits d'auteur (recettes précomptées) titre.en: Income in wages and salaries titre.fr: Revenu en traitements et salaires -artiste-auteur . réduction de cotisations covid 2020: - description.en: > - [automatic] In order to take into account the impact of the Covid-19 crisis - the government has - - set up a system for the payment of social security contributions of the - - artists-authors due by 2020 up to 2 000€. - - - This aid is calculated on the basis of the social security contribution base of - - 2019. - - - The support is automatic and you don't have to take any steps to - - to be carried out. You will benefit from this aid after the annual declaration of - - 2020 revenues, i.e. in the second quarter of 2021. - description.fr: | - Afin de tenir compte de l'impact de la crise du Covid-19 le gouvernement a - mis en place une prise en charge des cotisations sociales des - artistes-auteurs dues pour 2020 pouvant aller jusqu'à 2 000€. - - Cette aide est calculée à partir de l'assiette des cotisations sociales de - 2019. - - La prise en charge est automatique et vous n'avez pas de démarche a - effectuer. Vous bénéficierez de cette aide après la déclaration annuelle de - revenus 2020, soit au second trimestre 2021. - titre.en: '[automatic] covid 2020 contribution reduction' - titre.fr: réduction de cotisations covid 2020 chômage partiel: titre.en: '[automatic] short-time working' titre.fr: chômage partiel @@ -5692,18 +6048,13 @@ dirigeant . indépendant . contrats madelin . retraite . plafond: titre.fr: plafond dirigeant . indépendant . cotisations et contributions: description.en: > - [automatic] This is the total amount owed by the self-employed person in - respect of contributions and + [automatic] This is the total amount owed by the self-employed person for + compulsory contributions and - mandatory contributions. - - - This amount includes the "covid" contribution reduction in 2020. + contributions. description.fr: | C'est le montant total dû par l'indépendant au titre des cotisations et contributions obligatoires. - - Ce montant inclut la réduction de cotisation "covid" en 2020. note.en: | [automatic] Unlike contributions, contributions are not reintroduced for the calculation of the CSG/CRDS. They also do not benefit from the @@ -5755,30 +6106,6 @@ dirigeant . indépendant . cotisations et contributions . PCV: conventionnel. titre.en: '[automatic] Supplementary old-age benefits' titre.fr: Prestations complémentaires vieillesse -? dirigeant . indépendant . cotisations et contributions . aide indépendant covid 2020 -: description.en: | - [automatic] The amount of the reduction depends on your industry. - It is capped at the final social security contributions for 2020, - excluding CFP (contribution to vocational training) and CURPS - (contribution to regional unions of health professionals). - description.fr: | - Le montant de la réduction dépend du secteur d'activité dont vous relevez. - Il est plafonné aux montant des cotisations sociales définitives de 2020, - hors CFP (contribution à la formation professionnelle) et CURPS - (contribution aux unions régionales des professionnels de santé). - titre.en: '[automatic] independent aid covid 2020' - titre.fr: aide indépendant covid 2020 -dirigeant . indépendant . cotisations et contributions . aides covid 2020: - description.en: | - [automatic] The government and social security agencies have established - contribution reduction schemes for self-employed persons affected by the - Coronavirus crisis. - description.fr: | - Le gouvernement et les organismes de sécurité sociale ont mis en place des - dispositifs de réduction de cotisation pour les indépendants impactés par la - crise du Coronavirus. - titre.en: '[automatic] covid 2020 aid' - titre.fr: aides covid 2020 dirigeant . indépendant . cotisations et contributions . allocations familiales: titre.en: '[automatic] child benefit' titre.fr: allocations familiales @@ -7782,86 +8109,6 @@ situation personnelle . domiciliation fiscale à l'étranger: établissement . localisation . outre-mer . Guadeloupe Réunion Martinique: titre.en: '[automatic] Guadeloupe Reunion Martinique' titre.fr: Guadeloupe Réunion Martinique -établissement . secteur d'activité covid: - description.en: > - [automatic] Eligibility conditions for covid aid depend on the sector - - of the establishment's activity. - - - Hotels, restaurants, bars, etc. are in - - the so-called "S1" category and are entitled to aid without further conditions. - - - Sectors whose activity depends on those of "sector 1" may - - also benefit from the aid on condition that they have had a fall in turnover - - of significant business during lockdown. - - - Finally, the so-called "S2" sectors are those involving the reception of the public, and - - are eligible for aid on condition that they have been closed down - - administrative. - - - The terms and conditions are specified on the Urssaf website. - description.fr: | - Les conditions d'éligibilité aux aides "covid" dépendent du secteur - d'activité de l'établissement. - - Les hôtels, restaurants, bars, etc. sont dans - la catégorie dite "S1" et ont le droit aux aides sans autre conditions. - - Les secteurs dont l'activité dépendent de celles du "secteur 1" peuvent - aussi bénéficier des aides à condition d'avoir eu une baisse de chiffre - d'affaires significative pendant le confinement. - - Enfin les secteurs dits "S2" sont ceux impliquant l'accueil du public, et - sont éligibles aux aides à condition d'avoir subit une fermeture - administrative. - - Les modalités sont précisées sur le site de l'Urssaf. - question.en: > - [automatic] covid" reduction device: is your main activity in one of the - following sectors? - question.fr: > - Dispositif de réduction "covid" : votre activité principale relève-t'elle - d'un des secteurs suivants ? - titre.en: '[automatic] covid business line' - titre.fr: secteur d'activité covid -établissement . secteur d'activité covid . S1: - titre.en: '[automatic] Sector "1" - tourism, hotels and restaurants' - titre.fr: Secteur "1" - tourisme, hôtellerie, restauration -établissement . secteur d'activité covid . S1-bis: - titre.en: '[automatic] Sector "1a" - whose activity depends on that of sector 1' - titre.fr: Secteur "1 bis" - dont l'activité dépend de celle des secteurs 1 -établissement . secteur d'activité covid . S2: - titre.en: '[automatic] Sector "2" - activity involving the reception of the - public that has been interrupted' - titre.fr: Secteur "2" - activité impliquant l'accueil du public qui a été interrompue -établissement . secteur d'activité covid . activité interrompue: - question.en: | - [automatic] Was your business interrupted because of the Covid-19 outbreak? - question.fr: | - Votre activité a-t'elle été interrompue à cause de l’épidémie de Covid-19 ? - titre.en: '[automatic] interrupted activity' - titre.fr: activité interrompue -? établissement . secteur d'activité covid . baisse significative de chiffre d'affaires -: question.en: | - [automatic] Has your business suffered a drop in turnover of at least 80%? - between 15 March and 15 May 2020 compared to the previous year? - question.fr: | - Votre activité a-t-elle subit une baisse d'au moins 80% de chiffre d'affaire - entre le 15 mars et le 15 mai 2020 par rapport à l'année précédentes ? - titre.en: '[automatic] significant drop in turnover' - titre.fr: baisse significative de chiffre d'affaires -établissement . secteur d'activité covid . éligible aide: - titre.en: '[automatic] eligible aid' - titre.fr: éligible aide établissement . taux du versement transport: titre.en: Rate of transport tax titre.fr: taux du versement transport diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 9b02864fa..68262ac65 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1022,6 +1022,8 @@ pages: message fin: You can now simulate the exact cost of hiring by selecting an eligible grant. meta: + description: Find out about the main forms of aid for hiring and estimate their + amount by answering a few questions. title: Hiring incentives outro: <0>Learn more about incentives<1>As part of the "Plan Relance" plan, the government is putting in place a series of measures to encourage new @@ -1205,6 +1207,7 @@ pages: title: Income simulator for the self-employed is: meta: + description: Calculate your corporate tax title: Corporate Tax Simulator seo: <0>How is corporate tax calculated?<1>Corporate income tax applies to the profits made by corporations (SA, SAS, SASU, SARL, etc.) and on an diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index e6f6fd732..2c6f76024 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -803,17 +803,25 @@ export function getSimulatorsData({ icône: '🎁', tracking: 'aides_embauche', meta: { - title: 'Aides à l’embauche', - description: - 'Découvrez les principales aides à l’embauche et estimez leur montant en répondant à quelques questions.', + title: t( + 'pages.simulateurs.aides-embauche.meta.title', + 'Aides à l’embauche' + ), + description: t( + 'pages.simulateurs.aides-embauche.meta.description', + 'Découvrez les principales aides à l’embauche et estimez leur montant en répondant à quelques questions.' + ), color: '#11965f', }, path: sitePaths.simulateurs['aides-embauche'], iframe: 'aides-embauche', - shortName: 'Aides à l’embauche', + shortName: t( + 'pages.simulateurs.aides-embauche.meta.title', + 'Aides à l’embauche' + ), title: t( 'pages.simulateurs.aides-embauche.meta.title', - "Aides à l'embauche" + 'Aides à l’embauche' ), description: ( @@ -851,7 +859,7 @@ export function getSimulatorsData({ meta: { title: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'), description: t( - 'pages.simulateurs.pamc.meta.description', + 'pages.simulateurs.is.meta.description', 'Calculez votre impôt sur les sociétés' ), color: '#E71D66', diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index a54fa48fd..d01132f80 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,85 +1,89 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[50000,3177,11368,103,14648,35352]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[50000,3177,11368,103,0,14648,35352]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[15000,948,3170,103,4221,10779]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[15000,948,3170,103,0,4221,10779]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[5000,312,1293,103,1708,3292]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[5000,312,1293,103,0,1708,3292]"`; exports[`calculate aide-déclaration-indépendant: ACRE 4`] = ` -"[10000,630,564,103,1297,8703] +"[10000,630,564,103,0,1297,8703] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: ACRE 5`] = ` -"[10000,630,-1328,103,-595,10595] +"[10000,630,-1328,103,0,-595,10595] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; -exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[50000,3023,11408,103,14534,35466]"`; +exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[50000,3023,11408,103,0,14534,35466]"`; -exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[500,25,81,103,209,291]"`; +exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[500,25,81,103,0,209,291]"`; -exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[5000,312,1020,103,1435,3565]"`; +exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[5000,312,1020,103,0,1435,3565]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[50000,3175,17805,140,21120,28880]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[50000,3176,6562,119,4800,9857,40143]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[50000,3174,16591,140,19905,30095]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[5000,311,119,119,1173,549,4451]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[50000,3175,14660,140,17975,32025]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[50000,3175,17805,140,0,21120,28880]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[50000,3176,17809,119,21104,28896]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[50000,3174,16591,140,0,19905,30095]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[50000,3175,16189,140,19504,30496]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[50000,3175,14660,140,0,17975,32025]"`; -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[50000,3177,5651,103,8931,41069]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[50000,3176,17809,119,0,21104,28896]"`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[50000,3175,16189,140,0,19504,30496]"`; + +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[50000,3177,5651,103,0,8931,41069]"`; exports[`calculate aide-déclaration-indépendant: international 1`] = ` -"[50000,0,14609,103,14712,35288] +"[50000,0,14609,103,0,14712,35288] Notifications affichées : impôt . domiciliation étranger non implémentée" `; -exports[`calculate aide-déclaration-indépendant: international 2`] = `"[50000,1267,11875,103,13245,36755]"`; +exports[`calculate aide-déclaration-indépendant: international 2`] = `"[50000,1267,11875,103,0,13245,36755]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[50000,3176,11362,119,14657,35343]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[50000,3176,11362,119,0,14657,35343]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[5000,311,1292,119,1722,3278]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[5000,311,1292,119,0,1722,3278]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[50000,3177,11368,103,14648,35352]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[50000,3177,11368,103,0,14648,35352]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[5000,312,1293,103,1708,3292]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[5000,312,1293,103,0,1708,3292]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[50000,3177,11368,103,14648,35352] +"[50000,3177,11368,103,0,14648,35352] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[5000,312,1293,103,1708,3292]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[5000,312,1293,103,0,1708,3292]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` -"[50000,3177,9453,103,12733,37267] +"[50000,3177,9453,103,0,12733,37267] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = `"[500,25,1041,103,1169,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = `"[500,25,1041,103,0,1169,0]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = `"[1000,57,1041,103,1201,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = `"[1000,57,1041,103,0,1201,0]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1500,89,1059,103,1251,249]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1500,89,1059,103,0,1251,249]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[2000,121,1090,103,1314,686]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[2000,121,1090,103,0,1314,686]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[5000,312,1293,103,1708,3292]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[5000,312,1293,103,0,1708,3292]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[10000,630,2104,103,2837,7163]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[10000,630,2104,103,0,2837,7163]"`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` -"[100000,6361,20929,103,27393,72607] +"[100000,6361,20929,103,0,27393,72607] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` -"[1000000,63664,106448,103,170215,829785] +"[1000000,63664,106448,103,0,170215,829785] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; diff --git a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml index 7196c3220..ad4cddcf4 100644 --- a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml +++ b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml @@ -81,3 +81,17 @@ international: - dirigeant . indépendant . revenus étrangers: oui dirigeant . indépendant . revenus étrangers . montant: 30000€/an dirigeant . rémunération totale: 50000 €/an + +aide covid 2020: + - dirigeant . rémunération totale: 50000 €/an + aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" + aide déclaration revenu indépendant 2020 . réduction covid: oui + aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'" + aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui + aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020: oui + aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles: 4 + - dirigeant . rémunération totale: 5000 €/an + aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" + aide déclaration revenu indépendant 2020 . réduction covid: oui + aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'" + aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui From 10f33e955a31c58ac598bd61e65e8387d6ade156 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 30 Mar 2021 11:37:14 +0200 Subject: [PATCH 010/319] Retours Acoss --- modele-social/règles/dirigeant.yaml | 18 ++-- .../déclaration-revenu-indépendant.yaml | 34 +++++-- .../AideDéclarationIndépendant/index.tsx | 90 ++++++++++--------- 3 files changed, 83 insertions(+), 59 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index f63dc02ca..ee352f933 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -1087,15 +1087,15 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette Seule la partie imposable des IJSS est retranchée de l'assiette de la CSG, puisque la partie non imposable a déjà été retranchée du revenu net fiscal fourni - formule: - valeur: - somme: - - revenu professionnel - - cotisations - abattement: - somme: - - revenus étrangers . montant - - dirigeant . indépendant . IJSS . imposable + plancher: 0€/an + valeur: + somme: + - revenu professionnel + - cotisations + abattement: + somme: + - revenus étrangers . montant + - dirigeant . indépendant . IJSS . imposable dirigeant . indépendant . cotisations et contributions . formation professionnelle: produit: diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 3f594df30..420bcb256 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -20,6 +20,12 @@ aide déclaration revenu indépendant 2020 . nature de l'activité: Vérifier la nature de son activité: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/verifier-nature-son-activite Comment déterminer la nature de l'activité d'une entreprise ?: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32887 +aide déclaration revenu indépendant 2020 . date de création: + remplace: entreprise . date de création + question: Quelle est votre date de début d'activité ? + type: date + + aide déclaration revenu indépendant 2020 . ACRE: remplace: entreprise . ACRE description: >- @@ -213,23 +219,24 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi # apparaît que les métiers concernés (médecins, avocats...) sont incompatibles # avec les secteurs d'activités concernés par l'aide (hôtels, restaurants...) description: | - Les conditions d'éligibilité aux aides "covid" dépendent du secteur - d'activité de l'établissement. + Les conditions d’éligibilité aux aides « Covid » dépendent du secteur d’activité + dont relève l’activité principale. Les hôtels, restaurants, bars, etc. sont dans - la catégorie dite "S1" et ont le droit aux aides sans autre conditions. + la catégorie dite "S1" et ont le droit aux aides sans autres conditions. Les secteurs dont l'activité dépendent de celles du "secteur 1" peuvent aussi bénéficier des aides à condition d'avoir eu une baisse de chiffre d'affaires significative pendant le confinement. Enfin les secteurs dits "S2" sont ceux impliquant l'accueil du public, et - sont éligibles aux aides à condition d'avoir subit une fermeture + sont éligibles aux aides à condition d'avoir subi une fermeture administrative. Les modalités sont précisées sur le site de l'Urssaf. références: - Sécu-indépendant: https://www.secu-independants.fr/cpsti/actualites/actualites-nationales/covid-dispositifs-de-reduction-des-cotisations/ + Liste détaillée des secteurs (pdf): https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/liste-secteurs-pour-infographie.pdf + Présentation du dispositif: https://www.urssaf.fr/portail/home/actualites/toute-lactualite-independant/dispositifs-de-reduction-des-cot.html formule: une possibilité: choix obligatoire: oui @@ -240,13 +247,21 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi par défaut: non aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1: - titre: Secteur "1" - tourisme, hôtellerie, restauration + titre: Secteur dit S1 + description: | + Secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel. + aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis: - titre: Secteur "1 bis" - dont l'activité dépend de celle des secteurs 1 + titre: Secteur dit S1 bis + description: | + Secteurs dont l’activité dépend de celle des secteurs 1 et qui ont subi une très forte baisse de leur chiffre d’affaires. aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2: - titre: Secteur "2" - activité impliquant l'accueil du public qui a été interrompue + titre: Secteur 2 + description: + Autres secteurs d’activité qui ont fait l’objet d’une interdiction affectant de manière prépondérante la poursuite de leur activité. + aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: applicable si: secteur d'activité @@ -363,6 +378,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois description: | * Pour octobre 2020, vous activité devait également être située dans une zone d’application des mesures de couvre-feu unité: mois éligibles + plafond: 6 mois éligibles aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2: applicable si: @@ -372,3 +388,5 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois question: | Précisez le nombre de mois (novembre 2020 et/ou février 2021 et/ou mars 2021) durant lesquels vous avez fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de votre activité unité: mois éligibles + plafond: 6 mois éligibles + diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 7f936918f..e709ca22b 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -9,7 +9,6 @@ import Animate from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' import { EngineContext, useEngine } from 'Components/utils/EngineContext' import { ScrollToTop } from 'Components/utils/Scroll' -import useDisplayOnIntersecting from 'Components/utils/useDisplayOnIntersecting' import { useNextQuestions } from 'Components/utils/useNextQuestion' import useSimulationConfig from 'Components/utils/useSimulationConfig' import { DottedName } from 'modele-social' @@ -34,10 +33,6 @@ export default function AideDéclarationIndépendant() { (state: RootState) => state.inFranceApp.existingCompany ) - const [resultsRef, resultsInViewPort] = useDisplayOnIntersecting({ - threshold: 0.5, - unobserve: false, - }) const setCurrentIncome = useCallback( (currentIncome) => { dispatch( @@ -135,53 +130,64 @@ export default function AideDéclarationIndépendant() { )}
- + + + + Cette aide à la déclaration concerne uniquement les + entreprises déjà en activité en 2020 + + + {/* PLNR */} + + + +

+ Situation personnelle +

+ + + + +

+ Exonérations +

+ + + + + + +

+ International +

+ +
- - - -

- Situation personnelle -

- - - - -

- Exonérations -

- - - - - - -

- International -

- - -
+ -
+ )} @@ -386,7 +392,7 @@ function SimpleField({ dottedName, question, summary }: SimpleFieldProps) { `} >

- {question ?? rule.rawNode.question} + {question ?? rule.rawNode.question} 

{summary ?? rule.rawNode.résumé}

From d0e18e70b63f91a0e663ddd2cacf1d0d44a0329a Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 30 Mar 2021 12:05:29 +0200 Subject: [PATCH 011/319] =?UTF-8?q?Correction=20aide=20d=C3=A9claration=20?= =?UTF-8?q?et=20suppression=20des=20suggestions=20de=20date?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../règles/déclaration-revenu-indépendant.yaml | 13 +++---------- modele-social/règles/entreprise-établissement.yaml | 5 +---- .../source/components/conversation/DateInput.tsx | 3 ++- .../Gérer/AideDéclarationIndépendant/index.tsx | 14 ++++++++------ 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 420bcb256..5ce7fcdc5 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -20,10 +20,6 @@ aide déclaration revenu indépendant 2020 . nature de l'activité: Vérifier la nature de son activité: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/verifier-nature-son-activite Comment déterminer la nature de l'activité d'une entreprise ?: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32887 -aide déclaration revenu indépendant 2020 . date de création: - remplace: entreprise . date de création - question: Quelle est votre date de début d'activité ? - type: date aide déclaration revenu indépendant 2020 . ACRE: @@ -141,12 +137,9 @@ aide déclaration revenu indépendant 2020 . cotisations sociales déductible: Montant à reporter dans la case XI de votre déclaration sociale et rubrique 326 du formulaire 2033-D-SD (pour le réel simplifié) ou rubrique A5 du formulaire 2053-SD (pour le réel normal) de votre déclaration fiscale. - formule: - somme: - - dirigeant . indépendant . cotisations et contributions . cotisations - - dirigeant . indépendant . conjoint collaborateur . cotisations - - (- dirigeant . indépendant . cotisations et contributions . exonérations) - - (- réduction covid . montant) + + valeur: dirigeant . indépendant . cotisations et contributions . cotisations + abattement: réduction covid . montant aide déclaration revenu indépendant 2020 . CFP: résumé: contribution à la formation professionnelle [D] formule: dirigeant . indépendant . cotisations et contributions . formation professionnelle diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 6ed480e75..2bfe78400 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -15,10 +15,7 @@ entreprise . date de création: Si vous n'avez pas le jour exact, le mois suffit en général pour une bonne approximation. - suggestions: - Début 2021: 01/01/2021 - Début 2020: 01/01/2020 - Fin 2017: 31/12/2017 + type: date entreprise . date de création . contrôle date future: diff --git a/mon-entreprise/source/components/conversation/DateInput.tsx b/mon-entreprise/source/components/conversation/DateInput.tsx index 99ad934dd..a0edd775b 100644 --- a/mon-entreprise/source/components/conversation/DateInput.tsx +++ b/mon-entreprise/source/components/conversation/DateInput.tsx @@ -6,6 +6,7 @@ import InputSuggestions from './InputSuggestions' export default function DateInput({ suggestions, onChange, + missing, id, onSubmit, required, @@ -52,7 +53,7 @@ export default function DateInput({ className="ui__ input" id={id} type="date" - value={dateValue} + value={missing ? undefined : dateValue} required={required} onChange={handleDateChange} /> diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index e709ca22b..66448eebe 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -13,7 +13,7 @@ import { useNextQuestions } from 'Components/utils/useNextQuestion' import useSimulationConfig from 'Components/utils/useSimulationConfig' import { DottedName } from 'modele-social' import { RuleNode } from 'publicodes' -import { Fragment, useCallback, useContext } from 'react' +import { useCallback, useContext } from 'react' import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -130,8 +130,8 @@ export default function AideDéclarationIndépendant() { )} - - + + + + + - {/* PLNR */} @@ -423,7 +425,7 @@ function Results() { <> {rules.map((r) => ( - +

{r.title} {r.rawNode.résumé}

@@ -440,7 +442,7 @@ function Results() { />

-
+
))} From c92c37313f3cad3451b0d2dc9be193ead99c5a2d Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 30 Mar 2021 12:10:13 +0200 Subject: [PATCH 012/319] Corrige les tests --- .../déclaration-revenu-indépendant.yaml | 8 +- .../règles/entreprise-établissement.yaml | 4 +- mon-entreprise/source/locales/rules-en.yaml | 65 +- .../AideDéclarationIndépendant/index.tsx | 92 +-- .../__snapshots__/simulations.jest.js.snap | 591 ++++++++++++++---- 5 files changed, 553 insertions(+), 207 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 5ce7fcdc5..16192d258 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -139,7 +139,7 @@ aide déclaration revenu indépendant 2020 . cotisations sociales déductible: formulaire 2053-SD (pour le réel normal) de votre déclaration fiscale. valeur: dirigeant . indépendant . cotisations et contributions . cotisations - abattement: réduction covid . montant + aide déclaration revenu indépendant 2020 . CFP: résumé: contribution à la formation professionnelle [D] formule: dirigeant . indépendant . cotisations et contributions . formation professionnelle @@ -166,6 +166,12 @@ aide déclaration revenu indépendant 2020 . assiette sociale: aide déclaration revenu indépendant 2020 . réduction covid: titre: Réduction de cotisation Covid + remplace: + règle: dirigeant . indépendant . cotisations et contributions . cotisations + par: + valeur: dirigeant . indépendant . cotisations et contributions . cotisations + abattement: montant + sauf dans: réduction covid . montant description: | Dans le cadre de la crise sanitaire, le Gouvernement a mis en œuvre plusieurs mesures exceptionnelles concernant les cotisations et contributions sociales des travailleurs indépendants affectés par la crise du coronavirus avec : diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 2bfe78400..6ddc71db5 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -5,7 +5,7 @@ entreprise: entreprise . date de création: question: Quelle est votre date de début d'activité ? - par défaut: 01/01/2017 + par défaut: 01/01/2021 description: | La date de début d'activité (ou date de création) est fixée lors de la déclaration de votre entreprise. @@ -21,7 +21,7 @@ entreprise . date de création: entreprise . date de création . contrôle date future: type: notification sévérité: avertissement - formule: date de création > 01/2021 + formule: date de création > 01/2025 description: Nous ne pouvons voir aussi loin dans le futur entreprise . date de création . contrôle date passée: diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index d5edfe2fb..7a5607c41 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -266,10 +266,10 @@ aide déclaration revenu indépendant 2020 . réduction covid . montant: titre.fr: S2 aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: description.en: > - [automatic] The conditions of eligibility for "covid" aid depend on the - sector of activity + [automatic] The conditions of eligibility for "Covid" aid depend on the + sector of activity - of activity of the establishment. + of which the main activity is part. Hotels, restaurants, bars, etc. are in the so-called @@ -284,7 +284,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi during the period of confinement. - Finally, the sectors known as "S2" are those involving the reception of the public, and + Lastly, the "S2" sectors are those involving the reception of the public, and are eligible for aid provided that they have undergone an administrative @@ -292,21 +292,32 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi The procedures are specified on the Urssaf website. - description.fr: | - Les conditions d'éligibilité aux aides "covid" dépendent du secteur - d'activité de l'établissement. + description.fr: > + Les conditions d’éligibilité aux aides « Covid » dépendent du secteur + d’activité + + dont relève l’activité principale. + Les hôtels, restaurants, bars, etc. sont dans - la catégorie dite "S1" et ont le droit aux aides sans autre conditions. + + la catégorie dite "S1" et ont le droit aux aides sans autres conditions. + Les secteurs dont l'activité dépendent de celles du "secteur 1" peuvent + aussi bénéficier des aides à condition d'avoir eu une baisse de chiffre + d'affaires significative pendant le confinement. + Enfin les secteurs dits "S2" sont ceux impliquant l'accueil du public, et - sont éligibles aux aides à condition d'avoir subit une fermeture + + sont éligibles aux aides à condition d'avoir subi une fermeture + administrative. + Les modalités sont précisées sur le site de l'Urssaf. question.en: | [automatic] In which sector is your main activity? @@ -315,15 +326,31 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi titre.en: '[automatic] line of business' titre.fr: secteur d'activité ? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1 -: titre.en: '[automatic] Sector "1" - tourism, hotels, restaurants' - titre.fr: Secteur "1" - tourisme, hôtellerie, restauration +: description.en: > + [automatic] Sectors of tourism, hotels, restaurants, sports, culture, air + transport and events. + description.fr: > + Secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la + culture, du transport aérien et de l’événementiel. + titre.en: '[automatic] Sector S1' + titre.fr: Secteur dit S1 ? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis -: titre.en: '[automatic] Sector "1a" - whose activity depends on that of sectors 1' - titre.fr: Secteur "1 bis" - dont l'activité dépend de celle des secteurs 1 +: description.en: > + [automatic] Sectors whose activity depends on that of sector 1 and which + have suffered a very sharp decline in turnover. + description.fr: > + Secteurs dont l’activité dépend de celle des secteurs 1 et qui ont subi une + très forte baisse de leur chiffre d’affaires. + titre.en: '[automatic] Sector known as S1 bis' + titre.fr: Secteur dit S1 bis ? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2 -: titre.en: '[automatic] Sector "2" - activity involving the reception of the - public which has been interrupted' - titre.fr: Secteur "2" - activité impliquant l'accueil du public qui a été interrompue +: description.en: '[automatic] Other sectors of activity which have been banned + from carrying on their business in a preponderant manner.' + description.fr: Autres secteurs d’activité qui ont fait l’objet d’une + interdiction affectant de manière prépondérante la poursuite de leur + activité. + titre.en: '[automatic] Sector 2' + titre.fr: Secteur 2 ? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020 : description.en: > [automatic] Eligibility for the reduction under the second fall 2020 health @@ -6981,12 +7008,6 @@ entreprise . date de création: approximation. question.en: '[automatic] What is your start date?' question.fr: Quelle est votre date de début d'activité ? - suggestions.Début 2020.en: '[automatic] Early 2020' - suggestions.Début 2020.fr: Début 2020 - suggestions.Début 2021.en: '[automatic] Early 2021' - suggestions.Début 2021.fr: Début 2021 - suggestions.Fin 2017.en: '[automatic] End 2017' - suggestions.Fin 2017.fr: Fin 2017 titre.en: Creation date titre.fr: date de création entreprise . date de création . contrôle date future: diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 66448eebe..020779c38 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -33,6 +33,8 @@ export default function AideDéclarationIndépendant() { (state: RootState) => state.inFranceApp.existingCompany ) + const situation = useSelector(situationSelector) + const setCurrentIncome = useCallback( (currentIncome) => { dispatch( @@ -131,58 +133,60 @@ export default function AideDéclarationIndépendant() { - - - Cette aide à la déclaration concerne uniquement les - entreprises déjà en activité en 2020 - - + {situation['entreprise . date de création'] && ( + + + Cette aide à la déclaration concerne uniquement les + entreprises déjà en activité en 2020 + + + )} - - {/* PLNR */} - - - - + {/* PLNR */} + + + + - + -

- Situation personnelle -

- - - +

+ Situation personnelle +

+ + + -

- Exonérations -

- - - +

+ Exonérations +

+ + + - + -

- International -

- - +

+ International +

+ + +
diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index d01132f80..bf4b84ee3 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,90 +1,168 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[50000,3177,11368,103,0,14648,35352]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 1`] = ` +"[50000,3177,11368,103,0,14648,35352] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[15000,948,3170,103,0,4221,10779]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 2`] = ` +"[15000,948,3170,103,0,4221,10779] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[5000,312,1293,103,0,1708,3292]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 3`] = ` +"[5000,312,1293,103,0,1708,3292] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate aide-déclaration-indépendant: ACRE 4`] = ` -"[10000,630,564,103,0,1297,8703] +"[10000,630,1432,103,0,2165,7835] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: ACRE 5`] = ` -"[10000,630,-1328,103,0,-595,10595] +"[10000,630,606,103,0,1339,8661] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; -exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[50000,3023,11408,103,0,14534,35466]"`; +exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = ` +"[50000,3023,11408,103,0,14534,35466] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[500,25,81,103,0,209,291]"`; +exports[`calculate aide-déclaration-indépendant: RSA 1`] = ` +"[500,25,81,103,0,209,291] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[5000,312,1020,103,0,1435,3565]"`; +exports[`calculate aide-déclaration-indépendant: RSA 2`] = ` +"[5000,312,1020,103,0,1435,3565] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[50000,3176,6562,119,4800,9857,40143]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = ` +"[50000,3176,7849,119,4800,11144,38856] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[5000,311,119,119,1173,549,4451]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = ` +"[5000,311,0,119,2400,430,4570] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[50000,3175,17805,140,0,21120,28880]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = ` +"[50000,3175,14093,140,0,17408,32592] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[50000,3174,16591,140,0,19905,30095]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = ` +"[50000,3174,13576,140,0,16890,33110] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[50000,3175,14660,140,0,17975,32025]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = ` +"[50000,3175,11461,140,0,14776,35224] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[50000,3176,17809,119,0,21104,28896]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = ` +"[50000,3176,14097,119,0,17392,32608] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[50000,3175,16189,140,0,19504,30496]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = ` +"[50000,3175,11461,140,0,14776,35224] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[50000,3177,5651,103,0,8931,41069]"`; +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = ` +"[50000,3177,5651,103,0,8931,41069] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate aide-déclaration-indépendant: international 1`] = ` "[50000,0,14609,103,0,14712,35288] -Notifications affichées : impôt . domiciliation étranger non implémentée" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, impôt . domiciliation étranger non implémentée" `; -exports[`calculate aide-déclaration-indépendant: international 2`] = `"[50000,1267,11875,103,0,13245,36755]"`; +exports[`calculate aide-déclaration-indépendant: international 2`] = ` +"[50000,1267,11875,103,0,13245,36755] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[50000,3176,11362,119,0,14657,35343]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = ` +"[50000,3176,11362,119,0,14657,35343] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[5000,311,1292,119,0,1722,3278]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = ` +"[5000,311,1292,119,0,1722,3278] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[50000,3177,11368,103,0,14648,35352]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = ` +"[50000,3177,11368,103,0,14648,35352] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[5000,312,1293,103,0,1708,3292]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = ` +"[5000,312,1293,103,0,1708,3292] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` "[50000,3177,11368,103,0,14648,35352] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[5000,312,1293,103,0,1708,3292]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = ` +"[5000,312,1293,103,0,1708,3292] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` "[50000,3177,9453,103,0,12733,37267] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = `"[500,25,1041,103,0,1169,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` +"[500,25,1041,103,0,1169,0] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = `"[1000,57,1041,103,0,1201,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` +"[1000,57,1041,103,0,1201,0] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1500,89,1059,103,0,1251,249]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = ` +"[1500,89,1059,103,0,1251,249] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[2000,121,1090,103,0,1314,686]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = ` +"[2000,121,1090,103,0,1314,686] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[5000,312,1293,103,0,1708,3292]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = ` +"[5000,312,1293,103,0,1708,3292] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[10000,630,2104,103,0,2837,7163]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = ` +"[10000,630,2104,103,0,2837,7163] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` "[100000,6361,20929,103,0,27393,72607] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` "[1000000,63664,106448,103,0,170215,829785] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-artiste-auteur: bnc 1`] = `"[1230]"`; @@ -125,9 +203,15 @@ exports[`calculate simulations-auto-entrepreneur: activité mixte 2`] = `"[20000 exports[`calculate simulations-auto-entrepreneur: activité mixte 3`] = `"[20000,297,16438,0,16438]"`; -exports[`calculate simulations-auto-entrepreneur: aides 1`] = `"[5742,62,5000,0,5000]"`; +exports[`calculate simulations-auto-entrepreneur: aides 1`] = ` +"[5348,29,5000,0,5000] +Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" +`; -exports[`calculate simulations-auto-entrepreneur: aides 2`] = `"[57415,618,50000,0,50000]"`; +exports[`calculate simulations-auto-entrepreneur: aides 2`] = ` +"[53484,290,50000,0,50000] +Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" +`; exports[`calculate simulations-auto-entrepreneur: impôt sur le revenu 1`] = `"[32092,591,25000,0,25000]"`; @@ -180,114 +264,219 @@ exports[`calculate simulations-impot-société: prorata temporis 2`] = `"[277936 exports[`calculate simulations-impot-société: prorata temporis 3`] = `"[272981,0]"`; -exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`; +exports[`calculate simulations-indépendant: acre 1`] = ` +"[73023,23023,50000,51980,8213,41787,0,73023] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: activité 1`] = `"[26955,6955,20000,20729,601,19399,0,26955]"`; +exports[`calculate simulations-indépendant: activité 1`] = ` +"[23690,3690,20000,20640,599,19401,0,23690] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,603,19397,0,29100]"`; +exports[`calculate simulations-indépendant: activité 2`] = ` +"[23706,3706,20000,20640,599,19401,0,23706] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1368,1268,100,134,0,100,0,1368]"`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = ` +"[220,120,100,103,0,100,0,220] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[244,144,100,104,0,100,0,244]"`; +exports[`calculate simulations-indépendant: cotisations minimales 2`] = ` +"[220,120,100,103,0,100,0,220] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = ` +"[23690,3690,20000,20640,599,19401,0,23690] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = ` +"[73023,23023,50000,51980,8213,41787,0,73023] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = ` +"[23690,3690,20000,20640,2064,17936,0,23690] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1366,634,686,0,634,0,2000]"`; +exports[`calculate simulations-indépendant: inversions 1`] = ` +"[2000,392,1608,1660,0,1608,0,2000] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33998,35353,3500,30498,0,50000]"`; +exports[`calculate simulations-indépendant: inversions 2`] = ` +"[50000,13698,36302,37657,4481,31821,0,50000] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: inversions 3`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`; +exports[`calculate simulations-indépendant: inversions 3`] = ` +"[11896,1896,10000,10320,0,10000,0,11896] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: inversions 4`] = `"[68273,21573,46700,48551,6700,40000,0,68273]"`; +exports[`calculate simulations-indépendant: inversions 4`] = ` +"[68273,21573,46700,48551,6700,40000,0,68273] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: inversions 5`] = `"[14460,4460,10000,10390,0,10000,1000,15460]"`; +exports[`calculate simulations-indépendant: inversions 5`] = ` +"[11896,1896,10000,10320,0,10000,1000,12896] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5870,13130,13643,0,13130,1000,20000]"`; +exports[`calculate simulations-indépendant: inversions 6`] = ` +"[19000,2977,16023,16536,0,16023,1000,20000] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[17999,5557,12442,12928,0,12442,2000,20000]"`; +exports[`calculate simulations-indépendant: inversions 7`] = ` +"[17999,2824,15175,15661,0,15175,2000,20000] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1841,1341,500,547,0,500,0,1841]"`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = ` +"[693,193,500,516,0,500,0,693] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2431,1431,1000,1063,0,1000,0,2431]"`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = ` +"[1282,282,1000,1032,0,1000,0,1282] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3025,1525,1500,1579,0,1500,0,3025]"`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = ` +"[1872,372,1500,1548,0,1500,0,1872] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3618,1618,2000,2095,0,2000,0,3618]"`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = ` +"[2461,461,2000,2064,0,2000,0,2461] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7302,2302,5000,5195,0,5000,0,7302]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = ` +"[5999,999,5000,5160,0,5000,0,5999] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = ` +"[11896,1896,10000,10320,0,10000,0,11896] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` "[139593,39593,100000,103788,24909,75091,0,139593] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` "[1239954,239954,1000000,1033666,444476,555524,0,1239954] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[2873,0,2373,500,0,500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 1`] = ` +"[2255,0,1755,500,0,500] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3433,0,2433,1000,0,1000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 2`] = ` +"[2805,0,1805,1000,0,1000] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[3994,0,2494,1500,0,1500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 3`] = ` +"[3355,0,1855,1500,0,1500] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4554,0,2554,2000,0,2000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 4`] = ` +"[3905,0,1905,2000,0,2000] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[7987,0,2987,5000,0,5000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 5`] = ` +"[7205,0,2205,5000,0,5000] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14244,0,4244,10000,0,10000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 6`] = ` +"[12704,0,2704,10000,0,10000] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate simulations-professions-libérales: CIPAV 7`] = ` "[146241,0,46241,100000,24952,75048] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-professions-libérales: CIPAV 8`] = ` "[1238004,0,238004,1000000,444454,555546] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: auxiliaire médical 1`] = `"[30000,0,7751,22249,945,21304]"`; +exports[`calculate simulations-professions-libérales: auxiliaire médical 1`] = ` +"[30000,0,4731,25269,1382,23887] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = `"[30000,0,8077,21923,932,20991]"`; +exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = ` +"[30000,0,4724,25276,1383,23893] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: auxiliaire médical 3`] = `"[300000,0,61784,238216,81297,156919]"`; +exports[`calculate simulations-professions-libérales: auxiliaire médical 3`] = ` +"[300000,0,61611,238389,81356,157033] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate simulations-professions-libérales: avocat 1`] = ` -"[50000,0,11821,38179,4705,33474] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[50000,0,10570,39430,4853,34577] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-professions-libérales: avocat 2`] = ` -"[50000,0,11821,38179,4705,33474] +"[50000,0,11311,38689,4765,33924] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,0,14951]"`; +exports[`calculate simulations-professions-libérales: expert-comptable 1`] = ` +"[20000,0,0,0,0,0] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate simulations-professions-libérales: expert-comptable 2`] = ` -"[50000,0,14877,35123,3611,31512] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[50000,0,13275,36725,4532,32193] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: médecin 1`] = `"[50000,0,14293,35707,3669,32038]"`; +exports[`calculate simulations-professions-libérales: médecin 1`] = ` +"[50000,0,10691,39307,4839,34468] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: médecin 2`] = `"[50000,0,20283,29717,2330,27387]"`; +exports[`calculate simulations-professions-libérales: médecin 2`] = ` +"[50000,0,15045,34955,3595,31360] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: médecin 3`] = `"[300000,0,86546,213454,73125,140329]"`; +exports[`calculate simulations-professions-libérales: médecin 3`] = ` +"[300000,0,73630,226370,77389,148981] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,106265,293737,115744,177993]"`; +exports[`calculate simulations-professions-libérales: médecin 4`] = ` +"[400000,0,93706,306295,120519,185776] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate simulations-professions-libérales: médecin 5`] = ` -"[120000,0,34704,85296,17710,67586] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[120000,0,26977,93023,23107,69916] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-professions-libérales: médecin 6`] = ` @@ -295,31 +484,34 @@ exports[`calculate simulations-professions-libérales: médecin 6`] = ` Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; -exports[`calculate simulations-professions-libérales: sage-femme 1`] = `"[50000,0,12384,37617,4638,32979]"`; +exports[`calculate simulations-professions-libérales: sage-femme 1`] = ` +"[50000,0,11849,38150,4701,33449] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate simulations-professions-libérales: sage-femme 2`] = ` -"[20000,0,5148,14852,0,14852] -Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" +"[20000,0,3604,16396,0,16396] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; exports[`calculate simulations-professions-libérales: sage-femme 3`] = ` -"[4000,0,1271,2729,0,2729] -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" +"[4000,0,981,3018,0,3018] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; exports[`calculate simulations-professions-libérales: sage-femme 4`] = ` -"[20000,0,5148,14852,0,14852] -Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" +"[20000,0,3604,16396,0,16396] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; exports[`calculate simulations-professions-libérales: sage-femme 5`] = ` -"[20000,0,5224,14775,0,14775] -Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" +"[20000,0,3604,16396,0,16396] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; exports[`calculate simulations-professions-libérales: sage-femme 6`] = ` -"[20000,0,5301,14698,0,14698] -Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" +"[20000,0,3604,16396,0,16396] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): ACRE 1`] = ` @@ -337,52 +529,109 @@ exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): AC Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" `; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 1`] = `"[1391,0,0,16041,4,29]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 1`] = ` +"[1893,0,0,21731,4,40] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 2`] = `"[1391,0,0,16041,4,29]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 2`] = ` +"[1893,0,0,21731,4,40] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 3`] = `"[1391,0,0,16041,4,29]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 3`] = ` +"[1893,0,0,21731,4,40] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 4`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 4`] = ` +"[1249,0,0,14429,4,26] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 5`] = ` "[14490,0,0,150669,4,46] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = ` +"[1249,0,0,14429,4,26] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,0,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = ` +"[1249,0,0,0,0,0] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,0,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = ` +"[1249,0,0,0,0,0] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = ` +"[1249,0,0,14429,4,26] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 4`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 4`] = ` +"[1249,0,0,14429,4,26] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 5`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 5`] = ` +"[1249,0,0,14429,4,26] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 1`] = `"[442,0,0,5261,4,10]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 1`] = ` +"[606,0,0,7127,4,13] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 2`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 2`] = ` +"[1249,0,0,14429,4,26] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = `"[-30,0,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = ` +"[-30,0,0,0,0,0] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 2`] = `"[14,0,0,136,0,1]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 2`] = ` +"[27,0,0,184,0,1] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 3`] = `"[62,0,0,314,0,2]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 3`] = ` +"[91,0,0,1285,1,2] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 4`] = `"[204,0,0,2566,2,5]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 4`] = ` +"[284,0,0,3476,3,6] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 5`] = `"[442,0,0,5261,4,10]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 5`] = ` +"[606,0,0,7127,4,13] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 6`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 6`] = ` +"[1249,0,0,14429,4,26] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 7`] = `"[2341,0,0,26822,4,46]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 7`] = ` +"[2512,0,0,28761,4,46] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 8`] = ` "[4758,0,0,51817,4,46] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 1`] = ` @@ -463,55 +712,109 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,19388,0,16984,4,33]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = ` +"[0,24772,0,20779,4,40] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,18995,0,17577,4,34]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = ` +"[0,24589,0,21520,4,42] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,20297,0,15600,4,30]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = ` +"[0,25198,0,19054,4,37] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13656,0,10367,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = ` +"[0,16795,0,12577,4,24] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` "[0,225725,0,57933,4,56] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = ` -"[0,13624,0,10417,4,21] -Notifications affichées : dirigeant . indépendant . contrats madelin . contrôle montant charges" +"[0,16779,0,12640,4,25] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . contrats madelin . contrôle montant charges" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,14555,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = ` +"[0,16871,0,12270,4,24] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = ` +"[0,16633,0,0,0,0] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13804,0,10108,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = ` +"[0,16857,0,12260,4,24] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13814,0,10116,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = ` +"[0,16871,0,12270,4,24] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13814,0,10116,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = ` +"[0,16871,0,12270,4,24] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6894,0,5046,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = ` +"[0,8392,0,6102,4,21] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13814,0,10116,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = ` +"[0,16871,0,12270,4,24] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = `"[0,-1044,0,0,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` +"[0,-3,0,0,3,21] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = `"[0,-225,0,0,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` +"[0,761,0,553,3,21] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,634,0,483,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = ` +"[0,1608,0,1169,3,21] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3160,0,2322,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = ` +"[0,4152,0,3020,3,21] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6894,0,5046,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = ` +"[0,8392,0,6102,4,21] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13814,0,10116,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = ` +"[0,16871,0,12270,4,24] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33998,0,24913,4,48]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = ` +"[0,36302,0,26536,4,52] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 8`] = ` "[0,69896,0,36428,4,56] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-salarié: CCN HCR 1`] = ` @@ -561,7 +864,10 @@ exports[`calculate simulations-salarié: JEI 2`] = ` Notifications affichées : contrat salarié . rémunération . contrôle salaire élevé" `; -exports[`calculate simulations-salarié: JEI 3`] = `"[4518,0,4000,3141,2745]"`; +exports[`calculate simulations-salarié: JEI 3`] = ` +"[4518,0,4000,3141,2745] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; exports[`calculate simulations-salarié: activité partielle 1`] = `"[27,0,1560,1209,1209]"`; @@ -630,11 +936,20 @@ exports[`calculate simulations-salarié: apprentissage 2`] = ` Notifications affichées : contrat salarié . rémunération . contrôle smic" `; -exports[`calculate simulations-salarié: assimilé salarié 1`] = `"[7016,0,5000,3943,3286]"`; +exports[`calculate simulations-salarié: assimilé salarié 1`] = ` +"[7016,0,5000,3943,3286] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-salarié: assimilé salarié 2`] = `"[2128,0,1500,1163,1163]"`; +exports[`calculate simulations-salarié: assimilé salarié 2`] = ` +"[1583,0,1500,1163,1163] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; -exports[`calculate simulations-salarié: assimilé salarié 3`] = `"[4229,0,3000,2348,2161]"`; +exports[`calculate simulations-salarié: assimilé salarié 3`] = ` +"[3685,0,3000,2348,2161] +Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" +`; exports[`calculate simulations-salarié: atmp 1`] = `"[2521,0,2000,1561,1527]"`; From fc0ff8145126d32126b524035d30a3bbee7ac357 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 31 Mar 2021 11:09:29 +0200 Subject: [PATCH 013/319] Corrige le plafond des exo covid --- .../déclaration-revenu-indépendant.yaml | 9 +- .../règles/entreprise-établissement.yaml | 2 +- .../components/conversation/DateInput.tsx | 6 +- .../components/conversation/RuleInput.tsx | 2 +- .../AideDéclarationIndépendant/index.tsx | 110 ++-- .../__snapshots__/simulations.jest.js.snap | 473 +++++------------- 6 files changed, 182 insertions(+), 420 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 16192d258..4f7777f6a 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -5,6 +5,10 @@ aide déclaration revenu indépendant 2020: Ces règles calculent les montants demandés dans la déclaration de revenu des indépendants de 2021 sur les revenus 2020. formule: non + remplace: + règle: entreprise . ACRE + par: ACRE + aide déclaration revenu indépendant 2020 . nature de l'activité: remplace: entreprise . activité @@ -23,7 +27,6 @@ aide déclaration revenu indépendant 2020 . nature de l'activité: aide déclaration revenu indépendant 2020 . ACRE: - remplace: entreprise . ACRE description: >- L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une exonération partielle de charges sociales, dite exonération de début @@ -195,9 +198,9 @@ aide déclaration revenu indépendant 2020 . réduction covid . montant: plafond: somme: - dirigeant . indépendant . cotisations et contributions . cotisations + - dirigeant . indépendant . cotisations et contributions . CSG et CRDS - dirigeant . indépendant . conjoint collaborateur . cotisations - (- dirigeant . indépendant . cotisations et contributions . exonérations) - - (- CFP) aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020: applicable si: éligible aide printemps 2020 @@ -257,7 +260,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi Secteurs dont l’activité dépend de celle des secteurs 1 et qui ont subi une très forte baisse de leur chiffre d’affaires. aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2: - titre: Secteur 2 + titre: Secteur dit S2 description: Autres secteurs d’activité qui ont fait l’objet d’une interdiction affectant de manière prépondérante la poursuite de leur activité. diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 6ddc71db5..751049134 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -5,7 +5,7 @@ entreprise: entreprise . date de création: question: Quelle est votre date de début d'activité ? - par défaut: 01/01/2021 + par défaut: 01/01/2020 description: | La date de début d'activité (ou date de création) est fixée lors de la déclaration de votre entreprise. diff --git a/mon-entreprise/source/components/conversation/DateInput.tsx b/mon-entreprise/source/components/conversation/DateInput.tsx index a0edd775b..91bf82325 100644 --- a/mon-entreprise/source/components/conversation/DateInput.tsx +++ b/mon-entreprise/source/components/conversation/DateInput.tsx @@ -17,11 +17,11 @@ export default function DateInput({ const [day, month, year] = value.split('/') return `${year}-${month}-${day}` }, [value]) - + // const [currentValue, setCurrentValue] = useState(dateValue) const handleDateChange = useCallback( (evt) => { if (!evt.target.value) { - return + return onChange(undefined) } const [year, month, day] = evt.target.value.split('-') if (+year < 1700) { @@ -53,7 +53,7 @@ export default function DateInput({ className="ui__ input" id={id} type="date" - value={missing ? undefined : dateValue} + defaultValue={missing ? undefined : dateValue} required={required} onChange={handleDateChange} /> diff --git a/mon-entreprise/source/components/conversation/RuleInput.tsx b/mon-entreprise/source/components/conversation/RuleInput.tsx index cec09285c..6785d6399 100644 --- a/mon-entreprise/source/components/conversation/RuleInput.tsx +++ b/mon-entreprise/source/components/conversation/RuleInput.tsx @@ -24,7 +24,7 @@ type Props = Omit< required?: boolean autoFocus?: boolean dottedName: Name - onChange: (value: Parameters['evaluate']>[0]) => void + onChange: (value: Parameters['evaluate']>[0] | undefined) => void useSwitch?: boolean isTarget?: boolean onSubmit?: (source: string) => void diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 020779c38..f8e84a27b 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -8,7 +8,6 @@ import 'Components/TargetSelection.css' import Animate from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' import { EngineContext, useEngine } from 'Components/utils/EngineContext' -import { ScrollToTop } from 'Components/utils/Scroll' import { useNextQuestions } from 'Components/utils/useNextQuestion' import useSimulationConfig from 'Components/utils/useSimulationConfig' import { DottedName } from 'modele-social' @@ -48,7 +47,6 @@ export default function AideDéclarationIndépendant() { return (
-

Cet outil est une aide aux déclarations de revenus à destination des @@ -134,60 +132,62 @@ export default function AideDéclarationIndépendant() {

{situation['entreprise . date de création'] && ( - - - Cette aide à la déclaration concerne uniquement les - entreprises déjà en activité en 2020 - - + <> + + + Cette aide à la déclaration concerne uniquement les + entreprises déjà en activité en 2020 + + + + + + {/* PLNR */} + + + + + + + +

+ Situation personnelle +

+ + + + +

+ Exonérations +

+ + + + + + +

+ International +

+ + +
+
+ )} - - - - {/* PLNR */} - - - - - - - -

- Situation personnelle -

- - - - -

- Exonérations -

- - - - - - -

- International -

- - -
-
diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index bf4b84ee3..a1c075147 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,17 +1,17 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`calculate aide-déclaration-indépendant: ACRE 1`] = ` -"[50000,3177,11368,103,0,14648,35352] +"[50000,3177,9020,103,0,12300,37700] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: ACRE 2`] = ` -"[15000,948,3170,103,0,4221,10779] +"[15000,949,913,103,0,1965,13035] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: ACRE 3`] = ` -"[5000,312,1293,103,0,1708,3292] +"[5000,312,300,103,0,715,4285] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -40,16 +40,6 @@ exports[`calculate aide-déclaration-indépendant: RSA 2`] = ` Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = ` -"[50000,3176,7849,119,4800,11144,38856] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = ` -"[5000,311,0,119,2400,430,4570] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = ` "[50000,3175,14093,140,0,17408,32592] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" @@ -204,12 +194,12 @@ exports[`calculate simulations-auto-entrepreneur: activité mixte 2`] = `"[20000 exports[`calculate simulations-auto-entrepreneur: activité mixte 3`] = `"[20000,297,16438,0,16438]"`; exports[`calculate simulations-auto-entrepreneur: aides 1`] = ` -"[5348,29,5000,0,5000] +"[5538,45,5000,0,5000] Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" `; exports[`calculate simulations-auto-entrepreneur: aides 2`] = ` -"[53484,290,50000,0,50000] +"[55380,448,50000,0,50000] Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" `; @@ -264,219 +254,114 @@ exports[`calculate simulations-impot-société: prorata temporis 2`] = `"[277936 exports[`calculate simulations-impot-société: prorata temporis 3`] = `"[272981,0]"`; -exports[`calculate simulations-indépendant: acre 1`] = ` -"[73023,23023,50000,51980,8213,41787,0,73023] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`; -exports[`calculate simulations-indépendant: activité 1`] = ` -"[23690,3690,20000,20640,599,19401,0,23690] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000,20787,603,19397,0,29084]"`; -exports[`calculate simulations-indépendant: activité 2`] = ` -"[23706,3706,20000,20640,599,19401,0,23706] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,603,19397,0,29100]"`; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = ` -"[220,120,100,103,0,100,0,220] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1368,1268,100,134,0,100,0,1368]"`; -exports[`calculate simulations-indépendant: cotisations minimales 2`] = ` -"[220,120,100,103,0,100,0,220] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[244,144,100,104,0,100,0,244]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = ` -"[23690,3690,20000,20640,599,19401,0,23690] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = ` -"[73023,23023,50000,51980,8213,41787,0,73023] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = ` -"[23690,3690,20000,20640,2064,17936,0,23690] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084]"`; -exports[`calculate simulations-indépendant: inversions 1`] = ` -"[2000,392,1608,1660,0,1608,0,2000] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1366,634,686,0,634,0,2000]"`; -exports[`calculate simulations-indépendant: inversions 2`] = ` -"[50000,13698,36302,37657,4481,31821,0,50000] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33998,35353,3500,30498,0,50000]"`; -exports[`calculate simulations-indépendant: inversions 3`] = ` -"[11896,1896,10000,10320,0,10000,0,11896] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: inversions 3`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`; -exports[`calculate simulations-indépendant: inversions 4`] = ` -"[68273,21573,46700,48551,6700,40000,0,68273] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: inversions 4`] = `"[68273,21573,46700,48551,6700,40000,0,68273]"`; -exports[`calculate simulations-indépendant: inversions 5`] = ` -"[11896,1896,10000,10320,0,10000,1000,12896] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: inversions 5`] = `"[14460,4460,10000,10390,0,10000,1000,15460]"`; -exports[`calculate simulations-indépendant: inversions 6`] = ` -"[19000,2977,16023,16536,0,16023,1000,20000] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5870,13130,13643,0,13130,1000,20000]"`; -exports[`calculate simulations-indépendant: inversions 7`] = ` -"[17999,2824,15175,15661,0,15175,2000,20000] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[17999,5557,12442,12928,0,12442,2000,20000]"`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = ` -"[693,193,500,516,0,500,0,693] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1841,1341,500,547,0,500,0,1841]"`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = ` -"[1282,282,1000,1032,0,1000,0,1282] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2431,1431,1000,1063,0,1000,0,2431]"`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = ` -"[1872,372,1500,1548,0,1500,0,1872] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3025,1525,1500,1579,0,1500,0,3025]"`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = ` -"[2461,461,2000,2064,0,2000,0,2461] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3618,1618,2000,2095,0,2000,0,3618]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = ` -"[5999,999,5000,5160,0,5000,0,5999] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7302,2302,5000,5195,0,5000,0,7302]"`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = ` -"[11896,1896,10000,10320,0,10000,0,11896] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` "[139593,39593,100000,103788,24909,75091,0,139593] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` "[1239954,239954,1000000,1033666,444476,555524,0,1239954] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: CIPAV 1`] = ` -"[2255,0,1755,500,0,500] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[2873,0,2373,500,0,500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 2`] = ` -"[2805,0,1805,1000,0,1000] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3433,0,2433,1000,0,1000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 3`] = ` -"[3355,0,1855,1500,0,1500] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[3994,0,2494,1500,0,1500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 4`] = ` -"[3905,0,1905,2000,0,2000] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4554,0,2554,2000,0,2000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 5`] = ` -"[7205,0,2205,5000,0,5000] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[7987,0,2987,5000,0,5000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 6`] = ` -"[12704,0,2704,10000,0,10000] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14244,0,4244,10000,0,10000]"`; exports[`calculate simulations-professions-libérales: CIPAV 7`] = ` "[146241,0,46241,100000,24952,75048] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-professions-libérales: CIPAV 8`] = ` "[1238004,0,238004,1000000,444454,555546] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" -`; - -exports[`calculate simulations-professions-libérales: auxiliaire médical 1`] = ` -"[30000,0,4731,25269,1382,23887] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = ` -"[30000,0,4724,25276,1383,23893] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate simulations-professions-libérales: auxiliaire médical 3`] = ` -"[300000,0,61611,238389,81356,157033] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate simulations-professions-libérales: avocat 1`] = ` -"[50000,0,10570,39430,4853,34577] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" -`; - -exports[`calculate simulations-professions-libérales: avocat 2`] = ` -"[50000,0,11311,38689,4765,33924] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: expert-comptable 1`] = ` -"[20000,0,0,0,0,0] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +exports[`calculate simulations-professions-libérales: auxiliaire médical 1`] = `"[30000,0,7733,22267,946,21321]"`; + +exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = `"[30000,0,8059,21941,933,21008]"`; + +exports[`calculate simulations-professions-libérales: auxiliaire médical 3`] = `"[300000,0,61611,238389,81356,157033]"`; + +exports[`calculate simulations-professions-libérales: avocat 1`] = ` +"[50000,0,11181,38819,4781,34038] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; +exports[`calculate simulations-professions-libérales: avocat 2`] = ` +"[50000,0,11821,38179,4705,33474] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; + +exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,0,14951]"`; + exports[`calculate simulations-professions-libérales: expert-comptable 2`] = ` -"[50000,0,13275,36725,4532,32193] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[50000,0,14877,35123,3611,31512] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: médecin 1`] = ` -"[50000,0,10691,39307,4839,34468] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: médecin 1`] = `"[50000,0,10817,39183,4824,34359]"`; -exports[`calculate simulations-professions-libérales: médecin 2`] = ` -"[50000,0,15045,34955,3595,31360] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: médecin 2`] = `"[50000,0,17650,32350,3337,29013]"`; -exports[`calculate simulations-professions-libérales: médecin 3`] = ` -"[300000,0,73630,226370,77389,148981] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: médecin 3`] = `"[300000,0,73630,226370,77389,148981]"`; -exports[`calculate simulations-professions-libérales: médecin 4`] = ` -"[400000,0,93706,306295,120519,185776] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93706,306295,120519,185776]"`; exports[`calculate simulations-professions-libérales: médecin 5`] = ` "[120000,0,26977,93023,23107,69916] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-professions-libérales: médecin 6`] = ` @@ -484,34 +369,31 @@ exports[`calculate simulations-professions-libérales: médecin 6`] = ` Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; -exports[`calculate simulations-professions-libérales: sage-femme 1`] = ` -"[50000,0,11849,38150,4701,33449] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-professions-libérales: sage-femme 1`] = `"[50000,0,12354,37646,4641,33005]"`; exports[`calculate simulations-professions-libérales: sage-femme 2`] = ` -"[20000,0,3604,16396,0,16396] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" +"[20000,0,5136,14864,0,14864] +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,981,3018,0,3018] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" +"[4000,0,1268,2733,0,2733] +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,3604,16396,0,16396] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" +"[20000,0,5136,14864,0,14864] +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,3604,16396,0,16396] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" +"[20000,0,5213,14787,0,14787] +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,3604,16396,0,16396] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" +"[20000,0,5289,14711,0,14711] +Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): ACRE 1`] = ` @@ -529,109 +411,52 @@ exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): AC Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" `; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 1`] = ` -"[1893,0,0,21731,4,40] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 1`] = `"[1391,0,0,16041,4,29]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 2`] = ` -"[1893,0,0,21731,4,40] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 2`] = `"[1391,0,0,16041,4,29]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 3`] = ` -"[1893,0,0,21731,4,40] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 3`] = `"[1391,0,0,16041,4,29]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 4`] = ` -"[1249,0,0,14429,4,26] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 4`] = `"[917,0,0,10651,4,20]"`; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 5`] = ` "[14490,0,0,150669,4,46] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = ` -"[1249,0,0,14429,4,26] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = `"[917,0,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = ` -"[1249,0,0,0,0,0] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,0,0,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = ` -"[1249,0,0,0,0,0] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,0,0,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = ` -"[1249,0,0,14429,4,26] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = `"[917,0,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 4`] = ` -"[1249,0,0,14429,4,26] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 4`] = `"[917,0,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 5`] = ` -"[1249,0,0,14429,4,26] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 5`] = `"[917,0,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 1`] = ` -"[606,0,0,7127,4,13] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 1`] = `"[442,0,0,5261,4,10]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 2`] = ` -"[1249,0,0,14429,4,26] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 2`] = `"[917,0,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = ` -"[-30,0,0,0,0,0] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = `"[-30,0,0,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 2`] = ` -"[27,0,0,184,0,1] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 2`] = `"[14,0,0,136,0,1]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 3`] = ` -"[91,0,0,1285,1,2] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 3`] = `"[62,0,0,314,0,2]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 4`] = ` -"[284,0,0,3476,3,6] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 4`] = `"[204,0,0,2566,2,5]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 5`] = ` -"[606,0,0,7127,4,13] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 5`] = `"[442,0,0,5261,4,10]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 6`] = ` -"[1249,0,0,14429,4,26] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 6`] = `"[917,0,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 7`] = ` -"[2512,0,0,28761,4,46] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 7`] = `"[2341,0,0,26822,4,46]"`; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 8`] = ` "[4758,0,0,51817,4,46] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 1`] = ` @@ -712,109 +537,55 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = ` -"[0,24772,0,20779,4,40] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,19388,0,16984,4,33]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = ` -"[0,24589,0,21520,4,42] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,18995,0,17577,4,34]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = ` -"[0,25198,0,19054,4,37] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,20297,0,15600,4,30]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = ` -"[0,16795,0,12577,4,24] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13656,0,10367,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` "[0,225725,0,57933,4,56] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = ` -"[0,16779,0,12640,4,25] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, dirigeant . indépendant . contrats madelin . contrôle montant charges" +"[0,13624,0,10417,4,21] +Notifications affichées : dirigeant . indépendant . contrats madelin . contrôle montant charges" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = ` -"[0,16871,0,12270,4,24] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13814,0,10116,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = ` -"[0,16633,0,0,0,0] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = ` -"[0,16857,0,12260,4,24] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13804,0,10108,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = ` -"[0,16871,0,12270,4,24] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13814,0,10116,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = ` -"[0,16871,0,12270,4,24] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13814,0,10116,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = ` -"[0,8392,0,6102,4,21] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6894,0,5046,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = ` -"[0,16871,0,12270,4,24] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13814,0,10116,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` -"[0,-3,0,0,3,21] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = `"[0,-1044,0,0,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` -"[0,761,0,553,3,21] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = `"[0,-225,0,0,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = ` -"[0,1608,0,1169,3,21] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,634,0,483,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = ` -"[0,4152,0,3020,3,21] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3160,0,2322,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = ` -"[0,8392,0,6102,4,21] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6894,0,5046,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = ` -"[0,16871,0,12270,4,24] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13814,0,10116,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = ` -"[0,36302,0,26536,4,52] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33998,0,24913,4,48]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 8`] = ` "[0,69896,0,36428,4,56] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-salarié: CCN HCR 1`] = ` @@ -864,10 +635,7 @@ exports[`calculate simulations-salarié: JEI 2`] = ` Notifications affichées : contrat salarié . rémunération . contrôle salaire élevé" `; -exports[`calculate simulations-salarié: JEI 3`] = ` -"[4518,0,4000,3141,2745] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-salarié: JEI 3`] = `"[4518,0,4000,3141,2745]"`; exports[`calculate simulations-salarié: activité partielle 1`] = `"[27,0,1560,1209,1209]"`; @@ -936,20 +704,11 @@ exports[`calculate simulations-salarié: apprentissage 2`] = ` Notifications affichées : contrat salarié . rémunération . contrôle smic" `; -exports[`calculate simulations-salarié: assimilé salarié 1`] = ` -"[7016,0,5000,3943,3286] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-salarié: assimilé salarié 1`] = `"[7016,0,5000,3943,3286]"`; -exports[`calculate simulations-salarié: assimilé salarié 2`] = ` -"[1583,0,1500,1163,1163] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-salarié: assimilé salarié 2`] = `"[2128,0,1500,1163,1163]"`; -exports[`calculate simulations-salarié: assimilé salarié 3`] = ` -"[3685,0,3000,2348,2161] -Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" -`; +exports[`calculate simulations-salarié: assimilé salarié 3`] = `"[4229,0,3000,2348,2161]"`; exports[`calculate simulations-salarié: atmp 1`] = `"[2521,0,2000,1561,1527]"`; From a2e07d927539a9246b4ab69e2732102a38c856b9 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 1 Apr 2021 13:52:51 +0200 Subject: [PATCH 014/319] =?UTF-8?q?=E2=9C=85=20R=C3=A9tablit=20les=20sugge?= =?UTF-8?q?stions=20de=20date=20de=20cr=C3=A9ation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../règles/entreprise-établissement.yaml | 5 ++++- .../components/conversation/RuleInput.tsx | 7 ++++++- .../AideDéclarationIndépendant/index.tsx | 19 ++++++++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 751049134..28df0dcbf 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -15,7 +15,10 @@ entreprise . date de création: Si vous n'avez pas le jour exact, le mois suffit en général pour une bonne approximation. - + suggestions: + Début 2021: 01/01/2021 + Début 2020: 01/01/2020 + Fin 2017: 31/12/2017 type: date entreprise . date de création . contrôle date future: diff --git a/mon-entreprise/source/components/conversation/RuleInput.tsx b/mon-entreprise/source/components/conversation/RuleInput.tsx index 6785d6399..43e9202ff 100644 --- a/mon-entreprise/source/components/conversation/RuleInput.tsx +++ b/mon-entreprise/source/components/conversation/RuleInput.tsx @@ -25,6 +25,10 @@ type Props = Omit< autoFocus?: boolean dottedName: Name onChange: (value: Parameters['evaluate']>[0] | undefined) => void + // TODO: It would be preferable to replace this "showSuggestions" parameter by + // a build-in logic in the engine, by setting the "applicability" of + // suggestions. + showSuggestions?: boolean useSwitch?: boolean isTarget?: boolean onSubmit?: (source: string) => void @@ -52,6 +56,7 @@ export default function RuleInput({ onChange, useSwitch = false, isTarget = false, + showSuggestions = true, onSubmit = () => null, modifiers = {}, ...props @@ -69,7 +74,7 @@ export default function RuleInput({ title: rule.title, id: props.id ?? dottedName, question: rule.rawNode.question, - suggestions: rule.suggestions, + suggestions: showSuggestions ? rule.suggestions : {}, ...props, } if (getVariant(engine.getRule(dottedName))) { diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index f8e84a27b..e580805e9 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -130,7 +130,10 @@ export default function AideDéclarationIndépendant() { )} - + {situation['entreprise . date de création'] && ( <> @@ -356,8 +359,14 @@ type SimpleFieldProps = { dottedName: DottedName summary?: RuleNode['rawNode']['résumé'] question?: RuleNode['rawNode']['question'] + showSuggestions?: boolean } -function SimpleField({ dottedName, question, summary }: SimpleFieldProps) { +function SimpleField({ + dottedName, + question, + summary, + showSuggestions, +}: SimpleFieldProps) { const dispatch = useDispatch() const engine = useContext(EngineContext) const evaluation = engine.evaluate(dottedName) @@ -403,7 +412,11 @@ function SimpleField({ dottedName, question, summary }: SimpleFieldProps) {

{summary ?? rule.rawNode.résumé}

- + From 547973f4119acaed2b770ca862090c7fd04ef34a Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 1 Apr 2021 13:06:35 +0200 Subject: [PATCH 015/319] =?UTF-8?q?=F0=9F=94=A8=20Imputation=20de=20la=20r?= =?UTF-8?q?=C3=A9duction=20covid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Et modifications de la présentation des résultats suite à la publication du nouveau formulaire de déclaration sur impots.gouv.fr --- .../déclaration-revenu-indépendant.yaml | 66 ++++++----------- mon-entreprise/source/locales/rules-en.yaml | 70 ++++++------------ .../AideDéclarationIndépendant/config.yaml | 7 +- .../AideDéclarationIndépendant/index.tsx | 16 ++++- .../__snapshots__/simulations.jest.js.snap | 72 +++++++++++-------- 5 files changed, 96 insertions(+), 135 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 4f7777f6a..648477dec 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -122,50 +122,14 @@ aide déclaration revenu indépendant 2020 . période: - règle: période . fin d'année par: 31/12/2020 -aide déclaration revenu indépendant 2020 . revenu net fiscal: - titre: revenu net fiscal - résumé: avant déduction des charges sociales et exonérations fiscales [A] +aide déclaration revenu indépendant 2020 . cotisations obligatoires: + titre: Cotisations sociales obligatoires + résumé: '[DSBA/DSBB]' unité: €/an - formule: dirigeant . rémunération totale - -aide déclaration revenu indépendant 2020 . CSG déductible: - titre: CSG déductible - résumé: '[B]' - formule: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible - -aide déclaration revenu indépendant 2020 . cotisations sociales déductible: - titre: cotisations sociales obligatoires déductibles - résumé: '[C]' - description: >- - Montant à reporter dans la case XI de votre déclaration sociale et rubrique - 326 du formulaire 2033-D-SD (pour le réel simplifié) ou rubrique A5 du - formulaire 2053-SD (pour le réel normal) de votre déclaration fiscale. - - valeur: dirigeant . indépendant . cotisations et contributions . cotisations - -aide déclaration revenu indépendant 2020 . CFP: - résumé: contribution à la formation professionnelle [D] - formule: dirigeant . indépendant . cotisations et contributions . formation professionnelle - -aide déclaration revenu indépendant 2020 . total charges sociales déductible: - titre: total charges sociales obligatoires déductibles fiscalement - résumé: '[B + C + D]' - formule: - somme: - - CSG déductible - - CFP - - cotisations sociales déductible - description: >- - Montant à reporter dans la rubrique 252 du formulaire 2033-B-SD (pour le - réel simplifié) ou en rubrique FZ du formulaire 2052-SD (pour le réel - normal) de votre déclaration fiscale. - -aide déclaration revenu indépendant 2020 . assiette sociale: - titre: assiette sociale - résumé: 'pour information [A - (B + C + D)]' - formule: - valeur: revenu net fiscal - abattement: total charges sociales déductible + formule: + somme: + - dirigeant . indépendant . cotisations et contributions . cotisations + - (- réduction covid . imputation sur les cotisations obligatoires) aide déclaration revenu indépendant 2020 . réduction covid: titre: Réduction de cotisation Covid @@ -174,7 +138,9 @@ aide déclaration revenu indépendant 2020 . réduction covid: par: valeur: dirigeant . indépendant . cotisations et contributions . cotisations abattement: montant - sauf dans: réduction covid . montant + sauf dans: + - réduction covid + - cotisations obligatoires description: | Dans le cadre de la crise sanitaire, le Gouvernement a mis en œuvre plusieurs mesures exceptionnelles concernant les cotisations et contributions sociales des travailleurs indépendants affectés par la crise du coronavirus avec : @@ -188,20 +154,30 @@ aide déclaration revenu indépendant 2020 . réduction covid: question: Remplissez-vous les conditions pour bénéficier de la réduction de cotisations sociales liées à la crise du Covid-19 ? par défaut: non +aide déclaration revenu indépendant 2020 . réduction covid . imputation sur les cotisations obligatoires: + titre: imputation réduction covid + unité: €/an + formule: + produit: + assiette: montant + facteur: dirigeant . indépendant . cotisations et contributions . cotisations / montant . plafond + aide déclaration revenu indépendant 2020 . réduction covid . montant: titre: Réduction de cotisations Covid - résumé: intégrée dans le montant des cotisations calculé ci-dessus + résumé: intégrée dans le montant des cotisations calculé ci-dessus (pour information) formule: somme: - printemps 2020 - automne 2020 plafond: + nom: plafond somme: - dirigeant . indépendant . cotisations et contributions . cotisations - dirigeant . indépendant . cotisations et contributions . CSG et CRDS - dirigeant . indépendant . conjoint collaborateur . cotisations - (- dirigeant . indépendant . cotisations et contributions . exonérations) + aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020: applicable si: éligible aide printemps 2020 formule: diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 7a5607c41..7bc23bcd8 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -73,39 +73,17 @@ aide déclaration revenu indépendant 2020 . ACRE: question.fr: Votre entreprise bénéficie-t-elle de l'ACRE ? titre.en: '[automatic] ACRE' titre.fr: ACRE -aide déclaration revenu indépendant 2020 . CFP: - résumé.en: '[automatic] contribution to vocational training [D]' - résumé.fr: contribution à la formation professionnelle [D] - titre.en: '[automatic] PSC' - titre.fr: CFP -aide déclaration revenu indépendant 2020 . CSG déductible: - résumé.en: '[automatic] [B]' - résumé.fr: '[B]' - titre.en: '[automatic] deductible MSA' - titre.fr: CSG déductible aide déclaration revenu indépendant 2020 . PRCI: titre.en: '[automatic] PRCI' titre.fr: PRCI aide déclaration revenu indépendant 2020 . SMIC 2020: titre.en: '[automatic] MINIMUM WAGE 2020' titre.fr: SMIC 2020 -aide déclaration revenu indépendant 2020 . assiette sociale: - résumé.en: '[automatic] for your information [A - (B + C + D)].' - résumé.fr: pour information [A - (B + C + D)] - titre.en: '[automatic] social base' - titre.fr: assiette sociale -aide déclaration revenu indépendant 2020 . cotisations sociales déductible: - description.en: '[automatic] Amount to be reported in Box XI of your social - security return and Item 326 of Form 2033-D-SD (for the simplified actual) - or Item A5 of Form 2053-SD (for the normal actual) of your tax return.' - description.fr: - Montant à reporter dans la case XI de votre déclaration sociale - et rubrique 326 du formulaire 2033-D-SD (pour le réel simplifié) ou rubrique - A5 du formulaire 2053-SD (pour le réel normal) de votre déclaration fiscale. - résumé.en: '[automatic] [C]' - résumé.fr: '[C]' - titre.en: '[automatic] deductible compulsory social security contributions' - titre.fr: cotisations sociales obligatoires déductibles +aide déclaration revenu indépendant 2020 . cotisations obligatoires: + résumé.en: '[automatic] [DSBA/DSBB]' + résumé.fr: '[DSBA/DSBB]' + titre.en: '[automatic] Compulsory social security contributions' + titre.fr: Cotisations sociales obligatoires aide déclaration revenu indépendant 2020 . nature de l'activité: question.en: '[automatic] What is the nature of your business?' question.fr: Quelle est la nature de votre activité ? @@ -190,12 +168,6 @@ aide déclaration revenu indépendant 2020 . plafond sécurité sociale 2020: aide déclaration revenu indépendant 2020 . période: titre.en: '[automatic] period' titre.fr: période -aide déclaration revenu indépendant 2020 . revenu net fiscal: - résumé.en: '[automatic] before deduction of social security charges and tax - exemptions [A]' - résumé.fr: avant déduction des charges sociales et exonérations fiscales [A] - titre.en: '[automatic] net taxable income' - titre.fr: revenu net fiscal aide déclaration revenu indépendant 2020 . réduction covid: description.en: > [automatic] Within the framework of the health crisis, the Government has @@ -223,9 +195,14 @@ aide déclaration revenu indépendant 2020 . réduction covid: cotisations sociales liées à la crise du Covid-19 ? titre.en: '[automatic] Covid contribution reduction' titre.fr: Réduction de cotisation Covid +? aide déclaration revenu indépendant 2020 . réduction covid . imputation sur les cotisations obligatoires +: titre.en: '[automatic] imputation covid reduction' + titre.fr: imputation réduction covid aide déclaration revenu indépendant 2020 . réduction covid . montant: - résumé.en: '[automatic] included in the amount of contributions calculated above' - résumé.fr: intégrée dans le montant des cotisations calculé ci-dessus + résumé.en: + '[automatic] included in the amount of contributions calculated above + (for information)' + résumé.fr: intégrée dans le montant des cotisations calculé ci-dessus (pour information) titre.en: '[automatic] Covid contribution reduction' titre.fr: Réduction de cotisations Covid ? aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020 @@ -349,8 +326,8 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi description.fr: Autres secteurs d’activité qui ont fait l’objet d’une interdiction affectant de manière prépondérante la poursuite de leur activité. - titre.en: '[automatic] Sector 2' - titre.fr: Secteur 2 + titre.en: '[automatic] Sector called S2' + titre.fr: Secteur dit S2 ? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020 : description.en: > [automatic] Eligibility for the reduction under the second fall 2020 health @@ -624,19 +601,6 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi première vague de la crise sanitaire du printemps 2020 ? titre.en: '[automatic] eligible for aid spring 2020' titre.fr: éligible aide printemps 2020 -aide déclaration revenu indépendant 2020 . total charges sociales déductible: - description.en: - '[automatic] Amount to be reported in Item 252 of Form 2033-B-SD - (for Simplified Actual) or in Item FZ of Form 2052-SD (for Regular Actual) - of your tax return.' - description.fr: - Montant à reporter dans la rubrique 252 du formulaire 2033-B-SD - (pour le réel simplifié) ou en rubrique FZ du formulaire 2052-SD (pour le - réel normal) de votre déclaration fiscale. - résumé.en: '[automatic] [B + C + D]' - résumé.fr: '[B + C + D]' - titre.en: '[automatic] total tax-deductible compulsory social security charges' - titre.fr: total charges sociales obligatoires déductibles fiscalement artiste-auteur: description.en: The artist-author regime description.fr: Le régime des artistes-auteurs @@ -7008,6 +6972,12 @@ entreprise . date de création: approximation. question.en: '[automatic] What is your start date?' question.fr: Quelle est votre date de début d'activité ? + suggestions.Début 2020.en: '[automatic] Early 2020' + suggestions.Début 2020.fr: Début 2020 + suggestions.Début 2021.en: '[automatic] Early 2021' + suggestions.Début 2021.fr: Début 2021 + suggestions.Fin 2017.en: '[automatic] End of 2017' + suggestions.Fin 2017.fr: Fin 2017 titre.en: Creation date titre.fr: date de création entreprise . date de création . contrôle date future: diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml index 7866253f5..b26f74100 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml @@ -1,11 +1,6 @@ objectifs: - - aide déclaration revenu indépendant 2020 . revenu net fiscal - - aide déclaration revenu indépendant 2020 . CSG déductible - - aide déclaration revenu indépendant 2020 . cotisations sociales déductible - - aide déclaration revenu indépendant 2020 . CFP + - aide déclaration revenu indépendant 2020 . cotisations obligatoires - aide déclaration revenu indépendant 2020 . réduction covid . montant - - aide déclaration revenu indépendant 2020 . total charges sociales déductible - - aide déclaration revenu indépendant 2020 . assiette sociale situation: dirigeant: "'indépendant'" diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index e580805e9..c06e69152 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -12,7 +12,7 @@ import { useNextQuestions } from 'Components/utils/useNextQuestion' import useSimulationConfig from 'Components/utils/useSimulationConfig' import { DottedName } from 'modele-social' import { RuleNode } from 'publicodes' -import { useCallback, useContext } from 'react' +import { Fragment, useCallback, useContext } from 'react' import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -439,10 +439,20 @@ function Results() {
{emoji('📄')} +

+ L'ancienne Déclaration Sociale des Indépendant (DSI) qui était + précédemment à effectuer sur le site net-entreprises.fr est désormais + intégrée à la déclaration fiscale des revenus (déclaration 2042) sur + impots.gouv.fr. +

+

+ Vous pouvez reporter le montant suivant dans votre déclaration, calculé + à partir des informations saisies. +

<> {rules.map((r) => ( - +

{r.title} {r.rawNode.résumé}

@@ -459,7 +469,7 @@ function Results() { />

-
+ ))}
diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index a1c075147..a1d2904d3 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,157 +1,167 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`calculate aide-déclaration-indépendant: ACRE 1`] = ` -"[50000,3177,9020,103,0,12300,37700] +"[9020,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: ACRE 2`] = ` -"[15000,949,913,103,0,1965,13035] +"[913,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: ACRE 3`] = ` -"[5000,312,300,103,0,715,4285] +"[300,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: ACRE 4`] = ` -"[10000,630,1432,103,0,2165,7835] +"[1432,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: ACRE 5`] = ` -"[10000,630,606,103,0,1339,8661] +"[606,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = ` -"[50000,3023,11408,103,0,14534,35466] +"[11408,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: RSA 1`] = ` -"[500,25,81,103,0,209,291] +"[81,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: RSA 2`] = ` -"[5000,312,1020,103,0,1435,3565] +"[1020,0] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = ` +"[9097,4800] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = ` +"[0,1924] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = ` -"[50000,3175,14093,140,0,17408,32592] +"[14093,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = ` -"[50000,3174,13576,140,0,16890,33110] +"[13576,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = ` -"[50000,3175,11461,140,0,14776,35224] +"[11461,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = ` -"[50000,3176,14097,119,0,17392,32608] +"[14097,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = ` -"[50000,3175,11461,140,0,14776,35224] +"[11461,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = ` -"[50000,3177,5651,103,0,8931,41069] +"[5651,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: international 1`] = ` -"[50000,0,14609,103,0,14712,35288] +"[14609,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, impôt . domiciliation étranger non implémentée" `; exports[`calculate aide-déclaration-indépendant: international 2`] = ` -"[50000,1267,11875,103,0,13245,36755] +"[11875,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = ` -"[50000,3176,11362,119,0,14657,35343] +"[11362,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = ` -"[5000,311,1292,119,0,1722,3278] +"[1292,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = ` -"[50000,3177,11368,103,0,14648,35352] +"[11368,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = ` -"[5000,312,1293,103,0,1708,3292] +"[1293,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[50000,3177,11368,103,0,14648,35352] +"[11368,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = ` -"[5000,312,1293,103,0,1708,3292] +"[1293,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` -"[50000,3177,9453,103,0,12733,37267] +"[9453,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[500,25,1041,103,0,1169,0] +"[1041,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[1000,57,1041,103,0,1201,0] +"[1041,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = ` -"[1500,89,1059,103,0,1251,249] +"[1059,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = ` -"[2000,121,1090,103,0,1314,686] +"[1090,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = ` -"[5000,312,1293,103,0,1708,3292] +"[1293,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = ` -"[10000,630,2104,103,0,2837,7163] +"[2104,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` -"[100000,6361,20929,103,0,27393,72607] +"[20929,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` -"[1000000,63664,106448,103,0,170215,829785] +"[106448,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; From ed01e058b9f4561895a312c62cbc13577c161bc8 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 1 Apr 2021 14:48:32 +0200 Subject: [PATCH 016/319] =?UTF-8?q?=F0=9F=90=9B=20Corrections=20diverses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../déclaration-revenu-indépendant.yaml | 16 +++++----------- mon-entreprise/source/locales/rules-en.yaml | 19 ++++++++++--------- .../pages/Simulateurs/AidesEmbauche.tsx | 2 +- .../source/pages/Simulateurs/Home.tsx | 2 +- .../résoudre-référence-circulaire.ts | 2 +- 5 files changed, 18 insertions(+), 23 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 648477dec..df0228d05 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -240,7 +240,6 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi description: Autres secteurs d’activité qui ont fait l’objet d’une interdiction affectant de manière prépondérante la poursuite de leur activité. - aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: applicable si: secteur d'activité question: Êtes-vous éligibles au dispositif de réduction prévu au titre de la première vague de la crise sanitaire du printemps 2020 ? @@ -305,7 +304,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide a Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction d’accueil du public. - ### Secteur dit S1 + ### Secteur dit S1 bis Activité principale exercée dépendant de celles du secteur S1 Mois concerné | Conditions d'éligibilité @@ -335,16 +334,11 @@ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide a aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles: formule: somme: - - S1 + - S1 et S1bis - S2 arrondi: oui - plafond: - variations: - - si: secteur d'activité = 'S2' - alors: 3 mois éligibles - - sinon: 6 mois éligibles -aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1: +aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 et S1bis: applicable si: toutes ces conditions: - éligible aide automne 2020 @@ -354,7 +348,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois question: | Précisez le nombre de mois entre octobre 2020* et mars 2021 durant lesquels vous avez subi une interdiction d’accueil du public ou une baisse de 50% de votre chiffre d’affaires description: | - * Pour octobre 2020, vous activité devait également être située dans une zone d’application des mesures de couvre-feu + * Pour octobre 2020, votre activité devait également être située dans une zone d’application des mesures de couvre-feu unité: mois éligibles plafond: 6 mois éligibles @@ -366,5 +360,5 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois question: | Précisez le nombre de mois (novembre 2020 et/ou février 2021 et/ou mars 2021) durant lesquels vous avez fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de votre activité unité: mois éligibles - plafond: 6 mois éligibles + plafond: 3 mois éligibles diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 7bc23bcd8..aefe6467b 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -214,11 +214,12 @@ aide déclaration revenu indépendant 2020 . réduction covid . montant: ? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles : titre.en: '[automatic] number of eligible months' titre.fr: nombre de mois éligibles -? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 -: description.en: | - [automatic] For October 2020, you must also be located in a curfew zone +? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 et S1bis +: description.en: > + [automatic] For October 2020, your business also had to be located in a + curfew zone description.fr: > - * Pour octobre 2020, vous activité devait également être située dans une + * Pour octobre 2020, votre activité devait également être située dans une zone d’application des mesures de couvre-feu question.en: > [automatic] Specify the number of months between October 2020* and March @@ -228,8 +229,8 @@ aide déclaration revenu indépendant 2020 . réduction covid . montant: Précisez le nombre de mois entre octobre 2020* et mars 2021 durant lesquels vous avez subi une interdiction d’accueil du public ou une baisse de 50% de votre chiffre d’affaires - titre.en: '[automatic] S1' - titre.fr: S1 + titre.en: '[automatic] S1 and S1bis' + titre.fr: S1 et S1bis ? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2 : question.en: > [automatic] Specify the number of months (November 2020 and/or February 2021 @@ -366,7 +367,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi Good to know: The activities of delivery, withdrawal of order or takeaway sales are not taken into account to assess compliance with the condition of prohibition of reception of the public. - Sector known as S1 + Sector known as S1 bis Main activity carried out depending on those of sector S1 @@ -375,7 +376,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi --------------|-------------------------- - October 2020 | Have been subject to a measure of prohibition of reception of the public **OR** Have undergone a significant drop in monthly turnover(ca) + October 2020 | Have been subject to a ban on receiving the public **OR** Have suffered a sharp drop in monthly turnover(ca) Condition of decrease in turnover:_ @@ -445,7 +446,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction d’accueil du public. - ### Secteur dit S1 + ### Secteur dit S1 bis Activité principale exercée dépendant de celles du secteur S1 diff --git a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx index e03cc1c1e..eb7179ee6 100644 --- a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx @@ -71,7 +71,7 @@ const aides = [ ), }, { - title: 'Emploi Franc+', + title: 'Emploi Franc', dottedName: 'contrat salarié . aides employeur . emploi franc', situation: { 'contrat salarié . aides employeur . emploi franc . éligible': 'oui', diff --git a/mon-entreprise/source/pages/Simulateurs/Home.tsx b/mon-entreprise/source/pages/Simulateurs/Home.tsx index 68148e5b9..4ead1455b 100644 --- a/mon-entreprise/source/pages/Simulateurs/Home.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Home.tsx @@ -102,7 +102,7 @@ export default function Simulateurs() { de dispositifs pris en compte
  • - Intégrable facilement et gratuitement sur + Intégrables facilement et gratuitement sur n'importe quel site internet.{' '} En savoir plus.
  • diff --git a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts index b7e4d70d2..ba41f122a 100644 --- a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts +++ b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts @@ -74,7 +74,7 @@ export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoud if (nodeValue != null) { originalCache.nodes.forEach((v, k) => this.cache.nodes.set(k, v)) } - console.log('iteration résoudre référence circulaire :', i) + // console.log('iteration résoudre référence circulaire :', i) this.cache = originalCache delete this.parsedSituation[node.explanation.ruleToSolve] From 5e4f69edb474db8eaa3222da4d9640021751aa65 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 12 Apr 2021 14:49:15 +0200 Subject: [PATCH 017/319] =?UTF-8?q?=F0=9F=93=A6=20Publicodes=20v1.0.0-beta?= =?UTF-8?q?.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/package.json | 4 ++-- mon-entreprise/package.json | 4 ++-- publicodes/CHANGELOG.md | 13 +++++++++++++ publicodes/core/package.json | 2 +- publicodes/docs/se-lancer.md | 4 ++-- publicodes/ui-react/package.json | 4 ++-- 6 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 publicodes/CHANGELOG.md diff --git a/modele-social/package.json b/modele-social/package.json index 133683975..3e610f8bb 100644 --- a/modele-social/package.json +++ b/modele-social/package.json @@ -16,11 +16,11 @@ "dist/index.js" ], "devDependencies": { - "publicodes": "^1.0.0-beta.12", + "publicodes": "^1.0.0-beta.13", "yaml": "^1.10.0" }, "peerDependencies": { - "publicodes": "^1.0.0-beta.12" + "publicodes": "^1.0.0-beta.13" }, "scripts": { "build": "node build.js", diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index 2a8ce2e5b..b7f4f9a69 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -70,8 +70,8 @@ "fuse.js": "5.2.1", "iframe-resizer": "^4.1.1", "modele-social": "^0.2.0", - "publicodes": "^1.0.0-beta.12", - "publicodes-react": "^1.0.0-beta.12", + "publicodes": "^1.0.0-beta.13", + "publicodes-react": "^1.0.0-beta.13", "ramda": "^0.27.0", "react": "^17.0.0", "react-color": "^2.14.0", diff --git a/publicodes/CHANGELOG.md b/publicodes/CHANGELOG.md new file mode 100644 index 000000000..4799faaad --- /dev/null +++ b/publicodes/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +## 1.0.0-beta.13 + +**core** + +- Ajout d'un nouveau mécanisme : `résoudre la référence circulaire` (#1472) +- Simplification de l'API de Engine (#1431) + +**publicodes-react** + +- Améliore l'affichage des règles virtuelles dépliée dans une somme +- Ajoute les meta dans les pages de règles (#1411) diff --git a/publicodes/core/package.json b/publicodes/core/package.json index 4a93baa61..a176d099b 100644 --- a/publicodes/core/package.json +++ b/publicodes/core/package.json @@ -1,6 +1,6 @@ { "name": "publicodes", - "version": "1.0.0-beta.12", + "version": "1.0.0-beta.13", "description": "A declarative language for encoding public algorithm", "main": "dist/index.js", "types": "dist/types/index.d.ts", diff --git a/publicodes/docs/se-lancer.md b/publicodes/docs/se-lancer.md index 95a5171e6..5b00de95a 100644 --- a/publicodes/docs/se-lancer.md +++ b/publicodes/docs/se-lancer.md @@ -55,11 +55,11 @@ const engine = new Engine(rules) > - **ESModule sans npm install** (` +> > diff --git a/publicodes/ui-react/package.json b/publicodes/ui-react/package.json index 96b11f5c2..6b2c38e57 100644 --- a/publicodes/ui-react/package.json +++ b/publicodes/ui-react/package.json @@ -1,6 +1,6 @@ { "name": "publicodes-react", - "version": "1.0.0-beta.12", + "version": "1.0.0-beta.13", "description": "UI to explore publicodes computations", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -16,7 +16,7 @@ "classnames": "^2.2.6", "focus-trap-react": "^3.1.2", "i18next": "^19.4.4", - "publicodes": "1.0.0-beta.12", + "publicodes": "1.0.0-beta.13", "ramda": "^0.27.0", "react-easy-emoji": "^1.4.0", "react-helmet": "^6.1.0", From 5685c04b7cd57cd186351c9bbdec79fea0cd018e Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 22 Mar 2021 13:47:28 +0100 Subject: [PATCH 018/319] =?UTF-8?q?Enl=C3=A8ve=20la=20r=C3=A8gle=20sp?= =?UTF-8?q?=C3=A9cifique=20pour=20l'ACRE=20par=20d=C3=A9faut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/entreprise-établissement.yaml | 9 ++++----- mon-entreprise/source/locales/rules-en.yaml | 4 +--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 28df0dcbf..3bc951e27 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -492,11 +492,7 @@ entreprise . ACRE: - entreprise . durée d'activité < 3 ans - entreprise . date de création < 04/2020 - entreprise . durée d'activité . en début d'année < 1 an - par défaut: ACRE par défaut - note: Les auto-entreprises crées entre le 1er janvier et le 31 décembre 2019 bénéficient d'un dispositif plus favorable, actif pendant 3 années. - -entreprise . ACRE par défaut: - formule: + par défaut: variations: - si: toutes ces conditions: @@ -508,6 +504,9 @@ entreprise . ACRE par défaut: alors: non - sinon: oui + note: Les auto-entreprises crées entre le 1er janvier et le 31 décembre 2019 bénéficient d'un dispositif plus favorable, actif pendant 3 années. + + entreprise . effectif: unité: employé formule: diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index aefe6467b..cda926826 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -6466,9 +6466,7 @@ entreprise . ACRE: question.fr: Votre entreprise bénéficie-t-elle de l'ACRE ? titre.en: ACRE titre.fr: ACRE -entreprise . ACRE par défaut: - titre.en: '[automatic] default ACRE' - titre.fr: ACRE par défaut + entreprise . activité: description.en: '[automatic] Your type of activity will determine a large part of the contribution, contribution and tax calculations.' From 845930abf405d98d45660aaa3ff9f7bc5a9faddc Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 24 Mar 2021 17:48:37 +0100 Subject: [PATCH 019/319] =?UTF-8?q?R=C3=A9organise=20les=20r=C3=A8gles=20e?= =?UTF-8?q?ntreprise=20et=20dirigeant=20pour=20mieux=20refleter=20la=20r?= =?UTF-8?q?=C3=A9alit=C3=A9=20comptable=20sociale=20/=20fiscale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Principes : - Unifier les règles pour les différentes forme juridique / sociale - Se rapprocher au plus près des définitions comptables / juridique - Remettre les calculs dans le bon sens (revenu pro / total en fonction du CA et non l'inverse) - Ajouter option IS / IR sur le simulateur indépendant - Corriger prise en compte cotisations Madelins (inclues dans les cotisations et non dans les charges) - Ajoute l'option micro-BIC / micro-BNC --- modele-social/règles/dirigeant.yaml | 328 +++++---- .../règles/entreprise-établissement.yaml | 233 +++++-- modele-social/règles/impôt.yaml | 71 +- modele-social/règles/profession-libérale.yaml | 1 + modele-social/règles/salarié.yaml | 5 +- .../integration/mon-entreprise/simulateurs.js | 6 +- mon-entreprise/package.json | 2 +- .../source/components/SchemeComparaison.tsx | 67 +- .../source/components/SimulateurWarning.tsx | 12 +- .../source/components/SimulationGoals.tsx | 11 +- .../IndépendantExplanation.tsx | 4 +- .../components/utils/useNextQuestion.tsx | 2 +- mon-entreprise/source/locales/rules-en.yaml | 620 +++++++++--------- .../AideDéclarationIndépendant/index.tsx | 6 +- .../pages/Simulateurs/AutoEntrepreneur.tsx | 2 +- .../source/pages/Simulateurs/ISSimulation.tsx | 15 +- .../Simulateurs/IndépendantSimulation.tsx | 127 +++- .../configs/auto-entrepreneur.yaml | 4 +- .../Simulateurs/configs/dirigeant-sasu.yaml | 20 +- .../Simulateurs/configs/indépendant.yaml | 23 +- .../configs/profession-libérale.yaml | 4 +- .../configs/rémunération-dirigeant.yaml | 6 +- mon-entreprise/test/cycles.test.js | 2 +- .../__snapshots__/simulations.jest.js.snap | 205 +++--- .../aide-déclaration-indépendants.yaml | 66 +- .../simulations-auto-entrepreneur.yaml | 6 +- .../simulations-impôt-société.yaml | 20 +- .../regressions/simulations-indépendant.yaml | 73 ++- .../simulations-professions-libérales.yaml | 54 +- .../simulations-rémunération-dirigeant.yaml | 48 +- .../test/regressions/simulations.jest.js | 30 +- 31 files changed, 1162 insertions(+), 911 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index ee352f933..019c31fea 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -9,6 +9,71 @@ dirigeant: - assimilé salarié - indépendant +dirigeant . rémunération: oui +dirigeant . rémunération . totale: + question: Quel montant total pensez-vous dégager pour votre rémunération ? + description: | + C'est ce que l'entreprise dépense en tout pour la rémunération du dirigeant. Cette rémunération "super-brute" inclut toutes les cotisations sociales à payer. On peut aussi considérer que c'est la valeur monétaire du travail du dirigeant. + titre: Rémunération totale + unité: €/an + résumé: Incluant les cotisations et contributions + variations: + - si: assimilé salarié + alors: contrat salarié . rémunération . total + - si: entreprise . imposition . IS + alors: + somme: + - nette après impôt + - impôt + - cotisations + par défaut: entreprise . chiffre d'affaires - entreprise . charges + plancher: cotisations + - sinon: entreprise . chiffre d'affaires - entreprise . charges + +dirigeant . rémunération . nette: + titre: rémunération nette + question: Quelle est votre rémunération nette ? + résumé: Après déduction des cotisations, contributions et charges + somme: + - rémunération . totale + - (- cotisations) + +dirigeant . rémunération . cotisations: + variations: + - si: assimilé salarié + alors: contrat salarié . cotisations + - si: indépendant + alors: indépendant . cotisations et contributions + - si: auto-entrepreneur + alors: auto-entrepreneur . cotisations et contributions + +dirigeant . rémunération . imposable: + titre: Rémunération imposable + variations: + - si: assimilé salarié + alors: contrat salarié . rémunération . net imposable + - si: indépendant + alors: indépendant . revenu professionnel + - si: auto-entrepreneur + alors: auto-entrepreneur . impôt . revenu imposable + +dirigeant . rémunération . impôt: + produit: + assiette: imposable + taux: impôt . taux d'imposition + + +dirigeant . rémunération . nette après impôt: + titre: Rémunération après impôt + unité: €/an + arrondi: oui + question: Quel est le revenu net après impôt souhaité ? + description: >- + Le revenu net après déduction de l'impôt + sur le revenu et des cotisations sociales. + valeur: rémunération . nette - impôt + résumé: Ce que vous rapporte cette activité + dirigeant . assimilé salarié: description: | Certains dirigeants d'entreprise (c'est notamment le cas pour les SASU) sont considérés par la sécurité sociale comme assimilés aux salariés. Ils sont alors au régime général de la sécurité sociale, avec quelques contraintes cependant. Par exemple, ils ne cotisent pas au chômage, et n'y ont donc pas droit. @@ -18,6 +83,8 @@ dirigeant . assimilé salarié: par: "'CDI'" - règle: contrat salarié . statut cadre par: oui + - règle: entreprise . imposition + par: "'IS'" rend non applicable: - contrat salarié . convention collective - contrat salarié . activité partielle @@ -42,7 +109,8 @@ dirigeant . assimilé salarié: - entreprise . association non lucrative références: Le régime des dirigeants: https://www.urssaf.fr/portail/home/employeur/creer/choisir-une-forme-juridique/le-statut-du-dirigeant/les-dirigeants-rattaches-au-regi.html - + note: Nous ne gérons pas le cas des SAS(U) à l'IR pour l'instant + dirigeant . assimilé salarié . réduction ACRE: applicable si: entreprise . ACRE formule: @@ -75,64 +143,26 @@ dirigeant . assimilé salarié . réduction ACRE . notification taux annuel: dirigeant . auto-entrepreneur: rend non applicable: contrat salarié remplace: - règle: entreprise . imposition - # TODO devrait remplacer par l'option micro-BNC - par: "'IR'" + - règle: entreprise . imposition + par: "'IR'" + - règle: entreprise . imposition . IR . micro-fiscal + par: oui + formule: dirigeant = 'auto-entrepreneur' icônes: 🚶 description: | L'auto-entreprise est une entreprise individuelle simplifiée. À l'origine connu sous l'appellation « auto-entrepreneur », le régime de « micro-entrepreneur » est un régime de travailleur indépendant créé pour simplifier la gestion administrative, notamment en remplaçant toutes les cotisations sociales par un prélèvement unique mensuel. -dirigeant . auto-entrepreneur . seuils dépassés: - description: | - Le statut de micro-entrepreneur s'applique tant que le chiffre d'affaires annuel (effectivement encaissé au cours de l'année civile) ne dépasse pas les seuils du régime fiscal de la micro-entreprise. - - En cas de dépassement **sur deux années consécutives**, l'auto-entrepreneur bascule automatiquement dans le régime de [l'entreprise individuelle](/simulateurs/indépendant). - - À la fin de la première année d'activité, le CA est proratisé par rapport à la durée d'activité. - - Exemple : - > Un contribuable crée une entreprise le 1er août et encaisse des recettes HT de `50 000 €` au cours des cinq mois d'activité de sa première année civile d'exploitation. - > Les recettes de cette première année civile sont ajustées *prorata temporis* pour les comparer au plafond : - > - > `50 000€ x (365/153) = 119 280 €` - - - Les charges ne sont pas déductibles pour le calcul du plafond (comme pour le calcul des cotisations) - - - ### Multi-activité - - Lorsqu'un entrepreneur exerce 2 activités au sein de sa micro-entreprise, le - seuil de chiffre d’affaires à respecter n’est pas pour autant doublé. En - effet l'exercice de plusieurs activités avec la même micro-entreprise - n’augmente pas les seuils. - - références: - Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32353 - Article 50-0 du Code général des impôts: https://www.legifrance.gouv.fr/affichCode.do?idSectionTA=LEGISCTA000006199553&cidTexte=LEGITEXT000006069577 - Bofip (dépassement micro-bnc): https://bofip.impots.gouv.fr/bofip/4807-PGP.html - Bofip (dépassement micro-bic): https://bofip.impots.gouv.fr/bofip/1802-PGP.html - autoentrepreneur.urssaf.fr: https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html - unité: €/an - une de ces conditions: - - entreprise . chiffre d'affaires > 176200 €/an - - entreprise . chiffre d'affaires . service > 70000 €/an - -dirigeant . auto-entrepreneur . seuils dépassés . notification: - type: notification - sévérité: avertissement - formule: oui - description: Le seuil annuel de chiffre d'affaires pour le régime de l'auto-entreprise est dépassé. [En savoir plus](/documentation/dirigeant/auto‑entrepreneur/seuils-dépassés) - dirigeant . auto-entrepreneur . net de cotisations: titre: Revenu net de cotisations arrondi: oui + unité: €/an + remplace: rémunération . nette identifiant court: auto-entrepreneur-net résumé: Avant impôt question: Quel revenu avant impôt voulez-vous toucher ? - description: Il s'agit du revenu net de cotisations et de charges, avant le paiement de l'impôt sur le revenu. + description: Il s'agit du revenu après déductions des cotisations, avant le paiement de l'impôt sur le revenu. formule: entreprise . chiffre d'affaires - cotisations et contributions dirigeant . auto-entrepreneur . cotisations et contributions: @@ -244,6 +274,7 @@ dirigeant . auto-entrepreneur . cotisations et contributions . contribution form - sinon: 0.1% dirigeant . auto-entrepreneur . cotisations et contributions . cotisations: + description: | Les cotisations sociales donnent à l'auto-entrepreneur accès à une protection sociale minimale : une retraite, des soins de santé, des @@ -400,6 +431,7 @@ dirigeant . auto-entrepreneur . net après impôt: identifiant court: auto-entrepreneur-net-apres-impot résumé: Avant déduction des dépenses liées à l'activité unité: €/an + remplace: rémunération . nette après impôt arrondi: oui question: Quel est le revenu net après impôt souhaité ? description: >- @@ -420,43 +452,17 @@ dirigeant . auto-entrepreneur . net après impôt: - La location d'un local - etc... - valeur: net de cotisations - abattement: - nom: impôt - titre: impôt sur le revenu - produit: - assiette: dirigeant . auto-entrepreneur . impôt . revenu imposable - taux: impôt . taux d'imposition + valeur: net de cotisations - rémunération . impôt -dirigeant . rémunération totale: - synonymes: - - résultat d'exploitation - - bénéfices - question: Quel montant pensez-vous dégager pour votre rémunération ? - résumé: Dépensé par l'entreprise - unité: €/an - arrondi: oui - identifiant court: dirigeant-total - description: C'est ce que l'entreprise dépense en tout pour la rémunération du dirigeant. - Cette rémunération "super-brute" inclut toutes les cotisations sociales à payer. - - On peut aussi considérer que c'est la valeur monétaire du travail du dirigeant. - formule: - variations: - - si: indépendant - alors: - somme: - - indépendant . revenu net de cotisations - - indépendant . cotisations et contributions - - si: auto-entrepreneur - alors: entreprise . chiffre d'affaires - entreprise . charges - - si: assimilé salarié - alors: - somme: - - contrat salarié . rémunération . total - # TODO : ajouter la taxe sur les salaires ici. - # Pour l'instant commenté car elle crée une boucle à cause de la franchise de TVA - # - entreprise . taxe sur les salaires +dirigeant . auto-entrepreneur . chiffre d'affaires: + question: Quel est votre chiffre d'affaires ? + résumé: Montant total des recettes (hors taxe) + remplace: entreprise . chiffre d'affaires + inversion numérique: + avec: + - rémunération . totale + - net après impôt + - net de cotisations dirigeant . indépendant: rend non applicable: contrat salarié @@ -486,6 +492,51 @@ dirigeant . indépendant . avertissement base forfaitaire: régularisation). Il vous permet donc d'anticiper le montant de cette régularisation et de plannifier votre trésorerie en conséquence. + +dirigeant . indépendant . revenu professionnel: + description: rémunération du dirigeant au régime des indépendant + unité: €/an + arrondi: oui + résoudre la référence circulaire: oui + variations: + - si: entreprise . imposition = 'IS' + alors: + somme: + - rémunération . nette + - cotisations et contributions . non déductibles + - sinon: entreprise . résultat fiscal + + +dirigeant . indépendant . assiette des cotisations: + unité: €/an + description: Il s'agit de l'assiette des cotisations sociales, nombre forcément positif + valeur: + nom: sans plancher + somme: + - revenu professionnel + - contrats madelin . part déductible fiscalement + plancher: 0 + +dirigeant . indépendant . conjoint collaborateur: + question: Avez-vous un conjoint collaborateur ? + description: | + Permet au conjoint du dirigeant d'être couvert par la protection sociale moyennant le paiement de cotisations sociales supplémantaires. + Pour en bénéficier, l'époux(se) ou partenaire de Pacs du dirigeant doit: + - exercer une activité professionnelle régulière et habituelle dans l'entreprise + - faire l'objet d'une mention au RCS pour les commerçants ou au répertoire des métiers (RM) pour les artisans + - ne pas être rémunéré + - ne pas être associé de la société. + par défaut: non + références: + secu-indépendant.fr: https://www.secu-independants.fr/cotisations/conjoint/conjoint-collaborateur/?reg=lorraine&pro=artisan&act=retraite&ae=non#c46535 + service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F33429 + +dirigeant . indépendant . cotisations et contributions . non déductibles: + titre: Cotisations et contributions non déductibles fiscalement + somme: + - CSG et CRDS . non déductible + - contrats madelin . part non-déductible fiscalement + dirigeant . indépendant . cotisations et contributions . exonérations . ACRE: applicable si: entreprise . ACRE formule: @@ -534,73 +585,6 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . - taux: 0% plafond: 100% -dirigeant . indépendant . revenu net de cotisations: - identifiant court: independant-net - synonymes: - - résultat comptable - formule: - somme: - - valeur: revenu professionnel - arrondi: oui - - (- cotisations et contributions . CSG et CRDS . non déductible) - - (- contrats madelin . montant) - résumé: Avant déduction de l'impôt sur le revenu - question: Quel revenu avant impôt voulez-vous toucher ? - description: Il s'agit du revenu net de cotisations et de charges, avant le paiement de l'impôt sur le revenu. - références: - Cerfa 2033-sd: https://www.impots.gouv.fr/portail/files/formulaires/2033-sd/2020/2033-sd_2983.pdf - -dirigeant . indépendant . résultat fiscal: - synonymes: - - net imposable - - assiette fiscale - résumé: Assiette du calcul de l'impôt - description: Il s'agit du net imposable, assiette sur laquelle l'impôt est calculé. - formule: revenu professionnel - contrats madelin . part déductible fiscalement - références: - Portail Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/la-declaration-sociale-des-indep/les-revenus-pris-en-compte-pour.html - -dirigeant . indépendant . revenu professionnel: - unité: €/an - titre: revenu professionnel - description: | - C'est le revenu net de cotisations déductibles du travailleur indépendant, qui sert de base au calcul des cotisations pour les indépendants. - - Attention : **notre calcul est fait au régime de croisière**: - l'indépendant qui se lance paiera pendant ses 2 premières années un forfait relativement réduit de cotisations sociales. Il devra ensuite régulariser cette situation par rapport au revenu qu'il a vraiment perçu. - - Il faut donc voir ce calcul comme *le montant qui devra de toute façon être payé* à court terme après 2 ans d'exercice. - formule: - inversion numérique: - avec: - - revenu net de cotisations - - résultat fiscal - - rémunération totale - - revenu net après impôt - - entreprise . chiffre d'affaires - - entreprise . chiffre d'affaires minimum - arrondi: oui - -dirigeant . indépendant . assiette des cotisations: - description: Il s'agit de l'assiette des cotisations sociales, nombre forcément positif - formule: - valeur: revenu professionnel - plancher: 0 - -dirigeant . indépendant . conjoint collaborateur: - question: Avez-vous un conjoint collaborateur ? - description: | - Permet au conjoint du dirigeant d'être couvert par la protection sociale moyennant le paiement de cotisations sociales supplémantaires. - Pour en bénéficier, l'époux(se) ou partenaire de Pacs du dirigeant doit: - - exercer une activité professionnelle régulière et habituelle dans l'entreprise - - faire l'objet d'une mention au RCS pour les commerçants ou au répertoire des métiers (RM) pour les artisans - - ne pas être rémunéré - - ne pas être associé de la société. - par défaut: non - références: - secu-indépendant.fr: https://www.secu-independants.fr/cotisations/conjoint/conjoint-collaborateur/?reg=lorraine&pro=artisan&act=retraite&ae=non#c46535 - service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F33429 - dirigeant . indépendant . conjoint collaborateur . assiette: question: Sur quelle base le conjoint cotise-t'il ? description: | @@ -759,16 +743,19 @@ dirigeant . indépendant . cotisations et contributions: C'est le montant total dû par l'indépendant au titre des cotisations et contributions obligatoires. - formule: - somme: - - cotisations - - CSG et CRDS - - contributions spéciales - - formation professionnelle + Ce montant inclut la réduction de cotisation "covid" en 2020. + + somme: + - cotisations et contributions . cotisations + - contrats madelin . montant + - CSG et CRDS + - contributions spéciales + - formation professionnelle note: | À la différence des cotisations, les contributions ne sont pas réintroduites pour le calcul de la CSG/CRDS. Elles ne bénéficient pas non plus de la réduction ACRE. + dirigeant . indépendant . cotisations et contributions . contributions spéciales: description: | Certains régimes spéciaux peuvent ajouter des contributions additionnelles @@ -814,6 +801,8 @@ dirigeant . indépendant . contrats madelin: titre: Contrats Madelin question: Avez-vous souscrit à des contrats de complémentaire privée dits ("contrats Madelins") par défaut: non + références: + economie.gouv.fr: https://www.economie.gouv.fr/particuliers/reduction-impot-revenu-investissements-entreprise-pme-madelin dirigeant . indépendant . contrats madelin . montant: titre: Somme des cotisations à contrats Madelin @@ -822,13 +811,6 @@ dirigeant . indépendant . contrats madelin . montant: - mutuelle - retraite -dirigeant . indépendant . contrats madelin . contrôle montant charges: - type: notification - formule: entreprise . charges < montant - description: >- - Le montant de l'ensemble des cotisations à vos contrats Madelin - doit être inclus dans vos charges de fonctionnement, or vous - avez indiqué un montant de cotisations supérieur aux charges. dirigeant . indépendant . contrats madelin . part déductible fiscalement: titre: Part de la cotisation à contrat Madelin qui est déductible fiscalement @@ -1087,15 +1069,15 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette Seule la partie imposable des IJSS est retranchée de l'assiette de la CSG, puisque la partie non imposable a déjà été retranchée du revenu net fiscal fourni - plancher: 0€/an - valeur: - somme: - - revenu professionnel - - cotisations - abattement: - somme: - - revenus étrangers . montant - - dirigeant . indépendant . IJSS . imposable + formule: + valeur: + somme: + - assiette des cotisations . sans plancher + - cotisations + abattement: + somme: + - revenus étrangers . montant + - dirigeant . indépendant . IJSS . imposable dirigeant . indépendant . cotisations et contributions . formation professionnelle: produit: @@ -1146,7 +1128,7 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ZFU: plafond: recalcul: avec: - dirigeant . indépendant . revenu professionnel: 3042 heures/an * SMIC horaire + revenu professionnel: 3042 heures/an * SMIC horaire arrondi: oui unité: €/an diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 3bc951e27..a4f10e1fb 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -54,25 +54,21 @@ entreprise . durée d'activité . en début d'année: entreprise . chiffre d'affaires: question: Quel est votre chiffre d'affaires envisagé ? + résumé: Montant total des recettes brutes (hors taxe) unité: €/an - variations: - - si: dirigeant . auto-entrepreneur - alors: - inversion numérique: - avec: - - dirigeant . auto-entrepreneur . net de cotisations - - dirigeant . auto-entrepreneur . net après impôt - - dirigeant . rémunération totale - - sinon: - somme: - - dirigeant . rémunération totale - - charges - - - + somme: + - dirigeant . rémunération . nette après impôt + - dirigeant . rémunération . impôt + - dirigeant . rémunération . cotisations + - charges + - applicable si: entreprise . imposition . IS + somme: + - imposition . IS . résultat net + - imposition . IS . impôt sur les sociétés + plancher: 0€/an arrondi: oui - identifiant court: ca + identifiant court: CA entreprise . chiffre d'affaires . vente restauration hébergement: @@ -165,6 +161,7 @@ entreprise . chiffre d'affaires . service BNC: liste des activités libérales: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/liste-professions-liberales entreprise . chiffre d'affaires . service: + titre: Chiffre d'affaires de prestation de service description: | Il s’agit de toute opération ne comportant pas de transfert de propriété de biens corporels (c'est-à-dire ayant une existence matérielle) @@ -182,6 +179,7 @@ entreprise . chiffre d'affaires . BIC: - vente restauration hébergement entreprise . chiffre d'affaires . franchise de TVA dépassée: + description: | La franchise de TVA est un dispositif qui exonère les entreprises de la déclaration et du paiement de la TVA. Il s'applique en dessous d'un seuil de @@ -218,23 +216,20 @@ entreprise . chiffre d'affaires . franchise de TVA dépassée . seuil service: Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F21746 entreprise . chiffre d'affaires . franchise de TVA dépassée . notification: + applicable si: chiffre d'affaires type: notification formule: oui description: | Le seuil annuel de chiffre d'affaires pour la franchise de TVA est dépassé. [En savoir plus](/documentation/entreprise/chiffre-d'affaires/franchise-de-TVA-dépassée) -entreprise . chiffre d'affaires minimum: - identifiant court: entreprise-ca-min - description: Le montant minimum des ventes (H.T) à réaliser pour atteindre le seuil de rentabilité. - question: Quel est votre chiffre d'affaires minimum envisagé ? - unité: €/an - formule: chiffre d'affaires -entreprise . rémunération du dirigeant: - description: | - C'est la part du chiffre d'affaires après charges qui est allouée à la rémunération du dirigeant. Plus cette part est élevée, plus la rémunération du dirigeant augmente, et plus le bénéfice de l'entreprise diminue. - question: Quelle part du chiffre d'affaires après charge est allouée à la rémunération du dirigeant ? - par défaut: 100% +entreprise . résultat fiscal: + unité: €/an + somme: + - chiffre d'affaires + - (- charges) + - (- charges . dirigeant) + entreprise . imposition: question: À quel régime d'imposition l'entreprise est-elle soumise ? @@ -252,43 +247,100 @@ entreprise . imposition: entreprise . imposition . IR: valeur: imposition = 'IR' - titre: À l'impôt sur le revenu + titre: Impôt sur le revenu -entreprise . imposition . IS: - valeur: imposition = 'IS' - titre: À l'impôt sur les sociétés - -entreprise . imposition . IS . notification IS non intégré: - type: notification - formule: - une de ces conditions: - - dirigeant . assimilé salarié - - dirigeant . indépendant +entreprise . imposition . IR . micro-fiscal: + rend non applicable: dirigeant . indépendant . contrats madelin + question: Avez-vous opté pour le régime micro-fiscal ? description: | - Ce simulateur n'intègre pas l'impôts sur les sociétés ni la fiscalité des - dividendes. L'option "Impôt sur les Sociétés" est uniquement utilisée dans - le calcul de l'impôt sur le revenu. + Avec le régime micro fiscal, les charges déductible sont estimées forfaitairement, comme un pourcentage du chiffre d'affaires. + Ce pourcentage dépend du type d'activité. -entreprise . bénéfice: - titre: Bénéfice de l'exercice - résumé: Imposable à l'impôt sur les sociétés - formule: chiffre d'affaires - charges dont rémunération dirigeant + Cette option permet de simplifier votre comptabilité, et peut-être avantageuse en terme de revenu dans le cas où vos charges de fonctionnement sont faibles. + par défaut: non -entreprise . bénéfice . information sur le report de déficit: - type: notification - formule: bénéfice < 0 €/an - # TODO: Support des références dans les notifications +entreprise . imposition . IR . micro-fiscal . revenu abattu: + remplace: résultat fiscal + résoudre la référence circulaire: oui + titre: abattement forfaitaire micro-fiscal description: | - Les déficits subits au cours d'un exercice peuvent être reportés sur les exercices suivants (report en avant), ou sur le seul exercice précédent (report en arrière). + Le micro-entrepreneur est dispensé d'établir une déclaration professionnelle de bénéfices au titre des BNC ou BIC. - [Plus d'infos sur service-public.fr](https://www.service-public.fr/professionnels-entreprises/vosdroits/F23628) + Il lui suffit de porter dans la déclaration complémentaire de revenu (n°2042-C Pro) le montant annuel du chiffre d'affaires brut (BIC) ou des recettes (BNC). + valeur: chiffre d'affaires + abattement: + produit: + composantes: + - assiette: entreprise . chiffre d'affaires . vente restauration hébergement + taux: 71% + - assiette: entreprise . chiffre d'affaires . service BIC + taux: 50% + - assiette: entreprise . chiffre d'affaires . service BNC + taux: 34% + plancher: + variations: + - si: entreprise . activité . mixte + alors: 610 €/an + - sinon: 305 €/an -entreprise . résultat net: - résumé: Ce qu'il reste après impôt sur les sociétés - formule: bénéfice - impôt sur les sociétés -entreprise . exercice: +entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés: + type: notification + sévérité: avertissement + formule: chiffre d'affaires . seuil micro dépassé + description: Le seuil annuel de chiffre d'affaires pour le régime micro-fiscal est dépassé. [En savoir plus](/documentation/entreprise/chiffre-d'affaires/seuil-micro-dépassé) + +entreprise . chiffre d'affaires . seuil micro dépassé: + applicable si: imposition . IR + description: | + Le statut de micro-entreprise s'applique tant que le chiffre d'affaires annuel (effectivement encaissé au cours de l'année civile) ne dépasse pas les seuils du régime fiscal de la micro-entreprise. + En cas de dépassement **sur deux années consécutives**, l'entreprise bascule automatiquement dans le régime de [l'entreprise individuelle](/simulateurs/indépendant). + + À la fin de la première année d'activité, le CA est proratisé par rapport à la durée d'activité. + + Exemple : + > Un contribuable crée une entreprise le 1er août et encaisse des recettes HT de `50 000 €` au cours des cinq mois d'activité de sa première année civile d'exploitation. + > Les recettes de cette première année civile sont ajustées *prorata temporis* pour les comparer au plafond : + > + > `50 000€ x (365/153) = 119 280 €` + + + Les charges ne sont pas déductibles pour le calcul du plafond (comme pour le calcul des cotisations) + + + ### Multi-activité + + Lorsqu'un entrepreneur exerce 2 activités au sein de sa micro-entreprise, le + seuil de chiffre d’affaires à respecter n’est pas pour autant doublé. En + effet l'exercice de plusieurs activités avec la même micro-entreprise + n’augmente pas les seuils. + + références: + Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32353 + Article 50-0 du Code général des impôts: https://www.legifrance.gouv.fr/affichCode.do?idSectionTA=LEGISCTA000006199553&cidTexte=LEGITEXT000006069577 + Bofip (dépassement micro-bnc): https://bofip.impots.gouv.fr/bofip/4807-PGP.html + Bofip (dépassement micro-bic): https://bofip.impots.gouv.fr/bofip/1802-PGP.html + autoentrepreneur.urssaf.fr: https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html + unité: €/an + une de ces conditions: + - entreprise . chiffre d'affaires > 176200 €/an + - entreprise . chiffre d'affaires . service > 72500 €/an + + +entreprise . imposition . IR . information sur le report de déficit: + non applicable si: micro-fiscal + type: notification + formule: résultat fiscal < 0 €/an + description: | + Lorsque votre résultat fiscal est négatif, ce dernier vient réduire le revenu imposables du foyer fiscal. + Un déficit peut être imputé jusqu'à 6 ans après sa réalisation. + + [Voir les règles fiscales détaillées](https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301) + références: + bofip: https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301 + +entreprise . exercice: oui entreprise . exercice . début: type: date par défaut: 01/01/2020 @@ -328,11 +380,38 @@ entreprise . exercice . durée maximale: formule: durée >= 24 mois description: La durée maximale d'un exercice comptable est de 24 mois. -entreprise . impôt sur les sociétés: +entreprise . imposition . IS: + valeur: imposition = 'IS' + titre: Impôt sur les sociétés + + +entreprise . imposition . IS . résultat imposable: + titre: Résultat de l'exercice + résumé: Imposable à l'impôt sur les sociétés + valeur: résultat fiscal + +entreprise . imposition . IS . information sur le report de déficit: + type: notification + formule: résultat imposable < 0 €/an + # TODO: Support des références dans les notifications + description: | + Les déficits subits au cours d'un exercice peuvent être reportés sur les exercices suivants (report en avant), ou sur le seul exercice précédent (report en arrière). + + +entreprise . imposition . IS . résultat net: + résumé: Après déduction des charges et de l'impôt sur les société + somme: + - chiffre d'affaires + - (- charges) + - (- dirigeant . rémunération . totale) + - (- impôt sur les sociétés) + par défaut: 0€ + +entreprise . imposition . IS . impôt sur les sociétés: unité: €/an formule: barème: - assiette: bénéfice + assiette: résultat imposable multiplicateur: prorata temporis variations: - si: exercice . début >= 01/01/2022 @@ -374,22 +453,22 @@ entreprise . impôt sur les sociétés: Fiche impots.gouv.fr: https://www.impots.gouv.fr/portail/international-professionnel/impot-sur-les-societes Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F23575 -entreprise . impôt sur les sociétés . plafond taux réduit 1: +entreprise . imposition . IS . impôt sur les sociétés . plafond taux réduit 1: applicable si: éligible taux réduit valeur: 38120 €/an -entreprise . impôt sur les sociétés . plafond taux réduit 2: +entreprise . imposition . IS . impôt sur les sociétés . plafond taux réduit 2: applicable si: éligible taux réduit valeur: 500000 €/an -entreprise . impôt sur les sociétés . éligible taux réduit: +entreprise . imposition . IS . impôt sur les sociétés . éligible taux réduit: formule: toutes ces conditions: - chiffre d'affaires <= 7630 k€/an * prorata temporis - nom: capital détenu au moins à 75 pourcents par des personnes physiques valeur: oui -entreprise . impôt sur les sociétés . prorata temporis: +entreprise . imposition . IS . impôt sur les sociétés . prorata temporis: description: | Lorsque la durée de l’exercice n'est pas égale à un an, on pro-ratise les plafonds utilisés dans le barème de l'impôt sur les sociétés. @@ -402,7 +481,7 @@ entreprise . impôt sur les sociétés . prorata temporis: références: Bofip: https://bofip.impots.gouv.fr/bofip/2065-PGP.html/identifiant%3DBOI-IS-LIQ-20-20-20180801 -entreprise . impôt sur les sociétés . contribution sociale: +entreprise . imposition . IS . impôt sur les sociétés . contribution sociale: # description: | # La contribution sociale sur les bénéfices est un impôt distinct de l'impôt sur les sociétés. Son montant n'est pas déductible des résultats. @@ -420,14 +499,11 @@ entreprise . impôt sur les sociétés . contribution sociale: références: Bofip: https://bofip.impots.gouv.fr/bofip/3492-PGP.html/identifiant%3DBOI-IS-AUT-10-20-20130318 -entreprise . charges dont rémunération dirigeant: - formule: charges + dirigeant . rémunération totale - entreprise . charges: synonymes: - charges d'exploitation - charges de fonctionnement - titre: charges de fonctionnement + titre: charges (hors rémunération dirigeant) identifiant court: charges résumé: Toutes les dépenses nécessaires à l'entreprise question: Quelles sont les charges de l'entreprise ? @@ -442,7 +518,6 @@ entreprise . charges: - achat de matières premières pour une activité de production - achat de produits en vue de leur revente, pour une activité commerciale - frais de repas : le supplément par rapport au coût d'un repas à domicile - - les cotisations aux contrats Madelin Attention : l'achat d'un ordinateur à 1000€ n'est pas une charge, mais une immobilisation : c'est un bien qui va profiter à l'entreprise pendant plusieurs années. Chaque année, une partie de cette immobilisation est amortie, et cet amortissement déductible peut être intégré dans ce calcul, par exemple 200€ par an pendant 5 ans. @@ -452,6 +527,21 @@ entreprise . charges: Charges déductibles ou non du résultat fiscal d'une entreprise: https://www.service-public.fr/professionnels-entreprises/vosdroits/F31973 par défaut: 0 €/an + + +entreprise . charges . dirigeant: + titre: Charges déductibles dirigeant + description: Les montants liés à la rémunération du dirigeant qui sont déductibles d'impôt. + variations: + - si: imposition . IS + alors: dirigeant . rémunération . totale + # Note : le cas de dirigeant AS à l'IR n'est pas géré + # - si: dirigeant . assimilé salarié + # alors: 0€/an + - sinon: # TNS dans entreprise à l'IR + valeur: dirigeant . indépendant . cotisations et contributions + abattement: dirigeant . indépendant . cotisations et contributions . non déductibles + entreprise . ACRE: description: >- L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une @@ -492,7 +582,11 @@ entreprise . ACRE: - entreprise . durée d'activité < 3 ans - entreprise . date de création < 04/2020 - entreprise . durée d'activité . en début d'année < 1 an - par défaut: + par défaut: ACRE par défaut + note: Les auto-entreprises crées entre le 1er janvier et le 31 décembre 2019 bénéficient d'un dispositif plus favorable, actif pendant 3 années. + +entreprise . ACRE par défaut: + formule: variations: - si: toutes ces conditions: @@ -504,9 +598,6 @@ entreprise . ACRE: alors: non - sinon: oui - note: Les auto-entreprises crées entre le 1er janvier et le 31 décembre 2019 bénéficient d'un dispositif plus favorable, actif pendant 3 années. - - entreprise . effectif: unité: employé formule: diff --git a/modele-social/règles/impôt.yaml b/modele-social/règles/impôt.yaml index 16687c12c..b5eb55141 100644 --- a/modele-social/règles/impôt.yaml +++ b/modele-social/règles/impôt.yaml @@ -68,11 +68,12 @@ impôt . méthode de calcul . prélèvement à la source: impôt . revenu imposable: description: | C'est le revenu à prendre en compte pour calculer l'impôt avec un taux moyen d'imposition (neutre ou personnalisé). - somme: - - contrat salarié . rémunération . net imposable - - dirigeant . indépendant . résultat fiscal - - dirigeant . auto-entrepreneur . impôt . revenu imposable - abattement: abattement contrat court + variations: + - si: dirigeant + alors: dirigeant . rémunération . imposable + - sinon: + valeur: contrat salarié . rémunération . net imposable + abattement: abattement contrat court impôt . revenu imposable . abattement contrat court: description: Lorsque la durée d'un contrat de travail est inférieure à 2 mois, il est possible d'appliquer un abattement pour diminuer le montant du prélèvement à la source. @@ -251,27 +252,6 @@ impôt . taux personnalisé: - votre espace personnel [impots.gouv.fr](https://impots.gouv.fr) unité: '%' -revenus net de cotisations: - résumé: Avant impôt - unité: €/an - question: Quel revenu avant impôt voulez-vous toucher ? - description: | - Il s'agit du revenu net de cotisations et de charges, avant le paiement de l'impôt sur le revenu. - formule: - somme: - - contrat salarié . rémunération . net - - dirigeant . indépendant . revenu net de cotisations - - dirigeant . auto-entrepreneur . net de cotisations - -revenu net après impôt: - unité: €/an - résumé: Disponible sur votre compte en banque - question: Quel revenu voulez-vous toucher ? - identifiant court: net-apres-impot - description: | - Il s'agit du revenu net de charges, cotisations et d'impôts. - Autrement dit, c'est ce que vous gagnez à la fin sur votre compte en banque. - formule: revenus net de cotisations - impôt # TODO: "foyer fiscal" should be in its own top level namespace, but we put it # in the "impôt" namespace to have a better questions ordering @@ -364,28 +344,29 @@ impôt . foyer fiscal . revenu imposable: formule: somme: - revenu d'activité abattu - - dirigeant . auto-entrepreneur . impôt . revenu imposable - - valeur: dirigeant . indépendant . résultat fiscal - applicable si: entreprise . imposition . IR + - applicable si: entreprise . imposition . IR + valeur: dirigeant . rémunération . imposable - autres revenus imposables impôt . foyer fiscal . revenu imposable . revenu d'activité abattu: - description: Dans le cas général, l'impôt est calculé après l'application d'un abattement forfaitaire fixe. Chacun peut néanmoins opter pour la déclaration de ses *frais réels*, qui viendront remplacer ce forfait par défaut. - formule: - valeur [ref assiette]: - somme: - - contrat salarié . rémunération . net imposable - - valeur: dirigeant . indépendant . résultat fiscal - applicable si: entreprise . imposition . IS - abattement: - valeur: 10% * assiette - # A VÉRIFIER: calculé à la main en revalorisant le taux 2020 - # HISTORIQUE 2020: 12627€ - # 12627€ × (1 + 0,2%) - plafond: 12652 €/an - # HISTORIQUE 2020: 441€ - # 441€ × (1 + 0,2%) - plancher: 442 €/an + description: | + Dans le cas général, l'impôt est calculé après l'application d'un abattement forfaitaire fixe. Chacun peut néanmoins opter pour la déclaration de ses *frais réels*, qui viendront remplacer ce forfait par défaut. + valeur: + nom: assiette + variations: + - si: dirigeant = non + alors: contrat salarié . rémunération . net imposable + - si: entreprise . imposition = 'IS' + alors: dirigeant . rémunération . imposable + abattement: + valeur: 10% * assiette + # A VÉRIFIER: calculé à la main en revalorisant le taux 2020 + # HISTORIQUE 2020: 12627€ + # 12627€ × (1 + 0,2%) + plafond: 12652 €/an + # HISTORIQUE 2020: 441€ + # 441€ × (1 + 0,2%) + plancher: 442 €/an références: Frais professionnels - forfait ou frais réels: https://www.service-public.fr/particuliers/vosdroits/F1989 diff --git a/modele-social/règles/profession-libérale.yaml b/modele-social/règles/profession-libérale.yaml index 41d7a047d..87d6ca6e0 100644 --- a/modele-social/règles/profession-libérale.yaml +++ b/modele-social/règles/profession-libérale.yaml @@ -2,6 +2,7 @@ dirigeant . indépendant . PL: titre: Profession libérale applicable si: entreprise . activité = 'libérale' + rend non applicable: entreprise . activité . mixte formule: oui dirigeant . indépendant . PL . métier: diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index 8f120fda2..2dab61f0a 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -1285,9 +1285,8 @@ contrat salarié . rémunération . brut de base: - rémunération . net - rémunération . net après impôt - équivalent temps plein - - dirigeant . rémunération totale - - entreprise . chiffre d'affaires - - entreprise . chiffre d'affaires minimum + - dirigeant . rémunération . totale + références: Le salaire. Fixation et paiement: http://travail-emploi.gouv.fr/droit-du-travail/remuneration-et-participation-financiere/remuneration/article/le-salaire-fixation-et-paiement diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js index 427db3b6a..48eb14969 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js @@ -24,7 +24,7 @@ describe('Simulateurs', function () { it('should display a result when entering a value in any of the currency input', () => { cy.contains('€/an').click() - if (['indépendant', 'dirigeant-sasu'].includes(simulateur)) { + if (['indépendant', 'profession-liberale'].includes(simulateur)) { cy.get(chargeInputSelector).type(1000) } cy.get(inputSelector).each((testedInput, i) => { @@ -45,7 +45,7 @@ describe('Simulateurs', function () { cy.contains('€/an').click() cy.wait(200) cy.get(inputSelector).first().type('{selectall}12000') - if (['indépendant', 'dirigeant-sasu'].includes(simulateur)) { + if (['indépendant', 'profession-liberale'].includes(simulateur)) { cy.get(chargeInputSelector).type('{selectall}6000') } cy.wait(800) @@ -54,7 +54,7 @@ describe('Simulateurs', function () { .first() .invoke('val') .should('match', /1[\s]000/) - if (['indépendant', 'dirigeant-sasu'].includes(simulateur)) { + if (['indépendant', 'profession-liberale'].includes(simulateur)) { cy.get(chargeInputSelector).first().invoke('val').should('eq', '500') } cy.contains('€/an').click() diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index b7f4f9a69..98754b761 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -29,6 +29,7 @@ "@types/js-yaml": "^3.12.2", "@types/react": "^17.0.0", "@types/react-color": "^3.0.1", + "@types/react-helmet": "^6.1.0", "@types/react-dom": "^17.0.0", "@types/react-redux": "^7.1.11", "@types/react-router": "^5.1.2", @@ -62,7 +63,6 @@ "@react-pdf/renderer": "^1.6.10", "@rehooks/local-storage": "^2.1.1", "@sentry/browser": "5.15.5", - "@types/react-helmet": "^6.1.0", "classnames": "^2.2.5", "color-convert": "^1.9.2", "core-js": "^3.2.1", diff --git a/mon-entreprise/source/components/SchemeComparaison.tsx b/mon-entreprise/source/components/SchemeComparaison.tsx index 3744bbeaa..c0987bb04 100644 --- a/mon-entreprise/source/components/SchemeComparaison.tsx +++ b/mon-entreprise/source/components/SchemeComparaison.tsx @@ -5,8 +5,8 @@ import { } from 'Actions/companyStatusActions' import classnames from 'classnames' import Conversation from 'Components/conversation/Conversation' -import SeeAnswersButton from 'Components/conversation/SeeAnswersButton' import Value from 'Components/EngineValue' +import * as Animate from 'Components/ui/animate' import InfoBulle from 'Components/ui/InfoBulle' import revenusSVG from 'Images/revenus.svg' import { useCallback, useMemo, useState } from 'react' @@ -15,7 +15,10 @@ import { Trans } from 'react-i18next' import { useSelector } from 'react-redux' import { situationSelector } from 'Selectors/simulationSelectors' import dirigeantComparaison from '../pages/Simulateurs/configs/rémunération-dirigeant.yaml' +import SeeAnswersButton from './conversation/SeeAnswersButton' +import PeriodSwitch from './PeriodSwitch' import './SchemeComparaison.css' +import { SimulationGoal, SimulationGoals } from './SimulationGoals' import { useEngine } from './utils/EngineContext' import useSimulationConfig from './utils/useSimulationConfig' @@ -32,7 +35,7 @@ export default function SchemeComparaison({ const dispatch = useDispatchAndGoToNextQuestion() const engine = useEngine() const plafondAutoEntrepreneurDépassé = - engine.evaluate('dirigeant . auto-entrepreneur . seuils dépassés') + engine.evaluate("entreprise . chiffre d'affaires . seuil micro dépassé") .nodeValue === true const [showMore, setShowMore] = useState(false) @@ -45,7 +48,8 @@ export default function SchemeComparaison({ const situation = useSelector(situationSelector) const displayResult = - useSelector(situationSelector)['entreprise . charges'] != undefined + useSelector(situationSelector)['dirigeant . rémunération . totale'] != + undefined const assimiléEngine = useMemo( () => engine.shallowCopy().setSituation({ @@ -313,9 +317,54 @@ export default function SchemeComparaison({
    ) : ( -
    - - +
    + + + + + + {displayResult && ( + +
    + +

    + Vous pouvez consulter les différentes estimations + dans le tableau ci-dessous +

    + + + + } + /> +
    +
    + )}
    )}
    @@ -332,7 +381,7 @@ export default function SchemeComparaison({ engine={assimiléEngine} precision={0} unit="€/an" - expression="contrat salarié . rémunération . net" + expression="dirigeant . rémunération . nette" />
    @@ -340,7 +389,7 @@ export default function SchemeComparaison({ linkToRule={false} engine={indépendantEngine} precision={0} - expression="dirigeant . indépendant . revenu net de cotisations" + expression="dirigeant . rémunération . nette" />
    @@ -352,7 +401,7 @@ export default function SchemeComparaison({ precision={0} className={''} unit="€/an" - expression="dirigeant . auto-entrepreneur . net de cotisations" + expression="dirigeant . rémunération . nette" />
    diff --git a/mon-entreprise/source/components/SimulateurWarning.tsx b/mon-entreprise/source/components/SimulateurWarning.tsx index ab9c5230d..3b3f990f4 100644 --- a/mon-entreprise/source/components/SimulateurWarning.tsx +++ b/mon-entreprise/source/components/SimulateurWarning.tsx @@ -49,20 +49,12 @@ export default function SimulateurWarning({ )} - {simulateur == 'indépendant' && ( - -
  • - Le simulateur ne prend pas en compte les régimes micro-BNC et - micro-BIC. -
  • -
    - )} + {simulateur == 'profession-libérale' && (
  • Ce simulateur est à destination des professions libérales en BNC. - Il ne prend pas en compte les sociétés d'exercice libéral ni le - régime micro-BNC. + Il ne prend pas en compte les sociétés d'exercice libéral.
  • )} diff --git a/mon-entreprise/source/components/SimulationGoals.tsx b/mon-entreprise/source/components/SimulationGoals.tsx index 6d0fff9cd..3d4b475ba 100644 --- a/mon-entreprise/source/components/SimulationGoals.tsx +++ b/mon-entreprise/source/components/SimulationGoals.tsx @@ -63,6 +63,7 @@ type SimulationGoalProps = { appear?: boolean editable?: boolean boolean?: boolean + alwaysShow?: boolean onUpdateSituation?: ( name: DottedName, ...rest: Parameters @@ -75,6 +76,7 @@ export function SimulationGoal({ small = false, onUpdateSituation, appear = true, + alwaysShow = false, editable = true, boolean = false, //TODO : remove when type inference works in publicodes }: SimulationGoalProps) { @@ -99,10 +101,11 @@ export function SimulationGoal({ [dispatch, onUpdateSituation] ) if ( - isNotApplicable === true || - (!(dottedName in situation) && - evaluation.nodeValue === false && - !(dottedName in evaluation.missingVariables)) + !alwaysShow && + (isNotApplicable === true || + (!(dottedName in situation) && + evaluation.nodeValue === false && + !(dottedName in evaluation.missingVariables))) ) { return null } diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 4f892ebe2..9f9471733 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -28,13 +28,13 @@ export default function IndépendantExplanation() { - +

    Répartition de la rémunération totale

    (!whitelist.length || whitelist.some((name) => step.startsWith(name))) && - (!blacklist.length || !blacklist.some((name) => step.startsWith(name))) + (!blacklist.length || !blacklist.some((name) => step === name)) ) const lastStep = last(answeredQuestions) diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index cda926826..b85d65773 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -4244,6 +4244,8 @@ dirigeant . assimilé salarié: alors au régime général de la sécurité sociale, avec quelques contraintes cependant. Par exemple, ils ne cotisent pas au chômage, et n'y ont donc pas droit. + note.en: '[automatic] We do not manage the case of SAS(U) with IR for the moment' + note.fr: Nous ne gérons pas le cas des SAS(U) à l'IR pour l'instant titre.en: Assimilated salaried titre.fr: assimilé salarié dirigeant . assimilé salarié . réduction ACRE: @@ -4276,6 +4278,13 @@ dirigeant . auto-entrepreneur: cotisations sociales par un prélèvement unique mensuel. titre.en: auto-entrepreneur titre.fr: auto-entrepreneur +dirigeant . auto-entrepreneur . chiffre d'affaires: + question.en: '[automatic] What is your turnover?' + question.fr: Quel est votre chiffre d'affaires ? + résumé.en: '[automatic] Total revenue (excluding tax)' + résumé.fr: Montant total des recettes (hors taxe) + titre.en: '[automatic] revenues' + titre.fr: chiffre d'affaires dirigeant . auto-entrepreneur . cotisations et contributions: titre.en: Contributions titre.fr: cotisations et contributions @@ -4467,10 +4476,9 @@ dirigeant . auto-entrepreneur . net après impôt: titre.en: net income after tax titre.fr: revenu net après impôt dirigeant . auto-entrepreneur . net de cotisations: - description.en: - This is the income net of contributions and expenses, before the - payment of income tax. - description.fr: Il s'agit du revenu net de cotisations et de charges, avant le + description.en: '[automatic] This is the income after deductions for + contributions, before payment of income tax.' + description.fr: Il s'agit du revenu après déductions des cotisations, avant le paiement de l'impôt sur le revenu. question.en: What pre-tax income do you want to receive? question.fr: Quel revenu avant impôt voulez-vous toucher ? @@ -4492,94 +4500,6 @@ dirigeant . auto-entrepreneur . notification calcul ACRE annuel: d'acre sur une meme année. titre.en: '[automatic] notification calculation ACRE annual calculation' titre.fr: notification calcul ACRE annuel -dirigeant . auto-entrepreneur . seuils dépassés: - description.en: > - [automatic] The status of micro-entrepreneur applies as long as the annual - turnover (actually received during the calendar year) does not exceed the - thresholds of the micro-enterprise tax regime. - - - If the limit is exceeded **in two consecutive years**, the auto-entrepreneur automatically switches to the [sole proprietorship] (/simulators/independent) scheme. - - - At the end of the first year of activity, the turnover is prorated according to the duration of activity. - - - For example: - - > A taxpayer sets up a business on August 1st and collects revenues excluding tax of `50,000 €` during the five months of activity of its first calendar year of operation. - - > The revenues of this first calendar year are adjusted *prorata temporis* to compare them to the ceiling : - - > - - > `50 000€ x (365/153) = 119 280 €` - - - - Expenses are not deductible for the calculation of the ceiling (as for the calculation of contributions). - - - - ### Multi-activity - - - When an entrepreneur carries out 2 activities within his micro-enterprise, the - - The turnover threshold to be respected is not doubled. At - - effect the exercise of several activities with the same micro-enterprise - - does not increase the thresholds. - description.fr: > - Le statut de micro-entrepreneur s'applique tant que le chiffre d'affaires - annuel (effectivement encaissé au cours de l'année civile) ne dépasse pas - les seuils du régime fiscal de la micro-entreprise. - - - En cas de dépassement **sur deux années consécutives**, l'auto-entrepreneur bascule automatiquement dans le régime de [l'entreprise individuelle](/simulateurs/indépendant). - - - À la fin de la première année d'activité, le CA est proratisé par rapport à la durée d'activité. - - - Exemple : - - > Un contribuable crée une entreprise le 1er août et encaisse des recettes HT de `50 000 €` au cours des cinq mois d'activité de sa première année civile d'exploitation. - - > Les recettes de cette première année civile sont ajustées *prorata temporis* pour les comparer au plafond : - - > - - > `50 000€ x (365/153) = 119 280 €` - - - - Les charges ne sont pas déductibles pour le calcul du plafond (comme pour le calcul des cotisations) - - - - ### Multi-activité - - - Lorsqu'un entrepreneur exerce 2 activités au sein de sa micro-entreprise, le - - seuil de chiffre d’affaires à respecter n’est pas pour autant doublé. En - - effet l'exercice de plusieurs activités avec la même micro-entreprise - - n’augmente pas les seuils. - titre.en: '[automatic] exceeded thresholds' - titre.fr: seuils dépassés -dirigeant . auto-entrepreneur . seuils dépassés . notification: - description.en: '[automatic] The annual turnover threshold for the - self-employment plan is exceeded. Read - more](/documentation/manager/self-entrepreneur/exceeded thresholds)' - description.fr: Le seuil annuel de chiffre d'affaires pour le régime de - l'auto-entreprise est dépassé. [En savoir - plus](/documentation/dirigeant/auto‑entrepreneur/seuils-dépassés) - titre.en: '[automatic] notification' - titre.fr: notification dirigeant . indépendant: titre.en: indépendant titre.fr: indépendant @@ -5780,33 +5700,34 @@ dirigeant . indépendant . assiette des cotisations: titre.fr: assiette des cotisations dirigeant . indépendant . avertissement base forfaitaire: description.en: > - [automatic] When you start your business, your professional income + [automatic] When you start your activity, your professional income is not + known. - not being known, the dues and contributions of the first two + contributions for the first two years are calculated on a flat-rate basis. - years are calculated on a flat-rate basis. + are calculated on a flat-rate basis. - This base amounts to 19% of the annual Social Security ceiling for + This base amounts to 19% of the annual Social Security ceiling for the first and second year of activity. - in the first and second year of operation. + the first and second years of activity. - There is an adjustment in the second year based on the + There is an adjustment in the second year based on the actual income - actual income reported for the previous year. In most cases, + income declared for the previous year. In most cases, - the amount of provisional contributions will be significantly higher. + the amount of the provisional contributions will be significantly higher. - This simulator calculates the **cruising speed** contributions (after + This simulator calculates the contributions for the **cruise regime** (after - regularization). It therefore allows you to anticipate the amount of this accrual/deferral. + regularisation). It therefore enables you to anticipate the amount of this adjustment - and plan your cash flow accordingly. + and to plan your cash flow accordingly. description.fr: > Lorsque vous commencez votre activité, vos revenus professionnels @@ -5835,7 +5756,7 @@ dirigeant . indépendant . avertissement base forfaitaire: régularisation). Il vous permet donc d'anticiper le montant de cette régularisation et de plannifier votre trésorerie en conséquence. - titre.en: '[automatic] flat-rate warning' + titre.en: '[automatic] warning flat rate basis' titre.fr: avertissement base forfaitaire dirigeant . indépendant . conjoint collaborateur: description.en: > @@ -5966,17 +5887,6 @@ dirigeant . indépendant . contrats madelin: ("contrats Madelins") titre.en: Madelin Contracts titre.fr: Contrats Madelin -dirigeant . indépendant . contrats madelin . contrôle montant charges: - description.en: - '[automatic] The amount of all the contributions to your Madelin - contracts must be included in your operating expenses, but you have - indicated an amount of contributions greater than the expenses.' - description.fr: - Le montant de l'ensemble des cotisations à vos contrats Madelin - doit être inclus dans vos charges de fonctionnement, or vous avez indiqué un - montant de cotisations supérieur aux charges. - titre.en: '[automatic] expense control' - titre.fr: contrôle montant charges dirigeant . indépendant . contrats madelin . montant: titre.en: Sum of subscriptions to Madelin contracts titre.fr: Somme des cotisations à contrats Madelin @@ -6044,9 +5954,14 @@ dirigeant . indépendant . cotisations et contributions: compulsory contributions and contributions. + + + This amount includes the "covid" contribution reduction in 2020. description.fr: | C'est le montant total dû par l'indépendant au titre des cotisations et contributions obligatoires. + + Ce montant inclut la réduction de cotisation "covid" en 2020. note.en: | [automatic] Unlike contributions, contributions are not reintroduced for the calculation of the CSG/CRDS. They also do not benefit from the @@ -6151,7 +6066,7 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ACRE: titre.en: ACRE titre.fr: ACRE ? dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . PSS proratisé -: titre.en: Prorated PSS +: titre.en: '[automatic] Prorated PSS' titre.fr: PSS proratisé ? dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . prorata sur l'année : description.en: > @@ -6294,6 +6209,9 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux RSA: cotisation maladie en fonction du revenu déclaré. titre.en: '[automatic] Illness (tax domicile abroad)' titre.fr: Maladie (domiciliation fiscale à l'étranger) +dirigeant . indépendant . cotisations et contributions . non déductibles: + titre.en: '[automatic] Non-tax-deductible contributions' + titre.fr: Cotisations et contributions non déductibles fiscalement ? dirigeant . indépendant . cotisations et contributions . retraite complémentaire : titre.en: '[automatic] retirement supplement' titre.fr: retraite complémentaire @@ -6303,42 +6221,11 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux RSA: dirigeant . indépendant . cotisations et contributions . retraite de base: titre.en: '[automatic] basic retirement' titre.fr: retraite de base -dirigeant . indépendant . revenu net de cotisations: - description.en: - This is the income net of contributions and expenses, before the - payment of income tax. - description.fr: Il s'agit du revenu net de cotisations et de charges, avant le - paiement de l'impôt sur le revenu. - question.en: What pre-tax income do you want to receive? - question.fr: Quel revenu avant impôt voulez-vous toucher ? - résumé.en: Before taxes - résumé.fr: Avant déduction de l'impôt sur le revenu - titre.en: net contribution income - titre.fr: revenu net de cotisations dirigeant . indépendant . revenu professionnel: - description.en: > - [automatic] It is the net income of deductible contributions of the - self-employed person, which is used as the basis for the calculation of - contributions for self-employed persons. - - - Attention: **our calculation is made at cruising speed**: - - the self-employed person who is starting out will pay a relatively small package of social security contributions for the first 2 years. He will then have to regularise this situation in relation to the income he has actually received. - - - Therefore, this calculation should be seen as "the amount that will have to be paid out anyway" in the short term after 2 years of exercise. - description.fr: > - C'est le revenu net de cotisations déductibles du travailleur indépendant, - qui sert de base au calcul des cotisations pour les indépendants. - - - Attention : **notre calcul est fait au régime de croisière**: - - l'indépendant qui se lance paiera pendant ses 2 premières années un forfait relativement réduit de cotisations sociales. Il devra ensuite régulariser cette situation par rapport au revenu qu'il a vraiment perçu. - - - Il faut donc voir ce calcul comme *le montant qui devra de toute façon être payé* à court terme après 2 ans d'exercice. + description.en: + "[automatic] remuneration of the manager under the self-employed + persons' scheme" + description.fr: rémunération du dirigeant au régime des indépendant titre.en: professional income titre.fr: revenu professionnel dirigeant . indépendant . revenus étrangers: @@ -6369,32 +6256,53 @@ dirigeant . indépendant . revenus étrangers . montant: question.fr: Quel est leur montant ? titre.en: foreign income titre.fr: revenus perçu à l'étranger -dirigeant . indépendant . résultat fiscal: - description.en: Taxable net, amount on which tax has to be calculated. - description.fr: Il s'agit du net imposable, assiette sur laquelle l'impôt est calculé. - résumé.en: Base for tax calculation - résumé.fr: Assiette du calcul de l'impôt - titre.en: fiscal earnings - titre.fr: résultat fiscal -dirigeant . rémunération totale: - description.en: >- - This is what the company spends in total for the director income. This - "super gross" remuneration includes all social security contributions to be - paid. - - It can also be considered as the monetary value of the director's work. - description.fr: >- +dirigeant . rémunération: + titre.en: '[automatic] compensation' + titre.fr: rémunération +dirigeant . rémunération . cotisations: + titre.en: '[automatic] contributions' + titre.fr: cotisations +dirigeant . rémunération . imposable: + titre.en: '[automatic] Taxable remuneration' + titre.fr: Rémunération imposable +dirigeant . rémunération . impôt: + titre.en: '[automatic] tax' + titre.fr: impôt +dirigeant . rémunération . nette: + question.en: '[automatic] What is your net pay?' + question.fr: Quelle est votre rémunération nette ? + résumé.en: '[automatic] After deduction of contributions and expenses' + résumé.fr: Après déduction des cotisations, contributions et charges + titre.en: '[automatic] net pay' + titre.fr: rémunération nette +dirigeant . rémunération . nette après impôt: + description.en: '[automatic] The net income after deduction of income tax and + social security contributions.' + description.fr: Le revenu net après déduction de l'impôt sur le revenu et des + cotisations sociales. + question.en: '[automatic] What is the desired net income after tax?' + question.fr: Quel est le revenu net après impôt souhaité ? + résumé.en: '[automatic] What you get from this activity' + résumé.fr: Ce que vous rapporte cette activité + titre.en: '[automatic] After-tax compensation' + titre.fr: Rémunération après impôt +dirigeant . rémunération . totale: + description.en: > + [automatic] This is what the company spends in total for the remuneration of + the manager. This "super gross" remuneration includes all social security + contributions to be paid. It can also be considered as the monetary value of + the executive's work. + description.fr: > C'est ce que l'entreprise dépense en tout pour la rémunération du dirigeant. Cette rémunération "super-brute" inclut toutes les cotisations sociales à - payer. - - On peut aussi considérer que c'est la valeur monétaire du travail du dirigeant. - question.en: How much do you think you will make available for your remuneration? - question.fr: Quel montant pensez-vous dégager pour votre rémunération ? - résumé.en: Spent by the company - résumé.fr: Dépensé par l'entreprise - titre.en: Director total income - titre.fr: rémunération totale + payer. On peut aussi considérer que c'est la valeur monétaire du travail du + dirigeant. + question.en: '[automatic] What is the total amount you expect to earn in compensation?' + question.fr: Quel montant total pensez-vous dégager pour votre rémunération ? + résumé.en: '[automatic] Including contributions' + résumé.fr: Incluant les cotisations et contributions + titre.en: '[automatic] Total compensation' + titre.fr: Rémunération totale entreprise: description.en: The contract binds a company and an employee description.fr: | @@ -6466,7 +6374,9 @@ entreprise . ACRE: question.fr: Votre entreprise bénéficie-t-elle de l'ACRE ? titre.en: ACRE titre.fr: ACRE - +entreprise . ACRE par défaut: + titre.en: '[automatic] Default ACRE' + titre.fr: ACRE par défaut entreprise . activité: description.en: '[automatic] Your type of activity will determine a large part of the contribution, contribution and tax calculations.' @@ -6690,57 +6600,30 @@ entreprise . association non lucrative: question.fr: S'agit-il d'une association à but non lucratif ? titre.en: non-profit organisation titre.fr: association non lucrative -entreprise . bénéfice: - résumé.en: '[automatic] Taxable for corporate income tax purposes' - résumé.fr: Imposable à l'impôt sur les sociétés - titre.en: '[automatic] Profit for the year' - titre.fr: Bénéfice de l'exercice -entreprise . bénéfice . information sur le report de déficit: - description.en: > - [automatic] Deficits incurred in one year can be carried forward to - subsequent years (carry-forward), or carried back to the previous year only - (carry-back). - - - [More info on service-public.fr](https://www.service-public.fr/professionnels-entreprises/vosdroits/F23628) - description.fr: > - Les déficits subits au cours d'un exercice peuvent être reportés sur les - exercices suivants (report en avant), ou sur le seul exercice précédent - (report en arrière). - - - [Plus d'infos sur service-public.fr](https://www.service-public.fr/professionnels-entreprises/vosdroits/F23628) - titre.en: '[automatic] deficit carry forward information' - titre.fr: information sur le report de déficit entreprise . charges: description.en: > - These are the company's expenses incurred in the company's interest, - excluding executive compensation. For companies and businesses excluding - auto-entrepreneur, these expenses are said to be deductible from the result: - the company will not pay any contributions or taxes on it. For the - self-entrepreneur, they are not deductible: the contractor pays them with - his salary staff net of contributions and income. + [automatic] + + These are the expenses of the company incurred in the interest of the company, excluding the remuneration of the director. For companies and businesses other than auto-entrepreneurs, these expenses are said to be deductible from the result: the company will not pay any contributions or taxes on them. For the auto-entrepreneur, they are not deductible from the turnover. - We do not yet process VAT: charges are to be entered excluding tax. + We do not yet deal with VAT: the expenses are to be entered without tax (except for self-employed entrepreneurs who are exempt from VAT) - For example, loads can be: + For example, the expenses can be : - purchase of raw materials for a production activity - purchase of products for resale, for a commercial activity - - meal costs: the supplement over the cost of a meal at home - - - Madelin contracts subscriptions + - meal expenses: the extra cost of a meal at home - Attention: the purchase of a computer at 1000€ is not a charge, but a capital asset: it is an asset that will benefit the company for a period of for several years. Each year, a portion of this asset is and this deductible depreciation can be included in this calculation, for example 200€ per year for 5 years. + Attention: the purchase of a computer at 1000€ is not an expense, but a fixed asset: it is an asset that will benefit the company for several years. Each year, a part of this fixed asset is depreciated, and this deductible depreciation can be integrated in this calculation, for example 200€ per year for 5 years. - On the other hand, a mobile phone for less than 500€ can be considered as a charge without immobilization. + On the other hand, a mobile phone costing less than €500 can be treated as an expense with no fixed asset. description.fr: > Ce sont les dépenses de l'entreprise engagées dans l'intérêt de celle-ci, hors rémunération du dirigeant. Pour les sociétés et entreprises hors auto-entrepreneur, ces charges sont dites déductibles du résultat : l'entreprise ne paiera pas de cotisations ou impôt dessus. Pour l'auto-entrepreneur, elles ne sont pas déductibles du chiffre d'affaires encaissé. @@ -6758,8 +6641,6 @@ entreprise . charges: - frais de repas : le supplément par rapport au coût d'un repas à domicile - - les cotisations aux contrats Madelin - Attention : l'achat d'un ordinateur à 1000€ n'est pas une charge, mais une immobilisation : c'est un bien qui va profiter à l'entreprise pendant plusieurs années. Chaque année, une partie de cette immobilisation est amortie, et cet amortissement déductible peut être intégré dans ce calcul, par exemple 200€ par an pendant 5 ans. @@ -6769,11 +6650,16 @@ entreprise . charges: question.fr: Quelles sont les charges de l'entreprise ? résumé.en: All the expenses necessary for the company" résumé.fr: Toutes les dépenses nécessaires à l'entreprise - titre.en: expenses - titre.fr: charges de fonctionnement -entreprise . charges dont rémunération dirigeant: - titre.en: expenses of which executive compensation - titre.fr: charges dont rémunération dirigeant + titre.en: '[automatic] expenses (excluding management remuneration)' + titre.fr: charges (hors rémunération dirigeant) +entreprise . charges . dirigeant: + description.en: + '[automatic] Amounts related to executive compensation that are + tax deductible.' + description.fr: Les montants liés à la rémunération du dirigeant qui sont + déductibles d'impôt. + titre.en: '[automatic] Deductible expenses for managers' + titre.fr: Charges déductibles dirigeant entreprise . chiffre d'affaires: question.en: What is your expected turnover ? question.fr: Quel est votre chiffre d'affaires envisagé ? @@ -6838,8 +6724,8 @@ entreprise . chiffre d'affaires . service: description.fr: | Il s’agit de toute opération ne comportant pas de transfert de propriété de biens corporels (c'est-à-dire ayant une existence matérielle) - titre.en: '[automatic] service' - titre.fr: service + titre.en: '[automatic] Turnover from services' + titre.fr: Chiffre d'affaires de prestation de service entreprise . chiffre d'affaires . service BIC: description.en: > [automatic] This is any transaction that does not involve a transfer of @@ -6903,6 +6789,85 @@ entreprise . chiffre d'affaires . service BNC: résumé.fr: Chiffre d'affaires hors taxe titre.en: '[automatic] Other services and liberal activities (BNC)' titre.fr: Autres prestations de service et activités libérales (BNC) +entreprise . chiffre d'affaires . seuil micro dépassé: + description.en: > + [automatic] The status of micro-enterprise applies as long as the annual + turnover (actually received during the calendar year) does not exceed the + thresholds of the micro-enterprise tax regime. + + + If the thresholds are exceeded **over two consecutive years**, the company automatically switches to the [sole proprietorship](/simulator/self-employed) regime. + + + At the end of the first year of activity, the turnover is prorated according to the duration of activity. + + + Example: + + > A taxpayer sets up a business on August 1 and collects revenues (excluding VAT) of `50,000` during the five months of activity of his first calendar year of operation. + + The receipts of this first calendar year are adjusted *prorata temporis* to compare them to the ceiling: + + > + + > `50 000€ x (365/153) = 119 280 €` + + + + Charges are not deductible for the calculation of the ceiling (as for the calculation of the contributions) + + + + Multi-activity + + + When an entrepreneur carries out 2 activities within his micro-enterprise, the turnover + + turnover threshold is not doubled. In + + Indeed, the exercise of several activities with the same micro-enterprise + + does not increase the thresholds. + description.fr: > + Le statut de micro-entreprise s'applique tant que le chiffre d'affaires + annuel (effectivement encaissé au cours de l'année civile) ne dépasse pas + les seuils du régime fiscal de la micro-entreprise. + + + En cas de dépassement **sur deux années consécutives**, l'entreprise bascule automatiquement dans le régime de [l'entreprise individuelle](/simulateurs/indépendant). + + + À la fin de la première année d'activité, le CA est proratisé par rapport à la durée d'activité. + + + Exemple : + + > Un contribuable crée une entreprise le 1er août et encaisse des recettes HT de `50 000 €` au cours des cinq mois d'activité de sa première année civile d'exploitation. + + > Les recettes de cette première année civile sont ajustées *prorata temporis* pour les comparer au plafond : + + > + + > `50 000€ x (365/153) = 119 280 €` + + + + Les charges ne sont pas déductibles pour le calcul du plafond (comme pour le calcul des cotisations) + + + + ### Multi-activité + + + Lorsqu'un entrepreneur exerce 2 activités au sein de sa micro-entreprise, le + + seuil de chiffre d’affaires à respecter n’est pas pour autant doublé. En + + effet l'exercice de plusieurs activités avec la même micro-entreprise + + n’augmente pas les seuils. + titre.en: '[automatic] micro threshold exceeded' + titre.fr: seuil micro dépassé entreprise . chiffre d'affaires . vente restauration hébergement: description.en: | [automatic] ### Sale of goods @@ -6934,16 +6899,6 @@ entreprise . chiffre d'affaires . vente restauration hébergement: résumé.fr: Chiffre d'affaires hors taxe titre.en: '[automatic] Sale of goods, catering, accommodation (BIC)' titre.fr: Vente de biens, restauration, hébergement (BIC) -entreprise . chiffre d'affaires minimum: - description.en: The minimum amount of sales (excluding tax) to be achieved to - reach the break-even point. - description.fr: - Le montant minimum des ventes (H.T) à réaliser pour atteindre le - seuil de rentabilité. - question.en: What is your minimum planned turnover? - question.fr: Quel est votre chiffre d'affaires minimum envisagé ? - titre.en: Minimum turnover - titre.fr: chiffre d'affaires minimum entreprise . date de création: description.en: > [automatic] The activity start date (or creation date) is set at the time of @@ -7099,10 +7054,10 @@ entreprise . exonérée de TVA: titre.fr: exonérée de TVA entreprise . imposition: description.en: > - [automatic] The entrepreneur can choose one of the two systems for taxing - the profits of his activity: + [automatic] The entrepreneur can opt for one of two tax regimes for the + profits of his or her business: - - income tax, where profits are declared on the personal income tax return and taxed according to a progressive tax scale. + - income tax, where profits are declared on the personal income tax return and taxed on a progressive scale - corporate income tax, where profits are declared in the name of the company description.fr: > @@ -7117,35 +7072,85 @@ entreprise . imposition: titre.en: '[automatic] taxation' titre.fr: imposition entreprise . imposition . IR: - titre.en: '[automatic] To income tax' - titre.fr: À l'impôt sur le revenu + titre.en: '[automatic] Income tax' + titre.fr: Impôt sur le revenu +entreprise . imposition . IR . information sur le report de déficit: + description.en: > + [automatic] When your taxable income is negative, it reduces the taxable + income of the tax household. + + A deficit can be deducted up to 6 years after its realization. + + + See detailed tax rules](https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301) + description.fr: > + Lorsque votre résultat fiscal est négatif, ce dernier vient réduire le + revenu imposables du foyer fiscal. + + Un déficit peut être imputé jusqu'à 6 ans après sa réalisation. + + + [Voir les règles fiscales détaillées](https://bofip.impots.gouv.fr/bofip/2003-PGP.html/identifiant%3DBOI-BIC-DEF-20-10-20170301) + titre.en: '[automatic] information on deficit carryover' + titre.fr: information sur le report de déficit +entreprise . imposition . IR . micro-fiscal: + description.en: > + [automatic] With the micro tax system, the deductible expenses are estimated + as a percentage of the turnover. + + This percentage depends on the type of activity. + + + This option allows you to simplify your accounting, and can be advantageous in terms of income if your operating costs are low. + description.fr: > + Avec le régime micro fiscal, les charges déductible sont estimées + forfaitairement, comme un pourcentage du chiffre d'affaires. + + Ce pourcentage dépend du type d'activité. + + + Cette option permet de simplifier votre comptabilité, et peut-être avantageuse en terme de revenu dans le cas où vos charges de fonctionnement sont faibles. + question.en: '[automatic] Have you opted for the micro-tax system?' + question.fr: Avez-vous opté pour le régime micro-fiscal ? + titre.en: '[automatic] micro-tax' + titre.fr: micro-fiscal +entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés: + description.en: '[automatic] The annual turnover threshold for the micro-tax + regime is exceeded. Learn + more](/documentation/company/turnover/threshold-micro-tax-exceeded)' + description.fr: Le seuil annuel de chiffre d'affaires pour le régime + micro-fiscal est dépassé. [En savoir + plus](/documentation/entreprise/chiffre-d'affaires/seuil-micro-dépassé) + titre.en: '[automatic] threshold alert exceeded' + titre.fr: alerte seuil dépassés +entreprise . imposition . IR . micro-fiscal . revenu abattu: + description.en: > + [automatic] The micro-entrepreneur is exempted from drawing up a + professional declaration of profits under the BNC or BIC heading. + + + All they have to do is enter the annual gross turnover (BIC) or revenue (BNC) in the supplementary income tax return (n°2042-C Pro). + description.fr: > + Le micro-entrepreneur est dispensé d'établir une déclaration professionnelle + de bénéfices au titre des BNC ou BIC. + + + Il lui suffit de porter dans la déclaration complémentaire de revenu (n°2042-C Pro) le montant annuel du chiffre d'affaires brut (BIC) ou des recettes (BNC). + titre.en: '[automatic] flat-rate micro-tax deduction' + titre.fr: abattement forfaitaire micro-fiscal entreprise . imposition . IS: - titre.en: '[automatic] To corporate tax' - titre.fr: À l'impôt sur les sociétés -entreprise . imposition . IS . notification IS non intégré: - description.en: > - [automatic] This simulator does not include corporate taxes or the taxation - of - - dividends. The "Corporate Tax" option is only used in the following cases - - income tax calculation. - description.fr: | - Ce simulateur n'intègre pas l'impôts sur les sociétés ni la fiscalité des - dividendes. L'option "Impôt sur les Sociétés" est uniquement utilisée dans - le calcul de l'impôt sur le revenu. - titre.en: '[automatic] non-integrated IS notification' - titre.fr: notification IS non intégré -entreprise . impôt sur les sociétés: - titre.en: corporate income tax + titre.en: '[automatic] Corporate income tax' + titre.fr: Impôt sur les sociétés +entreprise . imposition . IS . impôt sur les sociétés: + titre.en: '[automatic] corporate tax' titre.fr: impôt sur les sociétés -entreprise . impôt sur les sociétés . contribution sociale: +entreprise . imposition . IS . impôt sur les sociétés . contribution sociale: description.en: > - [automatic] The social contribution on profits is a tax separate from the - corporate tax. Its amount is not deductible from profits. + [automatic] The social contribution on profits is a separate tax from the + corporate tax. Its amount is not deductible from the results. - The tax base benefits from a significant reduction, and only companies making more than EUR 2,3 million in profits are concerned by this contribution. + The tax base benefits from a significant deduction, and only companies with a profit of more than 2.3 million euros are concerned by this contribution. description.fr: > La contribution sociale sur les bénéfices est un impôt distinct de l’impôt sur les sociétés. Son montant n’est pas déductible des résultats. @@ -7154,26 +7159,47 @@ entreprise . impôt sur les sociétés . contribution sociale: L’assiette bénéficie d’un abattement important, et seules les entreprises réalisant plus de 2,3 millions d’euros de bénéfices sont concernées par cette contribution. titre.en: '[automatic] social contribution' titre.fr: contribution sociale -entreprise . impôt sur les sociétés . plafond taux réduit 1: +entreprise . imposition . IS . impôt sur les sociétés . plafond taux réduit 1: titre.en: '[automatic] ceiling reduced rate 1' titre.fr: plafond taux réduit 1 -entreprise . impôt sur les sociétés . plafond taux réduit 2: +entreprise . imposition . IS . impôt sur les sociétés . plafond taux réduit 2: titre.en: '[automatic] ceiling reduced rate 2' titre.fr: plafond taux réduit 2 -entreprise . impôt sur les sociétés . prorata temporis: +entreprise . imposition . IS . impôt sur les sociétés . prorata temporis: description.en: > - [automatic] When the duration of the fiscal year is not equal to one year, - we pro-rate the + [automatic] When the duration of the financial year is not equal to one + year, the ceilings used in the - ceilings used in the corporate tax scale. + the ceilings used in the corporate tax schedule. description.fr: | Lorsque la durée de l’exercice n'est pas égale à un an, on pro-ratise les plafonds utilisés dans le barème de l'impôt sur les sociétés. titre.en: '[automatic] prorata temporis' titre.fr: prorata temporis -entreprise . impôt sur les sociétés . éligible taux réduit: - titre.en: '[automatic] eligible reduced rate' +entreprise . imposition . IS . impôt sur les sociétés . éligible taux réduit: + titre.en: '[automatic] eligible for reduced rate' titre.fr: éligible taux réduit +entreprise . imposition . IS . information sur le report de déficit: + description.en: > + [automatic] Losses incurred during a fiscal year can be carried forward to + subsequent years (carry forward), or back to the previous year only (carry + back). + description.fr: > + Les déficits subits au cours d'un exercice peuvent être reportés sur les + exercices suivants (report en avant), ou sur le seul exercice précédent + (report en arrière). + titre.en: '[automatic] information on deficit carryover' + titre.fr: information sur le report de déficit +entreprise . imposition . IS . résultat imposable: + résumé.en: '[automatic] Taxable for corporate income tax purposes' + résumé.fr: Imposable à l'impôt sur les sociétés + titre.en: '[automatic] Result for the year' + titre.fr: Résultat de l'exercice +entreprise . imposition . IS . résultat net: + résumé.en: '[automatic] After deduction of expenses and corporate income tax' + résumé.fr: Après déduction des charges et de l'impôt sur les société + titre.en: '[automatic] net result' + titre.fr: résultat net entreprise . ratio alternants: description.en: > This fraction determines the additional contribution for learning for the @@ -7191,26 +7217,9 @@ entreprise . ratio alternants: suggestions.5%.fr: 5% titre.en: work-study employees ratio titre.fr: Fraction d'alternants -entreprise . rémunération du dirigeant: - description.en: > - This is the portion of revenue after expenses that is allocated to the - executive's compensation. The higher this share, the higher the executive's - compensation increases, and the lower the company's profit. - description.fr: > - C'est la part du chiffre d'affaires après charges qui est allouée à la - rémunération du dirigeant. Plus cette part est élevée, plus la rémunération - du dirigeant augmente, et plus le bénéfice de l'entreprise diminue. - question.en: How much of the after-charge revenue is allocated to the - executive's compensation? - question.fr: Quelle part du chiffre d'affaires après charge est allouée à la - rémunération du dirigeant ? - titre.en: executive compensation - titre.fr: rémunération du dirigeant -entreprise . résultat net: - résumé.en: What remains after corporate income tax - résumé.fr: Ce qu'il reste après impôt sur les sociétés - titre.en: net result - titre.fr: résultat net +entreprise . résultat fiscal: + titre.en: '[automatic] tax result' + titre.fr: résultat fiscal entreprise . taxe sur les salaires: description.en: '[automatic] When the amount of payroll tax is less than €1200/year, there is no need to make a declaration and the tax is not @@ -7351,14 +7360,14 @@ impôt . foyer fiscal . revenu imposable . autres revenus imposables: titre.en: '[automatic] other taxable income' titre.fr: autres revenus imposables impôt . foyer fiscal . revenu imposable . revenu d'activité abattu: - description.en: '[automatic] In the general case, the tax is calculated after - the application of a fixed lump-sum allowance. However, everyone can opt to - declare their "actual expenses", which will replace this default lump-sum - deduction.' - description.fr: Dans le cas général, l'impôt est calculé après l'application - d'un abattement forfaitaire fixe. Chacun peut néanmoins opter pour la - déclaration de ses *frais réels*, qui viendront remplacer ce forfait par - défaut. + description.en: > + [automatic] In the general case, the tax is calculated after the application + of a fixed abatement. However, everyone can opt to declare their *actual + expenses*, which will replace this default fixed allowance. + description.fr: > + Dans le cas général, l'impôt est calculé après l'application d'un abattement + forfaitaire fixe. Chacun peut néanmoins opter pour la déclaration de ses + *frais réels*, qui viendront remplacer ce forfait par défaut. titre.en: '[automatic] earned income slaughtered' titre.fr: revenu d'activité abattu impôt . foyer fiscal . situation de famille: @@ -8004,31 +8013,6 @@ période . jours ouvrés moyen par mois: période . semaines par mois: titre.en: week per month titre.fr: semaines par mois -revenu net après impôt: - description.en: | - This is the income net of contributions and taxes. - In other words, that's what you get in the end from your bank account. - description.fr: | - Il s'agit du revenu net de charges, cotisations et d'impôts. - Autrement dit, c'est ce que vous gagnez à la fin sur votre compte en banque. - question.en: What income do you want to receive? - question.fr: Quel revenu voulez-vous toucher ? - résumé.en: Paid into the bank account - résumé.fr: Disponible sur votre compte en banque - titre.en: Net income after tax - titre.fr: revenu net après impôt -revenus net de cotisations: - description.en: | - l'impôt sur le revenu. - description.fr: > - Il s'agit du revenu net de cotisations et de charges, avant le paiement de - l'impôt sur le revenu. - question.en: What pre-tax income do you want to earn? - question.fr: Quel revenu avant impôt voulez-vous toucher ? - résumé.en: Before tax - résumé.fr: Avant impôt - titre.en: net contribution income - titre.fr: revenus net de cotisations situation personnelle: titre.en: personal situation titre.fr: situation personnelle diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index c06e69152..592e9b5a1 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -37,13 +37,13 @@ export default function AideDéclarationIndépendant() { const setCurrentIncome = useCallback( (currentIncome) => { dispatch( - updateSituation('dirigeant . rémunération totale', currentIncome) + updateSituation('dirigeant . rémunération . totale', currentIncome) ) }, [dispatch, updateSituation] ) const displayForm = - engine.evaluate('dirigeant . rémunération totale').nodeValue !== null + engine.evaluate('dirigeant . rémunération . totale').nodeValue !== null return (
    @@ -102,7 +102,7 @@ export default function AideDéclarationIndépendant() { diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index b5753abe8..a7692f5b4 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -70,7 +70,7 @@ export default function AutoEntrepreneur() { diff --git a/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx index b318a6309..4f63ad610 100644 --- a/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx @@ -17,7 +17,13 @@ import { TrackPage } from '../../ATInternetTracking' const ISConfig = { 'unité par défaut': '€/an', - situation: {}, + situation: { + 'entreprise . imposition': "'IS'", + 'entreprise . imposition . IS . impôt sur les sociétés . éligible taux réduit': + 'oui', + "entreprise . chiffre d'affaires . franchise de TVA dépassée . notification": + 'non', + }, } as SimulationConfig export default function ISSimulation() { @@ -39,7 +45,7 @@ export default function ISSimulation() { - + @@ -89,7 +95,8 @@ function ExerciceDate() { function Explanations() { const situation = useSelector(situationSelector) - const showResult = situation['entreprise . bénéfice'] + const showResult = + situation['entreprise . imposition . IS . résultat imposable'] if (!showResult) { return } @@ -111,7 +118,7 @@ function Explanations() { diff --git a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx index a45d59f88..66ad1bd88 100644 --- a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx @@ -1,19 +1,128 @@ +import { updateSituation } from 'Actions/actions' +import { Condition } from 'Components/EngineValue' +import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' import Simulation from 'Components/Simulation' import IndépendantExplanation from 'Components/simulationExplanation/IndépendantExplanation' -export default function IndépendantSimulation() { - return ( - <> - - } /> - - ) -} +import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' +import { useEngine } from 'Components/utils/EngineContext' +import { DottedName } from 'modele-social' +import { useDispatch } from 'react-redux' + export function IndépendantPLSimulation() { return ( <> - } /> + }> + + + ) } + +export default function IndépendantSimulation() { + return ( + <> + + }> +
    * { + margin-top: 0.6rem; + } + justify-content: center; + + @media (min-width: 590px) { + justify-content: space-between; + } + `} + > + + +
    + +
    + + ) +} +function IndépendantSimulationGoals() { + return ( + + + + + + + + + + + + + + + + + + + + + + ) +} + +function ImpositionSwitch() { + const dispatch = useDispatch() + const engine = useEngine() + const currentImposition = engine.evaluate('entreprise . imposition').nodeValue + + return ( + + {(['IR', 'IS'] as const).map((imposition) => ( + + ))} + + ) +} diff --git a/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml b/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml index 47c0bebc7..9f9b1e028 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml @@ -1,8 +1,8 @@ objectifs: - - entreprise . chiffre d'affaires + - dirigeant . auto-entrepreneur . chiffre d'affaires - dirigeant . auto-entrepreneur . cotisations et contributions - dirigeant . auto-entrepreneur . net de cotisations - - dirigeant . auto-entrepreneur . net après impôt . impôt + - dirigeant . rémunération . impôt - dirigeant . auto-entrepreneur . net après impôt questions: diff --git a/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml b/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml index 7e3600e13..a7a642a2a 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml @@ -1,17 +1,10 @@ objectifs: - - icône: 👩‍💼 - nom: Mon revenu - objectifs: - - contrat salarié . rémunération . total - - contrat salarié . cotisations - - contrat salarié . rémunération . net - - impôt - - contrat salarié . rémunération . net après impôt - - icône: 🏢 - nom: Mon entreprise - objectifs: - - entreprise . charges - - entreprise . chiffre d'affaires minimum + - dirigeant . rémunération . totale + - contrat salarié . cotisations + - contrat salarié . rémunération . net + - impôt + - contrat salarié . rémunération . net après impôt + questions: à l'affiche: @@ -22,6 +15,7 @@ questions: liste noire: - entreprise . charges + - entreprise . imposition - entreprise . rémunération du dirigeant - entreprise . association non lucrative non prioritaires: diff --git a/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml b/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml index 7fe05b0fb..2921ca270 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml @@ -1,19 +1,9 @@ objectifs: - - icône: 👩‍💼 - nom: Mon revenu - objectifs: - - dirigeant . rémunération totale - - dirigeant . indépendant . cotisations et contributions - - dirigeant . indépendant . revenu net de cotisations - - dirigeant . indépendant . revenu professionnel - - impôt - - revenu net après impôt - - icône: 🏢 - nom: Mon entreprise - objectifs: - - entreprise . charges - - entreprise . chiffre d'affaires minimum - + - entreprise . chiffre d'affaires + - dirigeant . rémunération . totale + - dirigeant . rémunération . nette + - dirigeant . rémunération . nette après impôt + questions: à l'affiche: Type d'activité: entreprise . activité @@ -24,6 +14,9 @@ questions: Impôt sur le revenu: impôt . méthode de calcul liste noire: - entreprise . charges + - entreprise . imposition + - entreprise . exercice . début + - entreprise . exercice . fin liste: - entreprise - établissement diff --git a/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml b/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml index 184b8cd69..4e5237eb4 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml @@ -2,9 +2,9 @@ objectifs: - entreprise . chiffre d'affaires - entreprise . charges - dirigeant . indépendant . cotisations et contributions - - dirigeant . indépendant . revenu net de cotisations + - dirigeant . rémunération . nette - impôt - - revenu net après impôt + - dirigeant . rémunération . nette après impôt questions: liste noire: diff --git a/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml b/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml index 8277fe17d..388d0c00d 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml @@ -3,16 +3,16 @@ titre: | objectifs: - contrat salarié . rémunération . net - - dirigeant . indépendant . revenu net de cotisations + - dirigeant . rémunération . nette - dirigeant . auto-entrepreneur . net de cotisations - protection sociale . retraite - protection sociale . retraite . trimestres validés - protection sociale . santé . indemnités journalières questions: - liste: - - dirigeant . rémunération totale + liste noire: - entreprise . charges + liste: - entreprise . activité unité par défaut: €/an situation: diff --git a/mon-entreprise/test/cycles.test.js b/mon-entreprise/test/cycles.test.js index 057d7b28f..83ba3d309 100644 --- a/mon-entreprise/test/cycles.test.js +++ b/mon-entreprise/test/cycles.test.js @@ -26,7 +26,7 @@ describe('DottedNames graph', () => { .to.be.an('array') .of.length(1) - // Cycle doesn't occur in real life. Will fix in next PR. + // Cycle doesn't occur in real life. // ⬇️ entreprise . chiffre d'affaires // ⬇️ dirigeant . rémunération totale // ⬇️ entreprise . chiffre d'affaires diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index a1d2904d3..aca1496a3 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`calculate aide-déclaration-indépendant: ACRE 1`] = ` -"[9020,0] +"[9019,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -31,12 +31,12 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait `; exports[`calculate aide-déclaration-indépendant: RSA 1`] = ` -"[81,0] +"[82,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: RSA 2`] = ` -"[1020,0] +"[1021,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -56,7 +56,7 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = ` -"[13576,0] +"[13578,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -81,7 +81,7 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait `; exports[`calculate aide-déclaration-indépendant: international 1`] = ` -"[14609,0] +"[14610,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, impôt . domiciliation étranger non implémentée" `; @@ -127,16 +127,16 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` "[1041,0] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` "[1041,0] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = ` -"[1059,0] +"[1058,0] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -219,7 +219,7 @@ exports[`calculate simulations-auto-entrepreneur: échelle de revenus 1`] = `"[5 exports[`calculate simulations-auto-entrepreneur: échelle de revenus 2`] = `"[1148,12,1000,0,1000]"`; -exports[`calculate simulations-auto-entrepreneur: échelle de revenus 3`] = `"[2297,25,2000,0,2000]"`; +exports[`calculate simulations-auto-entrepreneur: échelle de revenus 3`] = `"[2296,25,2000,0,2000]"`; exports[`calculate simulations-auto-entrepreneur: échelle de revenus 4`] = `"[5742,62,5000,0,5000]"`; @@ -238,12 +238,12 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d exports[`calculate simulations-auto-entrepreneur: échelle de revenus 10`] = ` "[1148303,12359,1000000,126543,873457] -Notifications affichées : dirigeant . auto-entrepreneur . seuils dépassés . notification, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés" `; exports[`calculate simulations-impot-société: bénéfices 1`] = ` "[0,0] -Notifications affichées : entreprise . bénéfice . information sur le report de déficit" +Notifications affichées : entreprise . imposition . IS . information sur le report de déficit" `; exports[`calculate simulations-impot-société: bénéfices 2`] = `"[0,0]"`; @@ -254,15 +254,43 @@ exports[`calculate simulations-impot-société: bénéfices 4`] = `"[3000,0]"`; exports[`calculate simulations-impot-société: bénéfices 5`] = `"[51044,0]"`; -exports[`calculate simulations-impot-société: bénéfices 6`] = `"[555044,0]"`; +exports[`calculate simulations-impot-société: bénéfices 6`] = ` +"[555044,0] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; -exports[`calculate simulations-impot-société: bénéfices 7`] = `"[5595044,159457]"`; +exports[`calculate simulations-impot-société: bénéfices 7`] = ` +"[5595044,159457] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; -exports[`calculate simulations-impot-société: prorata temporis 1`] = `"[275044,0]"`; +exports[`calculate simulations-impot-société: prorata temporis 1`] = ` +"[275044,0] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; -exports[`calculate simulations-impot-société: prorata temporis 2`] = `"[277936,0]"`; +exports[`calculate simulations-impot-société: prorata temporis 2`] = ` +"[277936,0] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; -exports[`calculate simulations-impot-société: prorata temporis 3`] = `"[272981,0]"`; +exports[`calculate simulations-impot-société: prorata temporis 3`] = ` +"[272981,0] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; + +exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13180,16820,17883,232,16588,0,30000]"`; + +exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14380,15620,17883,232,15388,0,30000]"`; + +exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,593,19028,0,30000]"`; + +exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6686,13314,13854,0,13314,0,20000]"`; + +exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` +"[300000,79622,220378,228522,75412,144966,0,300000] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`; @@ -282,17 +310,17 @@ exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084 exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1366,634,686,0,634,0,2000]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33998,35353,3500,30498,0,50000]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16002,33998,35352,3500,30498,0,50000]"`; exports[`calculate simulations-indépendant: inversions 3`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`; -exports[`calculate simulations-indépendant: inversions 4`] = `"[68273,21573,46700,48551,6700,40000,0,68273]"`; +exports[`calculate simulations-indépendant: inversions 4`] = `"[69938,22076,47862,49758,7862,40000,0,69938]"`; exports[`calculate simulations-indépendant: inversions 5`] = `"[14460,4460,10000,10390,0,10000,1000,15460]"`; exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5870,13130,13643,0,13130,1000,20000]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[17999,5557,12442,12928,0,12442,2000,20000]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5557,12443,12928,0,12443,2000,20000]"`; exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1841,1341,500,547,0,500,0,1841]"`; @@ -350,7 +378,7 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate simulations-professions-libérales: avocat 2`] = ` -"[50000,0,11821,38179,4705,33474] +"[50000,0,11821,38179,4705,33475] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -367,7 +395,7 @@ exports[`calculate simulations-professions-libérales: médecin 2`] = `"[50000,0 exports[`calculate simulations-professions-libérales: médecin 3`] = `"[300000,0,73630,226370,77389,148981]"`; -exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93706,306295,120519,185776]"`; +exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93706,306294,120519,185775]"`; exports[`calculate simulations-professions-libérales: médecin 5`] = ` "[120000,0,26977,93023,23107,69916] @@ -375,7 +403,7 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate simulations-professions-libérales: médecin 6`] = ` -"[50000,0,10691,39307,4839,34468] +"[50000,0,10693,39307,4839,34468] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -387,7 +415,7 @@ Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite co `; exports[`calculate simulations-professions-libérales: sage-femme 3`] = ` -"[4000,0,1268,2733,0,2733] +"[4000,0,1267,2733,0,2733] 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" `; @@ -407,128 +435,122 @@ Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite co `; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): ACRE 1`] = ` -"[606,0,0,7127,4,13] +"[606,7272,0,7127,4,13] Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" `; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): ACRE 2`] = ` -"[1249,0,0,14429,4,26] +"[1249,14993,0,14429,4,26] Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" `; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): ACRE 3`] = ` -"[1893,0,0,21731,4,40] +"[1893,22714,0,21731,4,40] Notifications affichées : dirigeant . assimilé salarié . réduction ACRE . notification taux annuel" `; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 1`] = `"[1391,0,0,16041,4,29]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 1`] = `"[1391,16698,0,16041,4,29]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 2`] = `"[1391,0,0,16041,4,29]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 2`] = `"[1391,16698,0,16041,4,29]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 3`] = `"[1391,0,0,16041,4,29]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 3`] = `"[1391,16698,0,16041,4,29]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 4`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 4`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 5`] = ` -"[14490,0,0,150669,4,46] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 5`] = `"[14490,173883,0,150669,4,46]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,0,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,10998,0,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,0,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,10998,0,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 4`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 4`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 5`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 5`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 1`] = `"[442,0,0,5261,4,10]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 1`] = `"[442,5299,0,5261,4,10]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 2`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): avec charges 2`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = `"[-30,0,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 1`] = `"[-30,-361,0,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 2`] = `"[14,0,0,136,0,1]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 2`] = `"[14,170,0,136,0,1]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 3`] = `"[62,0,0,314,0,2]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 3`] = `"[62,740,0,314,0,2]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 4`] = `"[204,0,0,2566,2,5]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 4`] = `"[204,2450,0,2566,2,5]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 5`] = `"[442,0,0,5261,4,10]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 5`] = `"[442,5299,0,5261,4,10]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 6`] = `"[917,0,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 6`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 7`] = `"[2341,0,0,26822,4,46]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 7`] = `"[2341,28096,0,26822,4,46]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 8`] = ` -"[4758,0,0,51817,4,46] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" -`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): échelle de rémunération 8`] = `"[4758,57101,0,51817,4,46]"`; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 1`] = ` -"[0,0,9349,1450,2,0] +"[0,9349,9349,1450,2,0] Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" `; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 2`] = ` -"[0,0,18697,2900,3,8] +"[0,18697,18697,2900,3,8] Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" `; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 3`] = ` -"[0,0,28046,4350,4,12] +"[0,28046,28046,4350,4,12] Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" `; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 1`] = `"[0,0,34834,5800,4,16]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 1`] = `"[0,34834,34834,5800,4,16]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 2`] = `"[0,0,34834,5800,4,16]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 2`] = `"[0,34834,34834,5800,4,16]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 3`] = `"[0,0,34834,5800,4,16]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 3`] = `"[0,34834,34834,5800,4,16]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 4`] = `"[0,0,18288,3045,4,8]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 4`] = `"[0,18288,18288,3045,4,8]"`; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 5`] = ` -"[0,0,274318,20568,4,56] -Notifications affichées : dirigeant . auto-entrepreneur . seuils dépassés . notification, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[0,274318,274318,20568,4,56] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés" `; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 6`] = `"[0,0,17852,2973,3,8]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 6`] = `"[0,17852,17852,2973,3,8]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 1`] = `"[0,0,15580,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 1`] = `"[0,15580,15580,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 2`] = `"[0,0,15560,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 2`] = `"[0,15560,15560,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 3`] = `"[0,0,17336,2900,3,8]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 3`] = `"[0,17336,17336,2900,3,8]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 4`] = `"[0,0,17417,2900,3,8]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 4`] = `"[0,17417,17417,2900,3,8]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 5`] = `"[0,0,15580,5000,4,14]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 5`] = `"[0,15580,15580,5000,4,14]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): avec charges 1`] = `"[0,0,10450,1740,3,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): avec charges 1`] = `"[0,10450,10450,1740,3,0]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): avec charges 2`] = `"[0,0,30480,5075,4,14]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): avec charges 2`] = `"[0,30480,30480,5075,4,14]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 1`] = `"[0,0,87,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 1`] = `"[0,87,87,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 2`] = `"[0,0,871,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 2`] = `"[0,871,871,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 3`] = `"[0,0,1742,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 3`] = `"[0,1742,1742,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 4`] = `"[0,0,4354,725,1,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 4`] = `"[0,4354,4354,725,1,0]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 5`] = `"[0,0,8709,1450,2,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 5`] = `"[0,8709,8709,1450,2,0]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 6`] = `"[0,0,17417,2900,3,8]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 6`] = `"[0,17417,17417,2900,3,8]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 7`] = `"[0,0,43543,7250,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 7`] = `"[0,43543,43543,7250,4,20]"`; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): échelle de rémunération 8`] = ` -"[0,0,87085,14500,4,40] +"[0,87085,87085,14500,4,40] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -547,23 +569,20 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,19388,0,16984,4,33]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16820,0,13327,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,18995,0,17577,4,34]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15620,0,13327,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,20297,0,15600,4,30]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19621,0,14602,4,28]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13656,0,10367,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13314,0,9866,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` -"[0,225725,0,57933,4,56] +"[0,220378,0,57933,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = ` -"[0,13624,0,10417,4,21] -Notifications affichées : dirigeant . indépendant . contrats madelin . contrôle montant charges" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13214,0,9816,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13814,0,10116,4,21]"`; @@ -579,13 +598,19 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): avec cha exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13814,0,10116,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = `"[0,-1044,0,0,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` +"[0,-1044,0,0,3,21] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = `"[0,-225,0,0,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` +"[0,-225,0,0,3,21] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,634,0,483,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3160,0,2322,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3159,0,2322,3,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6894,0,5046,4,21]"`; diff --git a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml index ad4cddcf4..5a4d8d183 100644 --- a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml +++ b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml @@ -1,96 +1,96 @@ échelle de revenus: - - dirigeant . rémunération totale: 500 €/an - - dirigeant . rémunération totale: 1000 €/an - - dirigeant . rémunération totale: 1500 €/an - - dirigeant . rémunération totale: 2000 €/an - - dirigeant . rémunération totale: 5000 €/an - - dirigeant . rémunération totale: 10000 €/an - - dirigeant . rémunération totale: 100000 €/an - - dirigeant . rémunération totale: 1000000 €/an + - dirigeant . rémunération . totale: 500 €/an + - dirigeant . rémunération . totale: 1000 €/an + - dirigeant . rémunération . totale: 1500 €/an + - dirigeant . rémunération . totale: 2000 €/an + - dirigeant . rémunération . totale: 5000 €/an + - dirigeant . rémunération . totale: 10000 €/an + - dirigeant . rémunération . totale: 100000 €/an + - dirigeant . rémunération . totale: 1000000 €/an nature de l'activité: - aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" - dirigeant . rémunération totale: 5000 €/an + dirigeant . rémunération . totale: 5000 €/an - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale ou industrielle'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale ou industrielle'" - dirigeant . rémunération totale: 5000 €/an + dirigeant . rémunération . totale: 5000 €/an - aide déclaration revenu indépendant 2020 . nature de l'activité: "'libérale'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - aide déclaration revenu indépendant 2020 . nature de l'activité: "'libérale'" - dirigeant . rémunération totale: 5000 €/an + dirigeant . rémunération . totale: 5000 €/an - aide déclaration revenu indépendant 2020 . nature de l'activité: "'libérale'" entreprise . date de création: 06/04/2020 - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire: oui débit de tabac: - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale ou industrielle'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an entreprise . activité . débit de tabac: oui dirigeant . indépendant . cotisations et contributions . déduction tabac: 30000 €/an RSA: - situation personnelle . RSA: oui - dirigeant . rémunération totale: 500 €/an + dirigeant . rémunération . totale: 500 €/an - situation personnelle . RSA: oui - dirigeant . rémunération totale: 5000 €/an + dirigeant . rémunération . totale: 5000 €/an conjoint collaborateur: - dirigeant . indépendant . conjoint collaborateur: oui - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - dirigeant . indépendant . conjoint collaborateur: oui dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - dirigeant . indépendant . conjoint collaborateur: oui dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - dirigeant . indépendant . conjoint collaborateur: oui aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - dirigeant . indépendant . conjoint collaborateur: oui dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: "'moitié'" IJSS (indemnité sécurité sociale): - dirigeant . indépendant . IJSS: oui dirigeant . indépendant . IJSS . total: 10000 €/an dirigeant . indépendant . IJSS . imposable: 8000 €/an - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an ACRE: - aide déclaration revenu indépendant 2020 . ACRE: oui - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - aide déclaration revenu indépendant 2020 . ACRE: oui - dirigeant . rémunération totale: 15000 €/an + dirigeant . rémunération . totale: 15000 €/an - aide déclaration revenu indépendant 2020 . ACRE: oui - dirigeant . rémunération totale: 5000 €/an + dirigeant . rémunération . totale: 5000 €/an - aide déclaration revenu indépendant 2020 . ACRE: oui entreprise . date de création: 01/07/2019 - dirigeant . rémunération totale: 10000 €/an + dirigeant . rémunération . totale: 10000 €/an - aide déclaration revenu indépendant 2020 . ACRE: oui entreprise . date de création: 01/07/2020 - dirigeant . rémunération totale: 10000 €/an + dirigeant . rémunération . totale: 10000 €/an international: - situation personnelle . domiciliation fiscale à l'étranger: oui - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - dirigeant . indépendant . revenus étrangers: oui dirigeant . indépendant . revenus étrangers . montant: 30000€/an - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an aide covid 2020: - - dirigeant . rémunération totale: 50000 €/an + - dirigeant . rémunération . totale: 50000 €/an aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" aide déclaration revenu indépendant 2020 . réduction covid: oui aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'" aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020: oui aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles: 4 - - dirigeant . rémunération totale: 5000 €/an + - dirigeant . rémunération . totale: 5000 €/an aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" aide déclaration revenu indépendant 2020 . réduction covid: oui aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'" diff --git a/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml b/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml index 68d72b28f..ea4dcbb9d 100644 --- a/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml +++ b/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml @@ -37,12 +37,12 @@ ACRE: activité mixte: - - entreprise . chiffre d'affaires: 20000 €/an + - dirigeant . auto-entrepreneur . chiffre d'affaires: 20000 €/an entreprise . activité . mixte: oui - - entreprise . chiffre d'affaires: 20000 €/an + - dirigeant . auto-entrepreneur . chiffre d'affaires: 20000 €/an entreprise . activité . mixte: oui entreprise . activité: "'libérale'" - - entreprise . chiffre d'affaires: 20000 €/an + - dirigeant . auto-entrepreneur . chiffre d'affaires: 20000 €/an entreprise . activité . mixte: oui entreprise . activité: "'artisanale'" \ No newline at end of file diff --git a/mon-entreprise/test/regressions/simulations-impôt-société.yaml b/mon-entreprise/test/regressions/simulations-impôt-société.yaml index 61f4e97e6..0b56e87e8 100644 --- a/mon-entreprise/test/regressions/simulations-impôt-société.yaml +++ b/mon-entreprise/test/regressions/simulations-impôt-société.yaml @@ -1,17 +1,17 @@ bénéfices: - - entreprise . bénéfice: -2000 €/an - - entreprise . bénéfice: 0 €/an - - entreprise . bénéfice: 2000 €/an - - entreprise . bénéfice: 20000 €/an - - entreprise . bénéfice: 200000 €/an - - entreprise . bénéfice: 2000000 €/an - - entreprise . bénéfice: 20000000 €/an + - entreprise . résultat fiscal: -2000 €/an + - entreprise . résultat fiscal: 0 €/an + - entreprise . résultat fiscal: 2000 €/an + - entreprise . résultat fiscal: 20000 €/an + - entreprise . résultat fiscal: 200000 €/an + - entreprise . résultat fiscal: 2000000 €/an + - entreprise . résultat fiscal: 20000000 €/an prorata temporis: - - entreprise . bénéfice: 1000000 €/an - - entreprise . bénéfice: 1000000 €/an + - entreprise . résultat fiscal: 1000000 €/an + - entreprise . résultat fiscal: 1000000 €/an entreprise . exercice . début: 01/01/2020 entreprise . exercice . fin: 01/06/2020 - - entreprise . bénéfice: 1000000 €/an + - entreprise . résultat fiscal: 1000000 €/an entreprise . exercice . début: 01/01/2020 entreprise . exercice . fin: 01/06/2021 diff --git a/mon-entreprise/test/regressions/simulations-indépendant.yaml b/mon-entreprise/test/regressions/simulations-indépendant.yaml index 1cd7fc9ec..a91152e1f 100644 --- a/mon-entreprise/test/regressions/simulations-indépendant.yaml +++ b/mon-entreprise/test/regressions/simulations-indépendant.yaml @@ -1,45 +1,72 @@ échelle de revenus: - - dirigeant . indépendant . revenu net de cotisations: 500 €/an - - dirigeant . indépendant . revenu net de cotisations: 1000 €/an - - dirigeant . indépendant . revenu net de cotisations: 1500 €/an - - dirigeant . indépendant . revenu net de cotisations: 2000 €/an - - dirigeant . indépendant . revenu net de cotisations: 5000 €/an - - dirigeant . indépendant . revenu net de cotisations: 10000 €/an - - dirigeant . indépendant . revenu net de cotisations: 100000 €/an - - dirigeant . indépendant . revenu net de cotisations: 1000000 €/an + - dirigeant . rémunération . nette: 500 €/an + - dirigeant . rémunération . nette: 1000 €/an + - dirigeant . rémunération . nette: 1500 €/an + - dirigeant . rémunération . nette: 2000 €/an + - dirigeant . rémunération . nette: 5000 €/an + - dirigeant . rémunération . nette: 10000 €/an + - dirigeant . rémunération . nette: 100000 €/an + - dirigeant . rémunération . nette: 1000000 €/an inversions: - - dirigeant . rémunération totale: 2000 €/an - - dirigeant . rémunération totale: 50000 €/an - - revenu net après impôt: 10000 €/an - - revenu net après impôt: 40000 €/an - - revenu net après impôt: 10000 €/an + - dirigeant . rémunération . totale: 2000 €/an + - dirigeant . rémunération . totale: 50000 €/an + - dirigeant . rémunération . nette après impôt: 10000 €/an + - dirigeant . rémunération . nette après impôt: 40000 €/an + - dirigeant . rémunération . nette après impôt: 10000 €/an entreprise . charges: 1000 €/an - - entreprise . chiffre d'affaires minimum: 20000 €/an + - entreprise . chiffre d'affaires: 20000 €/an entreprise . charges: 1000 €/an - - entreprise . chiffre d'affaires minimum: 20000 €/an + - entreprise . chiffre d'affaires: 20000 €/an entreprise . charges: 2000 €/an cotisations minimales: - - dirigeant . indépendant . revenu net de cotisations: 100 €/an - - dirigeant . indépendant . revenu net de cotisations: 100 €/an + - dirigeant . rémunération . nette: 100 €/an + - dirigeant . rémunération . nette: 100 €/an situation personnelle . RSA: oui activité: - - dirigeant . indépendant . revenu net de cotisations: 20000 €/an + - dirigeant . rémunération . nette: 20000 €/an entreprise . activité: "'libérale'" - - dirigeant . indépendant . revenu net de cotisations: 20000 €/an + - dirigeant . rémunération . nette: 20000 €/an entreprise . activité: "'artisanale'" acre: - - dirigeant . indépendant . revenu net de cotisations: 50000 €/an + - dirigeant . rémunération . nette: 50000 €/an entreprise . ACRE: oui impôt sur le revenu: - - dirigeant . indépendant . revenu net de cotisations: 20000 €/an + - dirigeant . rémunération . nette: 20000 €/an impôt . méthode de calcul: "'taux neutre'" - - dirigeant . indépendant . revenu net de cotisations: 50000 €/an + - dirigeant . rémunération . nette: 50000 €/an impôt . méthode de calcul: "'taux neutre'" - - dirigeant . indépendant . revenu net de cotisations: 20000 €/an + - dirigeant . rémunération . nette: 20000 €/an impôt . méthode de calcul: "'taux personnalisé'" impôt . taux personnalisé: 10% + +Contrats Madelin: + # Cas retraite: la cotisation Madelin est inferieure au plafond => le revenu net de + # cotisations (résultat comptable) n'est pas affecté car l'assiette des + # cotisations ne change pas: + - dirigeant . rémunération . totale: 30000 €/an + dirigeant . indépendant . contrats madelin: oui + dirigeant . indépendant . contrats madelin . mutuelle: 3800 €/an # plafond: 10% PSS donc environ 4100 + # Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de + # cotisations est affecté car l'assiette des cotisations est plus élevée + - dirigeant . rémunération . totale: 30000 €/an + dirigeant . indépendant . contrats madelin: oui + dirigeant . indépendant . contrats madelin . mutuelle: 5000 €/an # plafond: 10% PSS donc environ 4100 + # Cas mutuelle + - dirigeant . rémunération . totale: 30000 €/an + dirigeant . indépendant . contrats madelin: oui + dirigeant . indépendant . contrats madelin . mutuelle: 1000 €/an + # Cas global madelin faible + - dirigeant . rémunération . totale: 20000 €/an + dirigeant . indépendant . contrats madelin: oui + dirigeant . indépendant . contrats madelin . mutuelle: 200 €/an + dirigeant . indépendant . contrats madelin . retraite: 300 €/an + # Cas global madelin grand (plafonds calculés différemment) + - dirigeant . rémunération . totale: 300000 €/an + dirigeant . indépendant . contrats madelin: oui + dirigeant . indépendant . contrats madelin . mutuelle: 1500 €/an + dirigeant . indépendant . contrats madelin . retraite: 5000 €/an diff --git a/mon-entreprise/test/regressions/simulations-professions-libérales.yaml b/mon-entreprise/test/regressions/simulations-professions-libérales.yaml index 0f0fefbc3..99652beab 100644 --- a/mon-entreprise/test/regressions/simulations-professions-libérales.yaml +++ b/mon-entreprise/test/regressions/simulations-professions-libérales.yaml @@ -1,84 +1,84 @@ médecin: - dirigeant . indépendant . PL . métier: "'santé . médecin'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - # Secteur 2 dépassement honoraire dirigeant . indépendant . PL . métier: "'santé . médecin'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an dirigeant . indépendant . PL . métier . secteur médecin: "'S2'" dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 20% - # Secteur 2 avec dépassement honoraire et grosse rémunération dirigeant . indépendant . PL . métier: "'santé . médecin'" - dirigeant . rémunération totale: 300000 €/an + dirigeant . rémunération . totale: 300000 €/an dirigeant . indépendant . PL . métier . secteur médecin: "'S2'" dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 50% - # Secteur 2 avec grosse rémunération et activité non conventionnée dirigeant . indépendant . PL . métier: "'santé . médecin'" - dirigeant . rémunération totale: 400000 €/an + dirigeant . rémunération . totale: 400000 €/an dirigeant . indépendant . PL . métier . secteur médecin: "'S2'" dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 50% dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée: 40% - # Non conventionné dirigeant . indépendant . PL . métier: "'santé . médecin'" - dirigeant . rémunération totale: 120000 €/an + dirigeant . rémunération . totale: 120000 €/an dirigeant . indépendant . PL . métier . secteur médecin: "'non conventionné'" - # < 2 ans exercice entreprise . date de création: 01/01/2021 dirigeant . indépendant . PL . métier: "'santé . médecin'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an sage-femme: - dirigeant . indépendant . PL . métier: "'santé . sage-femme'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - # Réduction retraite complémentaire dirigeant . indépendant . PL . métier: "'santé . sage-femme'" - dirigeant . rémunération totale: 20000 €/an + dirigeant . rémunération . totale: 20000 €/an - # Exonération RID dirigeant . indépendant . PL . métier: "'santé . sage-femme'" - dirigeant . rémunération totale: 4000 €/an + dirigeant . rémunération . totale: 4000 €/an - # Classe A dirigeant . indépendant . PL . métier: "'santé . sage-femme'" - dirigeant . rémunération totale: 20000 €/an + dirigeant . rémunération . totale: 20000 €/an dirigeant . indépendant . PL . CARCDSF . sage-femme . RID . classe: "'A'" - # Classe B dirigeant . indépendant . PL . métier: "'santé . sage-femme'" - dirigeant . rémunération totale: 20000 €/an + dirigeant . rémunération . totale: 20000 €/an dirigeant . indépendant . PL . CARCDSF . sage-femme . RID . classe: "'B'" - # Classe C dirigeant . indépendant . PL . métier: "'santé . sage-femme'" - dirigeant . rémunération totale: 20000 €/an + dirigeant . rémunération . totale: 20000 €/an dirigeant . indépendant . PL . CARCDSF . sage-femme . RID . classe: "'C'" auxiliaire médical: - dirigeant . indépendant . PL . métier: "'santé . auxiliaire médical'" - dirigeant . rémunération totale: 30000 €/an + dirigeant . rémunération . totale: 30000 €/an - # Dépassement honoraire dirigeant . indépendant . PL . métier: "'santé . auxiliaire médical'" - dirigeant . rémunération totale: 30000 €/an + dirigeant . rémunération . totale: 30000 €/an dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 20% - # Grosse rémunération dirigeant . indépendant . PL . métier: "'santé . auxiliaire médical'" - dirigeant . rémunération totale: 300000 €/an + dirigeant . rémunération . totale: 300000 €/an dirigeant . indépendant . PL . PAMC . dépassement d'honoraire moyen: 100% avocat: - dirigeant . indépendant . PL . métier: "'avocat'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an - dirigeant . indépendant . PL . métier: "'avocat'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an entreprise . durée d'activité . en fin d'année: 6 ans expert-comptable: - dirigeant . indépendant . PL . métier: "'expert-comptable'" - dirigeant . rémunération totale: 20000 €/an + dirigeant . rémunération . totale: 20000 €/an - dirigeant . indépendant . PL . métier: "'expert-comptable'" - dirigeant . rémunération totale: 50000 €/an + dirigeant . rémunération . totale: 50000 €/an CIPAV: - - dirigeant . indépendant . revenu net de cotisations: 500 €/an - - dirigeant . indépendant . revenu net de cotisations: 1000 €/an - - dirigeant . indépendant . revenu net de cotisations: 1500 €/an - - dirigeant . indépendant . revenu net de cotisations: 2000 €/an - - dirigeant . indépendant . revenu net de cotisations: 5000 €/an - - dirigeant . indépendant . revenu net de cotisations: 10000 €/an - - dirigeant . indépendant . revenu net de cotisations: 100000 €/an - - dirigeant . indépendant . revenu net de cotisations: 1000000 €/an + - dirigeant . rémunération . nette: 500 €/an + - dirigeant . rémunération . nette: 1000 €/an + - dirigeant . rémunération . nette: 1500 €/an + - dirigeant . rémunération . nette: 2000 €/an + - dirigeant . rémunération . nette: 5000 €/an + - dirigeant . rémunération . nette: 10000 €/an + - dirigeant . rémunération . nette: 100000 €/an + - dirigeant . rémunération . nette: 1000000 €/an diff --git a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml index 6496410af..fd9dac624 100644 --- a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml +++ b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml @@ -1,42 +1,42 @@ échelle de rémunération: - - dirigeant . rémunération totale: 100 €/an - - dirigeant . rémunération totale: 1000 €/an - - dirigeant . rémunération totale: 2000 €/an - - dirigeant . rémunération totale: 5000 €/an - - dirigeant . rémunération totale: 10000 €/an - - dirigeant . rémunération totale: 20000 €/an - - dirigeant . rémunération totale: 50000 €/an - - dirigeant . rémunération totale: 100000 €/an + - dirigeant . rémunération . totale: 100 €/an + - dirigeant . rémunération . totale: 1000 €/an + - dirigeant . rémunération . totale: 2000 €/an + - dirigeant . rémunération . totale: 5000 €/an + - dirigeant . rémunération . totale: 10000 €/an + - dirigeant . rémunération . totale: 20000 €/an + - dirigeant . rémunération . totale: 50000 €/an + - dirigeant . rémunération . totale: 100000 €/an avec charges: - - dirigeant . rémunération totale: 10000 €/an + - dirigeant . rémunération . totale: 10000 €/an entreprise . charges: 2000 €/an - - dirigeant . rémunération totale: 20000 €/an + - dirigeant . rémunération . totale: 20000 €/an entreprise . charges: 15000 €/an ACRE: - - dirigeant . rémunération totale: 10000 €/an + - dirigeant . rémunération . totale: 10000 €/an entreprise . date de création: 01/01/2021 entreprise . ACRE: oui - - dirigeant . rémunération totale: 20000 €/an + - dirigeant . rémunération . totale: 20000 €/an entreprise . date de création: 01/01/2021 entreprise . ACRE: oui - - dirigeant . rémunération totale: 30000 €/an + - dirigeant . rémunération . totale: 30000 €/an entreprise . date de création: 01/06/2020 entreprise . ACRE: oui activités: - - dirigeant . rémunération totale: 20000 €/an + - dirigeant . rémunération . totale: 20000 €/an entreprise . activité: "'libérale'" - - dirigeant . rémunération totale: 20000 €/an + - dirigeant . rémunération . totale: 20000 €/an entreprise . activité: "'libérale'" entreprise . activité . libérale réglementée: oui - - dirigeant . rémunération totale: 20000 €/an + - dirigeant . rémunération . totale: 20000 €/an entreprise . activité: "'artisanale'" - - dirigeant . rémunération totale: 20000 €/an + - dirigeant . rémunération . totale: 20000 €/an entreprise . activité: "'commerciale ou industrielle'" entreprise . activité . service ou vente: "'vente'" - - dirigeant . rémunération totale: 20000 €/an + - dirigeant . rémunération . totale: 20000 €/an entreprise . activité: "'commerciale ou industrielle'" entreprise . activité . service ou vente: "'service'" @@ -44,35 +44,35 @@ Contrats Madelin: # Cas retraite: la cotisation Madelin est inferieure au plafond => le revenu net de # cotisations (résultat comptable) n'est pas affecté car l'assiette des # cotisations ne change pas: - - dirigeant . rémunération totale: 30000 €/an + - dirigeant . rémunération . totale: 30000 €/an entreprise . charges: 10000 €/an dirigeant . indépendant . contrats madelin: oui dirigeant . indépendant . contrats madelin . mutuelle: 3800 €/an # plafond: 10% PSS donc environ 4100 # Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de # cotisations est affecté car l'assiette des cotisations est plus élevée - - dirigeant . rémunération totale: 30000 €/an + - dirigeant . rémunération . totale: 30000 €/an entreprise . charges: 10000 €/an dirigeant . indépendant . contrats madelin: oui dirigeant . indépendant . contrats madelin . mutuelle: 5000 €/an # plafond: 10% PSS donc environ 4100 # Cas mutuelle - - dirigeant . rémunération totale: 30000 €/an + - dirigeant . rémunération . totale: 30000 €/an entreprise . charges: 10000 €/an dirigeant . indépendant . contrats madelin: oui dirigeant . indépendant . contrats madelin . mutuelle: 1000 €/an # Cas global madelin faible - - dirigeant . rémunération totale: 20000 €/an + - dirigeant . rémunération . totale: 20000 €/an entreprise . charges: 1000 €/an dirigeant . indépendant . contrats madelin: oui dirigeant . indépendant . contrats madelin . mutuelle: 200 €/an dirigeant . indépendant . contrats madelin . retraite: 300 €/an # Cas global madelin grand (plafonds calculés différemment) - - dirigeant . rémunération totale: 300000 €/an + - dirigeant . rémunération . totale: 300000 €/an entreprise . charges: 15000 €/an dirigeant . indépendant . contrats madelin: oui dirigeant . indépendant . contrats madelin . mutuelle: 1500 €/an dirigeant . indépendant . contrats madelin . retraite: 5000 €/an # Cas charges plus faibles que total madelin - - dirigeant . rémunération totale: 20000 €/an + - dirigeant . rémunération . totale: 20000 €/an entreprise . charges: 500 €/an dirigeant . indépendant . contrats madelin: oui dirigeant . indépendant . contrats madelin . mutuelle: 300 €/an diff --git a/mon-entreprise/test/regressions/simulations.jest.js b/mon-entreprise/test/regressions/simulations.jest.js index 4c020a6d9..6c8c80dc4 100644 --- a/mon-entreprise/test/regressions/simulations.jest.js +++ b/mon-entreprise/test/regressions/simulations.jest.js @@ -69,10 +69,16 @@ it('calculate simulations-salarié', () => { }) it('calculate simulations-indépendant', () => { - const targets = independantConfig.objectifs.reduce( - (acc, cur) => [...acc, ...cur.objectifs], - [] - ) + const targets = [ + 'dirigeant . rémunération . totale', + 'dirigeant . rémunération . cotisations', + 'dirigeant . rémunération . nette', + 'dirigeant . indépendant . revenu professionnel', + 'impôt', + 'dirigeant . rémunération . nette après impôt', + 'entreprise . charges', + "entreprise . chiffre d'affaires", + ] runSimulations(independentSituations, targets, independantConfig.situation) }) @@ -152,8 +158,16 @@ it('calculate simulations-professions-libérales', () => { }) it('calculate simulations-impot-société', () => { - runSimulations(impotSocieteSituations, [ - 'entreprise . impôt sur les sociétés', - 'entreprise . impôt sur les sociétés . contribution sociale', - ]) + runSimulations( + impotSocieteSituations, + [ + 'entreprise . imposition . IS . impôt sur les sociétés', + 'entreprise . imposition . IS . impôt sur les sociétés . contribution sociale', + ], + { + 'entreprise . imposition': "'IS'", + 'entreprise . imposition . IS . impôt sur les sociétés . éligible taux réduit': + 'oui', + } + ) }) From 7af1ae98a1ce2dab3a3349ddeaca8ab54306edeb Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 12 Apr 2021 17:54:27 +0200 Subject: [PATCH 020/319] =?UTF-8?q?Desactive=20l'aide=20=C3=A0=20la=20d?= =?UTF-8?q?=C3=A9claration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/layout/Footer/Footer.tsx | 2 +- mon-entreprise/source/pages/Gérer/index.tsx | 2 +- .../source/pages/Simulateurs/Home.tsx | 2 +- .../source/pages/Simulateurs/metadata.tsx | 57 +++++++++---------- 4 files changed, 31 insertions(+), 32 deletions(-) diff --git a/mon-entreprise/source/components/layout/Footer/Footer.tsx b/mon-entreprise/source/components/layout/Footer/Footer.tsx index bf5ba4921..411e36f6d 100644 --- a/mon-entreprise/source/components/layout/Footer/Footer.tsx +++ b/mon-entreprise/source/components/layout/Footer/Footer.tsx @@ -19,7 +19,7 @@ const useShowFeedback = () => { const simulators = useSimulatorsData() if ( [ - simulators['aide-déclaration-indépendant'], + // simulators['aide-déclaration-indépendant'], simulators['comparaison-statuts'], simulators['demande-mobilité'], ] diff --git a/mon-entreprise/source/pages/Gérer/index.tsx b/mon-entreprise/source/pages/Gérer/index.tsx index 4e78fb2b0..64d7758dc 100644 --- a/mon-entreprise/source/pages/Gérer/index.tsx +++ b/mon-entreprise/source/pages/Gérer/index.tsx @@ -34,7 +34,7 @@ export default function Gérer() { /> {[ - simulateurs['aide-déclaration-indépendant'], + // simulateurs['aide-déclaration-indépendant'], simulateurs['demande-mobilité'], ].map((p) => ( - + {/* */}
    diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 2c6f76024..ff3d32b0f 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -9,7 +9,6 @@ import { Trans, useTranslation } from 'react-i18next' import { SimulationConfig } from 'Reducers/rootReducer' import { constructLocalizedSitePath } from '../../sitePaths' import { RessourceAutoEntrepreneur } from '../Créer/CreationChecklist' -import AideDéclarationIndépendant from '../Gérer/AideDéclarationIndépendant' import FormulaireMobilitéIndépendant from '../Gérer/DemandeMobilite' import AidesEmbauche from './AidesEmbauche' import ArtisteAuteur from './ArtisteAuteur' @@ -47,7 +46,7 @@ const simulateurs = [ 'artiste-auteur', 'comparaison-statuts', 'économie-collaborative', - 'aide-déclaration-indépendant', + // 'aide-déclaration-indépendant', 'demande-mobilité', 'profession-libérale', 'médecin', @@ -588,33 +587,33 @@ export function getSimulatorsData({ 'Guide économie collaborative' ), }, - 'aide-déclaration-indépendant': { - component: AideDéclarationIndépendant, - tracking: { - chapter1: 'gerer', - chapter2: 'aide_declaration_independant', - }, - icône: '✍️', - meta: { - description: t( - 'pages.gérer.aide-déclaration-indépendant.meta.description', - 'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2020.' - ), - title: t( - 'pages.gérer.aide-déclaration-indépendant.meta.title', - 'Déclaration de revenus indépendant : calcul du montant des cotisations' - ), - }, - path: sitePaths.gérer.déclarationIndépendant, - shortName: t( - 'pages.gérer.aide-déclaration-indépendant.shortname', - 'Aide à la déclaration de revenu' - ), - title: t( - 'pages.gérer.aide-déclaration-indépendant.title', - "Aide à la déclaration de revenus au titre de l'année 2020" - ), - }, + // 'aide-déclaration-indépendant': { + // component: AideDéclarationIndépendant, + // tracking: { + // chapter1: 'gerer', + // chapter2: 'aide_declaration_independant', + // }, + // icône: '✍️', + // meta: { + // description: t( + // 'pages.gérer.aide-déclaration-indépendant.meta.description', + // 'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2020.' + // ), + // title: t( + // 'pages.gérer.aide-déclaration-indépendant.meta.title', + // 'Déclaration de revenus indépendant : calcul du montant des cotisations' + // ), + // }, + // path: sitePaths.gérer.déclarationIndépendant, + // shortName: t( + // 'pages.gérer.aide-déclaration-indépendant.shortname', + // 'Aide à la déclaration de revenu' + // ), + // title: t( + // 'pages.gérer.aide-déclaration-indépendant.title', + // "Aide à la déclaration de revenus au titre de l'année 2020" + // ), + // }, 'demande-mobilité': { component: FormulaireMobilitéIndépendant, tracking: { From f42fe2a0044e4873717678230f4de6144fd82732 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 14 Apr 2021 11:41:16 +0200 Subject: [PATCH 021/319] =?UTF-8?q?=F0=9F=92=B6=20Budget=202021-T1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/pages/Budget/Budget.tsx | 26 +++++++++++++------ mon-entreprise/source/pages/Budget/budget.md | 10 ++++++- .../source/pages/Budget/budget.yaml | 8 +++++- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/mon-entreprise/source/pages/Budget/Budget.tsx b/mon-entreprise/source/pages/Budget/Budget.tsx index e8db500b2..a48952e29 100644 --- a/mon-entreprise/source/pages/Budget/Budget.tsx +++ b/mon-entreprise/source/pages/Budget/Budget.tsx @@ -5,6 +5,7 @@ import { formatValue } from 'publicodes' import { sum, uniq } from 'ramda' import { useState } from 'react' import emoji from 'react-easy-emoji' +import { Helmet } from 'react-helmet' import { useTranslation } from 'react-i18next' import styled from 'styled-components' import { TrackPage } from '../../ATInternetTracking' @@ -17,21 +18,23 @@ const [ intro, ressources2019, ressources2020, + ressources2021, ressourcesDescription, ] = prose.split(/\r?\n-{3,}\r?\n/) const ressources = { 2019: ressources2019, 2020: ressources2020, + 2021: ressources2021, } export default function Budget() { - const years = ['2019', '2020'] as const + const years = ['2019', '2020', '2021'] as const const quarters = ['T1', 'T2', 'T3', 'T4'] - const [selectedYear, setSelectedYear] = useState('2020') + const [selectedYear, setSelectedYear] = useState('2021') const categories = uniq( quarters - .map((q) => Object.keys(budget[2020][q] ?? {})) + .map((q) => Object.keys(budget[selectedYear]?.[q] ?? {})) .reduce((acc, curr) => [...acc, ...curr], []) ) @@ -39,6 +42,9 @@ export default function Budget() { return ( <> + + Le budget de mon-entreprise.fr +

    Budget {emoji('💶')}

    @@ -67,7 +73,7 @@ export default function Budget() { - 2020 + {selectedYear} {quarters.map((q) => ( {q} ))} @@ -79,7 +85,7 @@ export default function Budget() { {label} {quarters.map((q) => { - const value = budget[2020]?.[q]?.[label] + const value = budget[selectedYear]?.[q]?.[label] return ( {value @@ -94,7 +100,9 @@ export default function Budget() { {formatValue( sum( - quarters.map((q) => budget[2020]?.[q]?.[label] ?? 0) + quarters.map( + (q) => budget[selectedYear]?.[q]?.[label] ?? 0 + ) ), { displayedUnit: '€', @@ -109,7 +117,9 @@ export default function Budget() { Total {quarters.map((q) => { - const value = sum(Object.values(budget[2020]?.[q] ?? {})) + const value = sum( + Object.values(budget[selectedYear]?.[q] ?? {}) + ) return ( {value @@ -125,7 +135,7 @@ export default function Budget() { {formatValue( sum( quarters.map((q) => - sum(Object.values(budget[2020]?.[q] ?? {})) + sum(Object.values(budget[selectedYear]?.[q] ?? {})) ) ), { diff --git a/mon-entreprise/source/pages/Budget/budget.md b/mon-entreprise/source/pages/Budget/budget.md index 389e065a6..a00b52693 100644 --- a/mon-entreprise/source/pages/Budget/budget.md +++ b/mon-entreprise/source/pages/Budget/budget.md @@ -60,12 +60,20 @@ programme est financé par la [DINUM](https://www.numerique.gouv.fr/dinum/). --- +## Budget + +En 2021 l'[Urssaf Caisse Nationale](https://www.acoss.fr) renouvelle le budget annuel de **250 000 € HT**. + +Au premier trimestre 2021, l'équipe mon-entreprise continue de bénéficier de l'accompagnement du [programme Gamma](https://beta.gouv.fr/approche/acceleration) financé par la [DINUM](https://www.numerique.gouv.fr/dinum/). + +--- + ### Description des catégories - **Développement 👨‍💻** Les coûts de développement représentent la grande majorité de notre budget. - Nous utilisons une petite équipe de développeurs freelances, qui sont + Nous sommes une petite équipe de développeurs freelances, pluridisciplinaires aussi bien sur les aspects techniques, stratégiques et métiers. Les rémunérations suivent [la grille de beta.gouv](https://doc.incubateur.net/communaute/travailler-a-beta-gouv/recrutement/remuneration). diff --git a/mon-entreprise/source/pages/Budget/budget.yaml b/mon-entreprise/source/pages/Budget/budget.yaml index f8a37c49c..97c918fe6 100644 --- a/mon-entreprise/source/pages/Budget/budget.yaml +++ b/mon-entreprise/source/pages/Budget/budget.yaml @@ -1,7 +1,7 @@ # Ces données sont optenues avec la commande suivante depuis le repo privé # `mon-entreprise/compta` : # -# $ hledger is -p 2020 -Q -B --depth 2 +# $ hledger is -p 2021 -Q -B --depth 2 # # La partie « marge du porteur » est amortie par trimestre en prenant 13,31% du # total du trimestre. @@ -26,3 +26,9 @@ Développement: 72150 Logiciels et hébergement: 782 Marge du porteur: 9631 +2021: + T1: + Développement: 44850 + Logiciels et hébergement: 454 + Déplacements: 114 + Marge du porteur: 6045 From af62e3e1f0cfc87f5bfa24304ce6a7b81d5addb6 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 15 Apr 2021 13:25:26 +0200 Subject: [PATCH 022/319] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 213591583..6afb190d0 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Les développeurs ont la possibilité d'intégrer ces simulateurs sur d'autres s Publicodes est un langage déclaratif pour encoder les algorithmes d'intérêt public. Il permet de réaliser des calculs généraux tout en fournissant une explication permettant de comprendre et de documenter ces calculs. -Publicode est adapté pour modéliser des domaines métiers complexes pouvant être décomposés en règles élémentaires simples (comme la législation socio-fiscale, un bilan carbone, un estimateur de rendement locatif, etc.). Il propulse les simulateurs de mon-entreprise.fr et le site [futur.eco](https://futur.eco). +Publicode est adapté pour modéliser des domaines métiers complexes pouvant être décomposés en règles élémentaires simples (comme la législation socio-fiscale, un bilan carbone, un estimateur de rendement locatif, etc.). Il propulse les simulateurs de mon-entreprise.fr et ceux de [datagir.ademe.fr](https://datagir.ademe.fr/). > 📖 [Voir la documentation](https://publi.codes) From 460d4d1b6d2aeb256e87424881c674d2ed7c6026 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 13 Apr 2021 13:23:00 +0200 Subject: [PATCH 023/319] Ajoute un repo exemple d'utilisation de publicodes avec react --- publicodes/example/publicode-react/.gitignore | 23 + publicodes/example/publicode-react/README.md | 70 + .../example/publicode-react/package.json | 42 + .../publicode-react/public/favicon.ico | Bin 0 -> 3870 bytes .../example/publicode-react/public/index.html | 43 + .../publicode-react/public/logo192.png | Bin 0 -> 5347 bytes .../publicode-react/public/logo512.png | Bin 0 -> 9664 bytes .../publicode-react/public/manifest.json | 25 + .../example/publicode-react/public/robots.txt | 3 + .../example/publicode-react/src/App.css | 30 + publicodes/example/publicode-react/src/App.js | 25 + .../src/CO2-douche.publicodes.yaml | 83 + .../example/publicode-react/src/Publicodes.js | 27 + .../publicode-react/src/Publicodes.test.js | 10 + .../example/publicode-react/src/index.css | 13 + .../example/publicode-react/src/index.js | 17 + .../example/publicode-react/src/logo.png | Bin 0 -> 9296 bytes .../example/publicode-react/src/setupTests.js | 5 + publicodes/example/publicode-react/yarn.lock | 12066 ++++++++++++++++ 19 files changed, 12482 insertions(+) create mode 100644 publicodes/example/publicode-react/.gitignore create mode 100644 publicodes/example/publicode-react/README.md create mode 100644 publicodes/example/publicode-react/package.json create mode 100644 publicodes/example/publicode-react/public/favicon.ico create mode 100644 publicodes/example/publicode-react/public/index.html create mode 100644 publicodes/example/publicode-react/public/logo192.png create mode 100644 publicodes/example/publicode-react/public/logo512.png create mode 100644 publicodes/example/publicode-react/public/manifest.json create mode 100644 publicodes/example/publicode-react/public/robots.txt create mode 100644 publicodes/example/publicode-react/src/App.css create mode 100644 publicodes/example/publicode-react/src/App.js create mode 100644 publicodes/example/publicode-react/src/CO2-douche.publicodes.yaml create mode 100644 publicodes/example/publicode-react/src/Publicodes.js create mode 100644 publicodes/example/publicode-react/src/Publicodes.test.js create mode 100644 publicodes/example/publicode-react/src/index.css create mode 100644 publicodes/example/publicode-react/src/index.js create mode 100644 publicodes/example/publicode-react/src/logo.png create mode 100644 publicodes/example/publicode-react/src/setupTests.js create mode 100644 publicodes/example/publicode-react/yarn.lock diff --git a/publicodes/example/publicode-react/.gitignore b/publicodes/example/publicode-react/.gitignore new file mode 100644 index 000000000..4d29575de --- /dev/null +++ b/publicodes/example/publicode-react/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/publicodes/example/publicode-react/README.md b/publicodes/example/publicode-react/README.md new file mode 100644 index 000000000..02aac3f6e --- /dev/null +++ b/publicodes/example/publicode-react/README.md @@ -0,0 +1,70 @@ +# Getting Started with Create React App + +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `yarn start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.\ +You will also see any lint errors in the console. + +### `yarn test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `yarn build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `yarn eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) + +### Analyzing the Bundle Size + +This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) + +### Making a Progressive Web App + +This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) + +### Advanced Configuration + +This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) + +### Deployment + +This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) + +### `yarn build` fails to minify + +This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) diff --git a/publicodes/example/publicode-react/package.json b/publicodes/example/publicode-react/package.json new file mode 100644 index 000000000..ce9cb331c --- /dev/null +++ b/publicodes/example/publicode-react/package.json @@ -0,0 +1,42 @@ +{ + "name": "publicode-react", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/user-event": "^12.1.10", + "publicodes": "^1.0.0-beta.13", + "publicodes-react": "^1.0.0-beta.13", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-router": "^5.2.0", + "react-router-dom": "^5.2.0", + "react-scripts": "4.0.3", + "web-vitals": "^1.0.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/publicodes/example/publicode-react/public/favicon.ico b/publicodes/example/publicode-react/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ literal 0 HcmV?d00001 diff --git a/publicodes/example/publicode-react/public/index.html b/publicodes/example/publicode-react/public/index.html new file mode 100644 index 000000000..aa069f27c --- /dev/null +++ b/publicodes/example/publicode-react/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
    + + + diff --git a/publicodes/example/publicode-react/public/logo192.png b/publicodes/example/publicode-react/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/publicodes/example/publicode-react/public/manifest.json b/publicodes/example/publicode-react/public/manifest.json new file mode 100644 index 000000000..080d6c77a --- /dev/null +++ b/publicodes/example/publicode-react/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/publicodes/example/publicode-react/public/robots.txt b/publicodes/example/publicode-react/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/publicodes/example/publicode-react/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/publicodes/example/publicode-react/src/App.css b/publicodes/example/publicode-react/src/App.css new file mode 100644 index 000000000..67d8bfd70 --- /dev/null +++ b/publicodes/example/publicode-react/src/App.css @@ -0,0 +1,30 @@ +.App { + text-align: center; +} + +.App-logo { + pointer-events: none; +} + +.App-header { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/publicodes/example/publicode-react/src/App.js b/publicodes/example/publicode-react/src/App.js new file mode 100644 index 000000000..ece818503 --- /dev/null +++ b/publicodes/example/publicode-react/src/App.js @@ -0,0 +1,25 @@ +import './App.css' +import logo from './logo.png' +import Publicodes from './Publicodes.js' + +function App() { + return ( + + ) +} + +export default App diff --git a/publicodes/example/publicode-react/src/CO2-douche.publicodes.yaml b/publicodes/example/publicode-react/src/CO2-douche.publicodes.yaml new file mode 100644 index 000000000..0bd928a34 --- /dev/null +++ b/publicodes/example/publicode-react/src/CO2-douche.publicodes.yaml @@ -0,0 +1,83 @@ +douche: + valeur: oui + icônes: 🚿 + +douche . impact: + icônes: 🍃 + unité: kgCO2eq / mois + valeur: impact par litre * litres d'eau par douche * nombre + +douche . nombre: + question: Combien prenez-vous de douches ? + par défaut: 1 douche / jour + suggestions: + 1 par jour: 1 douche / jour + 5 par semaine: 4 douche / semaine + 2 par jour: 2 douche / jour + + +douche . impact par litre: + somme: + - eau . impact par litre froid + - chauffage . impact par litre + +douche . débit: + valeur: 18 litre/min + références: + économise l'eau: https://www.jeconomiseleau.org/index.php/particuliers/economies-par-usage/la-douche-et-le-bain + +douche . pomme de douche économe: + remplace: + règle: débit + par: 9 litre/min + question: Utilisez-vous une pomme de douche économe ? + par défaut: non + +eau: + icônes: 💧 + +eau . impact par litre froid: + unité: kgCO2eq/litre + formule: 0.000132 + +chauffage: + icônes: 🔥 + +chauffage . type: + par défaut: "'électricité'" + + +chauffage . impact par kWh: + notes: | + La base carbone de l'ADEME ne permet malheureusement pas de faire des liens profonds vers les chiffres utilisés. + Pour l'électricité, nous retenons le chiffre de l'ADEME "Electricité - 2016 - usage : Eau Chaude Sanitaire - consommation". + références: + base carbone ADEME: http://www.bilans-ges.ademe.fr/fr/accueil + électricité: https://www.electricitymap.org/?page=country&solar=false&remote=true&wind=false&countryCode=FR + électricité sur Décrypter l'Energie: https://decrypterlenergie.org/decryptage-quel-est-le-contenu-en-co2-du-kwh-electrique + +chauffage . énergie consommée par litre: + valeur: 0.0325 kWh + références: + analyse du prix d'une douche: https://www.econologie.com/forums/plomberie-et-sanitaire/prix-reel-d-un-bain-ou-d-une-douche-pour-l-eau-et-chauffage-t12727.html + +chauffage . impact par litre: + produit: + assiette: 0.0325 kWh/litre + facteur: + unité: kgCO2eq/kWh + variations: + - si: type = 'gaz' + alors: 0.227 + - si: type = 'fioul' + alors: 0.324 + - si: type = 'électricité' + alors: 0.059 + +douche . durée de la douche: + question: Combien de temps dure votre douche en général ? + par défaut: 10 min + suggestions: + expresse: 5 min + moyenne: 10 min + lente: 20 min diff --git a/publicodes/example/publicode-react/src/Publicodes.js b/publicodes/example/publicode-react/src/Publicodes.js new file mode 100644 index 000000000..8a34939f5 --- /dev/null +++ b/publicodes/example/publicode-react/src/Publicodes.js @@ -0,0 +1,27 @@ +import Engine from 'publicodes' +import { Documentation } from 'publicodes-react' +import { useEffect, useState } from 'react' +import { Router } from 'react-router-dom' + +const rulesURL = require('./CO2-douche.publicodes.md') + +async function initEngine(setEngine) { + const response = await fetch(rulesURL) + const rules = await response.text() + setEngine(new Engine(rules)) +} + +export default function Publicodes() { + const [engine, setEngine] = useState(null) + useEffect(() => initEngine(setEngine), [setEngine]) + + if (!engine) { + return 'Chargement des règles de calculs en cours...' + } + + return ( + + + + ) +} diff --git a/publicodes/example/publicode-react/src/Publicodes.test.js b/publicodes/example/publicode-react/src/Publicodes.test.js new file mode 100644 index 000000000..6db0b8c97 --- /dev/null +++ b/publicodes/example/publicode-react/src/Publicodes.test.js @@ -0,0 +1,10 @@ +import { render, screen } from '@testing-library/react' +import Publicodes from './Publicodes' + +test('renders loading text while fetching rules', () => { + render() + const loadElement = screen.getByText( + /Chargement des règles de calculs en cours.../i + ) + expect(loadElement).toBeInTheDocument() +}) diff --git a/publicodes/example/publicode-react/src/index.css b/publicodes/example/publicode-react/src/index.css new file mode 100644 index 000000000..ec2585e8c --- /dev/null +++ b/publicodes/example/publicode-react/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/publicodes/example/publicode-react/src/index.js b/publicodes/example/publicode-react/src/index.js new file mode 100644 index 000000000..ef2edf8ea --- /dev/null +++ b/publicodes/example/publicode-react/src/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +ReactDOM.render( + + + , + document.getElementById('root') +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/publicodes/example/publicode-react/src/logo.png b/publicodes/example/publicode-react/src/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e09c29d036f1493b41736f528ad6101880d76271 GIT binary patch literal 9296 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 literal 0 HcmV?d00001 diff --git a/publicodes/example/publicode-react/src/setupTests.js b/publicodes/example/publicode-react/src/setupTests.js new file mode 100644 index 000000000..8f2609b7b --- /dev/null +++ b/publicodes/example/publicode-react/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/publicodes/example/publicode-react/yarn.lock b/publicodes/example/publicode-react/yarn.lock new file mode 100644 index 000000000..29439a987 --- /dev/null +++ b/publicodes/example/publicode-react/yarn.lock @@ -0,0 +1,12066 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.5.5": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8" + integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg== + +"@babel/core@7.12.3": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.1" + "@babel/parser" "^7.12.3" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5", "@babel/core@^7.8.4": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.17.tgz#993c5e893333107a2815d8e0d73a2c3755e280b2" + integrity sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.17" + "@babel/helper-module-transforms" "^7.12.17" + "@babel/helpers" "^7.12.17" + "@babel/parser" "^7.12.17" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.1", "@babel/generator@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.17.tgz#9ef1dd792d778b32284411df63f4f668a9957287" + integrity sha512-DSA7ruZrY4WI8VxuS1jWSRezFnghEoYEFrZcw9BizQRmOZiUsiHl59+qEARGPqPikwA/GPTyRCi7isuCK/oyqg== + dependencies: + "@babel/types" "^7.12.17" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.13.9": + version "7.13.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" + integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== + dependencies: + "@babel/types" "^7.13.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-compilation-targets@^7.12.1", "@babel/helper-compilation-targets@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.17.tgz#91d83fae61ef390d39c3f0507cb83979bab837c7" + integrity sha512-5EkibqLVYOuZ89BSg2lv+GG8feywLuvMXNYgf0Im4MssE0mFWPztSpJbildNnUgw0bLI2EsIN4MpSHC2iUJkQA== + dependencies: + "@babel/compat-data" "^7.12.13" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.12.13", "@babel/helper-create-class-features-plugin@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz#704b69c8a78d03fb1c5fcc2e7b593f8a65628944" + integrity sha512-I/nurmTxIxHV0M+rIpfQBF1oN342+yvl2kwZUrQuOClMamHF1w5tknfZubgNOLRoA73SzBFAdFcpb4M9HwOeWQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.12.17" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" + integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + regexpu-core "^4.7.1" + +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a" + integrity sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-hoist-variables@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz#13aba58b7480b502362316ea02f52cca0e9796cd" + integrity sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz#f82838eb06e1235307b6d71457b6670ff71ee5ac" + integrity sha512-Bzv4p3ODgS/qpBE0DiJ9qf5WxSmrQ8gVTe8ClMfwwsY2x/rhykxxy3bXzG7AGTnPB2ij37zGJ/Q/6FruxHxsxg== + dependencies: + "@babel/types" "^7.12.17" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.12.13", "@babel/helper-module-transforms@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.17.tgz#7c75b987d6dfd5b48e575648f81eaac891539509" + integrity sha512-sFL+p6zOCQMm9vilo06M4VHuTxUAwa6IxgL56Tq1DVtA0ziAGTH1ThmJq7xwPqdQlgAbKX3fb0oZNbtRIyA5KQ== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" + integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== + +"@babel/helper-remap-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878" + integrity sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-replace-supers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" + integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + +"@babel/helper-wrap-function@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz#e3ea8cb3ee0a16911f9c1b50d9e99fe8fe30f9ff" + integrity sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/helpers@^7.12.1", "@babel/helpers@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.17.tgz#71e03d2981a6b5ee16899964f4101dc8471d60bc" + integrity sha512-tEpjqSBGt/SFEsFikKds1sLNChKKGGR17flIgQKXH4fG6m9gTgl3gnOC1giHNyaBCSKuTfxaSzHi7UnvqiVKxg== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.17" + "@babel/types" "^7.12.17" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.12.17", "@babel/parser@^7.12.3", "@babel/parser@^7.7.0": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.17.tgz#bc85d2d47db38094e5bb268fc761716e7d693848" + integrity sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg== + +"@babel/parser@^7.13.15": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.15.tgz#8e66775fb523599acb6a289e12929fa5ab0954d8" + integrity sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ== + +"@babel/plugin-proposal-async-generator-functions@^7.12.1", "@babel/plugin-proposal-async-generator-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" + integrity sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" + integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-proposal-decorators@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz#59271439fed4145456c41067450543aee332d15f" + integrity sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-decorators" "^7.12.1" + +"@babel/plugin-proposal-dynamic-import@^7.12.1", "@babel/plugin-proposal-dynamic-import@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz#e0ebd8db65acc37eac518fa17bead2174e224512" + integrity sha512-ZNGoFZqrnuy9H2izB2jLlnNDAfVPlGl5NhFEiFe4D84ix9GQGygF+CWMGHKuE+bpyS/AOuDQCnkiRNqW2IzS1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-namespace-from@^7.12.1", "@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.12.1", "@babel/plugin-proposal-json-strings@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" + integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1", "@babel/plugin-proposal-logical-assignment-operators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" + integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde" + integrity sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz#0e2c6774c4ce48be412119b4d693ac777f7685a6" + integrity sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-numeric-separator@^7.12.1", "@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz#f93f3116381ff94bc676fdcb29d71045cd1ec011" + integrity sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.13" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.1", "@babel/plugin-proposal-optional-catch-binding@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" + integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz#cce122203fc8a32794296fc377c6dedaf4363797" + integrity sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz#e382becadc2cb16b7913b6c672d92e4b33385b5c" + integrity sha512-TvxwI80pWftrGPKHNfkvX/HnoeSTR7gC4ezWnAL39PuktYUe6r8kEpOLTYnkBTsaoeazXm2jHJ22EQ81sdgfcA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71" + integrity sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.1", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-decorators@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" + integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86" + integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" + integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-typescript@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" + integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz#eda5670b282952100c229f8a3bd49e0f6a72e9fe" + integrity sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae" + integrity sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" + +"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-block-scoping@^7.12.1", "@babel/plugin-transform-block-scoping@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" + integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz#9728edc1838b5d62fc93ad830bd523b1fcb0e1f6" + integrity sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d" + integrity sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb" + integrity sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-flow-strip-types@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz#8430decfa7eb2aea5414ed4a3fa6e1652b7d77c4" + integrity sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-flow" "^7.12.1" + +"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz#561ff6d74d9e1c8879cb12dbaf4a14cd29d15cf6" + integrity sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== + dependencies: + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz#43db16249b274ee2e551e2422090aa1c47692d56" + integrity sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.12.1", "@babel/plugin-transform-modules-commonjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50" + integrity sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.12.1", "@babel/plugin-transform-modules-systemjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" + integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== + dependencies: + "@babel/helper-hoist-variables" "^7.12.13" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37" + integrity sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w== + dependencies: + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1", "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + +"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz#461e76dfb63c2dfd327b8a008a9e802818ce9853" + integrity sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.13.tgz#f8ee56888545d53d80f766b3cc1563ab2c241f92" + integrity sha512-qmzKVTn46Upvtxv8LQoQ8mTCdUC83AOVQIQm57e9oekLT5cmK9GOMOfcWhe8jMNx4UJXn/UDhVZ/7lGofVNeDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-display-name@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" + integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-react-display-name@^7.12.1", "@babel/plugin-transform-react-display-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" + integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-jsx-development@^7.12.1", "@babel/plugin-transform-react-jsx-development@^7.12.12": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" + integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.12.17" + +"@babel/plugin-transform-react-jsx-self@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz#422d99d122d592acab9c35ea22a6cfd9bf189f60" + integrity sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-jsx-source@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz#051d76126bee5c9a6aa3ba37be2f6c1698856bcb" + integrity sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-react-jsx@^7.12.1", "@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz#dd2c1299f5e26de584939892de3cfc1807a38f24" + integrity sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/types" "^7.12.17" + +"@babel/plugin-transform-react-pure-annotations@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" + integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" + integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-runtime@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" + integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz#ca0d5645abbd560719c354451b849f14df4a7949" + integrity sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.1", "@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz#655037b07ebbddaf3b7752f55d15c2fd6f5aa865" + integrity sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-typescript@^7.12.1": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.17.tgz#4aa6a5041888dd2e5d316ec39212b0cf855211bb" + integrity sha512-1bIYwnhRoetxkFonuZRtDZPFEjl1l5r+3ITkxLC3mlMaFja+GQFo94b/WHEPjqWLU9Bc+W4oFZbvCGe9eYMu1g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.17" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-typescript" "^7.12.13" + +"@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/preset-env@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.1.tgz#9c7e5ca82a19efc865384bb4989148d2ee5d7ac2" + integrity sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg== + dependencies: + "@babel/compat-data" "^7.12.1" + "@babel/helper-compilation-targets" "^7.12.1" + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.1" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.1" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.1" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.1" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.1" + core-js-compat "^3.6.2" + semver "^5.5.0" + +"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.8.4": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.17.tgz#94a3793ff089c32ee74d76a3c03a7597693ebaaa" + integrity sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg== + dependencies: + "@babel/compat-data" "^7.12.13" + "@babel/helper-compilation-targets" "^7.12.17" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-option" "^7.12.17" + "@babel/plugin-proposal-async-generator-functions" "^7.12.13" + "@babel/plugin-proposal-class-properties" "^7.12.13" + "@babel/plugin-proposal-dynamic-import" "^7.12.17" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.12.13" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.12.13" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" + "@babel/plugin-proposal-optional-chaining" "^7.12.17" + "@babel/plugin-proposal-private-methods" "^7.12.13" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.12.13" + "@babel/plugin-transform-async-to-generator" "^7.12.13" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-classes" "^7.12.13" + "@babel/plugin-transform-computed-properties" "^7.12.13" + "@babel/plugin-transform-destructuring" "^7.12.13" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.12.13" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.12.13" + "@babel/plugin-transform-modules-commonjs" "^7.12.13" + "@babel/plugin-transform-modules-systemjs" "^7.12.13" + "@babel/plugin-transform-modules-umd" "^7.12.13" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.12.13" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.12.13" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.12.13" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.12.13" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.17" + core-js-compat "^3.8.0" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.1.tgz#7f022b13f55b6dd82f00f16d1c599ae62985358c" + integrity sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.12.1" + "@babel/plugin-transform-react-jsx-development" "^7.12.1" + "@babel/plugin-transform-react-jsx-self" "^7.12.1" + "@babel/plugin-transform-react-jsx-source" "^7.12.1" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + +"@babel/preset-react@^7.12.5": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" + integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-react-display-name" "^7.12.13" + "@babel/plugin-transform-react-jsx" "^7.12.13" + "@babel/plugin-transform-react-jsx-development" "^7.12.12" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + +"@babel/preset-typescript@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz#86480b483bb97f75036e8864fe404cc782cc311b" + integrity sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-typescript" "^7.12.1" + +"@babel/runtime-corejs3@^7.10.2": + version "7.12.18" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.12.18.tgz#e5663237e5658e4c09586995d2dd6d2c8cfd6fc0" + integrity sha512-ngR7yhNTjDxxe1VYmhqQqqXZWujGb6g0IoA4qeG6MxNGRnIw2Zo8ImY8HfaQ7l3T6GklWhdNfyhWk0C0iocdVA== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" + integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.6", "@babel/runtime@^7.9.2": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" + integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": + version "7.12.18" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" + integrity sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4", "@babel/template@^7.12.13", "@babel/template@^7.3.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.13", "@babel/traverse@^7.12.17", "@babel/traverse@^7.7.0": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.17.tgz#40ec8c7ffb502c4e54c7f95492dc11b88d718619" + integrity sha512-LGkTqDqdiwC6Q7fWSwQoas/oyiEYw6Hqjve5KOSykXkmFJFqzvGMb9niaUEag3Rlve492Mkye3gLw9FTv94fdQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.17" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.17" + "@babel/types" "^7.12.17" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/traverse@^7.4.5": + version "7.13.15" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.15.tgz#c38bf7679334ddd4028e8e1f7b3aa5019f0dada7" + integrity sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.9" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.15" + "@babel/types" "^7.13.14" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.12.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.17.tgz#9d711eb807e0934c90b8b1ca0eb1f7230d150963" + integrity sha512-tNMDjcv/4DIcHxErTgwB9q2ZcYyN0sUfgGKUK/mm1FJK7Wz+KstoEekxrl/tBiNDgLK1HGi+sppj1An/1DR4fQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@babel/types@^7.13.0", "@babel/types@^7.13.14": + version "7.13.14" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d" + integrity sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@csstools/normalize.css@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" + integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== + +"@emotion/is-prop-valid@^0.8.8": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/stylis@^0.8.4": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + +"@emotion/unitless@^0.7.4": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + +"@eslint/eslintrc@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" + integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.20" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + +"@hapi/joi@^15.1.0": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" + integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.6.2" + jest-util "^26.6.2" + slash "^3.0.0" + +"@jest/core@^26.6.0", "@jest/core@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" + integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/reporters" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^26.6.2" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-resolve-dependencies "^26.6.3" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + jest-watcher "^26.6.2" + micromatch "^4.0.2" + p-each-series "^2.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^26.6.0", "@jest/environment@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" + integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== + dependencies: + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + +"@jest/fake-timers@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" + integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== + dependencies: + "@jest/types" "^26.6.2" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +"@jest/globals@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" + integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/types" "^26.6.2" + expect "^26.6.2" + +"@jest/reporters@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" + integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^26.6.2" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^7.0.0" + optionalDependencies: + node-notifier "^8.0.0" + +"@jest/source-map@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" + integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/test-result@^26.6.0", "@jest/test-result@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" + integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" + integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== + dependencies: + "@jest/test-result" "^26.6.2" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^26.6.0", "@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@pmmmwh/react-refresh-webpack-plugin@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" + integrity sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ== + dependencies: + ansi-html "^0.0.7" + error-stack-parser "^2.0.6" + html-entities "^1.2.1" + native-url "^0.2.6" + schema-utils "^2.6.5" + source-map "^0.7.3" + +"@rollup/plugin-node-resolve@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" + integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== + dependencies: + "@rollup/pluginutils" "^3.0.8" + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.14.2" + +"@rollup/plugin-replace@^2.3.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.1.tgz#c411b5ab72809fb1bfc8b487d8d02eef661460d3" + integrity sha512-XwC1oK5rrtRJ0tn1ioLHS6OV5JTluJF7QE1J/q1hN3bquwjnVxjtMyY9iCnoyH9DQbf92CxajB3o98wZbP3oAQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@sinonjs/commons@^1.7.0": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b" + integrity sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@surma/rollup-plugin-off-main-thread@^1.1.1": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" + integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A== + dependencies: + ejs "^2.6.1" + magic-string "^0.25.0" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + +"@testing-library/dom@^7.28.1": + version "7.30.3" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.30.3.tgz#779ea9bbb92d63302461800a388a5a890ac22519" + integrity sha512-7JhIg2MW6WPwyikH2iL3o7z+FTVgSOd2jqCwTAHqK7Qal2gRRYiUQyURAxtbK9VXm/UTyG9bRihv8C5Tznr2zw== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^4.2.2" + chalk "^4.1.0" + dom-accessibility-api "^0.5.4" + lz-string "^1.4.4" + pretty-format "^26.6.2" + +"@testing-library/jest-dom@^5.11.4": + version "5.11.10" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.11.10.tgz#1cd90715023e1627f5ed26ab3b38e6f22d77046c" + integrity sha512-FuKiq5xuk44Fqm0000Z9w0hjOdwZRNzgx7xGGxQYepWFZy+OYUMOT/wPI4nLYXCaVltNVpU1W/qmD88wLWDsqQ== + dependencies: + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^4.2.2" + chalk "^3.0.0" + css "^3.0.0" + css.escape "^1.5.1" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^11.1.0": + version "11.2.6" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.6.tgz#586a23adc63615985d85be0c903f374dab19200b" + integrity sha512-TXMCg0jT8xmuU8BkKMtp8l7Z50Ykew5WNX8UoIKTaLFwKkP2+1YDhOLA2Ga3wY4x29jyntk7EWfum0kjlYiSjQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^7.28.1" + +"@testing-library/user-event@^12.1.10": + version "12.8.3" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.8.3.tgz#1aa3ed4b9f79340a1e1836bc7f57c501e838704a" + integrity sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ== + dependencies: + "@babel/runtime" "^7.12.5" + +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + +"@types/aria-query@^4.2.0": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.1.tgz#78b5433344e2f92e8b306c06a5622c50c245bf6b" + integrity sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": + version "7.1.12" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" + integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" + integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.0.tgz#b9a1efa635201ba9bc850323a8793ee2d36c04a0" + integrity sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg== + dependencies: + "@babel/types" "^7.3.0" + +"@types/eslint@^7.2.6": + version "7.2.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.6.tgz#5e9aff555a975596c03a98b59ecd103decc70c3c" + integrity sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "0.0.46" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" + integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/html-minifier-terser@^5.0.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" + integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@*": + version "26.0.22" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.22.tgz#8308a1debdf1b807aa47be2838acdcd91e88fbe6" + integrity sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "14.14.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055" + integrity sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^2.0.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.1.tgz#374e31645d58cb18a07b3ecd8e9dede4deb2cccd" + integrity sha512-DxZZbyMAM9GWEzXL+BMZROWz9oo6A9EilwwOMET2UVu2uZTqMWS5S69KVtuVKaRjCUpcrOXRalet86/OpG4kqw== + +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/stack-utils@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" + integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== + +"@types/tapable@*", "@types/tapable@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" + integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== + +"@types/testing-library__jest-dom@^5.9.1": + version "5.9.5" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz#5bf25c91ad2d7b38f264b12275e5c92a66d849b0" + integrity sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ== + dependencies: + "@types/jest" "*" + +"@types/uglify-js@*": + version "3.12.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.12.0.tgz#2bb061c269441620d46b946350c8f16d52ef37c5" + integrity sha512-sYAF+CF9XZ5cvEBkI7RtrG9g2GtMBkviTnBxYYyq+8BWvO4QtXfwwR6a2LFwCi4evMKZfpv6U43ViYvv17Wz3Q== + dependencies: + source-map "^0.6.1" + +"@types/webpack-sources@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.0.tgz#8882b0bd62d1e0ce62f183d0d01b72e6e82e8c10" + integrity sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4.41.8": + version "4.41.26" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.26.tgz#27a30d7d531e16489f9c7607c747be6bc1a459ef" + integrity sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA== + dependencies: + "@types/anymatch" "*" + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + source-map "^0.6.0" + +"@types/yargs-parser@*": + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" + integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + +"@types/yargs@^15.0.0": + version "15.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" + integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^4.5.0": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.2.tgz#981b26b4076c62a5a55873fbef3fe98f83360c61" + integrity sha512-uiQQeu9tWl3f1+oK0yoAv9lt/KXO24iafxgQTkIYO/kitruILGx3uH+QtIAHqxFV+yIsdnJH+alel9KuE3J15Q== + dependencies: + "@typescript-eslint/experimental-utils" "4.15.2" + "@typescript-eslint/scope-manager" "4.15.2" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + lodash "^4.17.15" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.15.2", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.2.tgz#5efd12355bd5b535e1831282e6cf465b9a71cf36" + integrity sha512-Fxoshw8+R5X3/Vmqwsjc8nRO/7iTysRtDqx6rlfLZ7HbT8TZhPeQqbPjTyk2RheH3L8afumecTQnUc9EeXxohQ== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.15.2" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/typescript-estree" "4.15.2" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/experimental-utils@^3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^4.5.0": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.15.2.tgz#c804474321ef76a3955aec03664808f0d6e7872e" + integrity sha512-SHeF8xbsC6z2FKXsaTb1tBCf0QZsjJ94H6Bo51Y1aVEZ4XAefaw5ZAilMoDPlGghe+qtq7XdTiDlGfVTOmvA+Q== + dependencies: + "@typescript-eslint/scope-manager" "4.15.2" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/typescript-estree" "4.15.2" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.15.2.tgz#5725bda656995960ae1d004bfd1cd70320f37f4f" + integrity sha512-Zm0tf/MSKuX6aeJmuXexgdVyxT9/oJJhaCkijv0DvJVT3ui4zY6XYd6iwIo/8GEZGy43cd7w1rFMiCLHbRzAPQ== + dependencies: + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/visitor-keys" "4.15.2" + +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== + +"@typescript-eslint/types@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.15.2.tgz#04acf3a2dc8001a88985291744241e732ef22c60" + integrity sha512-r7lW7HFkAarfUylJ2tKndyO9njwSyoy6cpfDKWPX6/ctZA+QyaYscAHXVAfJqtnY6aaTwDYrOhp+ginlbc7HfQ== + +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== + dependencies: + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.2.tgz#c2f7a1e94f3428d229d5ecff3ead6581ee9b62fa" + integrity sha512-cGR8C2g5SPtHTQvAymEODeqx90pJHadWsgTtx6GbnTWKqsg7yp6Eaya9nFzUd4KrKhxdYTTFBiYeTPQaz/l8bw== + dependencies: + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/visitor-keys" "4.15.2" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== + dependencies: + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/visitor-keys@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.2.tgz#3d1c7979ce75bf6acf9691109bd0d6b5706192b9" + integrity sha512-TME1VgSb7wTwgENN5KVj4Nqg25hP8DisXxNBojM4Nn31rYaNDIocNm5cmjOFfh42n7NVERxWrDFoETO/76ePyg== + dependencies: + "@typescript-eslint/types" "4.15.2" + eslint-visitor-keys "^2.0.0" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +adjust-sourcemap-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" + integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.1.tgz#1e6b37a454021fa9941713f38b952fc1c8d32a84" + integrity sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-html@0.0.7, ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3, anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.1.1, array-includes@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" + is-string "^1.0.5" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +array.prototype.flatmap@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + function-bind "^1.1.1" + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.6.1: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axe-core@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.1.2.tgz#7cf783331320098bfbef620df3b3c770147bc224" + integrity sha512-V+Nq70NxKhYt89ArVcaNL9FDryB3vQOd+BFXZIfO3RP6rwtj+2yqqqdHEkacutglPaZLkJeuXKCjCJDMGPtPqg== + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-extract-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== + dependencies: + babylon "^6.18.0" + +babel-jest@^26.6.0, babel-jest@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-named-asset-import@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd" + integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw== + +"babel-plugin-styled-components@>= 1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.12.0.tgz#1dec1676512177de6b827211e9eda5a30db4f9b9" + integrity sha512-FEiD7l5ZABdJPpLssKXjBUJMYqzbcNzBowfXDCdJhOpbhWiewapUaY+LZGT8R4Jg2TwOjGjG4RKeyrO5p9sBkA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-module-imports" "^7.0.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz#689b60edc705f8a70ce87f47ab0e560a317d7045" + integrity sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg== + dependencies: + "@babel/core" "7.12.3" + "@babel/plugin-proposal-class-properties" "7.12.1" + "@babel/plugin-proposal-decorators" "7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.12.1" + "@babel/plugin-proposal-numeric-separator" "7.12.1" + "@babel/plugin-proposal-optional-chaining" "7.12.1" + "@babel/plugin-transform-flow-strip-types" "7.12.1" + "@babel/plugin-transform-react-display-name" "7.12.1" + "@babel/plugin-transform-runtime" "7.12.1" + "@babel/preset-env" "7.12.1" + "@babel/preset-react" "7.12.1" + "@babel/preset-typescript" "7.12.1" + "@babel/runtime" "7.12.1" + babel-plugin-macros "2.8.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bfj@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" + integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + dependencies: + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.14.2: + version "4.14.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" + integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== + dependencies: + caniuse-lite "^1.0.30001125" + electron-to-chromium "^1.3.564" + escalade "^3.0.2" + node-releases "^1.1.61" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.6.2, browserslist@^4.6.4: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^15.0.5: + version "15.0.5" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" + integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.0" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001181: + version "1.0.30001191" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9" + integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +check-types@^11.1.1: + version "11.1.2" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" + integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" + integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.6: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.4" + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.19.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2, core-js-compat@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.0.tgz#29da39385f16b71e1915565aa0385c4e0963ad56" + integrity sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ== + dependencies: + browserslist "^4.16.3" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.9.0.tgz#326cc74e1fef8b7443a6a793ddb0adfcd81f9efb" + integrity sha512-3pEcmMZC9Cq0D4ZBh3pe2HLtqxpGNJBLXF/kZ2YzK17RbKp94w0HFbdbSx8H8kAlZG5k76hvLrkPm57Uyef+kg== + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-js@^3.6.5: + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.0.tgz#790b1bb11553a2272b36e2625c7179db345492f8" + integrity sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" + integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== + dependencies: + camelcase "^6.0.0" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^2.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.3" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.1" + semver "^7.3.2" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0, css-select@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-to-react-native@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.1, debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.2.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz#b06d059cdd4a4ad9a79275f9d414a5c126241166" + integrity sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ== + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.1.tgz#d845a1565d7c041a95e5dab62184ab41e3a519be" + integrity sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + +domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domhandler@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== + dependencies: + domelementtype "^2.0.1" + +domhandler@^4.0.0, domhandler@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.1.0.tgz#c1d8d494d5ec6db22de99e46a149c2a4d23ddd43" + integrity sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.4.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.5.2.tgz#37ef8ba087dff1a17175e7092e8a042e4b050e6c" + integrity sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.1.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.649: + version "1.3.671" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.671.tgz#8feaed6eae42d279fa4611f58c42a5a1eb81b2a0" + integrity sha512-RTD97QkdrJKaKwRv9h/wGAaoR2lGxNXEcBXS31vjitgTPwTWAbLdS7cEsBK68eEQy7p6YyT8D5BxBEYHu2SuwQ== + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.0.0: + version "9.2.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.1.tgz#c9b25604256bb3428964bead3ab63069d736f7ee" + integrity sha512-117l1H6U4X3Krn+MrzYrL57d5H7siRHWraBs7s+LjRuFK7Fe7hJqnJ0skWlinqsycVLU5YAo6L8CsEYQ0V5prg== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.2: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.1" + is-regex "^1.1.1" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.0.2, escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e" + integrity sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A== + dependencies: + confusing-browser-globals "^1.0.10" + +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-flowtype@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.2.tgz#c6e5dd2fad4e757a1c63e652da6cff597659554f" + integrity sha512-C4PlPYpszr9h1cBfUbTNRI1IdxUCF0qrXAHkXS2+bESp7WUUCnvb3UBBnYlaQLvJYJ2lRz+2SPQQ/WyV7p/Tow== + dependencies: + lodash "^4.17.15" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jest@^24.1.0: + version "24.1.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.5.tgz#1e866a9f0deac587d0a3d5d7cefe99815a580de2" + integrity sha512-FIP3lwC8EzEG+rOs1y96cOJmMVpdFNreoDJv29B5vIupVssRi8zrSY3QadogT0K3h1Y8TMxJ6ZSAzYUmFCp2hg== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +eslint-plugin-jsx-a11y@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== + dependencies: + "@babel/runtime" "^7.11.2" + aria-query "^4.2.2" + array-includes "^3.1.1" + ast-types-flow "^0.0.7" + axe-core "^4.0.2" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.6" + emoji-regex "^9.0.0" + has "^1.0.3" + jsx-ast-utils "^3.1.0" + language-tags "^1.0.5" + +eslint-plugin-react-hooks@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + +eslint-plugin-react@^7.21.5: + version "7.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" + integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== + dependencies: + array-includes "^3.1.1" + array.prototype.flatmap "^1.2.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1 || ^3.0.0" + object.entries "^1.1.2" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.18.1" + string.prototype.matchall "^4.0.2" + +eslint-plugin-testing-library@^3.9.2: + version "3.10.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.1.tgz#4dd02306d601c3238fdabf1d1dbc5f2a8e85d531" + integrity sha512-nQIFe2muIFv2oR2zIuXE4vTbcFNx8hZKRzgHZqJg8rfopIWwoTwtlbCCNELT/jXzVe1uZF68ALGYoDXjLczKiQ== + dependencies: + "@typescript-eslint/experimental-utils" "^3.10.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint-webpack-plugin@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.2.tgz#4ee17577d6392bf72048080a1678d6237183db81" + integrity sha512-ndD9chZ/kaGnjjx7taRg7c6FK/YKb29SSYzaLtPBIYLYJQmZtuKqtQbAvTS2ymiMQT6X0VW9vZIHK0KLstv93Q== + dependencies: + "@types/eslint" "^7.2.6" + arrify "^2.0.1" + jest-worker "^26.6.2" + micromatch "^4.0.2" + schema-utils "^3.0.0" + +eslint@^7.11.0: + version "7.20.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7" + integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.3.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.20" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^26.6.0, expect@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== + dependencies: + "@jest/types" "^26.6.2" + ansi-styles "^4.0.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" + integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-entry-cache@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa" + integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +focus-trap-react@^3.1.2: + version "3.1.4" + resolved "https://registry.yarnpkg.com/focus-trap-react/-/focus-trap-react-3.1.4.tgz#e95f4aece5c493be4d3653dfccd5036d11ad24d5" + integrity sha512-uqMKMg9Xlny0LKHW0HqA7ncLafW57SxgeedjE7/Xt+NB7sdOBUG4eD/9sMsq1O0+7zD3palpniTs2n0PDLc3uA== + dependencies: + focus-trap "^2.0.1" + +focus-trap@^2.0.1: + version "2.4.6" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-2.4.6.tgz#332b475b317cec6a4a129f5307ce7ebc0da90b40" + integrity sha512-vWZTPtBU6pBoyWZDRZJHkXsyP2ZCZBHE3DRVXnSVdQKH/mcDtu9S5Kz8CUDyIqpfZfLEyI9rjKJLnc4Y40BRBg== + dependencies: + tabbable "^1.0.3" + +follow-redirects@^1.0.0: + version "1.13.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" + integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" + integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== + dependencies: + "@babel/code-frame" "^7.5.5" + chalk "^2.4.1" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^11.0.1: + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +harmony-reflect@^1.4.6: + version "1.6.1" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" + integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^1.2.1, html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-parse-stringify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.0.tgz#28f10753e190af211d2c3c9a1191a4502e112c96" + integrity sha512-TrTKp/U0tACrpqalte/VhxepqMLii2mOfC8iuOt4+VA7Zdi6BUKKqNJvEsO17Cr3T3E7PpqLe3NdLII6bcYJgg== + dependencies: + void-elements "3.1.0" + +html-to-react@^1.3.4: + version "1.4.5" + resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.5.tgz#59091c11021d1ef315ef738460abb6a4a41fe1ce" + integrity sha512-KONZUDFPg5OodWaQu2ymfkDmU0JA7zB1iPfvyHehTmMUZnk0DS7/TyCMTzsLH6b4BvxX15g88qZCXFhJWktsmA== + dependencies: + domhandler "^3.3.0" + htmlparser2 "^5.0" + lodash.camelcase "^4.3.0" + ramda "^0.27.1" + +html-webpack-plugin@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" + integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + "@types/tapable" "^1.0.5" + "@types/webpack" "^4.41.8" + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +htmlparser2@^5.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7" + integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.3.0" + domutils "^2.4.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +i18next@^19.4.4: + version "19.9.2" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.9.2.tgz#ea5a124416e3c5ab85fddca2c8e3c3669a8da397" + integrity sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg== + dependencies: + "@babel/runtime" "^7.12.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +identity-obj-proxy@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +immer@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" + integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.4, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.0.0, is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + +is-regex@^1.0.4, is-regex@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" + integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== + dependencies: + "@jest/types" "^26.6.2" + execa "^4.0.0" + throat "^5.0.0" + +jest-circus@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-26.6.0.tgz#7d9647b2e7f921181869faae1f90a2629fd70705" + integrity sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.0" + "@jest/test-result" "^26.6.0" + "@jest/types" "^26.6.0" + "@types/babel__traverse" "^7.0.4" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^26.6.0" + is-generator-fn "^2.0.0" + jest-each "^26.6.0" + jest-matcher-utils "^26.6.0" + jest-message-util "^26.6.0" + jest-runner "^26.6.0" + jest-runtime "^26.6.0" + jest-snapshot "^26.6.0" + jest-util "^26.6.0" + pretty-format "^26.6.0" + stack-utils "^2.0.2" + throat "^5.0.0" + +jest-cli@^26.6.0: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" + integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== + dependencies: + "@jest/core" "^26.6.3" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.6.3" + jest-util "^26.6.2" + jest-validate "^26.6.2" + prompts "^2.0.1" + yargs "^15.4.1" + +jest-config@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" + integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.6.3" + "@jest/types" "^26.6.2" + babel-jest "^26.6.3" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.6.2" + jest-environment-node "^26.6.2" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.6.3" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + micromatch "^4.0.2" + pretty-format "^26.6.2" + +jest-diff@^26.0.0, jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + +jest-each@^26.6.0, jest-each@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" + integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + jest-get-type "^26.3.0" + jest-util "^26.6.2" + pretty-format "^26.6.2" + +jest-environment-jsdom@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +jest-environment-node@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" + integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" + integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.6.2" + is-generator-fn "^2.0.0" + jest-each "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + pretty-format "^26.6.2" + throat "^5.0.0" + +jest-leak-detector@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" + integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== + dependencies: + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-message-util@^26.6.0, jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-resolve-dependencies@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" + integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== + dependencies: + "@jest/types" "^26.6.2" + jest-regex-util "^26.0.0" + jest-snapshot "^26.6.2" + +jest-resolve@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.0.tgz#070fe7159af87b03e50f52ea5e17ee95bbee40e1" + integrity sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ== + dependencies: + "@jest/types" "^26.6.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.0" + read-pkg-up "^7.0.1" + resolve "^1.17.0" + slash "^3.0.0" + +jest-resolve@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" + integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.2" + read-pkg-up "^7.0.1" + resolve "^1.18.1" + slash "^3.0.0" + +jest-runner@^26.6.0, jest-runner@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" + integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-docblock "^26.0.0" + jest-haste-map "^26.6.2" + jest-leak-detector "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + jest-runtime "^26.6.3" + jest-util "^26.6.2" + jest-worker "^26.6.2" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^26.6.0, jest-runtime@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" + integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/globals" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + cjs-module-lexer "^0.6.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.4.1" + +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" + integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.6.2" + graceful-fs "^4.2.4" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + jest-haste-map "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + natural-compare "^1.4.0" + pretty-format "^26.6.2" + semver "^7.3.2" + +jest-util@^26.6.0, jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-validate@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-watch-typeahead@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz#45221b86bb6710b7e97baaa1640ae24a07785e63" + integrity sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^26.0.0" + jest-watcher "^26.3.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + +jest-watcher@^26.3.0, jest-watcher@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" + integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== + dependencies: + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.6.2" + string-length "^4.0.1" + +jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^26.5.0, jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@26.6.0: + version "26.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.0.tgz#546b25a1d8c888569dbbe93cae131748086a4a25" + integrity sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA== + dependencies: + "@jest/core" "^26.6.0" + import-local "^3.0.2" + jest-cli "^26.6.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^16.4.0: + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + dependencies: + array-includes "^3.1.2" + object.assign "^4.1.2" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + +language-subtag-registry@~0.3.2: + version "0.3.21" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= + dependencies: + language-subtag-registry "~0.3.2" + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@2.0.0, loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.assign@^4.0.8: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-add-list-metadata@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf" + integrity sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA== + dependencies: + unist-util-visit-parents "1.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.46.0, "mime-db@>= 1.43.0 < 2": + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + dependencies: + mime-db "1.46.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" + integrity sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +moo@^0.5.0, moo@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" + integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanoid@^3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-url@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" + integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA== + dependencies: + querystring "^0.2.0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nearley@^2.19.2: + version "2.20.1" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" + integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1" + integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" + +node-releases@^1.1.61, node-releases@^1.1.70: + version "1.1.70" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" + integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.8.0, object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.0, object.entries@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" + integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +p-each-series@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" + integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" + integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-browser-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== + dependencies: + postcss "^7" + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" + integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== + dependencies: + postcss "^7.0.26" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== + dependencies: + "@csstools/normalize.css" "^10.1.0" + browserslist "^4.6.2" + postcss "^7.0.17" + postcss-browser-comments "^3.0.0" + sanitize.css "^10.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-safe-parser@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz#459dd27df6bc2ba64608824ba39e45dacf5e852d" + integrity sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ== + dependencies: + postcss "^8.1.0" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^8.1.0: + version "8.2.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.6.tgz#5d69a974543b45f87e464bc4c3e392a97d6be9fe" + integrity sha512-xpB8qYxgPuly166AGlpRjUdEYtmOWx2iCwGmrv4vqZL9YPVviDVPZPRXxnXr6xPZOdxQ9lp3ZBFCRgWJ7LE3Sg== + dependencies: + colorette "^1.2.1" + nanoid "^3.1.20" + source-map "^0.6.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-bytes@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-error@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + dependencies: + asap "~2.0.6" + +prompts@2.4.0, prompts@^2.0.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +publicodes-react@^1.0.0-beta.13: + version "1.0.0-beta.13" + resolved "https://registry.yarnpkg.com/publicodes-react/-/publicodes-react-1.0.0-beta.13.tgz#5ad1db94b0c151f0869a53b19083970c44857510" + integrity sha512-sJXhSVPfrWQ7O1F33yktL0z9wO6OltFkZhyIkGUeUQkheobf+830DFxn5i5Frnawqq7sCzCjcor1BYtUp+szGg== + dependencies: + classnames "^2.2.6" + focus-trap-react "^3.1.2" + i18next "^19.4.4" + publicodes "1.0.0-beta.13" + ramda "^0.27.0" + react-easy-emoji "^1.4.0" + react-helmet "^6.1.0" + react-i18next "^11.4.0" + react-markdown "^4.3.1" + styled-components "^5.1.0" + yaml "^1.9.2" + +publicodes@1.0.0-beta.13, publicodes@^1.0.0-beta.13: + version "1.0.0-beta.13" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-beta.13.tgz#1fc67042ae47e88f66b3fa415bf3847734b314b0" + integrity sha512-RjLoI/8lWs34EB8Ni13s0haFyYmjKCGsyb9w0Xt5CIu9uYgY+rHVQtnXJiYu/3Pm1qIj8zB6cTyu6w0O7eQU6A== + dependencies: + moo "^0.5.1" + nearley "^2.19.2" + yaml "^1.9.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" + integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= + +ramda@^0.27.0, ramda@^0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" + integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-app-polyfill@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" + integrity sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA== + dependencies: + core-js "^3.6.5" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.7" + whatwg-fetch "^3.4.1" + +react-dev-utils@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" + integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== + dependencies: + "@babel/code-frame" "7.10.4" + address "1.1.2" + browserslist "4.14.2" + chalk "2.4.2" + cross-spawn "7.0.3" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.1.0" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "4.1.6" + global-modules "2.0.0" + globby "11.0.1" + gzip-size "5.1.1" + immer "8.0.1" + is-root "2.1.0" + loader-utils "2.0.0" + open "^7.0.2" + pkg-up "3.1.0" + prompts "2.4.0" + react-error-overlay "^6.0.9" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-easy-emoji@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/react-easy-emoji/-/react-easy-emoji-1.4.0.tgz#dfcbb743bf8439af265aa25a1e72998c6d2225ff" + integrity sha512-TcufijpuWKgYgzbySEBukNef+y0HI/4PAJ4gc9vb1CF7Q4CcAS2ZV8VMZk0ObtKKwJJfVgAHVt86nXWOed8QXg== + dependencies: + lodash.assign "^4.0.8" + string-replace-to-array "^1.0.1" + +react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== + +react-fast-compare@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-helmet@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== + dependencies: + object-assign "^4.1.1" + prop-types "^15.7.2" + react-fast-compare "^3.1.1" + react-side-effect "^2.1.0" + +react-i18next@^11.4.0: + version "11.8.13" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.8.13.tgz#9560376f8655b9aaa04f685da8eca0b032034ff9" + integrity sha512-KTNuLYnEwI9y54nSEal4yBxXBnfCCfh7t/0p/UHfhlGNcIMu+V4x/y5zGKzbOEK4noQrUzZ+J47RPYH7rMs2ZQ== + dependencies: + "@babel/runtime" "^7.13.6" + html-parse-stringify "^3.0.0" + +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" + integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== + +react-markdown@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-4.3.1.tgz#39f0633b94a027445b86c9811142d05381300f2f" + integrity sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw== + dependencies: + html-to-react "^1.3.4" + mdast-add-list-metadata "1.0.1" + prop-types "^15.7.2" + react-is "^16.8.6" + remark-parse "^5.0.0" + unified "^6.1.5" + unist-util-visit "^1.3.0" + xtend "^4.0.1" + +react-refresh@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.0, react-router@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-scripts@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-4.0.3.tgz#b1cafed7c3fa603e7628ba0f187787964cb5d345" + integrity sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A== + dependencies: + "@babel/core" "7.12.3" + "@pmmmwh/react-refresh-webpack-plugin" "0.4.3" + "@svgr/webpack" "5.5.0" + "@typescript-eslint/eslint-plugin" "^4.5.0" + "@typescript-eslint/parser" "^4.5.0" + babel-eslint "^10.1.0" + babel-jest "^26.6.0" + babel-loader "8.1.0" + babel-plugin-named-asset-import "^0.3.7" + babel-preset-react-app "^10.0.0" + bfj "^7.0.2" + camelcase "^6.1.0" + case-sensitive-paths-webpack-plugin "2.3.0" + css-loader "4.3.0" + dotenv "8.2.0" + dotenv-expand "5.1.0" + eslint "^7.11.0" + eslint-config-react-app "^6.0.0" + eslint-plugin-flowtype "^5.2.0" + eslint-plugin-import "^2.22.1" + eslint-plugin-jest "^24.1.0" + eslint-plugin-jsx-a11y "^6.3.1" + eslint-plugin-react "^7.21.5" + eslint-plugin-react-hooks "^4.2.0" + eslint-plugin-testing-library "^3.9.2" + eslint-webpack-plugin "^2.5.2" + file-loader "6.1.1" + fs-extra "^9.0.1" + html-webpack-plugin "4.5.0" + identity-obj-proxy "3.0.0" + jest "26.6.0" + jest-circus "26.6.0" + jest-resolve "26.6.0" + jest-watch-typeahead "0.6.1" + mini-css-extract-plugin "0.11.3" + optimize-css-assets-webpack-plugin "5.0.4" + pnp-webpack-plugin "1.6.4" + postcss-flexbugs-fixes "4.2.1" + postcss-loader "3.0.0" + postcss-normalize "8.0.1" + postcss-preset-env "6.7.0" + postcss-safe-parser "5.0.2" + prompts "2.4.0" + react-app-polyfill "^2.0.0" + react-dev-utils "^11.0.3" + react-refresh "^0.8.3" + resolve "1.18.1" + resolve-url-loader "^3.1.2" + sass-loader "^10.0.5" + semver "7.3.2" + style-loader "1.3.0" + terser-webpack-plugin "4.2.3" + ts-pnp "1.2.0" + url-loader "4.1.1" + webpack "4.44.2" + webpack-dev-server "3.11.1" + webpack-manifest-plugin "2.2.0" + workbox-webpack-plugin "5.1.4" + optionalDependencies: + fsevents "^2.1.3" + +react-side-effect@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" + integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.7" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" + integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-parse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95" + integrity sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA== + dependencies: + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^1.1.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^1.0.0" + vfile-location "^2.0.0" + xtend "^4.0.1" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz#483b1ac59c6601ab30a7a596a5965cabccfdd0a5" + integrity sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ== + dependencies: + css-select "^2.0.2" + dom-converter "^0.2" + htmlparser2 "^3.10.1" + lodash "^4.17.20" + strip-ansi "^3.0.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.4, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +replace-ext@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-url-loader@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08" + integrity sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ== + dependencies: + adjust-sourcemap-loader "3.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== + dependencies: + is-core-module "^2.0.0" + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup-plugin-babel@^4.3.3: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" + integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + rollup-pluginutils "^2.8.1" + +rollup-plugin-terser@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" + integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== + dependencies: + "@babel/code-frame" "^7.5.5" + jest-worker "^24.9.0" + rollup-pluginutils "^2.8.2" + serialize-javascript "^4.0.0" + terser "^4.6.2" + +rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^1.31.1: + version "1.32.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" + integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== + dependencies: + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize.css@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== + +sass-loader@^10.0.5: + version "10.1.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" + integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.8: + version "1.10.8" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" + integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== + dependencies: + node-forge "^0.10.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz#2f8ff5d4b659e0d092f7aba0b7c386bd2aa20add" + integrity sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q== + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.4.7" + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" + integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-length@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" + integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-replace-to-array@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string-replace-to-array/-/string-replace-to-array-1.0.3.tgz#c93eba999a5ee24d731aebbaf5aba36b5f18f7bf" + integrity sha1-yT66mZpe4k1zGuu69auja18Y978= + dependencies: + invariant "^2.2.1" + lodash.flatten "^4.2.0" + lodash.isstring "^4.0.1" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.matchall@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" + integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has-symbols "^1.0.1" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== + dependencies: + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" + integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.7.0" + +styled-components@^5.1.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.2.3.tgz#752669fd694aac10de814d96efc287dde0d11385" + integrity sha512-BlR+KrLW3NL1yhvEB+9Nu9Dt51CuOnHoxd+Hj+rYPdtyR8X11uIW9rvhpy3Dk4dXXBsiW1u5U78f00Lf/afGoA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^0.8.8" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" + integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.0.0, svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tabbable@^1.0.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-1.1.3.tgz#0e4ee376f3631e42d7977a074dbd2b3827843081" + integrity sha512-nOWwx35/JuDI4ONuF0ZTo6lYvI0fY0tZCH1ErzY2EXfu4az50ZyiUX8X073FLiZtmWUVlkRnuXsehjJgCw9tYg== + +table@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +tempy@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" + integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== + dependencies: + temp-dir "^1.0.0" + type-fest "^0.3.1" + unique-string "^1.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.4" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.3.4: + version "5.6.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.0.tgz#138cdf21c5e3100b1b3ddfddf720962f88badcd2" + integrity sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-pnp@1.2.0, ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +tsutils@^3.17.1: + version "3.20.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" + integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.3.0.tgz#ada7c045f07ead08abf9e2edd29be1a0c0661132" + integrity sha512-rgPIqOdfK/4J9FhiVrZ3cveAjRRo5rsQBAIhnylX874y1DX/kEKSVdLsnuHB6l1KTjHyU01VjiMBHgU2adejyg== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +unified@^6.1.5: + version "6.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba" + integrity sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^1.1.0" + trough "^1.0.0" + vfile "^2.0.0" + x-is-string "^0.1.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + +unist-util-remove-position@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" + integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A== + dependencies: + unist-util-visit "^1.1.0" + +unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" + integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== + +unist-util-visit-parents@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06" + integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q== + +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + +unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse@^1.4.3, url-parse@^1.4.7: + version "1.5.1" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" + integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + +v8-to-istanbul@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz#5b95cef45c0f83217ec79f8fc7ee1c8b486aee07" + integrity sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vfile-location@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" + integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== + +vfile-message@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" + integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA== + dependencies: + unist-util-stringify-position "^1.1.1" + +vfile@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" + integrity sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w== + dependencies: + is-buffer "^1.1.4" + replace-ext "1.0.0" + unist-util-stringify-position "^1.0.0" + vfile-message "^1.0.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-vitals@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-1.1.1.tgz#2df535e3355fb7fbe34787b44b736e270e539377" + integrity sha512-jYOaqu01Ny1NvMwJ3dBJDUOJ2PGWknZWH4AUnvFOscvbdHMERIKT2TlgiAey5rVyfOePG7so2JcXXZdSnBvioQ== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz#c74028bf5ba8885aaf230e48a20e8936ab8511f0" + integrity sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-manifest-plugin@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== + dependencies: + fs-extra "^7.0.0" + lodash ">=3.5 <5" + object.entries "^1.1.0" + tapable "^1.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.44.2: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.4.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.1.tgz#93bc4005af6c2cc30ba3e42ec3125947c8f54ed3" + integrity sha512-IEmN/ZfmMw6G1hgZpVd0LuZXOQDisrMOZrzYd5x3RAK4bMPlJohKUZWZ9t/QsTvH0dV9TbPDcc2OSuIDcihnHA== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" + integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz#5ae0bbd455f4e9c319e8d827c055bb86c894fd12" + integrity sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA== + dependencies: + workbox-core "^5.1.4" + +workbox-broadcast-update@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" + integrity sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA== + dependencies: + workbox-core "^5.1.4" + +workbox-build@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-5.1.4.tgz#23d17ed5c32060c363030c8823b39d0eabf4c8c7" + integrity sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow== + dependencies: + "@babel/core" "^7.8.4" + "@babel/preset-env" "^7.8.4" + "@babel/runtime" "^7.8.4" + "@hapi/joi" "^15.1.0" + "@rollup/plugin-node-resolve" "^7.1.1" + "@rollup/plugin-replace" "^2.3.1" + "@surma/rollup-plugin-off-main-thread" "^1.1.1" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^8.1.0" + glob "^7.1.6" + lodash.template "^4.5.0" + pretty-bytes "^5.3.0" + rollup "^1.31.1" + rollup-plugin-babel "^4.3.3" + rollup-plugin-terser "^5.3.1" + source-map "^0.7.3" + source-map-url "^0.4.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + tempy "^0.3.0" + upath "^1.2.0" + workbox-background-sync "^5.1.4" + workbox-broadcast-update "^5.1.4" + workbox-cacheable-response "^5.1.4" + workbox-core "^5.1.4" + workbox-expiration "^5.1.4" + workbox-google-analytics "^5.1.4" + workbox-navigation-preload "^5.1.4" + workbox-precaching "^5.1.4" + workbox-range-requests "^5.1.4" + workbox-routing "^5.1.4" + workbox-strategies "^5.1.4" + workbox-streams "^5.1.4" + workbox-sw "^5.1.4" + workbox-window "^5.1.4" + +workbox-cacheable-response@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz#9ff26e1366214bdd05cf5a43da9305b274078a54" + integrity sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA== + dependencies: + workbox-core "^5.1.4" + +workbox-core@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" + integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== + +workbox-expiration@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-5.1.4.tgz#92b5df461e8126114943a3b15c55e4ecb920b163" + integrity sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ== + dependencies: + workbox-core "^5.1.4" + +workbox-google-analytics@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" + integrity sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA== + dependencies: + workbox-background-sync "^5.1.4" + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + workbox-strategies "^5.1.4" + +workbox-navigation-preload@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz#30d1b720d26a05efc5fa11503e5cc1ed5a78902a" + integrity sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ== + dependencies: + workbox-core "^5.1.4" + +workbox-precaching@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-5.1.4.tgz#874f7ebdd750dd3e04249efae9a1b3f48285fe6b" + integrity sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA== + dependencies: + workbox-core "^5.1.4" + +workbox-range-requests@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" + integrity sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw== + dependencies: + workbox-core "^5.1.4" + +workbox-routing@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" + integrity sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw== + dependencies: + workbox-core "^5.1.4" + +workbox-strategies@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" + integrity sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA== + dependencies: + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + +workbox-streams@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-5.1.4.tgz#05754e5e3667bdc078df2c9315b3f41210d8cac0" + integrity sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw== + dependencies: + workbox-core "^5.1.4" + workbox-routing "^5.1.4" + +workbox-sw@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" + integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== + +workbox-webpack-plugin@5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" + integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ== + dependencies: + "@babel/runtime" "^7.5.5" + fast-json-stable-stringify "^2.0.0" + source-map-url "^0.4.0" + upath "^1.1.2" + webpack-sources "^1.3.0" + workbox-build "^5.1.4" + +workbox-window@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-5.1.4.tgz#2740f7dea7f93b99326179a62f1cc0ca2c93c863" + integrity sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw== + dependencies: + workbox-core "^5.1.4" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@^7.2.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" + integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== + +x-is-string@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" + integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI= + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yaml@^1.9.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 67b84716ef19c088c1ac901656435405ad6f4806 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 14 Apr 2021 10:25:04 +0200 Subject: [PATCH 024/319] Corrige le bug de data/mecanism.json manquant sur beta.13 --- publicodes/ui-react/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/publicodes/ui-react/.gitignore b/publicodes/ui-react/.gitignore index 6320cd248..207da157c 100644 --- a/publicodes/ui-react/.gitignore +++ b/publicodes/ui-react/.gitignore @@ -1 +1,2 @@ -data \ No newline at end of file +./source/data +*.tgz From a454f16e7e041741973f711a37082b48f99c0307 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 14 Apr 2021 10:28:07 +0200 Subject: [PATCH 025/319] =?UTF-8?q?Supprime=20i18n=20des=20d=C3=A9pendance?= =?UTF-8?q?s=20de=20publicodes-react?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les traductions n'étaient pas bien gérée, vu que les fichiers de traductions ne sont pas dans le paquet. Par ailleur il y avait un bug de dépendance implicite qui demandait l'instantiation de i18n côté applicatif pour pouvoir utiliser les composants de la bibliothèque. Le support d'autres langues n'est pas la priorité actuelle, mais nous y reviendrons lorsque l'on aura plus de temps --- publicodes/ui-react/package.json | 8 +- .../ui-react/source/data/mecanisms.json | 186 ++++++++++++++++++ publicodes/ui-react/source/index.tsx | 15 +- .../ui-react/source/mecanisms/Barème.tsx | 39 ++-- .../ui-react/source/mecanisms/Composantes.tsx | 7 +- .../ui-react/source/mecanisms/Product.tsx | 7 +- .../ui-react/source/mecanisms/Recalcul.tsx | 7 +- .../source/mecanisms/TauxProgressif.tsx | 7 +- .../ui-react/source/mecanisms/Variations.js | 19 +- .../ui-react/source/mecanisms/common.tsx | 9 +- publicodes/ui-react/source/rule/Examples.js | 57 ------ publicodes/ui-react/source/rule/RulePage.tsx | 10 +- publicodes/ui-react/source/writtenNumbers.ts | 41 ++-- 13 files changed, 238 insertions(+), 174 deletions(-) create mode 100644 publicodes/ui-react/source/data/mecanisms.json delete mode 100644 publicodes/ui-react/source/rule/Examples.js diff --git a/publicodes/ui-react/package.json b/publicodes/ui-react/package.json index 6b2c38e57..7a0f6264a 100644 --- a/publicodes/ui-react/package.json +++ b/publicodes/ui-react/package.json @@ -12,21 +12,23 @@ "prepare": "mkdir -p ./source/data && yarn run --silent js-yaml ../docs/mecanisms.yaml >| ./source/data/mecanisms.json && yarn run build", "test": "echo \"Error: no test specified\"" }, + "files": [ + "dist" + ], "dependencies": { "classnames": "^2.2.6", "focus-trap-react": "^3.1.2", - "i18next": "^19.4.4", "publicodes": "1.0.0-beta.13", + "publicodes-react": "1.0.0-beta.13", "ramda": "^0.27.0", "react-easy-emoji": "^1.4.0", "react-helmet": "^6.1.0", - "react-i18next": "^11.4.0", "react-markdown": "^4.3.1", "styled-components": "^5.1.0", "yaml": "^1.9.2" }, "peerDependencies": { - "react": "^17.0.0", + "react": "^17.0.2", "react-router-dom": "^5.1.1", "react-router-hash-link": "^1.2.2" }, diff --git a/publicodes/ui-react/source/data/mecanisms.json b/publicodes/ui-react/source/data/mecanisms.json new file mode 100644 index 000000000..c40192272 --- /dev/null +++ b/publicodes/ui-react/source/data/mecanisms.json @@ -0,0 +1,186 @@ +{ + "applicable si": { + "chainable": "oui", + "description": "Renvoie `non` si la condition est égale à `non`. Renvoie la valeur sinon.\nPermet de désactiver une règle ou une valeur. ", + "retourne": "Valeur | non", + "exemples": { + "base": "ancienneté: 4 mois prime de vacances:\n applicable si: ancienneté >= 1 an\n valeur: 200€" + } + }, + "non applicable si": { + "chainable": "oui", + "description": "Renvoit `non` si la condition n'est pas égale à `non`\nPermet de désactiver une règle ou une valeur. ", + "retourne": "Valeur | non", + "exemples": { + "base": "ancienneté: 4 mois prime de vacances:\n non applicable si: ancienneté < 1 an\n valeur: 200€" + } + }, + "une de ces conditions": { + "description": "Renvoie `oui` si l'une des règles listées est _applicable_.\n\nÉquivaut à un `ou` logique.", + "retourne": "Booléen", + "exemples": { + "base": "âge: 17 ans mineur émancipé: oui peut voter:\n une de ces conditions:\n - âge >= 18 ans\n - mineur émancipé" + } + }, + "toutes ces conditions": { + "description": "Renvoie `oui` si toutes toutes les règles listées sont _applicables_.\n\nÉquivaut à un `et` logique.", + "argument": [ + "*", + "..." + ], + "exemples": { + "base": "âge: 17 ans citoyenneté française: oui peut voter:\n toutes ces conditions:\n - citoyenneté française\n - âge >= 18 ans" + } + }, + "produit": { + "description": "C'est une multiplication adaptée pour exprimer au mieux les cotisations.\n\nSa propriété `assiette` est multipliée par un pourcentage `taux`, ou par un `facteur` quand ce nom est plus approprié.\n\nLa multiplication peut être plafonnée : ce plafond sépare l'assiette en deux, et la partie au-dessus du plafond est tout simplement ignorée. Dans ce cas, elle se comporte comme une barème en taux marginaux à deux tranches, la deuxième au taux nul et allant de `plafond` à l'infini.", + "argument": { + "assiette": "Valeur à multiplier", + "taux": "Taux à appliquer", + "facteur": "Facteur multiplicatif", + "plafond": "Plafond au-dessus duquel le taux appliqué est nul" + }, + "exemples": { + "base": "cotisation:\n produit:\n assiette: 2000 €/mois\n taux: 5%", + "assiette plafonnée": "plafond sécurité sociale: 3000 €/mois assiette cotisation: 15000 €/mois chômage:\n produit:\n assiette: assiette cotisation\n plafond: 400% * plafond sécurité sociale\n taux: 4%" + } + }, + "variations": { + "description": "Contient une liste de conditions (`si`) et leurs conséquences associées (`alors`), ainsi qu'un cas par défaut (`sinon`).\n\nPour la première condition vraie dans la liste, on retient la valeur qui lui est associée.\n\nSi aucune condition n'est vraie, alors ce mécanisme renvoie implicitement `non`.\n\nCe mécanisme peut aussi être utilisé au sein d'un autre mécanisme avec des attributs, tel que `produit` ou `barème`.", + "arguments": [ + { + "si": "condition à vérifier", + "alors": "consequence évaluée si la condition est vrai" + }, + "...", + { + "sinon": "consequence évaluée si aucune des conditions précédente n'était applicable" + } + ], + "exemples": { + "base": "taux réduit: oui\ntaux allocation familiales:\n variations:\n - si: taux réduit\n alors: 3.45%\n - sinon: 5.25%", + "dans un produit": "assiette cotisation: 2300 €/mois\ntaux réduit: oui\nallocation familiales:\n produit:\n assiette: assiette cotisation\n variations:\n - si: taux réduit\n alors:\n taux: 3.45%\n - sinon:\n taux: 5.25%" + } + }, + "somme": { + "description": "Somme de chaque terme de la liste.\n\nSi un des termes n'est pas applicable, il vaut zéro.\n\nOn peut retrancher des valeurs grâce à l'opérateur unaire `-`", + "arguments": [ + "*", + "..." + ], + "exemples": { + "base": "exemple:\n somme:\n - 15.89 €\n - 12% * 14 €\n - (-20 €)", + "terme non applicable": "a: 50 € b:\n applicable si: non\n valeur: 20 €\n\nsomme:\n somme:\n - a\n - b\n - 40 €" + } + }, + "le maximum de": { + "description": "Renvoie la valeur numérique de la liste de propositions fournie qui est la plus grande.\n\nPour ajouter un plancher à une valeur, préférer l'utilisation du mécanisme `encadrement`.", + "exemples": { + "base": "max: \n le maximum de:\n - 50\n - 100" + } + }, + "le minimum de": { + "description": "Renvoie la valeur numérique de la liste de propositions fournie qui est la plus petite.\n\nPour plafonner une valeur, préférer l'utilisation du mécanisme `encadrement`.", + "exemples": { + "base": "min: \n le minimum de:\n - 50\n - 100" + } + }, + "arrondi": { + "chainable": "oui", + "description": "Arrondit à l'entier le plus proche, ou à une précision donnée.", + "exemples": { + "base": "arrondi:\n arrondi: oui\n valeur: 12.45", + "nombre de décimales": "arrondi:\n arrondi: 2 décimales\n valeur: 2/3" + } + }, + "recalcul": { + "description": "Relance le calcul d'une règle dans une situation différente de la situation courante. Permet par exemple de calculer le montant des cotisations au niveau du SMIC, même si le salaire est plus élevé dans la situation actuelle.", + "exemples": { + "base": "brut: 2000€\ncotisations:\n produit:\n assiette: brut\n taux: 20%\n\ncotisations pour un SMIC:\n recalcul:\n règle: cotisations\n avec:\n brut: 1500 €" + } + }, + "barème": { + "description": "C'est un barème en taux marginaux, mécanisme de calcul connu de par son utilisation dans le calcul de l'impôt sur le revenu.\nL'assiette est décomposée en plusieurs tranches, qui sont multipliées par un taux spécifique et enfin additionnées pour donner le résultat.\nLes tranches sont souvent exprimées sous forme de facteurs d'une variable que l'on appelle `multiplicateur`, par exemple une fois le plafond de la sécurité sociale.", + "exemples": { + "sans multiplicateur": "revenu imposable: 54126 € impôt sur le revenu:\n barème:\n assiette: revenu imposable\n tranches:\n - taux: 0%\n plafond: 9807 €\n - taux: 14%\n plafond: 27086 €\n - taux: 30%\n plafond: 72617 €\n - taux: 41%\n plafond: 153783 €\n - taux: 45%", + "avec multiplicateur": "retraite de base:\n barème:\n assiette: assiette retraite\n multiplicateur: plafond sécurité sociale temps plein\n tranches:\n - taux: 17.75%\n plafond: 1\n - taux: 0.6%\n arrondi: oui" + } + }, + "grille": { + "description": "C'est un barème sous la forme d'une grille de correspondance simple. C'est le mécanisme de calcul de l'impôt neutre, aussi appelé impôt non personnalisé.\nIl est composé de tranches qui se suivent. Il suffit de trouver l'assiette qui correspond à la tranche, et de selectionner le montant associé à l'assiette.", + "exemples": { + "grille avec multiplicateur et unité": "SMIC horaire: 10 €/heure revenu moyen: 1200€/an trimestres validés:\n grille:\n unité: trimestres validés/an\n assiette: revenu moyen\n multiplicateur: SMIC horaire\n tranches:\n - montant: 0\n plafond: 150 heures/an\n - montant: 1\n plafond: 300 heures/an\n - montant: 2\n plafond: 450 heures/an\n - montant: 3\n plafond: 600 heures/an\n - montant: 4" + } + }, + "taux progressif": { + "description": "Ce mécanisme permet de calculer un taux progressif. On spécifie pour chaque tranche le plafond et le taux associé. Le taux effectif renvoyé est calculé en lissant la différence de taux entre la borne inférieure et supérieure de l'assiette.\n\nPar exemple, si nous nous avons les tranches suivantes :\n\n- taux: 50% / plafond: 0\n- taux: 100% / plafond: 1000\n\nPour une assiette de 500, le taux retourné sera 75%, car il correspond au taux situé à la moitié de la tranche correspondante.", + "exemples": { + "base": "chiffre d'affaires: 30000 €/an plafond: 3000 €/mois taux réduction de cotisation:\n taux progressif:\n assiette: chiffre d'affaires\n multiplicateur: plafond\n tranches:\n - taux: 100%\n plafond: 75%\n - taux: 0%\n plafond: 100%" + } + }, + "composantes": { + "description": "Beaucoup de cotisations sont composées de deux parties qui partagent la méthode de calcul mais diffèrent selons certains paramètres. Pour ne pas définir deux variables quasi-redondantes, on utilise ce mécanisme.\nCela permet d'avoir une écriture factorisée, plus facile à lire. \nDans les calculs, `composantes` se comporte **exactement comme une somme**. La documentation, elle, sera adaptée pour montrer chaque composante.\nIl est possible par exemple pour le mécanisme `produit` de garder en commun l'assiette, et de déclarer des composantes pour le taux.\nChaque composante peut également contenir un champs `attributs` de type objet contenant les mécanismes chainés à appliquer à la composante en question.\nLorsque l'on utilise l'attribut `nom`, cela aboutit à la définition de règles imbriquées pour chacun des termes de la somme.\n ", + "exemples": { + "base": "composante:\n produit:\n assiette: assiette de base\n composantes:\n - taux: 2%\n - taux: 4%\n plafond: plafond sécurité sociale", + "Cotisations": "cotisation 1:\n produit:\n assiette: assiette de base\n composantes:\n - attributs:\n nom: employeur\n taux: 5%\n - attributs:\n nom: salarié\n taux: 1%\n\ncotisations salariales :\n somme: \n - cotisation 1 . salarié\n # ...", + "TVA": "prix:\n produit:\n assiette: 50€\n composantes:\n - attributs:\n nom: HT\n - attributs:\n nom: TVA\n taux: 20%\n\nvérification:\n prix = prix . HT + prix . TVA " + } + }, + "abattement": { + "chainable": "oui", + "description": "Permet de réduire le montant d'une valeur.\nLe résultat vaudra toujours au moins zéro, y compris quand le montant de l'abattement est plus grand que le montant abattu.\nIl est possible d'utiliser le mécanisme `abattement` de deux manières :\n - soit en indiquant un montant de la même unité que la valeur, qui lui sera alors soustrait\n - soit en indiquant un pourcentage qui sera utilisé pour calculer l'abattement de manière relative", + "exemples": { + "abattement simple": "revenu imposable:\n valeur: 10000€\n abattement: 2000€", + "abattement supérieur à la valeur": "revenu imposable:\n valeur: 1000€\n abattement: 2000€", + "abattement relatif": "revenu imposable:\n valeur: 2000€\n abattement: 10%" + } + }, + "plancher": { + "chainable": "oui", + "description": "Permet d'ajouter un plancher à une valeur.", + "exemples": { + "base": "revenus: -500€ assiette des cotisations:\n valeur: revenus\n plancher: 0 €" + } + }, + "plafond": { + "chainable": "oui", + "description": "Permet de plafonner une valeur.", + "exemples": { + "base": "salaire: 1300€/mois déduction fiscale:\n valeur: salaire * 10%\n plafond: 5000 €/an" + } + }, + "durée": { + "description": "Permet d'obtenir le nombre de jours entre deux dates", + "exemples": { + "base": "date d'embauche: 14/04/2008 ancienneté en fin d'année:\n unité: an\n durée:\n depuis: date d'embauche\n jusqu'à: 31/12/2020" + } + }, + "unité": { + "chainable": "oui", + "description": "Permet de convertir explicitement une unité.\n\nAffiche un avertissement si la conversion n'est pas possible à cause d'unités incompatibles.\n", + "exemples": { + "base": "salaire: \n valeur: 35 k€/an\n unité: €/mois" + } + }, + "par défaut": { + "chainable": "oui", + "description": "Permet de donner une valeur par défaut pour le calcul, sans influer sur les variables manquantes retournées.\n\nUtile dans le cas d'une situation incomplète où l'on veut quand même retourner une première estimation.\n", + "exemples": { + "base": "prix TTC: \n assiette: prix HT * (100% + TVA)\nTVA: \n par défaut: 20%" + } + }, + "synchronisation": { + "description": "Permet de récupérer certaines informations, telles que les codes postaux des villes, à partir d'APIs externes, telles que l'[API des communes de France](https://geo.api.gouv.fr/decoupage-administratif/communes).\n\nAttention : ce mécanisme est encore en cours de développement, et sa syntaxe n'est pas stable. Se référer aux exemples existants." + }, + "inversion numérique": { + "chainable": "oui", + "description": "Il est souhaitable de rédiger les règles de calcul en publicodes de la même façon qu'elles sont décrites dans la loi ou les interprétations administratives ou juridiques existantes. En conséquence, certaines variables n'auront donc pas de méthode de calcul clairement explicitée, il s'agira donc de la déduire des autres valeurs renseignées.\n\nDe façon simplifiée, il s'agira donc, à partir d'une règle existante explicitant `y = ƒ(x)` de calculer `x` à partir de `y`.\n\nL'inversion numérique permet d'estimer la valeur de la variable en question au plus près à partir d'un des _objectifs_, listés dans la propriété `avec`. Il faut alors renseigner une valeur cible pour ces objectifs.\n\nL'algorithme utilisé est la [méthode de Brent](https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Brent). L'idée générale est de prendre une valeur au hasard pour la variable en question, et d'améliorer mathématiquement le choix jusqu'à ce que les valeurs cibles soient toutes suffisamment proches des objectifs.\n\nSi on demande au moteur la valeur d'une variable qui a pour formule une inversion, il va vérifier qu'une des variables `avec` a bien une valeur (calculée ou saisie), et procéder à l'inversion décrite plus haut à partir de celle-ci. Sinon, ces possibilités d'inversions seront listées comme manquantes." + }, + "résoudre la référence circulaire": { + "description": "Active le calcul itératif pour trouver la valeur de la règle qui résout \nla référence circulaire.\n\nIl est possible pour une règle de se référencer elle-même. Par défaut, le \nmoteur considère qu'il s'agit d'un cycle non voulu, et renvoie 'null' comme valeur\npour la règle en question, en affichant un avertissement.\n\nMais dans certains cas, la formule est bonne et le cycle est voulu. La valeur de la \nrègle attendue est donc celle qui résout l'équation obtenue via la référence cyclique.\n\nLorsque l'on active cette fonctionnalité, le moteur va procéder par essai-erreur jusqu'à \ntrouver cette valeur.\n\nNote : la résolution de cycle est coûteuse en temps de calcul. Il faut donc veiller à\nne pas la cumuler avec l'évaluation d'un autre mécanisme coûteux comme l'inversion numérique\npar exemple.\n", + "exemples": { + "base": "x: \n valeur: 4 * x - 5\n résoudre la référence circulaire: oui", + "calcul du revenu professionnel": "chiffre d'affaires: 10000 €/an\ncotisations: 25% * revenu professionnel\n \nrevenu professionnel: \n valeur: chiffre d'affaires - cotisations\n résoudre la référence circulaire: oui" + } + } +} diff --git a/publicodes/ui-react/source/index.tsx b/publicodes/ui-react/source/index.tsx index a5c4bce57..112f71884 100644 --- a/publicodes/ui-react/source/index.tsx +++ b/publicodes/ui-react/source/index.tsx @@ -1,18 +1,16 @@ -import React, { useEffect } from 'react' -import { Route } from 'react-router-dom' import Engine, { utils } from 'publicodes' -import i18n from 'i18next' +import { Route } from 'react-router-dom' import { BasepathContext, EngineContext, ReferencesImagesContext, } from './contexts' +import References from './rule/References' import RulePage from './rule/RulePage' const { decodeRuleName, encodeRuleName } = utils -export { RuleLink } from './RuleLink' export { default as Explanation } from './Explanation' -import References from './rule/References' +export { RuleLink } from './RuleLink' export { References } type DocumentationProps = { @@ -25,15 +23,8 @@ type DocumentationProps = { export function Documentation({ documentationPath, engine, - language = 'fr', referenceImages = {}, }: DocumentationProps) { - useEffect(() => { - if (language !== i18n.language) { - i18n.changeLanguage(language) - } - }, [language]) - return ( diff --git a/publicodes/ui-react/source/mecanisms/Barème.tsx b/publicodes/ui-react/source/mecanisms/Barème.tsx index 3da966387..b04317e8d 100644 --- a/publicodes/ui-react/source/mecanisms/Barème.tsx +++ b/publicodes/ui-react/source/mecanisms/Barème.tsx @@ -1,10 +1,9 @@ import classNames from 'classnames' -import React from 'react' -import { Trans } from 'react-i18next' -import Explanation from '../Explanation' -import styled from 'styled-components' -import { Mecanism, NodeValuePointer } from './common' import { parseUnit } from 'publicodes' +import React from 'react' +import styled from 'styled-components' +import Explanation from '../Explanation' +import { Mecanism, NodeValuePointer } from './common' export default function Barème({ nodeValue, explanation, unit }) { return ( @@ -19,9 +18,7 @@ export default function Barème({ nodeValue, explanation, unit }) { {/* nous avons remarqué que la notion de taux moyen pour un barème à 2 tranches est moins pertinent pour les règles de calcul des indépendants. Règle empirique à faire évoluer ! */} {nodeValue !== null && explanation.tranches.length > 2 && ( <> - - Taux moyen :{' '} - + Taux moyen : { return ( <>
  • - - Assiette :{' '} - + Assiette :
  • {multiplicateur && !multiplicateur.isDefault && (
  • - - Multiplicateur :{' '} - + Multiplicateur : @@ -66,18 +59,10 @@ export const TrancheTable = ({ tranches, multiplicateur }) => { - - {tranches[0].taux && ( - - )} + + {tranches[0].taux && } {(tranches[0].montant || activeTranche?.nodeValue != null) && ( - + )} @@ -96,10 +81,10 @@ const Tranche = ({ tranche, multiplicateur }) => { - - + - - - - - + + + + + @@ -301,7 +307,7 @@ function ExplicationsResultatFiscal() { + + + + + + + +
    - Plafonds des tranches - - Taux - Plafonds des tranchesTaux - Montant - Montant
    {tranche.plafond.nodeValue === Infinity ? ( - Au-delà du dernier plafond + 'Au-delà du dernier plafond' ) : ( <> - Inférieur à + Inférieur à {multiplicateur && !multiplicateur.isDefault && ( <> diff --git a/publicodes/ui-react/source/mecanisms/Composantes.tsx b/publicodes/ui-react/source/mecanisms/Composantes.tsx index 402d9c3f2..095e51cee 100644 --- a/publicodes/ui-react/source/mecanisms/Composantes.tsx +++ b/publicodes/ui-react/source/mecanisms/Composantes.tsx @@ -1,10 +1,8 @@ -import { Trans, useTranslation } from 'react-i18next' -import writtenNumbers from '../writtenNumbers' import Explanation from '../Explanation' +import writtenNumbers from '../writtenNumbers' import { CapitalizeFirstLetter, InlineMecanismName, Mecanism } from './common' export default function Composantes({ nodeValue, explanation, unit }) { - const { i18n } = useTranslation() return ( - La somme de{' '} - {writtenNumbers[i18n.language ?? 'fr'][explanation.length]}{' '} + La somme de {writtenNumbers[explanation.length]}{' '} :
      diff --git a/publicodes/ui-react/source/mecanisms/Product.tsx b/publicodes/ui-react/source/mecanisms/Product.tsx index 392ad39d0..0e4311ed6 100644 --- a/publicodes/ui-react/source/mecanisms/Product.tsx +++ b/publicodes/ui-react/source/mecanisms/Product.tsx @@ -1,8 +1,7 @@ -import { Trans } from 'react-i18next' import { EvaluatedNode } from 'publicodes/source/AST/types' +import styled from 'styled-components' import Explanation from '../Explanation' import { Mecanism } from './common' -import styled from 'styled-components' export default function Product(node: EvaluatedNode & { nodeKind: 'produit' }) { return ( @@ -18,9 +17,7 @@ export default function Product(node: EvaluatedNode & { nodeKind: 'produit' }) { {!node.explanation.plafond.isDefault && ( - - Plafonnée à :  - + Plafonnée à :  )} diff --git a/publicodes/ui-react/source/mecanisms/Recalcul.tsx b/publicodes/ui-react/source/mecanisms/Recalcul.tsx index ea96e45fb..14c6d346d 100644 --- a/publicodes/ui-react/source/mecanisms/Recalcul.tsx +++ b/publicodes/ui-react/source/mecanisms/Recalcul.tsx @@ -1,6 +1,5 @@ -import { RuleLinkWithContext } from '../RuleLink' -import { Trans } from 'react-i18next' import Explanation from '../Explanation' +import { RuleLinkWithContext } from '../RuleLink' import { Mecanism } from './common' export default function Recalcul({ nodeValue, explanation, unit }) { @@ -8,11 +7,11 @@ export default function Recalcul({ nodeValue, explanation, unit }) { <> {explanation.recalcul && ( - + <> Recalcul de la règle{' '} {' '} avec les valeurs suivantes : - + )} +

      Quel est votre résultat fiscal en 2020 ?
      diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 2d6bc13bd..bc9b9d4c9 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,5 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +<<<<<<< HEAD exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9019,0]"`; exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,0]"`; @@ -85,6 +86,171 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` "[106448,0] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +======= +exports[`calculate aide-déclaration-indépendant: ACRE 1`] = ` +"[9019,12299] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: ACRE 2`] = ` +"[913,1965] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: ACRE 3`] = ` +"[300,715] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: ACRE 4`] = ` +"[1432,2165] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: ACRE 5`] = ` +"[606,1339] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = ` +"[11408,14534] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: RSA 1`] = ` +"[82,210] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: RSA 2`] = ` +"[1021,1436] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = ` +"[9022,11643] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = ` +"[0,119] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = ` +"[14093,17408] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = ` +"[13578,16893] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = ` +"[11461,14776] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = ` +"[14097,17392] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = ` +"[11461,14776] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = ` +"[5651,8931] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: international 1`] = ` +"[14610,14713] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, impôt . domiciliation étranger non implémentée" +`; + +exports[`calculate aide-déclaration-indépendant: international 2`] = ` +"[11875,13245] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = ` +"[11362,14657] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = ` +"[1292,1722] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = ` +"[11368,14648] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = ` +"[1293,1708] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` +"[11368,14648] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = ` +"[1293,1708] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` +"[9453,12733] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; + +exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` +"[1041,1169] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` +"[1041,1201] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = ` +"[1058,1250] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = ` +"[1090,1314] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = ` +"[1293,1708] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = ` +"[2104,2837] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` +"[20929,27392] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; + +exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` +"[106448,170215] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +>>>>>>> 3215df6b (Impute la réduction covid dans chaque cotisations) `; exports[`calculate simulations-artiste-auteur: bnc 1`] = `"[1230]"`; From 03a3679005d3d868a1bb1b9573a278948ec165cb Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 14 Apr 2021 15:38:25 +0200 Subject: [PATCH 046/319] :alien: traductions manquantes --- .../déclaration-revenu-indépendant.yaml | 4 +- mon-entreprise/source/locales/rules-en.yaml | 95 ++++++++++++++++--- 2 files changed, 84 insertions(+), 15 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index e723e727a..17401d7ab 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -176,9 +176,9 @@ aide déclaration revenu indépendant 2020 . réduction covid . cotisations conc # réduction covid: non aide déclaration revenu indépendant 2020 . réduction covid . taux: titre: taux réduction covid - description: | + description: | Calcul du taux de réduction du à l'exonération covid. - Ce chiffre permet ensuite d'imputer correctement la réduction dans les différentes cotisations + Ce chiffre permet ensuite d'imputer correctement la réduction dans les différentes cotisations. valeur: montant / cotisations concernées unité: '%' diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 86d43adcc..4f635122c 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -73,17 +73,54 @@ aide déclaration revenu indépendant 2020 . ACRE: question.fr: Votre entreprise bénéficie-t-elle de l'ACRE ? titre.en: '[automatic] ACRE' titre.fr: ACRE +aide déclaration revenu indépendant 2020 . CFP: + description.en: '[automatic] Contribution to professional training' + description.fr: Contribution à la formation professionnelle + résumé.en: '[automatic] [D]' + résumé.fr: '[D]' + titre.en: '[automatic] PSC' + titre.fr: CFP +aide déclaration revenu indépendant 2020 . CSG déductible: + description.en: '[automatic] Amount of CSG deductible from income tax' + description.fr: Montant de la CSG déductible à l'impôt sur le revenu + résumé.en: '[automatic] [B]' + résumé.fr: '[B]' + titre.en: '[automatic] Deductible CSG' + titre.fr: CSG déductible aide déclaration revenu indépendant 2020 . PRCI: titre.en: '[automatic] PRCI' titre.fr: PRCI aide déclaration revenu indépendant 2020 . SMIC 2020: titre.en: '[automatic] MINIMUM WAGE 2020' titre.fr: SMIC 2020 +aide déclaration revenu indépendant 2020 . assiette sociale: + description.en: '[automatic] Basis for calculating social security contributions' + description.fr: Assiette utilisée pour le calcul des cotisations sociales + résumé.en: '[automatic] [A - (B + C + D)]' + résumé.fr: '[A - (B + C + D)]' + titre.en: '[automatic] social base' + titre.fr: assiette sociale aide déclaration revenu indépendant 2020 . cotisations obligatoires: - résumé.en: '[automatic] [DSBA/DSBB]' - résumé.fr: '[DSBA/DSBB]' - titre.en: '[automatic] Compulsory social security contributions' - titre.fr: Cotisations sociales obligatoires + description.en: > + [automatic] To be reported in : + + - box DSBA/DSBB** on the supplementary data form for the self-employed person's income tax return (form 2042) + + - simplified actual system:** item 326 of form 2033-D-SD + + - normal actual system:** item A5 of form 2053-SD + description.fr: > + À reporter dans : + + - **la case DSBA/DSBB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) + + - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD + + - **régime réel normal :** la rubrique A5 du formulaire 2053-SD + résumé.en: '[automatic] [C]' + résumé.fr: '[C]' + titre.en: '[automatic] Deductible mandatory social security contributions' + titre.fr: Cotisations sociales obligatoires déductibles aide déclaration revenu indépendant 2020 . nature de l'activité: question.en: '[automatic] What is the nature of your business?' question.fr: Quelle est la nature de votre activité ? @@ -168,6 +205,15 @@ aide déclaration revenu indépendant 2020 . plafond sécurité sociale 2020: aide déclaration revenu indépendant 2020 . période: titre.en: '[automatic] period' titre.fr: période +aide déclaration revenu indépendant 2020 . revenu net fiscal: + description.en: + '[automatic] Income before deduction of social security charges + and tax exemptions' + description.fr: Résultat avant déduction des charges sociales et exonérations fiscales + résumé.en: '[automatic] [A]' + résumé.fr: '[A]' + titre.en: '[automatic] net tax income' + titre.fr: revenu net fiscal aide déclaration revenu indépendant 2020 . réduction covid: description.en: > [automatic] Within the framework of the health crisis, the Government has @@ -195,16 +241,15 @@ aide déclaration revenu indépendant 2020 . réduction covid: cotisations sociales liées à la crise du Covid-19 ? titre.en: '[automatic] Covid contribution reduction' titre.fr: Réduction de cotisation Covid -? aide déclaration revenu indépendant 2020 . réduction covid . imputation sur les cotisations obligatoires -: titre.en: '[automatic] imputation covid reduction' - titre.fr: imputation réduction covid +? aide déclaration revenu indépendant 2020 . réduction covid . cotisations concernées +: titre.en: '[automatic] contributions concerned' + titre.fr: cotisations concernées aide déclaration revenu indépendant 2020 . réduction covid . montant: - résumé.en: - '[automatic] included in the amount of contributions calculated above - (for information)' - résumé.fr: intégrée dans le montant des cotisations calculé ci-dessus (pour information) - titre.en: '[automatic] Covid contribution reduction' - titre.fr: Réduction de cotisations Covid + description.en: '[automatic] Reduction integrated in the amount of the + contributions displayed above' + description.fr: Réduction intégrée dans le montant des cotisations affiché ci-dessus + titre.en: '[automatic] Covid discount' + titre.fr: Réduction Covid ? aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020 : titre.en: '[automatic] Autumn 2020' titre.fr: automne 2020 @@ -329,6 +374,17 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi activité. titre.en: '[automatic] Sector called S2' titre.fr: Secteur dit S2 +aide déclaration revenu indépendant 2020 . réduction covid . taux: + description.en: > + [automatic] Calculation of the reduction rate due to the covid exemption. + + This figure is then used to correctly allocate the reduction to the various contributions. + description.fr: > + Calcul du taux de réduction du à l'exonération covid. + + Ce chiffre permet ensuite d'imputer correctement la réduction dans les différentes cotisations. + titre.en: '[automatic] covid reduction rate' + titre.fr: taux réduction covid ? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020 : description.en: > [automatic] Eligibility for the reduction under the second fall 2020 health @@ -602,6 +658,19 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi première vague de la crise sanitaire du printemps 2020 ? titre.en: '[automatic] eligible for aid spring 2020' titre.fr: éligible aide printemps 2020 +aide déclaration revenu indépendant 2020 . total charges sociales déductible: + description.en: | + [automatic] To be reported in : + - simplified actual system:** item 252 of form 2033-B-SD + - normal actual system:** item FZ of form 2052-SD + description.fr: | + À reporter dans : + - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD + - **régime réel normal :** la rubrique FZ du formulaire 2052-SD + résumé.en: '[automatic] [B + C + D]' + résumé.fr: '[B + C + D]' + titre.en: '[automatic] tax-deductible mandatory social security charges' + titre.fr: charges sociales obligatoires déductibles fiscalement artiste-auteur: description.en: The artist-author regime description.fr: Le régime des artistes-auteurs From b74328b43473ec1608ecf1148e3dd114e06e4325 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 14 Apr 2021 16:07:31 +0200 Subject: [PATCH 047/319] =?UTF-8?q?Cache=20le=20bandeau=20pour=20r=C3=A9cu?= =?UTF-8?q?perer=20la=20situation=20pr=C3=A9cendente=20quand=20un=20montan?= =?UTF-8?q?t=20est=20entr=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 28 +++++++++---------- .../déclaration-revenu-indépendant.yaml | 3 +- mon-entreprise/source/locales/rules-en.yaml | 3 -- .../AideDéclarationIndépendant/index.tsx | 4 ++- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 95a645178..7219654ca 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -133,6 +133,7 @@ dirigeant . assimilé salarié . réduction ACRE . taux: taux: 100% - plafond: 100% taux: 0% + dirigeant . assimilé salarié . réduction ACRE . notification taux annuel: formule: oui type: notification @@ -495,7 +496,7 @@ dirigeant . indépendant . assiette des cotisations: dirigeant . indépendant . conjoint collaborateur: question: Avez-vous un conjoint collaborateur ? description: | - Permet au conjoint du dirigeant d'être couvert par la protection sociale moyennant le paiement de cotisations sociales supplémantaires. + Permet au conjoint du dirigeant d'être couvert par la protection sociale moyennant le paiement de cotisations sociales supplémentaires. Pour en bénéficier, l'époux(se) ou partenaire de Pacs du dirigeant doit: - exercer une activité professionnelle régulière et habituelle dans l'entreprise - faire l'objet d'une mention au RCS pour les commerçants ou au répertoire des métiers (RM) pour les artisans @@ -503,7 +504,7 @@ dirigeant . indépendant . conjoint collaborateur: - ne pas être associé de la société. par défaut: non références: - secu-indépendant.fr: https://www.secu-independants.fr/cotisations/conjoint/conjoint-collaborateur/?reg=lorraine&pro=artisan&act=retraite&ae=non#c46535 + secu-independants.fr: https://www.secu-independants.fr/cotisations/conjoint/conjoint-collaborateur/?reg=lorraine&pro=artisan&act=retraite&ae=non#c46535 service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F33429 dirigeant . indépendant . cotisations et contributions . non déductibles: @@ -527,7 +528,7 @@ dirigeant . indépendant . cotisations et contributions . exonérations . ACRE: facteur: prorata sur l'année arrondi: oui références: - Fiche secu-independant.fr: https://www.secu-independants.fr/cotisations/calcul-cotisations/acre/ + Fiche secu-independants.fr: https://www.secu-independants.fr/cotisations/calcul-cotisations/acre/ dirigeant . indépendant . cotisations et contributions . PSS proratisé: titre: plafond de la sécurité sociale proratisé @@ -1122,15 +1123,15 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette Seule la partie imposable des IJSS est retranchée de l'assiette de la CSG, puisque la partie non imposable a déjà été retranchée du revenu net fiscal fourni - formule: - valeur: - somme: - - assiette des cotisations . sans plancher - - cotisations - abattement: - somme: - - revenus étrangers . montant - - dirigeant . indépendant . IJSS . imposable + valeur: + somme: + - assiette des cotisations . sans plancher + - cotisations + abattement: + somme: + - revenus étrangers . montant + - dirigeant . indépendant . IJSS . imposable + plancher: 0 €/mois dirigeant . indépendant . cotisations et contributions . formation professionnelle: produit: @@ -1256,8 +1257,7 @@ dirigeant . indépendant . IJSS: titre: indemnités journalières de sécurité sociale description: >- En cas de maladie, maternité, ou accident, le régime général de Sécurité - sociale ainsi que les régimes spéciaux assurent le versement de prestations - « en espèces ». + sociale assurent le versement de prestations « en espèces ». Ce sont les indemnités journalières de Sécurité sociale (IJSS). diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 17401d7ab..42f47ad7a 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -137,7 +137,6 @@ aide déclaration revenu indépendant 2020 . réduction covid: abattement: taux - règle: dirigeant . indépendant . cotisations et contributions . cotisations sauf dans: - - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette - cotisations concernées par: valeur: dirigeant . indépendant . cotisations et contributions . cotisations @@ -379,7 +378,7 @@ aide déclaration revenu indépendant 2020 . cotisations obligatoires: résumé: '[C]' description: | À reporter dans : - - **la case DSBA/DSBB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) + - **la case DSCA/DSCB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD - **régime réel normal :** la rubrique A5 du formulaire 2053-SD unité: €/an diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 4f635122c..5cf2b361d 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -4613,9 +4613,6 @@ dirigeant . indépendant . IJSS . imposable: les revenus de remplacement perçus **sauf les indemnités journalières en lien avec une Affection de Longue Durée (ALD)**. - - Ces revenus seront déduits de votre assiette des contributions, afin de ne pas être soumis deux fois à la CSG-CRDS : - > Les revenus de remplacement sont : l'allocation forfaitaire de repos maternel, l'indemnité journalière forfaitaire d'interruption d'activité, l’indemnité de remplacement pour maternité, paternité ou adoption et l'indemnité journalière maladie. question.en: '[automatic] What is the gross amount of taxable daily allowances received?' question.fr: Quel est le montant brut des indemnités journalières imposables perçues? diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 4148c6a26..1beb5bc52 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -90,7 +90,9 @@ export default function AideDéclarationIndépendant() { - + {!situation['dirigeant . rémunération . totale'] && ( + + )}

      Quel est votre résultat fiscal en 2020 ?
      From 70f99787f45f82c6482b3182a45e603b1f4c2f64 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 20 Apr 2021 15:45:55 +0200 Subject: [PATCH 048/319] =?UTF-8?q?:bug:=20R=C3=A9pare=20un=20bug=20dans?= =?UTF-8?q?=20le=20m=C3=A9canisme=20r=C3=A9soudre=20le=20cycle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le cache n'était pas réinitialisé, et les valeurs utilisée étaient celle du dernier calcul de la fonction uniroot, qui n'est pas forcément celui du résultat finalement retourné. --- publicodes/CHANGELOG.md | 6 ++++ publicodes/core/source/AST/types.ts | 4 +-- publicodes/core/source/mecanisms/recalcul.ts | 6 ++-- .../résoudre-référence-circulaire.ts | 17 ++++++----- publicodes/core/source/rule.ts | 2 +- .../résoudre-référence-circulaire.yaml | 30 ++++++++++--------- .../ui-react/source/mecanisms/Recalcul.tsx | 5 ++-- 7 files changed, 40 insertions(+), 30 deletions(-) diff --git a/publicodes/CHANGELOG.md b/publicodes/CHANGELOG.md index 041cff1ab..8507b2857 100644 --- a/publicodes/CHANGELOG.md +++ b/publicodes/CHANGELOG.md @@ -25,3 +25,9 @@ **core** - Fix bug sur le mécanisme minimum, une valeur non applicable n'est plus considérée comme valant "0" (#1493) + +## 1.0.0-beta.16 (release candidate) + +**core** + +- Répare un bug dans le mécanisme résoudre le cycle diff --git a/publicodes/core/source/AST/types.ts b/publicodes/core/source/AST/types.ts index 92349e638..e732c828a 100644 --- a/publicodes/core/source/AST/types.ts +++ b/publicodes/core/source/AST/types.ts @@ -17,7 +17,7 @@ import { PlafondNode } from '../mecanisms/plafond' import { PlancherNode } from '../mecanisms/plancher' import { ProductNode } from '../mecanisms/product' import { RecalculNode } from '../mecanisms/recalcul' -import { RésoudreRéférenceCiruclaireNode } from '../mecanisms/résoudre-référence-circulaire' +import { RésoudreRéférenceCirculaireNode } from '../mecanisms/résoudre-référence-circulaire' import { SituationNode } from '../mecanisms/situation' import { SommeNode } from '../mecanisms/sum' import { SynchronisationNode } from '../mecanisms/synchronisation' @@ -58,7 +58,7 @@ export type ASTNode = ( | PlancherNode | ProductNode | RecalculNode - | RésoudreRéférenceCiruclaireNode + | RésoudreRéférenceCirculaireNode | SituationNode | SommeNode | SynchronisationNode diff --git a/publicodes/core/source/mecanisms/recalcul.ts b/publicodes/core/source/mecanisms/recalcul.ts index b5cbaef07..3b7ce082e 100644 --- a/publicodes/core/source/mecanisms/recalcul.ts +++ b/publicodes/core/source/mecanisms/recalcul.ts @@ -32,12 +32,12 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { ) as Array<[ReferenceNode & EvaluatedNode, EvaluatedNode]> const originalCache = this.cache - const originalSituation = { ...this.parsedSituation } + const originalSituation = this.parsedSituation // Optimisation : no need for recalcul if situation is the same const invalidateCache = Object.keys(amendedSituation).length > 0 if (invalidateCache) { this.resetCache() - this.cache._meta = { ...this.cache._meta, inRecalcul: true } + this.cache._meta.inRecalcul = true } this.parsedSituation = { @@ -55,10 +55,12 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { } const evaluatedNode = this.evaluate(node.explanation.recalcul) + this.parsedSituation = originalSituation if (invalidateCache) { this.cache = originalCache } + return { ...node, nodeValue: evaluatedNode.nodeValue, diff --git a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts index ba41f122a..1dee33ea1 100644 --- a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts +++ b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts @@ -6,7 +6,7 @@ import { Context } from '../parsePublicodes' import uniroot from '../uniroot' import { UnitéNode } from './unité' -export type RésoudreRéférenceCiruclaireNode = { +export type RésoudreRéférenceCirculaireNode = { explanation: { ruleToSolve: string valeur: ASTNode @@ -65,19 +65,20 @@ export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoud const defaultMin = -1_000_000 const defaultMax = 100_000_000 - nodeValue = uniroot(test, defaultMin, defaultMax, 1, 30, 2) + nodeValue = uniroot(test, defaultMin, defaultMax, 0.5, 30, 2) } + + this.cache = originalCache + delete this.parsedSituation[node.explanation.ruleToSolve] + if (nodeValue === undefined) { nodeValue = null this.cache._meta.inversionFail = true } - if (nodeValue != null) { - originalCache.nodes.forEach((v, k) => this.cache.nodes.set(k, v)) + if (nodeValue !== null) { + valeur = evaluateWithValue(nodeValue, unit) } - // console.log('iteration résoudre référence circulaire :', i) - this.cache = originalCache - delete this.parsedSituation[node.explanation.ruleToSolve] return { ...node, unit, @@ -98,7 +99,7 @@ export default function parseRésoudreRéférenceCirculaire(v, context: Context) valeur: parse(v.valeur, context), }, nodeKind: 'résoudre référence circulaire', - } as RésoudreRéférenceCiruclaireNode + } as RésoudreRéférenceCirculaireNode } parseRésoudreRéférenceCirculaire.nom = 'résoudre la référence circulaire' diff --git a/publicodes/core/source/rule.ts b/publicodes/core/source/rule.ts index 172deed64..134ff24b3 100644 --- a/publicodes/core/source/rule.ts +++ b/publicodes/core/source/rule.ts @@ -165,7 +165,6 @@ registerEvaluationFunction('rule', function evaluate(node) { explanation.valeur = valeur } - // if (valeur.nodeValue === '') { const evaluation = { ...node, @@ -177,5 +176,6 @@ registerEvaluationFunction('rule', function evaluate(node) { ), ...(valeur && 'unit' in valeur && { unit: valeur.unit }), } + return evaluation }) diff --git a/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml b/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml index 841abfefb..7b006df0a 100644 --- a/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml +++ b/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml @@ -37,15 +37,16 @@ cycle avec inversion et situation vide: situation: cycle avec inversion et situation vide: CA valeur attendue: null - # - nom: net - # situation: - # cycle avec inversion et situation vide: net - # valeur attendue: null - # - nom: net après impôt - # situation: - # cycle avec inversion et situation vide: net après impôt - # valeur attendue: null + - nom: net + situation: + cycle avec inversion et situation vide: net + valeur attendue: null + - nom: net après impôt + situation: + cycle avec inversion et situation vide: net après impôt + valeur attendue: null +# TODO : à corriger cycle avec la règle à inverser fixée dans la situation: valeur: net exemples: @@ -53,13 +54,14 @@ cycle avec la règle à inverser fixée dans la situation: CA: 10000 valeur attendue: 6666.666 -cycle avec la règle du cycle fixée dans la situation: - valeur: CA - exemples: - - situation: - net: 1000 - valeur attendue: 1500 +# cycle avec la règle du cycle fixée dans la situation: +# valeur: CA +# exemples: +# - situation: +# net: 1000 +# valeur attendue: 1500 +# TODO : à corriger # cycle avec une règle reliée fixée dans la situation: # valeur: net # exemples: diff --git a/publicodes/ui-react/source/mecanisms/Recalcul.tsx b/publicodes/ui-react/source/mecanisms/Recalcul.tsx index 14c6d346d..c96381df6 100644 --- a/publicodes/ui-react/source/mecanisms/Recalcul.tsx +++ b/publicodes/ui-react/source/mecanisms/Recalcul.tsx @@ -8,9 +8,8 @@ export default function Recalcul({ nodeValue, explanation, unit }) { <> {explanation.recalcul && ( <> - Recalcul de la règle{' '} - {' '} - avec les valeurs suivantes : + Recalcul de la valeur de {' '} + avec la situation suivante : )}
        From 847cfbc334d7d6bb81d84830500e8b4ba1a5f8f2 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 20 Apr 2021 16:03:55 +0200 Subject: [PATCH 049/319] =?UTF-8?q?La=20r=C3=A9duction=20covid=20sur=20la?= =?UTF-8?q?=20part=20des=20cotisations=20est=20maintenant=20proprement=20r?= =?UTF-8?q?=C3=A9int=C3=A9gr=C3=A9e=20dans=20l'assiette=20de=20la=20CSG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 10 ++- .../déclaration-revenu-indépendant.yaml | 83 +++++++++++-------- 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 7219654ca..76a5d10fb 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -1084,16 +1084,20 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS: nom: non déductible arrondi: oui composantes: - - taux: 2.9% + - taux: + nom: taux + valeur: 2.9% - attributs: nom: revenus de remplacement assiette: dirigeant . indépendant . IJSS . total - taux: 2.9% + taux: non déductible . taux - attributs: nom: déductible arrondi: oui composantes: - - taux: 6.8% + - taux: + nom: taux + valeur: 6.8% - attributs: nom: revenus de remplacement assiette: dirigeant . indépendant . IJSS . total diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 42f47ad7a..a5ecf5fc5 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -125,22 +125,19 @@ aide déclaration revenu indépendant 2020 . période: aide déclaration revenu indépendant 2020 . réduction covid: titre: Réduction de cotisation Covid remplace: - - règle: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible - sauf dans: cotisations concernées - par: - valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible - abattement: taux - - règle: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible - sauf dans: cotisations concernées - par: - valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible - abattement: taux - règle: dirigeant . indépendant . cotisations et contributions . cotisations - sauf dans: - - cotisations concernées + sauf dans: réduction covid . pourcentage cotisations par: valeur: dirigeant . indépendant . cotisations et contributions . cotisations - abattement: taux + abattement: réduction covid . part cotisations + - règle: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible + par: + valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible + abattement: réduction covid . part CSG . non déductible + - règle: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible + par: + valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible + abattement: réduction covid . part CSG . déductible description: | Dans le cadre de la crise sanitaire, le Gouvernement a mis en œuvre plusieurs mesures exceptionnelles concernant les cotisations et contributions sociales des travailleurs indépendants affectés par la crise du coronavirus avec : @@ -162,26 +159,46 @@ aide déclaration revenu indépendant 2020 . réduction covid . montant: somme: - printemps 2020 - automne 2020 - plafond: cotisations concernées - -aide déclaration revenu indépendant 2020 . réduction covid . cotisations concernées: - # recalcul: - # règle: - somme: - - dirigeant . indépendant . cotisations et contributions . cotisations - - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible - - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible - # avec: - # réduction covid: non -aide déclaration revenu indépendant 2020 . réduction covid . taux: - titre: taux réduction covid - description: | - Calcul du taux de réduction du à l'exonération covid. - Ce chiffre permet ensuite d'imputer correctement la réduction dans les différentes cotisations. - valeur: montant / cotisations concernées - unité: '%' - +aide déclaration revenu indépendant 2020 . réduction covid . part cotisations: + titre: Part réduction Covid sur cotisations (hors CSG/CRDS) + arrondi: oui + # résoudre la référence circulaire: oui + produit: + assiette: montant + taux: pourcentage cotisations + +aide déclaration revenu indépendant 2020 . réduction covid . pourcentage cotisations: + unité: '%' + recalcul: + règle: dirigeant . indépendant . cotisations et contributions . cotisations / dirigeant . indépendant . cotisations et contributions + avec: + réduction covid: non + + + +aide déclaration revenu indépendant 2020 . réduction covid . part CSG: + titre: Part réduction Covid sur CSG + valeur: montant - part cotisations + +aide déclaration revenu indépendant 2020 . réduction covid . part CSG . déductible: + titre: Part réduction Covid sur CSG/CRDS déductible + produit: + assiette: part CSG + taux: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible . taux / taux CSG + arrondi: oui + +aide déclaration revenu indépendant 2020 . réduction covid . part CSG . non déductible: + titre: Part réduction Covid sur CSG/CRDS non déductible + valeur: part CSG - part CSG . déductible + +aide déclaration revenu indépendant 2020 . réduction covid . taux CSG: + unité: '%' + valeur: + somme: + - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible . taux + - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible . taux + aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020: applicable si: éligible aide printemps 2020 formule: @@ -382,7 +399,7 @@ aide déclaration revenu indépendant 2020 . cotisations obligatoires: - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD - **régime réel normal :** la rubrique A5 du formulaire 2053-SD unité: €/an - valeur: dirigeant . indépendant . cotisations et contributions . cotisations + valeur: dirigeant . indépendant . cotisations et contributions . cotisations références: Notice impots.gouv.fr: https://www.impots.gouv.fr/portail/www2/fichiers/documentation/brochure/ir_2021/pdf_som/11-bis-decla_fusion_fisc_185a195.pdf From 8e39aa53952a1aef5f969148a4e42602ad64b902 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 20 Apr 2021 15:54:41 +0200 Subject: [PATCH 050/319] Corrige les tests de non regression --- mon-entreprise/source/locales/rules-en.yaml | 74 ++++++++++--------- .../__snapshots__/simulations.jest.js.snap | 24 +++--- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 5cf2b361d..fee4799be 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -104,7 +104,7 @@ aide déclaration revenu indépendant 2020 . cotisations obligatoires: description.en: > [automatic] To be reported in : - - box DSBA/DSBB** on the supplementary data form for the self-employed person's income tax return (form 2042) + - the DSCA/DSCB box** on the supplementary data form for the self-employed tax return (form 2042) - simplified actual system:** item 326 of form 2033-D-SD @@ -112,7 +112,7 @@ aide déclaration revenu indépendant 2020 . cotisations obligatoires: description.fr: > À reporter dans : - - **la case DSBA/DSBB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) + - **la case DSCA/DSCB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD @@ -241,9 +241,6 @@ aide déclaration revenu indépendant 2020 . réduction covid: cotisations sociales liées à la crise du Covid-19 ? titre.en: '[automatic] Covid contribution reduction' titre.fr: Réduction de cotisation Covid -? aide déclaration revenu indépendant 2020 . réduction covid . cotisations concernées -: titre.en: '[automatic] contributions concerned' - titre.fr: cotisations concernées aide déclaration revenu indépendant 2020 . réduction covid . montant: description.en: '[automatic] Reduction integrated in the amount of the contributions displayed above' @@ -287,6 +284,21 @@ aide déclaration revenu indépendant 2020 . réduction covid . montant: affectant de manière prépondérante la poursuite de votre activité titre.en: '[automatic] S2' titre.fr: S2 +aide déclaration revenu indépendant 2020 . réduction covid . part CSG: + titre.en: '[automatic] Covid reduction on CSG' + titre.fr: Part réduction Covid sur CSG +? aide déclaration revenu indépendant 2020 . réduction covid . part CSG . déductible +: titre.en: '[automatic] Covid reduction on deductible CSG/CRDS' + titre.fr: Part réduction Covid sur CSG/CRDS déductible +? aide déclaration revenu indépendant 2020 . réduction covid . part CSG . non déductible +: titre.en: '[automatic] Covid reduction on non-deductible CSG/CRDS' + titre.fr: Part réduction Covid sur CSG/CRDS non déductible +aide déclaration revenu indépendant 2020 . réduction covid . part cotisations: + titre.en: '[automatic] Covid reduction on contributions (excluding CSG/CRDS)' + titre.fr: Part réduction Covid sur cotisations (hors CSG/CRDS) +? aide déclaration revenu indépendant 2020 . réduction covid . pourcentage cotisations +: titre.en: '[automatic] percentage contributions' + titre.fr: pourcentage cotisations aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: description.en: > [automatic] The conditions of eligibility for "Covid" aid depend on the @@ -374,17 +386,9 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi activité. titre.en: '[automatic] Sector called S2' titre.fr: Secteur dit S2 -aide déclaration revenu indépendant 2020 . réduction covid . taux: - description.en: > - [automatic] Calculation of the reduction rate due to the covid exemption. - - This figure is then used to correctly allocate the reduction to the various contributions. - description.fr: > - Calcul du taux de réduction du à l'exonération covid. - - Ce chiffre permet ensuite d'imputer correctement la réduction dans les différentes cotisations. - titre.en: '[automatic] covid reduction rate' - titre.fr: taux réduction covid +aide déclaration revenu indépendant 2020 . réduction covid . taux CSG: + titre.en: '[automatic] CSG rate' + titre.fr: taux CSG ? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020 : description.en: > [automatic] Eligibility for the reduction under the second fall 2020 health @@ -4574,18 +4578,17 @@ dirigeant . indépendant: titre.fr: indépendant dirigeant . indépendant . IJSS: description.en: >- - [automatic] In the event of illness, maternity or accident, the general - social security system and special schemes provide "cash" benefits. + [automatic] In case of illness, maternity or accident, the general Social + Security system provides cash benefits. - These are per diems from Social Security (IJSS). + These are the Social Security daily allowances (IJSS). - Compensation in addition to the Social Security daily allowances paid under a provident fund contract does not constitute replacement income. + The additional indemnities to the daily indemnities of the Social Security paid within the framework of a provident contract do not constitute replacement income. - Note: Disability benefits paid by disability/death plans are not affected. + Note: Disability benefits paid by disability and death schemes are not concerned description.fr: >- En cas de maladie, maternité, ou accident, le régime général de Sécurité - sociale ainsi que les régimes spéciaux assurent le versement de prestations - « en espèces ». + sociale assurent le versement de prestations « en espèces ». Ce sont les indemnités journalières de Sécurité sociale (IJSS). @@ -4600,12 +4603,12 @@ dirigeant . indépendant . IJSS: titre.fr: indemnités journalières de sécurité sociale dirigeant . indépendant . IJSS . imposable: description.en: >- - [automatic] Indicate only the taxable replacement income received, i.e. all - replacement income received **except for daily allowances in connection with - a Long Term Affection (LTA)**. + [automatic] Indicate only taxable replacement income received, i.e. all + replacement income received **except for daily allowances related to a Long + Term Condition (LTC)**. - This income will be deducted from your contribution base, so that you are not subject to the CSG-CRDS twice: + This income will be deducted from your contribution base, so that you are not subject to CSG-CRDS twice: > Replacement income is: the lump-sum maternal rest allowance, the lump-sum daily allowance for interruption of activity, the replacement allowance for maternity, paternity or adoption and the daily sickness allowance. description.fr: >- @@ -4613,6 +4616,9 @@ dirigeant . indépendant . IJSS . imposable: les revenus de remplacement perçus **sauf les indemnités journalières en lien avec une Affection de Longue Durée (ALD)**. + + Ces revenus seront déduits de votre assiette des contributions, afin de ne pas être soumis deux fois à la CSG-CRDS : + > Les revenus de remplacement sont : l'allocation forfaitaire de repos maternel, l'indemnité journalière forfaitaire d'interruption d'activité, l’indemnité de remplacement pour maternité, paternité ou adoption et l'indemnité journalière maladie. question.en: '[automatic] What is the gross amount of taxable daily allowances received?' question.fr: Quel est le montant brut des indemnités journalières imposables perçues? @@ -5766,21 +5772,21 @@ dirigeant . indépendant . assiette des cotisations: titre.fr: assiette des cotisations dirigeant . indépendant . conjoint collaborateur: description.en: > - [automatic] Allows the executive's spouse to be covered by social protection - by paying additional social security contributions. + [automatic] Allows the manager's spouse to be covered by social protection + in return for the payment of additional social contributions. - In order to benefit from it, the officer's spouse or Pacs partner must: + To benefit from this, the manager's spouse or PACS partner must - - carry out a regular and customary professional activity in the company + - carry out a regular and usual professional activity in the company - - be listed in the RCS for merchants or in the Répertoire des métiers (RM) for craftspeople + - be listed in the RCS for traders or in the RM for craftsmen - - go unremunerated + - not be remunerated - not be a partner in the company. description.fr: > Permet au conjoint du dirigeant d'être couvert par la protection sociale - moyennant le paiement de cotisations sociales supplémantaires. + moyennant le paiement de cotisations sociales supplémentaires. Pour en bénéficier, l'époux(se) ou partenaire de Pacs du dirigeant doit: diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index bc9b9d4c9..f1a45c1b3 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -128,7 +128,7 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait `; exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = ` -"[9022,11643] +"[9102,11489] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -138,7 +138,7 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = ` -"[14093,17408] +"[14092,17407] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -188,7 +188,7 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait `; exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = ` -"[11368,14648] +"[11367,14647] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -198,7 +198,7 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait `; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[11368,14648] +"[11367,14647] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -223,7 +223,7 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = ` -"[1058,1250] +"[1059,1251] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -376,7 +376,7 @@ exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,103 exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6686,13314,13854,0,13314,0,20000]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` -"[300000,79622,220378,228522,75412,144966,0,300000] +"[300000,79622,220378,228521,75412,144966,0,300000] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -398,7 +398,7 @@ exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084 exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1366,634,686,0,634,0,2000]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16002,33998,35352,3500,30498,0,50000]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,3500,30497,0,50000]"`; exports[`calculate simulations-indépendant: inversions 3`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`; @@ -408,7 +408,7 @@ exports[`calculate simulations-indépendant: inversions 5`] = `"[14460,4460,1000 exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5870,13130,13643,0,13130,1000,20000]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5557,12443,12928,0,12443,2000,20000]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5558,12442,12929,0,12442,2000,20000]"`; exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1841,1341,500,547,0,500,0,1841]"`; @@ -418,7 +418,7 @@ exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3025,1 exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3618,1618,2000,2095,0,2000,0,3618]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7302,2302,5000,5195,0,5000,0,7302]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7303,2303,5000,5196,0,5000,0,7303]"`; exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`; @@ -456,7 +456,7 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d exports[`calculate simulations-professions-libérales: auxiliaire médical 1`] = `"[30000,0,7733,22267,946,21321]"`; -exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = `"[30000,0,8059,21941,933,21008]"`; +exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = `"[30000,0,8058,21942,933,21009]"`; exports[`calculate simulations-professions-libérales: auxiliaire médical 3`] = `"[300000,0,61611,238389,81356,157033]"`; @@ -692,10 +692,10 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13814,0,10116,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33998,0,24913,4,48]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33997,0,24913,4,48]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 8`] = ` -"[0,69896,0,36428,4,56] +"[0,69895,0,36428,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; From 4b9d2a394b429e7bf28752f4da60a368fd707a73 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 20 Apr 2021 16:25:34 +0200 Subject: [PATCH 051/319] Ajoute le conjoint collaborateur --- modele-social/règles/dirigeant.yaml | 2 +- .../déclaration-revenu-indépendant.yaml | 24 ++++++++++++++++--- .../AideDéclarationIndépendant/index.tsx | 2 +- .../__snapshots__/simulations.jest.js.snap | 22 ++++++++++++----- .../aide-déclaration-indépendants.yaml | 13 ++++++++++ 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 76a5d10fb..4fc014e14 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -717,7 +717,6 @@ dirigeant . indépendant . cotisations et contributions . cotisations: - indemnités journalières maladie - invalidité et décès - allocations familiales - - conjoint collaborateur . cotisations - PCV - (- exonérations) @@ -730,6 +729,7 @@ dirigeant . indépendant . cotisations et contributions: somme: - cotisations et contributions . cotisations + - conjoint collaborateur . cotisations - contrats madelin . montant - CSG et CRDS - contributions spéciales diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index a5ecf5fc5..0466a2c72 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -154,11 +154,27 @@ aide déclaration revenu indépendant 2020 . réduction covid: aide déclaration revenu indépendant 2020 . réduction covid . montant: titre: Réduction Covid - description: Réduction intégrée dans le montant des cotisations affiché ci-dessus formule: somme: - printemps 2020 - automne 2020 +aide déclaration revenu indépendant 2020 . réduction covid . conjoint collaborateur: + applicable si: dirigeant . indépendant . conjoint collaborateur + remplace: + règle: dirigeant . indépendant . conjoint collaborateur . cotisations + par: + valeur: dirigeant . indépendant . conjoint collaborateur . cotisations + abattement: réduction covid . conjoint collaborateur + valeur: montant + +aide déclaration revenu indépendant 2020 . réduction covid . total: + title: Réduction Covid + description: Intégrée dans le montant des cotisations affiché ci-dessus + somme: + - montant + - conjoint collaborateur + + aide déclaration revenu indépendant 2020 . réduction covid . part cotisations: titre: Part réduction Covid sur cotisations (hors CSG/CRDS) @@ -171,7 +187,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . part cotisations aide déclaration revenu indépendant 2020 . réduction covid . pourcentage cotisations: unité: '%' recalcul: - règle: dirigeant . indépendant . cotisations et contributions . cotisations / dirigeant . indépendant . cotisations et contributions + règle: dirigeant . indépendant . cotisations et contributions . cotisations / (dirigeant . indépendant . cotisations et contributions . cotisations + dirigeant . indépendant . cotisations et contributions . CSG et CRDS) avec: réduction covid: non @@ -399,7 +415,9 @@ aide déclaration revenu indépendant 2020 . cotisations obligatoires: - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD - **régime réel normal :** la rubrique A5 du formulaire 2053-SD unité: €/an - valeur: dirigeant . indépendant . cotisations et contributions . cotisations + somme: + - dirigeant . indépendant . cotisations et contributions . cotisations + - dirigeant . indépendant . conjoint collaborateur . cotisations références: Notice impots.gouv.fr: https://www.impots.gouv.fr/portail/www2/fichiers/documentation/brochure/ir_2021/pdf_som/11-bis-decla_fusion_fisc_185a195.pdf diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 1beb5bc52..524445ba3 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -516,7 +516,7 @@ function Results() { `} > {([ - 'aide déclaration revenu indépendant 2020 . réduction covid . montant', + 'aide déclaration revenu indépendant 2020 . réduction covid . total', 'aide déclaration revenu indépendant 2020 . revenu net fiscal', 'aide déclaration revenu indépendant 2020 . CSG déductible', 'aide déclaration revenu indépendant 2020 . CFP', diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index f1a45c1b3..2b4e23127 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -128,7 +128,7 @@ Notifications affichées : dirigeant . indépendant . avertissement base forfait `; exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = ` -"[9102,11489] +"[9081,11484] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; @@ -137,28 +137,38 @@ exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = ` Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = ` +"[69,195] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + +exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = ` +"[7573,9371] +Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" +`; + exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = ` -"[14092,17407] +"[14155,17233] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = ` -"[13578,16893] +"[13637,16759] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = ` -"[11461,14776] +"[11515,14625] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = ` -"[14097,17392] +"[14160,17219] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = ` -"[11461,14776] +"[11541,14553] Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" `; diff --git a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml index 5a4d8d183..cc4560db6 100644 --- a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml +++ b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml @@ -95,3 +95,16 @@ aide covid 2020: aide déclaration revenu indépendant 2020 . réduction covid: oui aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'" aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui + - dirigeant . rémunération . totale: 15000 €/an + aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" + aide déclaration revenu indépendant 2020 . réduction covid: oui + aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'" + aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui + aide déclaration revenu indépendant 2020 . ACRE: oui + entreprise . date de création: 01/07/2020 + - dirigeant . rémunération . totale: 35000 €/an + aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" + aide déclaration revenu indépendant 2020 . réduction covid: oui + aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: "'S1'" + aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: oui + dirigeant . indépendant . conjoint collaborateur: oui From 3edef771ee000b8c3c0b46c9e06f9d895248c471 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 20 Apr 2021 17:47:15 +0200 Subject: [PATCH 052/319] =?UTF-8?q?Ajoute=20les=20informations=20sp=C3=A9c?= =?UTF-8?q?ifiques=20aux=20BNC=20sur=20l'aide=20=C3=A0=20la=20d=C3=A9clara?= =?UTF-8?q?tion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 5 +- .../déclaration-revenu-indépendant.yaml | 4 +- .../components/conversation/Explicable.tsx | 4 +- mon-entreprise/source/locales/rules-en.yaml | 34 +++++++---- .../AideDéclarationIndépendant/index.tsx | 56 ++++++++++++++----- 5 files changed, 76 insertions(+), 27 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 4fc014e14..15ed9359a 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -1260,8 +1260,9 @@ dirigeant . indépendant . cotisations et contributions . maladie domiciliation dirigeant . indépendant . IJSS: titre: indemnités journalières de sécurité sociale description: >- - En cas de maladie, maternité, ou accident, le régime général de Sécurité - sociale assurent le versement de prestations « en espèces ». + En cas de maladie, maternité, ou accident, y compris suite à un arrêt de travail ou un arrêt + pour garde d’enfant en lien avec l’épidémie du Covid-19, le régime général de Sécurité + sociale assure le versement de prestations « en espèces ». Ce sont les indemnités journalières de Sécurité sociale (IJSS). diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 0466a2c72..3b9fe9e64 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -168,7 +168,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . conjoint collabo valeur: montant aide déclaration revenu indépendant 2020 . réduction covid . total: - title: Réduction Covid + titre: Réduction Covid description: Intégrée dans le montant des cotisations affiché ci-dessus somme: - montant @@ -414,6 +414,7 @@ aide déclaration revenu indépendant 2020 . cotisations obligatoires: - **la case DSCA/DSCB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD - **régime réel normal :** la rubrique A5 du formulaire 2053-SD + - **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD unité: €/an somme: - dirigeant . indépendant . cotisations et contributions . cotisations @@ -443,6 +444,7 @@ aide déclaration revenu indépendant 2020 . total charges sociales déductible: À reporter dans : - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD - **régime réel normal :** la rubrique FZ du formulaire 2052-SD + - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD aide déclaration revenu indépendant 2020 . assiette sociale: diff --git a/mon-entreprise/source/components/conversation/Explicable.tsx b/mon-entreprise/source/components/conversation/Explicable.tsx index 6c1d02220..8b4a2bc98 100644 --- a/mon-entreprise/source/components/conversation/Explicable.tsx +++ b/mon-entreprise/source/components/conversation/Explicable.tsx @@ -39,7 +39,9 @@ export function ExplicableRule({ dottedName }: { dottedName: DottedName }) { } export function Explicable({ children }: { children: React.ReactNode }) { - const { Portal } = usePortal() + const { Portal } = usePortal({ + bindTo: document.getElementsByClassName('app-container')[0] as HTMLElement, + }) const [isOpen, setIsOpen] = useState(false) return ( <> diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index fee4799be..a26a6cd3d 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -108,7 +108,9 @@ aide déclaration revenu indépendant 2020 . cotisations obligatoires: - simplified actual system:** item 326 of form 2033-D-SD - - normal actual system:** item A5 of form 2053-SD + - normal actual regime:** item A5 of form 2053-SD + + - controlled declaration:** item BT of form 2035-A-SD description.fr: > À reporter dans : @@ -117,6 +119,8 @@ aide déclaration revenu indépendant 2020 . cotisations obligatoires: - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD - **régime réel normal :** la rubrique A5 du formulaire 2053-SD + + - **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD résumé.en: '[automatic] [C]' résumé.fr: '[C]' titre.en: '[automatic] Deductible mandatory social security contributions' @@ -241,10 +245,10 @@ aide déclaration revenu indépendant 2020 . réduction covid: cotisations sociales liées à la crise du Covid-19 ? titre.en: '[automatic] Covid contribution reduction' titre.fr: Réduction de cotisation Covid +? aide déclaration revenu indépendant 2020 . réduction covid . conjoint collaborateur +: titre.en: '[automatic] collaborating spouse' + titre.fr: conjoint collaborateur aide déclaration revenu indépendant 2020 . réduction covid . montant: - description.en: '[automatic] Reduction integrated in the amount of the - contributions displayed above' - description.fr: Réduction intégrée dans le montant des cotisations affiché ci-dessus titre.en: '[automatic] Covid discount' titre.fr: Réduction Covid ? aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020 @@ -389,6 +393,11 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi aide déclaration revenu indépendant 2020 . réduction covid . taux CSG: titre.en: '[automatic] CSG rate' titre.fr: taux CSG +aide déclaration revenu indépendant 2020 . réduction covid . total: + description.en: '[automatic] Included in the amount of contributions shown above' + description.fr: Intégrée dans le montant des cotisations affiché ci-dessus + titre.en: '[automatic] Covid discount' + titre.fr: Réduction Covid ? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020 : description.en: > [automatic] Eligibility for the reduction under the second fall 2020 health @@ -666,11 +675,13 @@ aide déclaration revenu indépendant 2020 . total charges sociales déductible: description.en: | [automatic] To be reported in : - simplified actual system:** item 252 of form 2033-B-SD - - normal actual system:** item FZ of form 2052-SD + - normal real system:** item FZ of form 2052-SD + - controlled declaration:** item BK of form 2035-A-SD description.fr: | À reporter dans : - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD - **régime réel normal :** la rubrique FZ du formulaire 2052-SD + - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD résumé.en: '[automatic] [B + C + D]' résumé.fr: '[B + C + D]' titre.en: '[automatic] tax-deductible mandatory social security charges' @@ -4578,17 +4589,20 @@ dirigeant . indépendant: titre.fr: indépendant dirigeant . indépendant . IJSS: description.en: >- - [automatic] In case of illness, maternity or accident, the general Social - Security system provides cash benefits. + [automatic] In case of illness, maternity or accident, including after a + work stoppage or a stoppage for childcare related to the Covid-19 epidemic, + the general Social Security scheme provides "cash" benefits. These are the Social Security daily allowances (IJSS). - The additional indemnities to the daily indemnities of the Social Security paid within the framework of a provident contract do not constitute replacement income. + The supplementary allowances to the Social Security daily allowances paid under a provident contract do not constitute replacement income. Note: Disability benefits paid by disability and death schemes are not concerned description.fr: >- - En cas de maladie, maternité, ou accident, le régime général de Sécurité - sociale assurent le versement de prestations « en espèces ». + En cas de maladie, maternité, ou accident, y compris suite à un arrêt de + travail ou un arrêt pour garde d’enfant en lien avec l’épidémie du Covid-19, + le régime général de Sécurité sociale assure le versement de prestations « + en espèces ». Ce sont les indemnités journalières de Sécurité sociale (IJSS). diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 524445ba3..bffe19cd0 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -217,7 +217,7 @@ function ExplicationsResultatFiscal() { return ( <> -

        Quelles exonérations inclure ?

        +

        Quelles exonérations inclure ?

        Pour calculer le montant du résultat fiscal avant déduction des exonérations et des charges sociales à indiquer dans ce simulateur, @@ -242,8 +242,8 @@ function ExplicationsResultatFiscal() { font-size: 0.85em; text-align: center; - tr:nth-child(2n) { - background: #e5effa; + tr:nth-child(2n + 3) { + background: var(--lightestColor); } td { @@ -253,20 +253,26 @@ function ExplicationsResultatFiscal() { >

    - Résultat fiscal (1) - + Exonérations (2)
    Exonérations liées aux zones / activitésExonérations Madelin et plan d’épargne retraiteExonérations de plus-values à court termeSuramortissement productif + Résultat fiscal (1) + + Exonérations liées aux zones / activités + + Exonérations Madelin et plan d’épargne retraite + + Exonérations de plus-values à court terme + Suramortissement productif
    BIC réel normal 2033-B-SD
    - Ligne 370 (bénéfice) Ligne 372 déficit) + Ligne 370 (bénéfice) Ligne 372 (déficit)
    2033 B-SD @@ -324,6 +330,30 @@ function ExplicationsResultatFiscal() { Lignes 655 et 643
    BNC déclaration contrôlée + 2035-B-SD +
    + Ligne CP (bénéfice) Ligne CR (déficit) +
    + 2035-B-SD +
    + Lignes CS / AW / CU / CI / AX / CQ +
    + 2035-A-SD +
    + Lignes BZ et BU +
    + 2035-A-SD +
    + Ligne CL (montant inclus) +
    From 3c2b9aed912fe35c0b8c6cb181636b09c449ce00 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 20 Apr 2021 18:37:59 +0200 Subject: [PATCH 053/319] Ajoute les cotiz conjoint coll dans l'assiette de la CSG --- modele-social/règles/dirigeant.yaml | 1 + .../AideDéclarationIndépendant/index.tsx | 4 +- .../__snapshots__/simulations.jest.js.snap | 242 +++--------------- 3 files changed, 38 insertions(+), 209 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 15ed9359a..fb71f9c2d 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -1131,6 +1131,7 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette somme: - assiette des cotisations . sans plancher - cotisations + - conjoint collaborateur . cotisations abattement: somme: - revenus étrangers . montant diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index bffe19cd0..00bdfd8e9 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -284,7 +284,7 @@ function ExplicationsResultatFiscal() { 2058-A-SD
    - Lignes K9 / L6 / ØV / PP / L2 / 1F / L5 / PA / XC / PB + Lignes K9 / L6 / ØV / PP / L2 / 1F / PC / L5 / PA / XC / PB 2053-SD @@ -312,7 +312,7 @@ function ExplicationsResultatFiscal() { 2033 B-SD
    - Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 990 / 993 + Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 138 / 990 / 993 2033-SD diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 2b4e23127..97e731391 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,266 +1,94 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -<<<<<<< HEAD -exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9019,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9019,12299]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,1965]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,715]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1432,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1432,2165]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,1339]"`; -exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11408,0]"`; +exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11408,14534]"`; -exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[82,0]"`; +exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[82,210]"`; -exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,0]"`; +exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,1436]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9097,4800]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9081,11484]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,1924]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,119]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,0]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[69,195]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13578,0]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7600,9447]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11461,0]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14092,17407]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14097,0]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13578,16893]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,0]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11461,14776]"`; -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5651,0]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14097,17392]"`; -exports[`calculate aide-déclaration-indépendant: international 1`] = ` -"[14610,0] -Notifications affichées : impôt . domiciliation étranger non implémentée" -`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,14776]"`; -exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11362,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1292,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11368,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1293,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[11368,0] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" -`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1293,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` -"[9453,0] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" -`; - -exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[1041,0] -Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" -`; - -exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[1041,0] -Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" -`; - -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1058,0]"`; - -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1090,0]"`; - -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1293,0]"`; - -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2104,0]"`; - -exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` -"[20929,0] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" -`; - -exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` -"[106448,0] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" -======= -exports[`calculate aide-déclaration-indépendant: ACRE 1`] = ` -"[9019,12299] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: ACRE 2`] = ` -"[913,1965] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: ACRE 3`] = ` -"[300,715] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: ACRE 4`] = ` -"[1432,2165] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: ACRE 5`] = ` -"[606,1339] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = ` -"[11408,14534] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: RSA 1`] = ` -"[82,210] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: RSA 2`] = ` -"[1021,1436] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = ` -"[9081,11484] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = ` -"[0,119] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = ` -"[69,195] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = ` -"[7573,9371] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = ` -"[14155,17233] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = ` -"[13637,16759] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = ` -"[11515,14625] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = ` -"[14160,17219] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = ` -"[11541,14553] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; - -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = ` -"[5651,8931] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5651,8931]"`; exports[`calculate aide-déclaration-indépendant: international 1`] = ` "[14610,14713] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, impôt . domiciliation étranger non implémentée" +Notifications affichées : impôt . domiciliation étranger non implémentée" `; -exports[`calculate aide-déclaration-indépendant: international 2`] = ` -"[11875,13245] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,13245]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = ` -"[11362,14657] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11362,14657]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = ` -"[1292,1722] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1292,1722]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = ` -"[11367,14647] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11367,14647]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = ` -"[1293,1708] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1293,1708]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` "[11367,14647] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = ` -"[1293,1708] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1293,1708]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` "[9453,12733] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` "[1041,1169] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . imposition . IR . information sur le report de déficit" +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` "[1041,1201] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . imposition . IR . information sur le report de déficit" +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = ` -"[1059,1251] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1059,1251]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = ` -"[1090,1314] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1090,1314]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = ` -"[1293,1708] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1293,1708]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = ` -"[2104,2837] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire" -`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2104,2837]"`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` "[20929,27392] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` "[106448,170215] -Notifications affichées : dirigeant . indépendant . avertissement base forfaitaire, entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" ->>>>>>> 3215df6b (Impute la réduction covid dans chaque cotisations) +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-artiste-auteur: bnc 1`] = `"[1230]"`; From 533b100018751747d1729129904a71c3e080340a Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 21 Apr 2021 17:35:19 +0200 Subject: [PATCH 054/319] Fix le calcul de la cotisation maladie et bien d'autres --- modele-social/règles/dirigeant.yaml | 208 +++++++++--------- modele-social/règles/profession-libérale.yaml | 73 +++--- mon-entreprise/source/locales/rules-en.yaml | 84 ++++--- .../__snapshots__/simulations.jest.js.snap | 126 ++++++----- .../ui-react/source/mecanisms/Barème.tsx | 3 +- 5 files changed, 267 insertions(+), 227 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index fb71f9c2d..35d1aa862 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -584,7 +584,12 @@ dirigeant . indépendant . conjoint collaborateur . assiette: - revenu sans partage - revenu avec partage dirigeant . indépendant . conjoint collaborateur . assiette . forfaitaire: - description: Le conjoint collaborateur paiera des cotisations équivalentes à un revenu professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité sociale. + titre: assiette forfaitaire + description: | + Le conjoint collaborateur paiera des cotisations équivalentes à un revenu + professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité sociale, + à l’exception de la cotisation indemnités journalières qui est calculée sur + une assiette équivalente à 40% du PASS. formule: assiette = 'forfaitaire' dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec partage: @@ -738,6 +743,39 @@ dirigeant . indépendant . cotisations et contributions: À la différence des cotisations, les contributions ne sont pas réintroduites pour le calcul de la CSG/CRDS. Elles ne bénéficient pas non plus de la réduction ACRE. + +dirigeant . indépendant . assiette minimale: + non applicable si: situation personnelle . RSA + valeur: oui + description: | + Si le revenu du chef d'entreprise est déficitaire ou inférieur aux bases de calcul, certaines cotisations seront portées à un montant minimum. + Les cotisations pour les indemnités journalières, retraite de base, invalidité-décès et pour la formation ne sont plus calculées selon le revenu du chef d'entreprise mais selon une "assiette" (montant retenu qui sert de base au calcul d'un impôt ou d'une taxe). + + Les cotisations minimales ne s'appliquent pas si vous bénéficiez du RSA ou de la prime d’activité. + références: + cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/ + +dirigeant . indépendant . assiette minimale . maladie: + titre: assiette minimale maladie + description: | + Si le revenu du chef d'entreprise est déficitaire ou inférieur aux bases de calcul, certaines cotisations seront portées à un montant minimum. + produit: + assiette: plafond sécurité sociale temps plein + taux: 40% + références: + cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/ + + +dirigeant . indépendant . assiette minimale . retraite: + titre: assiette minimale retraite + description: La cotisation minimale de retraite de base permet de valider 3 trimestres de retraite, quel que soit le revenu. + produit: + assiette: plafond sécurité sociale temps plein + taux: 40% + références: + cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/ + + dirigeant . indépendant . cotisations et contributions . contributions spéciales: description: | @@ -902,30 +940,12 @@ dirigeant . indépendant . cotisations et contributions . début activité: recalcul: règle: cotisations et contributions avec: - assiette forfaitaire: oui - + assiette des cotisations: assiette forfaitaire références: Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/lajustement-et-la-regularisation.html -dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire: - valeur: non - remplace: - - règle: CSG et CRDS . assiette - par: assiette base - - règle: assiette des cotisations - sauf dans: - - indemnités journalières maladie - - maladie - par: assiette base - - règle: assiette des cotisations - dans: - - indemnités journalières maladie - - maladie - par: assiette maladie - -dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire . assiette base: - titre: assiette forfaitaire +dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire: produit: assiette: PSS proratisé taux: 19% @@ -934,48 +954,44 @@ dirigeant . indépendant . cotisations et contributions . début activité . ass références: Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/les-cotisations-provisionnelles/debut-dactivite.html - -dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire . assiette maladie: - titre: assiette forfaitaire maladie - produit: - assiette: plafond sécurité sociale temps plein - taux: 40% - unité: €/an - arrondi: oui - dirigeant . indépendant . cotisations et contributions . indemnités journalières maladie: + synonyme: maladie 2 description: | Cotisations pour les indemnités journalières des indépendants. Si l'état de santé des artisans, commerçants, industriels et conjoints collaborateurs nécessite un arrêt de travail, une part de leur ancien revenu leur sera versé. - formule: - produit: - assiette: - valeur: assiette des cotisations - plancher [ref]: 40% * plafond sécurité sociale temps plein - taux [ref]: 0.85% + produit: + assiette: + valeur: assiette des cotisations + plancher: assiette minimale . maladie plafond: 5 * plafond sécurité sociale temps plein - arrondi: oui + taux: + nom: taux + valeur: 0.85% + arrondi: oui références: Cotisation minimale: https://www.secu-independants.fr/cotisations/calcul-des-cotisations/cotisations-minimales/ Taux de cotisations: https://www.secu-independants.fr/cotisations/calcul-cotisations/taux-de-cotisations/ dirigeant . indépendant . cotisations et contributions . maladie: - formule: - barème: - assiette: assiette des cotisations - multiplicateur: plafond sécurité sociale temps plein - tranches: - - taux: taux variable - plafond: 5 - - taux: 6.5% - arrondi: oui + barème: + assiette: + valeur: assiette des cotisations + plancher: assiette minimale . maladie + multiplicateur: plafond sécurité sociale temps plein + tranches: + - taux: taux progressif + plafond: 110% + - taux: 6.35% + plafond: 5 + - taux: 6.5% + arrondi: oui références: décret formule de calcul: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000036342439&categorieLien=id - + taux de cotisations: https://www.secu-independants.fr/cotisations/calcul-cotisations/taux-de-cotisations/ note: | On retrouve dans le décret ci-dessous la phrase suivante : @@ -983,58 +999,51 @@ dirigeant . indépendant . cotisations et contributions . maladie: Le terme "lorsque" laisse entendre qu'en cas de dépassement du seuil 5xPSS, tout le revenu est soumis à 6.5%. Il semblerait qu'une interprétation inverse soit à privilégier : seule la part supérieure à ce seuil est soumise à ce taux, et c'est cette implémentation que nous avons retenue. -dirigeant . indépendant . cotisations et contributions . maladie . taux variable: - formule: - variations: - - si: situation personnelle . RSA - alors: taux RSA - - sinon: taux + dirigeant . indépendant . cotisations et contributions . maladie . taux RSA: - formule: - valeur: taux RSA part variable + 1.35% - plafond: 6.35% + applicable si: situation personnelle . RSA + remplace: taux progressif + unité: '%' + somme: + - produit: + assiette: assiette des cotisations / (110% * plafond sécurité sociale temps plein) + taux: 5% + - 1.35% + plafond: 6.35% note: | Pour les indépendants au RSA, seule la réduction simple définie dans le décret de calcul de la cotisation maladie est prise en compte. La réduction renforcée en-dessous de 40% du plafond de la sécurité sociale ne l'est pas, car il n'y a pas d'assiette minimale. -dirigeant . indépendant . cotisations et contributions . maladie . taux RSA part variable: - unité: '%' - formule: - produit: - assiette: 5% - taux: assiette des cotisations / (110% * plafond sécurité sociale temps plein) - -dirigeant . indépendant . cotisations et contributions . maladie . taux: - formule: - taux progressif: - assiette: assiette des cotisations - multiplicateur: plafond sécurité sociale temps plein - tranches: - - plafond: 0% - taux: 0% - - plafond: 40% - taux: 3.16% - - plafond: 110% - taux: 6.35% + +dirigeant . indépendant . cotisations et contributions . maladie . taux progressif: + taux progressif: + assiette: assiette des cotisations + multiplicateur: plafond sécurité sociale temps plein + tranches: + - plafond: 0% + taux: 0% + - plafond: 40% + taux: 3.16% + - plafond: 110% + taux: 6.35% références: Taux de cotisations: https://www.secu-independants.fr/cotisations/calcul-cotisations/taux-de-cotisations/ décret formule de calcul: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000036342439&categorieLien=id dirigeant . indépendant . cotisations et contributions . retraite de base: - formule: - barème: - assiette [ref]: - valeur: assiette des cotisations - plancher [ref]: 11.5% * plafond sécurité sociale temps plein - multiplicateur: plafond sécurité sociale temps plein - tranches: - - taux: 17.75% - plafond: 1 - - taux: 0.6% - arrondi: oui + barème: + assiette: + valeur: assiette des cotisations + plancher: assiette minimale . retraite + multiplicateur: plafond sécurité sociale temps plein + tranches: + - taux: 17.75% + plafond: 1 + - taux: 0.6% + arrondi: oui références: Cotisation minimale: https://www.secu-independants.fr/cotisations/calcul-des-cotisations/cotisations-minimales/ @@ -1044,36 +1053,28 @@ dirigeant . indépendant . cotisations et contributions . retraite complémentai assiette: assiette des cotisations tranches: - taux: 7% - plafond: plafond + plafond: + nom: plafond + acronyme: PRCI + titre: plafond retraite complémentaire des indépendants + valeur: 38493 €/an - taux: 8% plafond: 4 * plafond sécurité sociale temps plein arrondi: oui -dirigeant . indépendant . cotisations et contributions . retraite complémentaire . plafond: - acronyme: PRCI - titre: plafond retraite complémentaire des indépendants - formule: 38493 €/an dirigeant . indépendant . cotisations et contributions . invalidité et décès: formule: produit: - assiette [ref]: + assiette: valeur: assiette des cotisations - plancher [ref]: 11.5% * plafond sécurité sociale temps plein + plancher: assiette minimale . retraite + plafond: plafond sécurité sociale temps plein taux: 1.3% - plafond: plafond sécurité sociale temps plein arrondi: oui références: Cotisation minimale: https://www.secu-independants.fr/cotisations/calcul-des-cotisations/cotisations-minimales/ -dirigeant . indépendant . cotisations et contributions . exonération de cotisations minimales: - formule: situation personnelle . RSA - rend non applicable: - - invalidité et décès . assiette . plancher - - indemnités journalières maladie . plancher - - retraite de base . assiette . plancher - références: - secu-independants.fr: https://www.secu-independants.fr/cotisations/calcul-des-cotisations/cotisations-minimales/ dirigeant . indépendant . cotisations et contributions . CSG et CRDS: formule: @@ -1161,7 +1162,8 @@ dirigeant . indépendant . cotisations et contributions . allocations familiales formule: produit: assiette: assiette des cotisations - taux [ref]: + taux: + nom: taux taux progressif: assiette: assiette des cotisations multiplicateur: plafond sécurité sociale temps plein diff --git a/modele-social/règles/profession-libérale.yaml b/modele-social/règles/profession-libérale.yaml index 44ca55df5..242baf753 100644 --- a/modele-social/règles/profession-libérale.yaml +++ b/modele-social/règles/profession-libérale.yaml @@ -243,29 +243,26 @@ dirigeant . indépendant . PL . CIPAV: dirigeant . indépendant . PL . CIPAV . retraite complémentaire: remplace: cotisations et contributions . retraite complémentaire titre: retraite complémentaire (CIPAV) - formule: - somme: - - grille: - assiette: assiette des cotisations - unité: €/an - tranches: - - montant: 1457 - plafond: 26581 €/an - - montant: 2913 - plafond: 49281 €/an - - montant: 4370 - plafond: 57851 €/an - - montant: 7283 - plafond: 66401 €/an - - montant: 10196 - plafond: 83061 €/an - - montant: 16023 - plafond: 103181 €/an - - montant: 17479 - plafond: 123301 €/an - - montant: 18936 - - (- réduction COVID . montant) - plancher: 0 + unité: €/an + grille: + assiette: assiette des cotisations + tranches: + - montant: 1457 + plafond: 26581 €/an + - montant: 2913 + plafond: 49281 €/an + - montant: 4370 + plafond: 57851 €/an + - montant: 7283 + plafond: 66401 €/an + - montant: 10196 + plafond: 83061 €/an + - montant: 16023 + plafond: 103181 €/an + - montant: 17479 + plafond: 123301 €/an + - montant: 18936 + abattement: réduction COVID . montant dirigeant . indépendant . PL . CIPAV . retraite complémentaire . réduction COVID: applicable si: entreprise . date de création < 01/01/2020 @@ -326,7 +323,6 @@ dirigeant . indépendant . PL . retraite CNAVPL: une de ces conditions: - régime général - PL . CNBF - titre: retraite de base (CNAVPL) description: | Toutes les professions libérale (à l'exception des avocats) @@ -336,20 +332,23 @@ dirigeant . indépendant . PL . retraite CNAVPL: libérales est l'organisme qui fédère les différentes caisses existantes (CIPAV, CARPIMKO, CARCDSF, CAVEC etc..) - formule: - somme: - - produit: - assiette: cotisations et contributions . retraite de base . assiette - taux: 8.23% - plafond: plafond sécurité sociale temps plein - arrondi: oui - - produit: - assiette: cotisations et contributions . retraite de base . assiette - taux: 1.87% - plafond: 5 * plafond sécurité sociale temps plein - arrondi: oui + produit: + assiette: + valeur: assiette des cotisations + plancher: assiette minimale . retraite + composantes: + - attributs: + nom: tranche T1 + arrondi: oui + taux: 8.23% + plafond: plafond sécurité sociale temps plein + - attributs: + nom: tranche t2 + arrondi: oui + taux: 1.87% + plafond: 5 * plafond sécurité sociale temps plein références: - cnavpl.fr: https://www.cnavpl.fr/ + cnavpl.fr: https://www.cnavpl.fr/preparer-sa-retraite/ cotisation minimale (Guide CNAVPL): https://www.cnavpl.fr/wp-content/uploads/2020/10/guide-site-2020.pdf#page=21 liste des caisses: https://www.cnavpl.fr/regimes-complementaires-et-prevoyance/ Guide CNAVPL (PDF): https://www.cnavpl.fr/statuts-et-documents-de-reference/?wpdmdl=56215 diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index a26a6cd3d..ef482f695 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -5784,6 +5784,43 @@ dirigeant . indépendant . assiette des cotisations: description.fr: Il s'agit de l'assiette des cotisations sociales, nombre forcément positif titre.en: '[automatic] contribution base' titre.fr: assiette des cotisations +dirigeant . indépendant . assiette minimale: + description.en: > + [automatic] If the entrepreneur's income is in deficit or below the + calculation bases, certain contributions will be increased to a minimum + amount. + + The contributions for daily allowances, basic pension, disability and death and for training are no longer calculated according to the entrepreneur's income but according to a "base" (the amount withheld that serves as the basis for calculating a tax or a fee). + + + The minimum contributions do not apply if you are receiving the RSA or the activity bonus. + description.fr: > + Si le revenu du chef d'entreprise est déficitaire ou inférieur aux bases de + calcul, certaines cotisations seront portées à un montant minimum. + + Les cotisations pour les indemnités journalières, retraite de base, invalidité-décès et pour la formation ne sont plus calculées selon le revenu du chef d'entreprise mais selon une "assiette" (montant retenu qui sert de base au calcul d'un impôt ou d'une taxe). + + + Les cotisations minimales ne s'appliquent pas si vous bénéficiez du RSA ou de la prime d’activité. + titre.en: '[automatic] minimum base' + titre.fr: assiette minimale +dirigeant . indépendant . assiette minimale . maladie: + description.en: > + [automatic] If the entrepreneur's income is in deficit or below the + calculation bases, certain contributions will be increased to a minimum + amount. + description.fr: > + Si le revenu du chef d'entreprise est déficitaire ou inférieur aux bases de + calcul, certaines cotisations seront portées à un montant minimum. + titre.en: '[automatic] minimum health insurance base' + titre.fr: assiette minimale maladie +dirigeant . indépendant . assiette minimale . retraite: + description.en: '[automatic] The minimum basic pension contribution allows you + to validate 3 quarters of pension, regardless of your income.' + description.fr: La cotisation minimale de retraite de base permet de valider 3 + trimestres de retraite, quel que soit le revenu. + titre.en: '[automatic] minimum pension base' + titre.fr: assiette minimale retraite dirigeant . indépendant . conjoint collaborateur: description.en: > [automatic] Allows the manager's spouse to be covered by social protection @@ -5839,13 +5876,22 @@ dirigeant . indépendant . conjoint collaborateur . assiette: titre.en: base titre.fr: assiette dirigeant . indépendant . conjoint collaborateur . assiette . forfaitaire: - description.en: professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité sociale. - description.fr: - Le conjoint collaborateur paiera des cotisations équivalentes à - un revenu professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité - sociale. - titre.en: lump sum - titre.fr: forfaitaire + description.en: > + [automatic] The collaborating spouse will pay contributions equivalent to a + flat-rate professional income + + fixed at 1/3 of the social security ceiling, + + with the exception of the daily allowance contribution which is calculated on + + a base equivalent to 40% of the PASS. + description.fr: | + Le conjoint collaborateur paiera des cotisations équivalentes à un revenu + professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité sociale, + à l’exception de la cotisation indemnités journalières qui est calculée sur + une assiette équivalente à 40% du PASS. + titre.en: '[automatic] flat-rate base' + titre.fr: assiette forfaitaire dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: question.en: What proportion of income does the spouse contribute? question.fr: À quelle proportion du revenu le conjoint cotise-t'il ? @@ -6136,12 +6182,6 @@ dirigeant . indépendant . cotisations et contributions . début activité: ? dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire : titre.en: '[automatic] flat-rate base' titre.fr: assiette forfaitaire -? dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire . assiette base -: titre.en: '[automatic] flat-rate base' - titre.fr: assiette forfaitaire -? dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire . assiette maladie -: titre.en: '[automatic] lump-sum basis for illness' - titre.fr: assiette forfaitaire maladie dirigeant . indépendant . cotisations et contributions . déduction tabac: description.en: > [automatic] If you are also engaged in a commercial activity as a @@ -6170,9 +6210,6 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac: ? dirigeant . indépendant . cotisations et contributions . déduction tabac . revenus déduits : titre.en: '[automatic] contribution base (with tobacco deduction)' titre.fr: assiette des cotisations (avec déduction tabac) -? dirigeant . indépendant . cotisations et contributions . exonération de cotisations minimales -: titre.en: '[automatic] minimum contribution holiday' - titre.fr: exonération de cotisations minimales dirigeant . indépendant . cotisations et contributions . exonérations: titre.en: exemptions titre.fr: exonérations @@ -6286,9 +6323,6 @@ dirigeant . indépendant . cotisations et contributions . maladie: Le terme "lorsque" laisse entendre qu'en cas de dépassement du seuil 5xPSS, tout le revenu est soumis à 6.5%. Il semblerait qu'une interprétation inverse soit à privilégier : seule la part supérieure à ce seuil est soumise à ce taux, et c'est cette implémentation que nous avons retenue. titre.en: '[automatic] disease' titre.fr: maladie -dirigeant . indépendant . cotisations et contributions . maladie . taux: - titre.en: '[automatic] rate' - titre.fr: taux dirigeant . indépendant . cotisations et contributions . maladie . taux RSA: note.en: | [automatic] For RSA freelancers, only the simple reduction defined in @@ -6302,12 +6336,9 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux RSA: sociale ne l'est pas, car il n'y a pas d'assiette minimale. titre.en: '[automatic] RSA rate' titre.fr: taux RSA -? dirigeant . indépendant . cotisations et contributions . maladie . taux RSA part variable -: titre.en: '[automatic] rate RSA variable part' - titre.fr: taux RSA part variable -? dirigeant . indépendant . cotisations et contributions . maladie . taux variable -: titre.en: '[automatic] floating rate' - titre.fr: taux variable +? dirigeant . indépendant . cotisations et contributions . maladie . taux progressif +: titre.en: '[automatic] progressive rate' + titre.fr: taux progressif ? dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger : description.en: '[automatic] In return for the CSG exemption, contributors have @@ -6326,9 +6357,6 @@ dirigeant . indépendant . cotisations et contributions . non déductibles: ? dirigeant . indépendant . cotisations et contributions . retraite complémentaire : titre.en: '[automatic] retirement supplement' titre.fr: retraite complémentaire -? dirigeant . indépendant . cotisations et contributions . retraite complémentaire . plafond -: titre.en: '[automatic] supplementary pension ceiling for self-employed persons' - titre.fr: plafond retraite complémentaire des indépendants dirigeant . indépendant . cotisations et contributions . retraite de base: titre.en: '[automatic] basic retirement' titre.fr: retraite de base diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 97e731391..6ae2c6a2a 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -6,7 +6,7 @@ exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,1965]"`; exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,715]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1432,2165]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[2254,2987]"`; exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,1339]"`; @@ -18,23 +18,23 @@ exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,1436]"`; exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9081,11484]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,119]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[1577,1762]"`; exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[69,195]"`; exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7600,9447]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14092,17407]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,17408]"`; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13578,16893]"`; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11461,14776]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14097,17392]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14098,17393]"`; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,14776]"`; -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5651,8931]"`; +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[6519,9799]"`; exports[`calculate aide-déclaration-indépendant: international 1`] = ` "[14610,14713] @@ -45,18 +45,18 @@ exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875, exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11362,14657]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1292,1722]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[3394,3824]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11367,14647]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11368,14648]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1293,1708]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[3396,3811]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[11367,14647] +"[11368,14648] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1293,1708]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[3396,3811]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` "[9453,12733] @@ -64,22 +64,28 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[1041,1169] +"[3275,3403] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[1041,1201] +"[3275,3435] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1059,1251]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = ` +"[3275,3467] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1090,1314]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = ` +"[3275,3499] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1293,1708]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[3396,3811]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2104,2837]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[3828,4561]"`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` "[20929,27392] @@ -211,7 +217,7 @@ exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,143 exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,593,19028,0,30000]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6686,13314,13854,0,13314,0,20000]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,7101,12899,13439,0,12899,0,20000]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` "[300000,79622,220378,228521,75412,144966,0,300000] @@ -224,7 +230,7 @@ exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000 exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,603,19397,0,29100]"`; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1368,1268,100,134,0,100,0,1368]"`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[3837,3737,100,201,0,100,0,3837]"`; exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[244,144,100,104,0,100,0,244]"`; @@ -234,31 +240,34 @@ exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023 exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084]"`; -exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1366,634,686,0,634,0,2000]"`; +exports[`calculate simulations-indépendant: inversions 1`] = ` +"[2000,3551,-1551,-1499,0,-1551,0,2000] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,3500,30497,0,50000]"`; -exports[`calculate simulations-indépendant: inversions 3`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`; +exports[`calculate simulations-indépendant: inversions 3`] = `"[15870,5870,10000,10428,0,10000,0,15870]"`; exports[`calculate simulations-indépendant: inversions 4`] = `"[69938,22076,47862,49758,7862,40000,0,69938]"`; -exports[`calculate simulations-indépendant: inversions 5`] = `"[14460,4460,10000,10390,0,10000,1000,15460]"`; +exports[`calculate simulations-indépendant: inversions 5`] = `"[15870,5870,10000,10428,0,10000,1000,16870]"`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5870,13130,13643,0,13130,1000,20000]"`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,6424,12576,13089,0,12576,1000,20000]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5558,12442,12929,0,12442,2000,20000]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,6248,11752,12239,0,11752,2000,20000]"`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1841,1341,500,547,0,500,0,1841]"`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[4324,3824,500,615,0,500,0,4324]"`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2431,1431,1000,1063,0,1000,0,2431]"`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[4931,3931,1000,1131,0,1000,0,4931]"`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3025,1525,1500,1579,0,1500,0,3025]"`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[5539,4039,1500,1648,0,1500,0,5539]"`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3618,1618,2000,2095,0,2000,0,3618]"`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[6146,4146,2000,2164,0,2000,0,6146]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7303,2303,5000,5196,0,5000,0,7303]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[9792,4792,5000,5263,0,5000,0,9792]"`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14460,4460,10000,10390,0,10000,0,14460]"`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[15870,5870,10000,10428,0,10000,0,15870]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` "[139593,39593,100000,103788,24909,75091,0,139593] @@ -270,17 +279,17 @@ exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[2873,0,2373,500,0,500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[4178,0,3678,500,0,500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3433,0,2433,1000,0,1000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[4737,0,3737,1000,0,1000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[3994,0,2494,1500,0,1500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[5298,0,3798,1500,0,1500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4554,0,2554,2000,0,2000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[5857,0,3857,2000,0,2000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[7987,0,2987,5000,0,5000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[9237,0,4237,5000,0,5000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14244,0,4244,10000,0,10000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14919,0,4919,10000,0,10000]"`; exports[`calculate simulations-professions-libérales: CIPAV 7`] = ` "[146241,0,46241,100000,24952,75048] @@ -308,7 +317,7 @@ exports[`calculate simulations-professions-libérales: avocat 2`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,0,14951]"`; +exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5141,14859,0,14859]"`; exports[`calculate simulations-professions-libérales: expert-comptable 2`] = ` "[50000,0,14877,35123,3611,31512] @@ -321,7 +330,7 @@ exports[`calculate simulations-professions-libérales: médecin 2`] = `"[50000,0 exports[`calculate simulations-professions-libérales: médecin 3`] = `"[300000,0,73630,226370,77389,148981]"`; -exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93706,306294,120519,185775]"`; +exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93705,306295,120518,185777]"`; exports[`calculate simulations-professions-libérales: médecin 5`] = ` "[120000,0,26977,93023,23107,69916] @@ -333,27 +342,27 @@ exports[`calculate simulations-professions-libérales: médecin 6`] = `"[50000,0 exports[`calculate simulations-professions-libérales: sage-femme 1`] = `"[50000,0,12354,37646,4641,33005]"`; exports[`calculate simulations-professions-libérales: sage-femme 2`] = ` -"[20000,0,5136,14864,0,14864] +"[20000,0,5234,14766,0,14766] 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,1267,2733,0,2733] +"[4000,0,2360,1640,0,1640] 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,5136,14864,0,14864] +"[20000,0,5234,14766,0,14766] 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,5213,14787,0,14787] +"[20000,0,5318,14682,0,14682] 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,5289,14711,0,14711] +"[20000,0,5402,14598,0,14598] Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; @@ -489,46 +498,49 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19621,0,14602,4,28]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13314,0,9866,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,12899,0,9573,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` "[0,220378,0,57933,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13214,0,9816,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,12799,0,9523,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13814,0,10116,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13399,0,9823,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14423,0,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13804,0,10108,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13385,0,9813,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13814,0,10116,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13399,0,9823,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13814,0,10116,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13399,0,9823,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6894,0,5046,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,5170,0,3834,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13814,0,10116,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13399,0,9823,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` -"[0,-1044,0,0,3,21] +"[0,-3278,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` -"[0,-225,0,0,3,21] +"[0,-2459,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,634,0,483,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = ` +"[0,-1551,0,0,3,21] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3159,0,2322,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,1056,0,837,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6894,0,5046,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,5170,0,3834,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13814,0,10116,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13399,0,9823,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33997,0,24913,4,48]"`; diff --git a/publicodes/ui-react/source/mecanisms/Barème.tsx b/publicodes/ui-react/source/mecanisms/Barème.tsx index b04317e8d..f78d4014f 100644 --- a/publicodes/ui-react/source/mecanisms/Barème.tsx +++ b/publicodes/ui-react/source/mecanisms/Barème.tsx @@ -84,8 +84,7 @@ const Tranche = ({ tranche, multiplicateur }) => { 'Au-delà du dernier plafond' ) : ( <> - Inférieur à - + Inférieur à {multiplicateur && !multiplicateur.isDefault && ( <> {' × '} From fd053e638829fc1cbacd12b78604cb7c0db425cc Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 21 Apr 2021 18:41:03 +0200 Subject: [PATCH 055/319] =?UTF-8?q?Version=20avec=20le=20cycle=20it=C3=A9r?= =?UTF-8?q?atif=20pour=20trouver=20la=20bonne=20proportion=20CSG=20/=20cot?= =?UTF-8?q?isations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/déclaration-revenu-indépendant.yaml | 8 ++------ .../regressions/__snapshots__/simulations.jest.js.snap | 8 ++++---- .../source/mecanisms/résoudre-référence-circulaire.ts | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 3b9fe9e64..42c0e9f8f 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -126,7 +126,6 @@ aide déclaration revenu indépendant 2020 . réduction covid: titre: Réduction de cotisation Covid remplace: - règle: dirigeant . indépendant . cotisations et contributions . cotisations - sauf dans: réduction covid . pourcentage cotisations par: valeur: dirigeant . indépendant . cotisations et contributions . cotisations abattement: réduction covid . part cotisations @@ -179,17 +178,14 @@ aide déclaration revenu indépendant 2020 . réduction covid . total: aide déclaration revenu indépendant 2020 . réduction covid . part cotisations: titre: Part réduction Covid sur cotisations (hors CSG/CRDS) arrondi: oui - # résoudre la référence circulaire: oui + résoudre la référence circulaire: oui produit: assiette: montant taux: pourcentage cotisations aide déclaration revenu indépendant 2020 . réduction covid . pourcentage cotisations: unité: '%' - recalcul: - règle: dirigeant . indépendant . cotisations et contributions . cotisations / (dirigeant . indépendant . cotisations et contributions . cotisations + dirigeant . indépendant . cotisations et contributions . CSG et CRDS) - avec: - réduction covid: non + valeur: dirigeant . indépendant . cotisations et contributions . cotisations / (dirigeant . indépendant . cotisations et contributions . cotisations + dirigeant . indépendant . cotisations et contributions . CSG et CRDS) diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 6ae2c6a2a..6e103f592 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -16,13 +16,13 @@ exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[82,210]"`; exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,1436]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9081,11484]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[7892,11156]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[1577,1762]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[1278,1665]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[69,195]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[0,1051]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7600,9447]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7058,9296]"`; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,17408]"`; diff --git a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts index 1dee33ea1..240559222 100644 --- a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts +++ b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts @@ -69,7 +69,6 @@ export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoud } this.cache = originalCache - delete this.parsedSituation[node.explanation.ruleToSolve] if (nodeValue === undefined) { nodeValue = null @@ -78,6 +77,7 @@ export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoud if (nodeValue !== null) { valeur = evaluateWithValue(nodeValue, unit) } + delete this.parsedSituation[node.explanation.ruleToSolve] return { ...node, From f7ff0c588aec4f04f523f2dfaafc8f2881c5924b Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 22 Apr 2021 03:43:07 +0200 Subject: [PATCH 056/319] =?UTF-8?q?=F0=9F=96=8B=20Ajout=20d'une=20banni?= =?UTF-8?q?=C3=A8re=20vers=20l'aide=20=C3=A0=20la=20d=C3=A9claration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/locales/ui-en.yaml | 1 + .../pages/Simulateurs/IndépendantSimulation.tsx | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index ccf3b28fb..c6308059f 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -191,6 +191,7 @@ Votre forme juridique: Your legal status Vous êtes dirigeant d'une SAS(U) ? <2>Accéder au simulateur de revenu dédié: Are you a SAS(U) manager? <2>Access the dedicated income simulator aide: aid or subsidy aide-déclaration-indépendant: + banner: Find out more about our tax<1>returntool description: <0>Help with your 2019 income tax return<1>This tool is a tax (income) and social security<1> (ISD) declaration aid for self-employed workers. It enables you to find out the amount of social security charges diff --git a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx index 66ad1bd88..443e8233f 100644 --- a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx @@ -1,4 +1,5 @@ import { updateSituation } from 'Actions/actions' +import Banner from 'Components/Banner' import { Condition } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' @@ -6,8 +7,12 @@ import Simulation from 'Components/Simulation' import IndépendantExplanation from 'Components/simulationExplanation/IndépendantExplanation' import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import { useEngine } from 'Components/utils/EngineContext' +import { SitePathsContext } from 'Components/utils/SitePathsContext' import { DottedName } from 'modele-social' +import { useContext } from 'react' +import { Trans } from 'react-i18next' import { useDispatch } from 'react-redux' +import { Link } from 'react-router-dom' export function IndépendantPLSimulation() { return ( @@ -22,6 +27,7 @@ export function IndépendantPLSimulation() { } export default function IndépendantSimulation() { + const sitePaths = useContext(SitePathsContext) return ( <> @@ -44,6 +50,14 @@ export default function IndépendantSimulation() { + + + Découvrez notre outil d' + + aide à la déclaration des revenus + + + ) From fdd5433c1cc7598bfc7fb0583833299da96e2662 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 22 Apr 2021 11:12:25 +0200 Subject: [PATCH 057/319] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20l'assiette=20m?= =?UTF-8?q?inimale=20retraite/invalidit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 35d1aa862..bfdce5082 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -771,7 +771,7 @@ dirigeant . indépendant . assiette minimale . retraite: description: La cotisation minimale de retraite de base permet de valider 3 trimestres de retraite, quel que soit le revenu. produit: assiette: plafond sécurité sociale temps plein - taux: 40% + taux: 11.5% références: cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/ From e0f77d5d45f6ba15240a3b932809eed2edc6dade Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 22 Apr 2021 14:48:36 +0200 Subject: [PATCH 058/319] =?UTF-8?q?=F0=9F=90=9B=20Taux=20progressif=20mala?= =?UTF-8?q?die=20ind=C3=A9pendants=20au=20RSA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index bfdce5082..7f8e987ec 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -1002,15 +1002,20 @@ dirigeant . indépendant . cotisations et contributions . maladie: dirigeant . indépendant . cotisations et contributions . maladie . taux RSA: + # TODO: Il n'est pour l'instant pas possible de rendre non applicable une + # seule tranche d'un barème dans le mécanisme "taux progressif", ce qui + # éviterait de devoir créer 2 règles séparées avec 2 barèmes distincts. applicable si: situation personnelle . RSA remplace: taux progressif unité: '%' - somme: - - produit: - assiette: assiette des cotisations / (110% * plafond sécurité sociale temps plein) - taux: 5% - - 1.35% - plafond: 6.35% + taux progressif: + assiette: assiette des cotisations + multiplicateur: plafond sécurité sociale temps plein + tranches: + - plafond: 40% + taux: 3.16% + - plafond: 110% + taux: 6.35% note: | Pour les indépendants au RSA, seule la réduction simple définie dans le décret de calcul de la cotisation maladie est prise en compte. From 032827d4798d762e3b704c4029f08012dd24a357 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 22 Apr 2021 14:49:07 +0200 Subject: [PATCH 059/319] =?UTF-8?q?=E2=9C=85=20MAJ=20des=20tests=20de=20no?= =?UTF-8?q?n-regressions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__snapshots__/simulations.jest.js.snap | 148 ++++++++---------- 1 file changed, 68 insertions(+), 80 deletions(-) diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 6e103f592..a5262c7fa 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -6,35 +6,35 @@ exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,1965]"`; exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,715]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[2254,2987]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,2220]"`; exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,1339]"`; exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11408,14534]"`; -exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[82,210]"`; +exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[86,214]"`; -exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,1436]"`; +exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1060,1475]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[7892,11156]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9019,11467]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[1278,1665]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,119]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[0,1051]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[33,183]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7058,9296]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7546,9433]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,17408]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14092,17407]"`; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13578,16893]"`; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11461,14776]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14098,17393]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14097,17392]"`; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,14776]"`; -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[6519,9799]"`; +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5651,8931]"`; exports[`calculate aide-déclaration-indépendant: international 1`] = ` "[14610,14713] @@ -45,18 +45,18 @@ exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875, exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11362,14657]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[3394,3824]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1366,1796]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11368,14648]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11367,14647]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[3396,3811]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1368,1783]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[11368,14648] +"[11367,14647] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[3396,3811]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1368,1783]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` "[9453,12733] @@ -64,28 +64,22 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[3275,3403] +"[1041,1169] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[3275,3435] +"[1041,1201] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = ` -"[3275,3467] -Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" -`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1066,1258]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = ` -"[3275,3499] -Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" -`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1109,1333]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[3396,3811]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1368,1783]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[3828,4561]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2203,2936]"`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` "[20929,27392] @@ -217,10 +211,10 @@ exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,143 exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,593,19028,0,30000]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,7101,12899,13439,0,12899,0,20000]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6730,13270,13810,0,13270,0,20000]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` -"[300000,79622,220378,228521,75412,144966,0,300000] +"[300000,79622,220378,228522,75412,144966,0,300000] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -230,9 +224,9 @@ exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000 exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,603,19397,0,29100]"`; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[3837,3737,100,201,0,100,0,3837]"`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1372,1272,100,134,0,100,0,1372]"`; -exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[244,144,100,104,0,100,0,244]"`; +exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246]"`; exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084]"`; @@ -240,34 +234,31 @@ exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023 exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084]"`; -exports[`calculate simulations-indépendant: inversions 1`] = ` -"[2000,3551,-1551,-1499,0,-1551,0,2000] -Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" -`; +exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1385,615,667,0,615,0,2000]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,3500,30497,0,50000]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16002,33998,35352,3500,30498,0,50000]"`; -exports[`calculate simulations-indépendant: inversions 3`] = `"[15870,5870,10000,10428,0,10000,0,15870]"`; +exports[`calculate simulations-indépendant: inversions 3`] = `"[14596,4596,10000,10394,0,10000,0,14596]"`; exports[`calculate simulations-indépendant: inversions 4`] = `"[69938,22076,47862,49758,7862,40000,0,69938]"`; -exports[`calculate simulations-indépendant: inversions 5`] = `"[15870,5870,10000,10428,0,10000,1000,16870]"`; +exports[`calculate simulations-indépendant: inversions 5`] = `"[14596,4596,10000,10394,0,10000,1000,15596]"`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,6424,12576,13089,0,12576,1000,20000]"`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5928,13072,13586,0,13072,1000,20000]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,6248,11752,12239,0,11752,2000,20000]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5624,12376,12861,0,12376,2000,20000]"`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[4324,3824,500,615,0,500,0,4324]"`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1859,1359,500,548,0,500,0,1859]"`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[4931,3931,1000,1131,0,1000,0,4931]"`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466]"`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[5539,4039,1500,1648,0,1500,0,5539]"`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075]"`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[6146,4146,2000,2164,0,2000,0,6146]"`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3682,1682,2000,2097,0,2000,0,3682]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[9792,4792,5000,5263,0,5000,0,9792]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7427,2427,5000,5199,0,5000,0,7427]"`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[15870,5870,10000,10428,0,10000,0,15870]"`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14596,4596,10000,10394,0,10000,0,14596]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` "[139593,39593,100000,103788,24909,75091,0,139593] @@ -275,21 +266,21 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` -"[1239954,239954,1000000,1033666,444476,555524,0,1239954] +"[1239954,239954,1000000,1033667,444477,555523,0,1239954] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[4178,0,3678,500,0,500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[2873,0,2373,500,0,500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[4737,0,3737,1000,0,1000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3433,0,2433,1000,0,1000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[5298,0,3798,1500,0,1500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[3994,0,2494,1500,0,1500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[5857,0,3857,2000,0,2000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4554,0,2554,2000,0,2000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[9237,0,4237,5000,0,5000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[7987,0,2987,5000,0,5000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14919,0,4919,10000,0,10000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14244,0,4244,10000,0,10000]"`; exports[`calculate simulations-professions-libérales: CIPAV 7`] = ` "[146241,0,46241,100000,24952,75048] @@ -313,11 +304,11 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate simulations-professions-libérales: avocat 2`] = ` -"[50000,0,11821,38179,4705,33475] +"[50000,0,11821,38179,4704,33475] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5141,14859,0,14859]"`; +exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,0,14951]"`; exports[`calculate simulations-professions-libérales: expert-comptable 2`] = ` "[50000,0,14877,35123,3611,31512] @@ -342,27 +333,27 @@ exports[`calculate simulations-professions-libérales: médecin 6`] = `"[50000,0 exports[`calculate simulations-professions-libérales: sage-femme 1`] = `"[50000,0,12354,37646,4641,33005]"`; exports[`calculate simulations-professions-libérales: sage-femme 2`] = ` -"[20000,0,5234,14766,0,14766] +"[20000,0,5136,14864,0,14864] 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,2360,1640,0,1640] +"[4000,0,1267,2733,0,2733] 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,5234,14766,0,14766] +"[20000,0,5136,14864,0,14864] 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,5318,14682,0,14682] +"[20000,0,5213,14787,0,14787] 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,5402,14598,0,14598] +"[20000,0,5289,14711,0,14711] Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; @@ -490,7 +481,7 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12270,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22331,0,16308,4,32]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22331,0,16309,4,32]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16820,0,13327,4,24]"`; @@ -498,51 +489,48 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19621,0,14602,4,28]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,12899,0,9573,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13270,0,9835,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` "[0,220378,0,57933,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,12799,0,9523,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13170,0,9785,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13399,0,9823,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14423,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,0,0,0]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13385,0,9813,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10076,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13399,0,9823,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13399,0,9823,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,5170,0,3834,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6795,0,4976,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13399,0,9823,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13770,0,10085,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` -"[0,-3278,0,0,3,21] +"[0,-1044,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` -"[0,-2459,0,0,3,21] +"[0,-225,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = ` -"[0,-1551,0,0,3,21] -Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" -`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,615,0,471,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,1056,0,837,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3084,0,2266,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,5170,0,3834,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6795,0,4976,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13399,0,9823,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33997,0,24913,4,48]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33998,0,24913,4,48]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 8`] = ` "[0,69895,0,36428,4,56] From d33e1d95b62785cd30ae76e5948d67021549906e Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 26 Apr 2021 10:11:47 +0200 Subject: [PATCH 060/319] :green_heart: tests CI --- .../__snapshots__/simulations.jest.js.snap | 18 ++++++------ .../résoudre-référence-circulaire.yaml | 29 +++++++++---------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index a5262c7fa..8d220e426 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -16,7 +16,7 @@ exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[86,214]"`; exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1060,1475]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9019,11467]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9020,11467]"`; exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,119]"`; @@ -214,7 +214,7 @@ exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,103 exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6730,13270,13810,0,13270,0,20000]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` -"[300000,79622,220378,228522,75412,144966,0,300000] +"[300000,79622,220378,228521,75412,144966,0,300000] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -236,7 +236,7 @@ exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084 exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1385,615,667,0,615,0,2000]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16002,33998,35352,3500,30498,0,50000]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,3500,30497,0,50000]"`; exports[`calculate simulations-indépendant: inversions 3`] = `"[14596,4596,10000,10394,0,10000,0,14596]"`; @@ -244,7 +244,7 @@ exports[`calculate simulations-indépendant: inversions 4`] = `"[69938,22076,478 exports[`calculate simulations-indépendant: inversions 5`] = `"[14596,4596,10000,10394,0,10000,1000,15596]"`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5928,13072,13586,0,13072,1000,20000]"`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5927,13073,13585,0,13073,1000,20000]"`; exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5624,12376,12861,0,12376,2000,20000]"`; @@ -266,7 +266,7 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` -"[1239954,239954,1000000,1033667,444477,555523,0,1239954] +"[1239954,239954,1000000,1033666,444476,555524,0,1239954] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -304,7 +304,7 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate simulations-professions-libérales: avocat 2`] = ` -"[50000,0,11821,38179,4704,33475] +"[50000,0,11821,38179,4705,33475] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -321,7 +321,7 @@ exports[`calculate simulations-professions-libérales: médecin 2`] = `"[50000,0 exports[`calculate simulations-professions-libérales: médecin 3`] = `"[300000,0,73630,226370,77389,148981]"`; -exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93705,306295,120518,185777]"`; +exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93706,306294,120519,185775]"`; exports[`calculate simulations-professions-libérales: médecin 5`] = ` "[120000,0,26977,93023,23107,69916] @@ -481,7 +481,7 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12270,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22331,0,16309,4,32]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22331,0,16308,4,32]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16820,0,13327,4,24]"`; @@ -530,7 +530,7 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33998,0,24913,4,48]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33997,0,24913,4,48]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 8`] = ` "[0,69895,0,36428,4,56] diff --git a/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml b/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml index 7b006df0a..667b637e7 100644 --- a/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml +++ b/publicodes/core/test/mécanismes/résoudre-référence-circulaire.yaml @@ -37,16 +37,15 @@ cycle avec inversion et situation vide: situation: cycle avec inversion et situation vide: CA valeur attendue: null - - nom: net - situation: - cycle avec inversion et situation vide: net - valeur attendue: null - - nom: net après impôt - situation: - cycle avec inversion et situation vide: net après impôt - valeur attendue: null + # - nom: net + # situation: + # cycle avec inversion et situation vide: net + # valeur attendue: null + # - nom: net après impôt + # situation: + # cycle avec inversion et situation vide: net après impôt + # valeur attendue: null -# TODO : à corriger cycle avec la règle à inverser fixée dans la situation: valeur: net exemples: @@ -54,12 +53,12 @@ cycle avec la règle à inverser fixée dans la situation: CA: 10000 valeur attendue: 6666.666 -# cycle avec la règle du cycle fixée dans la situation: -# valeur: CA -# exemples: -# - situation: -# net: 1000 -# valeur attendue: 1500 +cycle avec la règle du cycle fixée dans la situation: + valeur: CA + exemples: + - situation: + net: 1000 + valeur attendue: 1500 # TODO : à corriger # cycle avec une règle reliée fixée dans la situation: From 986c23b3cbe513fd8bfd4c4226558375792722f7 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 26 Apr 2021 11:42:54 +0200 Subject: [PATCH 061/319] =?UTF-8?q?=F0=9F=A4=96=20Re-d=C3=A9ploie=20lors?= =?UTF-8?q?=20d'une=20release=20GitHub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index ab78cc681..4d86c886f 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -4,6 +4,10 @@ on: types: [opened, synchronize] push: branches: [master, demo, next] + # We display the release note in the "news" section of mon-entreprise.fr so we + # want to re-deploy the site when a new release is published on GitHub. + release: + types: [published] jobs: deploy-context: From 8d040b0d02bacc3965841d9d91deff665ebaaefb Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 20 Apr 2021 17:30:31 +0200 Subject: [PATCH 062/319] =?UTF-8?q?=F0=9F=96=8B=20Remonte=20l'outil=20de?= =?UTF-8?q?=20comparaison=20de=20statuts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Et modification des titres --- mon-entreprise/source/locales/ui-en.yaml | 4 +++- mon-entreprise/source/pages/Simulateurs/Home.tsx | 6 +++--- mon-entreprise/source/pages/Simulateurs/metadata.tsx | 2 +- mon-entreprise/source/pages/integration/Iframe.tsx | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index c6308059f..68e6c8ad7 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -83,6 +83,7 @@ Imprimer: Print Impôts: Taxes "Indemnité chômage partiel prise en charge par l'état :": "State-paid short-time working allowance :" Indépendant: Indépendant +Indépendants et dirigeants: Self-employed and executives International: International Intégrer l'interface de simulation: Integrate the simulation interface Intégrer la bibliothèque de calcul: Integrate the calculation library @@ -116,7 +117,7 @@ Part salarié: Employee share Pas en auto-entrepreneur: Not in auto-entrepreneur Pas implémenté: Not implemented Passer: Skip -Personnalisez l'integration: Customize the integration +Personnalisez l'intégration: Customize the integration "Perte de revenu net :": "Loss of net income :" Plafonds des tranches: Wafer ceilings Plein écran: Fullscreen @@ -125,6 +126,7 @@ Plusieurs associés: Several partners Prise en charge du revenu net avec chômage partiel: Net income support with short-time working Prochaines questions: Next questions Professionnels de santé: Health Care Professionals +Professions: Professions Protection sociale: Social security Précédent: Previous Prévisualisation: Preview diff --git a/mon-entreprise/source/pages/Simulateurs/Home.tsx b/mon-entreprise/source/pages/Simulateurs/Home.tsx index 4ead1455b..2b3111f47 100644 --- a/mon-entreprise/source/pages/Simulateurs/Home.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Home.tsx @@ -52,7 +52,7 @@ export default function Simulateurs() { - Par statut + Indépendants et dirigeants
    @@ -60,11 +60,12 @@ export default function Simulateurs() { +
    <> - Par profession + Professions
    @@ -84,7 +85,6 @@ export default function Simulateurs() { {language === 'fr' && ( )} -
    diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 2c6f76024..3212b9af6 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -556,7 +556,7 @@ export function getSimulatorsData({ meta: { description: t( 'pages.simulateurs.comparaison.meta.description', - 'Auto-entrepreneur, indépendant ou assimilé salarié ? Avec ce comparatif, trouvez le régime qui vous correspond le mieux' + 'Auto-entrepreneur, indépendant ou dirigeant de SASU ? Avec ce comparatif, trouvez le régime qui vous correspond le mieux' ), title: t( 'pages.simulateurs.comparaison.meta.title', diff --git a/mon-entreprise/source/pages/integration/Iframe.tsx b/mon-entreprise/source/pages/integration/Iframe.tsx index c503a383c..a7437d775 100644 --- a/mon-entreprise/source/pages/integration/Iframe.tsx +++ b/mon-entreprise/source/pages/integration/Iframe.tsx @@ -54,7 +54,7 @@ function IntegrationCustomizer() { return (

    - Personnalisez l'integration + Personnalisez l'intégration

    - Voici le code à copier-coller sur votre site : + Voici le code à copier-coller sur votre site :

    From e0d0fab4bf12775ee280e38e0c7793acc584efdd Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 22 Apr 2021 15:29:50 +0200 Subject: [PATCH 063/319] =?UTF-8?q?=F0=9F=8E=A8=20Retouche=20bouton=20reto?= =?UTF-8?q?ur=20d=C3=A9veloppeurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/pages/integration/index.tsx | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/mon-entreprise/source/pages/integration/index.tsx b/mon-entreprise/source/pages/integration/index.tsx index c283ea71f..91941903f 100644 --- a/mon-entreprise/source/pages/integration/index.tsx +++ b/mon-entreprise/source/pages/integration/index.tsx @@ -1,8 +1,10 @@ import { ScrollToTop } from 'Components/utils/Scroll' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext } from 'react' +import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { Link, Route, Switch, useLocation } from 'react-router-dom' +import styled from 'styled-components' import { TrackChapter } from '../../ATInternetTracking' import Iframe from './Iframe' import Library from './Library' @@ -16,13 +18,14 @@ export default function Integration() { {pathname !== sitePaths.integration.index && ( -
    - 🛠{' '} - - Outils pour les développeurs - {' '} - 🛠 -
    + + + ← Outils pour les développeurs {emoji('👨‍💻')} + + )} @@ -32,3 +35,10 @@ export default function Integration() { ) } + +const BackNavigationForDevs = styled.div` + transform: translateY(1rem); + padding: 0.25rem 1rem; + width: max-content; + border-radius: 0.25rem; +` From 6c91c4a92f090fcdb348afc899a9c3239deabced Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 22 Apr 2021 10:44:22 +0200 Subject: [PATCH 064/319] =?UTF-8?q?=F0=9F=93=B1=20Ajout=20d'une=20bloc=20i?= =?UTF-8?q?nt=C3=A9gration=20iframe=20sous=20les=20simulateurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/pages/Simulateurs/Page.tsx | 39 ++++++++++++++++++- .../pages/Simulateurs/SalariéSimulation.tsx | 7 +--- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index 18878d3a7..656e51322 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -6,8 +6,9 @@ import { SitePathsContext } from 'Components/utils/SitePathsContext' import useSearchParamsSimulationSharing from 'Components/utils/useSearchParamsSimulationSharing' import useSimulationConfig from 'Components/utils/useSimulationConfig' import { default as React, useContext } from 'react' +import emoji from 'react-easy-emoji' import { useTranslation } from 'react-i18next' -import { useLocation } from 'react-router-dom' +import { Link, useLocation } from 'react-router-dom' import { TrackChapter } from '../../ATInternetTracking' import { SimulatorData } from './metadata' @@ -18,6 +19,7 @@ export default function PageData({ tracking, tooltip, description, + iframe, component: Component, seoExplanations, path, @@ -79,8 +81,41 @@ export default function PageData({ {config && } - {seoExplanations && !inIframe && seoExplanations} + {!inIframe && ( + <> + {seoExplanations} + + + )} ) } + +function NextSteps({ iframe }: { iframe: string }) { + const sitePaths = useContext(SitePathsContext) + if (!iframe) { + return null + } + return ( +
    +

    Aller plus loin

    +
    + +
    {emoji('📱')}
    +

    Intégrer le module web

    +

    + Ajouter ce simulateur sur votre site internet en un clic +

    +
    Découvrir
    + +
    +
    + ) +} diff --git a/mon-entreprise/source/pages/Simulateurs/SalariéSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/SalariéSimulation.tsx index b0e9b0f2f..d30133f0c 100644 --- a/mon-entreprise/source/pages/Simulateurs/SalariéSimulation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/SalariéSimulation.tsx @@ -1,16 +1,13 @@ import Banner from 'Components/Banner' -import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' import Simulation from 'Components/Simulation' import SalaryExplanation from 'Components/simulationExplanation/SalaryExplanation' -import Emoji from 'Components/utils/Emoji' import { SitePathsContext } from 'Components/utils/SitePathsContext' -import { default as React, useContext } from 'react' -import { Trans, useTranslation } from 'react-i18next' +import { useContext } from 'react' +import { Trans } from 'react-i18next' import { Link } from 'react-router-dom' export default function SalariéSimulation() { const sitePaths = useContext(SitePathsContext) - const { language } = useTranslation().i18n return ( <> From ea4cd1b4613169230fb64a21c5aa1887114a3107 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 22 Apr 2021 10:59:10 +0200 Subject: [PATCH 065/319] =?UTF-8?q?=F0=9F=98=8D=20Favorise=20la=20d=C3=A9c?= =?UTF-8?q?ouverte=20des=20simulateurs=20connexes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/locales/ui-en.yaml | 3 ++ .../source/pages/Simulateurs/Page.tsx | 52 ++++++++++++------- .../source/pages/Simulateurs/metadata.tsx | 12 ++++- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 68e6c8ad7..05eef43f8 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1094,6 +1094,9 @@ pages: avocat: shortname: Lawyer title: Income simulator for private lawyers + cartes: + intégrer module web: <0>Integrate the web module<1>Add this simulator to + your website in one click chirurgien-dentiste: shortname: Dental surgeon title: Income simulator for a private dental surgeon diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index 656e51322..99cc9f7e2 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -7,10 +7,11 @@ import useSearchParamsSimulationSharing from 'Components/utils/useSearchParamsSi import useSimulationConfig from 'Components/utils/useSimulationConfig' import { default as React, useContext } from 'react' import emoji from 'react-easy-emoji' -import { useTranslation } from 'react-i18next' +import { Trans, useTranslation } from 'react-i18next' import { Link, useLocation } from 'react-router-dom' import { TrackChapter } from '../../ATInternetTracking' -import { SimulatorData } from './metadata' +import { SimulateurCard } from './Home' +import useSimulatorsData, { SimulatorData, SimulatorId } from './metadata' export default function PageData({ meta, @@ -22,6 +23,7 @@ export default function PageData({ iframe, component: Component, seoExplanations, + nextSteps, path, }: SimulatorData[keyof SimulatorData]) { const inIframe = useContext(IsEmbeddedContext) @@ -84,7 +86,7 @@ export default function PageData({ {!inIframe && ( <> {seoExplanations} - + )} @@ -92,29 +94,41 @@ export default function PageData({ ) } -function NextSteps({ iframe }: { iframe: string }) { +type NextStepsProps = { + iframe?: string + nextSteps?: Array +} + +function NextSteps({ iframe, nextSteps }: NextStepsProps) { const sitePaths = useContext(SitePathsContext) - if (!iframe) { + const simulators = useSimulatorsData() + if (!iframe && !nextSteps) { return null } return (

    Aller plus loin

    - -
    {emoji('📱')}
    -

    Intégrer le module web

    -

    - Ajouter ce simulateur sur votre site internet en un clic -

    -
    Découvrir
    - + {nextSteps?.map((simulatorId) => ( + + ))} + {iframe && ( + +
    {emoji('📱')}
    + +

    Intégrer le module web

    +

    + Ajouter ce simulateur sur votre site internet en un clic +

    +
    + + )}
    ) diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 3212b9af6..af14628e3 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -61,8 +61,10 @@ const simulateurs = [ 'aides-embauche', ] as const +export type SimulatorId = typeof simulateurs[number] + export type SimulatorData = Record< - typeof simulateurs[number], + SimulatorId, { meta?: { title: string @@ -88,6 +90,7 @@ export type SimulatorData = Record< description?: React.ReactNode config?: SimulationConfig seoExplanations?: React.ReactNode + nextSteps?: Array private?: true component: () => JSX.Element } @@ -199,6 +202,7 @@ export function getSimulatorsData({

    ), + nextSteps: ['chômage-partiel', 'aides-embauche'], }, 'auto-entrepreneur': { tracking: 'auto_entrepreneur', @@ -305,6 +309,7 @@ export function getSimulatorsData({
    ), + nextSteps: ['indépendant', 'comparaison-statuts'], }, indépendant: { config: indépendantConfig, @@ -328,6 +333,7 @@ export function getSimulatorsData({ ), }, component: IndépendantSimulation, + nextSteps: ['is', 'comparaison-statuts'], }, sasu: { config: sasuConfig, @@ -408,6 +414,7 @@ export function getSimulatorsData({

    ), + nextSteps: ['is', 'comparaison-statuts'], }, 'artiste-auteur': { icône: '👩‍🎨', @@ -543,6 +550,7 @@ export function getSimulatorsData({

    ), + nextSteps: ['salarié', 'aides-embauche'], }, 'comparaison-statuts': { component: SchemeComparaisonPage, @@ -850,6 +858,7 @@ export function getSimulatorsData({ ), component: AidesEmbauche, + nextSteps: ['salarié'], }, is: { icône: '🗓', @@ -903,6 +912,7 @@ export function getSimulatorsData({

    ), + nextSteps: ['salarié', 'comparaison-statuts'], }, } } From 42ebea09582de08d4725a8784fc0c3bf3b20f24a Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 22 Apr 2021 15:45:10 +0200 Subject: [PATCH 066/319] =?UTF-8?q?=F0=9F=90=9B=20Affichage=20des=20dates?= =?UTF-8?q?=20sur=20le=20simulateur=20IS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1489 --- .../source/components/conversation/RuleInput.tsx | 7 ++++++- mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/mon-entreprise/source/components/conversation/RuleInput.tsx b/mon-entreprise/source/components/conversation/RuleInput.tsx index 43e9202ff..6d76771fb 100644 --- a/mon-entreprise/source/components/conversation/RuleInput.tsx +++ b/mon-entreprise/source/components/conversation/RuleInput.tsx @@ -29,6 +29,10 @@ type Props = Omit< // a build-in logic in the engine, by setting the "applicability" of // suggestions. showSuggestions?: boolean + // TODO: having an option seems undesirable, but it's the easier way to + // implement this behavior currently + // cf .https://github.com/betagouv/mon-entreprise/issues/1489#issuecomment-823058710 + showDefaultDateValue?: boolean useSwitch?: boolean isTarget?: boolean onSubmit?: (source: string) => void @@ -58,6 +62,7 @@ export default function RuleInput({ isTarget = false, showSuggestions = true, onSubmit = () => null, + showDefaultDateValue = false, modifiers = {}, ...props }: Props) { @@ -69,7 +74,7 @@ export default function RuleInput({ const commonProps: InputProps = { dottedName, value, - missing: !!evaluation.missingVariables[dottedName], + missing: !showDefaultDateValue && !!evaluation.missingVariables[dottedName], onChange, title: rule.title, id: props.id ?? dottedName, diff --git a/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx index 4f63ad610..0ab8fe365 100644 --- a/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx @@ -77,6 +77,7 @@ function ExerciceDate() { Exercice du{' '} dispatch(updateSituation('entreprise . exercice . début', x)) } @@ -84,6 +85,7 @@ function ExerciceDate() { au{' '} dispatch(updateSituation('entreprise . exercice . fin', x)) } From 0af2854fc9db2831bffc3330f96e452e0eb9318c Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 23 Apr 2021 09:24:48 +0200 Subject: [PATCH 067/319] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20un=20bug=20sur?= =?UTF-8?q?=20le=20simulateur=20d'aide?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lorsqu'on répondait "jeune de -26 ans" emploi franc était actif mais affichait "non" au lieu du bon montant. --- .../source/pages/Simulateurs/AidesEmbauche.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx index eb7179ee6..22b4fa88d 100644 --- a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx @@ -10,7 +10,7 @@ import { useSimulationProgress } from 'Components/utils/useNextQuestion' import { useParamsFromSituation } from 'Components/utils/useSearchParamsSimulationSharing' import useSimulationConfig from 'Components/utils/useSimulationConfig' import { DottedName } from 'modele-social' -import { formatValue } from 'publicodes' +import Engine, { formatValue } from 'publicodes' import { partition } from 'ramda' import { useContext } from 'react' import { Trans, useTranslation } from 'react-i18next' @@ -234,7 +234,7 @@ function Results() { const isActive = typeof engine.evaluate(aide.dottedName).nodeValue === 'number' const situation = { ...baseEngine.parsedSituation, ...aide.situation } - return { ...aide, situation, isActive } + return { ...aide, situation, engine, isActive } }) const [aidesActives, aidesInactives] = partition( ({ isActive }) => isActive, @@ -249,7 +249,9 @@ function Results() { Les aides - + ({ ...aide, engine: baseEngine }))} + /> ) : ( @@ -269,7 +271,11 @@ function Results() { ) } -function AidesGrid({ aides }: { aides: Array }) { +function AidesGrid({ + aides, +}: { + aides: Array +}) { return (
    {aides.map((aide, i) => ( @@ -283,11 +289,11 @@ function ResultCard({ situation, title, dottedName, + engine, dateFin, versement, description, -}: AideDescriptor) { - const engine = useEngine() +}: AideDescriptor & { engine: Engine }) { const rule = engine.getParsedRules()[dottedName] const valueNode = (rule.explanation.valeur as any)?.explanation.valeur const evaluation = engine.evaluate(valueNode) From 718860ee793000caf913aa3baa2fbd1ff1b3d8ff Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 26 Apr 2021 11:40:02 +0200 Subject: [PATCH 068/319] =?UTF-8?q?=F0=9F=8F=93=20Propose=20de=20faire=20u?= =?UTF-8?q?n=20retour=20utilisateur=20apr=C3=A8s=20un=20bon=20avis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Répond partiellement à #1467 --- .../source/components/Feedback/index.tsx | 123 +++++++++--------- 1 file changed, 64 insertions(+), 59 deletions(-) diff --git a/mon-entreprise/source/components/Feedback/index.tsx b/mon-entreprise/source/components/Feedback/index.tsx index a3cc41db2..ac04b6970 100644 --- a/mon-entreprise/source/components/Feedback/index.tsx +++ b/mon-entreprise/source/components/Feedback/index.tsx @@ -21,7 +21,7 @@ const setFeedbackGivenForUrl = (url: string) => { JSON.stringify(new Date().toISOString()) ) } -// Ask for feedback again after 4 month +// Ask for feedback again after 4 months const askFeedback = (url: string) => { const previousFeedbackDate = safeLocalStorage.getItem(localStorageKey(url)) if (!previousFeedbackDate) { @@ -60,7 +60,7 @@ export default function PageFeedback({ customMessage }: PageFeedbackProps) { [ATTracker, url] ) - const handleErrorReporting = useCallback(() => { + const openSuggestionForm = useCallback(() => { setState({ ...state, showForm: true }) }, [state]) @@ -76,72 +76,77 @@ export default function PageFeedback({ customMessage }: PageFeedbackProps) { position: 'relative', }} > - {!state.showForm && !state.showThanks && ( -
    -

    - {customMessage || ( - - Êtes-vous satisfait de cette page ? - - )}{' '} -

    -
    + {!state.showForm && !state.showThanks && ( + <> +

    + {customMessage || ( + + Êtes-vous satisfait de cette page ? + + )}{' '} +

    +
    +
    + handleFeedback('mauvais')}> + {emoji('🙁')} + + handleFeedback('moyen')}> + {emoji('😐')} + +
    +
    + handleFeedback('bien')}> + {emoji('🙂')} + + handleFeedback('très bien')}> + {emoji('😀')} + +
    +
    + + )} + {(state.showThanks || state.showForm) && ( + + )} + {state.showThanks && ( +
    + Merci de votre retour !
    + )} + {state.showForm ? ( +
    + ) : ( -
    - )} - {(state.showThanks || state.showForm) && ( - - )} - {state.showThanks && ( -
    - Merci de votre retour ! -
    - )} - {state.showForm && } + )} +
    ) } From 68f887efc8805fea434867caa17332b5f27dd34d Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 26 Apr 2021 14:39:14 +0200 Subject: [PATCH 069/319] =?UTF-8?q?=F0=9F=96=8B=20Vue=20employeur=20pour?= =?UTF-8?q?=20simulateur=20embauche=20depuis=20"g=C3=A9rer"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/pages/Gérer/Home.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/mon-entreprise/source/pages/Gérer/Home.tsx b/mon-entreprise/source/pages/Gérer/Home.tsx index b9906d5f4..6501f31e9 100644 --- a/mon-entreprise/source/pages/Gérer/Home.tsx +++ b/mon-entreprise/source/pages/Gérer/Home.tsx @@ -156,6 +156,7 @@ export default function Gérer() { className="ui__ interactive card box light-border" to={{ pathname: sitePaths.simulateurs.salarié, + search: '?view=employeur', state: { fromGérer: true, }, From d3d1880c034d9349166c3fef32cde414639bd16e Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 26 Apr 2021 14:55:25 +0200 Subject: [PATCH 070/319] =?UTF-8?q?=F0=9F=8E=A8=20Prise=20en=20compte=20de?= =?UTF-8?q?s=20retours?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Réduit un peu l'emphase sur la section "aller plus loin". Je ne suis pas 100% satisfait de la présentation mais je pense qu'on peut merger et l'améliorer ultérieurement. --- .../source/pages/Dev/IntegrationTest.tsx | 2 +- mon-entreprise/source/pages/Iframes/index.tsx | 6 ++-- .../source/pages/Simulateurs/Home.tsx | 20 +++++++---- .../source/pages/Simulateurs/ISSimulation.tsx | 4 +-- .../source/pages/Simulateurs/Page.tsx | 34 +++++++++--------- .../source/pages/Simulateurs/metadata.tsx | 36 +++++++++---------- mon-entreprise/source/pages/Stats/Stats.tsx | 2 +- .../source/pages/integration/Iframe.tsx | 4 +-- 8 files changed, 59 insertions(+), 49 deletions(-) diff --git a/mon-entreprise/source/pages/Dev/IntegrationTest.tsx b/mon-entreprise/source/pages/Dev/IntegrationTest.tsx index d41b581aa..536272f15 100644 --- a/mon-entreprise/source/pages/Dev/IntegrationTest.tsx +++ b/mon-entreprise/source/pages/Dev/IntegrationTest.tsx @@ -7,7 +7,7 @@ export default function IntegrationTest() { const integrableModuleNames = useMemo( () => Object.values(simulators) - .map((s) => s.iframe) + .map((s) => s.iframePath) .filter(Boolean), [simulators] ) diff --git a/mon-entreprise/source/pages/Iframes/index.tsx b/mon-entreprise/source/pages/Iframes/index.tsx index c39ec5cb5..3aac548d8 100644 --- a/mon-entreprise/source/pages/Iframes/index.tsx +++ b/mon-entreprise/source/pages/Iframes/index.tsx @@ -19,11 +19,11 @@ export default function Iframes() {
    {Object.values(simulators) - .filter(({ iframe }) => !!iframe) + .filter(({ iframePath }) => !!iframePath) .map((s) => ( ( <> diff --git a/mon-entreprise/source/pages/Simulateurs/Home.tsx b/mon-entreprise/source/pages/Simulateurs/Home.tsx index 2b3111f47..5f6c1c440 100644 --- a/mon-entreprise/source/pages/Simulateurs/Home.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Home.tsx @@ -115,13 +115,17 @@ export default function Simulateurs() { export function SimulateurCard({ small = false, + noBorder = false, shortName, meta, path, tooltip, - iframe, + iframePath, icône, -}: SimulatorData[keyof SimulatorData] & { small?: boolean }) { +}: SimulatorData[keyof SimulatorData] & { + small?: boolean + noBorder?: boolean +}) { const isIframe = useContext(IsEmbeddedContext) const name = ( @@ -130,13 +134,17 @@ export function SimulateurCard({ ) return (
    diff --git a/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx index 0ab8fe365..cc5cb68f1 100644 --- a/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx @@ -77,7 +77,7 @@ function ExerciceDate() { Exercice du{' '} dispatch(updateSituation('entreprise . exercice . début', x)) } @@ -85,7 +85,7 @@ function ExerciceDate() { au{' '} dispatch(updateSituation('entreprise . exercice . fin', x)) } diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index 99cc9f7e2..e774ef1ee 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -7,7 +7,7 @@ import useSearchParamsSimulationSharing from 'Components/utils/useSearchParamsSi import useSimulationConfig from 'Components/utils/useSimulationConfig' import { default as React, useContext } from 'react' import emoji from 'react-easy-emoji' -import { Trans, useTranslation } from 'react-i18next' +import { useTranslation } from 'react-i18next' import { Link, useLocation } from 'react-router-dom' import { TrackChapter } from '../../ATInternetTracking' import { SimulateurCard } from './Home' @@ -20,7 +20,7 @@ export default function PageData({ tracking, tooltip, description, - iframe, + iframePath, component: Component, seoExplanations, nextSteps, @@ -86,7 +86,7 @@ export default function PageData({ {!inIframe && ( <> {seoExplanations} - + )} @@ -95,14 +95,14 @@ export default function PageData({ } type NextStepsProps = { - iframe?: string + iframePath?: string nextSteps?: Array } -function NextSteps({ iframe, nextSteps }: NextStepsProps) { +function NextSteps({ iframePath, nextSteps }: NextStepsProps) { const sitePaths = useContext(SitePathsContext) const simulators = useSimulatorsData() - if (!iframe && !nextSteps) { + if (!iframePath && !nextSteps) { return null } return ( @@ -110,23 +110,25 @@ function NextSteps({ iframe, nextSteps }: NextStepsProps) {

    Aller plus loin

    {nextSteps?.map((simulatorId) => ( - + ))} - {iframe && ( + {13 && (
    {emoji('📱')}
    - -

    Intégrer le module web

    -

    - Ajouter ce simulateur sur votre site internet en un clic -

    -
    +

    Intégrer le module web

    +

    + Ajouter ce simulateur sur votre site internet en un clic +

    )}
    diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index af14628e3..632c824f2 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -85,7 +85,7 @@ export type SimulatorData = Record< shortName: string path?: string tooltip?: string - iframe?: string + iframePath?: string title?: string description?: React.ReactNode config?: SimulationConfig @@ -111,7 +111,7 @@ export function getSimulatorsData({ 'pages.simulateurs.salarié.title', 'Simulateur de revenus pour salarié' ), - iframe: 'simulateur-embauche', + iframePath: 'simulateur-embauche', meta: { description: t( 'pages.simulateurs.salarié.meta.description', @@ -208,7 +208,7 @@ export function getSimulatorsData({ tracking: 'auto_entrepreneur', config: autoEntrepreneurConfig, icône: '🚶‍♂️', - iframe: 'simulateur-autoentrepreneur', + iframePath: 'simulateur-autoentrepreneur', meta: { description: t( 'pages.simulateurs.auto-entrepreneur.meta.description', @@ -315,7 +315,7 @@ export function getSimulatorsData({ config: indépendantConfig, tracking: 'independant', icône: '🏃', - iframe: 'simulateur-independant', + iframePath: 'simulateur-independant', path: sitePaths.simulateurs.indépendant, shortName: t('pages.simulateurs.indépendant.shortname', 'Indépendant'), title: t( @@ -339,7 +339,7 @@ export function getSimulatorsData({ config: sasuConfig, tracking: 'dirigeant_sasu', icône: '👨‍✈️', - iframe: 'simulateur-assimilesalarie', + iframePath: 'simulateur-assimilesalarie', meta: { description: t( 'pages.simulateurs.sasu.meta.description', @@ -419,7 +419,7 @@ export function getSimulatorsData({ 'artiste-auteur': { icône: '👩‍🎨', tracking: 'artiste-auteur', - iframe: 'simulateur-artiste-auteur', + iframePath: 'simulateur-artiste-auteur', meta: { title: t( 'pages.simulateurs.artiste-auteur.meta.title', @@ -450,7 +450,7 @@ export function getSimulatorsData({ config: chômageParielConfig, path: sitePaths.simulateurs['chômage-partiel'], icône: '😷', - iframe: 'simulateur-chomage-partiel', + iframePath: 'simulateur-chomage-partiel', meta: { description: t( 'pages.simulateurs.chômage-partiel.meta.description', @@ -646,7 +646,7 @@ export function getSimulatorsData({ 'Demande de mobilité internationale' ), private: true, - iframe: 'demande-mobilite', + iframePath: 'demande-mobilite', }, médecin: { config: médecinConfig, @@ -655,7 +655,7 @@ export function getSimulatorsData({ chapter3: 'medecin', }, icône: '⚕️', - iframe: 'médecin', + iframePath: 'médecin', path: sitePaths.simulateurs['profession-libérale'].médecin, shortName: t('pages.simulateurs.médecin.shortname', 'Médecin'), title: t( @@ -671,7 +671,7 @@ export function getSimulatorsData({ chapter2: 'profession_liberale', chapter3: 'chirurgien_dentiste', }, - iframe: 'chirurgien-dentiste', + iframePath: 'chirurgien-dentiste', path: sitePaths.simulateurs['profession-libérale']['chirurgien-dentiste'], shortName: t( 'pages.simulateurs.chirurgien-dentiste.shortname', @@ -690,7 +690,7 @@ export function getSimulatorsData({ chapter2: 'profession_liberale', chapter3: 'sage_femme', }, - iframe: 'sage-femme', + iframePath: 'sage-femme', path: sitePaths.simulateurs['profession-libérale']['sage-femme'], shortName: t('pages.simulateurs.sage-femme.shortname', 'Sage-femme'), title: t( @@ -710,7 +710,7 @@ export function getSimulatorsData({ 'Infirmiers, masseurs-kinésithérapeutes, pédicures-podologues, orthophonistes et orthoptistes' ), icône: '🩹', - iframe: 'auxiliaire-medical', + iframePath: 'auxiliaire-medical', path: sitePaths.simulateurs['profession-libérale'].auxiliaire, shortName: t('pages.simulateurs.auxiliaire.shortname', 'Auxiliaire méd.'), title: t( @@ -726,7 +726,7 @@ export function getSimulatorsData({ chapter3: 'avocat', }, icône: '⚖', // j'ai hesité avec 🥑 mais pas envie de me prendre un procès - iframe: 'avocat', + iframePath: 'avocat', path: sitePaths.simulateurs['profession-libérale'].avocat, shortName: t('pages.simulateurs.avocat.shortname', 'Avocat'), title: t( @@ -742,7 +742,7 @@ export function getSimulatorsData({ chapter3: 'expert_comptable', }, icône: '🧮', - iframe: 'expert-comptable', + iframePath: 'expert-comptable', path: sitePaths.simulateurs['profession-libérale']['expert-comptable'], shortName: t( 'pages.simulateurs.expert-comptable.shortname', @@ -770,7 +770,7 @@ export function getSimulatorsData({ "Calcul du revenu net pour les indépendants en libéral à l'impôt sur le revenu (IR, BNC)" ), }, - iframe: 'profession-liberale', + iframePath: 'profession-liberale', path: sitePaths.simulateurs['profession-libérale'].index, shortName: t( 'pages.simulateurs.profession-libérale.shortname', @@ -784,7 +784,7 @@ export function getSimulatorsData({ }, pamc: { private: true, - iframe: 'pamc', + iframePath: 'pamc', tracking: {}, title: t( 'pages.simulateurs.pamc.title', @@ -822,7 +822,7 @@ export function getSimulatorsData({ color: '#11965f', }, path: sitePaths.simulateurs['aides-embauche'], - iframe: 'aides-embauche', + iframePath: 'aides-embauche', shortName: t( 'pages.simulateurs.aides-embauche.meta.title', 'Aides à l’embauche' @@ -864,7 +864,7 @@ export function getSimulatorsData({ icône: '🗓', tracking: 'impot-societe', path: sitePaths.simulateurs.is, - iframe: 'impot-societe', + iframePath: 'impot-societe', meta: { title: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'), description: t( diff --git a/mon-entreprise/source/pages/Stats/Stats.tsx b/mon-entreprise/source/pages/Stats/Stats.tsx index 24ce067db..b6e3e60ac 100644 --- a/mon-entreprise/source/pages/Stats/Stats.tsx +++ b/mon-entreprise/source/pages/Stats/Stats.tsx @@ -340,7 +340,7 @@ function formatMonth(date: string | Date) { } function getChapter2(s: SimulatorData[keyof SimulatorData]): Chapter2 | '' { - if (s.iframe === 'pamc') { + if (s.iframePath === 'pamc') { return 'PAM' } if (!s.tracking) { diff --git a/mon-entreprise/source/pages/integration/Iframe.tsx b/mon-entreprise/source/pages/integration/Iframe.tsx index a7437d775..2e627c707 100644 --- a/mon-entreprise/source/pages/integration/Iframe.tsx +++ b/mon-entreprise/source/pages/integration/Iframe.tsx @@ -33,8 +33,8 @@ function IntegrationCustomizer() { const integrableModuleNames = useMemo( () => Object.values(simulators) - .filter((s) => s.iframe && !s.private) - .map((s) => s.iframe), + .filter((s) => s.iframePath && !s.private) + .map((s) => s.iframePath), [simulators] ) const defaultModuleFromUrl = From 41a9790dc669351eac8fbe25fcc296dc94222628 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 29 Apr 2021 15:01:32 +0200 Subject: [PATCH 071/319] =?UTF-8?q?=F0=9F=93=8E=20Url=20de=20partage=20ver?= =?UTF-8?q?s=20un=20module=20de=20la=20page=20stats?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/pages/Stats/Stats.tsx | 25 +++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/mon-entreprise/source/pages/Stats/Stats.tsx b/mon-entreprise/source/pages/Stats/Stats.tsx index b6e3e60ac..261c20190 100644 --- a/mon-entreprise/source/pages/Stats/Stats.tsx +++ b/mon-entreprise/source/pages/Stats/Stats.tsx @@ -8,6 +8,7 @@ import { add, groupBy, mapObjIndexed, mergeWith, toPairs } from 'ramda' import React, { useCallback, useEffect, useMemo, useState } from 'react' import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' +import { useHistory, useLocation } from 'react-router-dom' import styled from 'styled-components' import { TrackPage } from '../../ATInternetTracking' import stats from '../../data/stats.json' @@ -99,9 +100,29 @@ const computeTotals = (data: Data): number | Record => { .map((d) => d.nombre) .reduce(mergeWith(add), {}) } + export default function Stats() { - const [period, setPeriod] = useState('mois') - const [chapter2, setChapter2] = useState('') + const defaultPeriod = 'mois' + const history = useHistory() + const urlParams = new URLSearchParams(useLocation().search ?? '') + + const [period, setPeriod] = useState( + (urlParams.get('periode') as Period) ?? defaultPeriod + ) + const [chapter2, setChapter2] = useState( + urlParams.get('module') ?? '' + ) + + // The logic to persist some state in query parameters in the URL could be + // abstracted in a dedicated React hook. + useEffect(() => { + const queryParams = [ + period !== defaultPeriod && `periode=${period}`, + chapter2 && `module=${chapter2}`, + ].filter(Boolean) + history.replace({ search: `?${queryParams.join('&')}` }) + }, [period, chapter2]) + const visites = useMemo(() => { const rawData = period === 'jours' ? stats.visitesJours : stats.visitesMois if (!chapter2) { From 8f836722127b55b155ddb7f2204b5e7afc8a57a2 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 29 Apr 2021 15:07:17 +0200 Subject: [PATCH 072/319] =?UTF-8?q?=F0=9F=A4=96=20MAJ=20des=20stats=20quot?= =?UTF-8?q?idiennes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yaml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 4d86c886f..e5187a9d8 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -4,10 +4,17 @@ on: types: [opened, synchronize] push: branches: [master, demo, next] - # We display the release note in the "news" section of mon-entreprise.fr so we - # want to re-deploy the site when a new release is published on GitHub. + + # We display the release notes in the "news" section of mon-entreprise.fr so + # we want to re-deploy the site when a new release is published or edited on + # GitHub. release: - types: [published] + types: [published, edited] + + # The /stats data is generated during the build. To keep the daily data fresh, + # we relaunch a nightly full build of the app + schedule: + - cron: "0 4 * * *" jobs: deploy-context: From a281991d9ca6b1f578293d3808c35c1cc7a8304e Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 29 Apr 2021 15:35:04 +0200 Subject: [PATCH 073/319] =?UTF-8?q?=F0=9F=96=8B=20L'aide=20=C3=A0=20la=20d?= =?UTF-8?q?=C3=A9claration=20s'applique=20aux=20SARL/EURL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/pages/Gérer/Home.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mon-entreprise/source/pages/Gérer/Home.tsx b/mon-entreprise/source/pages/Gérer/Home.tsx index 6501f31e9..42c2171b9 100644 --- a/mon-entreprise/source/pages/Gérer/Home.tsx +++ b/mon-entreprise/source/pages/Gérer/Home.tsx @@ -85,7 +85,8 @@ export default function Gérer() { <>
    - {company?.statutJuridique === 'EI' && + {(company?.statutJuridique === 'EI' || + company?.statutJuridique === 'SARL') && !company.isAutoEntrepreneur && ( Date: Fri, 30 Apr 2021 11:45:37 +0200 Subject: [PATCH 074/319] =?UTF-8?q?=F0=9F=93=96=20Ajout=20des=20guides=20U?= =?UTF-8?q?rssaf=202021?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 4 +- modele-social/règles/profession-libérale.yaml | 4 +- mon-entreprise/source/components/ui/Card.css | 3 + .../source/pages/Créer/CreationChecklist.tsx | 37 +++--- .../pages/Créer/Guide_Auto-Entrepreneur.pdf | Bin 595388 -> 0 bytes .../source/pages/Simulateurs/Home.tsx | 12 +- .../source/pages/Simulateurs/Page.tsx | 125 ++++++++++++++---- .../source/pages/Simulateurs/metadata.tsx | 2 +- 8 files changed, 125 insertions(+), 62 deletions(-) delete mode 100644 mon-entreprise/source/pages/Créer/Guide_Auto-Entrepreneur.pdf diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 7f8e987ec..27896eacc 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -296,7 +296,7 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations: valeur: 12.8% références: - guide urssaf (PDF): https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Guide_Auto-Entrepreneur.pdf + guide urssaf (PDF): https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf La protection sociale du micro-entrepreneur: https://bpifrance-creation.fr/encyclopedie/micro-entreprise-regime-auto-entrepreneur/fiscal-social-comptable/protection-sociale economie.gouv.fr: https://www.economie.gouv.fr/entreprises/micro-entreprise-auto-entreprise-charges-sociales actualité urssaf.fr (2019): https://www.autoentrepreneur.urssaf.fr/portail/accueil/sinformer-sur-le-statut/toutes-les-actualites/nouveautes-2019--ce-qui-change-e.html @@ -359,7 +359,7 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . tau alors: 12.10% - sinon: taux ACRE * taux prestation de service références: - urssaf.fr: https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Guide_Auto-Entrepreneur.pdf?page=14 + urssaf.fr: https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf dirigeant . auto-entrepreneur . notification calcul ACRE annuel: formule: entreprise . ACRE diff --git a/modele-social/règles/profession-libérale.yaml b/modele-social/règles/profession-libérale.yaml index 242baf753..6bf2c19fb 100644 --- a/modele-social/règles/profession-libérale.yaml +++ b/modele-social/règles/profession-libérale.yaml @@ -154,7 +154,7 @@ dirigeant . indépendant . PL . régime général . taux spécifique retraite co travailleurs indépendants  ont la possibilité d’opter pour des taux spécifique de la cotisation retraite complémentaire. références: - Guide PL urssaf (page 10): https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Guide-Professions-liberales.pdf + Guide PL urssaf: https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire . montant: titre: retraite complémentaire (taux PLNR) @@ -192,7 +192,7 @@ dirigeant . indépendant . PL . maladie: arrondi: oui références: secu-independants.fr: https://www.secu-independants.fr/cotisations/calcul-des-cotisations/taux-de-cotisations - guide urssaf (pdf): https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Guide-Professions-liberales.pdf + guide urssaf (pdf): https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf note: | Les professions libérales réglementée ne cotisent pour la part correspondante aux indemnités journalières et n'ont donc pas le droit à ces indemnités en cas de diff --git a/mon-entreprise/source/components/ui/Card.css b/mon-entreprise/source/components/ui/Card.css index 56e2fb48f..ce8744da5 100644 --- a/mon-entreprise/source/components/ui/Card.css +++ b/mon-entreprise/source/components/ui/Card.css @@ -105,6 +105,9 @@ color: inherit; font-size: inherit !important; } +.ui__.card.box.thiner { + max-width: 15rem; +} .ui__.card.box.ui__.interactive.light-border:hover { border-color: var(--lightColor); /* border-color: var(--lightColor); */ diff --git a/mon-entreprise/source/pages/Créer/CreationChecklist.tsx b/mon-entreprise/source/pages/Créer/CreationChecklist.tsx index 47dd055ef..afcceca5a 100644 --- a/mon-entreprise/source/pages/Créer/CreationChecklist.tsx +++ b/mon-entreprise/source/pages/Créer/CreationChecklist.tsx @@ -16,7 +16,6 @@ import { Link, useHistory } from 'react-router-dom' import { RootState } from 'Reducers/rootReducer' import { LegalStatus } from 'Selectors/companyStatusSelectors' import { TrackPage } from '../../ATInternetTracking' -import GuideAutoEntrepreneurUrl from './Guide_Auto-Entrepreneur.pdf' import StatutDescription from './StatutDescription' type CreateCompanyProps = { @@ -522,12 +521,28 @@ export default function CreateCompany({ statut }: CreateCompanyProps) {

    + {i18n.language === 'fr' && isAutoentrepreneur && ( + +

    Guide pratique Urssaf

    +

    + Des conseils pour les auto-entrepreneurs : comment préparer son + projet pour se lancer dans la création et une présentation + détaillée de votre protection sociale. +

    + + PDF +
    + )} {isAutoentrepreneur && } {i18n.language === 'fr' && ['EI', 'EIRL', 'EURL'].includes(statut) && (

    Guide Urssaf pour les travailleur indépendant

    @@ -586,24 +601,6 @@ export function RessourceAutoEntrepreneur() {

    - {i18n.language === 'fr' && ( - -

    Guide pratique Urssaf

    -

    - Des conseils pour les auto-entrepreneurs : comment préparer son - projet pour se lancer dans la création et une présentation détaillée - de votre protection sociale. -

    - -
    - PDF -
    -
    - )} }>y_j|;-e`M0sGEUesrpM#Z^^B?rF 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

    B;?p&~MC^ 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 G?f(PxbHdL6 diff --git a/mon-entreprise/source/pages/Simulateurs/Home.tsx b/mon-entreprise/source/pages/Simulateurs/Home.tsx index 5f6c1c440..7b46aba17 100644 --- a/mon-entreprise/source/pages/Simulateurs/Home.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Home.tsx @@ -115,7 +115,6 @@ export default function Simulateurs() { export function SimulateurCard({ small = false, - noBorder = false, shortName, meta, path, @@ -124,7 +123,6 @@ export function SimulateurCard({ icône, }: SimulatorData[keyof SimulatorData] & { small?: boolean - noBorder?: boolean }) { const isIframe = useContext(IsEmbeddedContext) const name = ( @@ -134,13 +132,9 @@ export function SimulateurCard({ ) return ( -} +type NextStepsProps = Pick< + SimulatorData[keyof SimulatorData], + 'iframePath' | 'nextSteps' +> function NextSteps({ iframePath, nextSteps }: NextStepsProps) { const sitePaths = useContext(SitePathsContext) const simulators = useSimulatorsData() - if (!iframePath && !nextSteps) { + const { language } = useTranslation().i18n + const engine = useEngine() + + const guideUrssaf = guidesUrssaf.find( + ({ associatedRule }) => engine.evaluate(associatedRule).nodeValue + ) + + if (!iframePath && !nextSteps && !guideUrssaf) { return null } return (

    Aller plus loin

    -
    - {nextSteps?.map((simulatorId) => ( - - ))} - {13 && ( - -
    {emoji('📱')}
    -

    Intégrer le module web

    -

    - Ajouter ce simulateur sur votre site internet en un clic -

    - - )} +
    +
    + {guideUrssaf && language === 'fr' && ( + +
    + {emoji('📖')}{' '} + {guideUrssaf.title} +
    +

    + Des conseils pour se lancer dans la création et une présentation + détaillée de votre protection sociale. +

    + PDF +
    + )} + {nextSteps?.map((simulatorId) => ( + +
    + + {emoji(simulators[simulatorId].icône)} + + {simulators[simulatorId].shortName} +
    +

    + {simulators[simulatorId].meta?.description} +

    + + ))} + {iframePath && ( + +
    + {emoji('📱')} Intégrer le + module web +
    +

    + Ajouter ce simulateur sur votre site internet en un clic +

    + + )} +
    ) } + +const guidesUrssaf = [ + { + url: + 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf', + associatedRule: "dirigeant . indépendant . PL . métier = 'santé . médecin'", + title: 'Guide Urssaf pour les médecins libéraux', + }, + { + url: + 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf', + associatedRule: 'entreprise . activité . libérale réglementée', + title: 'Guide Urssaf pour les professions libérales réglementées', + }, + { + url: + 'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf', + associatedRule: 'dirigeant . auto-entrepreneur', + title: 'Guide Urssaf pour les auto-entrepreneurs', + }, + { + url: + 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf', + associatedRule: 'dirigeant', + title: 'Guide Urssaf pour les indépendants', + }, +] diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 632c824f2..b50b816b1 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -333,7 +333,7 @@ export function getSimulatorsData({ ), }, component: IndépendantSimulation, - nextSteps: ['is', 'comparaison-statuts'], + nextSteps: ['comparaison-statuts', 'is'], }, sasu: { config: sasuConfig, From 7b903bf9ceacf5b3b8de62ce53c20293cc0a6565 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Sun, 2 May 2021 12:05:56 +0200 Subject: [PATCH 075/319] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20le=20lien=20ve?= =?UTF-8?q?rs=20l'int=C3=A9gration=20iframe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/locales/ui-en.yaml | 3 ++ .../source/pages/Simulateurs/Page.tsx | 28 ++++++++----------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 05eef43f8..e891209c0 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -835,6 +835,9 @@ newsletter: Subscribe to our monthly newsletter to receive <2>official advice on starting a business and access new features in advance. titre: Stay informed +nextSteps: + integration-iframe: <0>{emoji('📱')} Integrate the web module<1>Add this + simulator to your website in one click via a turnkey script. non: no non applicable si: not applicable if non déductible: not deductible diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index 2f56cf20b..651d32529 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -8,11 +8,10 @@ import useSearchParamsSimulationSharing from 'Components/utils/useSearchParamsSi import useSimulationConfig from 'Components/utils/useSimulationConfig' import { default as React, useContext } from 'react' import emoji from 'react-easy-emoji' -import { useTranslation } from 'react-i18next' +import { Trans, useTranslation } from 'react-i18next' import { Link, useLocation } from 'react-router-dom' import { TrackChapter } from '../../ATInternetTracking' -import { SimulateurCard } from './Home' -import useSimulatorsData, { SimulatorData, SimulatorId } from './metadata' +import useSimulatorsData, { SimulatorData } from './metadata' export default function PageData({ meta, @@ -125,8 +124,7 @@ function NextSteps({ iframePath, nextSteps }: NextStepsProps) { target="_blank" >
    - {emoji('📖')}{' '} - {guideUrssaf.title} + {emoji('📖')} {guideUrssaf.title}

    Des conseils pour se lancer dans la création et une présentation @@ -145,9 +143,7 @@ function NextSteps({ iframePath, nextSteps }: NextStepsProps) { }} >

    - - {emoji(simulators[simulatorId].icône)} - + {emoji(simulators[simulatorId].icône)}{' '} {simulators[simulatorId].shortName}

    @@ -160,16 +156,16 @@ function NextSteps({ iframePath, nextSteps }: NextStepsProps) { className="ui__ interactive card box thiner" to={{ pathname: sitePaths.integration.iframe, - search: `?module=`, + search: `?module=${iframePath}`, }} > -

    - {emoji('📱')} Intégrer le - module web -
    -

    - Ajouter ce simulateur sur votre site internet en un clic -

    + +
    {emoji('📱')} Intégrer le module web
    +

    + Ajouter ce simulateur sur votre site internet en un clic via + un script clé en main. +

    +
    )}
    From 537805d0a4d44444c3033192d57571068739b9fc Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Sun, 2 May 2021 12:38:26 +0200 Subject: [PATCH 076/319] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20l'affichage=20?= =?UTF-8?q?des=20emojies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/locales/ui-en.yaml | 4 ++-- mon-entreprise/source/pages/Simulateurs/Page.tsx | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index e891209c0..cdc1eb266 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -836,8 +836,8 @@ newsletter: starting a business and access new features in advance. titre: Stay informed nextSteps: - integration-iframe: <0>{emoji('📱')} Integrate the web module<1>Add this - simulator to your website in one click via a turnkey script. + integration-iframe: <0><0> Integrate the web module<1>Add this simulator + to your website in one click with a simple script. non: no non applicable si: not applicable if non déductible: not deductible diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index 651d32529..a55f3e1ea 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -1,6 +1,7 @@ import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' import { ThemeColorsProvider } from 'Components/utils/colors' import { IsEmbeddedContext } from 'Components/utils/embeddedContext' +import Emoji from 'Components/utils/Emoji' import { useEngine } from 'Components/utils/EngineContext' import Meta from 'Components/utils/Meta' import { SitePathsContext } from 'Components/utils/SitePathsContext' @@ -124,7 +125,7 @@ function NextSteps({ iframePath, nextSteps }: NextStepsProps) { target="_blank" >
    - {emoji('📖')} {guideUrssaf.title} + {guideUrssaf.title}

    Des conseils pour se lancer dans la création et une présentation @@ -143,7 +144,7 @@ function NextSteps({ iframePath, nextSteps }: NextStepsProps) { }} >

    - {emoji(simulators[simulatorId].icône)}{' '} + {' '} {simulators[simulatorId].shortName}

    @@ -160,7 +161,9 @@ function NextSteps({ iframePath, nextSteps }: NextStepsProps) { }} > -

    {emoji('📱')} Intégrer le module web
    +
    + Intégrer le module web +

    Ajouter ce simulateur sur votre site internet en un clic via un script clé en main. From eea6b9d52578a0c58c8f4f34673c9992ecec58b4 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 27 Apr 2021 12:10:56 +0200 Subject: [PATCH 077/319] =?UTF-8?q?=F0=9F=92=9A=20Fix=20typescript=20confi?= =?UTF-8?q?g=20for=20publicodes=20AST=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publicodes/core/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/publicodes/core/tsconfig.json b/publicodes/core/tsconfig.json index 7c81df221..a71de8cce 100644 --- a/publicodes/core/tsconfig.json +++ b/publicodes/core/tsconfig.json @@ -5,5 +5,5 @@ "declaration": true, "emitDeclarationOnly": true }, - "include": ["source/index.ts", "source/types"] + "include": ["source/index.ts", "source/types", "source/AST/**/*.ts"] } From 985e64b4fe365298d8893cbc5331f381e36a68a5 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 3 May 2021 14:26:27 +0200 Subject: [PATCH 078/319] =?UTF-8?q?R=C3=A9pare=20la=20page=20blanche=20lor?= =?UTF-8?q?s=20de=20l'IS=20+=20bar=C3=A8me=20standard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/impôt.yaml | 5 ++++- .../source/components/CurrencyInput/CurrencyInput.tsx | 4 +++- .../regressions/__snapshots__/simulations.jest.js.snap | 10 ++++++++++ .../test/regressions/simulations-indépendant.yaml | 9 +++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/modele-social/règles/impôt.yaml b/modele-social/règles/impôt.yaml index b5eb55141..27156a540 100644 --- a/modele-social/règles/impôt.yaml +++ b/modele-social/règles/impôt.yaml @@ -337,7 +337,10 @@ impôt . foyer fiscal . nombre de parts . majoration personne veuve avec enfant: impôt . foyer fiscal . taux effectif: unité: '%' - formule: impôt à payer / revenu imposable + variations: + - si: impôt à payer = 0 + alors: 0% + - sinon: impôt à payer / revenu imposable impôt . foyer fiscal . revenu imposable: diff --git a/mon-entreprise/source/components/CurrencyInput/CurrencyInput.tsx b/mon-entreprise/source/components/CurrencyInput/CurrencyInput.tsx index 082ceab20..96c02b853 100644 --- a/mon-entreprise/source/components/CurrencyInput/CurrencyInput.tsx +++ b/mon-entreprise/source/components/CurrencyInput/CurrencyInput.tsx @@ -24,7 +24,9 @@ export default function CurrencyInput({ dottedName, ...forwardedProps }: CurrencyInputProps) { - const valueProp = value ?? '' + const valueProp = + typeof value === 'number' && Number.isNaN(value) ? '' : value ?? '' + const [initialValue, setInitialValue] = useState(valueProp) const [currentValue, setCurrentValue] = useState(valueProp) diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 8d220e426..59658ed08 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -228,6 +228,16 @@ exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1372 exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246]"`; +exports[`calculate simulations-indépendant: imposition à l'IS 1`] = ` +"[100000,30104,69896,72608,12997,56899,0,100000] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; + +exports[`calculate simulations-indépendant: imposition à l'IS 2`] = ` +"[100000,30104,69896,72608,15122,54774,0,100000] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" +`; + exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084]"`; exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`; diff --git a/mon-entreprise/test/regressions/simulations-indépendant.yaml b/mon-entreprise/test/regressions/simulations-indépendant.yaml index a91152e1f..ec1e495c5 100644 --- a/mon-entreprise/test/regressions/simulations-indépendant.yaml +++ b/mon-entreprise/test/regressions/simulations-indépendant.yaml @@ -70,3 +70,12 @@ Contrats Madelin: dirigeant . indépendant . contrats madelin: oui dirigeant . indépendant . contrats madelin . mutuelle: 1500 €/an dirigeant . indépendant . contrats madelin . retraite: 5000 €/an + + +imposition à l'IS : + - entreprise . chiffre d'affaires: 100000 €/an + entreprise . imposition: "'IS'" + - entreprise . chiffre d'affaires: 100000 €/an + entreprise . imposition: "'IS'" + impôt . méthode de calcul: "'barème standard'" + \ No newline at end of file From 6bbb476eb6470a8e036462970151a1823cd053b2 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 3 May 2021 15:54:59 +0200 Subject: [PATCH 079/319] =?UTF-8?q?:green=5Fheart:=20r=C3=A9pare=20les=20t?= =?UTF-8?q?ests=20cypress=20en=20ajoutant=20un=20encodeURI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cypress/downloads/contrat-salarié.html | 274 ++++++++++++++++++ .../integration/mon-entreprise/covid19.js | 2 +- .../mon-entreprise/demande-mobilité.js | 2 +- .../integration/mon-entreprise/gérer.js | 2 +- .../integration/mon-entreprise/navigation.js | 8 +- .../integration/mon-entreprise/simulateurs.js | 8 +- .../integration/mon-entreprise/status.js | 2 +- 7 files changed, 287 insertions(+), 11 deletions(-) create mode 100644 mon-entreprise/cypress/downloads/contrat-salarié.html diff --git a/mon-entreprise/cypress/downloads/contrat-salarié.html b/mon-entreprise/cypress/downloads/contrat-salarié.html new file mode 100644 index 000000000..761dec9f0 --- /dev/null +++ b/mon-entreprise/cypress/downloads/contrat-salarié.html @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mon-entreprise.fr : L'assistant officiel du créateur d'entreprise + + + + + + + + + + +

    + Un service de l'État français +
    +
    +
    +
    +
    +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + diff --git a/mon-entreprise/cypress/integration/mon-entreprise/covid19.js b/mon-entreprise/cypress/integration/mon-entreprise/covid19.js index 489af713e..2732c9d6d 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/covid19.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/covid19.js @@ -10,7 +10,7 @@ describe('Page covid-19', function () { if (!fr) { return } - before(() => cy.visit('/simulateurs/chômage-partiel')) + before(() => cy.visit(encodeURI('/simulateurs/chômage-partiel'))) it('should not crash', () => { cy.contains('Salaire brut mensuel') }) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js b/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js index df8cd4ba3..9d564756d 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js @@ -12,7 +12,7 @@ describe( if (!fr) { return } - before(() => cy.visit('/gérer/demande-mobilité')) + before(() => cy.visit(encodeURI('/gérer/demande-mobilité'))) it('should not crash', () => { cy.contains('Demande de mobilité internationale') }) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js index fa85cb517..348643e12 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js @@ -1,7 +1,7 @@ describe('Manage page test', function () { const fr = Cypress.env('language') === 'fr' beforeEach(() => { - cy.visit(fr ? '/gérer' : '/manage') + cy.visit(fr ? encodeURI('/gérer') : '/manage') }) it('should not crash', function () { cy.contains(fr ? 'Gérer mon activité' : 'Manage my business') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/navigation.js b/mon-entreprise/cypress/integration/mon-entreprise/navigation.js index d3e3d1793..c98e1f2b2 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/navigation.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/navigation.js @@ -1,16 +1,18 @@ describe('Navigation', function () { const fr = Cypress.env('language') === 'fr' it('should enable switching site language', () => { - cy.visit(fr ? '/créer/auto-entrepreneur' : '/create/auto-entrepreneur') + cy.visit( + fr ? encodeURI('/créer/auto-entrepreneur') : '/create/auto-entrepreneur' + ) cy.contains(fr ? 'Switch to English' : 'Passer en français').click() cy.url().should( 'include', - fr ? '/create/auto-entrepreneur' : '/cr%C3%A9er/auto-entrepreneur' + fr ? '/create/auto-entrepreneur' : encodeURI('/créer/auto-entrepreneur') ) }) it('should go back to home when clicking on logo', () => { - cy.visit('/documentation/contrat-salarié') + cy.visit(encodeURI('/documentation/contrat-salarié')) cy.get('img[alt^="logo mon-entreprise"]').click() cy.url().should('match', new RegExp(`${Cypress.config().baseUrl}/?`)) }) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js index 48eb14969..42828977e 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js @@ -17,7 +17,7 @@ describe('Simulateurs', function () { 'profession-liberale/chirurgien-dentiste', ].forEach((simulateur) => describe(simulateur, () => { - before(() => cy.visit(`/simulateurs/${simulateur}`)) + before(() => cy.visit(encodeURI(`/simulateurs/${simulateur}`))) it('should not crash', function () { cy.get(inputSelector) }) @@ -139,7 +139,7 @@ describe('Simulateur salarié', () => { if (!fr) { return } - before(() => cy.visit('/simulateurs/salarié')) + before(() => cy.visit(encodeURI('/simulateurs/salarié'))) it('should persist the current simulation (persistSimulation)', function () { cy.get(inputSelector).first().type('{selectall}42') @@ -153,7 +153,7 @@ describe('Simulateur salarié', () => { cy.contains('Passer').click() cy.contains('Passer').click() cy.wait(1600) - cy.visit('/simulateurs/salarié') + cy.visit(encodeURI('/simulateurs/salarié')) cy.contains('Retrouver ma simulation').click() cy.get(inputSelector).first().invoke('val').should('match', /42/) }) @@ -169,7 +169,7 @@ describe('Simulateur salarié', () => { describe('part time contract', () => { before(() => { - cy.visit('/simulateurs/salarié') + cy.visit(encodeURI('/simulateurs/salarié')) cy.get('input[name$="brut de base"]').click() cy.get('button').contains('SMIC').click() cy.contains('Voir mes paramètres').click() diff --git a/mon-entreprise/cypress/integration/mon-entreprise/status.js b/mon-entreprise/cypress/integration/mon-entreprise/status.js index e08703de9..9c5b0095c 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/status.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/status.js @@ -1,7 +1,7 @@ describe('Status guide', function () { const fr = Cypress.env('language') === 'fr' beforeEach(() => { - cy.visit(fr ? '/créer' : '/create') + cy.visit(fr ? encodeURI('/créer') : '/create') cy.get('.cta').click() }) From 06220dbcbc7580110b65136a849b804c2ac3081b Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 3 May 2021 16:04:45 +0200 Subject: [PATCH 080/319] :fountain_pen: Corrige le texte de la section sur les cotisations forfaitaires provisionnelles --- modele-social/règles/dirigeant.yaml | 21 +++++------ mon-entreprise/source/locales/rules-en.yaml | 40 ++++++++++++--------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 27896eacc..1d463c755 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -919,24 +919,25 @@ dirigeant . indépendant . cotisations et contributions . début activité: n’étant pas connus**, les cotisations et contributions des deux premières années sont calculées sur une **base forfaitaire**. - + Cette base s’élève à **19 % du plafond annuel de la Sécurité sociale** au titre de - la première et de la deuxième année d’activité. + la première et de la deuxième année d’activité (à l’exception de la cotisation Maladie + et indemnités journalières pour lesquelles l’assiette forfaitaire est égale à 40% du + plafond annuel de la Sécurité sociale). - Il y a un **ajustement** au cours de la deuxième année en fonction des - revenus réels déclarés pour l'année précédente. Si votre rémunération effective - est supérieure à la base forfaitaire, vous devrez payer un montant montant de - cotisations plus élevé, c'est ce qu'on appelle la régularisation. + Ces cotisations seront ajustées et régularisées en fonction de vos revenus réels de + l’année d’exercice. Si votre revenu est supérieur à la base forfaitaire prise en compte + pour le calcul des cotisations provisionnelles alors vous serez redevable d’un **complément + de cotisations**. - Ce simulateur calcule les cotisations **après régularisation** (régime de croisière). - Il vous permet donc d'anticiper le montant de cette régularisation et de planifier votre - trésorerie en conséquence. + Ce simulateur calcule les cotisations dites définitives sur la base des revenus réels de votre + activité. Il vous permet donc de pouvoir anticiper le montant de cette régularisation et de + **planifier votre trésorerie** en conséquence. applicable si: entreprise . date de création >= 01/01/2020 unité: €/an - # valeur: cotisations et contributions recalcul: règle: cotisations et contributions avec: diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index ef482f695..d8f9c4a5f 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -6128,25 +6128,29 @@ dirigeant . indépendant . cotisations et contributions . début activité: This base amounts to **19% of the annual Social Security ceiling** for - the first and second year of activity. + the first and second years of activity (with the exception of the health contribution and + + and daily allowances for which the flat-rate base is equal to 40% of the annual + + annual Social Security ceiling). - There is an **adjustment** during the second year according to the actual + These contributions will be adjusted and regularised according to your actual income for the year of - income declared for the previous year. If your actual earnings + the year of exercise. If your income is higher than the flat-rate base taken into account - is higher than the flat-rate base, you will have to pay a higher amount of + for the calculation of the provisional contributions, you will be liable to pay an **additional - This is known as the regularisation. + of contributions**. - This simulator calculates the contributions **after regularisation** (cruising regime). + This simulator calculates the so-called definitive contributions on the basis of your actual income from - It therefore allows you to anticipate the amount of this regularisation and to plan your + activity. It therefore enables you to anticipate the amount of this adjustment and to - your cash flow accordingly. + plan your cash flow** accordingly. description.fr: > Lorsque vous commencez votre activité, vos **revenus professionnels @@ -6158,25 +6162,29 @@ dirigeant . indépendant . cotisations et contributions . début activité: Cette base s’élève à **19 % du plafond annuel de la Sécurité sociale** au titre de - la première et de la deuxième année d’activité. + la première et de la deuxième année d’activité (à l’exception de la cotisation Maladie + + et indemnités journalières pour lesquelles l’assiette forfaitaire est égale à 40% du + + plafond annuel de la Sécurité sociale). - Il y a un **ajustement** au cours de la deuxième année en fonction des + Ces cotisations seront ajustées et régularisées en fonction de vos revenus réels de - revenus réels déclarés pour l'année précédente. Si votre rémunération effective + l’année d’exercice. Si votre revenu est supérieur à la base forfaitaire prise en compte - est supérieure à la base forfaitaire, vous devrez payer un montant montant de + pour le calcul des cotisations provisionnelles alors vous serez redevable d’un **complément - cotisations plus élevé, c'est ce qu'on appelle la régularisation. + de cotisations**. - Ce simulateur calcule les cotisations **après régularisation** (régime de croisière). + Ce simulateur calcule les cotisations dites définitives sur la base des revenus réels de votre - Il vous permet donc d'anticiper le montant de cette régularisation et de planifier votre + activité. Il vous permet donc de pouvoir anticiper le montant de cette régularisation et de - trésorerie en conséquence. + **planifier votre trésorerie** en conséquence. titre.en: '[automatic] lump-sum start-up contributions' titre.fr: cotisations forfaitaires de début d'activité ? dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire From a62d3e2d95afab5f3cc4d5caab098ccac6b78190 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 3 May 2021 13:28:31 +0200 Subject: [PATCH 081/319] =?UTF-8?q?Met=20=C3=A0=20jour=20l'int=C3=A9gratio?= =?UTF-8?q?n=20sentry=20avec=20l'instance=20de=20beta.gouv.fr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/package.json | 6 +- mon-entreprise/source/App.tsx | 25 ---- mon-entreprise/source/Provider.tsx | 72 +++++++---- .../source/components/TargetSelection.tsx | 1 - mon-entreprise/source/entry.en.tsx | 1 + mon-entreprise/source/entry.fr.tsx | 1 + mon-entreprise/source/sentry.ts | 29 +++++ publicodes/site/entry.tsx | 13 ++ yarn.lock | 112 ++++++++++-------- 9 files changed, 161 insertions(+), 99 deletions(-) create mode 100644 mon-entreprise/source/sentry.ts diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index fd753fed4..d1fc4e517 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -29,8 +29,8 @@ "@types/js-yaml": "^3.12.2", "@types/react": "^17.0.0", "@types/react-color": "^3.0.1", - "@types/react-helmet": "^6.1.0", "@types/react-dom": "^17.0.0", + "@types/react-helmet": "^6.1.0", "@types/react-redux": "^7.1.11", "@types/react-router": "^5.1.2", "@types/recharts": "^1.8.16", @@ -62,7 +62,8 @@ "@babel/runtime": "^7.3.4", "@react-pdf/renderer": "^1.6.10", "@rehooks/local-storage": "^2.1.1", - "@sentry/browser": "5.15.5", + "@sentry/react": "^6.3.5", + "@sentry/tracing": "^6.3.5", "classnames": "^2.2.5", "color-convert": "^1.9.2", "core-js": "^3.2.1", @@ -93,7 +94,6 @@ "recharts": "^1.8.5", "reduce-reducers": "^1.0.4", "redux": "^4.0.4", - "redux-sentry-middleware": "^0.1.8", "regenerator-runtime": "^0.13.3", "reselect": "^4.0.0", "styled-components": "^5.1.0", diff --git a/mon-entreprise/source/App.tsx b/mon-entreprise/source/App.tsx index b66e9a37c..22bfaba66 100644 --- a/mon-entreprise/source/App.tsx +++ b/mon-entreprise/source/App.tsx @@ -1,4 +1,3 @@ -import * as Sentry from '@sentry/browser' import Footer from 'Components/layout/Footer/Footer' import Header from 'Components/layout/Header' import Route404 from 'Components/Route404' @@ -16,7 +15,6 @@ import { Helmet } from 'react-helmet' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { Route, Switch } from 'react-router-dom' -import createSentryMiddleware from 'redux-sentry-middleware' import { configSituationSelector, situationSelector, @@ -45,28 +43,6 @@ import { } from './storage/persistInFranceApp' import { setupSimulationPersistence } from './storage/persistSimulation' -if (process.env.NODE_ENV === 'production') { - let branch: string | undefined = process.env.GITHUB_REF?.split('/')?.slice( - -1 - )?.[0] - if (branch === 'merge') { - branch = process.env.GITHUB_HEAD_REF - } - const release = - branch && `${branch}-` + process.env.GITHUB_SHA?.substring(0, 7) - const dsn = 'https://9051375f856646d694943532caf2b45f@sentry.data.gouv.fr/18' - Sentry.init({ dsn, release }) - - if (branch && branch !== 'master') { - console.log( - `ℹ Vous êtes sur la branche : %c${branch}`, - 'font-weight: bold; text-decoration: underline;' - ) - } -} - -const middlewares = [createSentryMiddleware(Sentry as any)] - type RootProps = { basename: ProviderProps['basename'] rules: Rules @@ -80,7 +56,6 @@ export default function Root({ basename, rules }: RootProps) { { setupInFranceAppPersistence(store) setupSimulationPersistence(store) diff --git a/mon-entreprise/source/Provider.tsx b/mon-entreprise/source/Provider.tsx index f140b32b9..2011229a8 100644 --- a/mon-entreprise/source/Provider.tsx +++ b/mon-entreprise/source/Provider.tsx @@ -1,3 +1,4 @@ +import { ErrorBoundary } from '@sentry/react' import { ThemeColorsProvider } from 'Components/utils/colors' import { SitePathProvider, SitePaths } from 'Components/utils/SitePathsContext' import { createBrowserHistory } from 'history' @@ -18,6 +19,7 @@ import { // ATInternet Tracking import { TrackingContext } from './ATInternetTracking' import { createTracker } from './ATInternetTracking/Tracker' +import logo from './static/images/logo.svg' import safeLocalStorage from './storage/safeLocalStorage' import { inIframe } from './utils' @@ -118,29 +120,53 @@ export default function Provider({ ) ?? undefined return ( - // If IE < 11 display nothing - - - +
    + +

    Une erreur est survenue

    +

    + L'équipe technique de mon-entreprise.fr a été automatiquement + prévenue. Vous pouvez également nous contacter directement à + l'adresse{' '} + + contact@mon-entreprise.beta.gouv.fr + {' '} + si vous souhaitez partager une remarque. +

    +

    Veuillez nous excuser pour la gêne occasionnée.

    +
    + + } + > + + - - - - - <>{children} - - - - -
    -
    -
    + + + + + + <>{children} + + + + + + + + ) } diff --git a/mon-entreprise/source/components/TargetSelection.tsx b/mon-entreprise/source/components/TargetSelection.tsx index ace276de5..5687a1b37 100644 --- a/mon-entreprise/source/components/TargetSelection.tsx +++ b/mon-entreprise/source/components/TargetSelection.tsx @@ -40,7 +40,6 @@ export default function TargetSelection({ showPeriodSwitch = true }) { (state: RootState) => state.simulation?.config.objectifs || [] ) const colors = useContext(ThemeColorsContext) - return (
    {((typeof objectifs[0] === 'string' diff --git a/mon-entreprise/source/entry.en.tsx b/mon-entreprise/source/entry.en.tsx index 3b28e2e2e..209e25c7e 100644 --- a/mon-entreprise/source/entry.en.tsx +++ b/mon-entreprise/source/entry.en.tsx @@ -8,6 +8,7 @@ import i18next from './locales/i18n' import ruleTranslations from './locales/rules-en.yaml' import translateRules from './locales/translateRules' import translations from './locales/ui-en.yaml' +import './sentry' i18next.addResourceBundle('en', 'translation', translations) i18next.changeLanguage('en') diff --git a/mon-entreprise/source/entry.fr.tsx b/mon-entreprise/source/entry.fr.tsx index 2478e7287..46ee989c2 100644 --- a/mon-entreprise/source/entry.fr.tsx +++ b/mon-entreprise/source/entry.fr.tsx @@ -6,6 +6,7 @@ import { hot } from 'react-hot-loader/root' import 'regenerator-runtime/runtime' import App from './App' import i18next from './locales/i18n' +import './sentry' i18next.changeLanguage('fr') diff --git a/mon-entreprise/source/sentry.ts b/mon-entreprise/source/sentry.ts new file mode 100644 index 000000000..7d871ad03 --- /dev/null +++ b/mon-entreprise/source/sentry.ts @@ -0,0 +1,29 @@ +import * as Sentry from '@sentry/react' +import { Integrations } from '@sentry/tracing' + +let branch: string | undefined = process.env.GITHUB_REF?.split('/')?.slice( + -1 +)?.[0] + +if (branch === 'merge') { + branch = process.env.GITHUB_HEAD_REF +} + +const release = branch && `${branch}-` + process.env.GITHUB_SHA?.substring(0, 7) + +if (branch && branch !== 'master') { + console.info( + `ℹ Vous êtes sur la branche : %c${branch}`, + 'font-weight: bold; text-decoration: underline;' + ) +} +Sentry.init({ + dsn: + 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', + integrations: [new Integrations.BrowserTracing()], + release, + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + tracesSampleRate: 0.5, +}) diff --git a/publicodes/site/entry.tsx b/publicodes/site/entry.tsx index 052d0bd27..0fd9db88d 100644 --- a/publicodes/site/entry.tsx +++ b/publicodes/site/entry.tsx @@ -1,9 +1,22 @@ // TODO: The webpack configuration of the publi.codes site remains in the // mon-entreprise.fr and should be dissociated. +import * as Sentry from '@sentry/react' +import { Integrations } from '@sentry/tracing' import 'core-js/stable' import { render } from 'react-dom' import 'regenerator-runtime/runtime' import App from './components/App' +Sentry.init({ + dsn: + 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', + integrations: [new Integrations.BrowserTracing()], + + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + tracesSampleRate: 0.5, +}) + const anchor = document.querySelector('#js') render(, anchor) diff --git a/yarn.lock b/yarn.lock index 046e53620..ed55666e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2047,14 +2047,14 @@ dependencies: any-observable "^0.3.0" -"@sentry/browser@5.15.5": - version "5.15.5" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.15.5.tgz#d9a51f1388581067b50d30ed9b1aed2cbb333a36" - integrity sha512-rqDvjk/EvogfdbZ4TiEpxM/lwpPKmq23z9YKEO4q81+1SwJNua53H60dOk9HpRU8nOJ1g84TMKT2Ov8H7sqDWA== +"@sentry/browser@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.3.5.tgz#fc89538cf73752cd5b10060a914c6c5ece2d2893" + integrity sha512-fjkhPR5gLCGVWhbWjEoN64hnmTvfTLRCgWmYTc9SiGchWFoFEmLqZyF2uJFyt27+qamLQ9fN58nnv4Ly2yyxqg== dependencies: - "@sentry/core" "5.15.5" - "@sentry/types" "5.15.5" - "@sentry/utils" "5.15.5" + "@sentry/core" "6.3.5" + "@sentry/types" "6.3.5" + "@sentry/utils" "6.3.5" tslib "^1.9.3" "@sentry/browser@^5.0.0": @@ -2067,17 +2067,6 @@ "@sentry/utils" "5.27.6" tslib "^1.9.3" -"@sentry/core@5.15.5": - version "5.15.5" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.15.5.tgz#40ea79bff5272d3fbbeeb4a98cdc59e1adbd2c92" - integrity sha512-enxBLv5eibBMqcWyr+vApqeix8uqkfn0iGsD3piKvoMXCgKsrfMwlb/qo9Ox0lKr71qIlZVt+9/A2vZohdgnlg== - dependencies: - "@sentry/hub" "5.15.5" - "@sentry/minimal" "5.15.5" - "@sentry/types" "5.15.5" - "@sentry/utils" "5.15.5" - tslib "^1.9.3" - "@sentry/core@5.27.6": version "5.27.6" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.27.6.tgz#3ceeb58acd857f1e17d52d3087bfecb506adc1f7" @@ -2089,13 +2078,15 @@ "@sentry/utils" "5.27.6" tslib "^1.9.3" -"@sentry/hub@5.15.5": - version "5.15.5" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.15.5.tgz#f5abbcdbe656a70e2ff02c02a5a4cffa0f125935" - integrity sha512-zX9o49PcNIVMA4BZHe//GkbQ4Jx+nVofqU/Il32/IbwKhcpPlhGX3c1sOVQo4uag3cqd/JuQsk+DML9TKkN0Lw== +"@sentry/core@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.3.5.tgz#6b73de736eb9d0040be94cdbb06a744cd6b9172e" + integrity sha512-VR2ibDy33mryD0mT6d9fGhKjdNzS2FSwwZPe9GvmNOjkyjly/oV91BKVoYJneCqOeq8fyj2lvkJGKuupdJNDqg== dependencies: - "@sentry/types" "5.15.5" - "@sentry/utils" "5.15.5" + "@sentry/hub" "6.3.5" + "@sentry/minimal" "6.3.5" + "@sentry/types" "6.3.5" + "@sentry/utils" "6.3.5" tslib "^1.9.3" "@sentry/hub@5.27.6": @@ -2107,13 +2098,13 @@ "@sentry/utils" "5.27.6" tslib "^1.9.3" -"@sentry/minimal@5.15.5": - version "5.15.5" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.15.5.tgz#a0e4e071f01d9c4d808094ae7203f6c4cca9348a" - integrity sha512-zQkkJ1l9AjmU/Us5IrOTzu7bic4sTPKCatptXvLSTfyKW7N6K9MPIIFeSpZf9o1yM2sRYdK7GV08wS2eCT3JYw== +"@sentry/hub@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.3.5.tgz#c5bc6760f7e4e53e87149703b106804299060389" + integrity sha512-ZYFo7VYKwdPVjuV9BDFiYn+MpANn6eZMz5QDBfZ2dugIvIVbuOyOOLx8PSa3ZXJoVTZZ7s2wD2fi/ZxKjNjZOQ== dependencies: - "@sentry/hub" "5.15.5" - "@sentry/types" "5.15.5" + "@sentry/types" "6.3.5" + "@sentry/utils" "6.3.5" tslib "^1.9.3" "@sentry/minimal@5.27.6": @@ -2125,23 +2116,47 @@ "@sentry/types" "5.27.6" tslib "^1.9.3" -"@sentry/types@5.15.5": - version "5.15.5" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.15.5.tgz#16c97e464cf09bbd1d2e8ce90d130e781709076e" - integrity sha512-F9A5W7ucgQLJUG4LXw1ZIy4iLevrYZzbeZ7GJ09aMlmXH9PqGThm1t5LSZlVpZvUfQ2rYA8NU6BdKJSt7B5LPw== +"@sentry/minimal@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.3.5.tgz#ef4894771243d01d81e91819400d2ecdcb34b411" + integrity sha512-4RqIGAU0+8iI/1sw0GYPTr4SUA88/i2+JPjFJ+qloh5ANVaNwhFPRChw+Ys9xpre8LV9JZrEsEf8AvQr4fkNbA== + dependencies: + "@sentry/hub" "6.3.5" + "@sentry/types" "6.3.5" + tslib "^1.9.3" + +"@sentry/react@^6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.3.5.tgz#a2942b46601f1f0f1b37f176079eac7ab8d6cb49" + integrity sha512-BBxZeUBVOaDYGgoXi51Kocm9VQ2sIsftECh77m/3bZHBKOJDwpC+aoGI47vCtvWqzhL+6f2Zn1wNi1UhDqu7Aw== + dependencies: + "@sentry/browser" "6.3.5" + "@sentry/minimal" "6.3.5" + "@sentry/types" "6.3.5" + "@sentry/utils" "6.3.5" + hoist-non-react-statics "^3.3.2" + tslib "^1.9.3" + +"@sentry/tracing@^6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.3.5.tgz#f76c362159141f860081ec7df80aa9f85b545860" + integrity sha512-TNKAST1ge2g24BlTfVxNp4gP5t3drbi0OVCh8h8ah+J7UjHSfdiqhd9W2h5qv1GO61gGlpWeN/TyioyQmOxu0Q== + dependencies: + "@sentry/hub" "6.3.5" + "@sentry/minimal" "6.3.5" + "@sentry/types" "6.3.5" + "@sentry/utils" "6.3.5" + tslib "^1.9.3" "@sentry/types@5.27.6": version "5.27.6" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.27.6.tgz#b5054eafcb8ac11d4bc4787c7bc7fc113cad8b80" integrity sha512-XOW9W8DrMk++4Hk7gWi9o5VR0o/GrqGfTKyFsHSIjqt2hL6kiMPvKeb2Hhmp7Iq37N2bDmRdWpM5m+68S2Jk6w== -"@sentry/utils@5.15.5": - version "5.15.5" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.15.5.tgz#dec1d4c79037c4da08b386f5d34409234dcbfb15" - integrity sha512-Nl9gl/MGnzSkuKeo3QaefoD/OJrFLB8HmwQ7HUbTXb6E7yyEzNKAQMHXGkwNAjbdYyYbd42iABP6Y5F/h39NtA== - dependencies: - "@sentry/types" "5.15.5" - tslib "^1.9.3" +"@sentry/types@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.3.5.tgz#d5eca7e76c250882ab78c01a8df894a9a9ca537d" + integrity sha512-tY/3pkAmGYJ3F0BtwInsdt/uclNvF8aNG7XHsTPQNzk7BkNVWjCXx0sjxi6CILirl5nwNxYxVeTr2ZYAEZ/dSQ== "@sentry/utils@5.27.6": version "5.27.6" @@ -2151,6 +2166,14 @@ "@sentry/types" "5.27.6" tslib "^1.9.3" +"@sentry/utils@6.3.5": + version "6.3.5" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.3.5.tgz#a4805448cb0314d3d119688162aa695598a10bbb" + integrity sha512-kHUcZ37QYlNzz7c9LVdApITXHaNmQK7+sw/If3M/qpff1fd5XoecA8laLfcYuz+Cw5mRhVmdhPcCRM3Xi1IGXg== + dependencies: + "@sentry/types" "6.3.5" + tslib "^1.9.3" + "@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": version "1.8.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" @@ -7171,7 +7194,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -11489,11 +11512,6 @@ reduce-reducers@^1.0.4: resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-1.0.4.tgz#fb77e751a9eb0201760ac5a605ca8c9c2d0537f8" integrity sha512-Mb2WZ2bJF597exiqX7owBzrqJ74DHLK3yOQjCyPAaNifRncE8OD0wFIuoMhXxTnHK07+8zZ2SJEKy/qtiyR7vw== -redux-sentry-middleware@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/redux-sentry-middleware/-/redux-sentry-middleware-0.1.8.tgz#29f71821c1fb87d4ebcb8f76067fea3c3738a64c" - integrity sha512-xubpYH9RgE31tZUESeRW5agwQa19Yd6Gy+4iO09raW/2TITPO5fhJdXpVwJfpGMbIYhEmHFqE2wD5Lnz7YtAeA== - redux@>=3.7.2, redux@^4.0.0, redux@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" From 2e972fca44e21798ec8f48e75affef471483edbe Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 3 May 2021 17:34:10 +0200 Subject: [PATCH 082/319] =?UTF-8?q?:bug:=20r=C3=A9pare=20le=20mode=20--wat?= =?UTF-8?q?ch=20sur=20mon-entreprise=20x=20publicodes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Auparavant, les modifications sur publicodes ne lancaient pas de rebuild, il fallait tuer et relancer le process pour que cela marche. Incidement corrige la fuite mémoire du CTRL+C sur le yarn start --- mon-entreprise/dev-server.js | 4 +- mon-entreprise/package.json | 5 +- mon-entreprise/webpack.dev.js | 3 + package.json | 3 +- publicodes/core/package.json | 1 + publicodes/core/source/index.ts | 2 + yarn.lock | 141 +++++++++++++++++++++++++++++++- 7 files changed, 151 insertions(+), 8 deletions(-) diff --git a/mon-entreprise/dev-server.js b/mon-entreprise/dev-server.js index c24789420..7ccacbfc5 100644 --- a/mon-entreprise/dev-server.js +++ b/mon-entreprise/dev-server.js @@ -16,8 +16,8 @@ const rewrite = (basename) => ({ }) app.get('/', function (req, res) { - res.send(`
    • mon-entreprise [fr]
    • -
    • infrance [en]
    • + res.send(``) }) diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index d1fc4e517..d5eda7044 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -121,10 +121,9 @@ "i18n:ui:check": "yarn run i18next -c scripts/i18n/parser.config.js && node scripts/i18n/check-missing-UI-translation", "i18n:ui:translate": "rm -rf source/locales/static-analysis-fr.json && yarn run i18next -c scripts/i18n/parser.config.js && node scripts/i18n/translate-ui.js", "start": "node dev-server.js", - "serve:dev": "yarn run serve:dev:mon-entreprise & yarn run serve:dev:mycompanyinfrance & yarn run serve:dev:publicodes", + "serve:dev": "concurrently -k \"yarn run serve:dev:mon-entreprise\" \"yarn run serve:dev:mycompanyinfrance & yarn run serve:dev:publicodes\"", "serve:dev:mon-entreprise": "PORT=5000 serve --config serve.mon-entreprise.json --no-clipboard", "serve:dev:publicodes": "PORT=5002 serve --config serve.publicodes.json --no-clipboard", - "serve:dev:mycompanyinfrance": "PORT=5001 serve --config serve.infrance.json --no-clipboard", - "publish:publicodes": "yarn run lint && yarn run " + "serve:dev:mycompanyinfrance": "PORT=5001 serve --config serve.infrance.json --no-clipboard" } } diff --git a/mon-entreprise/webpack.dev.js b/mon-entreprise/webpack.dev.js index c0c8b51bb..d0cd06986 100644 --- a/mon-entreprise/webpack.dev.js +++ b/mon-entreprise/webpack.dev.js @@ -14,6 +14,9 @@ module.exports = { module: { rules: [...commonLoaders(), styleLoader('style-loader')], }, + watchOptions: { + aggregateTimeout: 600, + }, mode: 'development', entry: map((entry) => ['webpack-hot-middleware/client', entry], common.entry), plugins: [ diff --git a/package.json b/package.json index 9191858d8..4794f1b46 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "babel-plugin-styled-components": "^1.10.7", "babel-plugin-webpack-alias": "^2.1.2", "chai": "^4.1.2", + "concurrently": "^6.0.2", "connect-history-api-fallback": "^1.5.0", "css-loader": "^0.28.11", "csv-loader": "^2.1.1", @@ -121,7 +122,7 @@ "test:type": "yarn workspaces run tsc", "test:regressions": "yarn workspace modele-social build && jest", "clean": "yarn workspaces run clean && rimraf node_modules", - "start": "yarn workspace publicodes build --watch & yarn workspace publicodes-react build --watch & yarn workspace mon-entreprise start", + "start": "concurrently -k -n publicodes,publicodes-react,mon-entreprise \"yarn workspace publicodes build:watch\" \"yarn workspace publicodes-react build --watch\" \"yarn workspace mon-entreprise start\"", "moso:up": "yarn workspace modele-social run up && yarn workspace mon-entreprise upgrade modele-social", "publicodes:up": "yarn workspace publicodes-react upgrade publicodes && yarn workspace mon-entreprise upgrade publicodes publicodes-react" }, diff --git a/publicodes/core/package.json b/publicodes/core/package.json index 277b0d486..13dd25438 100644 --- a/publicodes/core/package.json +++ b/publicodes/core/package.json @@ -41,6 +41,7 @@ "clean": "rimraf dist node_modules", "prepare": "yarn run rimraf dist && yarn run build", "build": "yarn run webpack --config webpack.config.js && yarn run tsc", + "build:watch": "concurrently \"yarn run webpack --watch --config webpack.config.js\" \"yarn run tsc -w\"", "test:file": "yarn mocha-webpack --include test/setupIntl.js --webpack-config ./webpack.test.js ", "test": "yarn test:file \"./{,!(node_modules)/**/}!(webpack).test.js\"" }, diff --git a/publicodes/core/source/index.ts b/publicodes/core/source/index.ts index 4cbf72475..7098a5cc2 100644 --- a/publicodes/core/source/index.ts +++ b/publicodes/core/source/index.ts @@ -185,6 +185,8 @@ export default class Engine { newEngine.options = this.options newEngine.parsedRules = this.parsedRules newEngine.replacements = this.replacements + newEngine.parsedSituation = this.parsedSituation + newEngine.cache = this.cache return newEngine } } diff --git a/yarn.lock b/yarn.lock index ed55666e5..ff696c845 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2382,6 +2382,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.50.tgz#e9b2e85fafc15f2a8aa8fdd41091b983da5fd6ee" integrity sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -3150,6 +3155,13 @@ ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" @@ -4456,6 +4468,15 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -4683,6 +4704,21 @@ concat-stream@^1.5.0, concat-stream@^1.6.2, concat-stream@~1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" +concurrently@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.0.2.tgz#4ecdfc78a72a6f626a3a5d3c2a7a81962f3663e3" + integrity sha512-u+1Q0dJG5BidgUTpz9CU16yoHTt/oApFDQ3mbvHwSDgMjU7aGqy0q8ZQyaZyaNxdwRKTD872Ux3Twc6//sWA+Q== + dependencies: + chalk "^4.1.0" + date-fns "^2.16.1" + lodash "^4.17.21" + read-pkg "^5.2.0" + rxjs "^6.6.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^16.2.0" + connect-history-api-fallback@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" @@ -5203,6 +5239,11 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== +date-fns@^2.16.1: + version "2.21.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.21.1.tgz#679a4ccaa584c0706ea70b3fa92262ac3009d2b0" + integrity sha512-m1WR0xGiC6j6jNFAyW4Nvh4WxAi4JF4w9jRJwSI8nBmNcyZXPcP9VUQG+6gHQXAmqaGEKDKhOqAtENDC941UkA== + dayjs@^1.9.3: version "1.10.4" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2" @@ -6771,7 +6812,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -8632,6 +8673,11 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -8790,6 +8836,11 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" @@ -9000,6 +9051,11 @@ lodash@^4.0.1, lodash@^4.11.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -9747,7 +9803,7 @@ noop-logger@^0.1.1: resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= -normalize-package-data@^2.3.2: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -10199,6 +10255,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -11412,6 +11478,16 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -11996,6 +12072,13 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" +rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -12448,6 +12531,11 @@ space-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -12865,6 +12953,13 @@ supports-color@^7.2.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -13224,6 +13319,11 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trim-trailing-lines@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94" @@ -13300,6 +13400,11 @@ type-fest@^0.16.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -14226,6 +14331,15 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -14291,6 +14405,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -14341,6 +14460,11 @@ yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -14382,6 +14506,19 @@ yargs@^13.3.0, yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" From f9fb6fc4b69b17b2b05d6d0afde4fa2cffe05845 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 4 May 2021 16:47:44 +0200 Subject: [PATCH 083/319] :gear: Utilise engine.shallowCopy dans recalcul --- modele-social/règles/dirigeant.yaml | 1 + publicodes/core/source/mecanisms/recalcul.ts | 45 ++++++++------------ 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 1d463c755..fd9acc9c2 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -942,6 +942,7 @@ dirigeant . indépendant . cotisations et contributions . début activité: règle: cotisations et contributions avec: assiette des cotisations: assiette forfaitaire + situation personnelle . RSA: non références: Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/lajustement-et-la-regularisation.html diff --git a/publicodes/core/source/mecanisms/recalcul.ts b/publicodes/core/source/mecanisms/recalcul.ts index 3b7ce082e..f24f2aec8 100644 --- a/publicodes/core/source/mecanisms/recalcul.ts +++ b/publicodes/core/source/mecanisms/recalcul.ts @@ -31,35 +31,24 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { serializeUnit(originRule.unit) !== serializeUnit(replacement.unit) ) as Array<[ReferenceNode & EvaluatedNode, EvaluatedNode]> - const originalCache = this.cache - const originalSituation = this.parsedSituation - // Optimisation : no need for recalcul if situation is the same - const invalidateCache = Object.keys(amendedSituation).length > 0 - if (invalidateCache) { - this.resetCache() - this.cache._meta.inRecalcul = true - } - - this.parsedSituation = { - ...this.parsedSituation, - ...Object.fromEntries( - amendedSituation.map(([reference, replacement]) => [ - disambiguateRuleReference( - this.parsedRules, - reference.contextDottedName, - reference.name + const engine = amendedSituation.length + ? this.shallowCopy().setSituation({ + ...this.parsedSituation, + ...Object.fromEntries( + amendedSituation.map(([reference, replacement]) => [ + disambiguateRuleReference( + this.parsedRules, + reference.contextDottedName, + reference.name + ), + replacement, + ]) as any ), - replacement, - ]) as any - ), - } - - const evaluatedNode = this.evaluate(node.explanation.recalcul) - - this.parsedSituation = originalSituation - if (invalidateCache) { - this.cache = originalCache - } + }) + : this + engine.cache._meta.inRecalcul = true + const evaluatedNode = engine.evaluate(node.explanation.recalcul) + engine.cache._meta.inRecalcul = false return { ...node, From 71475830819d4d86f7cb535c05081ec7e7d9a50f Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 5 May 2021 13:55:59 +0200 Subject: [PATCH 084/319] =?UTF-8?q?:gear::art:=20Ajoute=20la=20possibilit?= =?UTF-8?q?=C3=A9=20d'explorer=20les=20calculs=20dans=20un=20recalcul?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 1 + .vscode/settings.json | 5 +- modele-social/règles/dirigeant.yaml | 1 + mon-entreprise/source/components/ui/Card.css | 3 +- mon-entreprise/source/components/ui/index.css | 1 + publicodes/core/source/mecanisms/recalcul.ts | 6 +- publicodes/ui-react/source/RuleLink.tsx | 28 ++++-- publicodes/ui-react/source/contexts.tsx | 8 +- publicodes/ui-react/source/index.tsx | 86 ++++++++++++++----- .../ui-react/source/mecanisms/Recalcul.tsx | 28 +++++- publicodes/ui-react/source/rule/Header.tsx | 6 +- publicodes/ui-react/source/rule/RulePage.tsx | 35 +++++++- 12 files changed, 170 insertions(+), 38 deletions(-) diff --git a/.editorconfig b/.editorconfig index c6c8a0f85..3a04b5e17 100644 --- a/.editorconfig +++ b/.editorconfig @@ -28,3 +28,4 @@ trim_trailing_whitespace = false trim_trailing_whitespace = false indent_style = space indent_size = 4 + diff --git a/.vscode/settings.json b/.vscode/settings.json index 57144ed6b..b8b3839ef 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,5 +8,8 @@ "cSpell.words": [ "mycompanyinfrance", "smarttag" - ] + ], + "search.exclude": { + "**/dist": true + } } diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index fd9acc9c2..70af4461e 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -942,6 +942,7 @@ dirigeant . indépendant . cotisations et contributions . début activité: règle: cotisations et contributions avec: assiette des cotisations: assiette forfaitaire + assiette des cotisations . sans plancher: assiette forfaitaire situation personnelle . RSA: non références: Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/lajustement-et-la-regularisation.html diff --git a/mon-entreprise/source/components/ui/Card.css b/mon-entreprise/source/components/ui/Card.css index ce8744da5..118fdfb24 100644 --- a/mon-entreprise/source/components/ui/Card.css +++ b/mon-entreprise/source/components/ui/Card.css @@ -68,7 +68,8 @@ } .ui__.card.plain small, .ui__.card.plain .notice { - color: rgba(255, 255, 255, 0.8); + opacity: 0.9; + color: white; } .ui__.card.plain .targetInput { diff --git a/mon-entreprise/source/components/ui/index.css b/mon-entreprise/source/components/ui/index.css index b44805e3a..80522ee74 100644 --- a/mon-entreprise/source/components/ui/index.css +++ b/mon-entreprise/source/components/ui/index.css @@ -96,6 +96,7 @@ span.ui__.enumeration:not(:last-of-type)::after { font-size: 85%; line-height: initial; padding: 0.4rem 0.6rem; + white-space: nowrap; font-weight: bold; color: white !important; background: var(--darkColor); diff --git a/publicodes/core/source/mecanisms/recalcul.ts b/publicodes/core/source/mecanisms/recalcul.ts index f24f2aec8..084f35f82 100644 --- a/publicodes/core/source/mecanisms/recalcul.ts +++ b/publicodes/core/source/mecanisms/recalcul.ts @@ -1,4 +1,4 @@ -import { EvaluationFunction } from '..' +import Engine, { EvaluationFunction } from '..' import { ASTNode, EvaluatedNode } from '../AST/types' import { defaultNode } from '../evaluation' import { registerEvaluationFunction } from '../evaluationFunctions' @@ -11,6 +11,7 @@ export type RecalculNode = { explanation: { recalcul: ASTNode amendedSituation: Array<[ReferenceNode, ASTNode]> + parsedSituation?: Engine['parsedSituation'] } nodeKind: 'recalcul' } @@ -46,6 +47,7 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { ), }) : this + engine.cache._meta.inRecalcul = true const evaluatedNode = engine.evaluate(node.explanation.recalcul) engine.cache._meta.inRecalcul = false @@ -55,7 +57,9 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { nodeValue: evaluatedNode.nodeValue, explanation: { recalcul: evaluatedNode, + engine, amendedSituation, + parsedSituation: engine.parsedSituation, }, missingVariables: evaluatedNode.missingVariables, ...('unit' in evaluatedNode && { unit: evaluatedNode.unit }), diff --git a/publicodes/ui-react/source/RuleLink.tsx b/publicodes/ui-react/source/RuleLink.tsx index 18638c9e9..3e68a3f6b 100644 --- a/publicodes/ui-react/source/RuleLink.tsx +++ b/publicodes/ui-react/source/RuleLink.tsx @@ -1,8 +1,12 @@ +import Engine, { utils } from 'publicodes' import React, { useContext } from 'react' import emoji from 'react-easy-emoji' -import { Link } from 'react-router-dom' -import Engine, { utils } from 'publicodes' -import { BasepathContext, EngineContext } from './contexts' +import { Link, useLocation } from 'react-router-dom' +import { + BasepathContext, + EngineContext, + SituationMetaContext, +} from './contexts' const { encodeRuleName } = utils @@ -14,6 +18,7 @@ type RuleLinkProps = Omit< engine: Engine documentationPath: string displayIcon?: boolean + situationName?: string children?: React.ReactNode } @@ -21,6 +26,7 @@ export function RuleLink({ dottedName, engine, documentationPath, + situationName, displayIcon = false, children, ...props @@ -46,7 +52,16 @@ export function RuleLink({ throw new Error(`Unknown rule: ${dottedName}`) } return ( - + {children || rule.title}{' '} {displayIcon && rule.rawNode.icônes && ( {emoji(rule.rawNode.icônes)} @@ -63,11 +78,14 @@ export function RuleLinkWithContext( throw new Error('an engine should be provided in context') } const documentationPath = useContext(BasepathContext) - + const { state } = useLocation<{ situationName?: string } | undefined>() + const situationName = + useContext(SituationMetaContext)?.name ?? state?.situationName return ( ) diff --git a/publicodes/ui-react/source/contexts.tsx b/publicodes/ui-react/source/contexts.tsx index e81906340..8adc7bf03 100644 --- a/publicodes/ui-react/source/contexts.tsx +++ b/publicodes/ui-react/source/contexts.tsx @@ -1,6 +1,12 @@ -import { createContext } from 'react' import Engine from 'publicodes' +import { createContext } from 'react' export const BasepathContext = createContext('/documentation') +export const SituationMetaContext = createContext<{ name: string } | undefined>( + undefined +) export const EngineContext = createContext | null>(null) +export const RegisterEngineContext = createContext<(engine: Engine) => void>( + () => {} +) export const ReferencesImagesContext = createContext>({}) diff --git a/publicodes/ui-react/source/index.tsx b/publicodes/ui-react/source/index.tsx index 112f71884..4a79e5a5a 100644 --- a/publicodes/ui-react/source/index.tsx +++ b/publicodes/ui-react/source/index.tsx @@ -1,14 +1,15 @@ import Engine, { utils } from 'publicodes' -import { Route } from 'react-router-dom' +import { useCallback, useRef } from 'react' +import { Route, useLocation } from 'react-router-dom' import { BasepathContext, EngineContext, ReferencesImagesContext, + RegisterEngineContext, } from './contexts' import References from './rule/References' import RulePage from './rule/RulePage' const { decodeRuleName, encodeRuleName } = utils - export { default as Explanation } from './Explanation' export { RuleLink } from './RuleLink' export { References } @@ -20,30 +21,73 @@ type DocumentationProps = { referenceImages?: Record } +function useCacheEngineBySituation( + defaultEngine: Engine, + currentSituation?: Engine['parsedSituation'] +) { + const registeredEngines = useRef( + new WeakMap().set( + defaultEngine.parsedSituation, + defaultEngine.shallowCopy() + ) + ) + const registerEngine = useCallback( + (engine: Engine) => + registeredEngines.current.set( + engine.parsedSituation, + engine.shallowCopy() + ), + [registeredEngines] + ) + if (currentSituation && !registeredEngines.current.has(currentSituation)) { + registeredEngines.current.set( + currentSituation, + defaultEngine.shallowCopy().setSituation(currentSituation) + ) + } + const engine = currentSituation + ? registeredEngines.current.get(currentSituation) + : defaultEngine + return [engine, registerEngine] +} + export function Documentation({ documentationPath, - engine, + engine: defaultEngine, referenceImages = {}, }: DocumentationProps) { + const { state } = useLocation< + | { + situation?: Engine['parsedSituation'] + situationName?: string + } + | undefined + >() + const [engine, cacheEngine] = useCacheEngineBySituation( + defaultEngine, + state?.situation + ) return ( - - - - { - return ( - - ) - }} - /> - - - + + + + + { + return ( + + ) + }} + /> + + + + ) } diff --git a/publicodes/ui-react/source/mecanisms/Recalcul.tsx b/publicodes/ui-react/source/mecanisms/Recalcul.tsx index c96381df6..0da51ba1f 100644 --- a/publicodes/ui-react/source/mecanisms/Recalcul.tsx +++ b/publicodes/ui-react/source/mecanisms/Recalcul.tsx @@ -1,16 +1,36 @@ +import { useContext } from 'react' +import { + EngineContext, + RegisterEngineContext, + SituationMetaContext, +} from '../contexts' import Explanation from '../Explanation' import { RuleLinkWithContext } from '../RuleLink' import { Mecanism } from './common' export default function Recalcul({ nodeValue, explanation, unit }) { + const engine = useContext(EngineContext) + if (!engine) { + throw new Error() + } + useContext(RegisterEngineContext)( + engine.shallowCopy().setSituation(explanation.parsedSituation) + ) return ( <> {explanation.recalcul && ( - <> - Recalcul de la valeur de {' '} - avec la situation suivante : - + + + Recalcul de la valeur de{' '} + avec la situation + suivante : + + )}
        {explanation.amendedSituation.map(([origin, replacement]) => ( diff --git a/publicodes/ui-react/source/rule/Header.tsx b/publicodes/ui-react/source/rule/Header.tsx index 55c352a95..5fceeeb1d 100644 --- a/publicodes/ui-react/source/rule/Header.tsx +++ b/publicodes/ui-react/source/rule/Header.tsx @@ -1,9 +1,9 @@ -import React, { useContext } from 'react' import { utils } from 'publicodes' -import { RuleLinkWithContext } from '../RuleLink' +import React, { useContext } from 'react' import styled from 'styled-components' -import Meta from './Meta' import { EngineContext } from '../contexts' +import { RuleLinkWithContext } from '../RuleLink' +import Meta from './Meta' export default function RuleHeader({ dottedName }) { const engine = useContext(EngineContext) diff --git a/publicodes/ui-react/source/rule/RulePage.tsx b/publicodes/ui-react/source/rule/RulePage.tsx index f11e561a8..4a887cc06 100644 --- a/publicodes/ui-react/source/rule/RulePage.tsx +++ b/publicodes/ui-react/source/rule/RulePage.tsx @@ -5,6 +5,9 @@ import Engine, { utils, } from 'publicodes' import { isEmpty } from 'ramda' +import { useContext } from 'react' +import { Link, useLocation } from 'react-router-dom' +import { EngineContext } from '../contexts' import Explanation from '../Explanation' import { Markdown } from '../Markdown' import { RuleLinkWithContext } from '../RuleLink' @@ -12,7 +15,13 @@ import RuleHeader from './Header' import References from './References' import RuleSource from './RuleSource' -export default function Rule({ dottedName, engine, language }) { +export default function Rule({ dottedName, language, situationName }) { + const engine = useContext(EngineContext) + const { pathname } = useLocation() + + if (!engine) { + throw new Error('Engine expected') + } if (!(dottedName in engine.getParsedRules())) { return

        Cette règle est introuvable dans la base

        } @@ -21,7 +30,30 @@ export default function Rule({ dottedName, engine, language }) { const { parent, valeur } = rule.explanation return (
        + {situationName && ( +
        +
        + Vous explorez la documentation avec le contexte{' '} + {situationName}{' '} +
        +
        +
        + Retourner à la version de base +
        +
        + )} +
        @@ -56,6 +88,7 @@ export default function Rule({ dottedName, engine, language }) { )}

        Comment cette donnée est-elle calculée ?

        + From 163c15a8a2845dc25606e46d6e7d291f67f4ebed Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 5 May 2021 15:15:14 +0200 Subject: [PATCH 085/319] =?UTF-8?q?:white=5Fcheck=5Fmark:=20Ajoute=20des?= =?UTF-8?q?=20tests=20sur=20les=20cotisations=20forfaitaire=20de=20d=C3=A9?= =?UTF-8?q?but=20d'activit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__snapshots__/simulations.jest.js.snap | 60 +++++++++---------- .../test/regressions/simulations.jest.js | 1 + 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 59658ed08..ded9d0e5f 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -205,78 +205,78 @@ exports[`calculate simulations-impot-société: prorata temporis 3`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13180,16820,17883,232,16588,0,30000]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13180,16820,17883,232,16588,0,30000,7072]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14380,15620,17883,232,15388,0,30000]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14380,15620,17883,232,15388,0,30000,8272]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,593,19028,0,30000]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,593,19028,0,30000,4272]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6730,13270,13810,0,13270,0,20000]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6730,13270,13810,0,13270,0,20000,3772]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` -"[300000,79622,220378,228521,75412,144966,0,300000] +"[300000,79622,220378,228521,75412,144966,0,300000,9772] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`; +exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3272]"`; -exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000,20787,603,19397,0,29084]"`; +exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000,20787,603,19397,0,29084,3272]"`; -exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,603,19397,0,29100]"`; +exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,603,19397,0,29100,3288]"`; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1372,1272,100,134,0,100,0,1372]"`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1372,1272,100,134,0,100,0,1372,3272]"`; -exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246]"`; +exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246,3272]"`; exports[`calculate simulations-indépendant: imposition à l'IS 1`] = ` -"[100000,30104,69896,72608,12997,56899,0,100000] +"[100000,30104,69896,72608,12997,56899,0,100000,3272] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: imposition à l'IS 2`] = ` -"[100000,30104,69896,72608,15122,54774,0,100000] +"[100000,30104,69896,72608,15122,54774,0,100000,3272] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" `; -exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084,3272]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3272]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084,3272]"`; -exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1385,615,667,0,615,0,2000]"`; +exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1385,615,667,0,615,0,2000,3272]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,3500,30497,0,50000]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,3500,30497,0,50000,3272]"`; -exports[`calculate simulations-indépendant: inversions 3`] = `"[14596,4596,10000,10394,0,10000,0,14596]"`; +exports[`calculate simulations-indépendant: inversions 3`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; -exports[`calculate simulations-indépendant: inversions 4`] = `"[69938,22076,47862,49758,7862,40000,0,69938]"`; +exports[`calculate simulations-indépendant: inversions 4`] = `"[69938,22076,47862,49758,7862,40000,0,69938,3272]"`; -exports[`calculate simulations-indépendant: inversions 5`] = `"[14596,4596,10000,10394,0,10000,1000,15596]"`; +exports[`calculate simulations-indépendant: inversions 5`] = `"[14596,4596,10000,10394,0,10000,1000,15596,3272]"`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5927,13073,13585,0,13073,1000,20000]"`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5927,13073,13585,0,13073,1000,20000,3272]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5624,12376,12861,0,12376,2000,20000]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5624,12376,12861,0,12376,2000,20000,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1859,1359,500,548,0,500,0,1859]"`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1859,1359,500,548,0,500,0,1859,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466]"`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075]"`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3682,1682,2000,2097,0,2000,0,3682]"`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3682,1682,2000,2097,0,2000,0,3682,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7427,2427,5000,5199,0,5000,0,7427]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7427,2427,5000,5199,0,5000,0,7427,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14596,4596,10000,10394,0,10000,0,14596]"`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` -"[139593,39593,100000,103788,24909,75091,0,139593] +"[139593,39593,100000,103788,24909,75091,0,139593,3272] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` -"[1239954,239954,1000000,1033666,444476,555524,0,1239954] +"[1239954,239954,1000000,1033666,444476,555524,0,1239954,3272] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; diff --git a/mon-entreprise/test/regressions/simulations.jest.js b/mon-entreprise/test/regressions/simulations.jest.js index 6c8c80dc4..1331eba98 100644 --- a/mon-entreprise/test/regressions/simulations.jest.js +++ b/mon-entreprise/test/regressions/simulations.jest.js @@ -78,6 +78,7 @@ it('calculate simulations-indépendant', () => { 'dirigeant . rémunération . nette après impôt', 'entreprise . charges', "entreprise . chiffre d'affaires", + 'dirigeant . indépendant . cotisations et contributions . début activité', ] runSimulations(independentSituations, targets, independantConfig.situation) }) From 1cfba7c7a390bb0c3921837ba8e5bf4f5074f9c6 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 5 May 2021 15:51:14 +0200 Subject: [PATCH 086/319] =?UTF-8?q?:racehorse::bug:=20corrige=20les=20perf?= =?UTF-8?q?ormances=20lors=20du=20retour=20=C3=A0=20la=20simulation=20lors?= =?UTF-8?q?que=20la=20question=20affich=C3=A9e=20est=20un=20choix=20multip?= =?UTF-8?q?le?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/components/conversation/Question.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/mon-entreprise/source/components/conversation/Question.tsx b/mon-entreprise/source/components/conversation/Question.tsx index 95dbec7a2..4a017f4bf 100644 --- a/mon-entreprise/source/components/conversation/Question.tsx +++ b/mon-entreprise/source/components/conversation/Question.tsx @@ -1,4 +1,5 @@ import classnames from 'classnames' +import { useDebounce } from 'Components/utils' import { Markdown } from 'Components/utils/markdown' import { DottedName } from 'modele-social' import { EvaluatedNode, Rule, RuleNode, serializeEvaluation } from 'publicodes' @@ -69,12 +70,18 @@ export default function Question({ }, [onSubmit, onChange, setCurrentSelection] ) + + const debouncedSelection = useDebounce(currentSelection, 300) useEffect(() => { - if (currentSelection != null) { - const timeoutId = setTimeout(() => onChange(currentSelection), 300) - return () => clearTimeout(timeoutId) + if ( + debouncedSelection !== null && + serializeEvaluation({ nodeValue: currentValue } as EvaluatedNode) !== + debouncedSelection + ) { + onChange(debouncedSelection) } - }, [currentSelection]) + }, [debouncedSelection]) + const hiddenOptions = useContext(HiddenOptionContext) const renderBinaryQuestion = (choices: typeof binaryQuestion) => { From fffb503c284ea7eaec0c018ec7c9cb10a5dbf444 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 26 Apr 2021 14:21:58 +0200 Subject: [PATCH 087/319] =?UTF-8?q?=F0=9F=94=A8=20Utilise=20le=20taux=20ne?= =?UTF-8?q?utre=20pour=20les=20salari=C3=A9s=20seulement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une autre possibilité d'implémentation serait de rendre la méthode "taux neutre" non applicable pour les indépendants (c'est une option réservée aux salariés), et d'utiliser comme valeur par défaut le taux neutre ou le barème en fonction de leur applicabilité. --- modele-social/règles/impôt.yaml | 4 +- .../pages/Simulateurs/configs/salarié.yaml | 1 + .../__snapshots__/simulations.jest.js.snap | 78 +++++++++---------- 3 files changed, 43 insertions(+), 40 deletions(-) diff --git a/modele-social/règles/impôt.yaml b/modele-social/règles/impôt.yaml index 27156a540..f9600d1b0 100644 --- a/modele-social/règles/impôt.yaml +++ b/modele-social/règles/impôt.yaml @@ -32,7 +32,9 @@ impôt . méthode de calcul: # applicable si: revenu imposable > 0 # bizarrement, cette condition ne semble pas marcher, on se résout donc à utiliser une version plus "hacky" et moins proche de la loi. Elle posera problème le jour où l'on aura a calculer l'impot avec plusieurs sources de revenu non applicable si: dirigeant . auto-entrepreneur . impôt . versement libératoire - par défaut: "'taux neutre'" + par défaut: + nom: par défaut + valeur: "'barème standard'" formule: une possibilité: choix obligatoire: oui diff --git a/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml b/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml index d11a498fd..d1ec21520 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml @@ -26,3 +26,4 @@ questions: unité par défaut: €/mois situation: dirigeant: non + impôt . méthode de calcul . par défaut: "'taux neutre'" diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index ded9d0e5f..985810c22 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9019,12299]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9020,12300]"`; exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,1965]"`; @@ -135,7 +135,7 @@ Notifications affichées : dirigeant . auto-entrepreneur . notification calcul A `; exports[`calculate simulations-auto-entrepreneur: aides 2`] = ` -"[55380,448,50000,0,50000] +"[55380,448,50000,176,49824] Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" `; @@ -153,17 +153,17 @@ exports[`calculate simulations-auto-entrepreneur: échelle de revenus 5`] = `"[1 exports[`calculate simulations-auto-entrepreneur: échelle de revenus 6`] = `"[22966,247,20000,0,20000]"`; -exports[`calculate simulations-auto-entrepreneur: échelle de revenus 7`] = `"[57415,618,50000,0,50000]"`; +exports[`calculate simulations-auto-entrepreneur: échelle de revenus 7`] = `"[57415,618,50000,270,49730]"`; -exports[`calculate simulations-auto-entrepreneur: échelle de revenus 8`] = `"[80381,865,70000,956,69044]"`; +exports[`calculate simulations-auto-entrepreneur: échelle de revenus 8`] = `"[80381,865,70000,1334,68666]"`; exports[`calculate simulations-auto-entrepreneur: échelle de revenus 9`] = ` -"[114830,1236,100000,3297,96703] +"[114830,1236,100000,3996,96004] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-auto-entrepreneur: échelle de revenus 10`] = ` -"[1148303,12359,1000000,126543,873457] +"[1148303,12359,1000000,131938,868062] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés" `; @@ -205,32 +205,32 @@ exports[`calculate simulations-impot-société: prorata temporis 3`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13180,16820,17883,232,16588,0,30000,7072]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13180,16820,17883,467,16353,0,30000,7072]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14380,15620,17883,232,15388,0,30000,8272]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14380,15620,17883,467,15153,0,30000,8272]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,593,19028,0,30000,4272]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,875,18746,0,30000,4272]"`; exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6730,13270,13810,0,13270,0,20000,3772]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` -"[300000,79622,220378,228521,75412,144966,0,300000,9772] +"[300000,79622,220378,228521,82429,137949,0,300000,9772] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3272]"`; +exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3272]"`; -exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000,20787,603,19397,0,29084,3272]"`; +exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000,20787,931,19069,0,29084,3272]"`; -exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,603,19397,0,29100,3288]"`; +exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,931,19069,0,29100,3288]"`; exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1372,1272,100,134,0,100,0,1372,3272]"`; exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246,3272]"`; exports[`calculate simulations-indépendant: imposition à l'IS 1`] = ` -"[100000,30104,69896,72608,12997,56899,0,100000,3272] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[100000,30104,69896,72608,15122,54774,0,100000,3272] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" `; exports[`calculate simulations-indépendant: imposition à l'IS 2`] = ` @@ -246,11 +246,11 @@ exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084 exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1385,615,667,0,615,0,2000,3272]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,3500,30497,0,50000,3272]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,4612,29385,0,50000,3272]"`; exports[`calculate simulations-indépendant: inversions 3`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; -exports[`calculate simulations-indépendant: inversions 4`] = `"[69938,22076,47862,49758,7862,40000,0,69938,3272]"`; +exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3272]"`; exports[`calculate simulations-indépendant: inversions 5`] = `"[14596,4596,10000,10394,0,10000,1000,15596,3272]"`; @@ -271,12 +271,12 @@ exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7427,2 exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` -"[139593,39593,100000,103788,24909,75091,0,139593,3272] +"[139593,39593,100000,103788,28472,71528,0,139593,3272] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` -"[1239954,239954,1000000,1033666,444476,555524,0,1239954,3272] +"[1239954,239954,1000000,1033666,473591,526409,0,1239954,3272] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -293,57 +293,57 @@ exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[7987,0,298 exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14244,0,4244,10000,0,10000]"`; exports[`calculate simulations-professions-libérales: CIPAV 7`] = ` -"[146241,0,46241,100000,24952,75048] +"[146241,0,46241,100000,28546,71454] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-professions-libérales: CIPAV 8`] = ` -"[1238004,0,238004,1000000,444454,555546] +"[1238004,0,238004,1000000,473565,526435] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: auxiliaire médical 1`] = `"[30000,0,7733,22267,946,21321]"`; +exports[`calculate simulations-professions-libérales: auxiliaire médical 1`] = `"[30000,0,7733,22267,1297,20970]"`; -exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = `"[30000,0,8058,21942,933,21009]"`; +exports[`calculate simulations-professions-libérales: auxiliaire médical 2`] = `"[30000,0,8058,21942,1245,20697]"`; -exports[`calculate simulations-professions-libérales: auxiliaire médical 3`] = `"[300000,0,61611,238389,81356,157033]"`; +exports[`calculate simulations-professions-libérales: auxiliaire médical 3`] = `"[300000,0,61611,238389,90534,147855]"`; exports[`calculate simulations-professions-libérales: avocat 1`] = ` -"[50000,0,11181,38819,4781,34038] +"[50000,0,11181,38819,6058,32761] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-professions-libérales: avocat 2`] = ` -"[50000,0,11821,38179,4705,33475] +"[50000,0,11821,38179,5866,32313] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,0,14951]"`; +exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,85,14866]"`; exports[`calculate simulations-professions-libérales: expert-comptable 2`] = ` -"[50000,0,14877,35123,3611,31512] +"[50000,0,14877,35123,4949,30174] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: médecin 1`] = `"[50000,0,10817,39183,4824,34359]"`; +exports[`calculate simulations-professions-libérales: médecin 1`] = `"[50000,0,10817,39183,6167,33016]"`; -exports[`calculate simulations-professions-libérales: médecin 2`] = `"[50000,0,17650,32350,3337,29013]"`; +exports[`calculate simulations-professions-libérales: médecin 2`] = `"[50000,0,17650,32350,4117,28233]"`; -exports[`calculate simulations-professions-libérales: médecin 3`] = `"[300000,0,73630,226370,77389,148981]"`; +exports[`calculate simulations-professions-libérales: médecin 3`] = `"[300000,0,73630,226370,85125,141245]"`; -exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93706,306294,120519,185775]"`; +exports[`calculate simulations-professions-libérales: médecin 4`] = `"[400000,0,93706,306294,124328,181966]"`; exports[`calculate simulations-professions-libérales: médecin 5`] = ` -"[120000,0,26977,93023,23107,69916] +"[120000,0,26977,93023,25393,67630] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: médecin 6`] = `"[50000,0,10663,39337,4842,34495]"`; +exports[`calculate simulations-professions-libérales: médecin 6`] = `"[50000,0,10663,39337,6213,33124]"`; -exports[`calculate simulations-professions-libérales: sage-femme 1`] = `"[50000,0,12354,37646,4641,33005]"`; +exports[`calculate simulations-professions-libérales: sage-femme 1`] = `"[50000,0,12354,37646,5706,31940]"`; exports[`calculate simulations-professions-libérales: sage-femme 2`] = ` -"[20000,0,5136,14864,0,14864] +"[20000,0,5136,14864,71,14793] Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; @@ -353,17 +353,17 @@ Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite co `; exports[`calculate simulations-professions-libérales: sage-femme 4`] = ` -"[20000,0,5136,14864,0,14864] +"[20000,0,5136,14864,71,14793] 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,5213,14787,0,14787] +"[20000,0,5213,14787,59,14728] 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,5289,14711,0,14711] +"[20000,0,5289,14711,47,14664] Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; From ee303f4f74b1c102fcd68ab0431b00b102fade31 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 26 Apr 2021 14:25:01 +0200 Subject: [PATCH 088/319] =?UTF-8?q?=F0=9F=96=8B=20Utilise=20le=20singulier?= =?UTF-8?q?=20pour=20l'IR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le pluriel avait été utilisé parce que la règle intègre la CEHR en plus de l'IR, mais c'est marginal et apporte plus de confusion qu'autre chose. --- modele-social/règles/impôt.yaml | 2 +- mon-entreprise/source/locales/rules-en.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modele-social/règles/impôt.yaml b/modele-social/règles/impôt.yaml index f9600d1b0..643040ee9 100644 --- a/modele-social/règles/impôt.yaml +++ b/modele-social/règles/impôt.yaml @@ -1,7 +1,7 @@ impôt: icônes: 🏛️ description: Cet ensemble de formules est un modèle simplifié de l'impôt sur le revenu. - titre: impôts sur le revenu + titre: impôt sur le revenu somme: - produit: assiette: revenu imposable diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index d8f9c4a5f..ad8ecf083 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -7386,7 +7386,7 @@ impôt: description.en: '[automatic] This set of formulas is a simplified income tax model.' description.fr: Cet ensemble de formules est un modèle simplifié de l'impôt sur le revenu. titre.en: income tax - titre.fr: impôts sur le revenu + titre.fr: impôt sur le revenu impôt . domiciliation étranger non implémentée: description.en: > [automatic] Non-resident withholding tax is not yet implemented. For more From d5f10c323e69c7bc34ae01d3226b1a9440227e75 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 5 May 2021 18:40:54 +0200 Subject: [PATCH 089/319] =?UTF-8?q?:bug:=20r=C3=A9affiche=20le=20bouton=20?= =?UTF-8?q?suivant=20m=C3=AAme=20si=20la=20valeur=20par=20d=C3=A9faut=20es?= =?UTF-8?q?t=20selectionn=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/components/conversation/Question.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mon-entreprise/source/components/conversation/Question.tsx b/mon-entreprise/source/components/conversation/Question.tsx index 4a017f4bf..16cda9f1f 100644 --- a/mon-entreprise/source/components/conversation/Question.tsx +++ b/mon-entreprise/source/components/conversation/Question.tsx @@ -75,8 +75,9 @@ export default function Question({ useEffect(() => { if ( debouncedSelection !== null && - serializeEvaluation({ nodeValue: currentValue } as EvaluatedNode) !== - debouncedSelection + (missing || + serializeEvaluation({ nodeValue: currentValue } as EvaluatedNode) !== + debouncedSelection) ) { onChange(debouncedSelection) } From 57c15304753470343965172fd29f66420c91ee99 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 5 May 2021 19:13:17 +0200 Subject: [PATCH 090/319] =?UTF-8?q?=E2=99=BF=20Unifie=20la=20hierarchie=20?= =?UTF-8?q?des=20titres=20(h1=20->=20h2=20->=20h3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fait en sorte qu'il n'y ait pas de titre à un niveau non prévu Ajoute la possibilité d'utiliser un style de titre différent que celui correspondant au tag HTML. --- .../source/components/Simulation.tsx | 4 +- mon-entreprise/source/components/ui/Card.css | 2 +- .../source/components/ui/Typography.css | 18 ++- .../source/pages/Créer/CreationChecklist.tsx | 31 +++-- mon-entreprise/source/pages/Créer/Home.tsx | 8 +- mon-entreprise/source/pages/Gérer/Home.tsx | 16 ++- .../source/pages/Simulateurs/Page.tsx | 116 +++++++++--------- .../source/pages/Simulateurs/metadata.tsx | 7 -- 8 files changed, 110 insertions(+), 92 deletions(-) diff --git a/mon-entreprise/source/components/Simulation.tsx b/mon-entreprise/source/components/Simulation.tsx index 322415580..01e03ef79 100644 --- a/mon-entreprise/source/components/Simulation.tsx +++ b/mon-entreprise/source/components/Simulation.tsx @@ -121,8 +121,8 @@ export function Questions({ font-family: 'roboto'; font-weight: normal; flex: 1; - font-size: 1.1rem; - margin-top: 0; + font-size: 1.1rem !important; + margin-top: 0 !important; `} > diff --git a/mon-entreprise/source/components/ui/Card.css b/mon-entreprise/source/components/ui/Card.css index 118fdfb24..112e517d9 100644 --- a/mon-entreprise/source/components/ui/Card.css +++ b/mon-entreprise/source/components/ui/Card.css @@ -106,7 +106,7 @@ color: inherit; font-size: inherit !important; } -.ui__.card.box.thiner { +.ui__.card.box.thinner { max-width: 15rem; } .ui__.card.box.ui__.interactive.light-border:hover { diff --git a/mon-entreprise/source/components/ui/Typography.css b/mon-entreprise/source/components/ui/Typography.css index bca055b70..f1c2cba1a 100644 --- a/mon-entreprise/source/components/ui/Typography.css +++ b/mon-entreprise/source/components/ui/Typography.css @@ -31,33 +31,39 @@ body { font-family: 'Roboto', sans-serif; } -h1 { +h1:not(.h), +.ui__.h.h1 { margin-top: 2rem; margin-bottom: 1rem; font-size: 1.9rem; line-height: 2.6rem; } -h2 { +h2:not(.h), +.ui__.h.h2 { margin-top: 2rem; margin-bottom: 1rem; font-size: 1.4rem; } -h3 { +h3:not(.h), +.ui__.h.h3 { margin-top: 1rem; margin-bottom: 0.6rem; font-size: 1.2rem; } -h4 { +h4:not(.h), +.ui__.h.h4 { margin-top: 0.6rem; margin-bottom: 0.4rem; font-size: 1rem; } -h5 { +h5:not(.h), +.ui__.h.h5 { margin-top: 0.4rem; margin-bottom: 0.2rem; font-size: 0.9rem; } -h6 { +h6:not(.h), +.ui__.h.h6 { margin-top: 0.4rem; margin-bottom: 0.2rem; font-size: 0.9rem; diff --git a/mon-entreprise/source/pages/Créer/CreationChecklist.tsx b/mon-entreprise/source/pages/Créer/CreationChecklist.tsx index afcceca5a..62016386f 100644 --- a/mon-entreprise/source/pages/Créer/CreationChecklist.tsx +++ b/mon-entreprise/source/pages/Créer/CreationChecklist.tsx @@ -454,20 +454,22 @@ export default function CreateCompany({ statut }: CreateCompanyProps) { } /> -

        +

        {emoji('🧰')} Ressources utiles

        {isAutoentrepreneur && ( -

        Simulateur de revenus auto-entrepreneur

        +

        + Simulateur de revenus auto-entrepreneur +

        Simuler le montant de vos cotisations sociales et de votre impôt et estimez votre futur revenu net. @@ -484,7 +486,9 @@ export default function CreateCompany({ statut }: CreateCompanyProps) { }} > -

        Simulateur de cotisations indépendant

        +

        + Simulateur de cotisations indépendant +

        Simuler le montant de vos cotisations sociales pour bien préparer votre business plan. @@ -501,7 +505,9 @@ export default function CreateCompany({ statut }: CreateCompanyProps) { }} > -

        Simulateur de rémunération pour dirigeant de SASU

        +

        + Simulateur de rémunération pour dirigeant de SASU +

        Simuler le montant de vos cotisations sociales pour bien préparer votre business plan. @@ -514,7 +520,7 @@ export default function CreateCompany({ statut }: CreateCompanyProps) { to={sitePaths.créer.après} > -

        Après la création

        +

        Après la création

        SIREN, SIRET, code APE, KBis. Un petit glossaire des termes que vous pourrez (éventuellement) rencontrer après la création. @@ -527,7 +533,7 @@ export default function CreateCompany({ statut }: CreateCompanyProps) { href="https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf" target="_blank" > -

        Guide pratique Urssaf

        +

        Guide pratique Urssaf

        Des conseils pour les auto-entrepreneurs : comment préparer son projet pour se lancer dans la création et une présentation @@ -544,7 +550,9 @@ export default function CreateCompany({ statut }: CreateCompanyProps) { className="ui__ interactive card small box lighter-bg" href="https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf" > -

        Guide Urssaf pour les travailleur indépendant

        +

        + Guide Urssaf pour les travailleur indépendant +

        Des conseils sur comment préparer son projet pour se lancer dans la création et une présentation détaillée de votre protection @@ -584,7 +592,6 @@ const StatutsExample = ({ statut }: StatutsExampleProps) => { } export function RessourceAutoEntrepreneur() { - const { i18n } = useTranslation() return ( <> @@ -593,7 +600,7 @@ export function RessourceAutoEntrepreneur() { href="https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html" target="_blank" > -

        Questions fréquentes

        +

        ❓ Questions fréquentes

        Une liste exhaustive et maintenue à jour de toutes les questions fréquentes (et moins fréquentes) que l'on est amené à poser en tant @@ -607,7 +614,9 @@ export function RessourceAutoEntrepreneur() { target="_blank" href="https://www.impots.gouv.fr/portail/professionnel/je-choisis-le-regime-du-micro-entrepreneur-auto-entrepreneur" > -

        Comment déclarer son revenu aux impôts ?

        +

        + 📑 Comment déclarer son revenu aux impôts ? +

        Les informations officielles de l'administration fiscale concernant les auto-entrepreneurs et le régime de la micro-entreprise. diff --git a/mon-entreprise/source/pages/Créer/Home.tsx b/mon-entreprise/source/pages/Créer/Home.tsx index 6e749754b..553b7a148 100644 --- a/mon-entreprise/source/pages/Créer/Home.tsx +++ b/mon-entreprise/source/pages/Créer/Home.tsx @@ -64,7 +64,7 @@ export default function Créer() { css="margin-left: 3rem; max-width: 15rem; transform: translateX(2rem) scale(1.4);" />

        -

        +

        Ressources utiles

        @@ -73,7 +73,7 @@ export default function Créer() { to={sitePaths.créer.guideStatut.liste} > -

        Liste des statuts juridiques

        +

        Liste des statuts juridiques

        Vous savez déjà quel statut choisir ? Accédez directement à la liste des démarches associées @@ -88,7 +88,7 @@ export default function Créer() { }} > -

        Comparateur de régimes

        +

        Comparateur de régimes

        Indépendant, assimilé-salarié ou auto-entrepreneur ? Calculez les différences en terme de revenus, cotisations, retraite, etc @@ -101,7 +101,7 @@ export default function Créer() { to={sitePaths.créer['auto-entrepreneur']} > -

        Démarche auto-entrepreneur

        +

        Démarche auto-entrepreneur

        Vous souhaitez devenir auto-entrepreneur ? Découvrez les étapes pour bien démarrer votre activité diff --git a/mon-entreprise/source/pages/Gérer/Home.tsx b/mon-entreprise/source/pages/Gérer/Home.tsx index 42c2171b9..01325e6f2 100644 --- a/mon-entreprise/source/pages/Gérer/Home.tsx +++ b/mon-entreprise/source/pages/Gérer/Home.tsx @@ -202,7 +202,7 @@ export default function Gérer() {
    -

    +

    {emoji('🧰 ')} Ressources utiles

    @@ -215,7 +215,9 @@ export default function Gérer() { to={sitePaths.gérer.formulaireMobilité} > -

    Exporter son activité en Europe

    +

    + Exporter son activité en Europe +

    Le formulaire pour effectuer une demande de mobilité internationale (détachement ou pluriactivité) @@ -229,7 +231,9 @@ export default function Gérer() { to={sitePaths.gérer.embaucher} > -

    Découvrir les démarches d’embauche

    +

    + Découvrir les démarches d’embauche{' '} +

    La liste des choses à faire pour être sûr de ne rien oublier lors de l’embauche d’un nouveau salarié @@ -243,7 +247,9 @@ export default function Gérer() { href="https://autoentrepreneur.urssaf.fr" > -

    Accéder au site officiel auto-entrepreneur

    +

    + Accéder au site officiel auto-entrepreneur +

    Vous pourrez effectuer votre déclaration de chiffre d'affaires, payer vos cotisations, et plus largement trouver @@ -258,7 +264,7 @@ export default function Gérer() { to={sitePaths.gérer.sécuritéSociale} > -

    Comprendre la sécurité sociale

    +

    Comprendre la sécurité sociale

    A quoi servent les cotisations sociales ? Le point sur le système de protection sociale dont bénéficient tous les diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index a55f3e1ea..28b11d16d 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -1,3 +1,4 @@ +import { Condition } from 'Components/EngineValue' import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' import { ThemeColorsProvider } from 'Components/utils/colors' import { IsEmbeddedContext } from 'Components/utils/embeddedContext' @@ -8,10 +9,10 @@ import { SitePathsContext } from 'Components/utils/SitePathsContext' import useSearchParamsSimulationSharing from 'Components/utils/useSearchParamsSimulationSharing' import useSimulationConfig from 'Components/utils/useSimulationConfig' import { default as React, useContext } from 'react' -import emoji from 'react-easy-emoji' import { Trans, useTranslation } from 'react-i18next' import { Link, useLocation } from 'react-router-dom' import { TrackChapter } from '../../ATInternetTracking' +import { RessourceAutoEntrepreneur } from '../../pages/Créer/CreationChecklist' import useSimulatorsData, { SimulatorData } from './metadata' export default function PageData({ @@ -115,63 +116,66 @@ function NextSteps({ iframePath, nextSteps }: NextStepsProps) { } return (

    -

    Aller plus loin

    -
    -
    - {guideUrssaf && language === 'fr' && ( - -
    - {guideUrssaf.title} -
    +

    + Ressources utiles +

    +
    + + + + {guideUrssaf && language === 'fr' && ( + +

    + {guideUrssaf.title} +

    +

    + Des conseils pour se lancer dans la création et une présentation + détaillée de votre protection sociale. +

    + PDF +
    + )} + {nextSteps?.map((simulatorId) => ( + +

    + {' '} + {simulators[simulatorId].shortName} +

    +

    + {simulators[simulatorId].meta?.description} +

    + + ))} + {iframePath && ( + + +

    + Intégrer le module web +

    - Des conseils pour se lancer dans la création et une présentation - détaillée de votre protection sociale. + Ajouter ce simulateur sur votre site internet en un clic via un + script clé en main.

    - PDF - - )} - {nextSteps?.map((simulatorId) => ( - -
    - {' '} - {simulators[simulatorId].shortName} -
    -

    - {simulators[simulatorId].meta?.description} -

    - - ))} - {iframePath && ( - - -
    - Intégrer le module web -
    -

    - Ajouter ce simulateur sur votre site internet en un clic via - un script clé en main. -

    -
    - - )} -
    + + + )}
    ) diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index b50b816b1..d63f61550 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -8,7 +8,6 @@ import React, { useContext, useMemo } from 'react' import { Trans, useTranslation } from 'react-i18next' import { SimulationConfig } from 'Reducers/rootReducer' import { constructLocalizedSitePath } from '../../sitePaths' -import { RessourceAutoEntrepreneur } from '../Créer/CreationChecklist' import AideDéclarationIndépendant from '../Gérer/AideDéclarationIndépendant' import FormulaireMobilitéIndépendant from '../Gérer/DemandeMobilite' import AidesEmbauche from './AidesEmbauche' @@ -301,12 +300,6 @@ export function getSimulatorsData({ auto-entrepreneur

    -

    - Ressources utiles -

    -
    - -
    ), nextSteps: ['indépendant', 'comparaison-statuts'], From b5c1f0b1fa0fa0d45ae52da7f9e6c351ee0fcc3d Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 6 May 2021 12:26:53 +0200 Subject: [PATCH 091/319] =?UTF-8?q?:bug:=20R=C3=A9cup=C3=A8re=20le=20bon?= =?UTF-8?q?=20taux=20versement=20transport=20pour=20les=20communes=20avec?= =?UTF-8?q?=20arrondissement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conversation/select/SelectCommune.tsx | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/mon-entreprise/source/components/conversation/select/SelectCommune.tsx b/mon-entreprise/source/components/conversation/select/SelectCommune.tsx index 5ab08c091..8d9ee010d 100644 --- a/mon-entreprise/source/components/conversation/select/SelectCommune.tsx +++ b/mon-entreprise/source/components/conversation/select/SelectCommune.tsx @@ -27,14 +27,29 @@ type Commune = { } async function tauxVersementTransport( - codeCommune: Commune['code'] + commune: Commune ): Promise { - const response = await fetch('/data/versement-transport.json') - if (!response.ok) { - return null + let codeCommune = commune.code + // 1. Si c'est une commune à arrondissement, on récupère le bon code correspondant à l'arrondissement. + // Comme il n'y a pas d'API facile pour faire ça, on le fait à la mano + + // 1. a : PARIS + if (codeCommune === '75056') { + codeCommune = '751' + commune.codePostal.slice(-2) } + // 1. b : LYON + if (codeCommune === '69123') { + codeCommune = '6938' + commune.codePostal.slice(-1) + } + // 1. c : MARSEILLE + if (codeCommune === '13055') { + codeCommune = '132' + commune.codePostal.slice(-2) + } + // 2. On récupère le versement transport associé + const response = await fetch('/data/versement-transport.json') const json = await response.json() - return json[codeCommune] ?? null + + return json[codeCommune] ?? 0 } function formatCommune(value: Commune) { return value && `${value.nom} (${value.codePostal})` @@ -90,7 +105,7 @@ export default function Select({ onChange, value, id, missing }: InputProps) { setName(formatCommune(commune)) let taux: number | null = null try { - taux = await tauxVersementTransport(commune.code) + taux = await tauxVersementTransport(commune) } catch (error) { console.warn( 'Erreur dans la récupération du taux de versement transport à partir du code commune', From 6cabf2162528a90845a1dfd74746b236acb4ffed Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 6 May 2021 12:27:33 +0200 Subject: [PATCH 092/319] =?UTF-8?q?:bug:=20Enl=C3=A8ve=20la=20logique=20de?= =?UTF-8?q?=20safe=20valeur=20par=20d=C3=A9faut=20pour=20le=20m=C3=A9canis?= =?UTF-8?q?me=20synchronisation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit C'est logiquement à la couche "data" de se charger de spécifier les valeurs par défaut si besoin. Publicodes doit juste chercher la clé, et retourner null si elle n'existe pas dans l'objet. --- publicodes/core/source/mecanisms/synchronisation.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/publicodes/core/source/mecanisms/synchronisation.ts b/publicodes/core/source/mecanisms/synchronisation.ts index 8e3458ccc..67d7b8d54 100644 --- a/publicodes/core/source/mecanisms/synchronisation.ts +++ b/publicodes/core/source/mecanisms/synchronisation.ts @@ -16,20 +16,14 @@ const evaluate: EvaluationFunction<'synchronisation'> = function (node: any) { const valuePath = node.explanation.chemin.split(' . ') const path = (obj) => valuePath.reduce((res, prop) => res[prop], obj) const nodeValue = data.nodeValue == null ? null : path(data.nodeValue) - // If the API gave a non null value, then some of its props may be null (the - // API can be composed of multiple API, some failing). Then this prop will be - // set to the default value defined in the API's rule - const safeNodeValue = - nodeValue == null && data.nodeValue != null - ? path(data.explanation.defaultValue) - : nodeValue + const missingVariables = { ...data.missingVariables, ...(data.nodeValue === null ? { [data.dottedName]: 1 } : {}), } const explanation = { ...node.explanation, data } - return { ...node, nodeValue: safeNodeValue, explanation, missingVariables } + return { ...node, nodeValue, explanation, missingVariables } } export const mecanismSynchronisation = (v, context) => { From eecb9bcad3893f8097d7d704dc8b37a2bd33b1b7 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 12 Apr 2021 13:29:53 +0200 Subject: [PATCH 093/319] =?UTF-8?q?=F0=9F=94=A8=20Int=C3=A9gration=20basiq?= =?UTF-8?q?ue=20retraite=20compl=C3=A9mentaire=20AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/artiste-auteur.yaml | 21 +++++ .../pages/Simulateurs/ArtisteAuteur.tsx | 72 +++++++++++++----- .../carcdsf.jpg | Bin .../carmf.png | Bin .../carpimko.png | Bin .../cavec.jpg | Bin .../cipav.png | Bin .../cnbf.png | Bin .../index.tsx | 0 .../images/logos-caisses-retraite/ircec.jpg | Bin 0 -> 6586 bytes 10 files changed, 75 insertions(+), 18 deletions(-) rename mon-entreprise/source/static/images/{logos-cnavpl => logos-caisses-retraite}/carcdsf.jpg (100%) rename mon-entreprise/source/static/images/{logos-cnavpl => logos-caisses-retraite}/carmf.png (100%) rename mon-entreprise/source/static/images/{logos-cnavpl => logos-caisses-retraite}/carpimko.png (100%) rename mon-entreprise/source/static/images/{logos-cnavpl => logos-caisses-retraite}/cavec.jpg (100%) rename mon-entreprise/source/static/images/{logos-cnavpl => logos-caisses-retraite}/cipav.png (100%) rename mon-entreprise/source/static/images/{logos-cnavpl => logos-caisses-retraite}/cnbf.png (100%) rename mon-entreprise/source/static/images/{logos-cnavpl => logos-caisses-retraite}/index.tsx (100%) create mode 100644 mon-entreprise/source/static/images/logos-caisses-retraite/ircec.jpg diff --git a/modele-social/règles/artiste-auteur.yaml b/modele-social/règles/artiste-auteur.yaml index 5568e7acd..6be336b3e 100644 --- a/modele-social/règles/artiste-auteur.yaml +++ b/modele-social/règles/artiste-auteur.yaml @@ -53,6 +53,7 @@ artiste-auteur . cotisations: - vieillesse - CSG-CRDS - formation professionnelle + arrondi: oui références: Urssaf.fr: https://www.urssaf.fr/portail/home/espaces-dedies/artistes-auteurs-diffuseurs-comm/vous-etes-artiste-auteur/taux-des-cotisations.html @@ -81,6 +82,7 @@ artiste-auteur . cotisations . option surcotisation: artiste-auteur . cotisations . assiette surcotisation: 900 heures/an * SMIC horaire artiste-auteur . cotisations . vieillesse: + titre: Retraite de base formule: produit: assiette: assiette @@ -129,3 +131,22 @@ artiste-auteur . cotisations . formation professionnelle: produit: assiette: assiette taux: 0.35% + +artiste-auteur . cotisations . IRCEC: + titre: Retraite complémentaire + description: | + Si vous êtes artiste-auteur professionnel et que vous êtes rémunéré en + droits d’auteur, l’IRCEC est l’organisme de Sécurité sociale qui assure la + gestion de votre retraite complémentaire obligatoire. + formule: + somme: + - cotisation RAAP + +artiste-auteur . cotisations . IRCEC . cotisation RAAP: + applicable si: assiette > 9135 €/an + formule: + produit: + assiette: assiette + plafond: 3 * contrat salarié . plafond sécurité sociale + taux: 8% + arrondi: oui diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx index 57b9040e5..8d093691c 100644 --- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx @@ -10,6 +10,8 @@ import { DottedName } from 'modele-social' import { useContext, useState } from 'react' import { Trans } from 'react-i18next' import { useSelector } from 'react-redux' +import urssafSrc from 'Images/Urssaf.svg' +import ircecSrc from 'Images/logos-caisses-retraite/ircec.jpg' import { situationSelector } from 'Selectors/simulationSelectors' import styled from 'styled-components' import config from './configs/artiste-auteur.yaml' @@ -82,24 +84,7 @@ function CotisationsResult() { return ( -
    - - - Montant des cotisations - - - -
    -
    + @@ -107,11 +92,62 @@ function CotisationsResult() { ) } +function CotisationsParOrganisme() { + return ( +
    +

    Vos institutions partenaires

    +
    +
    + + + +

    + Les cotisations recouvrées par l'Urssaf, qui servent au financement + de la sécurité sociale (assurance maladie, allocations familiales, + dépendance) +

    +

    + +

    +
    +
    + + + +

    + Si vous êtes artiste-auteur professionnel et que vous êtes rémunéré + en droits d’auteur, l’IRCEC est l’organisme de Sécurité sociale qui + assure la gestion de votre retraite complémentaire obligatoire. +

    +

    + +

    +
    +
    +
    + ) +} + +const LogoImg = styled.img` + padding: 1rem; + height: 5rem; +` + const branches = [ { dottedName: 'artiste-auteur . cotisations . vieillesse', icon: '👵', }, + { + dottedName: 'artiste-auteur . cotisations . IRCEC', + icon: '👵', + }, { dottedName: 'artiste-auteur . cotisations . CSG-CRDS', icon: '🏛', diff --git a/mon-entreprise/source/static/images/logos-cnavpl/carcdsf.jpg b/mon-entreprise/source/static/images/logos-caisses-retraite/carcdsf.jpg similarity index 100% rename from mon-entreprise/source/static/images/logos-cnavpl/carcdsf.jpg rename to mon-entreprise/source/static/images/logos-caisses-retraite/carcdsf.jpg diff --git a/mon-entreprise/source/static/images/logos-cnavpl/carmf.png b/mon-entreprise/source/static/images/logos-caisses-retraite/carmf.png similarity index 100% rename from mon-entreprise/source/static/images/logos-cnavpl/carmf.png rename to mon-entreprise/source/static/images/logos-caisses-retraite/carmf.png diff --git a/mon-entreprise/source/static/images/logos-cnavpl/carpimko.png b/mon-entreprise/source/static/images/logos-caisses-retraite/carpimko.png similarity index 100% rename from mon-entreprise/source/static/images/logos-cnavpl/carpimko.png rename to mon-entreprise/source/static/images/logos-caisses-retraite/carpimko.png diff --git a/mon-entreprise/source/static/images/logos-cnavpl/cavec.jpg b/mon-entreprise/source/static/images/logos-caisses-retraite/cavec.jpg similarity index 100% rename from mon-entreprise/source/static/images/logos-cnavpl/cavec.jpg rename to mon-entreprise/source/static/images/logos-caisses-retraite/cavec.jpg diff --git a/mon-entreprise/source/static/images/logos-cnavpl/cipav.png b/mon-entreprise/source/static/images/logos-caisses-retraite/cipav.png similarity index 100% rename from mon-entreprise/source/static/images/logos-cnavpl/cipav.png rename to mon-entreprise/source/static/images/logos-caisses-retraite/cipav.png diff --git a/mon-entreprise/source/static/images/logos-cnavpl/cnbf.png b/mon-entreprise/source/static/images/logos-caisses-retraite/cnbf.png similarity index 100% rename from mon-entreprise/source/static/images/logos-cnavpl/cnbf.png rename to mon-entreprise/source/static/images/logos-caisses-retraite/cnbf.png diff --git a/mon-entreprise/source/static/images/logos-cnavpl/index.tsx b/mon-entreprise/source/static/images/logos-caisses-retraite/index.tsx similarity index 100% rename from mon-entreprise/source/static/images/logos-cnavpl/index.tsx rename to mon-entreprise/source/static/images/logos-caisses-retraite/index.tsx diff --git a/mon-entreprise/source/static/images/logos-caisses-retraite/ircec.jpg b/mon-entreprise/source/static/images/logos-caisses-retraite/ircec.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e386ad8781357e2c96d061e64a0ef746749ee25 GIT binary patch literal 6586 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 D1CHCC literal 0 HcmV?d00001 From 2ee4ffdeff0de11430fb09cf12d987863856f783 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 12 Apr 2021 15:19:32 +0200 Subject: [PATCH 094/319] =?UTF-8?q?=F0=9F=94=A7=20Migre=20le=20simulateur?= =?UTF-8?q?=20artiste-auteur=20vers=20l'affichage=20"standard"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/artiste-auteur.yaml | 4 +-- mon-entreprise/source/locales/ui-en.yaml | 2 +- .../pages/Simulateurs/ArtisteAuteur.tsx | 28 +++++++------------ .../pages/Simulateurs/AutoEntrepreneur.tsx | 1 - .../source/pages/Simulateurs/Home.tsx | 2 +- .../Simulateurs/configs/artiste-auteur.yaml | 7 +++++ .../source/selectors/simulationSelectors.ts | 17 +++++------ 7 files changed, 28 insertions(+), 33 deletions(-) diff --git a/modele-social/règles/artiste-auteur.yaml b/modele-social/règles/artiste-auteur.yaml index 6be336b3e..0f9db13d3 100644 --- a/modele-social/règles/artiste-auteur.yaml +++ b/modele-social/règles/artiste-auteur.yaml @@ -73,8 +73,8 @@ artiste-auteur . cotisations . option surcotisation: règle: assiette dans: vieillesse par: assiette surcotisation - question: Souhaitez-vous surcotiser ? - résumé: Vos revenus sont en dessous des seuils vous permettant de valider 4 trimestres de retraite. Vous pouvez choisir de surcotiser pour augmenter vos droits. + question: Souhaitez-vous surcotiser pour augmenter vos droits à retraite ? + description: Vos revenus sont en dessous des seuils vous permettant de valider 4 trimestres de retraite. Vous pouvez choisir de surcotiser pour augmenter vos droits. par défaut: non références: Urssaf.fr: https://www.urssaf.fr/portail/home/espaces-dedies/artistes-auteurs-diffuseurs-comm/vous-etes-artiste-auteur/la-surcotisation.html diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index cdc1eb266..7ca0c2e7b 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -108,7 +108,7 @@ Nous n'avons rien trouvé: We didn't find any matching registered company. Oui: Yes Outils pour les développeurs: Tools for developers Pages associées: Related pages -Par profession: By job +Professions libérales: By job Par statut: By status Part du salaire net maintenue: Share of net salary maintained Part employeur: Employer share diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx index 8d093691c..559234fff 100644 --- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx @@ -1,3 +1,5 @@ +import Simulation from 'Components/Simulation' +import PeriodSwitch from 'Components/PeriodSwitch' import { DistributionBranch } from 'Components/Distribution' import Value, { Condition } from 'Components/EngineValue' import SimulateurWarning from 'Components/SimulateurWarning' @@ -22,25 +24,15 @@ export default function ArtisteAuteur() { return ( <> - - - - - - + }> + + + + + - - - - + + ) } diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index a7692f5b4..d6133b979 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -46,7 +46,6 @@ function useAdjustProportions(): () => void { unité: '%', }) ) - console.log(valueName, value, newProportion, nouveauCA) return { ...acc, [proportionName]: newProportion } }, diff --git a/mon-entreprise/source/pages/Simulateurs/Home.tsx b/mon-entreprise/source/pages/Simulateurs/Home.tsx index 7b46aba17..466064a73 100644 --- a/mon-entreprise/source/pages/Simulateurs/Home.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Home.tsx @@ -65,7 +65,7 @@ export default function Simulateurs() { <> - Professions + Professions libérales
    diff --git a/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml b/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml index dc05be6ce..6b3145bcb 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml @@ -2,4 +2,11 @@ situation: dirigeant: "'artiste-auteur'" unité par défaut: €/an objectifs: + - artiste-auteur . revenus . traitements et salaires + - artiste-auteur . revenus . BNC . recettes + - artiste-auteur . revenus . BNC . frais réels - artiste-auteur . cotisations +questions: + liste: + - artiste-auteur . revenus . BNC . micro-bnc + - artiste-auteur . cotisations . option surcotisation diff --git a/mon-entreprise/source/selectors/simulationSelectors.ts b/mon-entreprise/source/selectors/simulationSelectors.ts index 6bdeb4baa..1081c6b89 100644 --- a/mon-entreprise/source/selectors/simulationSelectors.ts +++ b/mon-entreprise/source/selectors/simulationSelectors.ts @@ -27,16 +27,13 @@ export const configSituationSelector = (state: RootState) => configSelector(state).situation ?? emptySituation export const firstStepCompletedSelector = createSelector( - [situationSelector, objectifsSelector], - (situation, objectifs) => { - if (!situation) { - return false - } - return objectifs.some((objectif) => { - return Object.entries(situation).some(([dottedName]) => - dottedName.startsWith(objectif) - ) - }) + [situationSelector, configSituationSelector], + (situation, baseSituation) => { + return ( + Object.keys(situation).filter( + (dottedName) => !Object.keys(baseSituation).includes(dottedName) + ).length > 0 + ) } ) From 144dab467f0954231d7e0deb1bd67852aefc6931 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 12 Apr 2021 15:38:47 +0200 Subject: [PATCH 095/319] =?UTF-8?q?=F0=9F=94=A8=20Int=C3=A9gre=20les=20r?= =?UTF-8?q?=C3=A9gimes=20RACD=20et=20RACL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/artiste-auteur.yaml | 103 +++++++++++++- .../simulationExplanation/PLExplanation.tsx | 39 +++--- mon-entreprise/source/locales/rules-en.yaml | 124 +++++++++++++++-- .../pages/Simulateurs/ArtisteAuteur.tsx | 126 ++++++------------ .../source/pages/Simulateurs/Page.tsx | 6 + .../Simulateurs/configs/artiste-auteur.yaml | 8 +- publicodes/core/source/mecanisms/barème.ts | 10 +- 7 files changed, 290 insertions(+), 126 deletions(-) diff --git a/modele-social/règles/artiste-auteur.yaml b/modele-social/règles/artiste-auteur.yaml index 0f9db13d3..d0aa23f8f 100644 --- a/modele-social/règles/artiste-auteur.yaml +++ b/modele-social/règles/artiste-auteur.yaml @@ -21,6 +21,7 @@ artiste-auteur . revenus . BNC: artiste-auteur . revenus . BNC . micro-bnc: non applicable si: contrôle micro-bnc + applicable si: recettes > 0 €/an par défaut: oui question: Souhaitez-vous opter pour le régime micro-BNC ? résumé: Avec abattement forfaitaire fiscal de 34 % au titre des frais professionnels @@ -141,12 +142,110 @@ artiste-auteur . cotisations . IRCEC: formule: somme: - cotisation RAAP + - cotisation RACD + - cotisation RACL + références: + Guide IRCEC 2021: http://www.ircec.fr/wp-content/uploads/2021/02/guide-ircec-2021.pdf artiste-auteur . cotisations . IRCEC . cotisation RAAP: - applicable si: assiette > 9135 €/an + applicable si: assiette > seuil d'affiliation + description: | + Vous pouvez bénéficier d'un taux réduit à votre demande si vos revenus + n'atteignent pas à seuil minimal pour une année donnée. Ce taux réduit + s'applique également à vos revenus déjà soumis à cotisation auprès du RACL + ou du RACD. + formule: + variations: + - si: taux réduit + alors: + produit: + assiette: assiette + taux: 4% + - sinon: + barème: + assiette: assiette + tranches: + - taux: 4% + plafond: + variations: + - si: profession . RACD + alors: cotisation RACD . plafond + - si: profession . RACL + alors: cotisation RACL . plafond + - taux: 8% + arrondi: oui + +artiste-auteur . cotisations . IRCEC . cotisation RAAP . seuil d'affiliation: 9135 €/an + +artiste-auteur . cotisations . IRCEC . cotisation RAAP . taux réduit: + applicable si: assiette < 3 * seuil d'affiliation + question: Souhaitez-vous bénéficier d'un taux réduit pour votre cotisation retraite ? Vos droits seront réduits d'autant. + par défaut: non + description: | + Le régime RAAP vous permet d'opter pour un taux réduit de 4% au lieu de 8% + si vous en faite la demande. + références: + Guide IRCEC 2021: http://www.ircec.fr/wp-content/uploads/2021/02/guide-ircec-2021.pdf#page=5 + +artiste-auteur . cotisations . IRCEC . profession: + question: Exercez-vous l'une de professions suivantes ? + description: | + Selon la nature de leur activité, les artistes-auteurs cotisent à + un ou plusieurs régimes de retraite complémentaire gérés par + l’IRCEC : dans tous les cas et si vous atteignez le seuil + d’affiliation, au RAAP, puis selon votre activité artistique au RACD + et/ou au RACL. + formule: + une possibilité: + choix obligatoire: non + possibilités: + - RACD + - RACL + par défaut: non + +artiste-auteur . cotisations . IRCEC . profession . RACD: + icônes: 🎞️ + titre: auteur ou compositeur dramatique, de spectacle vivant, de films + description: | + Les professions suivantes cotisent au RACD : + - Les auteurs dramatiques exerçant l’une des professions suivantes : scénariste, dialoguiste, adaptateur, réalisateur, auteur de la bible littéraire, auteur graphique d’animation, créateur des personnages originaux et des décors s’il s’agit d’un univers original, etc. + - Les auteurs et compositeurs dramatiques et du spectacle vivant : théâtre, danse, opéra, cirque, arts de la rue, etc. + formule: profession = 'RACD' + +artiste-auteur . cotisations . IRCEC . profession . RACL: + icônes: 🎙️ + titre: auteur ou compositeur lyrique, dialoguiste de doublage + description: Les auteurs et compositeurs d’œuvres musicales et les dialoguistes de doublage cotisent au RACL. + formule: profession = 'RACL' + +artiste-auteur . cotisations . IRCEC . régime RACL: + question: Cotisez-vous au RACL ? + par défaut: non + +artiste-auteur . cotisations . IRCEC . cotisation RACD: + applicable si: profession . RACD formule: produit: assiette: assiette - plafond: 3 * contrat salarié . plafond sécurité sociale + plafond: + nom: plafond + valeur: 496250 €/an taux: 8% arrondi: oui + +artiste-auteur . cotisations . IRCEC . cotisation RACL: + applicable si: profession . RACL + formule: + barème: + assiette: assiette + tranches: + - taux: 0% + plafond: 2739 €/an + - taux: 6.5% + plafond: + nom: plafond + valeur: 376665 €/an + - taux: + nom: cotisation de solidarité + valeur: 1.5% + arrondi: oui diff --git a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx index fc89a4fd6..d242fc5f8 100644 --- a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx @@ -3,7 +3,7 @@ import * as Animate from 'Components/ui/animate' import Emoji from 'Components/utils/Emoji' import { useEngine } from 'Components/utils/EngineContext' import assuranceMaladieSrc from 'Images/assurance-maladie.svg' -import * as logosSrc from 'Images/logos-cnavpl' +import * as logosSrc from 'Images/logos-caisses-retraite' import urssafSrc from 'Images/Urssaf.svg' import { DottedName } from 'modele-social' import { Trans } from 'react-i18next' @@ -19,23 +19,7 @@ export default function PLExplanation() {

    Vos institutions partenaires

    -
    - - - -

    - Les cotisations recouvrées par l'Urssaf, qui servent au - financement de la sécurité sociale (assurance maladie, - allocations familiales, dépendance) -

    -

    - -

    -
    +
    @@ -74,6 +58,25 @@ export default function PLExplanation() { ) } +export function CotisationsUrssaf({ rule }: { rule: DottedName }) { + const unit = useSelector(targetUnitSelector) + return ( +
    + + + +

    + Les cotisations recouvrées par l'Urssaf, qui servent au financement de + la sécurité sociale (assurance maladie, allocations familiales, + dépendance) +

    +

    + +

    +
    + ) +} + function CaisseRetraite() { const engine = useEngine() const unit = useSelector(targetUnitSelector) diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index ad8ecf083..8b729493a 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -709,6 +709,108 @@ artiste-auteur . cotisations . CSG-CRDS . abattement: artiste-auteur . cotisations . CSG-CRDS . assiette: titre.en: base titre.fr: assiette +artiste-auteur . cotisations . IRCEC: + description.en: > + [automatic] If you are a professional artist-author and you are paid in + royalties, the + + royalties, the IRCEC is the social security organization that manages your + + management of your compulsory supplementary pension. + description.fr: | + Si vous êtes artiste-auteur professionnel et que vous êtes rémunéré en + droits d’auteur, l’IRCEC est l’organisme de Sécurité sociale qui assure la + gestion de votre retraite complémentaire obligatoire. + titre.en: '[automatic] Supplementary pension' + titre.fr: Retraite complémentaire +artiste-auteur . cotisations . IRCEC . cotisation RAAP: + description.en: > + [automatic] You may be eligible for a reduced rate at your request if your + income + + do not reach a minimum threshold in a given year. This reduced rate + + also applies to your income that is already subject to contributions under the RACL + + or the RACD. + description.fr: | + Vous pouvez bénéficier d'un taux réduit à votre demande si vos revenus + n'atteignent pas à seuil minimal pour une année donnée. Ce taux réduit + s'applique également à vos revenus déjà soumis à cotisation auprès du RACL + ou du RACD. + titre.en: '[automatic] AMPS contribution' + titre.fr: cotisation RAAP +artiste-auteur . cotisations . IRCEC . cotisation RAAP . seuil d'affiliation: + titre.en: '[automatic] membership threshold' + titre.fr: seuil d'affiliation +artiste-auteur . cotisations . IRCEC . cotisation RAAP . taux réduit: + description.en: > + [automatic] The AMPS scheme allows you to opt for a reduced rate of 4% + instead of 8% if you + + if you so request. + description.fr: | + Le régime RAAP vous permet d'opter pour un taux réduit de 4% au lieu de 8% + si vous en faite la demande. + question.en: + '[automatic] Would you like to benefit from a reduced rate for your + pension contribution? Your entitlement will be reduced accordingly.' + question.fr: Souhaitez-vous bénéficier d'un taux réduit pour votre cotisation + retraite ? Vos droits seront réduits d'autant. + titre.en: '[automatic] reduced rate' + titre.fr: taux réduit +artiste-auteur . cotisations . IRCEC . cotisation RACD: + titre.en: '[automatic] RACD contribution' + titre.fr: cotisation RACD +artiste-auteur . cotisations . IRCEC . cotisation RACL: + titre.en: '[automatic] RACL contribution' + titre.fr: cotisation RACL +artiste-auteur . cotisations . IRCEC . profession: + description.en: > + [automatic] Depending on the nature of their activity, artists-authors + contribute to + + one or more complementary pension schemes managed by the IRCEC + + IRCEC: in all cases and if you reach the affiliation threshold + + affiliation threshold, to the RAAP, then depending on your artistic activity to the RACD + + and/or the RACL. + description.fr: | + Selon la nature de leur activité, les artistes-auteurs cotisent à + un ou plusieurs régimes de retraite complémentaire gérés par + l’IRCEC : dans tous les cas et si vous atteignez le seuil + d’affiliation, au RAAP, puis selon votre activité artistique au RACD + et/ou au RACL. + question.en: '[automatic] Do you work in any of the following occupations?' + question.fr: Exercez-vous l'une de professions suivantes ? + titre.en: '[automatic] profession' + titre.fr: profession +artiste-auteur . cotisations . IRCEC . profession . RACD: + description.en: > + [automatic] The following occupations contribute to the CDHA: + - Playwrights practising one of the following professions: screenwriter, dialogue writer, adapter, director, author of the literary bible, graphic author of animation, creator of original characters and sets if it is an original universe, etc. + - Authors and composers of drama and performing arts: theatre, dance, opera, circus, street arts, etc. + description.fr: > + Les professions suivantes cotisent au RACD : + - Les auteurs dramatiques exerçant l’une des professions suivantes : scénariste, dialoguiste, adaptateur, réalisateur, auteur de la bible littéraire, auteur graphique d’animation, créateur des personnages originaux et des décors s’il s’agit d’un univers original, etc. + - Les auteurs et compositeurs dramatiques et du spectacle vivant : théâtre, danse, opéra, cirque, arts de la rue, etc. + titre.en: '[automatic] author or composer of drama, live shows, films' + titre.fr: auteur ou compositeur dramatique, de spectacle vivant, de films +artiste-auteur . cotisations . IRCEC . profession . RACL: + description.en: + '[automatic] Authors and composers of musical works and dubbing + dialogue writers contribute to the RACL.' + description.fr: Les auteurs et compositeurs d’œuvres musicales et les + dialoguistes de doublage cotisent au RACL. + titre.en: '[automatic] lyrical author or composer, dubbing dialogue writer' + titre.fr: auteur ou compositeur lyrique, dialoguiste de doublage +artiste-auteur . cotisations . IRCEC . régime RACL: + question.en: '[automatic] Do you contribute to the RACL?' + question.fr: Cotisez-vous au RACL ? + titre.en: '[automatic] RACL plan' + titre.fr: régime RACL artiste-auteur . cotisations . assiette: description.en: "[automatic] Artists' earnings can be categorized either as wages and salaries or as non-commercial profits. Social security @@ -726,19 +828,21 @@ artiste-auteur . cotisations . formation professionnelle: titre.en: professional training titre.fr: formation professionnelle artiste-auteur . cotisations . option surcotisation: - question.en: Would you like to over-contribute? - question.fr: Souhaitez-vous surcotiser ? - résumé.en: '[automatic] Your income is below the thresholds allowing you to - validate 4 quarters of retirement. You can choose to overcontribute to - increase your entitlements.' - résumé.fr: Vos revenus sont en dessous des seuils vous permettant de valider 4 - trimestres de retraite. Vous pouvez choisir de surcotiser pour augmenter vos - droits. + description.en: + '[automatic] Your income is below the thresholds allowing you to + validate 4 quarters of retirement. You can choose to contribute more to + increase your rights.' + description.fr: Vos revenus sont en dessous des seuils vous permettant de + valider 4 trimestres de retraite. Vous pouvez choisir de surcotiser pour + augmenter vos droits. + question.en: '[automatic] Would you like to contribute more to increase your + pension rights?' + question.fr: Souhaitez-vous surcotiser pour augmenter vos droits à retraite ? titre.en: overcontribution option titre.fr: option surcotisation artiste-auteur . cotisations . vieillesse: - titre.en: Basic pension contribution - titre.fr: vieillesse + titre.en: '[automatic] Basic pension' + titre.fr: Retraite de base artiste-auteur . revenus: titre.en: revenues titre.fr: revenus diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx index 559234fff..7e89aea94 100644 --- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx @@ -1,20 +1,16 @@ -import Simulation from 'Components/Simulation' -import PeriodSwitch from 'Components/PeriodSwitch' import { DistributionBranch } from 'Components/Distribution' import Value, { Condition } from 'Components/EngineValue' +import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' +import Simulation from 'Components/Simulation' +import { CotisationsUrssaf } from 'Components/simulationExplanation/PLExplanation' import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import 'Components/TargetSelection.css' -import Animate from 'Components/ui/animate' -import { EngineContext } from 'Components/utils/EngineContext' +import { EngineContext, useEngine } from 'Components/utils/EngineContext' import useSimulationConfig from 'Components/utils/useSimulationConfig' -import { DottedName } from 'modele-social' -import { useContext, useState } from 'react' -import { Trans } from 'react-i18next' -import { useSelector } from 'react-redux' -import urssafSrc from 'Images/Urssaf.svg' import ircecSrc from 'Images/logos-caisses-retraite/ircec.jpg' -import { situationSelector } from 'Selectors/simulationSelectors' +import { useContext } from 'react' +import { Trans } from 'react-i18next' import styled from 'styled-components' import config from './configs/artiste-auteur.yaml' @@ -36,91 +32,43 @@ export default function ArtisteAuteur() { ) } - -type WarningProps = { - dottedName: DottedName -} - -function Warning({ dottedName }: WarningProps) { - const description = useContext(EngineContext).getRule(dottedName).rawNode - .description - return ( - -
  • {description}
  • -
    - ) -} - -const ResultLine = styled.div` - padding: 10px; - font-size: 1.25em; - display: flexbox; - flex-direction: column; -` - -const ResultLabel = styled.div` - flex-grow: 1; -` - function CotisationsResult() { - const [display, setDisplay] = useState(false) - const situation = useSelector(situationSelector) - - if (Object.keys(situation).length && !display) { - setDisplay(true) - } - - if (!display) { - return null - } - return ( - + <> - + ) } function CotisationsParOrganisme() { + const cotisIRCEC = useEngine().evaluate( + 'artiste-auteur . cotisations . IRCEC' + ) + const { description: descriptionIRCEC } = useEngine().getRule( + 'artiste-auteur . cotisations . IRCEC' + ).rawNode return (

    Vos institutions partenaires

    -
    - - - -

    - Les cotisations recouvrées par l'Urssaf, qui servent au financement - de la sécurité sociale (assurance maladie, allocations familiales, - dépendance) -

    -

    - -

    -
    -
    - - - -

    - Si vous êtes artiste-auteur professionnel et que vous êtes rémunéré - en droits d’auteur, l’IRCEC est l’organisme de Sécurité sociale qui - assure la gestion de votre retraite complémentaire obligatoire. -

    -

    - -

    -
    + + {cotisIRCEC.nodeValue ? ( +
    + + + +

    {descriptionIRCEC}

    +

    + +

    +
    + ) : null}
    ) @@ -163,13 +111,15 @@ function RepartitionCotisations() { À quoi servent mes cotisations ?
    - {cotisations.map((cotisation) => ( - - ))} + {cotisations + .filter(({ value }) => Boolean(value)) + .map((cotisation) => ( + + ))}
    ) diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index 28b11d16d..3297d9dce 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -200,6 +200,12 @@ const guidesUrssaf = [ associatedRule: 'dirigeant . auto-entrepreneur', title: 'Guide Urssaf pour les auto-entrepreneurs', }, + { + url: + 'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf', + associatedRule: "dirigeant = 'artiste-auteur'", + title: 'Guide Urssaf pour les artistes-auteurs', + }, { url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf', diff --git a/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml b/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml index 6b3145bcb..8bfc7b626 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/artiste-auteur.yaml @@ -2,11 +2,13 @@ situation: dirigeant: "'artiste-auteur'" unité par défaut: €/an objectifs: - - artiste-auteur . revenus . traitements et salaires - - artiste-auteur . revenus . BNC . recettes - - artiste-auteur . revenus . BNC . frais réels - artiste-auteur . cotisations +objectifs cachés: + - artiste-auteur . revenus + - artiste-auteur . cotisations . IRCEC questions: liste: - artiste-auteur . revenus . BNC . micro-bnc - artiste-auteur . cotisations . option surcotisation + - artiste-auteur . cotisations . IRCEC . cotisation RAAP . taux réduit + - artiste-auteur . cotisations . IRCEC . profession diff --git a/publicodes/core/source/mecanisms/barème.ts b/publicodes/core/source/mecanisms/barème.ts index ac35ee4ec..40ba14ff8 100644 --- a/publicodes/core/source/mecanisms/barème.ts +++ b/publicodes/core/source/mecanisms/barème.ts @@ -39,12 +39,13 @@ export default function parseBarème(v, context): BarèmeNode { } } -function evaluateBarème(tranches, assiette, evaluate, cache) { +function evaluateBarème(tranches, assiette, evaluate) { return tranches.map((tranche) => { if (tranche.isAfterActive) { return { ...tranche, nodeValue: 0 } } const taux = evaluate(tranche.taux) + const missingVariables = mergeAllMissing([taux, tranche]) if ( [ @@ -58,7 +59,7 @@ function evaluateBarème(tranches, assiette, evaluate, cache) { ...tranche, taux, nodeValue: null, - missingVariables: mergeAllMissing([taux, tranche]), + missingVariables, } } return { @@ -69,7 +70,7 @@ function evaluateBarème(tranches, assiette, evaluate, cache) { (Math.min(assiette.nodeValue, tranche.plafondValue) - tranche.plancherValue) * convertUnit(taux.unit, parseUnit(''), taux.nodeValue as number), - missingVariables: mergeAllMissing([taux, tranche]), + missingVariables, } }) } @@ -88,8 +89,7 @@ const evaluate: EvaluationFunction<'barème'> = function (node) { liftTemporalNode(multiplicateur as any) ) const temporalTranches = liftTemporal2( - (tranches, assiette) => - evaluateBarème(tranches, assiette, evaluate, this.cache), + (tranches, assiette) => evaluateBarème(tranches, assiette, evaluate), temporalTranchesPlafond, liftTemporalNode(assiette as any) ) From 2d0501c94af5d8c3fee40863255df2a9615b0d89 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 12 Apr 2021 17:36:23 +0200 Subject: [PATCH 096/319] =?UTF-8?q?Ajoute=20les=20droits=20=C3=A0=20la=20r?= =?UTF-8?q?etraite=20acquis=20sur=20le=20simulateur=20ind=C3=A9pendant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/protection-sociale.yaml | 27 ++--- .../source/components/SchemeComparaison.tsx | 106 ++++++++++-------- .../IndépendantCotisationsForfaitaire.tsx | 12 +- .../IndépendantExplanation.tsx | 42 ++++++- mon-entreprise/source/components/ui/Card.css | 4 + mon-entreprise/source/locales/rules-en.yaml | 6 +- mon-entreprise/source/locales/ui-en.yaml | 6 + .../__snapshots__/simulations.jest.js.snap | 10 +- 8 files changed, 130 insertions(+), 83 deletions(-) diff --git a/modele-social/règles/protection-sociale.yaml b/modele-social/règles/protection-sociale.yaml index 0e44689ef..8456cdb90 100644 --- a/modele-social/règles/protection-sociale.yaml +++ b/modele-social/règles/protection-sociale.yaml @@ -8,10 +8,7 @@ protection sociale . retraite: icônes: 👵 type: branche résumé: Garantit en moyenne 60 à 70 % du dernier revenu d'activité après 65 ans. - non applicable si: - toutes ces conditions: - - entreprise . activité = 'libérale' - - dirigeant . indépendant . PL . régime général = non + description: | Tous les travailleurs en France cotisent tout au long de leur vie professionnelle pour bénéficier d’un régime de retraite dès lors qu’ils ont l’âge de cesser leur activité. @@ -198,7 +195,11 @@ protection sociale . retraite . complémentaire salarié . points acquis: service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F15396 protection sociale . retraite . complémentaire sécurité des indépendants: - formule: points acquis * valeur du point + non applicable si: + toutes ces conditions: + - entreprise . activité = 'libérale' + - dirigeant . indépendant . PL . régime général = non + formule: total points acquis * valeur du point références: secu-independants.fr: https://www.secu-independants.fr/retraite/calcul-retraite/retraite-complementaire/ @@ -207,18 +208,12 @@ protection sociale . retraite . complémentaire sécurité des indépendants . v références: secu-independants.fr: https://www.secu-independants.fr/baremes/prestations-vieillesse-et-invalidite-deces -protection sociale . retraite . complémentaire sécurité des indépendants . points acquis: - formule: points acquis par mois * mois cotisés +protection sociale . retraite . complémentaire sécurité des indépendants . total points acquis: + formule: points acquis * mois cotisés -protection sociale . retraite . complémentaire sécurité des indépendants . points acquis par mois: - unité: points/mois - formule: - produit: - assiette: - somme: - - dirigeant . indépendant . cotisations et contributions . retraite complémentaire - # - dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . retraite complémentaire - facteur: 1 / prix d'achat du point +protection sociale . retraite . complémentaire sécurité des indépendants . points acquis: + unité: points/an + valeur: dirigeant . indépendant . cotisations et contributions . retraite complémentaire / prix d'achat du point protection sociale . retraite . complémentaire sécurité des indépendants . prix d'achat du point: formule: 17.515 €/point diff --git a/mon-entreprise/source/components/SchemeComparaison.tsx b/mon-entreprise/source/components/SchemeComparaison.tsx index c0987bb04..c8586f90e 100644 --- a/mon-entreprise/source/components/SchemeComparaison.tsx +++ b/mon-entreprise/source/components/SchemeComparaison.tsx @@ -34,9 +34,6 @@ export default function SchemeComparaison({ useSimulationConfig(dirigeantComparaison) const dispatch = useDispatchAndGoToNextQuestion() const engine = useEngine() - const plafondAutoEntrepreneurDépassé = - engine.evaluate("entreprise . chiffre d'affaires . seuil micro dépassé") - .nodeValue === true const [showMore, setShowMore] = useState(false) const [conversationStarted, setConversationStarted] = useState( @@ -74,6 +71,11 @@ export default function SchemeComparaison({ }), [situation] ) + const plafondAutoEntrepreneurDépassé = + autoEntrepreneurEngine.evaluate( + "entreprise . chiffre d'affaires . seuil micro dépassé" + ).nodeValue === true + return ( <>
    -

    - - Pension de retraite - (avant impôts) - -

    -
    - {' '} - - - Pension calculée pour 172 trimestres cotisés au régime général - sans variations de revenus. - - -
    -
    - {' '} - - - Pension calculée pour 172 trimestres cotisés au régime des - indépendants sans variations de revenus. - - -
    -
    - {plafondAutoEntrepreneurDépassé ? ( - '—' - ) : ( - <> + {indépendantEngine.evaluate( + 'entreprise . activité . libérale réglementée' + ).nodeValue !== true && ( + <> +

    + + Pension de retraite + (avant impôts) + +

    +
    {' '} - - Pension calculée pour 172 trimestres cotisés en - auto-entrepreneur sans variations de revenus. + + Pension calculée pour 172 trimestres cotisés au régime + général sans variations de revenus. - - )} -
    +
    +
    + {' '} + + + Pension calculée pour 172 trimestres cotisés au régime des + indépendants sans variations de revenus. + + +
    +
    + {plafondAutoEntrepreneurDépassé ? ( + '—' + ) : ( + <> + {' '} + + + Pension calculée pour 172 trimestres cotisés en + auto-entrepreneur sans variations de revenus. + + + + )} +
    + + )}

    Nombre de trimestres validés (pour la retraite) diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaire.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaire.tsx index 6c89e3833..93839af6a 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaire.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaire.tsx @@ -11,16 +11,12 @@ export default function CotisationsForfaitaires() { ) return ( -
    +

    {rule.title}

    - Montant des cotisations forfaitaires :{' '} + + Montant des cotisations forfaitaires :{' '} + diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 7dae07205..2cd5c5b94 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -1,6 +1,6 @@ import BarChartBranch from 'Components/BarChart' import 'Components/Distribution.css' -import { Condition } from 'Components/EngineValue' +import Value, { Condition } from 'Components/EngineValue' import RuleLink from 'Components/RuleLink' import StackedBarChart from 'Components/StackedBarChart' import { ThemeColorsContext } from 'Components/utils/colors' @@ -8,7 +8,7 @@ import { EngineContext } from 'Components/utils/EngineContext' import { DottedName } from 'modele-social' import { max } from 'ramda' import { useContext } from 'react' -import { useTranslation } from 'react-i18next' +import { Trans, useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { targetUnitSelector } from 'Selectors/simulationSelectors' import CotisationsForfaitaires from './IndépendantCotisationsForfaitaire' @@ -51,6 +51,44 @@ export default function IndépendantExplanation() { />

  • + +

    Retraite : droits acquis sur l'année 2021

    +
      +
    • + Retraite de base :{' '} + + + {' '} + trimestres acquis + + +
    • +
    • + Retraite complémentaire :{' '} + + + Ce simulateur ne gère pas les droits acquis de retraite + complémentaire pour les professions libérales + + + + + + {' '} + points acquis + + + +
    • +
    +
    + diff --git a/mon-entreprise/source/components/ui/Card.css b/mon-entreprise/source/components/ui/Card.css index 112e517d9..7af2af7ee 100644 --- a/mon-entreprise/source/components/ui/Card.css +++ b/mon-entreprise/source/components/ui/Card.css @@ -43,6 +43,10 @@ .ui__.card.disabled img { filter: saturate(0); } +.ui__.card.content { + padding: 1rem; + padding-top: 0.1rem; +} .ui__.card.disabled .ui__.card.plain, .ui__.card.disabled.plain { diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 8b729493a..3e4dc8756 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -8098,12 +8098,12 @@ protection sociale . retraite . complémentaire sécurité des indépendants: ? protection sociale . retraite . complémentaire sécurité des indépendants . points acquis : titre.en: acquired points titre.fr: points acquis -? protection sociale . retraite . complémentaire sécurité des indépendants . points acquis par mois -: titre.en: acquired points per month - titre.fr: points acquis par mois ? protection sociale . retraite . complémentaire sécurité des indépendants . prix d'achat du point : titre.en: buying cost of the point titre.fr: prix d'achat du point +? protection sociale . retraite . complémentaire sécurité des indépendants . total points acquis +: titre.en: '[automatic] total points earned' + titre.fr: total points acquis ? protection sociale . retraite . complémentaire sécurité des indépendants . valeur du point : titre.en: value of the point titre.fr: valeur du point diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 7ca0c2e7b..9e907e702 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1209,10 +1209,16 @@ pages: shortname: Chartered Accountant title: Income simulator for chartered accountant and auditor in private practice indépendant: + cotisations-forfaitaires: "Amount of lump sum contributions : " meta: description: Calculation of net income after tax and contributions based on turnover and vice versa title: "Independent: Urssaf income simulator" + retraite-droits-acquis: "<0>Retirement: rights acquired in 2021<1><0>Basic + pension : <2><0><0> vested quarters<1>Supplementary + pension : <2><0>This simulator does not manage the acquired rights of + supplementary pension for the liberal + professions<3><0><0><0> points acquired" shortname: Independent title: Income simulator for the self-employed is: diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 985810c22..bf1e19330 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -394,9 +394,9 @@ exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Co exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,10998,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,10998,0,10651,4,0]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,10998,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,10998,0,10651,4,0]"`; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = `"[917,10998,0,10651,4,20]"`; @@ -454,9 +454,9 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 6`] = `"[0,17852,17852,2973,3,8]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 1`] = `"[0,15580,15580,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 1`] = `"[0,15580,15580,6600,4,0]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 2`] = `"[0,15560,15560,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 2`] = `"[0,15560,15560,6600,4,0]"`; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 3`] = `"[0,17336,17336,2900,3,8]"`; @@ -510,7 +510,7 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,0,0,0]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,7547,4,0]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10076,4,21]"`; From f3a525e96be23e4f5fe92e2e20df52842016e8bf Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 21 Apr 2021 10:04:31 +0200 Subject: [PATCH 097/319] =?UTF-8?q?Ajoute=20des=20pr=C3=A9cautions=20autou?= =?UTF-8?q?r=20du=20calcul=20de=20la=20retraite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Maxime Quandalle --- mon-entreprise/source/components/SchemeComparaison.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mon-entreprise/source/components/SchemeComparaison.tsx b/mon-entreprise/source/components/SchemeComparaison.tsx index c8586f90e..34a7fb46b 100644 --- a/mon-entreprise/source/components/SchemeComparaison.tsx +++ b/mon-entreprise/source/components/SchemeComparaison.tsx @@ -440,7 +440,7 @@ export default function SchemeComparaison({ />{' '} - Pension calculée pour 172 trimestres cotisés au régime des + Pension calculée à titre indicatif pour 172 trimestres cotisés au régime des indépendants sans variations de revenus. From 987cd0abac73103dc4b2acd8149a03b7a193cf0a Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 26 Apr 2021 15:48:04 +0200 Subject: [PATCH 098/319] =?UTF-8?q?La=20retraite=20pour=20les=20profession?= =?UTF-8?q?s=20lib=C3=A9rales=20n'est=20pas=20impl=C3=A9ment=C3=A9e=20pour?= =?UTF-8?q?=20le=20moment=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/profession-libérale.yaml | 19 ---- modele-social/règles/protection-sociale.yaml | 25 +++-- .../source/components/SchemeComparaison.tsx | 101 +++++++++--------- .../IndépendantExplanation.tsx | 4 +- mon-entreprise/source/locales/rules-en.yaml | 94 ++++++---------- .../configs/rémunération-dirigeant.yaml | 1 + .../__snapshots__/simulations.jest.js.snap | 10 +- 7 files changed, 104 insertions(+), 150 deletions(-) diff --git a/modele-social/règles/profession-libérale.yaml b/modele-social/règles/profession-libérale.yaml index 6bf2c19fb..a5ff7ccb0 100644 --- a/modele-social/règles/profession-libérale.yaml +++ b/modele-social/règles/profession-libérale.yaml @@ -262,25 +262,6 @@ dirigeant . indépendant . PL . CIPAV . retraite complémentaire: - montant: 17479 plafond: 123301 €/an - montant: 18936 - abattement: réduction COVID . montant - -dirigeant . indépendant . PL . CIPAV . retraite complémentaire . réduction COVID: - applicable si: entreprise . date de création < 01/01/2020 - question: | - Avez-vous fait une demande pour bénéficier de la réduction de cotisations de - retraite complémentaire sans conditions de revenus ? - description: | - La Cipav met en place une réduction jusqu'à 1392€ de cotisation sur la - retraire complémentaire sans diminution du nombre de points acquis. Cette - aide n'est pas automatique, mais peut-être obtenue sur simple demande via la - messagerie de l'espace adhérent. - - [Faire votre demande](https://www.lacipav.fr/dispositif-exceptionnel-procedure) - par défaut: non - -dirigeant . indépendant . PL . CIPAV . retraite complémentaire . réduction COVID . montant: - titre: réduction COVID - formule: 1392 €/an dirigeant . indépendant . PL . CIPAV . invalidité et décès: remplace: cotisations et contributions . invalidité et décès diff --git a/modele-social/règles/protection-sociale.yaml b/modele-social/règles/protection-sociale.yaml index 8456cdb90..a7eab0a66 100644 --- a/modele-social/règles/protection-sociale.yaml +++ b/modele-social/règles/protection-sociale.yaml @@ -32,7 +32,7 @@ protection sociale . retraite: somme: - base - complémentaire salarié - - complémentaire sécurité des indépendants + - complémentaire indépendants note: | Il s'agit d'une estimation a but purement indicatif, afin de comparer la retraite des différents régimes. @@ -44,7 +44,16 @@ protection sociale . retraite: - On ne prend pas en compte les caisses de retraite des professions libérales réglementées (les 10 sections de la Cnavpl et la Cnbf) - On ne calcule pas le nombre de trimestres validés par année - Ces limites seront amenées à évoluer au fur et à mesure du développement du simulateur +protection sociale . retraite . plr: + applicable si: + toutes ces conditions: + - entreprise . activité . libérale réglementée + - dirigeant . indépendant . PL . option régime général = non + remplace: retraite + rend non applicable: complémentaire indépendants + titre: Retraite profession libérale réglementée + description: Nous n'avons pas implémenté les règles spécifiques aux professions libérales relementées. + valeur: "'Non implémenté'" protection sociale . retraite . base: titre: pension de retraite de base @@ -194,7 +203,7 @@ protection sociale . retraite . complémentaire salarié . points acquis: références: service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F15396 -protection sociale . retraite . complémentaire sécurité des indépendants: +protection sociale . retraite . complémentaire indépendants: non applicable si: toutes ces conditions: - entreprise . activité = 'libérale' @@ -203,19 +212,19 @@ protection sociale . retraite . complémentaire sécurité des indépendants: références: secu-independants.fr: https://www.secu-independants.fr/retraite/calcul-retraite/retraite-complementaire/ -protection sociale . retraite . complémentaire sécurité des indépendants . valeur du point: +protection sociale . retraite . complémentaire indépendants . valeur du point: formule: 1.191 €/point/an références: secu-independants.fr: https://www.secu-independants.fr/baremes/prestations-vieillesse-et-invalidite-deces -protection sociale . retraite . complémentaire sécurité des indépendants . total points acquis: +protection sociale . retraite . complémentaire indépendants . total points acquis: formule: points acquis * mois cotisés -protection sociale . retraite . complémentaire sécurité des indépendants . points acquis: +protection sociale . retraite . complémentaire indépendants . points acquis: unité: points/an valeur: dirigeant . indépendant . cotisations et contributions . retraite complémentaire / prix d'achat du point -protection sociale . retraite . complémentaire sécurité des indépendants . prix d'achat du point: +protection sociale . retraite . complémentaire indépendants . prix d'achat du point: formule: 17.515 €/point notes: il s'agit du prix d'achat 2018 (la valeur pour 2019 sur le site secu-independants.fr est marquée comme N.C) références: @@ -262,7 +271,7 @@ protection sociale . santé . indemnités journalières: brut et versées tous les 14 jours en moyenne. non applicable si: toutes ces conditions: - - entreprise . activité = 'libérale' + - entreprise . activité . libérale réglementée - dirigeant . indépendant . PL . régime général = non unité: €/jour note: | diff --git a/mon-entreprise/source/components/SchemeComparaison.tsx b/mon-entreprise/source/components/SchemeComparaison.tsx index 34a7fb46b..a5162d915 100644 --- a/mon-entreprise/source/components/SchemeComparaison.tsx +++ b/mon-entreprise/source/components/SchemeComparaison.tsx @@ -403,70 +403,65 @@ export default function SchemeComparaison({ precision={0} className={''} unit="€/an" - expression="dirigeant . rémunération . nette" + expression="dirigeant . rémunération . nette - entreprise . charges" /> - {indépendantEngine.evaluate( - 'entreprise . activité . libérale réglementée' - ).nodeValue !== true && ( - <> -

    - - Pension de retraite - (avant impôts) - -

    -
    + +

    + + Pension de retraite + (avant impôts) + +

    +
    + {' '} + + + Pension calculée pour 172 trimestres cotisés au régime général + sans variations de revenus. + + +
    +
    + {' '} + + + Pension calculée à titre indicatif pour 172 trimestres cotisés + au régime des indépendants sans variations de revenus. + + +
    +
    + {plafondAutoEntrepreneurDépassé ? ( + '—' + ) : ( + <> {' '} - - Pension calculée pour 172 trimestres cotisés au régime - général sans variations de revenus. + + Pension calculée pour 172 trimestres cotisés en + auto-entrepreneur sans variations de revenus. -
    -
    - {' '} - - - Pension calculée à titre indicatif pour 172 trimestres cotisés au régime des - indépendants sans variations de revenus. - - -
    -
    - {plafondAutoEntrepreneurDépassé ? ( - '—' - ) : ( - <> - {' '} - - - Pension calculée pour 172 trimestres cotisés en - auto-entrepreneur sans variations de revenus. - - - - )} -
    - - )} + + )} +

    Nombre de trimestres validés (pour la retraite) diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 2cd5c5b94..9761439a4 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -76,9 +76,9 @@ export default function IndépendantExplanation() { - + {' '} points acquis diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 3e4dc8756..9da236c2a 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -5181,41 +5181,6 @@ dirigeant . indépendant . PL . CIPAV . invalidité et décès: dirigeant . indépendant . PL . CIPAV . retraite complémentaire: titre.en: '[automatic] supplementary pension (CIPAV)' titre.fr: retraite complémentaire (CIPAV) -? dirigeant . indépendant . PL . CIPAV . retraite complémentaire . réduction COVID -: description.en: > - [automatic] The Cipav is offering a reduction of up to €1392 on its - membership fees for the - - additional retirement without reducing the number of points earned. This - - help is not automatic, but can be obtained upon request via the - - member's area messaging. - - - [Apply](https://www.lacipav.fr/dispositif-exceptionnel-procedure) - description.fr: > - La Cipav met en place une réduction jusqu'à 1392€ de cotisation sur la - - retraire complémentaire sans diminution du nombre de points acquis. Cette - - aide n'est pas automatique, mais peut-être obtenue sur simple demande via la - - messagerie de l'espace adhérent. - - - [Faire votre demande](https://www.lacipav.fr/dispositif-exceptionnel-procedure) - question.en: | - [automatic] Have you applied for the reduction of - supplementary pension without income conditions? - question.fr: | - Avez-vous fait une demande pour bénéficier de la réduction de cotisations de - retraite complémentaire sans conditions de revenus ? - titre.en: '[automatic] VIDOC reduction' - titre.fr: réduction COVID -? dirigeant . indépendant . PL . CIPAV . retraite complémentaire . réduction COVID . montant -: titre.en: '[automatic] VIDOC reduction' - titre.fr: réduction COVID dirigeant . indépendant . PL . CNBF: description.en: > [automatic] The Caisse Nationale des Barreaux Français (CNBF) is the @@ -8023,18 +7988,16 @@ protection sociale . retraite: Simulez et gérez votre retraite sur [info-retraite.fr](https://www.info-retraite.fr/portail-info/home.html). note.en: > - [automatic] This is an estimate for purely indicative purposes, in order to - compare the retirement of the different schemes. + [automatic] This is a purely indicative estimate for the purpose of + comparing the pensions of the various schemes. - In particular, we limit ourselves to the following assumptions: - - The worker is considered to have retired at full rate, either by contributing the required number of quarters (172), or by retiring at full rate age (67). - - The worker is considered to have had the same income throughout his or her career. - - The worker is considered to have remained in the same regime throughout his or her career. - - We don't take into account any markdowns / surcharges. - - We do not take into account the pension funds of the regulated liberal professions (the 10 sections of the Cnavpl and the Cnbf). - - The number of validated quarters per year is not calculated. - - These limits will evolve as the simulator develops. + We limit ourselves to the following assumptions: + - It is assumed that the worker has retired at the full rate, by contributing the required number of quarters (172), or by leaving at the full rate age (67 years) + - The worker is considered to have had the same income throughout his career + - It is considered that the worker has remained in the same scheme throughout his career + - Minorities/increases are not taken into account + - We do not take into account the pension funds of the regulated liberal professions (the 10 sections of the Cnavpl and the Cnbf) + - The number of quarters validated per year is not calculated note.fr: > Il s'agit d'une estimation a but purement indicatif, afin de comparer la retraite des différents régimes. @@ -8046,8 +8009,6 @@ protection sociale . retraite: - On ne prend pas en compte les minorations / majorations - On ne prend pas en compte les caisses de retraite des professions libérales réglementées (les 10 sections de la Cnavpl et la Cnbf) - On ne calcule pas le nombre de trimestres validés par année - - Ces limites seront amenées à évoluer au fur et à mesure du développement du simulateur résumé.en: Guarantees on average 60 to 70% of the last income from employment after age 65. résumé.fr: Garantit en moyenne 60 à 70 % du dernier revenu d'activité après 65 ans. @@ -8077,6 +8038,21 @@ protection sociale . retraite . base . taux de la pension: (ou avant si tous les trimestres sont validés). titre.en: rate of the pension titre.fr: taux de la pension +protection sociale . retraite . complémentaire indépendants: + titre.en: supplementary pension for self-employed + titre.fr: complémentaire indépendants +protection sociale . retraite . complémentaire indépendants . points acquis: + titre.en: acquired points + titre.fr: points acquis +? protection sociale . retraite . complémentaire indépendants . prix d'achat du point +: titre.en: buying cost of the point + titre.fr: prix d'achat du point +? protection sociale . retraite . complémentaire indépendants . total points acquis +: titre.en: '[automatic] total points earned' + titre.fr: total points acquis +protection sociale . retraite . complémentaire indépendants . valeur du point: + titre.en: value of the point + titre.fr: valeur du point protection sociale . retraite . complémentaire salarié: titre.en: supplementary pension for employees titre.fr: complémentaire salarié @@ -8092,24 +8068,16 @@ protection sociale . retraite . complémentaire salarié . points acquis: protection sociale . retraite . complémentaire salarié . valeur du point: titre.en: value of the point titre.fr: valeur du point -protection sociale . retraite . complémentaire sécurité des indépendants: - titre.en: supplementary pension for self-employed - titre.fr: complémentaire sécurité des indépendants -? protection sociale . retraite . complémentaire sécurité des indépendants . points acquis -: titre.en: acquired points - titre.fr: points acquis -? protection sociale . retraite . complémentaire sécurité des indépendants . prix d'achat du point -: titre.en: buying cost of the point - titre.fr: prix d'achat du point -? protection sociale . retraite . complémentaire sécurité des indépendants . total points acquis -: titre.en: '[automatic] total points earned' - titre.fr: total points acquis -? protection sociale . retraite . complémentaire sécurité des indépendants . valeur du point -: titre.en: value of the point - titre.fr: valeur du point protection sociale . retraite . mois cotisés: titre.en: contributed months titre.fr: mois cotisés +protection sociale . retraite . plr: + description.en: '[automatic] We have not implemented the specific rules for + regulated professions.' + description.fr: Nous n'avons pas implémenté les règles spécifiques aux + professions libérales relementées. + titre.en: '[automatic] Retirement from regulated professions' + titre.fr: Retraite profession libérale réglementée protection sociale . retraite . trimestres validés: titre.en: '[automatic] validated quarters' titre.fr: trimestres validés diff --git a/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml b/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml index 388d0c00d..5a92fade0 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/rémunération-dirigeant.yaml @@ -12,6 +12,7 @@ objectifs: questions: liste noire: - entreprise . charges + - entreprise . activité . libérale réglementée liste: - entreprise . activité unité par défaut: €/an diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index bf1e19330..77c3d3688 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -394,9 +394,9 @@ exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Co exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,10998,0,10651,4,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,10998,0,10651,4,20]"`; -exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,10998,0,10651,4,0]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,10998,0,null,4,0]"`; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 3`] = `"[917,10998,0,10651,4,20]"`; @@ -454,9 +454,9 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 6`] = `"[0,17852,17852,2973,3,8]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 1`] = `"[0,15580,15580,6600,4,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 1`] = `"[0,15580,15580,6600,4,18]"`; -exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 2`] = `"[0,15560,15560,6600,4,0]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 2`] = `"[0,15560,15560,null,4,0]"`; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 3`] = `"[0,17336,17336,2900,3,8]"`; @@ -510,7 +510,7 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,7547,4,0]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,null,4,0]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10076,4,21]"`; From 4d10c6220657843e821fc522bd030c7de5fe6726 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 09:39:11 +0200 Subject: [PATCH 099/319] =?UTF-8?q?=E2=9A=96=EF=B8=8F=20MAJ=20mentions=20l?= =?UTF-8?q?=C3=A9gales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/components/LegalNotice.tsx | 11 +++-------- mon-entreprise/source/locales/ui-en.yaml | 4 ---- mon-entreprise/source/pages/Landing/Landing.tsx | 4 ++-- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/mon-entreprise/source/components/LegalNotice.tsx b/mon-entreprise/source/components/LegalNotice.tsx index 51374e07d..ea3380c78 100644 --- a/mon-entreprise/source/components/LegalNotice.tsx +++ b/mon-entreprise/source/components/LegalNotice.tsx @@ -11,14 +11,9 @@ export const LegalNoticeContent = () => ( Editeur

    - - Incubateur des services numériques, -
    - Direction interministérielle du numérique et du système d'information et - de communication de l'Etat (DINSIC), -
    - Services du Premier ministre. -
    + Agence Centrale des Organismes de Sécurité Sociale (ACOSS) +
    + 36 rue de Valmy - 93108 Montreuil Cedex

    diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 9e907e702..e2aa64193 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -806,10 +806,6 @@ legalNotice: title: Contact editeur: - content: > - Incubator of digital services,<1> Direction interministérielle du - numérique et du système d'information et de communication de l'Etat - (DINSIC),<3> Services of the Prime Minister title: Publisher hosting: content: > diff --git a/mon-entreprise/source/pages/Landing/Landing.tsx b/mon-entreprise/source/pages/Landing/Landing.tsx index 74dda960f..9b6db8d21 100644 --- a/mon-entreprise/source/pages/Landing/Landing.tsx +++ b/mon-entreprise/source/pages/Landing/Landing.tsx @@ -119,9 +119,9 @@ export default function Landing() {

    Nous sommes une petite{' '} - équipe autonome et pluridisciplinaire + équipe {' '} - au sein de l’ + autonome et pluridisciplinaire au sein de l’ Urssaf. Nous avons à cœur d’être au près de vos besoins afin d’améliorer en permanence ce site conformément à l'approche{' '} From 7a5f6c1cfb802d21e72b047ddb122811d7a6d4cb Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 09:58:37 +0200 Subject: [PATCH 100/319] =?UTF-8?q?=F0=9F=90=9B=20Supprime=20le=20lien=20a?= =?UTF-8?q?ccessibilit=C3=A9=20sur=20la=20version=20anglaise?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1513 --- .../source/components/layout/Footer/Footer.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mon-entreprise/source/components/layout/Footer/Footer.tsx b/mon-entreprise/source/components/layout/Footer/Footer.tsx index bf5ba4921..2bd6cd95b 100644 --- a/mon-entreprise/source/components/layout/Footer/Footer.tsx +++ b/mon-entreprise/source/components/layout/Footer/Footer.tsx @@ -104,11 +104,13 @@ export default function Footer() { Intégrer nos simulateurs {' • '} - - - Accessibilité : non conforme - - + {language === 'fr' && ( + + + Accessibilité : non conforme + + + )} {!!hrefLink.length && ' • '} {hrefLink.map(({ hrefLang, href }) => ( Date: Fri, 7 May 2021 10:02:00 +0200 Subject: [PATCH 101/319] =?UTF-8?q?=F0=9F=90=9B=20Supprime=20un=20probl?= =?UTF-8?q?=C3=A8me=20d'alignement=20sur=20les=20simulateurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1525 --- mon-entreprise/source/components/TargetSelection.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mon-entreprise/source/components/TargetSelection.css b/mon-entreprise/source/components/TargetSelection.css index 82c249f35..4cd362298 100644 --- a/mon-entreprise/source/components/TargetSelection.css +++ b/mon-entreprise/source/components/TargetSelection.css @@ -111,7 +111,9 @@ #targetSelection .targetInputOrValue { font-size: 115%; margin-left: 1rem; - text-align: right; + display: flex; + flex-direction: column; + align-items: flex-end; } #targetSelection .aidesGlimpse { From 0309404375f57219ca0421a6ad370b7beed58710 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 09:55:15 +0200 Subject: [PATCH 102/319] =?UTF-8?q?=F0=9F=90=9B=20Supprime=20une=20erreur?= =?UTF-8?q?=20React=20sur=20la=20validit=C3=A9=20du=20DOM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > Warning: validateDOMNesting(...):

    cannot appear as a descendant of

    . --- mon-entreprise/source/components/Banner.css | 2 +- mon-entreprise/source/components/Banner.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mon-entreprise/source/components/Banner.css b/mon-entreprise/source/components/Banner.css index 5b4e39249..038bd9211 100644 --- a/mon-entreprise/source/components/Banner.css +++ b/mon-entreprise/source/components/Banner.css @@ -21,7 +21,7 @@ border-radius: 15px; } -.ui__.banner p { +.ui__.banner .banner-content { flex-grow: 1; } diff --git a/mon-entreprise/source/components/Banner.tsx b/mon-entreprise/source/components/Banner.tsx index aaa875770..029440679 100644 --- a/mon-entreprise/source/components/Banner.tsx +++ b/mon-entreprise/source/components/Banner.tsx @@ -25,7 +25,7 @@ export default function Banner({

    {icon && emoji(icon)} -

    {children}

    +
    {children}
    ) : null From 1052739d9509bf5c4ca616f59d544a6b0f0a93e2 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 10:06:09 +0200 Subject: [PATCH 103/319] =?UTF-8?q?=E2=9C=A8=20Utilise=20une=20balise=20ut?= =?UTF-8?q?m=20pour=20les=20liens=20de=20partage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js | 1 + mon-entreprise/source/components/ShareSimulationBanner.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js index 42828977e..30fd7b186 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js @@ -109,6 +109,7 @@ describe('Simulateur salarié mode partagé', () => { 'contrat salarié': "'CDD'", 'salaire-brut': '1539€/mois', }) + searchParams.set('utm_source', 'sharing') const urlWithState = `${simulatorUrl}?${searchParams.toString()}` if (!fr) { diff --git a/mon-entreprise/source/components/ShareSimulationBanner.tsx b/mon-entreprise/source/components/ShareSimulationBanner.tsx index c7bf7d969..685b2bb30 100644 --- a/mon-entreprise/source/components/ShareSimulationBanner.tsx +++ b/mon-entreprise/source/components/ShareSimulationBanner.tsx @@ -14,6 +14,7 @@ export default function ShareSimulationBanner() { const tracker = useContext(TrackingContext) const situation = useSelector(situationSelector) const searchParams = useParamsFromSituation(situation) + searchParams.set('utm_source', 'sharing') const shareAPIAvailable = !!window?.navigator?.share From 76e8563603957a3a2ee3ca498c4e78f5a8e9adaa Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 12:06:02 +0200 Subject: [PATCH 104/319] =?UTF-8?q?=F0=9F=93=8E=20Ajoute=20un=20lien=20ver?= =?UTF-8?q?s=20le=20simulateur=20Embaucher?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sur la page « formalités d'embauches » Fixes #1175 --- .../source/pages/Gérer/Embaucher.tsx | 9 ++++ .../source/pages/Simulateurs/Page.tsx | 43 +++++++++++-------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/mon-entreprise/source/pages/Gérer/Embaucher.tsx b/mon-entreprise/source/pages/Gérer/Embaucher.tsx index 32667e14d..901271c4e 100644 --- a/mon-entreprise/source/pages/Gérer/Embaucher.tsx +++ b/mon-entreprise/source/pages/Gérer/Embaucher.tsx @@ -4,6 +4,7 @@ import { } from 'Actions/hiringChecklistAction' import Animate from 'Components/ui/animate' import { CheckItem, Checklist, ChecklistProps } from 'Components/ui/Checklist' +import { SimulatorRessourceCard } from '../Simulateurs/Page' import { Helmet } from 'react-helmet' import { Trans, useTranslation } from 'react-i18next' import { connect, useSelector } from 'react-redux' @@ -216,6 +217,14 @@ function Embaucher({ onChecklistInitialization, onItemCheck }: EmbaucherProps) {
  • Remettre la fiche de paie à votre employé
  • + +

    + Ressources utiles +

    + +
    + +
    ) } diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index 3297d9dce..61ca11da7 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -103,7 +103,6 @@ type NextStepsProps = Pick< function NextSteps({ iframePath, nextSteps }: NextStepsProps) { const sitePaths = useContext(SitePathsContext) - const simulators = useSimulatorsData() const { language } = useTranslation().i18n const engine = useEngine() @@ -140,22 +139,7 @@ function NextSteps({ iframePath, nextSteps }: NextStepsProps) {
    )} {nextSteps?.map((simulatorId) => ( - -

    - {' '} - {simulators[simulatorId].shortName} -

    -

    - {simulators[simulatorId].meta?.description} -

    - + ))} {iframePath && ( +

    + {' '} + {simulators[simulatorId].shortName} +

    +

    {simulators[simulatorId].meta?.description}

    + + ) +} + const guidesUrssaf = [ { url: From 28d7161dd934f5b422c7530ae2f2f6084ab08817 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 12:09:33 +0200 Subject: [PATCH 105/319] =?UTF-8?q?=F0=9F=90=9B=20Supprime=20les=20slash?= =?UTF-8?q?=20de=20fin=20d'URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1446 Co-authored-by: Maël Thomas --- mon-entreprise/source/App.tsx | 11 ++++++++++- publicodes/site/components/App.tsx | 13 ++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/mon-entreprise/source/App.tsx b/mon-entreprise/source/App.tsx index 22bfaba66..b0a4a42b2 100644 --- a/mon-entreprise/source/App.tsx +++ b/mon-entreprise/source/App.tsx @@ -14,7 +14,7 @@ import { useContext, useMemo } from 'react' import { Helmet } from 'react-helmet' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' -import { Route, Switch } from 'react-router-dom' +import { Redirect, Route, Switch } from 'react-router-dom' import { configSituationSelector, situationSelector, @@ -85,6 +85,15 @@ const Router = () => { + {/* Removes trailing slashes */} + ( + + )} + /> diff --git a/publicodes/site/components/App.tsx b/publicodes/site/components/App.tsx index d97139643..3941d4500 100644 --- a/publicodes/site/components/App.tsx +++ b/publicodes/site/components/App.tsx @@ -1,7 +1,7 @@ import 'Components/ui/index.css' import { useEffect } from 'react' import { hot } from 'react-hot-loader' -import { Route, Switch } from 'react-router-dom' +import { Redirect, Route, Switch } from 'react-router-dom' import Communauté from '../pages/Communauté' import Documentation from '../pages/Documentation' import Landing from '../pages/Landing' @@ -34,6 +34,17 @@ const RouterSwitch = () => { > + {/* Removes trailing slashes */} + ( + + )} + /> From 0a45941e853eeeef44a441834bc6ba5204661a2b Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 12:44:05 +0200 Subject: [PATCH 106/319] =?UTF-8?q?=F0=9F=94=A8=20Pr=C3=A9voyance=20conven?= =?UTF-8?q?tionnelle=20HCR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1434 --- .../hôtels-cafés-restaurants.yaml | 16 ++++++++++++++++ mon-entreprise/source/locales/rules-en.yaml | 3 +++ .../__snapshots__/simulations.jest.js.snap | 6 +++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/modele-social/règles/conventions-collectives/hôtels-cafés-restaurants.yaml b/modele-social/règles/conventions-collectives/hôtels-cafés-restaurants.yaml index 9970977d5..705ed51b7 100644 --- a/modele-social/règles/conventions-collectives/hôtels-cafés-restaurants.yaml +++ b/modele-social/règles/conventions-collectives/hôtels-cafés-restaurants.yaml @@ -21,3 +21,19 @@ contrat salarié . convention collective . HCR . majoration heures supplémentai - taux: 20% plafond: 8 heures/semaine - taux: 50% + +contrat salarié . convention collective . HCR . prévoyance conventionnelle: + produit: + assiette: rémunération . brut de base + plafond: plafond sécurité sociale + composantes: + - attributs: + nom: employeur + remplace: prévoyance . employeur + taux: 0.40% + - attributs: + nom: salarié + remplace: prévoyance . salarié + taux: 0.40% + références: + Prévoyance HCR: https://www.hcrprevoyance.fr/contenu/documents/modalites_pratiques/HCR%20027_20-2%20-%20Fiche%20Garantie%20Conventionnelle%20Prevoyance.pdf diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 9da236c2a..c67490026 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -2172,6 +2172,9 @@ contrat salarié . convention collective . HCR: contrat salarié . convention collective . HCR . montant forfaitaire d'un repas: titre.en: fixed amount of a meal titre.fr: montant forfaitaire d'un repas +contrat salarié . convention collective . HCR . prévoyance conventionnelle: + titre.en: '[automatic] conventional pension fund' + titre.fr: prévoyance conventionnelle contrat salarié . convention collective . SVP: description.en: > The company depends on the national collective agreement of performing arts diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 77c3d3688..355b16117 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -548,7 +548,7 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate simulations-salarié: CCN HCR 1`] = ` -"[3532,0,2500,1998,1887] +"[3546,0,2500,2005,1894] Notifications affichées : contrat salarié . convention collective . contrôle décharge" `; @@ -769,12 +769,12 @@ exports[`calculate simulations-salarié: heures supplémentaires et complémenta exports[`calculate simulations-salarié: heures supplémentaires et complémentaires 3`] = `"[2641,0,2000,1636,1601]"`; exports[`calculate simulations-salarié: heures supplémentaires et complémentaires 4`] = ` -"[2552,0,2000,1627,1592] +"[2567,0,2000,1632,1598] Notifications affichées : contrat salarié . convention collective . contrôle décharge" `; exports[`calculate simulations-salarié: heures supplémentaires et complémentaires 5`] = ` -"[2517,0,2000,1601,1566] +"[2533,0,2000,1606,1572] Notifications affichées : contrat salarié . convention collective . contrôle décharge" `; From c469b43258926a918cde05a74d29967b41619423 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 13:23:36 +0200 Subject: [PATCH 107/319] =?UTF-8?q?=F0=9F=94=A5=20Supprime=20polyfill.io?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Il n'était utilisé que pour d'anciennes versions de Safari qui ne sont plus très utilisées. Ajout d'un bout de code "progressive enhancement" pour la fonction d'animation lorsqu'un élément apparaît à l'écran. Fixes #606 --- mon-entreprise/cypress/downloads/contrat-salarié.html | 8 -------- mon-entreprise/index.html | 6 ------ .../source/components/utils/useDisplayOnIntersecting.ts | 4 ++++ 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/mon-entreprise/cypress/downloads/contrat-salarié.html b/mon-entreprise/cypress/downloads/contrat-salarié.html index 761dec9f0..e53496707 100644 --- a/mon-entreprise/cypress/downloads/contrat-salarié.html +++ b/mon-entreprise/cypress/downloads/contrat-salarié.html @@ -260,14 +260,6 @@ src="mon-entreprise.2f9d22ef7f796f3d0266.bundle.js" > - - - - - diff --git a/mon-entreprise/index.html b/mon-entreprise/index.html index 149917238..7d7052a35 100644 --- a/mon-entreprise/index.html +++ b/mon-entreprise/index.html @@ -261,12 +261,6 @@ > <% } %> - - - <% for (var chunk in htmlWebpackPlugin.files.chunks) { %> <% } %> diff --git a/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts b/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts index 157d9c140..c0aeebb1d 100644 --- a/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts +++ b/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts @@ -13,6 +13,10 @@ export default function ({ const [wasOnScreen, setWasOnScreen] = useState(false) useEffect(() => { + if (!IntersectionObserver) { + setWasOnScreen(true) // No effect for old browsers + } + const observer = new IntersectionObserver( ([entry]) => { if (entry.isIntersecting) { From b898f573eeb825205457415ae86b3e7d8f5ba90d Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 14:16:24 +0200 Subject: [PATCH 108/319] =?UTF-8?q?=F0=9F=90=9B=20Cache=20le=20module=20d'?= =?UTF-8?q?int=C3=A9grations=20pour=20les=20simulateurs=20priv=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/pages/Simulateurs/Page.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index 61ca11da7..6aa4f1199 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -23,6 +23,7 @@ export default function PageData({ tooltip, description, iframePath, + private: privateIframe, component: Component, seoExplanations, nextSteps, @@ -88,7 +89,10 @@ export default function PageData({ {!inIframe && ( <> {seoExplanations} - + )} From 4632ddb2159988d16a16c27002e65b2525bf1806 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 14:52:06 +0200 Subject: [PATCH 109/319] =?UTF-8?q?=F0=9F=90=9B=20Cache=20la=20barre=20de?= =?UTF-8?q?=20d=C3=A9filement=20des=20iframes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1462 --- mon-entreprise/source/pages/Iframes/index.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mon-entreprise/source/pages/Iframes/index.tsx b/mon-entreprise/source/pages/Iframes/index.tsx index 3aac548d8..e5350bc58 100644 --- a/mon-entreprise/source/pages/Iframes/index.tsx +++ b/mon-entreprise/source/pages/Iframes/index.tsx @@ -1,4 +1,5 @@ import { IsEmbeddedContext } from 'Components/utils/embeddedContext' +import { useEffect } from 'react' import { Helmet } from 'react-helmet' import { Route, Switch } from 'react-router-dom' import useSimulatorsData from '../Simulateurs/metadata' @@ -8,6 +9,14 @@ import IframeFooter from './IframeFooter' export default function Iframes() { const simulators = useSimulatorsData() + // We hide the vertical scrollbar in the iframe because the iframe is resized + // using the "iframe-resizer" module, and if we keep the scrollbar it appears + // briefly during transitions, cf. + // https://github.com/betagouv/mon-entreprise/issues/1462 + useEffect(() => { + document.body.style.overflowY = 'hidden' + }, []) + return ( {/** Open external links in the parent frame. From c0f1c94dc5243f5fba015cfd6d9139ec3d517cba Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 7 May 2021 17:35:35 +0200 Subject: [PATCH 110/319] =?UTF-8?q?=F0=9F=96=8B=EF=B8=8F=20Mentionne=20les?= =?UTF-8?q?=20en-t=C3=AAte=20CSP=20sur=20la=20page=20int=C3=A9gration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #882 --- .../components/layout/Footer/Footer.tsx | 14 +++-- mon-entreprise/source/locales/ui-en.yaml | 22 +++++--- mon-entreprise/source/pages/Iframes/index.tsx | 4 +- .../source/pages/integration/Iframe.tsx | 56 +++++++++++++++++-- 4 files changed, 77 insertions(+), 19 deletions(-) diff --git a/mon-entreprise/source/components/layout/Footer/Footer.tsx b/mon-entreprise/source/components/layout/Footer/Footer.tsx index 2bd6cd95b..1cd0da9b1 100644 --- a/mon-entreprise/source/components/layout/Footer/Footer.tsx +++ b/mon-entreprise/source/components/layout/Footer/Footer.tsx @@ -103,13 +103,15 @@ export default function Footer() { Intégrer nos simulateurs - {' • '} {language === 'fr' && ( - - - Accessibilité : non conforme - - + <> + {' • '} + + + Accessibilité : non conforme + + + )} {!!hrefLink.length && ' • '} {hrefLink.map(({ hrefLang, href }) => ( diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index e2aa64193..f0fdaca90 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -108,7 +108,6 @@ Nous n'avons rien trouvé: We didn't find any matching registered company. Oui: Yes Outils pour les développeurs: Tools for developers Pages associées: Related pages -Professions libérales: By job Par statut: By status Part du salaire net maintenue: Share of net salary maintained Part employeur: Employer share @@ -127,6 +126,7 @@ Prise en charge du revenu net avec chômage partiel: Net income support with sho Prochaines questions: Next questions Professionnels de santé: Health Care Professionals Professions: Professions +Professions libérales: By job Protection sociale: Social security Précédent: Previous Prévisualisation: Preview @@ -972,12 +972,20 @@ pages: source tools to be integrated seemlessly in the usual journey of your users. titre: Integrate social security law at the heart of your tools - iframe: <0>Integrate the Web module<1>Our simulators can be seamlessly - integrated by adding a simple line of code to your web page.<2>You can - choose the simulator to integrate and <2>customize the main color of the - module to blend it into the visual theme of your page.<3>The - attribute <1>data-lang="en" allows you to choose English as the - simulator language. + iframe: + csp-1: <0>Iframe integration and content security policy<1>The error below + that is displayed in the console is related to the communication between + the parent page and the iframe for automatic resizing to the displayed + content. + csp-2: "You can correct it with the following policy:" + intro: <0><0>Integrate the web module<1>Our simulators can be integrated + seamlessly by adding a simple line of code to your web page.<2>You + can choose the simulator to integrate and <2>customize the main color of + the module to fit the visual theme of your page.<3>The + <1>data-lang="en" attribute allows you to choose English as the + simulator language.<1><2>Note that if your site uses a + content security policy via the HTTP <1>Content-Security-Policy + response header, a benign error may appear in the console.<3> module: What module? gérer: aide-déclaration-indépendant: diff --git a/mon-entreprise/source/pages/Iframes/index.tsx b/mon-entreprise/source/pages/Iframes/index.tsx index e5350bc58..8ebdb9ec2 100644 --- a/mon-entreprise/source/pages/Iframes/index.tsx +++ b/mon-entreprise/source/pages/Iframes/index.tsx @@ -14,7 +14,9 @@ export default function Iframes() { // briefly during transitions, cf. // https://github.com/betagouv/mon-entreprise/issues/1462 useEffect(() => { - document.body.style.overflowY = 'hidden' + if ('parentIFrame' in window) { + document.body.style.overflowY = 'hidden' + } }, []) return ( diff --git a/mon-entreprise/source/pages/integration/Iframe.tsx b/mon-entreprise/source/pages/integration/Iframe.tsx index 2e627c707..031211aad 100644 --- a/mon-entreprise/source/pages/integration/Iframe.tsx +++ b/mon-entreprise/source/pages/integration/Iframe.tsx @@ -1,3 +1,4 @@ +import Overlay from 'Components/Overlay' import { ThemeColorsContext, ThemeColorsProvider, @@ -177,8 +178,8 @@ export default function Integration() { <> -
    - + +

    Intégrez le module Web

    Nos simulateurs sont intégrables de manière transparente en ajoutant @@ -193,9 +194,15 @@ export default function Integration() { L'attribut data-lang="en" vous permet quant à lui de choisir l'anglais comme langue du simulateur.

    - -
    - +
    + +

    + À noter que si votre site utilise une politique de sécurité de contenu + via l'en-tête de réponse HTTP Content-Security-Policy, une + erreur bénigne peut apparaître dans la console. + +

    +

    Quelques intégrations @@ -249,6 +256,44 @@ export default function Integration() { ) } +function EnSavoirPlusCSP() { + const [opened, setOpened] = useState(false) + return ( + <> + + {opened && ( + setOpened(false)} style={{ textAlign: 'left' }}> + +

    Intégration iframe et politique de sécurité de contenu

    +

    + L'erreur ci-dessous qui s'affiche dans la console est liée à la + communication entre la page parente et l'iframe pour le + redimensionnement automatique au contenu affiché. +

    +
    +
    + Failed to execute 'postMessage' on 'DOMWindow': The target origin + provided ('https://mon-entreprise.fr') does not match the recipient + window's origin +
    +

    + + Vous pouvez la corriger avec la politique suivante : + +

    + + script-src 'self' 'unsafe-inline' https://mon-entreprise.fr; +
    + img-src 'self' https://mon-entreprise.fr; +
    +
    + )} + + ) +} + type IntegrationCodeProps = { module?: string color?: string @@ -284,6 +329,7 @@ function IntegrationCode({ margin: auto; margin-bottom: 1em; overflow: auto; + line-height: 1.6em; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05), -1px 1px 1px rgba(0, 0, 0, 0.02); From ca9b952dffb873ee33ad7d409d7066fbefd9d399 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Sun, 9 May 2021 19:15:57 +0200 Subject: [PATCH 111/319] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20MAJ=20Typescript?= =?UTF-8?q?=20vers=204.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/package.json | 2 +- .../source/components/NewsletterRegister.tsx | 11 ++++---- .../components/conversation/Question.tsx | 4 +-- .../components/layout/Footer/Footer.css | 2 +- .../source/locales/translateRules.ts | 8 +++--- package.json | 2 +- publicodes/core/package.json | 2 +- publicodes/ui-react/package.json | 2 +- yarn.lock | 27 ++++++------------- 9 files changed, 25 insertions(+), 35 deletions(-) diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index d5eda7044..082b67898 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -35,7 +35,7 @@ "@types/react-router": "^5.1.2", "@types/recharts": "^1.8.16", "@types/redux-sentry-middleware": "^0.1.2", - "@types/styled-components": "^5.1.4", + "@types/styled-components": "^5.1.9", "@types/webpack": "^4.41.10", "@typescript-eslint/eslint-plugin": "^4.0.1", "@typescript-eslint/parser": "^4.0.1", diff --git a/mon-entreprise/source/components/NewsletterRegister.tsx b/mon-entreprise/source/components/NewsletterRegister.tsx index 3df737bab..8d40d7bab 100644 --- a/mon-entreprise/source/components/NewsletterRegister.tsx +++ b/mon-entreprise/source/components/NewsletterRegister.tsx @@ -19,7 +19,7 @@ export default function NewsletterRegister() { ) const formElement = useRef(null) const [userJustRegistered, setUserJustRegistered] = useState(false) - const { t, i18n } = useTranslation() + const { i18n } = useTranslation() const onSubmit = (evt: React.FormEvent) => { evt.preventDefault() @@ -85,12 +85,13 @@ export default function NewsletterRegister() {
    - + className="ui__ plain small button" + > + S'inscrire +
    diff --git a/mon-entreprise/source/components/conversation/Question.tsx b/mon-entreprise/source/components/conversation/Question.tsx index 16cda9f1f..af72e267b 100644 --- a/mon-entreprise/source/components/conversation/Question.tsx +++ b/mon-entreprise/source/components/conversation/Question.tsx @@ -175,8 +175,8 @@ export default function Question({ } const choiceElements = Array.isArray(choices) - ? renderBinaryQuestion(choices) - : renderChildren(choices) + ? renderBinaryQuestion((choices as unknown) as typeof binaryQuestion) + : renderChildren(choices as Choice) return (
    input[type='submit'] { +.footer__registerField > button[type='submit'] { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; margin: -1px !important; diff --git a/mon-entreprise/source/locales/translateRules.ts b/mon-entreprise/source/locales/translateRules.ts index ea5b354c1..c4c5f9c46 100644 --- a/mon-entreprise/source/locales/translateRules.ts +++ b/mon-entreprise/source/locales/translateRules.ts @@ -69,11 +69,11 @@ function translateRule( ) } -export default function translateRules( +export default function translateRules( lang: string, - translations: Record, - rules: Record -): Record { + translations: Record, + rules: Record +): Record { const translatedRules = mapObjIndexed( (rule: Rule, name: string) => translateRule(lang, translations, name, rule), rules diff --git a/package.json b/package.json index 4794f1b46..cea2fb1ba 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "style-loader": "^0.23.1", "terser-webpack-plugin": "^3.0.2", "toml-loader": "^1.0.0", - "typescript": "^4.1.0", + "typescript": "^4.2.4", "url-loader": "^4.1.0", "webpack": "^4.42.0", "webpack-bundle-analyzer": "^3.7.0", diff --git a/publicodes/core/package.json b/publicodes/core/package.json index 13dd25438..c1408a8db 100644 --- a/publicodes/core/package.json +++ b/publicodes/core/package.json @@ -27,7 +27,7 @@ "devDependencies": { "chai": "^4.2.0", "intl": "^1.2.5", - "typescript": "3.4.3", + "typescript": "^4.2.4", "dedent-js": "1.0.1", "@dagrejs/graphlib": "^2.1.4" }, diff --git a/publicodes/ui-react/package.json b/publicodes/ui-react/package.json index 959b93613..edad380e8 100644 --- a/publicodes/ui-react/package.json +++ b/publicodes/ui-react/package.json @@ -33,6 +33,6 @@ }, "devDependencies": { "js-yaml": "^4.0.0", - "typescript": "^4.1.3" + "typescript": "^4.2.4" } } diff --git a/yarn.lock b/yarn.lock index ff696c845..5c6ef5836 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2568,14 +2568,13 @@ "@types/react-native" "*" csstype "^3.0.2" -"@types/styled-components@^5.1.4": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.4.tgz#11f167dbde268635c66adc89b5a5db2e69d75384" - integrity sha512-78f5Zuy0v/LTQNOYfpH+CINHpchzMMmAt9amY2YNtSgsk1TmlKm8L2Wijss/mtTrsUAVTm2CdGB8VOM65vA8xg== +"@types/styled-components@^5.1.9": + version "5.1.9" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.9.tgz#00d3d84b501420521c4db727e3c195459f87a6cf" + integrity sha512-kbEG6YlwK8rucITpKEr6pA4Ho9KSQHUUOzZ9lY3va1mtcjvS3D0wDciFyHEiNHKLL/npZCKDQJqm0x44sPO9oA== dependencies: "@types/hoist-non-react-statics" "*" "@types/react" "*" - "@types/react-native" "*" csstype "^3.0.2" "@types/tapable@*": @@ -13423,25 +13422,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.3.tgz#0eb320e4ace9b10eadf5bc6103286b0f8b7c224f" - integrity sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ== - typescript@^3.6.4: version "3.9.7" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== -typescript@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.2.tgz#6369ef22516fe5e10304aae5a5c4862db55380e9" - integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ== - -typescript@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" - integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== +typescript@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" + integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== uglify-js@3.4.x: version "3.4.10" From f017499be4df459279dbe0c61f175961def53fc3 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Sun, 9 May 2021 20:09:03 +0200 Subject: [PATCH 112/319] =?UTF-8?q?=F0=9F=93=8E=20Ajout=20d'un=20lien=20ve?= =?UTF-8?q?rs=20les=20retours=20utilisateurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/components/utils/markdown.tsx | 2 +- mon-entreprise/source/pages/Nouveautés/Nouveautés.tsx | 5 +++-- .../source/pages/Stats/DemandesUtilisateurs.tsx | 2 +- mon-entreprise/source/pages/Stats/LazyStats.tsx | 2 +- mon-entreprise/source/pages/Stats/Stats.tsx | 10 ++++++++-- mon-entreprise/source/pages/integration/Iframe.tsx | 3 +-- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/mon-entreprise/source/components/utils/markdown.tsx b/mon-entreprise/source/components/utils/markdown.tsx index fc3404e6f..e235b5883 100644 --- a/mon-entreprise/source/components/utils/markdown.tsx +++ b/mon-entreprise/source/components/utils/markdown.tsx @@ -132,7 +132,7 @@ const flatMapChildren = (children: React.ReactNode): Array => { : child.props?.value ?? flatMapChildren(child.props?.children) ) } -function useScrollToHash() { +export function useScrollToHash() { useEffect(() => { const { hash } = window.location if (hash) { diff --git a/mon-entreprise/source/pages/Nouveautés/Nouveautés.tsx b/mon-entreprise/source/pages/Nouveautés/Nouveautés.tsx index fc8e70648..4b527f311 100644 --- a/mon-entreprise/source/pages/Nouveautés/Nouveautés.tsx +++ b/mon-entreprise/source/pages/Nouveautés/Nouveautés.tsx @@ -56,8 +56,9 @@ export default function Nouveautés() {

    Les nouveautés {emoji('✨')}

    - Nous améliorons le site en continu à partir de vos retours. Découvrez - les{' '} + Nous améliorons le site en continu à partir de{' '} + vos retours + . Découvrez les{' '} {selectedRelease === 0 ? 'dernières nouveautés' : `nouveautés ${determinant(releaseName)}${releaseName}`} diff --git a/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx b/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx index e3215afaa..ab44e228c 100644 --- a/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx +++ b/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx @@ -6,7 +6,7 @@ export default function DemandeUtilisateurs() { const [extendedView, setExtendedView] = useState(false) return (

    -

    Demandes utilisateurs

    +

    Demandes utilisateurs

    Demandes formulées en utilisant le bouton "faire une suggestion" diff --git a/mon-entreprise/source/pages/Stats/LazyStats.tsx b/mon-entreprise/source/pages/Stats/LazyStats.tsx index b93a7f90e..5d1092751 100644 --- a/mon-entreprise/source/pages/Stats/LazyStats.tsx +++ b/mon-entreprise/source/pages/Stats/LazyStats.tsx @@ -4,7 +4,7 @@ const Stats = lazy(() => import('./Stats')) export default function LazyStats() { return ( Chargement de la page stats

    } + fallback={

    Chargement des statistiques...

    } > diff --git a/mon-entreprise/source/pages/Stats/Stats.tsx b/mon-entreprise/source/pages/Stats/Stats.tsx index 261c20190..ae8f71001 100644 --- a/mon-entreprise/source/pages/Stats/Stats.tsx +++ b/mon-entreprise/source/pages/Stats/Stats.tsx @@ -2,6 +2,7 @@ import classnames from 'classnames' import Privacy from 'Components/layout/Footer/Privacy' import MoreInfosOnUs from 'Components/MoreInfosOnUs' import InfoBulle from 'Components/ui/InfoBulle' +import { useScrollToHash } from 'Components/utils/markdown' import { ScrollToTop } from 'Components/utils/Scroll' import { formatValue } from 'publicodes' import { add, groupBy, mapObjIndexed, mergeWith, toPairs } from 'ramda' @@ -104,7 +105,9 @@ const computeTotals = (data: Data): number | Record => { export default function Stats() { const defaultPeriod = 'mois' const history = useHistory() - const urlParams = new URLSearchParams(useLocation().search ?? '') + const location = useLocation() + useScrollToHash() + const urlParams = new URLSearchParams(location.search ?? '') const [period, setPeriod] = useState( (urlParams.get('periode') as Period) ?? defaultPeriod @@ -120,7 +123,10 @@ export default function Stats() { period !== defaultPeriod && `periode=${period}`, chapter2 && `module=${chapter2}`, ].filter(Boolean) - history.replace({ search: `?${queryParams.join('&')}` }) + history.replace({ + search: `?${queryParams.join('&')}`, + hash: location.hash, + }) }, [period, chapter2]) const visites = useMemo(() => { diff --git a/mon-entreprise/source/pages/integration/Iframe.tsx b/mon-entreprise/source/pages/integration/Iframe.tsx index 031211aad..4c2ebec44 100644 --- a/mon-entreprise/source/pages/integration/Iframe.tsx +++ b/mon-entreprise/source/pages/integration/Iframe.tsx @@ -199,8 +199,7 @@ export default function Integration() {

    À noter que si votre site utilise une politique de sécurité de contenu via l'en-tête de réponse HTTP Content-Security-Policy, une - erreur bénigne peut apparaître dans la console. - + erreur bénigne peut apparaître dans la console.

    From dc81428088c1983e852e953789f1806485e5d325 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 10 May 2021 11:07:17 +0200 Subject: [PATCH 113/319] =?UTF-8?q?:bug:=20r=C3=A9pare=20page=20blanche=20?= =?UTF-8?q?sur=20safari=20mobile=20<=3D=2014=20&=20safari=20<=3D=2012?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/components/utils/useDisplayOnIntersecting.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts b/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts index c0aeebb1d..732b0fc3b 100644 --- a/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts +++ b/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts @@ -13,8 +13,9 @@ export default function ({ const [wasOnScreen, setWasOnScreen] = useState(false) useEffect(() => { - if (!IntersectionObserver) { + if (typeof IntersectionObserver === 'undefined') { setWasOnScreen(true) // No effect for old browsers + return } const observer = new IntersectionObserver( From cbbfe6e0511cf0f32c5d0b74828b570849f9eca6 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 10 May 2021 10:56:30 +0200 Subject: [PATCH 114/319] =?UTF-8?q?:bug:=20r=C3=A9pare=20l'affichage=20du?= =?UTF-8?q?=20recalcul?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publicodes/core/source/mecanisms/recalcul.ts | 1 - publicodes/ui-react/source/index.tsx | 1 + .../ui-react/source/mecanisms/Recalcul.tsx | 19 +++++++++++++------ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/publicodes/core/source/mecanisms/recalcul.ts b/publicodes/core/source/mecanisms/recalcul.ts index 084f35f82..f9eb7e1ca 100644 --- a/publicodes/core/source/mecanisms/recalcul.ts +++ b/publicodes/core/source/mecanisms/recalcul.ts @@ -57,7 +57,6 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { nodeValue: evaluatedNode.nodeValue, explanation: { recalcul: evaluatedNode, - engine, amendedSituation, parsedSituation: engine.parsedSituation, }, diff --git a/publicodes/ui-react/source/index.tsx b/publicodes/ui-react/source/index.tsx index 4a79e5a5a..fe4dddea5 100644 --- a/publicodes/ui-react/source/index.tsx +++ b/publicodes/ui-react/source/index.tsx @@ -67,6 +67,7 @@ export function Documentation({ defaultEngine, state?.situation ) + console.log(engine) return ( diff --git a/publicodes/ui-react/source/mecanisms/Recalcul.tsx b/publicodes/ui-react/source/mecanisms/Recalcul.tsx index 0da51ba1f..e9ef3305c 100644 --- a/publicodes/ui-react/source/mecanisms/Recalcul.tsx +++ b/publicodes/ui-react/source/mecanisms/Recalcul.tsx @@ -1,3 +1,5 @@ +import { EvaluatedNode } from 'publicodes' +import { RecalculNode } from 'publicodes/dist/types/mecanisms/recalcul' import { useContext } from 'react' import { EngineContext, @@ -8,19 +10,24 @@ import Explanation from '../Explanation' import { RuleLinkWithContext } from '../RuleLink' import { Mecanism } from './common' -export default function Recalcul({ nodeValue, explanation, unit }) { +export default function Recalcul({ + nodeValue, + explanation, + unit, +}: RecalculNode & EvaluatedNode) { const engine = useContext(EngineContext) if (!engine) { throw new Error() } - useContext(RegisterEngineContext)( - engine.shallowCopy().setSituation(explanation.parsedSituation) - ) + const recalculEngine = engine + .shallowCopy() + .setSituation(explanation.parsedSituation) + useContext(RegisterEngineContext)(recalculEngine) return ( <> {explanation.recalcul && ( - + {explanation.amendedSituation.map(([origin, replacement]) => (
  • - ={' '} + ={' '}
  • ))} From 145080f3af16f300c696feab905cc06d73f7d19b Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 11 May 2021 13:27:35 +0200 Subject: [PATCH 115/319] =?UTF-8?q?=F0=9F=90=9B=20Ajout=20la=20permission?= =?UTF-8?q?=20presse-papier=20aux=20int=C3=A9grations=20iframe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://web.dev/async-clipboard/#permissions-policy-integration --- mon-entreprise/source/iframe-integration-script.js | 1 + 1 file changed, 1 insertion(+) diff --git a/mon-entreprise/source/iframe-integration-script.js b/mon-entreprise/source/iframe-integration-script.js index 52af130ca..daee799a6 100644 --- a/mon-entreprise/source/iframe-integration-script.js +++ b/mon-entreprise/source/iframe-integration-script.js @@ -26,6 +26,7 @@ const iframeAttributes = { id: 'simulateurEmbauche', src, style: 'border: none; width: 100%; display: block; height: 500px', + allow: 'clipboard-write', allowfullscreen: true, webkitallowfullscreen: true, mozallowfullscreen: true, From 496c58c00e6497356143a66524173140801515ab Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 11 May 2021 14:37:03 +0200 Subject: [PATCH 116/319] =?UTF-8?q?=F0=9F=90=9B=20Fallback=20en=20cas=20d'?= =?UTF-8?q?erreur=20sur=20l'API=20de=20partage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ShareSimulationBanner.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mon-entreprise/source/components/ShareSimulationBanner.tsx b/mon-entreprise/source/components/ShareSimulationBanner.tsx index 685b2bb30..3f05cec91 100644 --- a/mon-entreprise/source/components/ShareSimulationBanner.tsx +++ b/mon-entreprise/source/components/ShareSimulationBanner.tsx @@ -28,14 +28,18 @@ export default function ShareSimulationBanner() { const startSharing = () => { if (shareAPIAvailable) { - window.navigator.share({ - title: document.title, - text: t( - 'shareSimulation.navigatorShare', - 'Ma simulation Mon Entreprise' - ), - url: getUrl(), - }) + try { + window.navigator.share({ + title: document.title, + text: t( + 'shareSimulation.navigatorShare', + 'Ma simulation Mon Entreprise' + ), + url: getUrl(), + }) + } catch { + setOpened(true) + } } else { setOpened(true) } From 2dacc5d7df8da14fde15c11883854978a2c6bb5b Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 11 May 2021 14:47:32 +0200 Subject: [PATCH 117/319] =?UTF-8?q?=F0=9F=90=9B=20Supporte=20la=20r=C3=A9i?= =?UTF-8?q?nitialisation=20de=20champ=20sur=20le=20formulaire=20de=20deman?= =?UTF-8?q?de=20de=20mobilit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/pages/Gérer/DemandeMobilite/index.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx b/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx index c39ced1ca..89c379eb3 100644 --- a/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx +++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx @@ -8,7 +8,7 @@ import { Markdown } from 'Components/utils/markdown' import { usePersistingState } from 'Components/utils/persistState' import { DottedName } from 'modele-social' import Engine, { UNSAFE_isNotApplicable } from 'publicodes' -import { equals, isEmpty } from 'ramda' +import { equals, isEmpty, omit } from 'ramda' import { createElement, lazy, @@ -123,10 +123,14 @@ function FormulairePublicodes() { ) const onChange = useCallback( (dottedName, value) => { - setSituation((situation) => ({ - ...situation, - [dottedName]: value, - })) + if (value === undefined) { + setSituation((situation) => omit([dottedName], situation)) + } else { + setSituation((situation) => ({ + ...situation, + [dottedName]: value, + })) + } }, [setSituation] ) From 61ba1ec90bdf1d55639734aaab82f63ca7702703 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 11 May 2021 14:55:39 +0200 Subject: [PATCH 118/319] =?UTF-8?q?=F0=9F=90=9B=20=C3=89vite=20une=20divis?= =?UTF-8?q?ion=20par=20z=C3=A9ro=20dans=20le=20multi-activit=C3=A9=20AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index d6133b979..6fc32d64c 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -35,6 +35,9 @@ function useAdjustProportions(): () => void { .filter(Boolean), }) ) + if (nouveauCA === '0€/an') { + return // Avoid division by 0 + } const situation = Object.entries(proportions).reduce( (acc, [proportionName, valueName]) => { const value = serializeEvaluation( From a8bd31f83a7aef9547aef09c738467eede94cc82 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 11 May 2021 15:04:22 +0200 Subject: [PATCH 119/319] =?UTF-8?q?=F0=9F=90=9B=20Logique=20plus=20d=C3=A9?= =?UTF-8?q?fensive=20dans=20le=20m=C3=A9canisme=20synchronisation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publicodes/core/source/mecanisms/synchronisation.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/publicodes/core/source/mecanisms/synchronisation.ts b/publicodes/core/source/mecanisms/synchronisation.ts index 67d7b8d54..e944051a6 100644 --- a/publicodes/core/source/mecanisms/synchronisation.ts +++ b/publicodes/core/source/mecanisms/synchronisation.ts @@ -14,8 +14,8 @@ export type SynchronisationNode = { const evaluate: EvaluationFunction<'synchronisation'> = function (node: any) { const data = this.evaluate(node.explanation.data) const valuePath = node.explanation.chemin.split(' . ') - const path = (obj) => valuePath.reduce((res, prop) => res[prop], obj) - const nodeValue = data.nodeValue == null ? null : path(data.nodeValue) + const path = (obj) => valuePath.reduce((res, prop) => res?.[prop], obj) + const nodeValue = path(data.nodeValue) ?? null const missingVariables = { ...data.missingVariables, From 5c7abd043b7b7c769678daf7667745d1e6e47503 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 11 May 2021 15:12:20 +0200 Subject: [PATCH 120/319] =?UTF-8?q?=F0=9F=90=9B=20Syntaxe=20des=20r=C3=A9f?= =?UTF-8?q?=C3=A9rences=20publicodes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remonté par Sentry. Il faudrait que ça soit vérifié statiquement --- modele-social/règles/salarié.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index 2dab61f0a..5e4e7160a 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -3104,8 +3104,8 @@ contrat salarié . maladie . taux solidarité autonomie: acronyme: CSA formule: 0.3% références: - - https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/les-taux-de-cotisations/la-contribution-solidarite-auton.html - - https://www.service-public.fr/professionnels-entreprises/vosdroits/F32872 + Fiche Urssaf: https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/les-taux-de-cotisations/la-contribution-solidarite-auton.html + Fiche service-public: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32872 contrat salarié . maladie . taux employeur: formule: @@ -3568,7 +3568,7 @@ contrat salarié . lodeom: contrat salarié . lodeom . zone un: titre: Zone géographique 1 (Guadeloupe, Martinique, La Réunion, Guyane) références: - - https://www.urssaf.fr/portail/home/outre-mer/employeur/exoneration-de-cotisations-di-1/employeurs-situes-en-guadeloupe.html + fiche Urssaf: https://www.urssaf.fr/portail/home/outre-mer/employeur/exoneration-de-cotisations-di-1/employeurs-situes-en-guadeloupe.html formule: une de ces conditions: - établissement . localisation . département = 'Guadeloupe' From d9d5761e41c94d424cc04ea750d492476113fced Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 11 May 2021 15:27:13 +0200 Subject: [PATCH 121/319] =?UTF-8?q?=F0=9F=90=9B=20Ne=20pas=20utiliser=20ES?= =?UTF-8?q?6=20dans=20les=20workers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Car la transpiation Babel est mal configurée. Ce commit contient un quickfix mais il serait mieux de configurer Webpack pour avoir de la transpilation babel / typescript pour les workers. --- mon-entreprise/source/components/SearchBar.tsx | 6 +++--- mon-entreprise/source/components/SearchBar.worker.js | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/mon-entreprise/source/components/SearchBar.tsx b/mon-entreprise/source/components/SearchBar.tsx index 4c0676965..63207facc 100644 --- a/mon-entreprise/source/components/SearchBar.tsx +++ b/mon-entreprise/source/components/SearchBar.tsx @@ -1,10 +1,10 @@ -import React, { useContext, useEffect, useMemo, useState } from 'react' +import React, { useEffect, useMemo, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { DottedName } from 'modele-social' -import Worker from 'worker-loader!./SearchBar.worker.js' +import Worker from 'worker-loader!./SearchBar.worker.js' // TODO: importing a worker this way doesn't work with babel transpilation https://github.com/betagouv/mon-entreprise/issues/1554 import RuleLink from './RuleLink' import './SearchBar.css' -import { EngineContext, useEngine } from './utils/EngineContext' +import { useEngine } from './utils/EngineContext' import { utils } from 'publicodes' const worker = new Worker() diff --git a/mon-entreprise/source/components/SearchBar.worker.js b/mon-entreprise/source/components/SearchBar.worker.js index 54e95fe8e..a7f9df895 100644 --- a/mon-entreprise/source/components/SearchBar.worker.js +++ b/mon-entreprise/source/components/SearchBar.worker.js @@ -24,11 +24,9 @@ onmessage = function (event) { }) if (event.data.input) { - let results = [ - ...fuse.search( - event.data.input + '|' + event.data.input.replace(/ /g, '|') - ), - ] + let results = fuse + .search(event.data.input + '|' + event.data.input.replace(/ /g, '|')) + .slice() postMessage(results) } } From ef4174407823bd1f791b7c829d76764e4d9db6ee Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 11 May 2021 12:20:22 +0200 Subject: [PATCH 122/319] =?UTF-8?q?=F0=9F=92=85=20upgrade=20publicodes-sit?= =?UTF-8?q?e=20syntax=20highlighter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publicodes/site/package.json | 1 + yarn.lock | 77 +++++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/publicodes/site/package.json b/publicodes/site/package.json index 19725b58b..a784ba05f 100644 --- a/publicodes/site/package.json +++ b/publicodes/site/package.json @@ -15,6 +15,7 @@ }, "dependencies": { "color-convert": "^2.0.1", + "react-syntax-highlighter": "^15.4.3", "styled-components": "^5.2.1" } } diff --git a/yarn.lock b/yarn.lock index 5c6ef5836..242a90581 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2302,6 +2302,13 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/hast@^2.0.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.1.tgz#b16872f2a6144c7025f296fb9636a667ebb79cd9" + integrity sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q== + dependencies: + "@types/unist" "*" + "@types/history@*": version "4.7.7" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.7.tgz#613957d900fab9ff84c8dfb24fa3eef0c2a40896" @@ -2589,6 +2596,11 @@ dependencies: source-map "^0.6.1" +"@types/unist@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + "@types/webpack-bundle-analyzer@^2.13.3": version "2.13.3" resolved "https://registry.yarnpkg.com/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.13.3.tgz#820c8f734e171f081cbf02d889b9cda687cc89dd" @@ -6427,7 +6439,7 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fault@^1.0.2: +fault@^1.0.0, fault@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== @@ -7198,6 +7210,17 @@ hastscript@^5.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -7208,6 +7231,11 @@ he@1.2.x, he@^1.1.0, he@^1.1.1: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +highlight.js@^10.4.1, highlight.js@~10.7.0: + version "10.7.2" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360" + integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg== + highlight.js@~9.13.0: version "9.13.1" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" @@ -9091,6 +9119,14 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +lowlight@^1.17.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" + integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + lowlight@~1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.11.0.tgz#1304d83005126d4e8b1dc0f07981e9b689ec2efc" @@ -10246,6 +10282,18 @@ parse-entities@^1.1.0, parse-entities@^1.1.2: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -10854,6 +10902,13 @@ prettycli@^1.4.3: dependencies: chalk "2.1.0" +prismjs@^1.22.0, prismjs@~1.23.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" + integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA== + optionalDependencies: + clipboard "^2.0.0" + prismjs@^1.8.4: version "1.21.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.21.0.tgz#36c086ec36b45319ec4218ee164c110f9fc015a3" @@ -11399,6 +11454,17 @@ react-syntax-highlighter@^10.1.1: prismjs "^1.8.4" refractor "^2.4.1" +react-syntax-highlighter@^15.4.3: + version "15.4.3" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.4.3.tgz#fffe3286677ac470b963b364916d16374996f3a6" + integrity sha512-TnhGgZKXr5o8a63uYdRTzeb8ijJOgRGe0qjrE0eK/gajtdyqnSO6LqB3vW16hHB0cFierYSoy/AOJw8z1Dui8g== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.22.0" + refractor "^3.2.0" + react-test-renderer@^16.0.0-0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1" @@ -11609,6 +11675,15 @@ refractor@^2.4.1: parse-entities "^1.1.2" prismjs "~1.17.0" +refractor@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.3.1.tgz#ebbc04b427ea81dc25ad333f7f67a0b5f4f0be3a" + integrity sha512-vaN6R56kLMuBszHSWlwTpcZ8KTMG6aUCok4GrxYDT20UIOXxOc5o6oDc8tNTzSlH3m2sI+Eu9Jo2kVdDcUTWYw== + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.23.0" + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" From c2789c8edd5de87cbc79c0e68441da93950bf2a2 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 10 May 2021 11:54:56 +0200 Subject: [PATCH 123/319] =?UTF-8?q?=F0=9F=9B=A1=EF=B8=8F=20Ajoute=20une=20?= =?UTF-8?q?politique=20de=20s=C3=A9curit=C3=A9=20de=20contenu=20HTTP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/components/Feedback/FeedbackForm.tsx | 5 ++++- netlify.toml | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/mon-entreprise/source/components/Feedback/FeedbackForm.tsx b/mon-entreprise/source/components/Feedback/FeedbackForm.tsx index 5ae914241..1d3df570a 100644 --- a/mon-entreprise/source/components/Feedback/FeedbackForm.tsx +++ b/mon-entreprise/source/components/Feedback/FeedbackForm.tsx @@ -1,11 +1,14 @@ import { ScrollToElement } from 'Components/utils/Scroll' -import React, { useEffect } from 'react' +import { useEffect } from 'react' import { useTranslation } from 'react-i18next' import { useLocation } from 'react-router' declare global { const $: any } + +// TODO: we could implement the form logic ourselves to avoid including +// https://mon-entreprise.zammad.com and https://code.jquery.com scripts export default function FeedbackForm() { // const tracker = useContext(TrackerContext) const pathname = useLocation().pathname diff --git a/netlify.toml b/netlify.toml index 3646d8b5e..94d8b8ecb 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,3 +1,10 @@ +[[headers]] +for = "/*" +[headers.values] +# TODO : self-host emojies to remove twemoji.maxcdn.com +# https://github.com/betagouv/mon-entreprise/issues/1219 +Content-Security-Policy = "default-src 'self' mon-entreprise.fr; style-src 'self' 'unsafe-inline' mon-entreprise.zammad.com; connect-src 'self' *.sentry.io raw.githubusercontent.com *.xiti.com mon-entreprise.zammad.com; form-action 'self' *.sibforms.com *.sentry.io mon-entreprise.zammad.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' entreprise.data.gouv.fr geo.api.gouv.fr *.xiti.com stonly.com code.jquery.com mon-entreprise.zammad.com; img-src 'self' data: https://twemoji.maxcdn.com *.xiti.com user-images.githubusercontent.com; frame-src 'self' https://www.youtube-nocookie.com https://codesandbox.io" + ############ # Redirects following architectural changes From d6eb2dd43d1c1b0744dc11f61e4eb5aca11c63a4 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 11 May 2021 15:52:00 +0200 Subject: [PATCH 124/319] =?UTF-8?q?=F0=9F=9B=A1=EF=B8=8F=20Politique=20de?= =?UTF-8?q?=20s=C3=A9curit=C3=A9=20en=20Report-Only?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pour remonter les éventuels problèmes de configuration sur Sentry sans provoquer d'erreurs pour les utilisateurs. --- netlify.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index 94d8b8ecb..5340e42b6 100644 --- a/netlify.toml +++ b/netlify.toml @@ -3,7 +3,10 @@ for = "/*" [headers.values] # TODO : self-host emojies to remove twemoji.maxcdn.com # https://github.com/betagouv/mon-entreprise/issues/1219 -Content-Security-Policy = "default-src 'self' mon-entreprise.fr; style-src 'self' 'unsafe-inline' mon-entreprise.zammad.com; connect-src 'self' *.sentry.io raw.githubusercontent.com *.xiti.com mon-entreprise.zammad.com; form-action 'self' *.sibforms.com *.sentry.io mon-entreprise.zammad.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' entreprise.data.gouv.fr geo.api.gouv.fr *.xiti.com stonly.com code.jquery.com mon-entreprise.zammad.com; img-src 'self' data: https://twemoji.maxcdn.com *.xiti.com user-images.githubusercontent.com; frame-src 'self' https://www.youtube-nocookie.com https://codesandbox.io" +# +# TODO : report-only for now to see if there are any errors in Senty +# https://github.com/betagouv/mon-entreprise/pull/1544#issuecomment-838511556 +Content-Security-Policy-Report-Only = "default-src 'self' mon-entreprise.fr; style-src 'self' 'unsafe-inline' mon-entreprise.zammad.com; connect-src 'self' *.sentry.io raw.githubusercontent.com *.xiti.com mon-entreprise.zammad.com; form-action 'self' *.sibforms.com *.sentry.io mon-entreprise.zammad.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' entreprise.data.gouv.fr geo.api.gouv.fr *.xiti.com stonly.com code.jquery.com mon-entreprise.zammad.com; img-src 'self' data: https://twemoji.maxcdn.com *.xiti.com user-images.githubusercontent.com; frame-src 'self' https://www.youtube-nocookie.com https://codesandbox.io" ############ # Redirects following architectural changes From 2bbf9112fe7e2a8356324a7f8c454c7a3fffc3fb Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 11 May 2021 13:06:00 +0200 Subject: [PATCH 125/319] =?UTF-8?q?=F0=9F=93=9D=20code=20typos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publicodes/docs/se-lancer.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/publicodes/docs/se-lancer.md b/publicodes/docs/se-lancer.md index dc3465fe9..49b124c47 100644 --- a/publicodes/docs/se-lancer.md +++ b/publicodes/docs/se-lancer.md @@ -176,17 +176,19 @@ $ npm install publicodes-react ``` ```jsx +import { BrowserRouter as Router } from 'react-router-dom' import { Documentation } from 'publicodes-react' function MonApp() { return ( - + {/* Composants de l'app */} - + ) } ``` From 4fcbda2648118fa72b0fbd4882087fba18379810 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 12 May 2021 12:58:51 +0200 Subject: [PATCH 126/319] =?UTF-8?q?=F0=9F=96=8B=EF=B8=8F=20Configure=20le?= =?UTF-8?q?=20bouton=20sponsors=20sur=20GitHub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..e88f81505 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ['https://mon-entreprise.fr/budget'] From 961b70733dd7820e9720610ea099b137685f0d2d Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 11 May 2021 21:29:53 +0200 Subject: [PATCH 127/319] =?UTF-8?q?=F0=9F=92=9A=20Remove=20PDF=20e2e=20tes?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cypress/integration/mon-entreprise/demande-mobilité.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js b/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js index 9d564756d..f8ef40e8b 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js @@ -99,7 +99,7 @@ describe( .next() .click() }) - it('should allow to download PDF', () => { + it.skip('should allow to download PDF', () => { cy.contains( 'Je certifie l’exactitude des informations communiquées ci-dessus' ).click() From 3c82147f4947d44a7e3afa934b3ef890cc8a423a Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Fri, 30 Apr 2021 11:22:51 +0200 Subject: [PATCH 128/319] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Latest=20GH=20acti?= =?UTF-8?q?ons=20node=20version=20pinned=20in=20.nvmrc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .node-version | 1 - .nvmrc | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 .node-version create mode 100644 .nvmrc diff --git a/.node-version b/.node-version deleted file mode 100644 index 66df3b7ab..000000000 --- a/.node-version +++ /dev/null @@ -1 +0,0 @@ -12.16.1 diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..946789e61 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +16.0.0 From 7c5de02d2d79b6c27c2d0d1c4f6b6bbc056adf48 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 12 May 2021 15:54:27 +0200 Subject: [PATCH 129/319] =?UTF-8?q?=F0=9F=90=9B=20Filtre=20les=20SIREN=20n?= =?UTF-8?q?on=20diffusibles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/actions/companyStatusActions.ts | 15 ++++++++++----- mon-entreprise/source/api/sirene.ts | 4 +++- .../source/components/CompanyDetails.tsx | 9 +++++++++ .../source/components/conversation/Question.tsx | 2 +- mon-entreprise/source/locales/ui-en.yaml | 1 + 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/mon-entreprise/source/actions/companyStatusActions.ts b/mon-entreprise/source/actions/companyStatusActions.ts index 717cc0401..eaad3363e 100644 --- a/mon-entreprise/source/actions/companyStatusActions.ts +++ b/mon-entreprise/source/actions/companyStatusActions.ts @@ -85,17 +85,22 @@ const fetchCommuneDetails = async function (codeCommune: string) { export const useSetEntreprise = () => { const dispatch = useDispatch() return async (siren: string) => { - dispatch(setSiren(siren)) const companyDetails = await fetchCompanyDetails(siren) + if (companyDetails === null) { + return + } + dispatch(setSiren(siren)) dispatch( setCompanyDetails( companyDetails.categorie_juridique, companyDetails.date_creation ) ) - const communeDetails: ApiCommuneJson = await fetchCommuneDetails( - companyDetails.etablissement_siege.code_commune - ) - dispatch(addCommuneDetails(communeDetails)) + if (companyDetails.etablissement_siege) { + const communeDetails: ApiCommuneJson = await fetchCommuneDetails( + companyDetails.etablissement_siege.code_commune + ) + dispatch(addCommuneDetails(communeDetails)) + } } } diff --git a/mon-entreprise/source/api/sirene.ts b/mon-entreprise/source/api/sirene.ts index f87127acf..f1fff6c40 100644 --- a/mon-entreprise/source/api/sirene.ts +++ b/mon-entreprise/source/api/sirene.ts @@ -2,11 +2,13 @@ const isSIREN = (input: string) => /^[\s]*([\d][\s]*){9}$/.exec(input) const isSIRET = (input: string) => /^[\s]*([\d][\s]*){14}$/.exec(input) export async function fetchCompanyDetails(siren: string) { + // Le paramètre `statut_diffusion` filtre les SIREN non diffusibles, cf. + // https://github.com/betagouv/mon-entreprise/issues/1399#issuecomment-770736525 const response = await fetch( `https://entreprise.data.gouv.fr/api/sirene/v3/unites_legales/${siren.replace( /[\s]/g, '' - )}` + )}?statut_diffusion=O` ) if (!response.ok) { return null diff --git a/mon-entreprise/source/components/CompanyDetails.tsx b/mon-entreprise/source/components/CompanyDetails.tsx index df0a310f1..7d23b3a3d 100644 --- a/mon-entreprise/source/components/CompanyDetails.tsx +++ b/mon-entreprise/source/components/CompanyDetails.tsx @@ -30,6 +30,15 @@ export default function CompanyDetails({ siren, denomination }: Etablissement) { fetchCompanyDetails(siren).then(setCompany) }, [siren]) + if (company === null) { + return ( +

    + {siren} + est un SIREN non diffusable +

    + ) + } + return ( <>

    diff --git a/mon-entreprise/source/components/conversation/Question.tsx b/mon-entreprise/source/components/conversation/Question.tsx index af72e267b..70bedbfb3 100644 --- a/mon-entreprise/source/components/conversation/Question.tsx +++ b/mon-entreprise/source/components/conversation/Question.tsx @@ -261,7 +261,7 @@ export function RadioLabelContent({ /> {icônes && <>{emoji(icônes)} } - {label} + {label} ) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index f0fdaca90..3cb42db84 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -655,6 +655,7 @@ entreprise: titre: Write the company's articles titre: The to-do list for creating your business titre2: Recommended before starting your activity +est un SIREN non diffusable: is a non-distributable SIREN examples: Examples expected: the expected result was facteur: multiplier From f444f26851963c24c9da33e357da19dde11a1553 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 12 May 2021 16:05:25 +0200 Subject: [PATCH 130/319] =?UTF-8?q?=F0=9F=90=9B=20D=C3=A9sactive=20Sentry?= =?UTF-8?q?=20sur=20les=20branches=20de=20preview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/sentry.ts | 31 +++++++++++++++++++++---------- mon-entreprise/source/utils.ts | 9 --------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/mon-entreprise/source/sentry.ts b/mon-entreprise/source/sentry.ts index 7d871ad03..abf7d7ce8 100644 --- a/mon-entreprise/source/sentry.ts +++ b/mon-entreprise/source/sentry.ts @@ -17,13 +17,24 @@ if (branch && branch !== 'master') { 'font-weight: bold; text-decoration: underline;' ) } -Sentry.init({ - dsn: - 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', - integrations: [new Integrations.BrowserTracing()], - release, - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for performance monitoring. - // We recommend adjusting this value in production - tracesSampleRate: 0.5, -}) + +// We use this variable to hide some features in production while keeping them +// in feature-branches. In case we do A/B testing with several branches served +// in production, we should add the public faced branch names in the test below. +// This is different from the process.env.NODE_ENV in that a feature branch may +// be build in production mode (with the NODE_ENV) but we may still want to show +// or hide some features. +export const productionMode = ['master', 'next'].includes(branch ?? '') + +if (productionMode) { + Sentry.init({ + dsn: + 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', + integrations: [new Integrations.BrowserTracing()], + release, + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + tracesSampleRate: 0.5, + }) +} diff --git a/mon-entreprise/source/utils.ts b/mon-entreprise/source/utils.ts index a1d268da1..5cc804c7d 100644 --- a/mon-entreprise/source/utils.ts +++ b/mon-entreprise/source/utils.ts @@ -27,15 +27,6 @@ export function inIframe(): boolean { } } -// We use this variable to hide some features in production while keeping them -// in feature-branches. In case we do A/B testing with several branches served -// in production, we should add the public faced branch names in the test below. -// This is different from the process.env.NODE_ENV in that a feature branch may -// be build in production mode (with the NODE_ENV) but we may still want to show -// or hide some features. -export const productionMode = - process.env.HEAD && ['master', 'next'].includes(process.env.HEAD) - export function softCatch( fn: (arg: ArgType) => ReturnType ): (arg: ArgType) => ReturnType | null { From 884c4239b0d40efe279c3fefa3e5a0634e70b2fd Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 20 Apr 2021 11:50:13 +0200 Subject: [PATCH 131/319] =?UTF-8?q?=F0=9F=93=9D=20Wording=20Madelin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 5 +++-- mon-entreprise/source/locales/rules-en.yaml | 18 ++++++------------ 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 70af4461e..3b1ac4a29 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -728,7 +728,8 @@ dirigeant . indépendant . cotisations et contributions . cotisations: dirigeant . indépendant . cotisations et contributions: description: | C'est le montant total dû par l'indépendant au titre des cotisations et - contributions obligatoires. + contributions obligatoires ainsi qu'au titre de ses cotisations facultatives + telles que les contrats Madelin. Ce montant inclut la réduction de cotisation "covid" en 2020. @@ -820,7 +821,7 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac . rev dirigeant . indépendant . contrats madelin: titre: Contrats Madelin - question: Avez-vous souscrit à des contrats de complémentaire privée dits ("contrats Madelins") + question: Avez-vous souscrit à des contrats de complémentaire privée dits "contrats Madelin" par défaut: non références: economie.gouv.fr: https://www.economie.gouv.fr/particuliers/reduction-impot-revenu-investissements-entreprise-pme-madelin diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index c67490026..6b5d7533e 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -6025,10 +6025,10 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . assiette: titre.fr: retraite de base dirigeant . indépendant . contrats madelin: question.en: - '[automatic] Have you subscribed to private complementary contracts - ("Madelins contracts")' + '[automatic] Have you subscribed to private supplementary insurance + contracts known as "Madelin contracts"?' question.fr: Avez-vous souscrit à des contrats de complémentaire privée dits - ("contrats Madelins") + "contrats Madelin" titre.en: Madelin Contracts titre.fr: Contrats Madelin dirigeant . indépendant . contrats madelin . montant: @@ -6093,17 +6093,11 @@ dirigeant . indépendant . contrats madelin . retraite . plafond: titre.en: ceiling titre.fr: plafond dirigeant . indépendant . cotisations et contributions: - description.en: > - [automatic] This is the total amount owed by the self-employed person for - compulsory contributions and - - contributions. - - - This amount includes the "covid" contribution reduction in 2020. + description.en: '[automatic] ' description.fr: | C'est le montant total dû par l'indépendant au titre des cotisations et - contributions obligatoires. + contributions obligatoires ainsi qu'au titre de ses cotisations facultatives + telles que les contrats Madelin. Ce montant inclut la réduction de cotisation "covid" en 2020. note.en: | From c5d80fae71507a9bd1bf3d676b0e018fba7a7c42 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 4 May 2021 19:40:10 +0200 Subject: [PATCH 132/319] =?UTF-8?q?=F0=9F=94=A5=20Publicodes=20static=20cy?= =?UTF-8?q?cles=20check=20using=20AST=20iterator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * AST API: add AST visitor & iterator * cycles detection: use AST iterator * remove dagrejs/graphlib * cycle extraction: smallest cycle & print in Graphviz dot format WARNING: a cycle still exists around `entreprise . chiffre d'affaires` see issue #1524 for a definitive fix. --- mon-entreprise/test/cycles.test.js | 39 ++- publicodes/core/package.json | 3 +- publicodes/core/source/AST/findCycles.ts | 330 ++++++++++++++++++ publicodes/core/source/AST/graph.ts | 193 +++++++--- publicodes/core/source/AST/index.ts | 98 ++++-- publicodes/core/source/AST/types.ts | 7 +- publicodes/core/source/index.ts | 2 +- publicodes/core/source/parsePublicodes.ts | 4 +- publicodes/core/source/replacement.tsx | 30 +- publicodes/core/source/rule.ts | 4 +- publicodes/core/source/types/dagres.d.ts | 8 - publicodes/core/test/cycles.test.js | 20 +- publicodes/core/test/mécanismes/remplace.yaml | 15 +- yarn.lock | 9 +- 14 files changed, 604 insertions(+), 158 deletions(-) create mode 100644 publicodes/core/source/AST/findCycles.ts delete mode 100644 publicodes/core/source/types/dagres.d.ts diff --git a/mon-entreprise/test/cycles.test.js b/mon-entreprise/test/cycles.test.js index 83ba3d309..58d56781f 100644 --- a/mon-entreprise/test/cycles.test.js +++ b/mon-entreprise/test/cycles.test.js @@ -4,31 +4,34 @@ import { cyclicDependencies } from '../../publicodes/core/source/AST/graph' describe('DottedNames graph', () => { it("shouldn't have cycles", () => { - let cyclesDependencies = cyclicDependencies(rules) + const [cyclesDependencies, dotGraphs] = cyclicDependencies(rules) + + const dotGraphsToLog = dotGraphs + .map( + (dotGraph) => + `🌀🌀🌀🌀🌀🌀🌀🌀🌀🌀🌀\n A cycle graph to stare at with Graphviz:\n${dotGraph}\n\n` + ) + .join('\n\n') expect( cyclesDependencies, - `\nThe cycles have been found in the rules dependencies graph.\nSee below for a representation of each cycle.\n⬇️ is a node of the cycle.\n\t- ${cyclesDependencies + `${dotGraphsToLog}\nAT LEAST the following cycles have been found in the rules dependencies graph.\nSee below for a representation of each cycle.\n⬇️ is a node of the cycle.\n\t- ${cyclesDependencies .map( (cycleDependencies, idx) => - '#' + - idx + - ':\n\t\t⬇️ ' + - cycleDependencies - // .map( - // ([ruleName, dependencies]) => - // ruleName + '\n\t\t\t↘️ ' + dependencies.join('\n\t\t\t↘️ ') - // ) - .join('\n\t\t⬇️ ') + '#' + idx + ':\n\t\t⬇️ ' + cycleDependencies.join('\n\t\t⬇️ ') ) .join('\n\t- ')}\n\n` + ).to.deep.equal([ + [ + "entreprise . chiffre d'affaires", + 'dirigeant . rémunération . impôt', + 'dirigeant . rémunération . imposable', + 'dirigeant . auto-entrepreneur . impôt . revenu imposable', + "entreprise . chiffre d'affaires . vente restauration hébergement", + ], + ]) + console.warn( + "[ WARNING ] A cycle still exists around `entreprise . chiffre d'affaires` see issue #1524 for a definitive fix." ) - .to.be.an('array') - .of.length(1) - - // Cycle doesn't occur in real life. - // ⬇️ entreprise . chiffre d'affaires - // ⬇️ dirigeant . rémunération totale - // ⬇️ entreprise . chiffre d'affaires }) }) diff --git a/publicodes/core/package.json b/publicodes/core/package.json index c1408a8db..646ca39b9 100644 --- a/publicodes/core/package.json +++ b/publicodes/core/package.json @@ -28,8 +28,7 @@ "chai": "^4.2.0", "intl": "^1.2.5", "typescript": "^4.2.4", - "dedent-js": "1.0.1", - "@dagrejs/graphlib": "^2.1.4" + "dedent-js": "1.0.1" }, "dependencies": { "moo": "^0.5.1", diff --git a/publicodes/core/source/AST/findCycles.ts b/publicodes/core/source/AST/findCycles.ts new file mode 100644 index 000000000..009f05bbd --- /dev/null +++ b/publicodes/core/source/AST/findCycles.ts @@ -0,0 +1,330 @@ +/* eslint-disable prefer-rest-params */ +/* eslint-disable @typescript-eslint/no-this-alias */ +// Adapted from https://github.com/dagrejs/graphlib (MIT license) +// and https://github.com/lodash/lodash (MIT license) + +// TODO: type this + +function has(obj, key) { + return obj != null && Object.prototype.hasOwnProperty.call(obj, key) +} +function constant(value) { + return function (...args) { + return value + } +} + +const DEFAULT_EDGE_NAME = '\x00' +const EDGE_KEY_DELIM = '\x01' + +const incrementOrInitEntry = (map, k) => { + if (map[k]) { + map[k]++ + } else { + map[k] = 1 + } +} + +const decrementOrRemoveEntry = (map, k) => { + if (!--map[k]) { + delete map[k] + } +} + +const edgeArgsToId = (isDirected, v_, w_, name) => { + let v = '' + v_ + let w = '' + w_ + if (!isDirected && v > w) { + const tmp = v + v = w + w = tmp + } + return ( + v + + EDGE_KEY_DELIM + + w + + EDGE_KEY_DELIM + + (name === undefined ? DEFAULT_EDGE_NAME : name) + ) +} + +const edgeArgsToObj = (isDirected, v_, w_, name) => { + let v = '' + v_ + let w = '' + w_ + if (!isDirected && v > w) { + const tmp = v + v = w + w = tmp + } + const edgeObj: any = { v: v, w: w } + if (name) { + edgeObj.name = name + } + return edgeObj +} + +const edgeObjToId = (isDirected, edgeObj) => { + return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name) +} +export class Graph { + private _nodeCount = 0 + private _edgeCount = 0 + + private _isDirected: any + + private _label: undefined + private _defaultNodeLabelFn: (...args: any[]) => any + private _defaultEdgeLabelFn: (...args: any[]) => any + private _nodes: Record + private _in: Record + private _preds: Record> + private _out: Record> + private _sucs: Record> + private _edgeObjs: Record + private _edgeLabels: Record + + constructor(opts: Record = {}) { + this._isDirected = has(opts, 'directed') ? opts.directed : true + + // Label for the graph itself + this._label = undefined + + // Defaults to be set when creating a new node + this._defaultNodeLabelFn = constant(undefined) + + // Defaults to be set when creating a new edge + this._defaultEdgeLabelFn = constant(undefined) + + // v -> label + this._nodes = {} + + // v -> edgeObj + this._in = {} + + // u -> v -> Number + this._preds = {} + + // v -> edgeObj + this._out = {} as Record> + + // v -> w -> Number + this._sucs = {} + + // e -> edgeObj + this._edgeObjs = {} + + // e -> label + this._edgeLabels = {} + } + + /* === Graph functions ========= */ + + isDirected() { + return this._isDirected + } + setGraph(label) { + this._label = label + return this + } + graph() { + return this._label + } + + /* === Node functions ========== */ + + nodeCount() { + return this._nodeCount + } + nodes() { + return Object.keys(this._nodes) + } + setNode(v, value: any = undefined) { + if (has(this._nodes, v)) { + if (arguments.length > 1) { + this._nodes[v] = value + } + return this + } + + this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v) + this._in[v] = {} + this._preds[v] = {} + this._out[v] = {} + this._sucs[v] = {} + ++this._nodeCount + return this + } + setNodes(vs, value) { + vs.forEach((v) => { + if (value !== undefined) { + this.setNode(v, value) + } else { + this.setNode(v) + } + }) + return this + } + node(v) { + return this._nodes[v] + } + hasNode(v) { + return has(this._nodes, v) + } + successors(v) { + const sucsV = this._sucs[v] + if (sucsV) { + return Object.keys(sucsV) + } + } + + /* === Edge functions ========== */ + + edgeCount() { + return this._edgeCount + } + edges() { + return Object.values(this._edgeObjs) + } + setEdge( + v: string, + w: string, + value: any = undefined, + name: string | undefined = undefined + ) { + v = '' + v + w = '' + w + + const e = edgeArgsToId(this._isDirected, v, w, name) + if (has(this._edgeLabels, e)) { + if (value !== undefined) { + this._edgeLabels[e] = value + } + return this + } + + // It didn't exist, so we need to create it. + // First ensure the nodes exist. + this.setNode(v) + this.setNode(w) + + this._edgeLabels[e] = + value !== undefined ? value : this._defaultEdgeLabelFn(v, w, name) + + const edgeObj = edgeArgsToObj(this._isDirected, v, w, name) + // Ensure we add undirected edges in a consistent way. + v = edgeObj.v + w = edgeObj.w + + Object.freeze(edgeObj) + this._edgeObjs[e] = edgeObj + incrementOrInitEntry(this._preds[w], v) + incrementOrInitEntry(this._sucs[v], w) + this._in[w][e] = edgeObj + this._out[v][e] = edgeObj + this._edgeCount++ + return this + } + + edge(v, w, name) { + const e = + arguments.length === 1 + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name) + return this._edgeLabels[e] + } + + hasEdge(v, w, name) { + const e = + arguments.length === 1 + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name) + return has(this._edgeLabels, e) + } + + removeEdge(v, w, name) { + const e = + arguments.length === 1 + ? edgeObjToId(this._isDirected, arguments[0]) + : edgeArgsToId(this._isDirected, v, w, name) + const edge = this._edgeObjs[e] + if (edge) { + v = edge.v + w = edge.w + delete this._edgeLabels[e] + delete this._edgeObjs[e] + decrementOrRemoveEntry(this._preds[w], v) + decrementOrRemoveEntry(this._sucs[v], w) + delete this._in[w][e] + delete this._out[v][e] + this._edgeCount-- + } + return this + } + + outEdges(v: string, w: string | undefined = undefined) { + const outV = this._out[v] + if (outV) { + const edges: any = Object.values(outV) + if (w === undefined) { + return edges + } + return edges.filter(function (edge) { + return edge.w === w + }) + } + } +} + +/** Cycles stuff **/ + +function tarjan(graph) { + let index = 0 + const stack: any[] = [] + const visited = {} // node id -> { onStack, lowlink, index } + const results: any[] = [] + + function dfs(v) { + const entry = (visited[v] = { + onStack: true, + lowlink: index, + index: index++, + }) + stack.push(v) + + graph.successors(v).forEach(function (w) { + if (!Object.prototype.hasOwnProperty.call(visited, w)) { + dfs(w) + entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink) + } else if (visited[w].onStack) { + entry.lowlink = Math.min(entry.lowlink, visited[w].index) + } + }) + + if (entry.lowlink === entry.index) { + const cmpt: any[] = [] + let w + do { + w = stack.pop() + visited[w].onStack = false + cmpt.push(w) + } while (v !== w) + results.push(cmpt) + } + } + + graph.nodes().forEach(function (v) { + if (!Object.prototype.hasOwnProperty.call(visited, v)) { + dfs(v) + } + }) + + return results +} + +export function findCycles(graph): string[][] { + return tarjan(graph).filter(function (cmpt) { + return ( + cmpt.length > 1 || (cmpt.length === 1 && graph.hasEdge(cmpt[0], cmpt[0])) + ) + }) +} diff --git a/publicodes/core/source/AST/graph.ts b/publicodes/core/source/AST/graph.ts index 5429346ae..97a078afc 100644 --- a/publicodes/core/source/AST/graph.ts +++ b/publicodes/core/source/AST/graph.ts @@ -1,10 +1,11 @@ -import graphlib from '@dagrejs/graphlib' +import { ASTNode } from './types' import parsePublicodes from '../parsePublicodes' import { RuleNode } from '../rule' -import { reduceAST } from './index' -type RulesDependencies = Array<[string, Array]> -type GraphCycles = Array> -type GraphCyclesWithDependencies = Array +import { getChildrenNodes, iterAST } from './index' +import { findCycles, Graph } from './findCycles' + +type RulesDependencies = [string, string[]][] +type GraphCycles = string[][] function buildRulesDependencies( parsedRules: Record @@ -12,42 +13,56 @@ function buildRulesDependencies( const uniq = (arr: Array): Array => [...new Set(arr)] return Object.entries(parsedRules).map(([name, node]) => [ name, - uniq(buildRuleDependancies(node)), + uniq(getDependencies(node)), ]) } -function buildRuleDependancies(rule: RuleNode): Array { - return reduceAST( - (acc, node, fn) => { - switch (node.nodeKind) { - case 'replacementRule': - case 'inversion': - case 'une possibilité': - return acc - case 'recalcul': - return node.explanation.amendedSituation.flatMap((s) => fn(s[1])) - case 'reference': - return [...acc, node.dottedName as string] - case 'résoudre référence circulaire': - return [] - case 'rule': - // Cycle from parent dependancies are ignored at runtime, - // so we don' detect them statically - return fn(rule.explanation.valeur) - case 'variations': - // a LOT of cycles with replacements... we disactivate them until we see clearer, - if (node.rawNode && typeof node.rawNode === 'string') { - return [...acc, node.rawNode] - } - } - }, - [], - rule - ) +function getReferenceName(node: ASTNode): string | undefined { + switch (node.nodeKind) { + case 'reference': + return node.dottedName as string + } +} +/** + * Recursively selects the children nodes that have the ability to include a reference + * to a rule. + */ +function getReferencingDescendants(node: ASTNode): ASTNode[] { + return iterAST((node) => { + switch (node.nodeKind) { + case 'replacementRule': + case 'inversion': + case 'une possibilité': + case 'reference': + case 'résoudre référence circulaire': + // "résoudre référence circulaire" is a chained mechanism. When returning `[]` we prevent + // iteration inside of the rule's `valeur`, meaning the rule returns no descendants at all. + return [] + case 'recalcul': + return node.explanation.amendedSituation.map(([, astNode]) => astNode) + case 'rule': + return [node.explanation.valeur] + case 'variations': + if (node.visualisationKind === 'replacement') { + return node.explanation + .filter(({ condition }) => condition.isDefault) + .map(({ consequence }) => consequence) + .filter((consequence) => consequence.nodeKind === 'reference') + } + } + return getChildrenNodes(node) + }, node) +} +function getDependencies(node: ASTNode): string[] { + const descendantNodes = Array.from(getReferencingDescendants(node)) + const descendantsReferences = descendantNodes + .map(getReferenceName) + .filter((refName): refName is string => refName !== undefined) + return descendantsReferences } -function buildDependenciesGraph(rulesDeps: RulesDependencies): graphlib.Graph { - const g = new (graphlib as any).Graph() +function buildDependenciesGraph(rulesDeps: RulesDependencies) { + const g = new Graph() rulesDeps.forEach(([ruleDottedName, dependencies]) => { dependencies.forEach((depDottedName) => { g.setEdge(ruleDottedName, depDottedName) @@ -62,40 +77,106 @@ export function cyclesInDependenciesGraph(rawRules: RawRules): GraphCycles { const parsedRules = parsePublicodes(rawRules) const rulesDependencies = buildRulesDependencies(parsedRules) const dependenciesGraph = buildDependenciesGraph(rulesDependencies) - const cycles = (graphlib as any).alg.findCycles(dependenciesGraph) + const cycles = findCycles(dependenciesGraph) return cycles.map((c) => c.reverse()) } +/** + * Make the cycle as small as possible. + */ +export function squashCycle( + rulesDependenciesObject: Record, + cycle: string[] +): string[] { + function* loopFrom(i: number) { + let j = i + while (true) { + yield cycle[j++ % cycle.length] + } + } + const smallCycleStartingAt: string[][] = [] + for (let i = 0; i < cycle.length; i++) { + const smallCycle: string[] = [] + let previousVertex: string | undefined = undefined + for (const vertex of loopFrom(i)) { + if (previousVertex === undefined) { + smallCycle.push(vertex) + previousVertex = vertex + } else if (rulesDependenciesObject[previousVertex].includes(vertex)) { + if (smallCycle.includes(vertex)) { + smallCycle.splice(0, smallCycle.lastIndexOf(vertex)) + break + } + smallCycle.push(vertex) + previousVertex = vertex + } + } + smallCycleStartingAt.push(smallCycle) + } + + const smallest = smallCycleStartingAt.reduce((minCycle, someCycle) => + someCycle.length > minCycle.length ? minCycle : someCycle + ) + return smallest +} + /** * This function is useful so as to print the dependencies at each node of the * cycle. - * ⚠️ Indeed, the graphlib.findCycles function returns the cycle found using the + * ⚠️ Indeed, the findCycles function returns the cycle found using the * Tarjan method, which is **not necessarily the smallest cycle**. However, the - * smallest cycle would be the most legibe one… + * smallest cycle is more readable. */ export function cyclicDependencies( rawRules: RawRules -): GraphCyclesWithDependencies { +): [GraphCycles, string[]] { const parsedRules = parsePublicodes(rawRules) const rulesDependencies = buildRulesDependencies(parsedRules) const dependenciesGraph = buildDependenciesGraph(rulesDependencies) - const cycles = (graphlib as any).alg.findCycles(dependenciesGraph) - const rulesDependenciesObject = Object.fromEntries(rulesDependencies) + const cycles = findCycles(dependenciesGraph) - return cycles.map((cycle) => { - const c = cycle.reverse() + const reversedCycles = cycles.map((c) => c.reverse()) + const rulesDependenciesObject = Object.fromEntries( + rulesDependencies + ) as Record + const smallCycles = reversedCycles.map((cycle) => + squashCycle(rulesDependenciesObject, cycle) + ) - return [...c, c[0]].reduce((acc, current) => { - const previous = acc.slice(-1)[0] - if (previous && !rulesDependenciesObject[previous].includes(current)) { - return acc - } - return [...acc, current] - }, []) - // .map(name => [ - // name, - // rulesDependenciesObject[name].filter(name => c.includes(name)) - // ]) - }) + const printableStronglyConnectedComponents = reversedCycles.map((c, i) => + printInDotFormat(dependenciesGraph, c, smallCycles[i]) + ) + + return [smallCycles, printableStronglyConnectedComponents] +} + +/** + * Is edge in the cycle, in the same order? + */ +const edgeIsInCycle = (cycle: string[], v: string, w: string): boolean => { + for (let i = 0; i < cycle.length + 1; i++) { + if (v === cycle[i] && w === cycle[(i + 1) % cycle.length]) return true + } + return false +} + +export function printInDotFormat( + dependenciesGraph: Graph, + cycle: string[], + subCycleToHighlight: string[] +) { + const edgesSet = new Set() + cycle.forEach((vertex) => { + dependenciesGraph + .outEdges(vertex) + .filter(({ w }) => cycle.includes(w)) + .forEach(({ v, w }) => { + edgesSet.add( + `"${v}" -> "${w}"` + + (edgeIsInCycle(subCycleToHighlight, v, w) ? ' [color=red]' : '') + ) + }) + }) + return `digraph Cycle {\n\t${[...edgesSet].join(';\n\t')};\n}` } diff --git a/publicodes/core/source/AST/index.ts b/publicodes/core/source/AST/index.ts index f9f42880a..bbbdcf15f 100644 --- a/publicodes/core/source/AST/index.ts +++ b/publicodes/core/source/AST/index.ts @@ -2,9 +2,14 @@ import { InternalError } from '../error' import { TrancheNodes } from '../mecanisms/trancheUtils' import { ReplacementRule } from '../replacement' import { RuleNode } from '../rule' -import { ASTNode, NodeKind, TraverseFunction } from './types' +import { + ASTNode, + ASTVisitor, + ASTTransformer, + NodeKind, + TraverseFunction, +} from './types' -type TransformASTFunction = (n: ASTNode) => ASTNode /** This function creates a transormation of the AST from on a simpler callback function `fn` @@ -20,42 +25,68 @@ type TransformASTFunction = (n: ASTNode) => ASTNode by using the function passed as second argument. The returned value will be the transformed version of the node. */ -export function transformAST( - fn: ( - node: ASTNode, - updateFn: TransformASTFunction - ) => ASTNode | undefined | false -): TransformASTFunction { - function traverseFn(node: ASTNode) { - const updatedNode = fn(node, traverseFn) +export function makeASTTransformer( + fn: (node: ASTNode, transform: ASTTransformer) => ASTNode | undefined | false +): ASTTransformer { + function transform(node: ASTNode): ASTNode { + const updatedNode = fn(node, transform) if (updatedNode === false) { return node } if (updatedNode === undefined) { - return traverseASTNode(traverseFn, node) + return traverseASTNode(transform, node) } return updatedNode } - return traverseFn + return transform +} +export function makeASTVisitor( + fn: (node: ASTNode, visit: ASTVisitor) => 'continue' | 'stop' +): ASTVisitor { + function visit(node: ASTNode) { + switch (fn(node, visit)) { + case 'continue': + traverseASTNode(transformizedVisit, node) + return + case 'stop': + return + } + } + const transformizedVisit: ASTTransformer = (node) => { + visit(node) + return node + } + return visit +} + +// Can be made more flexible with other args like a filter function (ASTNode -> Bool). +export function iterAST( + childrenSelector: (node: ASTNode) => Iterable, + node: ASTNode +): ASTNode[] { + function* iterate(node: ASTNode): IterableIterator { + yield node + const selectedSubNodes = childrenSelector(node) + for (const subNode of selectedSubNodes) yield* iterate(subNode) + } + return [...iterate(node)] } /** - This function allows to construct a specific value while exploring the AST with - a simple reducing function as argument. - - `fn` will be called with the currently reduced value `acc` and the current node of the AST - - - The outcome of the callback function has an influence on the exploration of the AST : - - `undefined`, the exploration continues further down and all the child are reduced - successively to a single value - - `T`, the reduced value - - `reduceFn` : It is possible to specifically use the reduced value of a child - by using the function passed as second argument. The returned value will be the reduced version - of the node - */ - + * This function allows to construct a specific value while exploring the AST with + * a simple reducing function as argument. + * + * `fn` will be called with the currently reduced value `acc` and the current node of the AST + * + * If the callback function returns: + * - `undefined`, the exploration continues further down and all the children are reduced + * successively to a single value + * - `T`, the reduced value is returned + * + * `reduceFn` : It is possible to specifically use the reduced value of a child + * by using the function passed as second argument. The returned value will be the reduced version + * of the node + */ export function reduceAST( fn: (acc: T, n: ASTNode, reduceFn: (n: ASTNode) => T) => T | undefined, start: T, @@ -64,14 +95,14 @@ export function reduceAST( function traverseFn(acc: T, node: ASTNode): T { const result = fn(acc, node, traverseFn.bind(null, start)) if (result === undefined) { - return gatherNodes(node).reduce(traverseFn, acc) + return getChildrenNodes(node).reduce(traverseFn, acc) } return result } return traverseFn(start, node) } -function gatherNodes(node: ASTNode): ASTNode[] { +export function getChildrenNodes(node: ASTNode): ASTNode[] { const nodes: ASTNode[] = [] traverseASTNode((node) => { nodes.push(node) @@ -81,7 +112,7 @@ function gatherNodes(node: ASTNode): ASTNode[] { } export function traverseParsedRules( - fn: (n: ASTNode) => ASTNode, + fn: ASTTransformer, parsedRules: Record ): Record { return Object.fromEntries( @@ -89,7 +120,10 @@ export function traverseParsedRules( ) as Record } -const traverseASTNode: TraverseFunction = (fn, node) => { +/** + * Apply a transform function on children. Not recursive. + */ +export const traverseASTNode: TraverseFunction = (fn, node) => { switch (node.nodeKind) { case 'rule': return traverseRuleNode(fn, node) diff --git a/publicodes/core/source/AST/types.ts b/publicodes/core/source/AST/types.ts index e732c828a..66886e52a 100644 --- a/publicodes/core/source/AST/types.ts +++ b/publicodes/core/source/AST/types.ts @@ -85,10 +85,13 @@ export type MecanismNode = Exclude< ASTNode, RuleNode | ConstantNode | ReferenceNode > -export type NodeKind = ASTNode['nodeKind'] +export type ASTTransformer = (n: ASTNode) => ASTNode +export type ASTVisitor = (n: ASTNode) => void + +export type NodeKind = ASTNode['nodeKind'] export type TraverseFunction = ( - fn: (n: ASTNode) => ASTNode, + fn: ASTTransformer, node: ASTNode & { nodeKind: Kind } ) => ASTNode & { nodeKind: Kind } diff --git a/publicodes/core/source/index.ts b/publicodes/core/source/index.ts index 7098a5cc2..807f83643 100644 --- a/publicodes/core/source/index.ts +++ b/publicodes/core/source/index.ts @@ -40,7 +40,7 @@ export type EvaluationOptions = Partial<{ unit: string }> -export { reduceAST, transformAST } from './AST/index' +export { reduceAST, makeASTTransformer as transformAST } from './AST/index' export { Evaluation, Unit } from './AST/types' export { capitalise0, formatValue } from './format' export { simplifyNodeUnit } from './nodeUnits' diff --git a/publicodes/core/source/parsePublicodes.ts b/publicodes/core/source/parsePublicodes.ts index 08d7e0a61..f90f80b6d 100644 --- a/publicodes/core/source/parsePublicodes.ts +++ b/publicodes/core/source/parsePublicodes.ts @@ -1,6 +1,6 @@ import yaml from 'yaml' import { ParsedRules, Logger } from '.' -import { transformAST, traverseParsedRules } from './AST' +import { makeASTTransformer, traverseParsedRules } from './AST' import parse from './parse' import { getReplacements, inlineReplacements } from './replacement' import { Rule, RuleNode } from './rule' @@ -105,7 +105,7 @@ function transpileRef(object: Record | string | Array) { } export const disambiguateReference = (parsedRules: Record) => - transformAST((node) => { + makeASTTransformer((node) => { if (node.nodeKind === 'reference') { const dottedName = disambiguateRuleReference( parsedRules, diff --git a/publicodes/core/source/replacement.tsx b/publicodes/core/source/replacement.tsx index 04dcac90c..e781a0eaf 100644 --- a/publicodes/core/source/replacement.tsx +++ b/publicodes/core/source/replacement.tsx @@ -1,5 +1,5 @@ import { Logger } from '.' -import { transformAST } from './AST' +import { makeASTTransformer } from './AST' import { ASTNode } from './AST/types' import { InternalError, warning } from './error' import { defaultNode } from './evaluation' @@ -25,7 +25,7 @@ export type ReplacementRule = { // // The implementation works by first attributing an identifier for each // replacementRule. We then use this identifier to create a cache key that -// represent the combinaison of applicables replacements for a given reference. +// represents the combinaison of applicables replacements for a given reference. // For example if replacements 12, 13 et 643 are applicable we use the key // `12-13-643` as the cache identifier in the `inlineReplacements` function. let remplacementRuleId = 0 @@ -104,31 +104,31 @@ export function inlineReplacements( replacements: Record>, logger: Logger ): (n: ASTNode) => ASTNode { - return transformAST((n, fn) => { + return makeASTTransformer((node, transform) => { if ( - n.nodeKind === 'replacementRule' || - n.nodeKind === 'inversion' || - n.nodeKind === 'une possibilité' + node.nodeKind === 'replacementRule' || + node.nodeKind === 'inversion' || + node.nodeKind === 'une possibilité' ) { return false } - if (n.nodeKind === 'recalcul') { + if (node.nodeKind === 'recalcul') { // We don't replace references in recalcul keys return { - ...n, + ...node, explanation: { - recalcul: fn(n.explanation.recalcul), - amendedSituation: n.explanation.amendedSituation.map( - ([name, value]) => [name, fn(value)] + recalcul: transform(node.explanation.recalcul), + amendedSituation: node.explanation.amendedSituation.map( + ([name, value]) => [name, transform(value)] ), }, } } - if (n.nodeKind === 'reference') { - if (!n.dottedName) { - throw new InternalError(n) + if (node.nodeKind === 'reference') { + if (!node.dottedName) { + throw new InternalError(node) } - return replace(n, replacements[n.dottedName] ?? [], logger) + return replace(node, replacements[node.dottedName] ?? [], logger) } }) } diff --git a/publicodes/core/source/rule.ts b/publicodes/core/source/rule.ts index 134ff24b3..cf16a7425 100644 --- a/publicodes/core/source/rule.ts +++ b/publicodes/core/source/rule.ts @@ -137,7 +137,9 @@ registerEvaluationFunction('rule', function evaluate(node) { if ( this.cache._meta.evaluationRuleStack.filter( (dottedName) => dottedName === node.dottedName - ).length > 15 // I don't know why this magic number, but below, cycle are detected "too early", which leads to blank value in brut-net simulator + ).length > 15 + // I don't know why this magic number, but below, cycle are + // detected "too early", which leads to blank value in brut-net simulator ) { warning( this.options.logger, diff --git a/publicodes/core/source/types/dagres.d.ts b/publicodes/core/source/types/dagres.d.ts deleted file mode 100644 index 31c1d22e4..000000000 --- a/publicodes/core/source/types/dagres.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare module '@dagrejs/graphlib' { - export interface Graph { - setEdge(n1: string, n2: string): void - } - export type alg = { - findCycles: (g: Graph) => Array> - } -} diff --git a/publicodes/core/test/cycles.test.js b/publicodes/core/test/cycles.test.js index 98e09c009..f7e475c33 100644 --- a/publicodes/core/test/cycles.test.js +++ b/publicodes/core/test/cycles.test.js @@ -27,7 +27,7 @@ describe('Cyclic dependencies detectron 3000 ™', () => { expect(cycles).to.deep.equal([['a', 'b', 'c', 'd']]) }) - it('should not detect formule cycles due to parent dependancy', () => { + it('should not detect formule cycles due to parent dependency', () => { const rules = dedent` a: formule: b + 1 @@ -38,17 +38,29 @@ describe('Cyclic dependencies detectron 3000 ™', () => { expect(cycles).to.deep.equal([]) }) - it('should not detect cycles due to replacement', () => { + it('should not detect cycles due to replacements', () => { const rules = dedent` a: formule: b + 1 a . b: formule: 3 - a . c: + a . c: remplace: b formule: a ` const cycles = cyclesInDependenciesGraph(rules) - expect(cycles).to.deep.equal([['a', 'a . c']]) + expect(cycles).to.deep.equal([]) + }) + + it('should not detect cycles when résoudre référence circulaire', () => { + const rules = dedent` + fx: + 200 - x + x: + résoudre la référence circulaire: oui + valeur: fx + ` + const cycles = cyclesInDependenciesGraph(rules) + expect(cycles).to.deep.equal([]) }) }) diff --git a/publicodes/core/test/mécanismes/remplace.yaml b/publicodes/core/test/mécanismes/remplace.yaml index 7b2b8f000..4c43ea2da 100644 --- a/publicodes/core/test/mécanismes/remplace.yaml +++ b/publicodes/core/test/mécanismes/remplace.yaml @@ -113,8 +113,8 @@ exemple5: par: 10€ - règle: cotisations . maladie par: 0 - -remplacements : + +remplacements: formule: cotisations exemples: - nom: sans boucle infinie si il n'y a pas de dépendances cycliques @@ -125,8 +125,8 @@ remplacements : situation: exemple2: oui valeur attendue: 250 - - nom: avec plusieurs remplacements existant pour une même variables - # ici, le remplacement de l'exemple 2 doit être effectué car plus précis que celui de l'exemple 1 + - nom: avec plusieurs remplacements existant pour une même variables + # ici, le remplacement de l'exemple 2 doit être effectué car plus précis que celui de l'exemple 1 situation: exemple1: oui exemple2: oui @@ -149,8 +149,6 @@ remplacements : exemple5: oui valeur attendue: 110 - - A: formule: 1 B: @@ -181,19 +179,18 @@ remplacement non applicable car branche desactivée: exemples: - valeur attendue: 1 -# Remplacement non effectué dans la formule du remplacement +# Remplacement effectué dans la bonne variable espace: oui espace . valeur: formule: 20 espace . remplacement: remplace: valeur formule: valeur + 10 -test remplacement non effectué dans la formule du remplacement: +test remplacement effectué dans la variable à remplacer: formule: espace . valeur exemples: - valeur attendue: 30 - frais de repas: formule: 5 €/repas diff --git a/yarn.lock b/yarn.lock index 242a90581..dac84ed1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1666,13 +1666,6 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@dagrejs/graphlib@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@dagrejs/graphlib/-/graphlib-2.1.4.tgz#86c70e4f073844a2f4ada254c8c7b88a6bdacdb1" - integrity sha512-QCg9sL4uhjn468FDEsb/S9hS2xUZSrv/+dApb1Ze5VKO96pTXKNJZ6MGhIpgWkc1TVhbVGH9/7rq/Mf8/jWicw== - dependencies: - lodash "^4.11.1" - "@emotion/is-prop-valid@^0.8.8": version "0.8.8" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" @@ -9073,7 +9066,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.1, lodash@^4.11.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@~4.17.4: +lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@~4.17.4: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== From f1afa5a3c3075b4ca71f0157df2baad8a71ad8df Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Sat, 15 May 2021 19:34:08 +0200 Subject: [PATCH 133/319] =?UTF-8?q?=F0=9F=92=9A=20Skip=20API=20SIRENE=20e2?= =?UTF-8?q?e=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/cypress/integration/mon-entreprise/gérer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js index 348643e12..e1ec6f40d 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js @@ -6,7 +6,7 @@ describe('Manage page test', function () { it('should not crash', function () { cy.contains(fr ? 'Gérer mon activité' : 'Manage my business') }) - it('should allow to retrieve company and show link corresponding to the legal status', function () { + it.skip('should allow to retrieve company and show link corresponding to the legal status', function () { cy.get('button.cta').click() cy.get('input').first().type('menoz') cy.contains('834364291').click() @@ -15,7 +15,7 @@ describe('Manage page test', function () { expect(loc.pathname).to.match(fr ? /dirigeant-sasu$/ : /sasu-chairman$/) }) }) - it('should allow auto entrepreneur to access the corresponding income simulator', function () { + it.skip('should allow auto entrepreneur to access the corresponding income simulator', function () { cy.get('button.cta').click() cy.get('input').first().type('johan girod') cy.contains('MONSIEUR').click() From 7fde5bf8c1a1e645f19e05f92f8d1912668d4057 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Sat, 15 May 2021 19:03:43 +0200 Subject: [PATCH 134/319] =?UTF-8?q?=E2=9C=85=20Make=20Switch=20to=20Englis?= =?UTF-8?q?h=20work=20in=20development?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes an e2e test that was failing when in development. --- .../source/components/layout/Footer/Footer.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/mon-entreprise/source/components/layout/Footer/Footer.tsx b/mon-entreprise/source/components/layout/Footer/Footer.tsx index 1cd0da9b1..49727e297 100644 --- a/mon-entreprise/source/components/layout/Footer/Footer.tsx +++ b/mon-entreprise/source/components/layout/Footer/Footer.tsx @@ -39,14 +39,16 @@ export default function Footer() { const sitePaths = useContext(SitePathsContext) const showFeedback = useShowFeedback() const language = useTranslation().i18n.language as 'fr' | 'en' - const hrefLink = - hrefLangLink[language][ - decodeURIComponent( - (process.env.NODE_ENV === 'production' - ? window.location.protocol + '//' + window.location.host - : '') + window.location.pathname - ).replace(/\/$/, '') - ] || [] + + const encodedUri = + (process.env.NODE_ENV === 'production' || + process.env.NODE_ENV === 'development' + ? window.location.protocol + '//' + window.location.host + : '') + window.location.pathname + const uri = decodeURIComponent(encodedUri).replace(/\/$/, '') + + const hrefLink = hrefLangLink[language][uri] || [] + return (
    From 8fec6395f12a8409bf9e93647a7534ca482632d0 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 17 May 2021 16:29:32 +0200 Subject: [PATCH 135/319] =?UTF-8?q?:art:=20Fix=20le=20pr=C3=A9rendu=20avec?= =?UTF-8?q?=20styled-component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jusqu'alors les styled-component n'étaient pas pris en compte dans le prérendu, ce qui aboutissait à un CLS très important sur nos pages. C'est maintenant réparé --- mon-entreprise/index.html | 16 +++++++++++++++- mon-entreprise/webpack.prod.js | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mon-entreprise/index.html b/mon-entreprise/index.html index 7d7052a35..4606eccde 100644 --- a/mon-entreprise/index.html +++ b/mon-entreprise/index.html @@ -208,7 +208,21 @@ var b = document.documentElement b.setAttribute('data-useragent', navigator.userAgent) - +
    diff --git a/mon-entreprise/webpack.prod.js b/mon-entreprise/webpack.prod.js index 1cbea8d37..790762f0e 100644 --- a/mon-entreprise/webpack.prod.js +++ b/mon-entreprise/webpack.prod.js @@ -21,6 +21,7 @@ const prerenderConfig = () => ({ staticDir: path.resolve('dist'), renderer: new Renderer({ renderAfterTime: 5000, + inject: true, skipThirdPartyRequests: true, }), postProcess: (context) => { From 97b385a01f480b1db67d3f97735e250ec091a1cc Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 17 May 2021 17:34:21 +0200 Subject: [PATCH 136/319] =?UTF-8?q?:wheelchair:=20ajoute=20un=20attribut?= =?UTF-8?q?=20alt=20sur=20l'image=20de=20la=20description=20salari=C3=A9'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/locales/ui-en.yaml | 3 +++ mon-entreprise/source/pages/Simulateurs/metadata.tsx | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 3cb42db84..90b51bdcf 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1270,6 +1270,9 @@ pages: shortname: Midwife title: Income simulator for private midwives salarié: + alt-image1: Net salary (received by the employee) = Gross salary (written in the + employment contract) - employee contributions (pension, social security, + etc.) explication seo: <0>Calculate your net salary<1>During the job interview, the employer usually offers a "gross" remuneration. The announced amount thus includes employee contributions, which are used to finance the diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index d63f61550..5db9ca817 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -157,6 +157,10 @@ export function getSimulatorsData({ ? urlIllustrationNetBrut : urlIllustrationNetBrutEn } + alt={t( + 'pages.simulateurs.salarié.alt-image1', + 'Salaire net (perçu par le salarié) = Salaire brut (inscrit dans le contrat de travail) - cotisations salariales (retraite, csg, etc)' + )} css={` width: 100%; `} From 0612399fe9528154851a1d45e0e461dece9bb6e2 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 12 May 2021 16:12:14 +0200 Subject: [PATCH 137/319] =?UTF-8?q?=F0=9F=96=8B=EF=B8=8F=20G=C3=A9n=C3=A9r?= =?UTF-8?q?alise=20l'orthographe=20de=20Publicodes=20avec=20un=20s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cf. https://github.com/betagouv/publicodes/discussions/44#discussioncomment-728631 --- .github/workflows/publish-publicodes.yaml | 2 +- CONTRIBUTING.md | 4 +- README.md | 22 ++++---- mon-entreprise/package.json | 2 +- .../source/components/Notifications.tsx | 4 +- mon-entreprise/source/locales/ui-en.yaml | 4 +- .../source/pages/integration/Options.tsx | 2 +- mon-entreprise/test/unit-translations.test.js | 2 +- publicodes/README.md | 4 +- publicodes/core/test/mecanisms.test.js | 4 +- publicodes/docs/principes-de-base.md | 12 ++-- publicodes/docs/se-lancer.md | 14 ++--- .../example/publicode-react/package.json | 52 ------------------ .../.env | 0 .../.gitignore | 0 .../README.md | 0 .../__mocks__/CO2-douche.publicodes.yaml.js | 0 .../example/publicodes-react/package.json | 52 ++++++++++++++++++ .../public/index.html | 34 ++++++------ .../public/robots.txt | 0 .../src/App.css | 0 .../src/App.js | 0 .../src/CO2-douche.publicodes.yaml | 2 +- .../src/Publicodes.js | 0 .../src/Publicodes.test.js | 0 .../src/index.css | 0 .../src/index.js | 0 .../src/logo.png | Bin .../src/reportWebVitals.js | 0 .../src/setupTests.js | 0 .../yarn.lock | 0 publicodes/site/components/Studio.tsx | 2 +- .../ui-react/source/rule/RuleSource.tsx | 2 +- 33 files changed, 109 insertions(+), 111 deletions(-) delete mode 100644 publicodes/example/publicode-react/package.json rename publicodes/example/{publicode-react => publicodes-react}/.env (100%) rename publicodes/example/{publicode-react => publicodes-react}/.gitignore (100%) rename publicodes/example/{publicode-react => publicodes-react}/README.md (100%) rename publicodes/example/{publicode-react => publicodes-react}/__mocks__/CO2-douche.publicodes.yaml.js (100%) create mode 100644 publicodes/example/publicodes-react/package.json rename publicodes/example/{publicode-react => publicodes-react}/public/index.html (70%) rename publicodes/example/{publicode-react => publicodes-react}/public/robots.txt (100%) rename publicodes/example/{publicode-react => publicodes-react}/src/App.css (100%) rename publicodes/example/{publicode-react => publicodes-react}/src/App.js (100%) rename publicodes/example/{publicode-react => publicodes-react}/src/CO2-douche.publicodes.yaml (98%) rename publicodes/example/{publicode-react => publicodes-react}/src/Publicodes.js (100%) rename publicodes/example/{publicode-react => publicodes-react}/src/Publicodes.test.js (100%) rename publicodes/example/{publicode-react => publicodes-react}/src/index.css (100%) rename publicodes/example/{publicode-react => publicodes-react}/src/index.js (100%) rename publicodes/example/{publicode-react => publicodes-react}/src/logo.png (100%) rename publicodes/example/{publicode-react => publicodes-react}/src/reportWebVitals.js (100%) rename publicodes/example/{publicode-react => publicodes-react}/src/setupTests.js (100%) rename publicodes/example/{publicode-react => publicodes-react}/yarn.lock (100%) diff --git a/.github/workflows/publish-publicodes.yaml b/.github/workflows/publish-publicodes.yaml index 6f0c7f383..36fd22e7f 100644 --- a/.github/workflows/publish-publicodes.yaml +++ b/.github/workflows/publish-publicodes.yaml @@ -16,7 +16,7 @@ jobs: path: '**/node_modules' key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-v2 - run: yarn install --frozen-lockfile - - working-directory: ./publicodes/example/publicode-react + - working-directory: ./publicodes/example/publicodes-react run: | yarn install yarn test diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fe2e70b36..c785e8c03 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -168,9 +168,9 @@ Pour tester les règles, il est recommandé de: ### Publicodes -Un tutoriel sur publicode est disponible sur https://publi.codes. +Un tutoriel sur publicodes est disponible sur https://publi.codes. -Un wiki contenant des informations intéressantes sur publicode et le +Un wiki contenant des informations intéressantes sur publicodes et le raisonnement ayant abouti à ce langage sont dispos sur le repository [betagouv/publicodes](https://github.com/betagouv/publicodes/wiki), qui est par ailleurs inutilisé. diff --git a/README.md b/README.md index 6afb190d0..3c5e83d62 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,24 @@ -Ce repo contient : -- Le code source du site [mon-entreprise.fr](https://mon-entreprise.fr) -- La documentation et le code source du langage [publicodes](https://publi.codes) -- Les [règles publicodes](https://github.com/betagouv/mon-entreprise/tree/master/modele-social) pour le calcul des cotisations sociales, des impôts et des droits sociaux. +Ce repo contient : + +- Le code source du site [mon-entreprise.fr](https://mon-entreprise.fr) +- La documentation et le code source du langage [publicodes](https://publi.codes) +- Les [règles publicodes](https://github.com/betagouv/mon-entreprise/tree/master/modele-social) pour le calcul des cotisations sociales, des impôts et des droits sociaux. ## mon-entreprise.fr [![Statut déploiement](https://github.com/betagouv/mon-entreprise/actions/workflows/deploy.yaml/badge.svg?branch=master)](https://github.com/betagouv/mon-entreprise/actions/workflows/deploy.yaml?query=branch%3Amaster++)  [![Statut test](https://github.com/betagouv/mon-entreprise/actions/workflows/test.yaml/badge.svg?branch=master)](https://github.com/betagouv/mon-entreprise/actions/workflows/test.yaml?query=branch%3Amaster++) -Site développé en partenariat avec l'Urssaf, qui a pour mission d'accompagner des créateurs d’entreprise dans le développement de leur activité. +Site développé en partenariat avec l'Urssaf, qui a pour mission d'accompagner des créateurs d’entreprise dans le développement de leur activité. + +Il propose notamment des simulateurs de cotisations sociales très complets, basés sur le language déclaratif publicodes. On peut ainsi calculer le coût d'une embauche, un salaire net après impôt, ses revenus d'auto-entrepreneur ou encore ceux d'un dirigeant de SASU ou d'indépendant -Il propose notamment des simulateurs de cotisations sociales très complets, basés sur le language déclaratif publicodes. On peut ainsi calculer le coût d'une embauche, un salaire net après impôt, ses revenus d'auto-entrepreneur ou encore ceux d'un dirigeant de SASU ou d'indépendant > 🧮 [Voir la liste des simulateurs](https://mon-entreprise.fr/simulateurs) Les développeurs ont la possibilité d'intégrer ces simulateurs sur d'autres sites, ou de réutiliser les règles pour effectuer leur propre calculs. + > 🧰 [Voir les outils à disposition des développeurs](https://mon-entreprise.fr/int%C3%A9gration) - - ## Publicodes [![Npm version](https://img.shields.io/npm/v/publicodes)](https://www.npmjs.com/package/publicodes) @@ -25,16 +26,14 @@ Les développeurs ont la possibilité d'intégrer ces simulateurs sur d'autres s Publicodes est un langage déclaratif pour encoder les algorithmes d'intérêt public. Il permet de réaliser des calculs généraux tout en fournissant une explication permettant de comprendre et de documenter ces calculs. -Publicode est adapté pour modéliser des domaines métiers complexes pouvant être décomposés en règles élémentaires simples (comme la législation socio-fiscale, un bilan carbone, un estimateur de rendement locatif, etc.). Il propulse les simulateurs de mon-entreprise.fr et ceux de [datagir.ademe.fr](https://datagir.ademe.fr/). +Publicodes est adapté pour modéliser des domaines métiers complexes pouvant être décomposés en règles élémentaires simples (comme la législation socio-fiscale, un bilan carbone, un estimateur de rendement locatif, etc.). Il propulse les simulateurs de mon-entreprise.fr et ceux de [datagir.ademe.fr](https://datagir.ademe.fr/). > 📖 [Voir la documentation](https://publi.codes) - ## Contribuer Si vous souhaitez contribuer à l'un des deux projet, rendez-vous sur [CONTRIBUTING.md](./CONTRIBUTING.md). - ## 🇬🇧 English users This repository powers [mycompanyinfrance.fr](https://mycompanyinfrance.fr) and [mon-entreprise.fr](https://mon-entreprise.fr) and [publi.codes](https://publi.codes). @@ -48,4 +47,3 @@ The website will run well on modern browsers. Internet Explorer is not supported This compatibility is tested thanks to [BrowserStack](http://browserstack.com/)'s free open source program. ![Logo de Browserstack, notre solution de tests manuels](https://i.imgur.com/dQwLjXA.png) - diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index 082b67898..bd0af5bad 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -113,7 +113,7 @@ "test": "yarn test:file \"./{,!(node_modules)/**/}!(webpack).test.{js,ts}\"", "test:file": "yarn mocha-webpack --webpack-config ./webpack.dev.js --include test/componentTestSetup.js --require mock-local-storage --require test/helpers/browser.js", "test:bundlesize": "bundlesize", - "test:dev-e2e:publicode": "cypress open --browser chromium --config baseUrl=http://localhost:8080/publicodes,integrationFolder=cypress/integration/publi.codes", + "test:dev-e2e:publicodes": "cypress open --browser chromium --config baseUrl=http://localhost:8080/publicodes,integrationFolder=cypress/integration/publi.codes", "test:dev-e2e:mon-entreprise": "cypress open --browser chromium", "test:dev-e2e:mycompanyinfrance": "cypress open --browser chromium --config baseUrl=http://localhost:8080/infrance", "i18n:rules:check": "node scripts/i18n/check-missing-rule-translation.js", diff --git a/mon-entreprise/source/components/Notifications.tsx b/mon-entreprise/source/components/Notifications.tsx index 7fc85e604..bbcf00355 100644 --- a/mon-entreprise/source/components/Notifications.tsx +++ b/mon-entreprise/source/components/Notifications.tsx @@ -10,10 +10,10 @@ import './Notifications.css' import { Markdown } from './utils/markdown' import { ScrollToElement } from './utils/Scroll' -// To add a new notification to a simulator, you should create a publicode rule +// To add a new notification to a simulator, you should create a publicodes rule // with the "type: notification" attribute. The display can be customized with // the "sévérité" attribute. The notification will only be displayed if the -// publicode rule is applicable. +// publicodes rule is applicable. type Notification = { dottedName: RuleNode['dottedName'] description: RuleNode['rawNode']['description'] diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 90b51bdcf..27f61cf6f 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -8,7 +8,7 @@ <0>Oui: <0>Yes A quoi servent mes cotisations ?: What's included in my contributions? Accueil: Home -Afficher la description publicode: Display publicode description +Afficher la description publicodes: Display publicodes description Aide à la déclaration de revenu: Income tax return assistance Aide à la déclaration de revenus au titre de l'année 2019: Help with your 2019 income tax return Aides Covid-19: Covid-19 Aids @@ -955,7 +955,7 @@ pages: library: <0>Using the calculation engine<1>The entire socio-fiscal calculation engine developed by Urssaf, freely available in the form of an NPM library. - publicode: <0>Publicodes<1>Our tools are powered by Publicodes, a new + publicodes: <0>Publicodes<1>Our tools are powered by Publicodes, a new language for encoding "explainable" algorithms. code: description: "Here is the code to copy and paste on your site:" diff --git a/mon-entreprise/source/pages/integration/Options.tsx b/mon-entreprise/source/pages/integration/Options.tsx index 1c25cb0ca..b48c78040 100644 --- a/mon-entreprise/source/pages/integration/Options.tsx +++ b/mon-entreprise/source/pages/integration/Options.tsx @@ -101,7 +101,7 @@ export default function Options() { href="https://publi.codes" >
    {emoji('📚')}
    - +

    Publicodes

    Nos outils sont propulsés par Publicodes, un nouveau langage pour diff --git a/mon-entreprise/test/unit-translations.test.js b/mon-entreprise/test/unit-translations.test.js index 0b32fd0d5..c4da56cbf 100644 --- a/mon-entreprise/test/unit-translations.test.js +++ b/mon-entreprise/test/unit-translations.test.js @@ -4,7 +4,7 @@ import { uniq } from 'ramda' import rawRules from 'modele-social' import unitsTranslations from '../source/locales/units.yaml' -it('use unit that exists in publicode', () => { +it('use unit that exists in publicodes', () => { const rules = parsePublicodes(rawRules) const units = uniq( Object.keys(rules).reduce( diff --git a/publicodes/README.md b/publicodes/README.md index 8c84c8d4f..5024defd2 100644 --- a/publicodes/README.md +++ b/publicodes/README.md @@ -1,8 +1,8 @@ -Publicode est un langage déclaratif pour encoder les algorithmes d'intérêt +Publicodes est un langage déclaratif pour encoder les algorithmes d'intérêt public. Il permet de réaliser des calculs généraux tout en fournissant une explication permettant de comprendre et de documenter ces calculs. -Publicode est adapté pour modéliser des domaines métiers complexes pouvant être +Publicodes est adapté pour modéliser des domaines métiers complexes pouvant être décomposés en règles élémentaires simples (comme la [législation socio-fiscale](https://github.com/betagouv/mon-entreprise/tree/master/publicodes), [un bilan carbone](https://github.com/laem/futureco-data/blob/master/co2.yaml), un estimateur de rendement locatif, etc.). diff --git a/publicodes/core/test/mecanisms.test.js b/publicodes/core/test/mecanisms.test.js index 2c163991c..38079c214 100644 --- a/publicodes/core/test/mecanisms.test.js +++ b/publicodes/core/test/mecanisms.test.js @@ -1,7 +1,7 @@ /* Les mécanismes sont testés dans mécanismes/ comme le sont les variables - directement dans la base Publicode. On construit dans chaque fichier une base - Publicode autonome, dans laquelle intervient le mécanisme à tester, puis on + directement dans la base Publicodes. On construit dans chaque fichier une base + Publicodes autonome, dans laquelle intervient le mécanisme à tester, puis on teste idéalement tous ses comportements sans en faire intervenir d'autres. */ diff --git a/publicodes/docs/principes-de-base.md b/publicodes/docs/principes-de-base.md index 187f453f3..175b7ac09 100644 --- a/publicodes/docs/principes-de-base.md +++ b/publicodes/docs/principes-de-base.md @@ -1,9 +1,9 @@ # Principes de base -La syntaxe de Publicode est basée sur le langage +La syntaxe de Publicodes est basée sur le langage [Yaml](https://en.wikipedia.org/wiki/YAML). -Un fichier Publicode contient une liste de _règles_ identifiées par leur _nom_ et +Un fichier Publicodes contient une liste de _règles_ identifiées par leur _nom_ et possédant une _valeur_ : ```yaml @@ -51,7 +51,7 @@ prix total: nombre de repas * prix d'un repas + frais de réservation # La formule de "prix total" est invalide. ``` -Dans l'exemple ci-dessus, Publicode détecte une erreur car les termes de +Dans l'exemple ci-dessus, Publicodes détecte une erreur car les termes de l'addition ont des unités incompatibles : d'un côté on a des `€` et de l'autre des `€/repas`. @@ -64,7 +64,7 @@ prix total: nombre de repas * (prix d'un repas + frais de réservation) > **Attention :** Il ne faut pas insérer d'espace autour de la barre oblique dans > les unités, l'unité `€ / mois` doit être notée `€/mois`. -Publicode convertit automatiquement les unités si besoin. +Publicodes convertit automatiquement les unités si besoin. ```yaml salaire: 1500 €/mois @@ -157,7 +157,7 @@ ticket resto: ## Conditions booléennes -Publicode supporte des opérateurs booléens basiques. +Publicodes supporte des opérateurs booléens basiques. ```yaml âge: 17 ans @@ -281,7 +281,7 @@ particulières et modifier la définition des règles générales pour prendre e compte ces particularités pose des problèmes de maintenabilité de la base de règles. -Publicode dispose d'un mécanisme de remplacement qui permet d'amender n'importe +Publicodes dispose d'un mécanisme de remplacement qui permet d'amender n'importe quelle règle existante sans avoir besoin de la modifier : ```yaml diff --git a/publicodes/docs/se-lancer.md b/publicodes/docs/se-lancer.md index 49b124c47..c928fa529 100644 --- a/publicodes/docs/se-lancer.md +++ b/publicodes/docs/se-lancer.md @@ -1,6 +1,6 @@ ## Installation ![béta](https://img.shields.io/badge/-beta-blue) -Publicode est distribué sous la forme d'une librairie +Publicodes est distribué sous la forme d'une librairie [Node.js](https://nodejs.org/fr/) permettant de compiler un jeu de règles publicodes et de l'évaluer dans une situation donnée. @@ -33,8 +33,8 @@ dépenses primeur: - prix . avocat * 3 avocat ` -// On initialise un moteur en lui donnant le publicode. -// Ce publicode va être parsé +// On initialise un moteur en lui donnant le publicodes. +// Ce publicodes va être parsé const engine = new Engine(rules) ``` @@ -106,7 +106,7 @@ console.log( ### Évaluation d'expressions -La fonction `evaluate` permet d'évaluer des expressions publicode complètes : +La fonction `evaluate` permet d'évaluer des expressions publicodes complètes : ```js // On va au marché une fois par semaine, amortissons la dépense sur 7 jours @@ -116,7 +116,7 @@ console.log(`J'ai dépensé ${formatValue(depensesParJour)}.`) ### Conversion d'unité -Publicode permet de réaliser des conversions d'unités. Pour celà il faut +Publicodes permet de réaliser des conversions d'unités. Pour celà il faut indiquer l'unité désirée via le mécanisme [`unité`](https://publi.codes/documentation/mécanismes#unité) : ```js @@ -132,7 +132,7 @@ console.log(`J'ai dépensé ${formatValue(depensesParMois)}.`) ### Variables manquantes -Publicode calcule automatiquement les dépendances de chaque règle. Si la +Publicodes calcule automatiquement les dépendances de chaque règle. Si la valeur d'une dépendance est manquante et ne permet pas de faire le calcul, elle apparaîtra dans la propriété `missingVariables` : @@ -146,7 +146,7 @@ y: console.log(missingYEngine.evaluate('x').missingVariables) ``` -Cette information est utile pour intégrer publicode à votre application. +Cette information est utile pour intégrer publicodes à votre application. Il est aussi possible d'utiliser des valeurs par défaut. Dans ce cas la règle sera calculée avec la valeur par défaut de sa dépendance, mais cette dernière diff --git a/publicodes/example/publicode-react/package.json b/publicodes/example/publicode-react/package.json deleted file mode 100644 index e2b48009a..000000000 --- a/publicodes/example/publicode-react/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "publicode-react", - "version": "0.1.0", - "private": true, - "dependencies": { - "@testing-library/jest-dom": "^5.11.4", - "@testing-library/react": "^11.1.0", - "@testing-library/user-event": "^12.1.10", - "publicodes": "../../core/publicodes-1.0.0-beta.15.tgz", - "publicodes-react": "../../ui-react/publicodes-react-1.0.0-beta.15.tgz", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-router": "^5.2.0", - "react-router-dom": "^5.2.0", - "react-scripts": "4.0.3", - "web-vitals": "^1.0.1" - }, - "scripts": { - "preinstall": "cd ../../core && npm pack && cd ../ui-react && npm pack", - "refresh-publicodes": "yarn preinstall && yarn upgrade publicodes publicodes-react", - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "msw": "^0.28.1" - }, - "jest": { - "moduleNameMapper": { - "CO2-douche.publicodes.yaml$": "/__mocks__/CO2-douche.publicodes.yaml.js" - } - } -} diff --git a/publicodes/example/publicode-react/.env b/publicodes/example/publicodes-react/.env similarity index 100% rename from publicodes/example/publicode-react/.env rename to publicodes/example/publicodes-react/.env diff --git a/publicodes/example/publicode-react/.gitignore b/publicodes/example/publicodes-react/.gitignore similarity index 100% rename from publicodes/example/publicode-react/.gitignore rename to publicodes/example/publicodes-react/.gitignore diff --git a/publicodes/example/publicode-react/README.md b/publicodes/example/publicodes-react/README.md similarity index 100% rename from publicodes/example/publicode-react/README.md rename to publicodes/example/publicodes-react/README.md diff --git a/publicodes/example/publicode-react/__mocks__/CO2-douche.publicodes.yaml.js b/publicodes/example/publicodes-react/__mocks__/CO2-douche.publicodes.yaml.js similarity index 100% rename from publicodes/example/publicode-react/__mocks__/CO2-douche.publicodes.yaml.js rename to publicodes/example/publicodes-react/__mocks__/CO2-douche.publicodes.yaml.js diff --git a/publicodes/example/publicodes-react/package.json b/publicodes/example/publicodes-react/package.json new file mode 100644 index 000000000..38ca523b5 --- /dev/null +++ b/publicodes/example/publicodes-react/package.json @@ -0,0 +1,52 @@ +{ + "name": "publicodes-react", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/jest-dom": "^5.11.4", + "@testing-library/react": "^11.1.0", + "@testing-library/user-event": "^12.1.10", + "publicodes": "../../core/publicodes-1.0.0-beta.15.tgz", + "publicodes-react": "../../ui-react/publicodes-react-1.0.0-beta.15.tgz", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-router": "^5.2.0", + "react-router-dom": "^5.2.0", + "react-scripts": "4.0.3", + "web-vitals": "^1.0.1" + }, + "scripts": { + "preinstall": "cd ../../core && npm pack && cd ../ui-react && npm pack", + "refresh-publicodes": "yarn preinstall && yarn upgrade publicodes publicodes-react", + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "msw": "^0.28.1" + }, + "jest": { + "moduleNameMapper": { + "CO2-douche.publicodes.yaml$": "/__mocks__/CO2-douche.publicodes.yaml.js" + } + } +} diff --git a/publicodes/example/publicode-react/public/index.html b/publicodes/example/publicodes-react/public/index.html similarity index 70% rename from publicodes/example/publicode-react/public/index.html rename to publicodes/example/publicodes-react/public/index.html index 8538e4f40..6b45b92f4 100644 --- a/publicodes/example/publicode-react/public/index.html +++ b/publicodes/example/publicodes-react/public/index.html @@ -1,19 +1,19 @@ - - - - - + + + + + - - - Publicode demo - - - -

    - - + diff --git a/publicodes/example/publicode-react/public/robots.txt b/publicodes/example/publicodes-react/public/robots.txt similarity index 100% rename from publicodes/example/publicode-react/public/robots.txt rename to publicodes/example/publicodes-react/public/robots.txt diff --git a/publicodes/example/publicode-react/src/App.css b/publicodes/example/publicodes-react/src/App.css similarity index 100% rename from publicodes/example/publicode-react/src/App.css rename to publicodes/example/publicodes-react/src/App.css diff --git a/publicodes/example/publicode-react/src/App.js b/publicodes/example/publicodes-react/src/App.js similarity index 100% rename from publicodes/example/publicode-react/src/App.js rename to publicodes/example/publicodes-react/src/App.js diff --git a/publicodes/example/publicode-react/src/CO2-douche.publicodes.yaml b/publicodes/example/publicodes-react/src/CO2-douche.publicodes.yaml similarity index 98% rename from publicodes/example/publicode-react/src/CO2-douche.publicodes.yaml rename to publicodes/example/publicodes-react/src/CO2-douche.publicodes.yaml index 1a0d4b5b9..d4a2d64f8 100644 --- a/publicodes/example/publicode-react/src/CO2-douche.publicodes.yaml +++ b/publicodes/example/publicodes-react/src/CO2-douche.publicodes.yaml @@ -11,7 +11,7 @@ douche . fréquence: par défaut: 1 douche/jour suggestions: 1 par jour: 1 douche/jour - 5 par semaine: 5 douche/semaine * 52 semaines/an # Publicode ne gère pas encore nativement l'unité semaine + 5 par semaine: 5 douche/semaine * 52 semaines/an # Publicodes ne gère pas encore nativement l'unité semaine 2 par jour: 2 douche/jour diff --git a/publicodes/example/publicode-react/src/Publicodes.js b/publicodes/example/publicodes-react/src/Publicodes.js similarity index 100% rename from publicodes/example/publicode-react/src/Publicodes.js rename to publicodes/example/publicodes-react/src/Publicodes.js diff --git a/publicodes/example/publicode-react/src/Publicodes.test.js b/publicodes/example/publicodes-react/src/Publicodes.test.js similarity index 100% rename from publicodes/example/publicode-react/src/Publicodes.test.js rename to publicodes/example/publicodes-react/src/Publicodes.test.js diff --git a/publicodes/example/publicode-react/src/index.css b/publicodes/example/publicodes-react/src/index.css similarity index 100% rename from publicodes/example/publicode-react/src/index.css rename to publicodes/example/publicodes-react/src/index.css diff --git a/publicodes/example/publicode-react/src/index.js b/publicodes/example/publicodes-react/src/index.js similarity index 100% rename from publicodes/example/publicode-react/src/index.js rename to publicodes/example/publicodes-react/src/index.js diff --git a/publicodes/example/publicode-react/src/logo.png b/publicodes/example/publicodes-react/src/logo.png similarity index 100% rename from publicodes/example/publicode-react/src/logo.png rename to publicodes/example/publicodes-react/src/logo.png diff --git a/publicodes/example/publicode-react/src/reportWebVitals.js b/publicodes/example/publicodes-react/src/reportWebVitals.js similarity index 100% rename from publicodes/example/publicode-react/src/reportWebVitals.js rename to publicodes/example/publicodes-react/src/reportWebVitals.js diff --git a/publicodes/example/publicode-react/src/setupTests.js b/publicodes/example/publicodes-react/src/setupTests.js similarity index 100% rename from publicodes/example/publicode-react/src/setupTests.js rename to publicodes/example/publicodes-react/src/setupTests.js diff --git a/publicodes/example/publicode-react/yarn.lock b/publicodes/example/publicodes-react/yarn.lock similarity index 100% rename from publicodes/example/publicode-react/yarn.lock rename to publicodes/example/publicodes-react/yarn.lock diff --git a/publicodes/site/components/Studio.tsx b/publicodes/site/components/Studio.tsx index 2ea3b5c4b..8a7dbcee5 100644 --- a/publicodes/site/components/Studio.tsx +++ b/publicodes/site/components/Studio.tsx @@ -8,7 +8,7 @@ import { useHistory, useLocation } from 'react-router-dom' import styled from 'styled-components' const EXAMPLE_CODE = ` -# Bienvenue dans le bac à sable du langage publicode ! +# Bienvenue dans le bac à sable du langage publicodes ! # Pour en savoir plus sur le langage : # => https://publi.codes/documentation/principes-de-base diff --git a/publicodes/ui-react/source/rule/RuleSource.tsx b/publicodes/ui-react/source/rule/RuleSource.tsx index 6c8d2fefb..88e3e52ac 100644 --- a/publicodes/ui-react/source/rule/RuleSource.tsx +++ b/publicodes/ui-react/source/rule/RuleSource.tsx @@ -44,7 +44,7 @@ export default function RuleSource({ engine, dottedName }: Props) { ] const rule = engine.evaluate(engine.getRule(dottedName)) - // When we import a rule in the Publicode Studio, we need to provide a + // When we import a rule in the Publicodes Studio, we need to provide a // simplified definition of its dependencies to avoid undefined references. const dependenciesValues = dissoc( dottedName, From bcf67707931bb7e33f8cc757a2aad19ca7502c84 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 12 May 2021 16:28:20 +0200 Subject: [PATCH 138/319] =?UTF-8?q?=F0=9F=96=8B=EF=B8=8F=20Copie=20la=20li?= =?UTF-8?q?cence=20mon-entreprise=20pour=20publicodes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publicodes/LICENSE | 21 +++++++++++++++++++++ publicodes/README.md | 4 ---- publicodes/docs/communauté.md | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 publicodes/LICENSE diff --git a/publicodes/LICENSE b/publicodes/LICENSE new file mode 100644 index 000000000..5f0d0a2c3 --- /dev/null +++ b/publicodes/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018-2021 beta.gouv.fr + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/publicodes/README.md b/publicodes/README.md index 5024defd2..0dac11f73 100644 --- a/publicodes/README.md +++ b/publicodes/README.md @@ -32,7 +32,3 @@ npm install publicodes - **[futur.eco](https://futur.eco/)** utilise publicodes pour calculer les bilans carbone d'un grand nombre d'activités, plats, transports ou biens. - **[Nos Gestes Climat](https://ecolab.ademe.fr/apps/climat)** utilise publicodes pour proposer un calculateur d'empreinte climat personnel de référence complètement ouvert - -## Feuille de route - -Pour plus de détails sur les prochaines fonctionalités et notre future direction vous pouvez consulter nos [feuilles de route](https://github.com/betagouv/mon-entreprise/issues?q=is%3Aopen+label%3A%22%F0%9F%8E%AF+feuille+de+route%22+label%3A%22%E2%9A%99%EF%B8%8F+publicodes%22+). diff --git a/publicodes/docs/communauté.md b/publicodes/docs/communauté.md index 2dafbe32f..22f35129a 100644 --- a/publicodes/docs/communauté.md +++ b/publicodes/docs/communauté.md @@ -12,7 +12,7 @@ ## ✍️ Contribuer -Tout le développement se fait dans le monorepo [github.com/betagouv/mon-entreprise](https://github.com/betagouv/mon-entreprise/tree/master/publicodes). +Le développement est ouvert et se passe sur [github.com/betagouv/publicodes](https://github.com/betagouv/publicodes). ## 💬 Discuter From cff7a4da8fcad1028bc339f27e2fc3e9daf6c26e Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 19 May 2021 14:47:17 +0200 Subject: [PATCH 139/319] =?UTF-8?q?=F0=9F=96=8A=20Retouche=20README=20et?= =?UTF-8?q?=20CONTRIBUTING?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 33 ++++++++++++++++++++++++++++++--- README.md | 20 +++++--------------- publicodes/CONTRIBUTING.md | 9 +++++++++ publicodes/README.md | 7 +++++++ 4 files changed, 51 insertions(+), 18 deletions(-) create mode 100644 publicodes/CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c785e8c03..3f0f241e8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -132,10 +132,9 @@ N'oubliez pas de vérifier sur le diff que rien n'est choquant. ### CI/CD -- [CircleCI](https://circleci.com/) s'occupe de faire tourner les builds et +- Nous utilisons des [Github actions](https://github.com/features/actions) pour faire tourner les builds et tests. -- [Netlify](https://www.netlify.com/), s'occupe de l’hébergement du site sur Internet - sur internet avec gestion des DNS. +- [Netlify](https://www.netlify.com/), s'occupe de l’hébergement du site sur Internet avec gestion des DNS. ### Analyse des bundles @@ -143,6 +142,32 @@ La commande `yarn run build:analyse-bundle` gènere une visualisation interactiv contenu packagé, cf. [webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer) +### Modifier publicodes + +Publicodes dispose désormais de son propre dépôt GitHub https://github.com/betagouv/publicodes + +Néanmoins pour certaines nouvelles fonctionnalités de mon-entreprise nous concervons le besoin de modifier publicodes avec le moins de frictions possible. Pour tester une évolution du moteur il serait en effet trop lourd d'avoir à ouvrir d'abord une PR côté publicodes, la merger, publier une nouvelle version du paquet, puis ré-intégrer cette nouvelle version sur mon-entreprise. + +C'est pourquoi nous intégrons le code source du publicode dans le sous-répertoire `publicodes/`. La commande `git subtree` nous permet de synchroniser les changements effectués dans l'un ou l'autre des dépôts. + +La première chose à faire est d'ajouter une nouvelle `remote` pour `betagouv/publicodes`, ici nous l'appelons simplement `publicodes` : + +```sh +git remote add publicodes git@github.com:betagouv/publicodes.git +``` + +Ensuite il est possible de remonter les changements effectués dans le sous-repertoire `publicodes/` vers la branche master de la remote `publicodes`. + +```sh +$ git subtree push --prefix=publicodes publicodes master +``` + +Dans l'autre sens il est possible de rapatrier les changements avec la commande + +```sh +$ git subtree pull --prefix=publicodes publicodes master --squash +``` + ## Développement de modèles Publicodes ### Traduction des normes (lois) en règles Publicodes @@ -185,6 +210,8 @@ place](./publicodes/source/mecanisms). ## Publier une nouvelle version des paquets publicodes + + Voici la marche à suivre pour publier une nouvelle version : 1. Renseigner les modifications dans publicodes/CHANGELOG.md diff --git a/README.md b/README.md index 3c5e83d62..76b4ea0de 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ -Ce repo contient : +Ce dépôt contient : - Le code source du site [mon-entreprise.fr](https://mon-entreprise.fr) -- La documentation et le code source du langage [publicodes](https://publi.codes) - Les [règles publicodes](https://github.com/betagouv/mon-entreprise/tree/master/modele-social) pour le calcul des cotisations sociales, des impôts et des droits sociaux. ## mon-entreprise.fr @@ -11,7 +10,7 @@ Ce repo contient : Site développé en partenariat avec l'Urssaf, qui a pour mission d'accompagner des créateurs d’entreprise dans le développement de leur activité. -Il propose notamment des simulateurs de cotisations sociales très complets, basés sur le language déclaratif publicodes. On peut ainsi calculer le coût d'une embauche, un salaire net après impôt, ses revenus d'auto-entrepreneur ou encore ceux d'un dirigeant de SASU ou d'indépendant +Il propose notamment des simulateurs de cotisations sociales très complets, basés sur le language déclaratif [publicodes](https://publi.codes). On peut ainsi calculer le coût d'une embauche, un salaire net après impôt, ses revenus d'auto-entrepreneur ou encore ceux d'un dirigeant de SASU ou d'indépendant > 🧮 [Voir la liste des simulateurs](https://mon-entreprise.fr/simulateurs) @@ -19,24 +18,15 @@ Les développeurs ont la possibilité d'intégrer ces simulateurs sur d'autres s > 🧰 [Voir les outils à disposition des développeurs](https://mon-entreprise.fr/int%C3%A9gration) -## Publicodes - -[![Npm version](https://img.shields.io/npm/v/publicodes)](https://www.npmjs.com/package/publicodes) -[![Gitter chat](https://badges.gitter.im/publicodes/publicodes.png)](https://gitter.im/publicodes/community) - -Publicodes est un langage déclaratif pour encoder les algorithmes d'intérêt public. Il permet de réaliser des calculs généraux tout en fournissant une explication permettant de comprendre et de documenter ces calculs. - -Publicodes est adapté pour modéliser des domaines métiers complexes pouvant être décomposés en règles élémentaires simples (comme la législation socio-fiscale, un bilan carbone, un estimateur de rendement locatif, etc.). Il propulse les simulateurs de mon-entreprise.fr et ceux de [datagir.ademe.fr](https://datagir.ademe.fr/). - -> 📖 [Voir la documentation](https://publi.codes) +Tous les outils proposés sur mon-entreprise.fr sont propulsés par [publicodes](https://publi.codes), un nouveau langage pour les algorithmes d'intérêt public. ## Contribuer -Si vous souhaitez contribuer à l'un des deux projet, rendez-vous sur [CONTRIBUTING.md](./CONTRIBUTING.md). +Si vous souhaitez contribuer à l'un des deux projets, rendez-vous sur [CONTRIBUTING.md](./CONTRIBUTING.md). ## 🇬🇧 English users -This repository powers [mycompanyinfrance.fr](https://mycompanyinfrance.fr) and [mon-entreprise.fr](https://mon-entreprise.fr) and [publi.codes](https://publi.codes). +This repository powers [mycompanyinfrance.fr](https://mycompanyinfrance.fr) and [mon-entreprise.fr](https://mon-entreprise.fr) Most of the documentation (including issues and commit message) is written in french, please raise an [issue](https://github.com/betagouv/mon-entreprise/issues/new) if you are interested and do not speak French. diff --git a/publicodes/CONTRIBUTING.md b/publicodes/CONTRIBUTING.md new file mode 100644 index 000000000..32d4a2894 --- /dev/null +++ b/publicodes/CONTRIBUTING.md @@ -0,0 +1,9 @@ +# Comment contribuer ? + +Merci de prendre le temps de contribuer ! 🎉 + +Voici quelques informations pour démarrer : + +## Rapport de bug, nouvelles fonctionnalités + +Nous utilisons GitHub pour suivre tous les bugs et discussions sur les nouvelles fonctionnalités. Pour rapporter un bug ou proposer une évolution vous pouvez [ouvrir une nouvelle discussion](https://github.com/betagouv/publicodes/discussions). N'hésitez pas à utiliser la recherche pour vérifier si le sujet n'est pas déjà traité dans une discussion ouverte. diff --git a/publicodes/README.md b/publicodes/README.md index 0dac11f73..22e8da984 100644 --- a/publicodes/README.md +++ b/publicodes/README.md @@ -1,3 +1,10 @@ +> 🇬🇧 Most of the documentation (including issues and commit messages) is written in French, please raise an [issue](https://github.com/betagouv/publicodes/issues/new) if you are interested and do not speak French. We intend to translate the language and the documentation in the coming weeks. + +## Publicodes + +[![Npm version](https://img.shields.io/npm/v/publicodes)](https://www.npmjs.com/package/publicodes) +[![Gitter chat](https://badges.gitter.im/publicodes/publicodes.png)](https://gitter.im/publicodes/community) + Publicodes est un langage déclaratif pour encoder les algorithmes d'intérêt public. Il permet de réaliser des calculs généraux tout en fournissant une explication permettant de comprendre et de documenter ces calculs. From 969fb01d87d393f7bc120ef047343c83ff1bd405 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 14 May 2021 16:14:22 +0200 Subject: [PATCH 140/319] =?UTF-8?q?=F0=9F=8C=97=20S=C3=A9pare=20les=20conf?= =?UTF-8?q?igurations=20tsconfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 2 +- modele-social/tsconfig.json | 6 ++--- mon-entreprise/test/persistence.test.ts | 28 +++++++++++------------ mon-entreprise/tsconfig.json | 12 ++++++++-- publicodes/core/tsconfig.json | 2 +- publicodes/site/tsconfig.json | 2 +- tsconfig.json => publicodes/tsconfig.json | 0 publicodes/ui-react/tsconfig.json | 2 +- 8 files changed, 30 insertions(+), 24 deletions(-) rename tsconfig.json => publicodes/tsconfig.json (100%) diff --git a/.eslintrc.js b/.eslintrc.js index 926164b5f..9c12a1792 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -59,7 +59,7 @@ module.exports = { "jsx": true }, "tsconfigRootDir": __dirname, - "project": [ "./tsconfig.json" ] + "project": [ "./mon-entreprise/tsconfig.json", "./publicodes/tsconfig.json" ] }, plugins: [ "@typescript-eslint" ], rules: { diff --git a/modele-social/tsconfig.json b/modele-social/tsconfig.json index 41aef4043..49fc71a60 100644 --- a/modele-social/tsconfig.json +++ b/modele-social/tsconfig.json @@ -1,8 +1,8 @@ { - "extends": "../tsconfig.json", "compilerOptions": { + "allowJs": true, "noEmit": true, "strict": true - }, - "include": ["build.js"] + }, + "include": ["build.js"] } diff --git a/mon-entreprise/test/persistence.test.ts b/mon-entreprise/test/persistence.test.ts index e487d81b7..2480db10f 100644 --- a/mon-entreprise/test/persistence.test.ts +++ b/mon-entreprise/test/persistence.test.ts @@ -1,23 +1,21 @@ import { expect } from 'chai' -import * as sinon from 'sinon' -import { createStore } from 'redux' import { createMemoryHistory } from 'history' - import { DottedName } from 'modele-social' +import { createStore } from 'redux' +import * as sinon from 'sinon' +import { + loadPreviousSimulation, + setSimulationConfig, + updateSituation, +} from '../source/actions/actions' import reducers, { Simulation, SimulationConfig, } from '../source/reducers/rootReducer' -import { PreviousSimulation } from '../source/selectors/previousSimulationSelectors' -import safeLocalStorage from '../source/storage/safeLocalStorage' import { setupSimulationPersistence } from '../source/storage/persistSimulation' -import { - loadPreviousSimulation, - updateSituation, - setSimulationConfig, -} from '../source/actions/actions' +import safeLocalStorage from '../source/storage/safeLocalStorage' -function delay(ms) { +function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)) } @@ -40,15 +38,15 @@ const initialSimulation: Simulation = { describe('[persistence] When simulation persistence is setup', () => { const sandbox = sinon.createSandbox() - let spiedSafeLocalStorage - let store + let spiedSafeLocalStorage: any + let store: any beforeEach(() => { spiedSafeLocalStorage = sandbox.spy(safeLocalStorage as any) store = createStore(reducers, { simulation: initialSimulation, activeTargetInput: 'sometargetinput', - }) + } as any) setupSimulationPersistence(store, 0) }) @@ -81,7 +79,7 @@ describe('[persistence] When simulation config is set', () => { '{"situation":{"dotted name . other":"42"},"activeTargetInput":"someothertargetinput","foldedSteps":["someotherstep"]}' const sandbox = sinon.createSandbox() - let store + let store: any beforeEach(() => { sandbox diff --git a/mon-entreprise/tsconfig.json b/mon-entreprise/tsconfig.json index 1c60dc007..8da6ec135 100644 --- a/mon-entreprise/tsconfig.json +++ b/mon-entreprise/tsconfig.json @@ -1,7 +1,15 @@ { - "extends": "../tsconfig.json", "compilerOptions": { "baseUrl": "source", + "moduleResolution": "node", + "module": "esnext", + "target": "esnext", + "esModuleInterop": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "allowJs": true, "paths": { "Actions/*": ["actions/*"], "Components": ["components"], @@ -14,5 +22,5 @@ "noEmit": true, "strict": true }, - "include": ["types", "source", "dev-server.js"] + "include": ["types", "source", "test/persistence.test.ts", "dev-server.js"] } diff --git a/publicodes/core/tsconfig.json b/publicodes/core/tsconfig.json index a71de8cce..ba37ce2e6 100644 --- a/publicodes/core/tsconfig.json +++ b/publicodes/core/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../tsconfig.json", "compilerOptions": { "outDir": "./dist/types", "declaration": true, diff --git a/publicodes/site/tsconfig.json b/publicodes/site/tsconfig.json index 31eb5f5cb..aa35a7047 100644 --- a/publicodes/site/tsconfig.json +++ b/publicodes/site/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../tsconfig.json", "compilerOptions": { "noEmit": true }, diff --git a/tsconfig.json b/publicodes/tsconfig.json similarity index 100% rename from tsconfig.json rename to publicodes/tsconfig.json diff --git a/publicodes/ui-react/tsconfig.json b/publicodes/ui-react/tsconfig.json index 05026a1d1..a1a9693bd 100644 --- a/publicodes/ui-react/tsconfig.json +++ b/publicodes/ui-react/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../tsconfig.json", "compilerOptions": { "module": "CommonJS", "target": "es2015", From f4e3b93af2c1db4839dc638dabc502d4bf2549e6 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 21 May 2021 11:29:58 +0200 Subject: [PATCH 141/319] Meta-data pour git subtree git-subtree-dir: publicodes git-subtree-split: 10a30d32d3a8d6502301b8f2560a9a617f0c23e9 From 49a7ae2af90885468b9c724674f04e2e5c2ee7fc Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 20 May 2021 17:42:34 +0200 Subject: [PATCH 142/319] =?UTF-8?q?=F0=9F=94=A5=20Supprime=20l'utilisation?= =?UTF-8?q?=20des=20temporals=20dans=20les=20m=C3=A9canismes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publicodes/core/source/evaluation.ts | 111 ++---------------- publicodes/core/source/mecanisms/barème.ts | 52 +++----- publicodes/core/source/mecanisms/grille.ts | 102 ++++++---------- publicodes/core/source/mecanisms/operation.ts | 58 ++++----- publicodes/core/source/mecanisms/product.ts | 20 ++-- publicodes/core/source/mecanisms/recalcul.ts | 3 - .../core/source/mecanisms/variations.ts | 61 +++------- publicodes/core/source/nodeUnits.ts | 9 -- 8 files changed, 108 insertions(+), 308 deletions(-) diff --git a/publicodes/core/source/evaluation.ts b/publicodes/core/source/evaluation.ts index 447b67c42..ebefa3bd2 100644 --- a/publicodes/core/source/evaluation.ts +++ b/publicodes/core/source/evaluation.ts @@ -7,17 +7,8 @@ import { NodeKind, } from './AST/types' import { warning } from './error' -import { convertNodeToUnit, simplifyNodeUnit } from './nodeUnits' +import { convertNodeToUnit } from './nodeUnits' import parse from './parse' -import { - concatTemporals, - liftTemporalNode, - mapTemporal, - pureTemporal, - Temporal, - temporalAverage, - zipTemporals, -} from './temporal' export const collectNodeMissing = ( node: EvaluatedNode | ASTNode @@ -75,37 +66,17 @@ export const evaluateArray: ( node.explanation.map(evaluate), node.name ) + const values = evaluatedNodes.map(({ nodeValue }) => nodeValue) + const nodeValue = values.some((value) => value === null) + ? null + : values.reduce(reducer, start) - const temporalValues = concatTemporals( - evaluatedNodes.map( - ({ temporalValue, nodeValue }) => - temporalValue ?? pureTemporal(nodeValue) - ) - ) - const temporalValue = mapTemporal((values) => { - if (values.some((value) => value === null)) { - return null - } - return values.reduce(reducer, start) - }, temporalValues) - - const baseEvaluation = { + return { ...node, missingVariables: mergeAllMissing(evaluatedNodes), explanation: evaluatedNodes, ...(evaluatedNodes[0] && { unit: evaluatedNodes[0].unit }), - } - if (temporalValue.length === 1) { - return { - ...baseEvaluation, - nodeValue: temporalValue[0].value, - } - } - - return { - ...baseEvaluation, - temporalValue, - nodeValue: temporalAverage(temporalValue as any), + nodeValue, } } @@ -132,71 +103,3 @@ export const parseObject = (objectShape, value, context) => { }) ) } - -export function evaluateObject( - effet: (this: Engine, explanations: any) => any -) { - return function (node) { - const evaluations = Object.fromEntries( - Object.entries((node as any).explanation).map(([key, value]) => [ - key, - this.evaluate(value as any), - ]) - ) - const temporalExplanations = mapTemporal( - Object.fromEntries, - concatTemporals( - Object.entries(evaluations).map(([key, node]) => - zipTemporals(pureTemporal(key), liftTemporalNode(node as ASTNode)) - ) - ) - ) - const temporalExplanation = mapTemporal((explanations) => { - const evaluation = effet.call(this, explanations) - return { - ...evaluation, - explanation: { - ...explanations, - ...evaluation.explanation, - }, - } - }, temporalExplanations) - - const sameUnitTemporalExplanation: Temporal< - ASTNode & EvaluatedNode & { nodeValue: number } - > = convertNodesToSameUnit - .call( - this, - temporalExplanation.map((x) => x.value), - node.nodeKind - ) - .map((node, i) => ({ - ...temporalExplanation[i], - value: simplifyNodeUnit(node), - })) - - const temporalValue = mapTemporal( - ({ nodeValue }) => nodeValue, - sameUnitTemporalExplanation - ) - const nodeValue = temporalAverage(temporalValue) - const baseEvaluation = { - ...node, - nodeValue, - unit: sameUnitTemporalExplanation[0].value.unit, - explanation: evaluations, - missingVariables: mergeAllMissing(Object.values(evaluations)), - } - if (sameUnitTemporalExplanation.length === 1) { - return { - ...baseEvaluation, - explanation: (sameUnitTemporalExplanation[0] as any).value.explanation, - } - } - return { - ...baseEvaluation, - temporalValue, - temporalExplanation, - } - } as EvaluationFunction -} diff --git a/publicodes/core/source/mecanisms/barème.ts b/publicodes/core/source/mecanisms/barème.ts index 40ba14ff8..087f92bda 100644 --- a/publicodes/core/source/mecanisms/barème.ts +++ b/publicodes/core/source/mecanisms/barème.ts @@ -3,12 +3,6 @@ import { ASTNode } from '../AST/types' import { defaultNode, mergeAllMissing } from '../evaluation' import { registerEvaluationFunction } from '../evaluationFunctions' import parse from '../parse' -import { - liftTemporal2, - liftTemporalNode, - mapTemporal, - temporalAverage, -} from '../temporal' import { convertUnit, parseUnit } from '../units' import { evaluatePlafondUntilActiveTranche, @@ -78,44 +72,28 @@ const evaluate: EvaluationFunction<'barème'> = function (node) { const evaluate = this.evaluate.bind(this) const assiette = this.evaluate(node.explanation.assiette) const multiplicateur = this.evaluate(node.explanation.multiplicateur) - const temporalTranchesPlafond = liftTemporal2( - (assiette, multiplicateur) => - evaluatePlafondUntilActiveTranche.call(this, { - parsedTranches: node.explanation.tranches, - assiette, - multiplicateur, - }), - liftTemporalNode(assiette as any), - liftTemporalNode(multiplicateur as any) + const tranches = evaluateBarème( + evaluatePlafondUntilActiveTranche.call(this, { + parsedTranches: node.explanation.tranches, + assiette, + multiplicateur, + }), + assiette, + evaluate ) - const temporalTranches = liftTemporal2( - (tranches, assiette) => evaluateBarème(tranches, assiette, evaluate), - temporalTranchesPlafond, - liftTemporalNode(assiette as any) - ) - const temporalValue = mapTemporal( - (tranches) => - tranches.reduce( - (value, { nodeValue }) => - nodeValue == null ? null : value + nodeValue, - 0 - ), - temporalTranches + const nodeValue = tranches.reduce( + (value, { nodeValue }) => (nodeValue == null ? null : value + nodeValue), + 0 ) + return { ...node, - nodeValue: temporalAverage(temporalValue), - ...(temporalValue.length > 1 - ? { - temporalValue, - } - : { missingVariables: mergeAllMissing(temporalTranches[0].value) }), + nodeValue, + missingVariables: mergeAllMissing(tranches), explanation: { assiette, multiplicateur, - ...(temporalTranches.length > 1 - ? { temporalTranches } - : { tranches: temporalTranches[0].value }), + tranches, }, unit: assiette.unit, } as any diff --git a/publicodes/core/source/mecanisms/grille.ts b/publicodes/core/source/mecanisms/grille.ts index b7f5633df..05763dd95 100644 --- a/publicodes/core/source/mecanisms/grille.ts +++ b/publicodes/core/source/mecanisms/grille.ts @@ -3,12 +3,6 @@ import { ASTNode } from '../AST/types' import { defaultNode, mergeAllMissing } from '../evaluation' import { registerEvaluationFunction } from '../evaluationFunctions' import parse from '../parse' -import { - liftTemporal2, - liftTemporalNode, - mapTemporal, - temporalAverage, -} from '../temporal' import { evaluatePlafondUntilActiveTranche, parseTranches, @@ -37,78 +31,58 @@ export default function parseGrille(v, context): GrilleNode { nodeKind: 'grille', } } -const evaluateGrille = (tranches, evaluate) => - tranches.map((tranche) => { - if (tranche.isActive === false) { - return tranche - } - const montant = evaluate(tranche.montant) - return { - ...tranche, - montant, - nodeValue: montant.nodeValue, - unit: montant.unit, - missingVariables: mergeAllMissing([montant, tranche]), - } - }) const evaluate: EvaluationFunction<'grille'> = function (node) { const evaluate = this.evaluate.bind(this) const assiette = this.evaluate(node.explanation.assiette) const multiplicateur = this.evaluate(node.explanation.multiplicateur) - const temporalTranchesPlafond = liftTemporal2( - (assiette, multiplicateur) => - evaluatePlafondUntilActiveTranche.call(this, { - parsedTranches: node.explanation.tranches, - assiette, - multiplicateur, - }), - liftTemporalNode(assiette as any), - liftTemporalNode(multiplicateur as any) - ) - const temporalTranches = mapTemporal( - (tranches) => evaluateGrille(tranches, evaluate), - temporalTranchesPlafond - ) + const tranches = evaluatePlafondUntilActiveTranche + .call(this, { + parsedTranches: node.explanation.tranches, + assiette, + multiplicateur, + }) + .map((tranche) => { + if (tranche.isActive === false) { + return tranche + } + const montant = evaluate(tranche.montant) + return { + ...tranche, + montant, + nodeValue: montant.nodeValue, + unit: montant.unit, + missingVariables: mergeAllMissing([montant, tranche]), + } + }) - const activeTranches = mapTemporal((tranches) => { - const activeTranche = tranches.find((tranche) => tranche.isActive) - if (activeTranche) { - return [activeTranche] - } - const lastTranche = tranches[tranches.length - 1] - if (lastTranche.isAfterActive === false) { - return [{ nodeValue: false }] - } - return tranches.filter((tranche) => tranche.isActive === null) - }, temporalTranches) - const temporalValue = mapTemporal( - (tranches) => - !tranches[0] - ? false - : tranches[0].isActive === null - ? null - : tranches[0].nodeValue, - activeTranches - ) + let activeTranches + const activeTranche = tranches.find((tranche) => tranche.isActive) + if (activeTranche) { + activeTranches = [activeTranche] + } else if (tranches[tranches.length - 1].isAfterActive === false) { + activeTranches = [{ nodeValue: false }] + } else { + activeTranches = tranches.filter((tranche) => tranche.isActive === null) + } + + const nodeValue = !activeTranches[0] + ? false + : activeTranches[0].isActive === null + ? null + : activeTranches[0].nodeValue return { ...node, - nodeValue: temporalAverage(temporalValue), - ...(temporalValue.length > 1 - ? { - temporalValue, - } - : { missingVariables: mergeAllMissing(activeTranches[0].value) }), + nodeValue, + missingVariables: mergeAllMissing(activeTranches), explanation: { ...node.explanation, assiette, multiplicateur, - ...(temporalTranches.length > 1 - ? { temporalTranches } - : { tranches: temporalTranches[0].value }), + tranches, }, - unit: activeTranches[0]?.value[0]?.unit ?? undefined, + unit: activeTranches[0]?.unit ?? undefined, } as any } diff --git a/publicodes/core/source/mecanisms/operation.ts b/publicodes/core/source/mecanisms/operation.ts index f093548b0..d7b2b69fd 100644 --- a/publicodes/core/source/mecanisms/operation.ts +++ b/publicodes/core/source/mecanisms/operation.ts @@ -1,13 +1,11 @@ import { EvaluationFunction } from '..' -import { ASTNode } from '../AST/types' +import { ASTNode, EvaluatedNode } from '../AST/types' import { convertToDate } from '../date' import { warning } from '../error' import { mergeAllMissing } from '../evaluation' import { registerEvaluationFunction } from '../evaluationFunctions' import { convertNodeToUnit } from '../nodeUnits' import parse from '../parse' -import { liftTemporal2, pureTemporal, temporalAverage } from '../temporal' -import { EvaluatedNode } from '../AST/types' import { inferUnit, serializeUnit } from '../units' const knownOperations = { @@ -74,7 +72,26 @@ const evaluate: EvaluationFunction<'operation'> = function (node) { ) } } - const baseNode = { + + const operatorFunction = knownOperations[node.operationKind][0] + + const a = node1.nodeValue as string | false + const b = node2.nodeValue as string | false + + const nodeValue = + !['≠', '='].includes(node.operator) && a === false && b === false + ? false + : ['<', '>', '≤', '≥', '∕', '×'].includes(node.operator) && + (a === false || b === false) + ? false + : a !== false && + b !== false && + ['≠', '=', '<', '>', '≤', '≥'].includes(node.operator) && + [a, b].every((value) => value.match?.(/[\d]{2}\/[\d]{2}\/[\d]{4}/)) + ? operatorFunction(convertToDate(a), convertToDate(b)) + : operatorFunction(a, b) + + return { ...node, explanation, ...((node.operationKind === '*' || @@ -84,40 +101,7 @@ const evaluate: EvaluationFunction<'operation'> = function (node) { unit: inferUnit(node.operationKind, [node1.unit, node2.unit]), }), missingVariables, - } - - const operatorFunction = knownOperations[node.operationKind][0] - - const temporalValue = liftTemporal2( - (a: string | false, b: string | false) => { - if (!['≠', '='].includes(node.operator) && a === false && b === false) { - return false - } - if ( - ['<', '>', '≤', '≥', '∕', '×'].includes(node.operator) && - (a === false || b === false) - ) { - return false - } - if ( - a !== false && - b !== false && - ['≠', '=', '<', '>', '≤', '≥'].includes(node.operator) && - [a, b].every((value) => value.match?.(/[\d]{2}\/[\d]{2}\/[\d]{4}/)) - ) { - return operatorFunction(convertToDate(a), convertToDate(b)) - } - return operatorFunction(a, b) - }, - node1.temporalValue ?? (pureTemporal(node1.nodeValue) as any), - node2.temporalValue ?? (pureTemporal(node2.nodeValue) as any) - ) - const nodeValue = temporalAverage(temporalValue, baseNode.unit) - - return { - ...baseNode, nodeValue, - ...(temporalValue.length > 1 && { temporalValue }), } } diff --git a/publicodes/core/source/mecanisms/product.ts b/publicodes/core/source/mecanisms/product.ts index 612df9b95..f56195126 100644 --- a/publicodes/core/source/mecanisms/product.ts +++ b/publicodes/core/source/mecanisms/product.ts @@ -1,7 +1,7 @@ import { EvaluationFunction } from '..' import { ASTNode } from '../AST/types' import { warning } from '../error' -import { defaultNode, evaluateObject, parseObject } from '../evaluation' +import { defaultNode, parseObject } from '../evaluation' import { registerEvaluationFunction } from '../evaluationFunctions' import { convertNodeToUnit, simplifyNodeUnit } from '../nodeUnits' import { areUnitConvertible, convertUnit, inferUnit } from '../units' @@ -32,12 +32,12 @@ export const mecanismProduct = (v, context) => { } as ProductNode } -const productEffect: EvaluationFunction = function ({ - assiette, - taux, - facteur, - plafond, -}: any) { +const evaluateProduit: EvaluationFunction<'produit'> = function (node) { + const assiette = this.evaluate(node.explanation.assiette) + const taux = this.evaluate(node.explanation.taux) + const facteur = this.evaluate(node.explanation.facteur) + let plafond = this.evaluate(node.explanation.plafond) + if (assiette.unit) { try { plafond = convertNodeToUnit(assiette.unit, plafond) @@ -77,11 +77,9 @@ const productEffect: EvaluationFunction = function ({ unit, explanation: { - plafondActif: assiette.nodeValue > plafond.nodeValue, + plafondActif: (assiette.nodeValue as any) > (plafond as any).nodeValue, }, }) } -const evaluate = evaluateObject<'produit'>(productEffect) - -registerEvaluationFunction('produit', evaluate) +registerEvaluationFunction('produit', evaluateProduit) diff --git a/publicodes/core/source/mecanisms/recalcul.ts b/publicodes/core/source/mecanisms/recalcul.ts index f9eb7e1ca..8db2f9423 100644 --- a/publicodes/core/source/mecanisms/recalcul.ts +++ b/publicodes/core/source/mecanisms/recalcul.ts @@ -62,9 +62,6 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { }, missingVariables: evaluatedNode.missingVariables, ...('unit' in evaluatedNode && { unit: evaluatedNode.unit }), - ...(evaluatedNode.temporalValue && { - temporalValue: evaluatedNode.temporalValue, - }), } } diff --git a/publicodes/core/source/mecanisms/variations.ts b/publicodes/core/source/mecanisms/variations.ts index 1c8c3b9c0..845b9dd1a 100644 --- a/publicodes/core/source/mecanisms/variations.ts +++ b/publicodes/core/source/mecanisms/variations.ts @@ -1,17 +1,10 @@ import { EvaluationFunction } from '..' -import { ASTNode, Unit } from '../AST/types' +import { ASTNode, EvaluatedNode, Unit } from '../AST/types' import { warning } from '../error' import { bonus, defaultNode, mergeAllMissing } from '../evaluation' import { registerEvaluationFunction } from '../evaluationFunctions' import { convertNodeToUnit } from '../nodeUnits' import parse from '../parse' -import { - liftTemporal2, - pureTemporal, - sometime, - Temporal, - temporalAverage, -} from '../temporal' export type VariationNode = { explanation: Array<{ @@ -62,12 +55,12 @@ export default function parseVariations(v, context): VariationNode { } const evaluate: EvaluationFunction<'variations'> = function (node) { - const [temporalValue, explanation, unit] = node.explanation.reduce< + const [nodeValue, explanation, unit] = node.explanation.reduce< [ - Temporal, + EvaluatedNode['nodeValue'], VariationNode['explanation'], Unit | undefined, - Temporal + boolean | null ] >( ( @@ -75,11 +68,7 @@ const evaluate: EvaluationFunction<'variations'> = function (node) { { condition, consequence }, i: number ) => { - const previousConditionsAlwaysTrue = !sometime( - (value) => value !== true, - previousConditions - ) - if (previousConditionsAlwaysTrue) { + if (previousConditions === true) { return [ evaluation, [...explanations, { condition, consequence }], @@ -88,24 +77,19 @@ const evaluate: EvaluationFunction<'variations'> = function (node) { ] } const evaluatedCondition = this.evaluate(condition) - const currentCondition = liftTemporal2( - (previousCond, currentCond) => - previousCond === null - ? previousCond - : !previousCond && - (currentCond === null ? null : currentCond !== false), - previousConditions, - evaluatedCondition.temporalValue ?? - pureTemporal(evaluatedCondition.nodeValue) - ) + const currentCondition = + previousConditions === null + ? previousConditions + : !previousConditions && + (evaluatedCondition.nodeValue === null + ? null + : evaluatedCondition.nodeValue !== false) + evaluatedCondition.missingVariables = bonus( evaluatedCondition.missingVariables ) - const currentConditionAlwaysFalse = !sometime( - (x) => x !== false, - currentCondition - ) - if (currentConditionAlwaysFalse) { + + if (currentCondition === false) { return [ evaluation, [...explanations, { condition: evaluatedCondition, consequence }], @@ -128,15 +112,8 @@ const evaluate: EvaluationFunction<'variations'> = function (node) { ) } } - const currentValue = liftTemporal2( - (cond, value) => cond && value, - currentCondition, - evaluatedConsequence.temporalValue ?? - pureTemporal(evaluatedConsequence.nodeValue) - ) - const or = (a, b) => a || b return [ - liftTemporal2(or, evaluation, currentValue), + currentCondition && evaluatedConsequence.nodeValue, [ ...explanations, { @@ -146,13 +123,12 @@ const evaluate: EvaluationFunction<'variations'> = function (node) { }, ], unit || evaluatedConsequence.unit, - liftTemporal2(or, previousConditions, currentCondition), + previousConditions || currentCondition, ] }, - [pureTemporal(false), [], undefined, pureTemporal(false)] + [false, [], undefined, false] ) - const nodeValue = temporalAverage(temporalValue, unit) const missingVariables = mergeAllMissing( explanation.reduce( (values, { condition, consequence }) => [ @@ -170,7 +146,6 @@ const evaluate: EvaluationFunction<'variations'> = function (node) { ...(unit !== undefined && { unit }), explanation, missingVariables, - ...(temporalValue.length > 1 && { temporalValue }), } } diff --git a/publicodes/core/source/nodeUnits.ts b/publicodes/core/source/nodeUnits.ts index 504ae21e3..fc2eeb369 100644 --- a/publicodes/core/source/nodeUnits.ts +++ b/publicodes/core/source/nodeUnits.ts @@ -1,5 +1,4 @@ import { EvaluatedNode, Unit } from './AST/types' -import { mapTemporal } from './temporal' import { convertUnit, simplifyUnit } from './units' export function simplifyNodeUnit(node) { @@ -15,20 +14,12 @@ export function convertNodeToUnit( to: Unit | undefined, node: Node ): Node { - const temporalValue = - node.temporalValue && node.unit - ? mapTemporal( - (value) => convertUnit(node.unit, to, value as number), - node.temporalValue - ) - : node.temporalValue return { ...node, nodeValue: node.unit && typeof node.nodeValue === 'number' ? convertUnit(node.unit, to, node.nodeValue) : node.nodeValue, - ...(temporalValue && { temporalValue }), unit: to, } } From f43f02ea5c63b097a02ece1366cd3f39adb1a376 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Thu, 20 May 2021 18:22:28 +0200 Subject: [PATCH 143/319] =?UTF-8?q?=F0=9F=94=A5=20Supprime=20les=20variabl?= =?UTF-8?q?es=20temporelles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publicodes/core/source/AST/index.ts | 16 - publicodes/core/source/AST/types.ts | 5 - publicodes/core/source/grammar.ne | 8 +- publicodes/core/source/grammarFunctions.js | 8 - publicodes/core/source/mecanisms/product.ts | 10 +- .../source/mecanisms/variableTemporelle.ts | 69 --- publicodes/core/source/parse.ts | 2 - publicodes/core/source/temporal.ts | 430 ------------------ publicodes/core/test/mécanismes/grille.yaml | 2 +- publicodes/core/test/period.test.js | 132 ------ publicodes/core/test/temporal.test.js | 132 ------ publicodes/ui-react/source/Explanation.tsx | 1 - publicodes/ui-react/source/index.tsx | 1 - 13 files changed, 10 insertions(+), 806 deletions(-) delete mode 100644 publicodes/core/source/mecanisms/variableTemporelle.ts delete mode 100644 publicodes/core/source/temporal.ts delete mode 100644 publicodes/core/test/period.test.js delete mode 100644 publicodes/core/test/temporal.test.js diff --git a/publicodes/core/source/AST/index.ts b/publicodes/core/source/AST/index.ts index bbbdcf15f..b07baa71d 100644 --- a/publicodes/core/source/AST/index.ts +++ b/publicodes/core/source/AST/index.ts @@ -174,8 +174,6 @@ export const traverseASTNode: TraverseFunction = (fn, node) => { return traverseUnitéNode(fn, node) case 'variations': return traverseVariationNode(fn, node) - case 'variable temporelle': - return traverseVariableTemporelle(fn, node) case 'replacementRule': return traverseReplacementNode(fn, node) default: @@ -382,17 +380,3 @@ const traverseVariationNode: TraverseFunction<'variations'> = (fn, node) => ({ consequence: fn(consequence), })), }) - -const traverseVariableTemporelle: TraverseFunction<'variable temporelle'> = ( - fn, - node -) => ({ - ...node, - explanation: { - period: { - end: node.explanation.period.end && fn(node.explanation.period.end), - start: node.explanation.period.start && fn(node.explanation.period.start), - }, - value: fn(node.explanation.value), - }, -}) diff --git a/publicodes/core/source/AST/types.ts b/publicodes/core/source/AST/types.ts index 66886e52a..516a2fae7 100644 --- a/publicodes/core/source/AST/types.ts +++ b/publicodes/core/source/AST/types.ts @@ -23,12 +23,10 @@ import { SommeNode } from '../mecanisms/sum' import { SynchronisationNode } from '../mecanisms/synchronisation' import { TauxProgressifNode } from '../mecanisms/tauxProgressif' import { UnitéNode } from '../mecanisms/unité' -import { VariableTemporelleNode } from '../mecanisms/variableTemporelle' import { VariationNode } from '../mecanisms/variations' import { ReferenceNode } from '../reference' import { ReplacementRule } from '../replacement' import { RuleNode } from '../rule' -import { Temporal } from '../temporal' export type ConstantNode = { type: 'boolean' | 'objet' | 'number' | 'string' @@ -64,7 +62,6 @@ export type ASTNode = ( | SynchronisationNode | TauxProgressifNode | UnitéNode - | VariableTemporelleNode | VariationNode | ConstantNode | ReplacementRule @@ -109,12 +106,10 @@ export type Unit = { } // Idée : une évaluation est un n-uple : (value, unit, missingVariable, isApplicable) -// Une temporalEvaluation est une liste d'evaluation sur chaque période. : [(Evaluation, Period)] type EvaluationDecoration = { nodeValue: Evaluation missingVariables: Record unit?: Unit - temporalValue?: Temporal } export type Types = number | boolean | string | Record export type Evaluation = T | false | null diff --git a/publicodes/core/source/grammar.ne b/publicodes/core/source/grammar.ne index 93c12ff1f..2a2207d59 100644 --- a/publicodes/core/source/grammar.ne +++ b/publicodes/core/source/grammar.ne @@ -7,8 +7,7 @@ @{% const { - string, date, variable, temporalNumericValue, binaryOperation, - unaryOperation, boolean, number, numberWithUnit, JSONObject + string, date, variable, binaryOperation, unaryOperation, boolean, number, numberWithUnit, JSONObject } = require('./grammarFunctions') const moo = require("moo"); @@ -61,11 +60,6 @@ main -> NumericValue -> AdditionSubstraction {% id %} | Negation {% id %} - | TemporalNumericValue {% id %} - -TemporalNumericValue -> - NumericValue %space %periodWord %space %date {% ([value,,word,,dateString]) => temporalNumericValue(value, word, date([dateString])) %} - | NumericValue %space %periodWord %colon Date {% ([value,,word,,date]) => temporalNumericValue(value, word, date) %} NumericTerminal -> Variable {% id %} diff --git a/publicodes/core/source/grammarFunctions.js b/publicodes/core/source/grammarFunctions.js index 70d7c8722..043305909 100644 --- a/publicodes/core/source/grammarFunctions.js +++ b/publicodes/core/source/grammarFunctions.js @@ -1,7 +1,6 @@ /* Those are postprocessor functions for the Nearley grammar.ne. The advantage of putting them here is to get prettier's JS formatting, since Nealrey doesn't support it https://github.com/kach/nearley/issues/310 */ import { normalizeDateString } from './date' -import { parsePeriod } from './temporal' export let binaryOperation = (operationType) => ([A, , operator, , B]) => ({ [operator]: { @@ -17,13 +16,6 @@ export let unaryOperation = (operationType) => ([operator, , A]) => ({ }, }) -export let temporalNumericValue = (variable, word, date) => ({ - temporalValue: { - explanation: variable, - period: parsePeriod(word.value.slice(2), date), - }, -}) - export let variable = ([firstFragment, nextFragment], _, reject) => { const fragments = [firstFragment, ...nextFragment].map(({ value }) => value) if (!nextFragment.length && ['oui', 'non'].includes(firstFragment)) { diff --git a/publicodes/core/source/mecanisms/product.ts b/publicodes/core/source/mecanisms/product.ts index f56195126..2d636700e 100644 --- a/publicodes/core/source/mecanisms/product.ts +++ b/publicodes/core/source/mecanisms/product.ts @@ -1,7 +1,7 @@ import { EvaluationFunction } from '..' import { ASTNode } from '../AST/types' import { warning } from '../error' -import { defaultNode, parseObject } from '../evaluation' +import { defaultNode, mergeAllMissing, parseObject } from '../evaluation' import { registerEvaluationFunction } from '../evaluationFunctions' import { convertNodeToUnit, simplifyNodeUnit } from '../nodeUnits' import { areUnitConvertible, convertUnit, inferUnit } from '../units' @@ -72,11 +72,17 @@ const evaluateProduit: EvaluationFunction<'produit'> = function (node) { nodeValue = convertUnit(unit, assiette.unit, nodeValue) unit = assiette.unit } + return simplifyNodeUnit({ + ...node, + missingVariables: mergeAllMissing([assiette, taux, facteur, plafond]), nodeValue, unit, - explanation: { + assiette, + taux, + facteur, + plafond, plafondActif: (assiette.nodeValue as any) > (plafond as any).nodeValue, }, }) diff --git a/publicodes/core/source/mecanisms/variableTemporelle.ts b/publicodes/core/source/mecanisms/variableTemporelle.ts deleted file mode 100644 index f16edd876..000000000 --- a/publicodes/core/source/mecanisms/variableTemporelle.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { EvaluationFunction } from '..' -import { ASTNode } from '../AST/types' -import { registerEvaluationFunction } from '../evaluationFunctions' -import parse from '../parse' -import { - createTemporalEvaluation, - narrowTemporalValue, - Temporal, - temporalAverage, -} from '../temporal' - -export type VariableTemporelleNode = { - explanation: { - period: { - start: ASTNode | undefined - end: ASTNode | undefined - } - value: ASTNode - } - nodeKind: 'variable temporelle' -} - -const evaluate: EvaluationFunction<'variable temporelle'> = function ( - node: any -) { - const start = - node.explanation.period.start && - this.evaluate(node.explanation.period.start) - const end = - node.explanation.period.end && this.evaluate(node.explanation.period.end) - const value = this.evaluate(node.explanation.value) - const period = { - start: start?.nodeValue || null, - end: end?.nodeValue || null, - } - const temporalValue = value.temporalValue - ? narrowTemporalValue(period, value.temporalValue) - : createTemporalEvaluation(value.nodeValue, period) - // TODO explanation missingVariables / period missing variables - return { - ...node, - nodeValue: temporalAverage(temporalValue as Temporal, value.unit), - temporalValue, - explanation: { - period: { start, end }, - value, - }, - ...('unit' in value && { unit: value.unit }), - } -} - -export default function parseVariableTemporelle( - v, - context -): VariableTemporelleNode { - const explanation = parse(v.explanation, context) - return { - nodeKind: 'variable temporelle', - explanation: { - period: { - start: v.period.start && parse(v.period.start, context), - end: v.period.end && parse(v.period.end, context), - }, - value: explanation, - }, - } -} - -registerEvaluationFunction('variable temporelle', evaluate) diff --git a/publicodes/core/source/parse.ts b/publicodes/core/source/parse.ts index 46bbb96ba..68a8c871b 100644 --- a/publicodes/core/source/parse.ts +++ b/publicodes/core/source/parse.ts @@ -28,7 +28,6 @@ import { mecanismSum } from './mecanisms/sum' import { mecanismSynchronisation } from './mecanisms/synchronisation' import tauxProgressif from './mecanisms/tauxProgressif' import unité from './mecanisms/unité' -import variableTemporelle from './mecanisms/variableTemporelle' import variations, { devariate } from './mecanisms/variations' import { Context } from './parsePublicodes' import parseReference from './reference' @@ -190,7 +189,6 @@ const parseFunctions = { somme: mecanismSum, multiplication: mecanismProduct, produit: mecanismProduct, - temporalValue: variableTemporelle, barème, grille, 'taux progressif': tauxProgressif, diff --git a/publicodes/core/source/temporal.ts b/publicodes/core/source/temporal.ts deleted file mode 100644 index 14cbd2e79..000000000 --- a/publicodes/core/source/temporal.ts +++ /dev/null @@ -1,430 +0,0 @@ -import { - convertToDate, - getDifferenceInDays, - getDifferenceInMonths, - getDifferenceInYears, - getRelativeDate, - getYear, -} from './date' -import { Unit, Evaluation, Types, ASTNode, EvaluatedNode } from './AST/types' - -export type Period = { - start: T | null - end: T | null -} - -export function parsePeriod(word: string, date: Date): Period { - const startWords = [ - 'depuis', - 'depuis le', - 'depuis la', - 'à partir de', - 'à partir du', - 'du', - ] - const endWords = [ - "jusqu'à", - "jusqu'au", - "jusqu'à la", - 'avant', - 'avant le', - 'avant la', - 'au', - ] - const intervalWords = ['le', 'en'] - if (!startWords.concat(endWords, intervalWords).includes(word)) { - throw new SyntaxError( - `Le mot clé '${word}' n'est pas valide. Les mots clés possible sont les suivants :\n\t ${startWords.join( - ', ' - )}` - ) - } - if (word === 'le') { - return { - start: date, - end: date, - } - } - if (word === 'en') { - return { start: null, end: null } - } - if (startWords.includes(word)) { - return { - start: date, - end: null, - } - } - if (endWords.includes(word)) { - return { - start: null, - end: date, - } - } - throw new Error('Non implémenté') -} - -export type TemporalNode = Temporal -export type Temporal = Array & { value: T }> - -export function narrowTemporalValue( - period: Period, - temporalValue: Temporal> -): Temporal> { - return liftTemporal2( - (value, filter) => filter && value, - temporalValue, - createTemporalEvaluation(true, period) - ) -} - -// Returns a temporal value that's true for the given period and false otherwise. -export function createTemporalEvaluation( - value: Evaluation, - period: Period = { start: null, end: null } -): Temporal> { - const temporalValue = [{ ...period, value }] - if (period.start != null) { - temporalValue.unshift({ - start: null, - end: getRelativeDate(period.start, -1), - value: false, - }) - } - if (period.end != null) { - temporalValue.push({ - start: getRelativeDate(period.end, 1), - end: null, - value: false, - }) - } - return temporalValue -} - -export function pureTemporal(value: T): Temporal { - return [{ start: null, end: null, value }] -} - -export function mapTemporal( - fn: (value: T1) => T2, - temporalValue: Temporal -): Temporal { - return temporalValue.map(({ start, end, value }) => ({ - start, - end, - value: fn(value), - })) -} -export function sometime( - fn: (value: T1) => boolean, - temporalValue: Temporal -): boolean { - return temporalValue.some(({ start, end, value }) => fn(value)) -} - -export function liftTemporal2( - fn: (value1: T1, value2: T2) => T3, - temporalValue1: Temporal, - temporalValue2: Temporal -): Temporal { - return mapTemporal( - ([a, b]) => fn(a, b), - zipTemporals(temporalValue1, temporalValue2) - ) -} - -export function concatTemporals( - temporalValues: Array> -): Temporal> { - return temporalValues.reduce( - (values, value) => liftTemporal2((a, b) => [...a, b], values, value), - pureTemporal([]) as Temporal> - ) -} - -export function liftTemporalNode( - node: N -): Temporal>> { - if (!('temporalValue' in node)) { - return pureTemporal(node) - } - const { temporalValue, ...baseNode } = node as N & { - temporalValue: Temporal> - } - return mapTemporal( - (nodeValue) => ({ - ...baseNode, - nodeValue, - }), - temporalValue - ) -} - -export function zipTemporals( - temporalValue1: Temporal, - temporalValue2: Temporal, - acc: Temporal<[T1, T2]> = [] -): Temporal<[T1, T2]> { - if (!temporalValue1.length && !temporalValue2.length) { - return acc - } - const [value1, ...rest1] = temporalValue1 - const [value2, ...rest2] = temporalValue2 - console.assert(value1.start === value2.start) - const endDateComparison = compareEndDate(value1.end, value2.end) - - // End dates are equals - if (endDateComparison === 0) { - return zipTemporals(rest1, rest2, [ - ...acc, - { ...value1, value: [value1.value, value2.value] }, - ]) - } - // Value1 lasts longuer than value1 - if (endDateComparison > 0) { - console.assert(value2.end !== null) - return zipTemporals( - [ - { ...value1, start: getRelativeDate(value2.end as string, 1) }, - ...rest1, - ], - rest2, - [ - ...acc, - { - ...value2, - value: [value1.value, value2.value], - }, - ] - ) - } - - // Value2 lasts longuer than value1 - if (endDateComparison < 0) { - console.assert(value1.end !== null) - return zipTemporals( - rest1, - [ - { ...value2, start: getRelativeDate(value1.end as string, 1) }, - ...rest2, - ], - [ - ...acc, - { - ...value1, - value: [value1.value, value2.value], - }, - ] - ) - } - throw new EvalError('All case should have been covered') -} - -function beginningOfNextYear(date: string): string { - return `01/01/${getYear(date) + 1}` -} - -function endsOfPreviousYear(date: string): string { - return `31/12/${getYear(date) - 1}` -} - -function splitStartsAt( - fn: (date: string) => string, - temporal: Temporal -): Temporal { - return temporal.reduce((acc, period) => { - const { start, end } = period - const newStart = start === null ? start : fn(start) - if (compareEndDate(newStart, end) !== -1) { - return [...acc, period] - } - console.assert(newStart !== null) - return [ - ...acc, - { ...period, end: getRelativeDate(newStart as string, -1) }, - { ...period, start: newStart }, - ] - }, [] as Temporal) -} - -function splitEndsAt( - fn: (date: string) => string, - temporal: Temporal -): Temporal { - return temporal.reduce((acc, period) => { - const { start, end } = period - const newEnd = end === null ? end : fn(end) - if (compareStartDate(start, newEnd) !== -1) { - return [...acc, period] - } - console.assert(newEnd !== null) - return [ - ...acc, - { ...period, end: newEnd }, - { ...period, start: getRelativeDate(newEnd as string, 1) }, - ] - }, [] as Temporal) -} - -export function groupByYear(temporalValue: Temporal): Array> { - return ( - // First step: split period by year if needed - splitEndsAt( - endsOfPreviousYear, - splitStartsAt(beginningOfNextYear, temporalValue) - ) - // Second step: group period by year - .reduce((acc, period) => { - const [currentTemporal, ...otherTemporal] = acc - if (currentTemporal === undefined) { - return [[period]] - } - const firstPeriod = currentTemporal[0] - console.assert( - firstPeriod !== undefined && - firstPeriod.end !== null && - period.start !== null, - 'invariant non verifié' - ) - if ( - (firstPeriod.end as string).slice(-4) !== - (period.start as string).slice(-4) - ) { - return [[period], ...acc] - } - return [[...currentTemporal, period], ...otherTemporal] - }, [] as Array>) - .reverse() - ) -} - -function simplify(temporalValue: Temporal): Temporal { - return temporalValue -} - -function compareStartDate( - dateA: string | null, - dateB: string | null -): -1 | 0 | 1 { - if (dateA == dateB) { - return 0 - } - if (dateA == null) { - return -1 - } - if (dateB == null) { - return 1 - } - return convertToDate(dateA) < convertToDate(dateB) ? -1 : 1 -} - -function compareEndDate( - dateA: string | null, - dateB: string | null -): -1 | 0 | 1 { - if (dateA == dateB) { - return 0 - } - if (dateA == null) { - return 1 - } - if (dateB == null) { - return -1 - } - return convertToDate(dateA) < convertToDate(dateB) ? -1 : 1 -} - -export function temporalAverage( - temporalValue: Temporal>, - unit?: Unit -): Evaluation { - temporalValue = temporalValue.filter(({ value }) => value !== false) - if (!temporalValue.length) { - return false - } - if (temporalValue.length === 1) { - return temporalValue[0].value - } - - if (temporalValue.some(({ value }) => value == null)) { - return null - } - - const temporalNumber = temporalValue as Temporal - const first = temporalNumber[0] - const last = temporalNumber[temporalNumber.length - 1] - - // La variable est définie sur un interval infini - if (first.start == null || last.end == null) { - if (first.start != null) { - return last.value - } - if (last.end != null) { - return first.value - } - return (first.value + last.value) / 2 - } - - let totalWeight = 0 - const weights = temporalNumber.map(({ start, end, value }) => { - ;[start, end] = [start, end] as [string, string] - let weight = 0 - if (unit?.denominators.includes('mois')) { - weight = getDifferenceInMonths(start, end) - } else if (unit?.denominators.includes('année')) { - weight = getDifferenceInYears(start, end) - } else { - weight = getDifferenceInDays(start, end) - } - totalWeight += weight - return value * weight - }) - return weights.reduce( - (average, weightedValue) => average + weightedValue / totalWeight, - 0 - ) -} - -export function temporalCumul( - temporalValue: Temporal>, - unit: Unit -): Evaluation { - temporalValue = temporalValue.filter(({ value }) => value !== false) - if (!temporalValue.length) { - return false - } - - if (temporalValue.some(({ value }) => value == null)) { - return null - } - - const temporalNumber = temporalValue as Temporal - const first = temporalNumber[0] - const last = temporalNumber[temporalNumber.length - 1] - - // La variable est définie sur un interval infini - if (first.start == null || last.end == null) { - if (first.start != null) { - return !last.value ? last.value : last.value > 0 ? Infinity : -Infinity - } - if (last.end != null) { - return !last.value ? last.value : last.value > 0 ? Infinity : -Infinity - } - return null - } - if (temporalNumber.some(({ value }) => value == null)) { - return null - } - - return temporalNumber.reduce((acc, { start, end, value }) => { - ;[start, end] = [start, end] as [string, string] - let weight = 1 - if (unit?.denominators.includes('mois')) { - weight = getDifferenceInMonths(start, end) - } else if (unit?.denominators.includes('année')) { - weight = getDifferenceInYears(start, end) - } else if (unit?.denominators.includes('jour')) { - weight = getDifferenceInDays(start, end) - } - return value * weight + acc - }, 0) -} diff --git a/publicodes/core/test/mécanismes/grille.yaml b/publicodes/core/test/mécanismes/grille.yaml index 4796dde59..33fac7ea4 100644 --- a/publicodes/core/test/mécanismes/grille.yaml +++ b/publicodes/core/test/mécanismes/grille.yaml @@ -59,7 +59,7 @@ Grille avec valeur manquante: situation: assiette: 3000 valeur attendue: 300 - - nom: 'assiette au delà du plagond' + - nom: 'assiette au delà du plafond' situation: assiette: 5000 valeur attendue: false diff --git a/publicodes/core/test/period.test.js b/publicodes/core/test/period.test.js deleted file mode 100644 index 51c0f2ec5..000000000 --- a/publicodes/core/test/period.test.js +++ /dev/null @@ -1,132 +0,0 @@ -import { expect } from 'chai' -import { - concatTemporals, - createTemporalEvaluation, - groupByYear, - zipTemporals, -} from '../source/temporal' - -const neverEnding = (value) => [{ start: null, end: null, value: value }] -describe('Periods : zip', () => { - it('should zip two empty temporalValue', () => { - const result = zipTemporals([], []) - expect(result).to.deep.equal([]) - }) - - it('should zip constant temporalValue', () => { - const result = zipTemporals(neverEnding(1), neverEnding(2)) - expect(result).to.deep.equal(neverEnding([1, 2])) - }) - - it('should zip changing temporalValue', () => { - const value1 = createTemporalEvaluation(true, { - start: null, - end: '01/08/2020', - }) - const value2 = neverEnding(1) - expect(zipTemporals(value1, value2)).to.deep.equal([ - { start: null, end: '01/08/2020', value: [true, 1] }, - { start: '02/08/2020', end: null, value: [false, 1] }, - ]) - expect(zipTemporals(value2, value1)).to.deep.equal([ - { start: null, end: '01/08/2020', value: [1, true] }, - { start: '02/08/2020', end: null, value: [1, false] }, - ]) - }) - - it('should zip two overlapping temporalValue', () => { - const value1 = createTemporalEvaluation(1, { - start: '01/07/2019', - end: '30/06/2020', - }) - const value2 = createTemporalEvaluation(2, { - start: '01/01/2019', - end: '31/12/2019', - }) - - expect(zipTemporals(value1, value2)).to.deep.equal([ - { start: null, end: '31/12/2018', value: [false, false] }, - { start: '01/01/2019', end: '30/06/2019', value: [false, 2] }, - { start: '01/07/2019', end: '31/12/2019', value: [1, 2] }, - { start: '01/01/2020', end: '30/06/2020', value: [1, false] }, - { start: '01/07/2020', end: null, value: [false, false] }, - ]) - }) -}) - -describe('Periods : concat', () => { - it('should merge concat overlapping temporalValue', () => { - const value1 = createTemporalEvaluation(10) - const value2 = [ - { start: null, end: '14/04/2019', value: 100 }, - { start: '15/04/2019', end: '08/08/2019', value: 2000 }, - { start: '09/08/2019', end: null, value: 200 }, - ] - - expect(concatTemporals([value1, value2])).to.deep.equal([ - { start: null, end: '14/04/2019', value: [10, 100] }, - { start: '15/04/2019', end: '08/08/2019', value: [10, 2000] }, - { start: '09/08/2019', end: null, value: [10, 200] }, - ]) - }) -}) - -describe('Periods : groupByYear', () => { - const invariants = (temporalYear) => { - const startDate = temporalYear[0].start - const endDate = temporalYear.slice(-1)[0].end - expect( - startDate === null || startDate.startsWith('01/01'), - 'starts at the beginning of a year' - ) - expect( - endDate === null || endDate.startsWith('31/12'), - 'stops at the end of a year' - ) - } - it('should handle constant value', () => { - const value = createTemporalEvaluation(10) - expect(groupByYear(value)).to.deep.equal([value]) - }) - it('should handle changing value', () => { - const value = createTemporalEvaluation(10, { - start: '06/06/2020', - end: '20/12/2020', - }) - const result = groupByYear(value) - expect(result).to.have.length(3) - result.forEach(invariants) - }) - it('should handle changing value over several years', () => { - const value = createTemporalEvaluation(10, { - start: '06/06/2020', - end: '20/12/2022', - }) - const result = groupByYear(value) - expect(result).to.have.length(5) - result.forEach(invariants) - }) - it('should handle complex case', () => { - const result = groupByYear( - concatTemporals([ - createTemporalEvaluation(1, { - start: '06/06/2020', - end: '20/12/2022', - }), - createTemporalEvaluation(2, { - start: '01/01/1991', - end: '20/12/1992', - }), - createTemporalEvaluation(3, { - start: '31/01/1990', - end: '20/12/2021', - }), - createTemporalEvaluation(4, { - start: '31/12/2020', - end: '01/01/2021', - }), - ]) - ) - result.forEach(invariants) - }) -}) diff --git a/publicodes/core/test/temporal.test.js b/publicodes/core/test/temporal.test.js deleted file mode 100644 index 51c0f2ec5..000000000 --- a/publicodes/core/test/temporal.test.js +++ /dev/null @@ -1,132 +0,0 @@ -import { expect } from 'chai' -import { - concatTemporals, - createTemporalEvaluation, - groupByYear, - zipTemporals, -} from '../source/temporal' - -const neverEnding = (value) => [{ start: null, end: null, value: value }] -describe('Periods : zip', () => { - it('should zip two empty temporalValue', () => { - const result = zipTemporals([], []) - expect(result).to.deep.equal([]) - }) - - it('should zip constant temporalValue', () => { - const result = zipTemporals(neverEnding(1), neverEnding(2)) - expect(result).to.deep.equal(neverEnding([1, 2])) - }) - - it('should zip changing temporalValue', () => { - const value1 = createTemporalEvaluation(true, { - start: null, - end: '01/08/2020', - }) - const value2 = neverEnding(1) - expect(zipTemporals(value1, value2)).to.deep.equal([ - { start: null, end: '01/08/2020', value: [true, 1] }, - { start: '02/08/2020', end: null, value: [false, 1] }, - ]) - expect(zipTemporals(value2, value1)).to.deep.equal([ - { start: null, end: '01/08/2020', value: [1, true] }, - { start: '02/08/2020', end: null, value: [1, false] }, - ]) - }) - - it('should zip two overlapping temporalValue', () => { - const value1 = createTemporalEvaluation(1, { - start: '01/07/2019', - end: '30/06/2020', - }) - const value2 = createTemporalEvaluation(2, { - start: '01/01/2019', - end: '31/12/2019', - }) - - expect(zipTemporals(value1, value2)).to.deep.equal([ - { start: null, end: '31/12/2018', value: [false, false] }, - { start: '01/01/2019', end: '30/06/2019', value: [false, 2] }, - { start: '01/07/2019', end: '31/12/2019', value: [1, 2] }, - { start: '01/01/2020', end: '30/06/2020', value: [1, false] }, - { start: '01/07/2020', end: null, value: [false, false] }, - ]) - }) -}) - -describe('Periods : concat', () => { - it('should merge concat overlapping temporalValue', () => { - const value1 = createTemporalEvaluation(10) - const value2 = [ - { start: null, end: '14/04/2019', value: 100 }, - { start: '15/04/2019', end: '08/08/2019', value: 2000 }, - { start: '09/08/2019', end: null, value: 200 }, - ] - - expect(concatTemporals([value1, value2])).to.deep.equal([ - { start: null, end: '14/04/2019', value: [10, 100] }, - { start: '15/04/2019', end: '08/08/2019', value: [10, 2000] }, - { start: '09/08/2019', end: null, value: [10, 200] }, - ]) - }) -}) - -describe('Periods : groupByYear', () => { - const invariants = (temporalYear) => { - const startDate = temporalYear[0].start - const endDate = temporalYear.slice(-1)[0].end - expect( - startDate === null || startDate.startsWith('01/01'), - 'starts at the beginning of a year' - ) - expect( - endDate === null || endDate.startsWith('31/12'), - 'stops at the end of a year' - ) - } - it('should handle constant value', () => { - const value = createTemporalEvaluation(10) - expect(groupByYear(value)).to.deep.equal([value]) - }) - it('should handle changing value', () => { - const value = createTemporalEvaluation(10, { - start: '06/06/2020', - end: '20/12/2020', - }) - const result = groupByYear(value) - expect(result).to.have.length(3) - result.forEach(invariants) - }) - it('should handle changing value over several years', () => { - const value = createTemporalEvaluation(10, { - start: '06/06/2020', - end: '20/12/2022', - }) - const result = groupByYear(value) - expect(result).to.have.length(5) - result.forEach(invariants) - }) - it('should handle complex case', () => { - const result = groupByYear( - concatTemporals([ - createTemporalEvaluation(1, { - start: '06/06/2020', - end: '20/12/2022', - }), - createTemporalEvaluation(2, { - start: '01/01/1991', - end: '20/12/1992', - }), - createTemporalEvaluation(3, { - start: '31/01/1990', - end: '20/12/2021', - }), - createTemporalEvaluation(4, { - start: '31/12/2020', - end: '01/01/2021', - }), - ]) - ) - result.forEach(invariants) - }) -}) diff --git a/publicodes/ui-react/source/Explanation.tsx b/publicodes/ui-react/source/Explanation.tsx index bafe2d689..ff3241544 100644 --- a/publicodes/ui-react/source/Explanation.tsx +++ b/publicodes/ui-react/source/Explanation.tsx @@ -64,7 +64,6 @@ const UIComponents = { 'une possibilité': UnePossibilité, 'résoudre référence circulaire': RésoudreRéférenceCirculaire, unité: Unité, - 'variable temporelle': () => '[variable temporelle]', variations: Variations, } as const diff --git a/publicodes/ui-react/source/index.tsx b/publicodes/ui-react/source/index.tsx index fe4dddea5..4a79e5a5a 100644 --- a/publicodes/ui-react/source/index.tsx +++ b/publicodes/ui-react/source/index.tsx @@ -67,7 +67,6 @@ export function Documentation({ defaultEngine, state?.situation ) - console.log(engine) return ( From d04d5dc1c7895940ba2ea6d5985b11dd1dc29edd Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Fri, 21 May 2021 17:03:47 +0200 Subject: [PATCH 144/319] Update README.md --- modele-social/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modele-social/README.md b/modele-social/README.md index 02e875d4b..1bacb289e 100644 --- a/modele-social/README.md +++ b/modele-social/README.md @@ -1,6 +1,6 @@ # Modèle social français en publicodes -Ce paquet contient les règles publicodes utilisées sur https://mon-entreprise.fr +Ce paquet contient les règles [publicodes](https://publi.codes) utilisées sur https://mon-entreprise.fr pour le calcul des cotisations sociales, des impôts et des droits sociaux. ### Installation From a4de5730ffd0d57b4eebc2652763cf34b5bc8303 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Thu, 29 Apr 2021 23:12:12 +0200 Subject: [PATCH 145/319] =?UTF-8?q?=F0=9F=93=9D=20Notice=20explicative=20r?= =?UTF-8?q?=C3=A9gularisations=20ind=C3=A9pendants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 39 ++++++-- .../source/components/EngineValue.tsx | 10 +- ... => IndépendantCotisationsForfaitaires.tsx} | 1 + .../IndépendantCotisationsRégularisation.tsx | 43 ++++++++ .../IndépendantExplanation.tsx | 18 +++- mon-entreprise/source/locales/rules-en.yaml | 98 ++++++++++++++----- 6 files changed, 168 insertions(+), 41 deletions(-) rename mon-entreprise/source/components/simulationExplanation/{IndépendantCotisationsForfaitaire.tsx => IndépendantCotisationsForfaitaires.tsx} (98%) create mode 100644 mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsRégularisation.tsx diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 3b1ac4a29..5417b7667 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -914,18 +914,12 @@ dirigeant . indépendant . contrats madelin . retraite . plafond: Normalement c'est le résultat fiscal qui devrait être utilisé pour l'assiette du plafond, mais on utilise le revenu professionnel pour éviter un cycle. dirigeant . indépendant . cotisations et contributions . début activité: - titre: cotisations forfaitaires de début d'activité + titre: Cotisations forfaitaires de début d'activité description: | Lorsque vous commencez votre activité, vos **revenus professionnels n’étant pas connus**, les cotisations et contributions des deux premières années sont calculées sur une **base forfaitaire**. - - Cette base s’élève à **19 % du plafond annuel de la Sécurité sociale** au titre de - la première et de la deuxième année d’activité (à l’exception de la cotisation Maladie - et indemnités journalières pour lesquelles l’assiette forfaitaire est égale à 40% du - plafond annuel de la Sécurité sociale). - Ces cotisations seront ajustées et régularisées en fonction de vos revenus réels de l’année d’exercice. Si votre revenu est supérieur à la base forfaitaire prise en compte @@ -937,6 +931,11 @@ dirigeant . indépendant . cotisations et contributions . début activité: activité. Il vous permet donc de pouvoir anticiper le montant de cette régularisation et de **planifier votre trésorerie** en conséquence. + note: + La base forfaitaire s’élève à **19 % du plafond annuel de la Sécurité sociale** au titre de + la première et de la deuxième année d’activité (à l’exception de la cotisation Maladie + et indemnités journalières pour lesquelles l’assiette forfaitaire est égale à 40% du + plafond annuel de la Sécurité sociale). applicable si: entreprise . date de création >= 01/01/2020 unité: €/an recalcul: @@ -958,7 +957,31 @@ dirigeant . indépendant . cotisations et contributions . début activité . ass références: Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/les-cotisations-provisionnelles/debut-dactivite.html - +dirigeant . indépendant . cotisations et contributions . régularisation: + titre: Comment fonctionne la régularisation des cotisations provisionnelles + description: | + Les cotisations et contributions sont calculées à titre provisionnel + sur la base du dernier revenu déclaré + (ou du montat forfaitaire, si aucun revenu n'est encore déclaré). + Une fois l'année écoulée et le revenu professionnel connu, + les cotisations et contributions sont régularisées. + + + Ce simulateur calcule les cotisations **après régularisation**. + Il vous permet donc d'anticiper le montant de cette régularisation et de planifier votre + trésorerie en conséquence. + + + Si vos revenus d'activité changent beaucoup par rapport à l'année précédente, + vous avez la possibilité de communiquer à l'URSSAF un + **montant prévisionnel pour l'année en cours, qui sera pris comme base de calcul** + (attention cependant, vous serez tenus de faire une estimation précise). + + valeur: oui + références: + Fiche Urssaf: https://www.urssaf.fr/portail/cms/render/live/fr/sites/urssaf/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/les-cotisations-provisionnelles/demande-de-modulation.html + Article L131-6-2 du Code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000037062224/ + Article D131-3 du Code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000038786941/2021-03-01/?isSuggest=true dirigeant . indépendant . cotisations et contributions . indemnités journalières maladie: synonyme: maladie 2 diff --git a/mon-entreprise/source/components/EngineValue.tsx b/mon-entreprise/source/components/EngineValue.tsx index 6fd6223a6..f0cd69785 100644 --- a/mon-entreprise/source/components/EngineValue.tsx +++ b/mon-entreprise/source/components/EngineValue.tsx @@ -1,10 +1,10 @@ import Engine, { formatValue } from 'publicodes' -import React, { useContext } from 'react' +import React from 'react' import { useTranslation } from 'react-i18next' import { DottedName } from 'modele-social' import { coerceArray } from '../utils' import RuleLink from './RuleLink' -import { EngineContext, useEngine } from './utils/EngineContext' +import { useEngine } from './utils/EngineContext' export type ValueProps = { expression: string @@ -50,11 +50,13 @@ export default function Value({ } type ConditionProps = { - expression: string | string[] + expression: + | Parameters[0] + | Parameters[0][] children: React.ReactNode } export function Condition({ expression, children }: ConditionProps) { - const engine = useContext(EngineContext) + const engine = useEngine() if ( !coerceArray(expression).every((expr) => engine.evaluate(expr).nodeValue) ) { diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaire.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaires.tsx similarity index 98% rename from mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaire.tsx rename to mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaires.tsx index 93839af6a..1b1e19d49 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaire.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaires.tsx @@ -34,6 +34,7 @@ export default function CotisationsForfaitaires() { Voir la fiche Urssaf diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsRégularisation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsRégularisation.tsx new file mode 100644 index 000000000..9c91ad1a9 --- /dev/null +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsRégularisation.tsx @@ -0,0 +1,43 @@ +import * as Animate from 'Components/ui/animate' +import Emoji from 'Components/utils/Emoji' +import { useEngine } from 'Components/utils/EngineContext' +import { Markdown } from 'Components/utils/markdown' +import { Trans } from 'react-i18next' + +export default function CotisationsRégularisation() { + const rule = useEngine().getRule( + 'dirigeant . indépendant . cotisations et contributions . régularisation' + ) + return ( + +
    +

    {rule.title}

    +
    + +
    + + {rule.rawNode.références && ( +

    + + Voir la fiche Urssaf + +

    + )} +
    +
    + ) +} diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 9761439a4..f6aef3cb8 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -4,14 +4,15 @@ import Value, { Condition } from 'Components/EngineValue' import RuleLink from 'Components/RuleLink' import StackedBarChart from 'Components/StackedBarChart' import { ThemeColorsContext } from 'Components/utils/colors' -import { EngineContext } from 'Components/utils/EngineContext' +import { useEngine } from 'Components/utils/EngineContext' import { DottedName } from 'modele-social' import { max } from 'ramda' import { useContext } from 'react' import { Trans, useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { targetUnitSelector } from 'Selectors/simulationSelectors' -import CotisationsForfaitaires from './IndépendantCotisationsForfaitaire' +import CotisationsForfaitaires from './IndépendantCotisationsForfaitaires' +import CotisationsRégularisation from './IndépendantCotisationsRégularisation' import PLExplanation from './PLExplanation' import { DistributionSection } from './SalaryExplanation' @@ -24,6 +25,15 @@ export default function IndépendantExplanation() { + + + @@ -125,7 +135,7 @@ const CotisationsSection: Partial>> = { function Distribution() { const targetUnit = useSelector(targetUnitSelector) - const engine = useContext(EngineContext) + const engine = useEngine() const distribution = (Object.entries( CotisationsSection ).map(([section, cotisations]) => [ @@ -172,7 +182,7 @@ function DistributionBranch({ icon, maximum, }: DistributionBranchProps) { - const branche = useContext(EngineContext).getRule(dottedName) + const branche = useEngine().getRule(dottedName) return ( @@ -6434,6 +6423,65 @@ dirigeant . indépendant . cotisations et contributions . non déductibles: dirigeant . indépendant . cotisations et contributions . retraite de base: titre.en: '[automatic] basic retirement' titre.fr: retraite de base +dirigeant . indépendant . cotisations et contributions . régularisation: + description.en: > + [automatic] Contributions are calculated provisionally + + on the basis of the last declared income + + (or the lump sum, if no income has yet been declared). + + Once the year is over and the professional income is known + + the contributions are adjusted. + + + + This simulator calculates the contributions **after adjustment**. + + It therefore enables you to anticipate the amount of this regularisation and to plan your cash flow + + your cash flow accordingly. + + + + If your activity income changes significantly compared to the previous year + + you have the possibility to communicate to URSSAF a + + forecast amount for the current year, which will be taken as the basis for the calculation** (be careful, however, you will be required to make an accurate estimate). + + (be careful, however, you will be required to make an accurate estimate). + description.fr: > + Les cotisations et contributions sont calculées à titre provisionnel + + sur la base du dernier revenu déclaré + + (ou du montat forfaitaire, si aucun revenu n'est encore déclaré). + + Une fois l'année écoulée et le revenu professionnel connu, + + les cotisations et contributions sont régularisées. + + + + Ce simulateur calcule les cotisations **après régularisation**. + + Il vous permet donc d'anticiper le montant de cette régularisation et de planifier votre + + trésorerie en conséquence. + + + + Si vos revenus d'activité changent beaucoup par rapport à l'année précédente, + + vous avez la possibilité de communiquer à l'URSSAF un + + **montant prévisionnel pour l'année en cours, qui sera pris comme base de calcul** + + (attention cependant, vous serez tenus de faire une estimation précise). + titre.en: '[automatic] How the adjustment of provisional contributions works' + titre.fr: Comment fonctionne la régularisation des cotisations provisionnelles dirigeant . indépendant . revenu professionnel: description.en: "[automatic] remuneration of the manager under the self-employed From 80780239377f0d8b5097ce8eb718d3eff4632fbf Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 25 May 2021 12:22:48 +0200 Subject: [PATCH 146/319] :fountain_pen: Ajoute un lien vers l'offre de recrutement depuis la section /dev --- .../source/pages/integration/index.tsx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/mon-entreprise/source/pages/integration/index.tsx b/mon-entreprise/source/pages/integration/index.tsx index 91941903f..89c5b0c99 100644 --- a/mon-entreprise/source/pages/integration/index.tsx +++ b/mon-entreprise/source/pages/integration/index.tsx @@ -17,6 +17,7 @@ export default function Integration() { <> + {pathname !== sitePaths.integration.index && ( )} +
    + 📯{' '} + + + Mon-entreprise.fr recrute ! + + {' '} + Freelance Typescript / React pour 6 mois minimum +
    From 1dcd02e7715f2e69917e7b168c065bef6449ffbd Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 25 May 2021 18:10:39 +0200 Subject: [PATCH 147/319] Simpler condition component (#1578) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🔥 Simplify Condition component + WhenApplicable * create an explicit type of not-yet defined Publicodes value * Condition now expect only boolean-valued expressions * use WhenApplicable and WhenNotApplicable to check for applicability * refactor codebase accordingly * rework Payslip Line component. --- .../source/components/EngineValue.tsx | 69 ++++++++++++++++--- .../source/components/PaySlipSections.tsx | 29 ++++++-- .../source/components/TargetSelection.tsx | 4 +- .../IndépendantExplanation.tsx | 20 +++--- .../AideDéclarationIndépendant/index.tsx | 10 +-- .../pages/Simulateurs/ArtisteAuteur.tsx | 2 +- mon-entreprise/source/utils.ts | 4 -- publicodes/core/source/AST/types.ts | 14 +++- publicodes/core/source/index.ts | 11 ++- 9 files changed, 121 insertions(+), 42 deletions(-) diff --git a/mon-entreprise/source/components/EngineValue.tsx b/mon-entreprise/source/components/EngineValue.tsx index f0cd69785..58b7cdf97 100644 --- a/mon-entreprise/source/components/EngineValue.tsx +++ b/mon-entreprise/source/components/EngineValue.tsx @@ -1,8 +1,13 @@ -import Engine, { formatValue } from 'publicodes' +import Engine, { + ASTNode, + formatValue, + PublicodesExpression, + isNotYetDefined, + UNSAFE_isNotApplicable, +} from 'publicodes' import React from 'react' import { useTranslation } from 'react-i18next' import { DottedName } from 'modele-social' -import { coerceArray } from '../utils' import RuleLink from './RuleLink' import { useEngine } from './utils/EngineContext' @@ -50,16 +55,62 @@ export default function Value({ } type ConditionProps = { - expression: - | Parameters[0] - | Parameters[0][] + expression: PublicodesExpression | ASTNode + defaultIfNotYetDefined?: boolean children: React.ReactNode } -export function Condition({ expression, children }: ConditionProps) { +export function Condition({ + expression, + defaultIfNotYetDefined = false, + children, +}: ConditionProps) { const engine = useEngine() - if ( - !coerceArray(expression).every((expr) => engine.evaluate(expr).nodeValue) - ) { + const value = engine.evaluate(expression).nodeValue + const boolValue = isNotYetDefined(value) ? defaultIfNotYetDefined : value + + if (Boolean(boolValue) !== boolValue) { + console.error( + `[ CONDITION NON-BOOLEENNE ] dans le composant Condition: expression=${expression}` + ) + } + if (!boolValue) { + return null + } + return <>{children} +} + +export function WhenApplicable({ + dottedName, + children, +}: { + dottedName: DottedName + children: React.ReactNode +}) { + const engine = useEngine() + if (UNSAFE_isNotApplicable(engine, dottedName)) return null + return <>{children} +} +export function WhenNotApplicable({ + dottedName, + children, +}: { + dottedName: DottedName + children: React.ReactNode +}) { + const engine = useEngine() + if (!UNSAFE_isNotApplicable(engine, dottedName)) return null + return <>{children} +} + +export function WhenAlreadyDefined({ + dottedName: dottedName, + children, +}: { + dottedName: DottedName + children: React.ReactNode +}) { + const engine = useEngine() + if (isNotYetDefined(engine.evaluate(dottedName).nodeValue)) { return null } return <>{children} diff --git a/mon-entreprise/source/components/PaySlipSections.tsx b/mon-entreprise/source/components/PaySlipSections.tsx index a58167b72..b0b1d82f6 100644 --- a/mon-entreprise/source/components/PaySlipSections.tsx +++ b/mon-entreprise/source/components/PaySlipSections.tsx @@ -1,7 +1,9 @@ import Value, { Condition, ValueProps } from 'Components/EngineValue' import RuleLink from 'Components/RuleLink' import { DottedName } from 'modele-social' +import { isNotYetDefined, isNotApplicable } from 'publicodes' import { Trans } from 'react-i18next' +import { useEngine } from './utils/EngineContext' export const SalaireBrutSection = () => { return ( @@ -33,10 +35,12 @@ export const SalaireNetSection = () => {

    @@ -52,7 +56,7 @@ export const SalaireNetSection = () => { rule="contrat salarié . rémunération . net" className="payslip__total" /> - + + <> - + ) } diff --git a/mon-entreprise/source/components/TargetSelection.tsx b/mon-entreprise/source/components/TargetSelection.tsx index 5687a1b37..aea3cbaee 100644 --- a/mon-entreprise/source/components/TargetSelection.tsx +++ b/mon-entreprise/source/components/TargetSelection.tsx @@ -268,7 +268,7 @@ function TitreRestaurant() { const dottedName = 'contrat salarié . frais professionnels . titres-restaurant . montant' return ( - + 0`}>
    @@ -313,7 +313,7 @@ function AidesGlimpse() { aides ) return ( - + 0`}>
    diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index f6aef3cb8..3dc6a7f98 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -1,6 +1,10 @@ import BarChartBranch from 'Components/BarChart' import 'Components/Distribution.css' -import Value, { Condition } from 'Components/EngineValue' +import Value, { + Condition, + WhenApplicable, + WhenNotApplicable, +} from 'Components/EngineValue' import RuleLink from 'Components/RuleLink' import StackedBarChart from 'Components/StackedBarChart' import { ThemeColorsContext } from 'Components/utils/colors' @@ -22,18 +26,12 @@ export default function IndépendantExplanation() { return ( <> - + - - + + - + diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 00bdfd8e9..b2dc4d7db 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -2,7 +2,7 @@ import { updateSituation } from 'Actions/actions' import Aide from 'Components/conversation/Aide' import { Explicable, ExplicableRule } from 'Components/conversation/Explicable' import RuleInput from 'Components/conversation/RuleInput' -import Value, { Condition } from 'Components/EngineValue' +import Value, { Condition, WhenAlreadyDefined } from 'Components/EngineValue' import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' import RuleLink from 'Components/RuleLink' import 'Components/TargetSelection.css' @@ -155,7 +155,7 @@ export default function AideDéclarationIndépendant() { {/* PLNR */} - + @@ -192,16 +192,16 @@ export default function AideDéclarationIndépendant() { dottedName="dirigeant . indépendant . revenus étrangers" hideTitle /> - + )} - + - + )} diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx index 7e89aea94..c9ba58215 100644 --- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx @@ -36,7 +36,7 @@ function CotisationsResult() { return ( <> - + diff --git a/mon-entreprise/source/utils.ts b/mon-entreprise/source/utils.ts index 5cc804c7d..7414a28c2 100644 --- a/mon-entreprise/source/utils.ts +++ b/mon-entreprise/source/utils.ts @@ -47,10 +47,6 @@ export function mapOrApply(fn: (a: A) => B, x: A | Array) { return Array.isArray(x) ? x.map(fn) : fn(x) } -export function coerceArray(x: A | Array): Array { - return Array.isArray(x) ? x : [x] -} - export function getSessionStorage() { // In some browsers like Brave, even just reading the variable sessionStorage // is throwing an error in the iframe, so we can't do things if sessionStorage !== undefined diff --git a/publicodes/core/source/AST/types.ts b/publicodes/core/source/AST/types.ts index 516a2fae7..18437a557 100644 --- a/publicodes/core/source/AST/types.ts +++ b/publicodes/core/source/AST/types.ts @@ -112,6 +112,18 @@ type EvaluationDecoration = { unit?: Unit } export type Types = number | boolean | string | Record -export type Evaluation = T | false | null +// TODO: type NotYetDefined & NotApplicable properly (see #14) then refactor any code depending on these: +export type NotYetDefined = null +export function isNotYetDefined(value): value is NotYetDefined { + return value === null +} +export type NotApplicable = false +export function isNotApplicable(value): value is NotApplicable { + return typeof value === 'boolean' && value === false +} +export type Evaluation = + | T + | NotApplicable + | NotYetDefined export type EvaluatedNode = ASTNode & EvaluationDecoration diff --git a/publicodes/core/source/index.ts b/publicodes/core/source/index.ts index 807f83643..ca388237d 100644 --- a/publicodes/core/source/index.ts +++ b/publicodes/core/source/index.ts @@ -41,7 +41,14 @@ export type EvaluationOptions = Partial<{ }> export { reduceAST, makeASTTransformer as transformAST } from './AST/index' -export { Evaluation, Unit } from './AST/types' +export { + Evaluation, + Unit, + NotYetDefined, + isNotYetDefined, + NotApplicable, + isNotApplicable, +} from './AST/types' export { capitalise0, formatValue } from './format' export { simplifyNodeUnit } from './nodeUnits' export { default as serializeEvaluation } from './serializeEvaluation' @@ -49,7 +56,7 @@ export { parseUnit, serializeUnit } from './units' export { parsePublicodes, utils } export { Rule, RuleNode, ASTNode, EvaluatedNode } -type PublicodesExpression = string | Record | number +export type PublicodesExpression = string | Record | number export type Logger = { log(message: string): void From a678c25dcfb5bb1b82a1af72c9ee64f23e7bfe11 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 26 May 2021 10:27:38 +0200 Subject: [PATCH 148/319] =?UTF-8?q?:bug:=20enl=C3=A8ve=20la=20question=20s?= =?UTF-8?q?ur=20IS/IR=20dans=20le=20simulateur=20salari=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/impôt.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modele-social/règles/impôt.yaml b/modele-social/règles/impôt.yaml index 643040ee9..a13aa7f56 100644 --- a/modele-social/règles/impôt.yaml +++ b/modele-social/règles/impôt.yaml @@ -349,7 +349,10 @@ impôt . foyer fiscal . revenu imposable: formule: somme: - revenu d'activité abattu - - applicable si: entreprise . imposition . IR + - applicable si: + toutes ces conditions: + - dirigeant . rémunération . imposable + - entreprise . imposition . IR valeur: dirigeant . rémunération . imposable - autres revenus imposables From ea4fd57f9bca46c1d5f8adeb9f99b0b3c470c628 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 11 May 2021 10:03:31 +0200 Subject: [PATCH 149/319] =?UTF-8?q?:fountain=5Fpen:=20Corrige=20les=20text?= =?UTF-8?q?es=20relatifs=20au=20simulateur=20ind=C3=A9pendant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 22 +++++++++------- .../règles/entreprise-établissement.yaml | 26 +++++++++---------- .../source/components/SimulateurWarning.tsx | 7 ++--- .../source/components/StackedBarChart.tsx | 3 +-- .../IndépendantExplanation.tsx | 3 +-- .../pages/Simulateurs/AutoEntrepreneur.tsx | 2 +- .../Simulateurs/IndépendantSimulation.tsx | 2 +- 7 files changed, 33 insertions(+), 32 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 5417b7667..687cf5728 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -31,8 +31,8 @@ dirigeant . rémunération . totale: - sinon: entreprise . chiffre d'affaires - entreprise . charges dirigeant . rémunération . nette: - titre: rémunération nette - question: Quelle est votre rémunération nette ? + titre: revenu net + question: Quelle est votre revenu net ? résumé: Après déduction des cotisations, contributions et charges somme: - rémunération . totale @@ -48,7 +48,7 @@ dirigeant . rémunération . cotisations: alors: auto-entrepreneur . cotisations et contributions dirigeant . rémunération . imposable: - titre: Rémunération imposable + titre: revenu imposable variations: - si: assimilé salarié alors: contrat salarié . rémunération . net imposable @@ -64,7 +64,7 @@ dirigeant . rémunération . impôt: dirigeant . rémunération . nette après impôt: - titre: Rémunération après impôt + titre: Revenu après impôt unité: €/an arrondi: oui question: Quel est le revenu net après impôt souhaité ? @@ -726,6 +726,7 @@ dirigeant . indépendant . cotisations et contributions . cotisations: - (- exonérations) dirigeant . indépendant . cotisations et contributions: + titre: cotisations et contributions sociales description: | C'est le montant total dû par l'indépendant au titre des cotisations et contributions obligatoires ainsi qu'au titre de ses cotisations facultatives @@ -821,7 +822,8 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac . rev dirigeant . indépendant . contrats madelin: titre: Contrats Madelin - question: Avez-vous souscrit à des contrats de complémentaire privée dits "contrats Madelin" + question: | + Avez-vous souscrit à un contrat de prévoyance et / ou de retraite complémentaire privé dits « contrat Madelin » par défaut: non références: economie.gouv.fr: https://www.economie.gouv.fr/particuliers/reduction-impot-revenu-investissements-entreprise-pme-madelin @@ -848,11 +850,11 @@ dirigeant . indépendant . contrats madelin . part non-déductible fiscalement: formule: montant - part déductible fiscalement dirigeant . indépendant . contrats madelin . mutuelle: - titre: Souscription à un contrat de mutuelle Madelin - question: Quel est le montant que vous versez à un contrat de mutuelle Madelin ? + titre: Souscription à un contrat de prévoyance complémentaire Madelin + question: Quel est le montant que vous versez pour vos contrats Madelin de prévoyance complémentaire (santé, perte d'emploi subie) ? description: | - Si vous cotisez au titre d'un contrat de mutuelle de type loi Madelin, - vous pouvez déduire une partie de ces cotisations des bénéfices + Si vous cotisez au titre d'un contrat de prévoyance complémentaire (santé, perte d'emploi subie) + de type loi Madelin, vous pouvez déduire ces cotisations des bénéfices imposables que vous déclarez pour votre activité non salariée. références: Fiche impôts: https://www.impots.gouv.fr/portail/particulier/questions/je-cotise-un-contrat-madelin-quel-est-mon-avantage-fiscal @@ -881,7 +883,7 @@ dirigeant . indépendant . contrats madelin . mutuelle . plafond: Normalement c'est le résultat fiscal qui devrait être utilisé pour l'assiette du plafond, mais on utilise le revenu professionnel pour éviter un cycle. dirigeant . indépendant . contrats madelin . retraite: titre: Souscription à une retraite Madelin - question: Quel est le montant que vous versez à votre contrat Madelin retraite ? + question: Quel est le montant que vous versez pour votre contrat Madelin retraite complémentaire ? description: | Si vous cotisez au titre d'un contrat retraite de type loi Madelin, vous pouvez déduire une partie de ces cotisations des bénéfices diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index e376e6aef..819799a70 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -97,9 +97,11 @@ entreprise . chiffre d'affaires . vente restauration hébergement: ### Restauration et hébergement Il s’agit du chiffre d'affaires de toutes les opérations de restauration - ou hébergement (hors meublé de tourisme classé) + ou hébergement - Ces revenus sont imposable au régime BIC + > Note : pour les locations meublées, seules les locations de meublé de tourisme classé et de chambre d’hôte entrent dans cette catégorie hébergement ; les autres locations meublées relèvent de la catégorie « Prestations de service BIC » + + Ces revenus sont imposables dans la catégorie des BIC références: service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32919 définition vente de bien (impots.gouv): https://www.impots.gouv.fr/portail/professionnel/achatvente-de-biens @@ -255,10 +257,9 @@ entreprise . imposition . IR . micro-fiscal: rend non applicable: dirigeant . indépendant . contrats madelin question: Avez-vous opté pour le régime micro-fiscal ? description: | - Avec le régime micro fiscal, les charges déductible sont estimées forfaitairement, comme un pourcentage du chiffre d'affaires. - Ce pourcentage dépend du type d'activité. - - Cette option permet de simplifier votre comptabilité, et peut-être avantageuse en terme de revenu dans le cas où vos charges de fonctionnement sont faibles. + Avec le régime micro fiscal, les charges déductibles sont estimées forfaitairement,en fonction d’un pourcentage du chiffre d’affaires. Ce pourcentage dépend du type d’activité : 71% pour les activités de vente, restauration et hébergement (location de meublé de tourisme classé et chambre d’hôte), 50% pour les prestations de service commerciales ou artisanales, 34% pour les activités libérales. + + Cette option permet de simplifier votre comptabilité et peut être avantageuse en termes de revenu imposable et soumis à cotisations et contributions sociales dans le cas où vos charges de fonctionnement sont faibles. par défaut: non entreprise . imposition . IR . micro-fiscal . revenu abattu: @@ -804,16 +805,15 @@ entreprise . activité . mixte: Par exemple, une entreprise de plomberie qui facture l'achat et la pose d'un robinet a une partie de son chiffre d'affaires en vente de materiel (le robinet) - et une partie en prestation de service (la pose) + et une partie en prestation de service (la pose). - Il existe trois principales familles de revenus au yeux de l'administration - fiscale et sociale : + Il existe trois catégories avec des taux d’abattement forfaitaire pour frais différents : - - [Ventes de biens, restauration et hébergement (BIC)](/documentation/entreprise/chiffre-d'affaires/vente-restauration-hébergement) - - [Prestation de service commerciale ou artisanale (BIC)](/documentation/entreprise/chiffre-d'affaires/prestations-de-service-BIC) - - [Autres prestation de service et activité libérale (BNC)](/documentation/entreprise/chiffre-d'affaires/prestations-de-service-BNC) + - [Ventes de biens, restauration et hébergement (BIC)](/documentation/entreprise/chiffre-d'affaires/vente-restauration-hébergement) (abattement de 71%) + - [Prestation de service commerciale ou artisanale (BIC)](/documentation/entreprise/chiffre-d'affaires/service-BIC) (abattement de 50%) + - [Autres prestation de service et activité libérale (BNC)](/documentation/entreprise/chiffre-d'affaires/service-BNC) (abattement de 34%) - Si votre entreprise a des activités correspondants à plus d'un type de + Si votre entreprise a des activités correspondants à plusieurs catégories de revenus, répondez oui à cette question. entreprise . activité . mixte . proportions: diff --git a/mon-entreprise/source/components/SimulateurWarning.tsx b/mon-entreprise/source/components/SimulateurWarning.tsx index 3b3f990f4..dd31c8a9f 100644 --- a/mon-entreprise/source/components/SimulateurWarning.tsx +++ b/mon-entreprise/source/components/SimulateurWarning.tsx @@ -45,7 +45,8 @@ export default function SimulateurWarning({
  • Les calculs sont indicatifs. Ils ne se substituent pas aux - décomptes réels de l’Urssaf, du fisc ou autre. + décomptes réels de l’Urssaf, de l’administration fiscale ou de + toute autre organisme.
  • )} @@ -88,8 +89,8 @@ export default function SimulateurWarning({ {['indépendant', 'profession-libérale'].includes(simulateur) && (
  • - Le montant des cotisations est calculé pour un revenu sur l'année - 2020. + Le montant calculé correspond aux cotisations de l’année 2021 + (pour un revenu 2021).
  • )} diff --git a/mon-entreprise/source/components/StackedBarChart.tsx b/mon-entreprise/source/components/StackedBarChart.tsx index 0e232ef16..2c52ec74a 100644 --- a/mon-entreprise/source/components/StackedBarChart.tsx +++ b/mon-entreprise/source/components/StackedBarChart.tsx @@ -29,6 +29,7 @@ const BarStackLegend = styled.div` display: flex; margin-top: 10px; flex-direction: column; + justify-content: space-between; @media (min-width: 800px) { flex-direction: row; @@ -37,9 +38,7 @@ const BarStackLegend = styled.div` ` const BarStackLegendItem = styled.div` - flex: 1 1 0px; color: #555; - strong { display: inline-block; color: #111; diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 3dc6a7f98..ceffa0fbf 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -37,7 +37,7 @@ export default function IndépendantExplanation() {
    -

    Répartition de la rémunération totale

    +

    Répartition du revenu

    - + diff --git a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx index 443e8233f..532343696 100644 --- a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx @@ -100,7 +100,7 @@ function IndépendantSimulationGoals() { /> - + From 13af90ae5eb386743d4ca96ace66744e1c7fa70d Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 11 May 2021 14:03:13 +0200 Subject: [PATCH 150/319] =?UTF-8?q?:hammer:=20correction=20calculs=20dirig?= =?UTF-8?q?eant=20ind=C3=A9pendant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 687cf5728..e5bc87585 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -682,6 +682,7 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . retraite compl dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire . assiette: titre: assiette retraite complémentaire + unité: €/an formule: le minimum de: - variations: @@ -764,6 +765,8 @@ dirigeant . indépendant . assiette minimale . maladie: produit: assiette: plafond sécurité sociale temps plein taux: 40% + unité: €/an + arrondi: oui références: cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/ @@ -774,6 +777,8 @@ dirigeant . indépendant . assiette minimale . retraite: produit: assiette: plafond sécurité sociale temps plein taux: 11.5% + unité: €/an + arrondi: oui références: cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/ @@ -1042,7 +1047,7 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux RSA: multiplicateur: plafond sécurité sociale temps plein tranches: - plafond: 40% - taux: 3.16% + taux: 3.17% - plafond: 110% taux: 6.35% note: | @@ -1060,7 +1065,7 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux progres - plafond: 0% taux: 0% - plafond: 40% - taux: 3.16% + taux: 3.17% - plafond: 110% taux: 6.35% références: From 2a0e546ee8d19f8904fcbb1ae552ece1949bebd4 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 11 May 2021 14:05:39 +0200 Subject: [PATCH 151/319] :alien: traductions manquantes' --- mon-entreprise/source/locales/rules-en.yaml | 170 ++++++++++++-------- 1 file changed, 99 insertions(+), 71 deletions(-) diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 990487004..e612aa28d 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -6024,11 +6024,12 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . assiette: : titre.en: basic retirement titre.fr: retraite de base dirigeant . indépendant . contrats madelin: - question.en: - '[automatic] Have you subscribed to private supplementary insurance - contracts known as "Madelin contracts"?' - question.fr: Avez-vous souscrit à des contrats de complémentaire privée dits - "contrats Madelin" + question.en: > + [automatic] Have you subscribed to a private provident and/or supplementary + pension contract known as a "Madelin contract"? + question.fr: > + Avez-vous souscrit à un contrat de prévoyance et / ou de retraite + complémentaire privé dits « contrat Madelin » titre.en: Madelin Contracts titre.fr: Contrats Madelin dirigeant . indépendant . contrats madelin . montant: @@ -6036,20 +6037,25 @@ dirigeant . indépendant . contrats madelin . montant: titre.fr: Somme des cotisations à contrats Madelin dirigeant . indépendant . contrats madelin . mutuelle: description.en: > - [automatic] If you contribute under a mutual insurance contract such as the - Madelin law, + [automatic] If you contribute to a supplementary insurance contract (health, + loss of employment) - you can deduct part of these contributions from your profits; and + under the Madelin law, you can deduct these contributions from the taxable profits + + that you declare for your self-employed activity. + description.fr: > + Si vous cotisez au titre d'un contrat de prévoyance complémentaire (santé, + perte d'emploi subie) + + de type loi Madelin, vous pouvez déduire ces cotisations des bénéfices - taxable persons that you declare for your self-employed activity. - description.fr: | - Si vous cotisez au titre d'un contrat de mutuelle de type loi Madelin, - vous pouvez déduire une partie de ces cotisations des bénéfices imposables que vous déclarez pour votre activité non salariée. - question.en: '[automatic] How much do you pay to a Madelin Mutual contract?' - question.fr: Quel est le montant que vous versez à un contrat de mutuelle Madelin ? - titre.en: '[automatic] Subscription to a Madelin mutual insurance contract' - titre.fr: Souscription à un contrat de mutuelle Madelin + question.en: '[automatic] How much do you pay for your Madelin supplementary + insurance policies (health, sudden loss of employment)?' + question.fr: Quel est le montant que vous versez pour vos contrats Madelin de + prévoyance complémentaire (santé, perte d'emploi subie) ? + titre.en: '[automatic] Subscribing to a Madelin supplementary insurance contract' + titre.fr: Souscription à un contrat de prévoyance complémentaire Madelin dirigeant . indépendant . contrats madelin . mutuelle . plafond: note.en: > [automatic] Normally it is the tax result that should be used for the cap @@ -6078,8 +6084,10 @@ dirigeant . indépendant . contrats madelin . retraite: Si vous cotisez au titre d'un contrat retraite de type loi Madelin, vous pouvez déduire une partie de ces cotisations des bénéfices imposables que vous déclarez pour votre activité non salariée. - question.en: '[automatic] How much do you pay into your Madelin retraite contract?' - question.fr: Quel est le montant que vous versez à votre contrat Madelin retraite ? + question.en: '[automatic] How much do you pay for your Madelin supplementary + pension contract?' + question.fr: Quel est le montant que vous versez pour votre contrat Madelin + retraite complémentaire ? titre.en: '[automatic] Madelin Retirement Subscription' titre.fr: Souscription à une retraite Madelin dirigeant . indépendant . contrats madelin . retraite . plafond: @@ -6108,8 +6116,8 @@ dirigeant . indépendant . cotisations et contributions: À la différence des cotisations, les contributions ne sont pas réintroduites pour le calcul de la CSG/CRDS. Elles ne bénéficient pas non plus de la réduction ACRE. - titre.en: all contributions - titre.fr: cotisations et contributions + titre.en: '[automatic] social contributions' + titre.fr: cotisations et contributions sociales dirigeant . indépendant . cotisations et contributions . CSG et CRDS: titre.en: CSG and CRDS titre.fr: CSG et CRDS @@ -6524,18 +6532,18 @@ dirigeant . rémunération . cotisations: titre.en: '[automatic] contributions' titre.fr: cotisations dirigeant . rémunération . imposable: - titre.en: '[automatic] Taxable remuneration' - titre.fr: Rémunération imposable + titre.en: '[automatic] taxable income' + titre.fr: revenu imposable dirigeant . rémunération . impôt: titre.en: '[automatic] tax' titre.fr: impôt dirigeant . rémunération . nette: - question.en: '[automatic] What is your net pay?' - question.fr: Quelle est votre rémunération nette ? + question.en: '[automatic] What is your net income?' + question.fr: Quelle est votre revenu net ? résumé.en: '[automatic] After deduction of contributions and expenses' résumé.fr: Après déduction des cotisations, contributions et charges - titre.en: '[automatic] net pay' - titre.fr: rémunération nette + titre.en: '[automatic] net income' + titre.fr: revenu net dirigeant . rémunération . nette après impôt: description.en: '[automatic] The net income after deduction of income tax and social security contributions.' @@ -6545,8 +6553,8 @@ dirigeant . rémunération . nette après impôt: question.fr: Quel est le revenu net après impôt souhaité ? résumé.en: '[automatic] What you get from this activity' résumé.fr: Ce que vous rapporte cette activité - titre.en: '[automatic] After-tax compensation' - titre.fr: Rémunération après impôt + titre.en: '[automatic] After-tax income' + titre.fr: Revenu après impôt dirigeant . rémunération . totale: description.en: > [automatic] This is what the company spends in total for the remuneration of @@ -6760,33 +6768,31 @@ entreprise . activité . libérale réglementée: entreprise . activité . mixte: description.en: > [automatic] It is possible to have several activities with different types - of income + of income for the same - different for the same company. + for the same company. - For example, a plumbing company that charges for the purchase and installation of a + For example, a plumbing company that charges for the purchase and installation of a faucet - robinet has a part of its turnover in sales of equipment (the tap) + faucet has a part of its turnover in sale of material (the faucet) - and a part in service provision (the installation) + and a part in service provision (the installation). - There are three main families of income in the eyes of the administration - - fiscal and social : + There are three categories with different standard expense allowance rates: - - (Sales of goods, restaurants and accommodation (BIC))(/documentation/enterprise/turnover/sales-restaurants and accommodation) + - [Sales of goods, catering and accommodation (BIC)](/documentation/company/turnover/sales-restoration-accommodation) (71% allowance) - - Commercial or craft services (BIC)](/documentation/enterprise/turnover/ BIC services) + - Commercial or artisanal services (BIC)](/documentation/company/turnover/service-BIC) (50% deduction) - - (Other services and liberal activity (NCBs))(/documentation/enterprise/turnover/services- NCBs) + - Other services and liberal activities (BNC)](/documentation/company/turnover/service-BNC) (34% deduction) - If your company has activities that correspond to more than one type of + If your company has activities corresponding to several categories of income, answer yes to this - returned, answer yes to this question. + answer yes to this question. description.fr: > Il est possible d'avoir plusieurs activités avec des types de revenus @@ -6797,22 +6803,20 @@ entreprise . activité . mixte: robinet a une partie de son chiffre d'affaires en vente de materiel (le robinet) - et une partie en prestation de service (la pose) + et une partie en prestation de service (la pose). - Il existe trois principales familles de revenus au yeux de l'administration - - fiscale et sociale : + Il existe trois catégories avec des taux d’abattement forfaitaire pour frais différents : - - [Ventes de biens, restauration et hébergement (BIC)](/documentation/entreprise/chiffre-d'affaires/vente-restauration-hébergement) + - [Ventes de biens, restauration et hébergement (BIC)](/documentation/entreprise/chiffre-d'affaires/vente-restauration-hébergement) (abattement de 71%) - - [Prestation de service commerciale ou artisanale (BIC)](/documentation/entreprise/chiffre-d'affaires/prestations-de-service-BIC) + - [Prestation de service commerciale ou artisanale (BIC)](/documentation/entreprise/chiffre-d'affaires/service-BIC) (abattement de 50%) - - [Autres prestation de service et activité libérale (BNC)](/documentation/entreprise/chiffre-d'affaires/prestations-de-service-BNC) + - [Autres prestation de service et activité libérale (BNC)](/documentation/entreprise/chiffre-d'affaires/service-BNC) (abattement de 34%) - Si votre entreprise a des activités correspondants à plus d'un type de + Si votre entreprise a des activités correspondants à plusieurs catégories de revenus, répondez oui à cette question. question.en: '[automatic] Does your company have several types of activities?' @@ -7130,28 +7134,48 @@ entreprise . chiffre d'affaires . seuil micro dépassé: titre.en: '[automatic] micro threshold exceeded' titre.fr: seuil micro dépassé entreprise . chiffre d'affaires . vente restauration hébergement: - description.en: | - [automatic] ### Sale of goods - This is the turnover of all operations involving - transfer of ownership of tangible property, i.e., property with a + description.en: > + [automatic] Sale of goods + + This is the turnover of all transactions involving + + transfer of ownership of a tangible asset, i.e. an asset that has a physical + material existence. - ### Catering and hosting - This is the turnover of all catering operations. - or lodging (except classified tourist accommodation) - This income is taxable under the BIC regime - description.fr: | + Catering and accommodation + + This is the turnover of all catering and accommodation operations + + or accommodation + + + Note: for furnished rentals, only classified furnished tourist accommodation and guest rooms are included in this accommodation category; other furnished rentals are included in the "Provision of BIC services" category + + + This income is taxable in the BIC category + description.fr: > ### Vente de biens + Il s’agit du chiffre d'affaires de toutes les opérations comportant + transfert de propriété d'un bien corporel, c'est-à-dire un bien ayant une + existence matérielle. - ### Restauration et hébergement - Il s’agit du chiffre d'affaires de toutes les opérations de restauration - ou hébergement (hors meublé de tourisme classé) - Ces revenus sont imposable au régime BIC + ### Restauration et hébergement + + Il s’agit du chiffre d'affaires de toutes les opérations de restauration + + ou hébergement + + + > Note : pour les locations meublées, seules les locations de meublé de tourisme classé et de chambre d’hôte entrent dans cette catégorie hébergement ; les autres locations meublées relèvent de la catégorie « Prestations de service BIC » + + + Ces revenus sont imposables dans la catégorie des BIC question.en: '[automatic] What is the turnover from the sale of goods, food or accommodation?' question.fr: Quel est le chiffre d'affaires issus de la vente de bien, @@ -7357,20 +7381,24 @@ entreprise . imposition . IR . information sur le report de déficit: entreprise . imposition . IR . micro-fiscal: description.en: > [automatic] With the micro tax system, the deductible expenses are estimated - as a percentage of the turnover. - - This percentage depends on the type of activity. + on a flat rate basis, according to a percentage of the turnover. This + percentage depends on the type of activity: 71% for sales, catering and + accommodation (rental of classified furnished tourist accommodation and + guest rooms), 50% for commercial or craft services, 34% for liberal + activities. - This option allows you to simplify your accounting, and can be advantageous in terms of income if your operating costs are low. + This option allows you to simplify your accounting and can be advantageous in terms of taxable income and subject to social security contributions if your operating expenses are low. description.fr: > - Avec le régime micro fiscal, les charges déductible sont estimées - forfaitairement, comme un pourcentage du chiffre d'affaires. - - Ce pourcentage dépend du type d'activité. + Avec le régime micro fiscal, les charges déductibles sont estimées + forfaitairement,en fonction d’un pourcentage du chiffre d’affaires. Ce + pourcentage dépend du type d’activité : 71% pour les activités de vente, + restauration et hébergement (location de meublé de tourisme classé et + chambre d’hôte), 50% pour les prestations de service commerciales ou + artisanales, 34% pour les activités libérales. - Cette option permet de simplifier votre comptabilité, et peut-être avantageuse en terme de revenu dans le cas où vos charges de fonctionnement sont faibles. + Cette option permet de simplifier votre comptabilité et peut être avantageuse en termes de revenu imposable et soumis à cotisations et contributions sociales dans le cas où vos charges de fonctionnement sont faibles. question.en: '[automatic] Have you opted for the micro-tax system?' question.fr: Avez-vous opté pour le régime micro-fiscal ? titre.en: '[automatic] micro-tax' From cb2610b253a7bb34f0582bdab676e9ff181f57a3 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 11 May 2021 14:12:53 +0200 Subject: [PATCH 152/319] :green_heart: tests de non regressions --- .../__snapshots__/simulations.jest.js.snap | 132 +++++++++--------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 355b16117..78f74754d 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -10,29 +10,29 @@ exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,2220]"`; exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,1339]"`; -exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11408,14534]"`; +exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11409,14535]"`; exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[86,214]"`; -exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1060,1475]"`; +exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1061,1476]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9020,11467]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9021,11468]"`; exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,119]"`; exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[33,183]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7546,9433]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7548,9435]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14092,17407]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,17408]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13578,16893]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13577,16892]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11461,14776]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11462,14777]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14097,17392]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14098,17393]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,14776]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11462,14777]"`; exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5651,8931]"`; @@ -41,45 +41,45 @@ exports[`calculate aide-déclaration-indépendant: international 1`] = ` Notifications affichées : impôt . domiciliation étranger non implémentée" `; -exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,13245]"`; +exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11876,13246]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11362,14657]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11363,14658]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1366,1796]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1368,1798]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11367,14647]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11368,14648]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1368,1783]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1369,1784]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[11367,14647] +"[11368,14648] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1368,1783]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1369,1784]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` -"[9453,12733] +"[9454,12734] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[1041,1169] +"[1042,1170] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[1041,1201] +"[1042,1202] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1066,1258]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1067,1259]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1109,1333]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1110,1334]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1368,1783]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1369,1784]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2203,2936]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2204,2937]"`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` "[20929,27392] @@ -205,13 +205,13 @@ exports[`calculate simulations-impot-société: prorata temporis 3`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13180,16820,17883,467,16353,0,30000,7072]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13181,16819,17881,467,16352,0,30000,7072]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14380,15620,17883,467,15153,0,30000,8272]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14381,15619,17881,467,15152,0,30000,8272]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,875,18746,0,30000,4272]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10381,19619,20431,874,18745,0,30000,4272]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6730,13270,13810,0,13270,0,20000,3772]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6732,13268,13808,0,13268,0,20000,3772]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` "[300000,79622,220378,228521,82429,137949,0,300000,9772] @@ -220,55 +220,55 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3272]"`; -exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000,20787,931,19069,0,29084,3272]"`; +exports[`calculate simulations-indépendant: activité 1`] = `"[29085,9085,20000,20787,931,19069,0,29085,3272]"`; -exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,931,19069,0,29100,3288]"`; +exports[`calculate simulations-indépendant: activité 2`] = `"[29101,9101,20000,20787,931,19069,0,29101,3288]"`; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1372,1272,100,134,0,100,0,1372,3272]"`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1373,1273,100,134,0,100,0,1373,3272]"`; exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246,3272]"`; exports[`calculate simulations-indépendant: imposition à l'IS 1`] = ` -"[100000,30104,69896,72608,15122,54774,0,100000,3272] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" +"[100000,30105,69895,72609,15123,54772,0,100000,3272] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: imposition à l'IS 2`] = ` -"[100000,30104,69896,72608,15122,54774,0,100000,3272] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" +"[100000,30105,69895,72609,15123,54772,0,100000,3272] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084,3272]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29085,9085,20000,20787,603,19397,0,29085,3272]"`; exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3272]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084,3272]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29085,9085,20000,20787,2079,17921,0,29085,3272]"`; -exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1385,615,667,0,615,0,2000,3272]"`; +exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1386,614,666,0,614,0,2000,3272]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,4612,29385,0,50000,3272]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35352,4611,29386,0,50000,3272]"`; -exports[`calculate simulations-indépendant: inversions 3`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; +exports[`calculate simulations-indépendant: inversions 3`] = `"[14597,4597,10000,10394,0,10000,0,14597,3272]"`; exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3272]"`; -exports[`calculate simulations-indépendant: inversions 5`] = `"[14596,4596,10000,10394,0,10000,1000,15596,3272]"`; +exports[`calculate simulations-indépendant: inversions 5`] = `"[14597,4597,10000,10394,0,10000,1000,15597,3272]"`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5927,13073,13585,0,13073,1000,20000,3272]"`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5929,13071,13584,0,13071,1000,20000,3272]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5624,12376,12861,0,12376,2000,20000,3272]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5627,12373,12860,0,12373,2000,20000,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1859,1359,500,548,0,500,0,1859,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1860,1360,500,548,0,500,0,1860,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2468,1468,1000,1064,0,1000,0,2468,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3076,1576,1500,1581,0,1500,0,3076,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3682,1682,2000,2097,0,2000,0,3682,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3683,1683,2000,2097,0,2000,0,3683,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7427,2427,5000,5199,0,5000,0,7427,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7428,2428,5000,5199,0,5000,0,7428,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14597,4597,10000,10394,0,10000,0,14597,3272]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` "[139593,39593,100000,103788,28472,71528,0,139593,3272] @@ -491,54 +491,54 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12270,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22331,0,16308,4,32]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22330,0,16308,4,32]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16820,0,13327,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16819,0,13326,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15620,0,13327,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15619,0,13326,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19621,0,14602,4,28]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19619,0,14601,4,28]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13270,0,9835,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13268,0,9834,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` "[0,220378,0,57933,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13170,0,9785,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13168,0,9784,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13768,0,10084,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,null,4,0]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10076,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13757,0,10075,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13768,0,10084,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13768,0,10084,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6795,0,4976,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6794,0,4976,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13768,0,10084,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` -"[0,-1044,0,0,3,21] +"[0,-1045,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` -"[0,-225,0,0,3,21] +"[0,-226,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,615,0,471,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,614,0,470,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3084,0,2266,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3083,0,2266,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6795,0,4976,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6794,0,4976,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13768,0,10084,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33997,0,24913,4,48]"`; From 245463ec7527b1846c68c6858c7fb356e41fe946 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 26 May 2021 17:05:32 +0200 Subject: [PATCH 153/319] =?UTF-8?q?Corrige=20le=20taux=20progressif=20de?= =?UTF-8?q?=20la=20cotisation=20maladie=20des=20ind=C3=A9pendant=20au=20RS?= =?UTF-8?q?A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 82 +++++++++------------ mon-entreprise/source/locales/rules-en.yaml | 43 +++++++---- 2 files changed, 62 insertions(+), 63 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index e5bc87585..49a6a7255 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -628,18 +628,18 @@ dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . moi dirigeant . indépendant . conjoint collaborateur . cotisations . assiette: titre: assiette conjoint collaborateur - formule: - produit: - assiette: assiette des cotisations - taux: 1 / 3 - variations: - - si: assiette . forfaitaire - alors: - assiette: plafond sécurité sociale temps plein - - si: assiette . pourcentage . moitié - alors: - taux: 50% - - sinon: rien + unité: €/an + produit: + assiette: assiette des cotisations + taux: 1 / 3 + variations: + - si: assiette . forfaitaire + alors: + assiette: plafond sécurité sociale temps plein + - si: assiette . pourcentage . moitié + alors: + taux: 50% + # sinon rien ne change dirigeant . indépendant . conjoint collaborateur . cotisations: titre: Cotisations conjoint collaborateur @@ -683,13 +683,12 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . retraite compl dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire . assiette: titre: assiette retraite complémentaire unité: €/an - formule: - le minimum de: - - variations: - - si: entreprise . activité = 'artisanale' - alors: 4 * plafond sécurité sociale temps plein - - sinon: 3 * plafond sécurité sociale temps plein - - assiette retraite + valeur: assiette retraite + plafond: + variations: + - si: entreprise . activité = 'artisanale' + alors: 4 * plafond sécurité sociale temps plein + - sinon: 3 * plafond sécurité sociale temps plein dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès . assiette: titre: assiette invalidité et décès @@ -733,8 +732,6 @@ dirigeant . indépendant . cotisations et contributions: contributions obligatoires ainsi qu'au titre de ses cotisations facultatives telles que les contrats Madelin. - Ce montant inclut la réduction de cotisation "covid" en 2020. - somme: - cotisations et contributions . cotisations - conjoint collaborateur . cotisations @@ -1034,44 +1031,35 @@ dirigeant . indépendant . cotisations et contributions . maladie: Le terme "lorsque" laisse entendre qu'en cas de dépassement du seuil 5xPSS, tout le revenu est soumis à 6.5%. Il semblerait qu'une interprétation inverse soit à privilégier : seule la part supérieure à ce seuil est soumise à ce taux, et c'est cette implémentation que nous avons retenue. - -dirigeant . indépendant . cotisations et contributions . maladie . taux RSA: - # TODO: Il n'est pour l'instant pas possible de rendre non applicable une - # seule tranche d'un barème dans le mécanisme "taux progressif", ce qui - # éviterait de devoir créer 2 règles séparées avec 2 barèmes distincts. - applicable si: situation personnelle . RSA - remplace: taux progressif - unité: '%' - taux progressif: - assiette: assiette des cotisations - multiplicateur: plafond sécurité sociale temps plein - tranches: - - plafond: 40% - taux: 3.17% - - plafond: 110% - taux: 6.35% - note: | - Pour les indépendants au RSA, seule la réduction simple définie dans - le décret de calcul de la cotisation maladie est prise en compte. - La réduction renforcée en-dessous de 40% du plafond de la sécurité - sociale ne l'est pas, car il n'y a pas d'assiette minimale. - dirigeant . indépendant . cotisations et contributions . maladie . taux progressif: + description: | + Le taux de la cotisations maladie est progressif en fonction du revenu déclaré. + note: | + Pour les indépendants bénéficiant du RSA ou de la prime d'activité, seule la réduction simple + définie dans le décret de calcul de la cotisation maladie est prise en compte. + + La réduction en-dessous de 40% du plafond de la sécurité sociale ne l'est pas, car il n'y a pas + d'assiette minimale. taux progressif: - assiette: assiette des cotisations + assiette: + valeur: assiette des cotisations + plancher: + applicable si: situation personnelle . RSA + valeur: 40% * plafond sécurité sociale temps plein multiplicateur: plafond sécurité sociale temps plein tranches: - plafond: 0% - taux: 0% - - plafond: 40% - taux: 3.17% + taux: 1.35% - plafond: 110% taux: 6.35% + arrondi: 2 unités + unité: '%' références: Taux de cotisations: https://www.secu-independants.fr/cotisations/calcul-cotisations/taux-de-cotisations/ décret formule de calcul: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000036342439&categorieLien=id + dirigeant . indépendant . cotisations et contributions . retraite de base: barème: assiette: diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index e612aa28d..5be59e6a0 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -6106,8 +6106,6 @@ dirigeant . indépendant . cotisations et contributions: C'est le montant total dû par l'indépendant au titre des cotisations et contributions obligatoires ainsi qu'au titre de ses cotisations facultatives telles que les contrats Madelin. - - Ce montant inclut la réduction de cotisation "covid" en 2020. note.en: | [automatic] Unlike contributions, contributions are not reintroduced for the calculation of the CSG/CRDS. They also do not benefit from the @@ -6394,21 +6392,34 @@ dirigeant . indépendant . cotisations et contributions . maladie: Le terme "lorsque" laisse entendre qu'en cas de dépassement du seuil 5xPSS, tout le revenu est soumis à 6.5%. Il semblerait qu'une interprétation inverse soit à privilégier : seule la part supérieure à ce seuil est soumise à ce taux, et c'est cette implémentation que nous avons retenue. titre.en: '[automatic] disease' titre.fr: maladie -dirigeant . indépendant . cotisations et contributions . maladie . taux RSA: - note.en: | - [automatic] For RSA freelancers, only the simple reduction defined in - the decree for calculating the health contribution is taken into account. - The reinforced reduction below 40% of the security ceiling - social is not, because there is no minimum base. - note.fr: | - Pour les indépendants au RSA, seule la réduction simple définie dans - le décret de calcul de la cotisation maladie est prise en compte. - La réduction renforcée en-dessous de 40% du plafond de la sécurité - sociale ne l'est pas, car il n'y a pas d'assiette minimale. - titre.en: '[automatic] RSA rate' - titre.fr: taux RSA ? dirigeant . indépendant . cotisations et contributions . maladie . taux progressif -: titre.en: '[automatic] progressive rate' +: description.en: > + [automatic] The rate of the health contribution is progressive according to + the declared income. + description.fr: > + Le taux de la cotisations maladie est progressif en fonction du revenu + déclaré. + note.en: > + [automatic] For self-employed persons receiving the RSA or the activity + allowance, only the simple reduction + + defined in the decree for calculating the health contribution is taken into account. + + + The reduction below 40% of the social security ceiling is not, because there is no minimum + + minimum base. + note.fr: > + Pour les indépendants bénéficiant du RSA ou de la prime d'activité, seule la + réduction simple + + définie dans le décret de calcul de la cotisation maladie est prise en compte. + + + La réduction en-dessous de 40% du plafond de la sécurité sociale ne l'est pas, car il n'y a pas + + d'assiette minimale. + titre.en: '[automatic] progressive rate' titre.fr: taux progressif ? dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger : description.en: From c8e0d907bd2fed8c7f41cc2f89a0af49043baf41 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 26 May 2021 17:07:56 +0200 Subject: [PATCH 154/319] =?UTF-8?q?Met=20=C3=A0=20jour=20la=20valeur=20du?= =?UTF-8?q?=20point=20RCI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/protection-sociale.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modele-social/règles/protection-sociale.yaml b/modele-social/règles/protection-sociale.yaml index a7eab0a66..db4694747 100644 --- a/modele-social/règles/protection-sociale.yaml +++ b/modele-social/règles/protection-sociale.yaml @@ -204,6 +204,7 @@ protection sociale . retraite . complémentaire salarié . points acquis: service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F15396 protection sociale . retraite . complémentaire indépendants: + acronyme: RCI non applicable si: toutes ces conditions: - entreprise . activité = 'libérale' @@ -225,8 +226,7 @@ protection sociale . retraite . complémentaire indépendants . points acquis: valeur: dirigeant . indépendant . cotisations et contributions . retraite complémentaire / prix d'achat du point protection sociale . retraite . complémentaire indépendants . prix d'achat du point: - formule: 17.515 €/point - notes: il s'agit du prix d'achat 2018 (la valeur pour 2019 sur le site secu-independants.fr est marquée comme N.C) + formule: 17.765 €/point références: secu-independants.fr: https://www.secu-independants.fr/baremes/baremes-2018/baremesprestations-maladie-maternite/?reg=ile-de-france-centre&ae=oui From 57cd4886c58f82e0ad6a7b12babc24eda60e3abd Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 26 May 2021 18:00:43 +0200 Subject: [PATCH 155/319] =?UTF-8?q?Corrige=20le=20calcul=20des=20cotisatio?= =?UTF-8?q?ns=20forfaitaires=20de=20d=C3=A9but=20d'activit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 6 +++--- publicodes/core/source/mecanisms/recalcul.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 49a6a7255..61e893623 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -945,13 +945,12 @@ dirigeant . indépendant . cotisations et contributions . début activité: recalcul: règle: cotisations et contributions avec: + maladie . taux progressif . assiette: 40% * plafond sécurité sociale temps plein assiette des cotisations: assiette forfaitaire - assiette des cotisations . sans plancher: assiette forfaitaire - situation personnelle . RSA: non + CSG et CRDS . assiette: assiette forfaitaire références: Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/lajustement-et-la-regularisation.html - dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire: produit: assiette: PSS proratisé @@ -1043,6 +1042,7 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux progres d'assiette minimale. taux progressif: assiette: + nom: assiette valeur: assiette des cotisations plancher: applicable si: situation personnelle . RSA diff --git a/publicodes/core/source/mecanisms/recalcul.ts b/publicodes/core/source/mecanisms/recalcul.ts index 8db2f9423..bfcecf8f1 100644 --- a/publicodes/core/source/mecanisms/recalcul.ts +++ b/publicodes/core/source/mecanisms/recalcul.ts @@ -18,7 +18,7 @@ export type RecalculNode = { const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { if (this.cache._meta.inRecalcul) { - return (defaultNode(false) as any) as RecalculNode & EvaluatedNode + return (defaultNode(null) as any) as RecalculNode & EvaluatedNode } const amendedSituation = node.explanation.amendedSituation From c7fae4248d6ee0b68f03812a50dc0a0a8938d2fa Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 27 May 2021 10:20:44 +0200 Subject: [PATCH 156/319] =?UTF-8?q?:green=5Fheart:=20r=C3=A9pare=20les=20t?= =?UTF-8?q?ests=20de=20non=20regression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__snapshots__/simulations.jest.js.snap | 148 +++++++++--------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 78f74754d..8b3a2d7bc 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -6,7 +6,7 @@ exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,1965]"`; exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,715]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,2220]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1537,2270]"`; exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,1339]"`; @@ -22,41 +22,41 @@ exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,11 exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[33,183]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7548,9435]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7546,9433]"`; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,17408]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13577,16892]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[11933,15248]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11462,14777]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11933,15248]"`; exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14098,17393]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11462,14777]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,14776]"`; -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5651,8931]"`; +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5652,8932]"`; exports[`calculate aide-déclaration-indépendant: international 1`] = ` "[14610,14713] Notifications affichées : impôt . domiciliation étranger non implémentée" `; -exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11876,13246]"`; +exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,13245]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11363,14658]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11365,14660]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1368,1798]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1533,1963]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11368,14648]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11369,14649]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1369,1784]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1534,1949]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[11368,14648] +"[11369,14649] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1369,1784]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1534,1949]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` "[9454,12734] @@ -64,22 +64,22 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[1042,1170] +"[1264,1392] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[1042,1202] +"[1264,1424] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1067,1259]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1267,1459]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1110,1334]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1305,1529]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1369,1784]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1534,1949]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2204,2937]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2303,3036]"`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` "[20929,27392] @@ -205,78 +205,78 @@ exports[`calculate simulations-impot-société: prorata temporis 3`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13181,16819,17881,467,16352,0,30000,7072]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13181,16819,17881,467,16352,0,30000,7359]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14381,15619,17881,467,15152,0,30000,8272]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14381,15619,17881,467,15152,0,30000,8559]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10381,19619,20431,874,18745,0,30000,4272]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10381,19619,20431,874,18745,0,30000,4559]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6732,13268,13808,0,13268,0,20000,3772]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6754,13246,13786,0,13246,0,20000,4059]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` -"[300000,79622,220378,228521,82429,137949,0,300000,9772] +"[300000,79622,220378,228521,82429,137949,0,300000,10059] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3272]"`; +exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3559]"`; -exports[`calculate simulations-indépendant: activité 1`] = `"[29085,9085,20000,20787,931,19069,0,29085,3272]"`; +exports[`calculate simulations-indépendant: activité 1`] = `"[29086,9086,20000,20787,931,19069,0,29086,3559]"`; -exports[`calculate simulations-indépendant: activité 2`] = `"[29101,9101,20000,20787,931,19069,0,29101,3288]"`; +exports[`calculate simulations-indépendant: activité 2`] = `"[29102,9102,20000,20787,931,19069,0,29102,3575]"`; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1373,1273,100,134,0,100,0,1373,3272]"`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1617,1517,100,141,0,100,0,1617,3559]"`; -exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246,3272]"`; +exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246,3211]"`; exports[`calculate simulations-indépendant: imposition à l'IS 1`] = ` -"[100000,30105,69895,72609,15123,54772,0,100000,3272] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[100000,30104,69896,72608,15122,54774,0,100000,3559] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" `; exports[`calculate simulations-indépendant: imposition à l'IS 2`] = ` -"[100000,30105,69895,72609,15123,54772,0,100000,3272] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[100000,30104,69896,72608,15122,54774,0,100000,3559] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" `; -exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29085,9085,20000,20787,603,19397,0,29085,3272]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29086,9086,20000,20787,603,19397,0,29086,3559]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3272]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3559]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29085,9085,20000,20787,2079,17921,0,29085,3272]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29086,9086,20000,20787,2079,17921,0,29086,3559]"`; -exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1386,614,666,0,614,0,2000,3272]"`; +exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1581,419,471,0,419,0,2000,3559]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35352,4611,29386,0,50000,3272]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16004,33996,35351,4611,29385,0,50000,3559]"`; -exports[`calculate simulations-indépendant: inversions 3`] = `"[14597,4597,10000,10394,0,10000,0,14597,3272]"`; +exports[`calculate simulations-indépendant: inversions 3`] = `"[14687,4687,10000,10396,0,10000,0,14687,3559]"`; -exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3272]"`; +exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3559]"`; -exports[`calculate simulations-indépendant: inversions 5`] = `"[14597,4597,10000,10394,0,10000,1000,15597,3272]"`; +exports[`calculate simulations-indépendant: inversions 5`] = `"[14687,4687,10000,10396,0,10000,1000,15687,3559]"`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5929,13071,13584,0,13071,1000,20000,3272]"`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5959,13041,13554,0,13041,1000,20000,3559]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5627,12373,12860,0,12373,2000,20000,3272]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5664,12336,12821,0,12336,2000,20000,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1860,1360,500,548,0,500,0,1860,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[2097,1597,500,554,0,500,0,2097,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2468,1468,1000,1064,0,1000,0,2468,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2697,1697,1000,1070,0,1000,0,2697,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3076,1576,1500,1581,0,1500,0,3076,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3298,1798,1500,1587,0,1500,0,3298,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3683,1683,2000,2097,0,2000,0,3683,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3897,1897,2000,2103,0,2000,0,3897,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7428,2428,5000,5199,0,5000,0,7428,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7595,2595,5000,5203,0,5000,0,7595,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14597,4597,10000,10394,0,10000,0,14597,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14687,4687,10000,10396,0,10000,0,14687,3559]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` -"[139593,39593,100000,103788,28472,71528,0,139593,3272] +"[139593,39593,100000,103788,28472,71528,0,139593,3559] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` -"[1239954,239954,1000000,1033666,473591,526409,0,1239954,3272] +"[1239954,239954,1000000,1033666,473591,526409,0,1239954,3559] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -487,63 +487,63 @@ exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): éc Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] = `"[0,8392,0,6102,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] = `"[0,8392,0,6077,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12270,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12220,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22330,0,16308,4,32]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22330,0,16241,4,32]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16819,0,13326,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16819,0,13265,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15619,0,13326,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15619,0,13265,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19619,0,14601,4,28]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19619,0,14540,4,28]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13268,0,9834,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13246,0,9776,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` -"[0,220378,0,57933,4,56] +"[0,220378,0,57407,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13168,0,9784,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13146,0,9726,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13768,0,10084,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13746,0,10026,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,null,4,0]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13757,0,10075,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13734,0,10017,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13768,0,10084,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13746,0,10026,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13768,0,10084,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13746,0,10026,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6794,0,4976,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6695,0,4886,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13768,0,10084,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13746,0,10026,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` -"[0,-1045,0,0,3,21] +"[0,-1267,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` -"[0,-226,0,0,3,21] +"[0,-448,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,614,0,470,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,419,0,331,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3083,0,2266,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,2918,0,2142,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6794,0,4976,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6695,0,4886,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13768,0,10084,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13746,0,10026,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33997,0,24913,4,48]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33996,0,24810,4,48]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 8`] = ` -"[0,69895,0,36428,4,56] +"[0,69895,0,36204,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; From 3cc8094ff61716cb3d3d3e325d7aa3423a1358c4 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 27 May 2021 10:39:24 +0200 Subject: [PATCH 157/319] Retours acoss sur le calcul du taux maladie --- modele-social/règles/dirigeant.yaml | 40 ++++--- modele-social/règles/profession-libérale.yaml | 27 ++--- mon-entreprise/source/locales/rules-en.yaml | 29 ++--- .../__snapshots__/simulations.jest.js.snap | 104 +++++++++--------- 4 files changed, 100 insertions(+), 100 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 61e893623..64e2da36b 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -705,9 +705,10 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et arrondi: oui dirigeant . indépendant . conjoint collaborateur . cotisations . indemnités journalières maladie: - unité: €/an produit: - assiette: 40% * plafond sécurité sociale temps plein + assiette: + valeur: 40% * plafond sécurité sociale temps plein + unité: €/an taux: cotisations et contributions . indemnités journalières maladie . taux arrondi: oui @@ -1013,7 +1014,9 @@ dirigeant . indépendant . cotisations et contributions . maladie: plancher: assiette minimale . maladie multiplicateur: plafond sécurité sociale temps plein tranches: - - taux: taux progressif + - taux: + valeur: taux progressif + arrondi: 2 unités plafond: 110% - taux: 6.35% plafond: 5 @@ -1030,31 +1033,38 @@ dirigeant . indépendant . cotisations et contributions . maladie: Le terme "lorsque" laisse entendre qu'en cas de dépassement du seuil 5xPSS, tout le revenu est soumis à 6.5%. Il semblerait qu'une interprétation inverse soit à privilégier : seule la part supérieure à ce seuil est soumise à ce taux, et c'est cette implémentation que nous avons retenue. - +dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire: + description: | + La réduction supplémentaire du taux maladie pour les revenu inférieurs à 40% du plafond de la sécurité sociale + non applicable si: situation personnelle . RSA + remplace: + règle: taux progressif + par: taux progressif - réduction supplémentaire + taux progressif: + assiette: assiette + multiplicateur: plafond sécurité sociale temps plein + tranches: + - plafond: 0% + taux: 1.35% + - plafond: 40% + taux: 0% + références: + Taux de cotisations: https://www.secu-independants.fr/cotisations/calcul-cotisations/taux-de-cotisations/ + décret formule de calcul: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000036342439&categorieLien=id + dirigeant . indépendant . cotisations et contributions . maladie . taux progressif: description: | Le taux de la cotisations maladie est progressif en fonction du revenu déclaré. - note: | - Pour les indépendants bénéficiant du RSA ou de la prime d'activité, seule la réduction simple - définie dans le décret de calcul de la cotisation maladie est prise en compte. - - La réduction en-dessous de 40% du plafond de la sécurité sociale ne l'est pas, car il n'y a pas - d'assiette minimale. taux progressif: assiette: nom: assiette valeur: assiette des cotisations - plancher: - applicable si: situation personnelle . RSA - valeur: 40% * plafond sécurité sociale temps plein multiplicateur: plafond sécurité sociale temps plein tranches: - plafond: 0% taux: 1.35% - plafond: 110% taux: 6.35% - arrondi: 2 unités - unité: '%' références: Taux de cotisations: https://www.secu-independants.fr/cotisations/calcul-cotisations/taux-de-cotisations/ décret formule de calcul: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000036342439&categorieLien=id diff --git a/modele-social/règles/profession-libérale.yaml b/modele-social/règles/profession-libérale.yaml index a5ff7ccb0..09a793fbc 100644 --- a/modele-social/règles/profession-libérale.yaml +++ b/modele-social/règles/profession-libérale.yaml @@ -177,19 +177,20 @@ dirigeant . indépendant . PL . maladie: - régime général - PAMC remplace: cotisations et contributions . maladie - formule: - produit: - assiette: indépendant . assiette des cotisations - taux: - taux progressif: - assiette: indépendant . assiette des cotisations - multiplicateur: plafond sécurité sociale temps plein - tranches: - - plafond: 0% - taux: 1.5% - - plafond: 110% - taux: 6.5% - arrondi: oui + produit: + assiette: + valeur: assiette des cotisations + plancher: assiette minimale . maladie + taux: + taux progressif: + assiette: assiette des cotisations + multiplicateur: plafond sécurité sociale temps plein + tranches: + - plafond: 0% + taux: 1.5% + - plafond: 110% + taux: 6.5% + arrondi: oui références: secu-independants.fr: https://www.secu-independants.fr/cotisations/calcul-des-cotisations/taux-de-cotisations guide urssaf (pdf): https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 5be59e6a0..2d977bdbf 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -6399,28 +6399,17 @@ dirigeant . indépendant . cotisations et contributions . maladie: description.fr: > Le taux de la cotisations maladie est progressif en fonction du revenu déclaré. - note.en: > - [automatic] For self-employed persons receiving the RSA or the activity - allowance, only the simple reduction - - defined in the decree for calculating the health contribution is taken into account. - - - The reduction below 40% of the social security ceiling is not, because there is no minimum - - minimum base. - note.fr: > - Pour les indépendants bénéficiant du RSA ou de la prime d'activité, seule la - réduction simple - - définie dans le décret de calcul de la cotisation maladie est prise en compte. - - - La réduction en-dessous de 40% du plafond de la sécurité sociale ne l'est pas, car il n'y a pas - - d'assiette minimale. titre.en: '[automatic] progressive rate' titre.fr: taux progressif +? dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire +: description.en: > + [automatic] Additional reduction of the sickness rate for income below 40% + of the social security ceiling + description.fr: > + La réduction supplémentaire du taux maladie pour les revenu inférieurs à 40% + du plafond de la sécurité sociale + titre.en: '[automatic] further reduction' + titre.fr: réduction supplémentaire ? dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger : description.en: '[automatic] In return for the CSG exemption, contributors have diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 8b3a2d7bc..6842f3fc7 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -6,15 +6,15 @@ exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,1965]"`; exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,715]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1537,2270]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,2220]"`; exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,1339]"`; exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11409,14535]"`; -exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[86,214]"`; +exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[82,210]"`; -exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1061,1476]"`; +exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,1436]"`; exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9021,11468]"`; @@ -45,18 +45,18 @@ exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875, exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11365,14660]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1533,1963]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1368,1798]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11369,14649]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1534,1949]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1369,1784]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` "[11369,14649] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1534,1949]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1369,1784]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` "[9454,12734] @@ -64,22 +64,22 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[1264,1392] +"[1042,1170] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[1264,1424] +"[1042,1202] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1267,1459]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1067,1259]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1305,1529]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1110,1334]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1534,1949]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1369,1784]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2303,3036]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2204,2937]"`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` "[20929,27392] @@ -211,7 +211,7 @@ exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,143 exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10381,19619,20431,874,18745,0,30000,4559]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6754,13246,13786,0,13246,0,20000,4059]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6732,13268,13809,0,13268,0,20000,4059]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` "[300000,79622,220378,228521,82429,137949,0,300000,10059] @@ -224,18 +224,18 @@ exports[`calculate simulations-indépendant: activité 1`] = `"[29086,9086,20000 exports[`calculate simulations-indépendant: activité 2`] = `"[29102,9102,20000,20787,931,19069,0,29102,3575]"`; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1617,1517,100,141,0,100,0,1617,3559]"`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1375,1275,100,135,0,100,0,1375,3559]"`; -exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246,3211]"`; +exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[244,144,100,104,0,100,0,244,3211]"`; exports[`calculate simulations-indépendant: imposition à l'IS 1`] = ` -"[100000,30104,69896,72608,15122,54774,0,100000,3559] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" +"[100000,30105,69895,72609,15123,54772,0,100000,3559] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: imposition à l'IS 2`] = ` -"[100000,30104,69896,72608,15122,54774,0,100000,3559] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" +"[100000,30105,69895,72609,15123,54772,0,100000,3559] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29086,9086,20000,20787,603,19397,0,29086,3559]"`; @@ -244,31 +244,31 @@ exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023 exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29086,9086,20000,20787,2079,17921,0,29086,3559]"`; -exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1581,419,471,0,419,0,2000,3559]"`; +exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1386,614,666,0,614,0,2000,3559]"`; exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16004,33996,35351,4611,29385,0,50000,3559]"`; -exports[`calculate simulations-indépendant: inversions 3`] = `"[14687,4687,10000,10396,0,10000,0,14687,3559]"`; +exports[`calculate simulations-indépendant: inversions 3`] = `"[14597,4597,10000,10394,0,10000,0,14597,3559]"`; exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3559]"`; -exports[`calculate simulations-indépendant: inversions 5`] = `"[14687,4687,10000,10396,0,10000,1000,15687,3559]"`; +exports[`calculate simulations-indépendant: inversions 5`] = `"[14597,4597,10000,10394,0,10000,1000,15597,3559]"`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5959,13041,13554,0,13041,1000,20000,3559]"`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5929,13071,13584,0,13071,1000,20000,3559]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5664,12336,12821,0,12336,2000,20000,3559]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5627,12373,12860,0,12373,2000,20000,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[2097,1597,500,554,0,500,0,2097,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1861,1361,500,548,0,500,0,1861,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2697,1697,1000,1070,0,1000,0,2697,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3298,1798,1500,1587,0,1500,0,3298,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3897,1897,2000,2103,0,2000,0,3897,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3683,1683,2000,2097,0,2000,0,3683,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7595,2595,5000,5203,0,5000,0,7595,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7428,2428,5000,5199,0,5000,0,7428,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14687,4687,10000,10396,0,10000,0,14687,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14597,4597,10000,10394,0,10000,0,14597,3559]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` "[139593,39593,100000,103788,28472,71528,0,139593,3559] @@ -280,17 +280,17 @@ exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[2873,0,2373,500,0,500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[3147,0,2647,500,0,500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3433,0,2433,1000,0,1000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3708,0,2708,1000,0,1000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[3994,0,2494,1500,0,1500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[4267,0,2767,1500,0,1500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4554,0,2554,2000,0,2000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4827,0,2827,2000,0,2000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[7987,0,2987,5000,0,5000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[8245,0,3245,5000,0,5000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14244,0,4244,10000,0,10000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14422,0,4422,10000,0,10000]"`; exports[`calculate simulations-professions-libérales: CIPAV 7`] = ` "[146241,0,46241,100000,28546,71454] @@ -318,7 +318,7 @@ exports[`calculate simulations-professions-libérales: avocat 2`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,85,14866]"`; +exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5076,14924,81,14843]"`; exports[`calculate simulations-professions-libérales: expert-comptable 2`] = ` "[50000,0,14877,35123,4949,30174] @@ -499,46 +499,46 @@ exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19619,0,14540,4,28]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13246,0,9776,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13268,0,9793,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` "[0,220378,0,57407,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13146,0,9726,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13168,0,9743,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13746,0,10026,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13768,0,10043,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,null,4,0]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14515,0,null,4,0]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13734,0,10017,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10035,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13746,0,10026,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13768,0,10043,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13746,0,10026,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13768,0,10043,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6695,0,4886,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6794,0,4956,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13746,0,10026,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13768,0,10043,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` -"[0,-1267,0,0,3,21] +"[0,-1045,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` -"[0,-448,0,0,3,21] +"[0,-226,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,419,0,331,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,614,0,468,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,2918,0,2142,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3083,0,2257,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6695,0,4886,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6794,0,4956,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13746,0,10026,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13768,0,10043,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33996,0,24810,4,48]"`; From b6ebe51324e671291c1afa3eac9278894a39afe1 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 27 May 2021 12:12:49 +0200 Subject: [PATCH 158/319] =?UTF-8?q?utilise=20WhenAlreadyDefined=20plut?= =?UTF-8?q?=C3=B4t=20que=20Condition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 2 -- mon-entreprise/source/locales/rules-en.yaml | 8 +------- .../source/pages/Simulateurs/AutoEntrepreneur.tsx | 6 +++--- .../source/pages/Simulateurs/IndépendantSimulation.tsx | 6 +++--- 4 files changed, 7 insertions(+), 15 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 64e2da36b..9cfdf5286 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -1053,8 +1053,6 @@ dirigeant . indépendant . cotisations et contributions . maladie . taux progres décret formule de calcul: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000036342439&categorieLien=id dirigeant . indépendant . cotisations et contributions . maladie . taux progressif: - description: | - Le taux de la cotisations maladie est progressif en fonction du revenu déclaré. taux progressif: assiette: nom: assiette diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 2d977bdbf..d34628c20 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -6393,13 +6393,7 @@ dirigeant . indépendant . cotisations et contributions . maladie: titre.en: '[automatic] disease' titre.fr: maladie ? dirigeant . indépendant . cotisations et contributions . maladie . taux progressif -: description.en: > - [automatic] The rate of the health contribution is progressive according to - the declared income. - description.fr: > - Le taux de la cotisations maladie est progressif en fonction du revenu - déclaré. - titre.en: '[automatic] progressive rate' +: titre.en: '[automatic] progressive rate' titre.fr: taux progressif ? dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire : description.en: > diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index 7427409d0..a6e1e4ed6 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -1,6 +1,6 @@ import { batchUpdateSituation } from 'Actions/actions' import { Explicable } from 'Components/conversation/Explicable' -import { Condition } from 'Components/EngineValue' +import { Condition, WhenAlreadyDefined } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' import Simulation from 'Components/Simulation' @@ -103,9 +103,9 @@ export default function AutoEntrepreneur() { dottedName="dirigeant . auto-entrepreneur . cotisations et contributions" /> - + - + diff --git a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx index 532343696..406d78e97 100644 --- a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx @@ -1,6 +1,6 @@ import { updateSituation } from 'Actions/actions' import Banner from 'Components/Banner' -import { Condition } from 'Components/EngineValue' +import { Condition, WhenAlreadyDefined } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' import Simulation from 'Components/Simulation' @@ -100,9 +100,9 @@ function IndépendantSimulationGoals() { /> - + - + ) From c8e26cbc95180ecbf41f1153e6fed4fa339cb7a0 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 21 May 2021 12:49:37 +0200 Subject: [PATCH 159/319] =?UTF-8?q?=F0=9F=96=8A=20Change=20les=20labels=20?= =?UTF-8?q?du=20s=C3=A9lecteur=20de=20p=C3=A9riode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cypress/downloads/contrat-salarié.html | 266 ------------------ .../demande-mobilité-internationale.pdf | Bin 44311 -> 0 bytes .../integration/mon-entreprise/simulateurs.js | 10 +- .../source/components/PeriodSwitch.tsx | 20 +- mon-entreprise/source/locales/ui-en.yaml | 2 + 5 files changed, 23 insertions(+), 275 deletions(-) delete mode 100644 mon-entreprise/cypress/downloads/contrat-salarié.html delete mode 100644 mon-entreprise/cypress/downloads/demande-mobilité-internationale.pdf diff --git a/mon-entreprise/cypress/downloads/contrat-salarié.html b/mon-entreprise/cypress/downloads/contrat-salarié.html deleted file mode 100644 index e53496707..000000000 --- a/mon-entreprise/cypress/downloads/contrat-salarié.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Mon-entreprise.fr : L'assistant officiel du créateur d'entreprise - - - - - - - - - - -
    - Un service de l'État français -
    -
    -
    -
    -
    -
    -
    - - - - - -
    - - -
    - - - - - - - - - diff --git a/mon-entreprise/cypress/downloads/demande-mobilité-internationale.pdf b/mon-entreprise/cypress/downloads/demande-mobilité-internationale.pdf deleted file mode 100644 index fa5343e675b2948619fb66f27f6d306580d6b64d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44311 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 IQIbOYKe? { - cy.contains('€/an').click() + cy.contains('Annuel').click() if (['indépendant', 'profession-liberale'].includes(simulateur)) { cy.get(chargeInputSelector).type(1000) } @@ -42,14 +42,14 @@ describe('Simulateurs', function () { }) it('should allow to change period', function () { - cy.contains('€/an').click() + cy.contains('Annuel').click() cy.wait(200) cy.get(inputSelector).first().type('{selectall}12000') if (['indépendant', 'profession-liberale'].includes(simulateur)) { cy.get(chargeInputSelector).type('{selectall}6000') } cy.wait(800) - cy.contains('€/mois').click() + cy.contains('Mensuel').click() cy.get(inputSelector) .first() .invoke('val') @@ -57,7 +57,7 @@ describe('Simulateurs', function () { if (['indépendant', 'profession-liberale'].includes(simulateur)) { cy.get(chargeInputSelector).first().invoke('val').should('eq', '500') } - cy.contains('€/an').click() + cy.contains('Annuel').click() }) it('should allow to navigate to a documentation page', function () { @@ -90,7 +90,7 @@ describe('Simulateur auto-entrepreneur', () => { cy.contains('ACRE') }) it('should not have negative value', () => { - cy.contains('€/mois').click() + cy.contains('Mensuel').click() cy.wait(100) cy.get(inputSelector).first().type('{selectall}5000') cy.wait(800) diff --git a/mon-entreprise/source/components/PeriodSwitch.tsx b/mon-entreprise/source/components/PeriodSwitch.tsx index acb0c6ed1..0dc352233 100644 --- a/mon-entreprise/source/components/PeriodSwitch.tsx +++ b/mon-entreprise/source/components/PeriodSwitch.tsx @@ -2,17 +2,29 @@ import { updateUnit } from 'Actions/actions' import { Trans } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' import { targetUnitSelector } from 'Selectors/simulationSelectors' +import { useTranslation } from 'react-i18next' import './PeriodSwitch.css' export default function PeriodSwitch() { const dispatch = useDispatch() - const currentUnit = useSelector(targetUnitSelector) - const units = ['€/mois', '€/an'] + const currentUnit = useSelector(targetUnitSelector) + const { t } = useTranslation() + + const periods = [ + { + label: t('Mensuel'), + unit: '€/mois', + }, + { + label: t('Annuel'), + unit: '€/an', + }, + ] return (
    - {units.map((unit) => ( + {periods.map(({ label, unit }) => ( ))} diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 27f61cf6f..d320cf532 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -13,6 +13,7 @@ Aide à la déclaration de revenu: Income tax return assistance Aide à la déclaration de revenus au titre de l'année 2019: Help with your 2019 income tax return Aides Covid-19: Covid-19 Aids Alors: Then +Annuel: Yearly Année d'activité: Years of activity Artiste-auteur: Artist-author Assimilé salarié: '"Assimilé-salarié"' @@ -94,6 +95,7 @@ Janvier 2019: January 2019 Jusqu’au: Until La somme de: This rule is the sum of Liste des statuts juridiques: List of legal statutes +Mensuel: Monthly Mes réponses: My answers Modifier: Modify Modifier mes réponses: Change my answers From 41c8e0651c808e71f742b50107285b02e97d8516 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 28 May 2021 16:25:09 +0200 Subject: [PATCH 160/319] =?UTF-8?q?=F0=9F=91=BD=20Support=20de=20l'invalid?= =?UTF-8?q?ation=20des=20traductions=20de=20l'UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lorsque nous modifions le texte en français dans le code source il faut penser à mettre à jour la traduction. Ceci était déjà fait sur les règles mais pas sur l'UI. --- mon-entreprise/scripts/i18n/translate-ui.js | 50 +- mon-entreprise/scripts/i18n/utils.js | 26 +- mon-entreprise/source/locales/ui-fr.yaml | 1220 +++++++++++++++++++ 3 files changed, 1267 insertions(+), 29 deletions(-) create mode 100644 mon-entreprise/source/locales/ui-fr.yaml diff --git a/mon-entreprise/scripts/i18n/translate-ui.js b/mon-entreprise/scripts/i18n/translate-ui.js index 721fba2af..1d7c83d09 100644 --- a/mon-entreprise/scripts/i18n/translate-ui.js +++ b/mon-entreprise/scripts/i18n/translate-ui.js @@ -5,28 +5,34 @@ var fs = require('fs') const { getUiMissingTranslations, UiTranslationPath, + UiOriginalTranslationPath, fetchTranslation, } = require('./utils') -const missingTranslations = getUiMissingTranslations() - -let translatedKeys = parse(fs.readFileSync(UiTranslationPath, 'utf-8')) - -Object.entries(missingTranslations) - .map(([key, value]) => [key, value === 'NO_TRANSLATION' ? key : value]) - .forEach(async ([key, value]) => { - try { - const translation = await fetchTranslation(value) - translatedKeys = R.assocPath( - key.split(/(?<=[A-zÀ-ü0-9])\.(?=[A-zÀ-ü0-9])/), - translation, - translatedKeys - ) - fs.writeFileSync( - UiTranslationPath, - stringify(translatedKeys, { sortMapEntries: true }) - ) - } catch (e) { - console.log(e) - } - }) +;(async function () { + const missingTranslations = getUiMissingTranslations() + let originalKeys = parse(fs.readFileSync(UiOriginalTranslationPath, 'utf-8')) + let translatedKeys = parse(fs.readFileSync(UiTranslationPath, 'utf-8')) + await Promise.all( + Object.entries(missingTranslations) + .map(([key, value]) => [key, value === 'NO_TRANSLATION' ? key : value]) + .map(async ([key, originalTranslation]) => { + try { + const translation = await fetchTranslation(originalTranslation) + const path = key.split(/(?<=[A-zÀ-ü0-9])\.(?=[A-zÀ-ü0-9])/) + translatedKeys = R.assocPath(path, translation, translatedKeys) + originalKeys = R.assocPath(path, originalTranslation, originalKeys) + } catch (e) { + console.log(e) + } + }) + ) + fs.writeFileSync( + UiTranslationPath, + stringify(translatedKeys, { sortMapEntries: true }) + ) + fs.writeFileSync( + UiOriginalTranslationPath, + stringify(originalKeys, { sortMapEntries: true }) + ) +})() diff --git a/mon-entreprise/scripts/i18n/utils.js b/mon-entreprise/scripts/i18n/utils.js index 64cc63cad..998a5831f 100644 --- a/mon-entreprise/scripts/i18n/utils.js +++ b/mon-entreprise/scripts/i18n/utils.js @@ -10,6 +10,7 @@ let { parse } = require('yaml') let rulesTranslationPath = path.resolve('source/locales/rules-en.yaml') let UiTranslationPath = path.resolve('source/locales/ui-en.yaml') +let UiOriginalTranslationPath = path.resolve('source/locales/ui-fr.yaml') let attributesToTranslate = [ 'titre', @@ -96,14 +97,24 @@ const getUiMissingTranslations = () => { 'source/locales/static-analysis-fr.json' )) const translatedKeys = parse(fs.readFileSync(UiTranslationPath, 'utf-8')) + const originalKeys = parse( + fs.readFileSync(UiOriginalTranslationPath, 'utf-8') + ) + + const missingTranslations = Object.entries(staticKeys) + .filter(([key, valueInSource]) => { + if (key.match(/^\{.*\}$/) || valueInSource === 'NO_TRANSLATION') { + return false + } + const keys = key.split(/(?<=[A-zÀ-ü0-9])\.(?=[A-zÀ-ü0-9])/) + + const isNewKey = !R.path(keys, translatedKeys) + const isInvalidatedKey = R.path(keys, originalKeys) !== valueInSource + + return isNewKey || isInvalidatedKey + }, staticKeys) + .map(([key]) => key) - const missingTranslations = Object.keys(staticKeys).filter((key) => { - if (key.match(/^\{.*\}$/)) { - return false - } - const keys = key.split(/(?<=[A-zÀ-ü0-9])\.(?=[A-zÀ-ü0-9])/) - return !R.path(keys, translatedKeys) - }, staticKeys) return R.pick(missingTranslations, staticKeys) } @@ -132,4 +143,5 @@ module.exports = { getUiMissingTranslations, rulesTranslationPath, UiTranslationPath, + UiOriginalTranslationPath, } diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml new file mode 100644 index 000000000..dba24b2da --- /dev/null +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -0,0 +1,1220 @@ +"404": + action: Revenir en lieu sûr + message: Cette page n'existe pas ou n'existe plus +"<0> Pour en savoir plus, rendez-vous sur le site <3>aquoiserventlescotisations": + urssaf: + fr: <0> Pour en savoir plus, rendez-vous sur le site + <3>aquoiserventlescotisations.urssaf.fr +<0>Oui: <0>Oui +Assimilé salarié: Assimilé salarié +Aucun résultat: Aucun résultat +Auto-entrepreneur: Auto-entrepreneur +Auto-entrepreneur en EIRL: Auto-entrepreneur en EIRL +Autres outils: Autres outils +Cette commune n'existe pas: Cette commune n'existe pas +Chercher dans la documentation: Chercher dans la documentation +Commencer: Commencer +Continuer: Continuer +Cotisations sociales: Cotisations sociales +Crée le: Crée le +Créer une: Créer une +Devenir: Devenir +Découvrir: Découvrir +En savoir plus: En savoir plus +Entreprise Individuelle: Entreprise Individuelle +Exonérations: Exonérations +Explorez notre documentation: Explorez notre documentation +Fiche de paie: Fiche de paie +Gestion des données personnelles: Gestion des données personnelles +Gérant majoritaire: Gérant majoritaire +Gérant minoritaire: Gérant minoritaire +Gérant minoritaire ou égalitaire: Gérant minoritaire ou égalitaire +Indépendant: Indépendant +Indépendants et dirigeants: Indépendants et dirigeants +International: International +Intégrer nos simulateurs: Intégrer nos simulateurs +J'ai compris: J'ai compris +Jusqu’au: Jusqu’au +Liste des statuts juridiques: Liste des statuts juridiques +Mes réponses: Mes réponses +Modifier: Modifier +Montant de l'impôt sur les sociétés: Montant de l'impôt sur les sociétés +"Nom de l'entreprise ou SIREN ": "Nom de l'entreprise ou SIREN " +Non: Non +Oui: Oui +Outils pour les développeurs: Outils pour les développeurs +Part employeur: Part employeur +Part salarié: Part salarié +Pas en auto-entrepreneur: Pas en auto-entrepreneur +Passer: Passer +Personnalisez l'intégration: Personnalisez l'intégration +Plus d'informations: Plus d'informations +Plusieurs associés: Plusieurs associés +Prochaines questions: Prochaines questions +Professions libérales: Professions libérales +Précédent: Précédent +Prévisualisation: Prévisualisation +Quelques intégrations: Quelques intégrations +Rechercher: Rechercher +Ressources utiles: Ressources utiles +Retour: Retour +Retour à la création: Retour à la création +Retour à mon activité: Retour à mon activité +Répartition du chiffre d'affaires: Répartition du chiffre d'affaires +S'inscrire: S'inscrire +Salaire: Salaire +Salaire net: Salaire net +Salariés et employeurs: Salariés et employeurs +Situation personnelle: Situation personnelle +Suivant: Suivant +Total des retenues: Total des retenues +Tout effacer: Tout effacer +Tout le site: Tout le site +Un seul associé: Un seul associé +Une idée ?<1>Contactez-nous !: Une idée ?<1>Contactez-nous ! +"Versement : ": "Versement : " +Voir la fiche Urssaf: Voir la fiche Urssaf +Voir la fiche de paie: Voir la fiche de paie +Voir les autres simulateurs: Voir les autres simulateurs +Voir mes paramètres: Voir mes paramètres +Votre adresse e-mail: Votre adresse e-mail +Votre forme juridique: Votre forme juridique +Vous êtes dirigeant d'une SAS(U) ? <2>Accéder au simulateur de revenu dédié: Vous êtes dirigeant d'une SAS(U) ? <2>Accéder au simulateur de revenu dédié +aide-déclaration-indépendant: + banner: Découvrez notre outil d'<1>aide à la déclaration des revenus + description: >- + <0>Cet outil est une aide à la déclaration de revenus à destination des + travailleurs indépendants. Il vous permet de connaître le montant des + charges sociales déductibles à partir de votre résultat net + fiscal.<1>Vous restez entièrement responsable d'éventuelles omissions ou + inexactitudes dans votre déclarations.<2><0><0>Cet outil vous concerne + si vous êtes dans tous les cas suivants :<1><0>vous cotisez au régime + général des travailleurs indépendants<1>votre entreprise est au régime + réel d'imposition et en comptabilité d'engagement<2>Il ne vous + concerne pas si vous êtes dans un des cas suivants :<3><0>vous exercez + une activité libérale relevant d’un régime de retraite des professions + libérales<1>vous êtes gérants de société relevant de l’impôt sur les + sociétés<2>vous avez opté pour le régime micro-fiscal<3>votre + entreprise est domiciliée dans les DOM{!situation['dirigeant + . rémunération . totale'] && ( + + )}<4>Quel est votre résultat fiscal en 2020 ?<1><2>Charges sociales et exonérations fiscales non incluses <2><5>Le résultat fiscal correspond aux produits moins les charges. Il peut être positif (bénéfice) ou négatif (déficit). + entreprise: + description: "<0>Facultatif : Vous pouvez renseigner votre entreprise pour + pré-remplir le formulaire" + titre: <0>Entreprise et activité + results: + title: Montants à reporter dans votre déclaration de revenus +après: + ape: + description: Le code APE correspond au <1>secteur d'activité de votre + entreprise. Il classifie la branche principale de votre entreprise dans la + nomenclature nationale d'activités françaises « NAF » (<3>voir la + liste). <6>Il détermine aussi la convention collective applicable à + l'entreprise, et en partie le taux de la cotisation accidents du travail + et maladies professionnelles à payer.<7>En cas de code APE erroné, + vous pouvez <2>demander une modification à l'INSEE. + titre: Le code APE + intro: "Une fois votre {{statutChoisi}} créée, vous recevez les informations + suivantes :" + kbis: + description: + "1": C'est le document officiel qui atteste de <2>l'existence légale d'une + entreprise commerciale. Le plus souvent, pour être valable par les + procédures administratives, il doit dater de moins de 3 mois. <5>Plus + d'infos. + "2": Ce document est généralement demandé lors de la candidature à un appel + d'offre public, de l'ouverture d'un compte bancaire, d'achats + d'équipement professionnel auprès de fournisseurs, etc. + titre: Le Kbis + siret: + description: Le numéro SIREN <1>est l'identifiant de votre entreprise tandis + que le numéro SIRET identifie chaque établissement de la même entreprise. + Le SIRET commence par le SIREN, auquel on ajoute le numéro d'établissement + (NIC). + titre: Le numéro SIRET + titre: Après la création +associés: + choix1: Seul + choix2: Plusieurs personnes + description: "<0>Une entreprise avec un seul associé est plus simple à créer et + gérer. Un associé peut-être une personne physique (un individu) ou une + personne morale (par exemple une société).<1>Note : ce choix n'est pas + définitif. Vous pouvez tout à fait commencer votre société seul, et + accueillir de nouveaux associés au cours de votre développement." + page: + description: Découvrez quels status choisir en fonction du nombre d'associés + participant à la création de l'entreprise. + titre: Nombre d'associés pour créer une entreprise + titre: Seul ou à plusieurs +autoentrepreneur: + description: "<0>À la différence de l'entreprise individuelle, + l'auto-entrepreneur bénéficie d'un régime simplifié de déclaration et de + paiement : les cotisations sociales et l'impôt sur le revenu sont calculés + sur le chiffre d'affaires encaissé.<1><0>Note : Certaines activités + sont exclues de ce statut (<2> voir la liste). Certaines activités sont + réglementées avec une qualification ou une expérience professionnelle + (<4>voir la liste)." + page: + description: Un auto-entrepreneur bénéficie d'un système simplifié de + déclaration et de paiement, pour lesquelles les impôts et cotisations + sociales sont basés sur le chiffre d'affaires réalisé chaque mois. C'est + un choix intéressant si vous n'avez pas besoin de beaucoup de capital et + que vous souhaitez démarrer rapidement. + titre: Auto-entrepreneur + titre: Entreprise individuelle ou auto-entrepreneur +back: Reprendre la simulation +comparaisonRégimes: + ACRE: <0>ACRE<1>1 an <1>(automatique et inconditionnelle)<2>Entre 3 + et 4 trimestres <2>(sous conditions d'éligibilité) + AS: + tagline: Le régime tout compris + AT: <0>Couverture accidents du travail + assuranceMaladie: <0>Assurance maladie <2>(médicaments, soins, + hospitalisations)<1>Identique pour tous + auto: + tagline: Pour commencer sans risques + choix: + AS: Assimilé salarié + EI: Entreprise individuelle + auto: Auto-entrepreneur + indep: Indépendant + comparaisonDétaillée: <0><0>Afficher plus d'informations + complémentaireDeductible: <0>Contrats prévoyance et retraite facultatives + déductibles<1>Oui <1>(sous certaines conditions)<2>Oui <1>(Loi + Madelin) + comptabilité: <0>Gestion comptable, sociale, juridique...<1>Accompagnement + fortement conseillé<1>(expert comptable, comptable, centre de gestion + agrée...)<2>Simplifiée <2>(peut être gérée par + l'auto-entrepreneur) + cotisationMinimale: <0>Paiement de cotisations minimales + cotisations: <0>Paiement des cotisations<1>Mensuel<2>Provision mensuelle + ou trimestrielle<1>(avec régularisation après coup en fonction du revenu + réel)<3>Mensuel ou trimestriel + description: Lorsque vous créez votre société, le choix du statut juridique va + déterminer à quel régime social le dirigeant est affilié. Il en existe trois + différents, avec chacun ses avantages et inconvénients. Avec ce comparatif, + trouvez celui qui vous correspond le mieux. + déduction: <0>Déduction des charges<1>Oui <1>(régime fiscal du + réel)<2>Non<1>(mais abattement forfaitaire pour le calcul de l'impôt + sur le revenu) + indemnités: <0>Indemnités journalières <1>(en cas d'arrêt maladie) + indep: + tagline: La protection sociale à la carte + mutuelle: <0>Mutuelle santé<1><1>Obligatoire<2>Fortement conseillée + plafondCA: <0>Plafond de chiffre + d'affaires<1><0>Non<2><0>Oui<1>(72 500 € en services / 176 + 200 € en vente de biens, restauration ou hébergement) + retraite: <0>Retraite + retraiteEstimation: + infobulles: + AS: Pension calculée pour 172 trimestres cotisés au régime général sans + variations de revenus. + auto: Pension calculée pour 172 trimestres cotisés en auto-entrepreneur sans + variations de revenus. + indep: Pension calculée à titre indicatif pour 172 trimestres cotisés au régime + des indépendants sans variations de revenus. + legend: <0>Pension de retraite<1>(avant impôts) + revenuNetAvantImpot: <0>Revenu net de cotisations <1>(avant impôts) + seuil: <0>Revenu minimum pour l'ouverture des droits aux + prestations<1>Oui<2>Non <1>(cotisations minimales + obligatoires)<3>Oui + simulationText: <0>Comparer mes revenus, pension de retraite et indemnité + maladie<1><2>Lancer la simulation + status: + AS: SAS, SASU ou SARL avec gérant minoritaire + auto: Auto-entreprise + indep: + "1": EI, EIRL, EURL ou SARL avec gérant majoritaire + "2": EI ou EIRL + legend: Statuts juridiques possibles + titreSelection: "Créer mon entreprise en tant que :" + trimestreValidés: <0>Nombre de trimestres validés <1>(pour la retraite) +créer: + cta: + continue: Continuer le guide + default: Trouver le bon statut + description: Avant d'entamer les démarches administratives pour créer votre + entreprise, vous devez choisir un statut juridique adapté à votre activité + ressources: + autoEntrepreneur: <0>Démarche auto-entrepreneur<1>Vous souhaitez devenir + auto-entrepreneur ? Découvrez les étapes pour bien démarrer votre + activité + comparaison: <0>Comparateur de régimes<1>Indépendant, assimilé-salarié ou + auto-entrepreneur ? Calculez les différences en terme de revenus, + cotisations, retraite, etc + listeStatuts: <0>Liste des statuts juridiques<1>Vous savez déjà quel statut + choisir ? Accédez directement à la liste des démarches associées + titre: Créer une entreprise + warningPL: Le cas des professions libérales réglementées n'est pas encore traité +d'aides: d'aides +domiciliation inconnue: domiciliation inconnue +domiciliée à: domiciliée à +embauche: + chaque mois: <0>Tous les mois<1><0>Utiliser un logiciel de paie pour + calculer les cotisations sociales et les transmettre via la déclaration + sociale nominative (DSN).<1>Certaines offres de service de l’Urssaf + comme le <4>titre emploi service entreprise (Tese) ou le <8>chèque + emploi associatif (CEA) gèrent automatiquement la transmission de la DSN + pour vous.<1>Remettre la fiche de paie à votre employé + tâches: + complémentaire santé: + description: Vous devez couvrir vos salariés avec l'assurance complémentaire + santé privée de votre choix (aussi appelée "mutuelle"), pour autant + qu'elle offre un ensemble de garanties minimales. L'employeur doit payer + au moins la moitié du forfait. + titre: Choisir une complémentaire santé + contrat: + titre: Signer un contrat de travail avec votre employé + description: Toutes les étapes nécessaires à l'embauche de votre premier employé. + dpae: + description: Ceci peut être fait par le biais du formulaire appelé DPAE, doit + être complété dans les 8 jours avant toute embauche, et peut <2>être + effectué en ligne. + titre: Déclarer l'embauche à l'administration sociale + logiciel de paie: + description: Les fiches de paie et les déclarations peuvent être traitées en + ligne gratuitement par le <2>Tese. Vous pouvez aussi utiliser un + <5>logiciel de paie privé. + titre: Choisir un logiciel de paie + medecine: + description: N'oubliez pas de planifier un rendez-vous initial pour chaque + nouvelle embauche. <2>Plus d'infos. + titre: S'inscrire à un bureau de médecine du travail + page: + description: Toutes les démarches nécessaires à l'embauche de votre premier salarié. + pension: + description: Trouver mon institution de prévoyance + titre: Prendre contact avec l'institution de prévoyance complémentaire + obligatoire qui vous est assignée + registre: + titre: Tenir un registre des employés à jour + titre: Les formalités pour embaucher +en deux fois: en deux fois +en incluant: en incluant +en titres-restaurant: en titres-restaurant +entreprise: + ressources: + après: <0>Après la création<1>SIREN, SIRET, code APE, KBis. Un petit + glossaire des termes que vous pourrez (éventuellement) rencontrer après la + création. + simu: + assimilé: <0>Simulateur de rémunération pour dirigeant de SASU<1>Simuler le + montant de vos cotisations sociales pour bien préparer votre business + plan. + autoEntrepreneur: <0>Simulateur de revenus auto-entrepreneur<1>Simuler le + montant de vos cotisations sociales et de votre impôt et estimez votre + futur revenu net. + indépendant: <0>Simulateur de cotisations indépendant<1>Simuler le montant + de vos cotisations sociales pour bien préparer votre business plan. + retour: ← Choisir un autre statut + tâches: + adresse: + description: <0><0>L'adresse est l'espace physique où votre entreprise sera + incorporée. Dans certains lieux et certaines situations, vous pouvez + bénéficier d'un financement public important (exonération de charges, de + taxes, etc.). <3>Plus d'infos + titre: Choisir une adresse pour le siège + affectation: + description: "<0>La <1>déclaration d'affectation du patrimoine permet de + séparer le patrimoine professionnel de votre patrimoine personnel, qui + devient alors insaisissable. Cette démarche est gratuite si elle est + effectué au moment de la création d'entreprise.<1>Pour cela, il + suffit simplement de déclarer quelles biens sont affectés au patrimoine + de votre entreprise. Tous les apports nécessaires à votre activité + professionnelle doivent y figurer (par exemple : fond de commerce, + marque, brevet, ou encore matériel professionnel). Vous pouvez vous + charger vous-même de l'évaluation de la valeur du bien si celle ci ne + dépasse pas les 30 000 €.<2><0>Plus d'informations" + titre: Effectuer une déclaration d'affectation de patrimoine + assurance: + description: <0>Une PME ou un travailleur indépendant doit se protéger contre + les principaux risques auxquels il est exposé et souscrire des contrats + de garantie. Qu'elle soit locataire ou propriétaire de ses murs, + l'entreprise doit assurer ses immeubles, son matériel professionnel, ses + biens, ses matières premières, ses véhicules, ainsi qu'en matière de + responsabilité civile de l'entreprise et de ses dirigeants ou en matière + de perte d'exploitation.<1>Plus d'infos + titre: Juger de la nécessité de prendre une assurance + avancement: Utilisez cette liste pour suivre votre avancement dans les + démarches. Votre progression est automatiquement sauvegardée dans votre + navigateur. + banque: + description: + "1": Le but d'un <1>compte bancaire d'entreprise est de séparer les actifs + de l'entreprise des vôtres. + "2": "Le compte d'entreprise vous permet de :" + EI: "Si son ouverture n'est pas obligatoire pour un IE, elle reste fortement + recommandée. " + liste: <0>Différencier vos opérations privées et + professionnelles<1>Faciliter les déclarations fiscales + titre: Ouvrir un compte bancaire + capital: + description: <0>Le <1>dépôt du capital social doit être fait au moment de la + constitution d'une société par une personne agissant au nom de la + société et ayant reçu des apports en numéraire (somme d'argent) de la + part des créanciers de la société (actionnaire ou associé).<1>Le + dépôt consiste en un transfert d'une somme d'argent sur un compte bloqué + auprès d'une banque ou de la <2>Caisse des dépôts et consignations + ou d'un notaire, qui doit alors fournir un certificat de dépôt du + capital. + titre: Déposer le capital + comptable: + description: La gestion d'une entreprise impose un certain nombre + d'<1>obligations comptables. Il est conseillé de faire appel aux + services d'un comptable ou d'un logiciel de comptabilité en ligne. + titre: Choisir un comptable + formeJuridique: + titre: Choisir la forme juridique + formulaire: + description: <0>Vous pouvez faire votre inscription en ligne à tout moment, + l'enregistrer et y revenir comme vous le souhaitez.<1><0>Faire la + démarche en ligne + titre: Créer mon entreprise en ligne + journal: + description: "<0>Vous devez publier la création de votre entreprise dans un + journal d'annonces légales (« JAL »), pour un coût de publication qui + dépend du volume de l'annonce et des tarifs pratiqués par le journal + choisi <1><0>Trouver un journal d'annonces légales + (JAL)<2>Cette annonce doit contenir les informations suivantes : + <3><0>Le nom de l'entreprise et éventuellement son acronyme<1>La + forme juridique<2>Le capital de l'entreprise<3>L'adresse du + siège<4>L'objet social<5>La durée de l'entreprise<6>Les + noms, prénoms et adresses des dirigeants et des personnes ayant le + pouvoir d'engager la société envers les tiers<7>Le lieu et le numéro + du RCS auprès duquel la société est immatriculée" + titre: Publier une annonce de création dans un journal + nom: + description: <0><0>La dénomination sociale est le nom de votre entreprise + aux yeux de la loi, écrit sur tous vos documents administratifs. Il peut + être différent de votre nom commercial.<1>Il est conseillé de + vérifier que le nom est disponible, c'est-à-dire qu'il ne porte pas + atteinte à un nom déjà protégé par une marque, une raison sociale, un + nom commercial, un nom de domaine Internet, etc. Vous pouvez vérifier + dans la base de données <1>INPI. + titre: Trouver un nom d'entreprise + objetSocial: + description: L'<1>objet social est l'activité principale de l'entreprise. + Une activité secondaire peut être enregistrée. + titre: Déterminer l'objet social + statuts: + description: Il s'agit d'un document officiel qui intègre la forme juridique, + nomme les associés et leurs contributions au capital. <2>Dans le cas + d'une création d'entreprise avec plusieurs associés, il est recommandé + de faire appel à un juriste pour les rédiger. + exemple: Exemple de statuts pour votre + titre: Écrire les statuts + titre: À faire pour créer votre entreprise + titre2: Recommandé avant le début de l'activité +est un SIREN non diffusable: est un SIREN non diffusable +feedback: + question: Êtes-vous satisfait de cette page ? + reportError: Faire une suggestion + simulator: Êtes-vous satisfait de ce simulateur ? + thanks: Merci de votre retour ! +footer: + accessibilité: "Accessibilité : non conforme" +formeJuridique: + EI: Aucun apport en capital n'est nécessaire. Le capital privé et le capital de + l'entreprise ne font qu'un. + EIRL: Permet d'attribuer un capital spécifique à son activité professionnelle, + et de choisir le régime d'imposition sur les société (IS) plutôt que revenu + (IR) La société et l'individu constituent la même personne. Ne convient pas + si l'associé unique est une personne morale (entreprise) ou si vous pensez + accueillir d'autres associés au cours de votre développement (choisissez + EURL dans ce cas). + EURL: L'entreprise n'a qu'un associé. La responsabilité est limitée au montant + de l'apport de capital. Evolue en SARL lors de l'arrivée de nouveaux + associés dans la société. + SA: Société ayant au moins deux actionnaires. C'est le seul statut qui permet + d'être coté en bourse (à partir de 7 actionnaires). Le capital social + minimum est de 37.000 €. + SARL: Société ayant au moins deux associés dont la responsabilité financière est + limitée au montant de leur apport au capital. Le capital minimum est fixé + librement dans les statuts. Les associés se répartissent des parts sociales + toutes identiques, et la société est dirigée par un ou plusieurs gérants qui + sont forcément des personnes physiques. Le fonctionnement d'une SARL est + encadré par le code du commerce. + SAS: Société ayant au moins deux associés. La responsabilité financière des + associés est limitée au montant de leur apport au capital de la société. Le + capital minimum est fixé librement dans les statuts. Les associés se + répartissent des actions qui peuvent être de plusieurs catégories, et la + société est dirigée par un président qui peut être une personne morale (une + autre société). La SAS se caractérise par une grande souplesse de + fonctionnement (statuts sur mesure). + SASU: L'entreprise n'a qu'un associé. La responsabilité est limitée au montant + de l'apport de capital de l'unique associé (qui peut être une personne + morale). + SNC: La responsabilité des associés pour les dettes de la société est solidaire + (un seul associé peut être poursuivi pour la totalité de la dette) et + indéfinie (responsable sur la totalité de son patrimoine personnel). + micro: Un auto-entrepreneur exerce son activité en entreprise individuelle, avec + un régime forfaitaire pour ses cotisations sociales et un calcul spécifique + de l'impôt. + micro-EIRL: Un auto-entrepreneur option EIRL exerce son activité en entreprise + individuelle en choisissant l'option "Entrepreneur individuel à + responsabilité limitée", avec à un régime forfaitaire pour le calcul des + impôts et le paiement des cotisations de sécurité sociale. + titre: Choix du statut juridique +gérant minoritaire: + description: "<0>Certaines règles spéciales s'appliquent selon le nombre + d'actions détenues.<1><0><0>Gérant majoritaire : Vous êtes + l'administrateur majoritaire (ou faite partie d'un conseil d'administration + majoritaire).<1><0>Gérant minoritaire : Vous êtes administrateur + minoritaire ou égalitaire (ou faites partie d'un conseil d'administration + minoritaire ou égalitaire)." + page: + description: Certaines règles particulières s'appliquent en fonction du nombre + d'actions détenues par l'administrateur, ce qui peut conduire à un statut + différent lors de la création de votre société + titre: Gérant majoritaire ou minoritaire + titre: Gérant majoritaire ou minoritaire +gérer: + choix: + chomage-partiel: <0>Activité partielle<1>Calculez le reste à payer après + remboursement de l'État lorsque vous activez le dispositif pour un + employé. + déclaration: <0>Remplir ma déclaration de revenus<1>Calculez facilement les + montants des charges sociales à reporter dans votre déclaration de revenu + au titre de 2020 + embauche: <0>Estimer le montant d’une embauche<1>Calculez le montant total + que votre entreprise devra dépenser pour rémunérer votre prochain + employé + is: <0>Estimer le montant de l’impôt sur les sociétés<1>Calculez le montant + de l'impôt sur les sociétés à partir de votre bénéfice. + revenus: <0>Calculer mon revenu net de cotisations<1>Estimez précisément le + montant de vos cotisations grâce au simulateur {{régime}} de l'Urssaf + cta: Renseigner mon entreprise + description: Vous souhaitez vous verser un revenu ou embaucher ? <1>Vous + aurez à payer des cotisations et des impôts. <3>Anticipez leurs montants + grâce aux simulateurs adaptés à votre situation. + entreprise: + auto: "Êtes-vous auto-entrepreneur ? " + changer: Changer l'entreprise sélectionnée + dirigeant: <0>Êtes-vous dirigeant majoritaire ?<1>Si vous êtes + administrateur majoritaire ou si vous faites partie d'un conseil + d'administration majoritaire, vous n'aurez pas le même régime de sécurité + sociale que si vous êtes minoritaire. + majoritaire: Dirigeant majoritaire + minoritaire: Dirigeant minoritaire + ressources: + autoEntrepreneur: <0>Accéder au site officiel auto-entrepreneur<1>Vous + pourrez effectuer votre déclaration de chiffre d'affaires, payer vos + cotisations, et plus largement trouver toutes les informations relatives + au statut d'auto-entrepreneur + embaucher: <0>Découvrir les démarches d’embauche <1>La liste des choses à + faire pour être sûr de ne rien oublier lors de l’embauche d’un nouveau + salarié + sécuritéSociale: <0>Comprendre la sécurité sociale <1>A quoi servent les + cotisations sociales ? Le point sur le système de protection sociale dont + bénéficient tous les travailleurs en France + titre: Gérer mon activité +impotSociété: + exerciceDates: Exercice du <2> au <6> + warning: "Ce simulateur s’adresse aux <2>TPE : il prend en compte les taux + réduits de l’impôt sur les sociétés." +inférieurs à: inférieurs à +landing: + aboutUs: "<0>Qui sommes-nous ?<1>Nous sommes une petite <2>équipe + autonome et pluridisciplinaire au sein de l’<5>Urssaf. Nous avons à cœur + d’être au près de vos besoins afin d’améliorer en permanence ce site + conformément à l'approche <8>beta.gouv.fr.<2>Nous avons développé ce + site pour <2>accompagner les créateurs d’entreprise dans le + développement de leur activité.<3>Notre objectif est de <2>lever toutes + les incertitudes vis à vis de l’administration afin que vous puissiez + vous concentrer sur ce qui compte : votre activité." + choice: + create: <0>Créer une entreprise<1>Un accompagnement au choix du statut + juridique et la liste complète des démarches de création + manage: <0>Gérer mon activité<1>Des outils personnalisés pour anticiper le + montant des cotisations sociales à payer et mieux gérer votre + trésorerie. + simulators: <0>Accéder aux simulateurs<1>La liste exhaustive de tous les + simulateurs disponibles sur le site. + subtitle: Les ressources nécessaires pour développer votre activité, du statut + juridique à l'embauche. + title: L'assistant officiel de l'entrepreneur +legalNotice: + contact: + content: <0>contact@mon-entreprise.beta.gouv.fr + title: Contact + editeur: + title: Editeur + hosting: + content: Netlify<1>610 22nd Street, Suite 315,<3>San Francisco, CA 94107 + <5>Site web : <7>https://www.netlify.com + title: Prestataire d'hébergement + publication: + content: M. Yann-Gaël Amghar, Directeur de l'Acoss + title: Directeur de la publication + title: Mentions légales +listeformejuridique: + page: + titre: Liste des statuts juridiques pour la création de votre entreprise +mensuel: mensuel +newsletter: + register: + confirmation: Votre inscription est confirmée ! + description: Inscrivez-vous à notre newsletter pour être informé des nouveautés + et accéder aux nouvelles fonctionnalités en avant-première. + titre: Restez au courant +nextSteps: + integration-iframe: <0><0> Intégrer le module web<1>Ajouter ce + simulateur sur votre site internet en un clic via un script clé en main. +noresults: Aucun résultat ne correspond à cette recherche +page: + documentation: + title: Documentation + simulateurs: + accueil: + description: <0>Tous les simulateurs sur ce site sont :<1><0><0>Maintenus à + jour avec les dernières évolutions législatives<1><0>Améliorés + en continu afin d'augmenter le nombre de dispositifs pris en + compte<2><0>Intégrables facilement et gratuitement sur n'importe + quel site internet. <3>En savoir plus. +pages: + accessibilité: <0>Accessibilité<1><2>Cette page n'est pas une page + d'aide, mais une déclaration de conformité au <2>RGAA 4.0 qui vise + à définir le niveau d'accessibilité général constaté sur le site + conformément à la réglementation. Cette page est obligatoire pour être + conforme au RGAA 4.0.<3>Qu’est-ce que l’accessibilité + numérique ?<4>Un site web accessible est un site qui permet à tous + les internautes d’accéder à ses contenus sans difficulté, y compris aux + personnes qui présentent un handicap et utilisent des logiciels ou matériels + spécialisés.<5>Un site accessible permet par exemple + de :<6><0>Naviguer avec des synthèses vocales ou des plages braille + (notamment utilisées par les internautes aveugles ou + malvoyants).<1>Personnaliser l’affichage du site selon ses besoins + (grossissement des caractères, modification des couleurs, + etc.).<2>Naviguer sans utiliser la souris, avec le clavier uniquement ou + via un écran tactile.<7>Déclaration d’accessibilité<8>L'Acoss + s’engage à rendre ses sites internet accessibles conformément à l’article 47 + de la loi n° 2005-102 du 11 février 2005.<9>À cette fin, elle rédige + <2>la stratégie et le plan d’action à mettre en œuvre.<10>Cette + déclaration d’accessibilité s’applique à + <2>https://mon-entreprise.fr.<11>État de + conformité<12><0>https://mon-entreprise.fr n’est actuellement pas + en conformité avec le <3>référentiel général d’amélioration de + l’accessibilité (RGAA). L’audit de conformité sera prochainement + planifié. Les corrections seront prises en compte suite à + l’audit.<13>Droit à la compensation<14>Dans l’attente d’une mise + en conformité totale, vous pouvez obtenir une version accessible des + documents ou des informations qui y seraient contenues en envoyant un + courriel à <2>accessibilite@acoss.fr en indiquant le nom du document + concerné et/ou les informations que vous souhaiteriez obtenir. Les + informations demandées vous seront transmises dans les meilleurs + délais.<15>Amélioration et contact<16>Vous pouvez nous aider à + améliorer l’accessibilité du site en nous signalant les problèmes éventuels + que vous rencontrez. Pour ce faire, envoyez-nous un courriel à + <2>accessibilite@acoss.fr.<17>Défenseur des droits<18>Cette + procédure est à utiliser dans le cas suivant.<19>Vous avez signalé au + responsable du site internet un défaut d’accessibilité qui vous empêche + d’accéder à un contenu ou à un des services du portail et vous n’avez pas + obtenu de réponse satisfaisante.<20><0>Écrire un message au Défenseur + des droits + (<1>https://formulaire.defenseurdesdroits.fr/)<1>Contacter le + délégué du Défenseur des droits dans votre région + (<1>https://www.defenseurdesdroits.fr/saisir/delegues)<2>Envoyer un + courrier par la poste (gratuit, ne pas mettre de timbre) + à :<1>Défenseur des droits<3>Libre réponse + 71120<5>75342 Paris CEDEX 07<21>Mis à jour le + 29/01/2021 + common: + ressources-auto-entrepreneur: + FAQ: <0><0>❓ Questions fréquentes<1>Une liste exhaustive et maintenue à jour + de toutes les questions fréquentes (et moins fréquentes) que l'on est + amené à poser en tant qu'auto-entrepreneur + impôt: <0><0>📑 Comment déclarer son revenu aux impôts ?<1>Les informations + officielles de l'administration fiscale concernant les + auto-entrepreneurs et le régime de la micro-entreprise. + dévelopeurs: + bibliothèque: "<0>Intégrez notre bibliothèque de calcul<1>Si vous pensez que + votre site ou service gagnerait à afficher des calculs de salaire, par + exemple passer du salaire brut au salaire net, bonne nouvelle : tous les + calculs de cotisations et impôts qui sont derrière mon-entreprise.fr sont + libres et facilement réutilisable grâce à la <2>bibliothèque NPM + publicodes.<2>Comment utiliser cette librairie ?<3>Toutes nos + règles de calculs sont écrites en `publicodes`, un language déclaratif + développé par beta.gouv.fr et l'Urssaf pour encoder des algorithme + d'intérêt public. <2>En savoir plus sur publicodes<4>Pour + effectuer vos propre calculs, vous devons donc installer l'interpréteur + publicodes, télécharger les règles utilisées sur mon-entreprise, appeler + la fonction d'évaluation.<5>Installation<6><0>npm install --save + publicodes modele-social<7>Pour plus de détails sur + l'installation, se référer à la <2>documentation dédiée<8>Lancer + le calcul<9>Il ne vous reste plus qu'à paramétrer le moteur avec les + règles du paquet `modele-social` et à appeler la fonction `evaluate` sur + la règle que dont vous souhaitez la valeur. Voici un exemple pour le + calcul brut / net<10><0><11>Paramétrer le calcul<12>Vous + l'aurez constaté dans l'exemple précédent, la recette d'un calcul est + simple : des variables d'entrée (le salaire brut), une ou plusieurs + variables de sorties (le salaire net).<13>Le calcul est cependant + paramétrable avec toutes les possibilités permise dans la + legislation.<14>Toutes ces variables sont listées et expliquées sur + la <2>documentation en ligne. Cette documentation est auto-générée + depuis les fichiers de règles publicodes, elle est donc constamment à + jour.<15>Lançons un calcul plus proche d'une fiche de paie : voici + une description de la situation d'entrée annotée de liens vers les pages + correspondantes de la documentation :<16><0> Un <3>cadre gagnant + <7>3 400€ bruts , qui bénéficie de <11>titres-restaurant et qui + travaille dans une entreprise de <15>22 salariés.<17>Voici + ce que donne le calcul pour cet exemple plus complet + :<18><0><19><0>Notez que dans l'exemple précédent nous + devons spécifier nous-même le taux de versement transport.<20>Alors + que dans le simulateur <2>salarié, il suffit de renseigner la commune + et le taux correspondant est automatiquement déterminé. C'est voulu : pour + garder la bibliothèque (et le site) légers, nous utilisons deux API en + ligne. L'<4>API Géo - communes pour passer du nom de la commune au + code commune. Puis l'<7>API versement transport, développé et maintenu + par nos soins, qui n'est pas documenté mais son utilisation est très + simple et compréhensible <10>dans ce composant React qui l'appelle, + composant qui fait aussi appel à l'API commune.<21>Faire des + graphiques économiques{emoji(' 📈')}<22>Il est aussi possible + d'utiliser la bibliothèque pour des calculs d'analyse économique ou + politique. Ici, on trace le prix du travail et le salaire net en fonction + du brut.<23>On peut constater la progressivité du salaire total, qui + est en pourcent plus faible pour un SMIC que pour un haut revenu. + Autrement dit, les hauts salaires paient une partie des cotisations + sociales des bas salaires.<24><0>" + développeurs: + choice: + github: <0>Contribuer sur GitHub<1>Tous nos outils sont ouverts et + développés publiquement sur GitHub. + library: <0>Libraire de calcul<1>L'intégralité du moteur de calcul + socio-fiscal développé par l'Urssaf, mis à disposition librement sous + forme de bibliothèque NPM. + publicodes: <0>Publicodes<1>Nos outils sont propulsés par Publicodes, un + nouveau langage pour encoder des algorithmes “explicables”. + code: + description: "Voici le code à copier-coller sur votre site :" + titre: Code d'intégration + couleur: "Quelle couleur ? " + home: + choice: + iframe: <0>Intégrer un simulateur<1>Intégrer l'un de nos simulateurs en un + clic dans votre site Web, via un script clé en main. + description: En plus du site mon-entreprise.fr, nous développons des outils + gratuits et libres à intégrer directement chez vous, dans les parcours + habituels de vos utilisateurs. + iframe: + csp-1: <0>Intégration iframe et politique de sécurité de contenu<1>L'erreur + ci-dessous qui s'affiche dans la console est liée à la communication + entre la page parente et l'iframe pour le redimensionnement automatique + au contenu affiché. + csp-2: "Vous pouvez la corriger avec la politique suivante :" + intro: <0><0>Intégrez le module Web<1>Nos simulateurs sont intégrables de + manière transparente en ajoutant une simple ligne de code à votre page + Web.<2>Vous pouvez choisir le simulateur à intégrer et + <2>personnaliser la couleur principale du module pour le fondre dans + le thème visuel de votre page.<3>L'attribut <1>data-lang="en" + vous permet quant à lui de choisir l'anglais comme langue du + simulateur.<1><2>À noter que si votre site utilise une + politique de sécurité de contenu via l'en-tête de réponse HTTP + <1>Content-Security-Policy, une erreur bénigne peut apparaître dans + la console. <3> + module: Quel module ? + gérer: + aide-déclaration-indépendant: + meta: + description: Calculer facilement les montants des charges sociales à reporter + dans votre déclaration de revenu 2020. + title: "Déclaration de revenus indépendant : calcul du montant des cotisations" + shortname: Aide à la déclaration de revenu + title: Aide à la déclaration de revenus au titre de l'année 2020 + demande-mobilité: + meta: + description: Formulaire interactif à compléter pour les indépendants souhaitant + exercer leur activité dans d'autres pays d'Europe + title: "Travailleur indépendant : demande de mobilité en Europe" + shortname: Demande de mobilité internationale + simulateurs: + accueil: + header: Tous les simulateurs sur ce site sont maintenus à jour avec les + dernières évolutions législatives. + titre: Simulateurs disponibles + aides-embauche: + aides: + apprenti: Pour l’embauche d’un apprenti ou d’un jeune en contrat de + professionnalisation.<1>L’aide est versée <3>mensuellement et + automatiquement par l’Agence de services et de paiement (ASP). + emploi franc: Pour l’embauche d’un jeune issu d’un quartier prioritaire de la + ville (QPV). L’aide peut aller jusqu’à 17 000 € sur trois + ans.<1>L’aide est versée tous les <3>6 mois par Pôle emploi. + handicapé: Pour l’embauche d’un travailleur en situation de + handicap.<1>L’aide est versée <3>trimestriellement par + l’Agence de services et de paiement (ASP). + jeune: Pour l’embauche d’un jeune de moins de 26 ans en CDI ou pour un CDD d’au + moins 3 mois.<1>L’aide est versée <3>trimestriellement par + l’Agence de services et de paiement (ASP). + senior: Pour une embauche en contrat de professionnalisation d’un demandeur + d’emploi de 45 ans ou plus.<1>L’aide est versée par Pôle emploi + sous la forme de deux versements de 1000 € chacun. + card: + action: Simuler une embauche + montant: Montant de l’aide + première année: " la première année" + introduction: <0><0><0>Les employeurs peuvent bénéficier d'une aide + financière pour l'embauche de certains publics prioritaires. Découvrez + les dispositifs existants et estimez le montant de l'aide en répondant + aux questions. + message fin: Vous pouvez maintenant simuler le coût d’embauche précis en + sélectionnant une aide éligible. + meta: + description: Découvrez les principales aides à l’embauche et estimez leur + montant en répondant à quelques questions. + title: Aides à l’embauche + outro: <0>En savoir plus sur les aides<1>Vous pouvez retrouver une liste + plus complète des aides à l'embauche existantes sur le portail + <2>les-aides.fr édité par les chambres de commerce et + d'industrie.<2>Dans le cadre du plan « France Relance » le + gouvernement met en place une série de mesures pour encourager les + nouvelles embauches.<3>Rendez-vous sur le portail + <2>#1jeune1solution pour en savoir plus + titres: + aides: Les aides + aidesDisponibles: Aides disponibles + autresAides: Les autres aides + warning: Ce simulateur présente une liste réduite des aides à l'embauche et + n'intègre pas l'ensemble des conditions d'éligibilité.<1>Une + simulation plus complète peut être réalisée en cliquant sur « Simuler + une Embauche ». + artiste-auteur: + meta: + description: Estimez les cotisations sociales sur les droits d'auteur et sur le + revenu BNC + title: "Artiste-auteur: calcul des cotisations Urssaf" + shortname: Artiste-auteur + title: Estimer mes cotisations d’artiste-auteur + auto-entrepreneur: + meta: + description: Calcul du revenu à partir du chiffre d'affaires, après déduction + des cotisations et des impôts + ogDescription: "Grâce au simulateur de revenu auto-entrepreneur développé par + l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction + de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre + trésorerie. Ou dans le sens inverse : savoir quel montant facturer + pour atteindre un certain revenu." + ogTitle: "Auto-entrepreneur : calculez rapidement votre revenu net à partir du + CA et vice-versa" + titre: "Auto-entrepreneurs : simulateur de revenus" + seo explanation: <0>Comment calculer le revenu net d'un auto-entrepreneur + ?<1>Un auto-entrepreneur doit payer des cotisations et contributions + sociales à l'administration. Ces cotisations servent au financement de + la sécurité sociale, et ouvrent des droits notamment pour la retraite et + pour l'assurance maladie. Elles permettent également de financer la + formation professionnelle. Leur montant varie en fonction du type + d'activité.<2><0> <2>Voir le détail du calcul des + cotisations<3>Il ne faut pas oublier de retrancher toutes les + dépenses effectuées dans le cadre de l'activité professionnelle + (équipements, matières premières, local, transport). Bien qu'elles ne + soient pas utilisées pour le calcul des cotisations et de l'impôt, elles + doivent être prises en compte pour vérifier si l'activité est viable + économiquement.<4>La formule de calcul complète est donc + :<1><0>Revenu net = Chiffres d'affaires − Cotisations sociales − + Dépenses professionnelles<5>Comment calculer l'impôt sur le + revenu pour un auto-entrepreneur ?<6>Si vous avez opté pour le + versement libératoire lors de la création de votre auto-entreprise, + l'impôt sur le revenu est payé en même temps que les cotisations + sociales.<7><0> <2>Voir comment est calculé le montant du + versement libératoire<8>Sinon, vous serez imposé selon le barème + standard de l'impôt sur le revenu. Le revenu imposable est alors calculé + comme un pourcentage du chiffre d'affaires. C'est qu'on appel + l'abattement forfaitaire. Ce pourcentage varie en fonction du type + d'activité excercé. On dit qu'il est forfaitaire car il ne prends pas en + compte les dépenses réelles effectuées dans le cadre de + l'activité.<9><0> <2>Voir le détail du calcul du revenu abattu + pour un auto-entrepreneur + shortname: Auto-entrepreneur + title: Simulateur de revenus auto-entrepreneur + auxiliaire: + shortname: Auxiliaire méd. + title: Simulateur de revenus pour auxiliaire médical en libéral + tooltip: Infirmiers, masseurs-kinésithérapeutes, pédicures-podologues, + orthophonistes et orthoptistes + avocat: + shortname: Avocat + title: Simulateur de revenus pour avocat en libéral + chirurgien-dentiste: + shortname: Chirurgien-dentiste + title: Simulateur de revenus pour chirurgien-dentiste en libéral + chômage-partiel: + meta: + description: Calcul du revenu net pour l'employé et du reste à charge pour + l'employeur après remboursement de l'Etat, en prenant en compte toutes + les cotisations sociales. + ogDescription: Accédez à une première estimation en saisissant à partir d'un + salaire brut. Vous pourrez ensuite personaliser votre situation (temps + partiel, convention, etc). Prends en compte la totalité des + cotisations, y compris celles spécifiques à l'indemnité (CSG et CRDS). + ogTitle: "Simulateur chômage partiel : découvrez l'impact sur le revenu net + salarié et le coût total employeur." + titre: "Calcul de l'indemnité chômage partiel : le simulateur Urssaf" + seo: <0>Comment calculer l'indemnité d'activité partielle ?<1>L'indemnité + d'activité partielle de base est fixée par la loi à <2>70% du brut. + Elle est proratisée en fonction du nombre d'heures chômées. Pour un + salarié à 2300 € brut mensuel, qui travaille à 50% de son temps usuel, + cela donne <5>2300 € × 50% × 70% = 805 €<2>A cette indemnité de + base s'ajoute l'indemnité complémentaire pour les salaires proches du + SMIC. Ce complément intervient lorsque le cumul de la rémunération et de + l'indemnité de base est en dessous d'un SMIC net. Ces indemnités sont + prises en charge par l'employeur, qui sera ensuite remboursé en parti ou + en totalité par l'État.<3>👉 <2>Voir le détail du calcul de + l'indemnité<4>Comment calculer la part remboursée par l'État + ?<5>L'État prend en charge une partie de l'indemnité partielle pour + les salaires allant jusqu'à <1>4,5 SMIC, avec un minimum à 8,03€ par + heures chômée. Concrètement, cela abouti à une prise en charge + à<3>100% pour les salaires proches du SMIC. Celle-ci diminue + progressivement jusqu'à se stabiliser à <6>93% pour les salaires + compris <9>entre 2000 € et 7000 € (salaire correspondant à la limite + de 4,5 SMIC).<6>👉 <2>Voir le détail du calcul du remboursement de + l'indemnité<7>Comment déclarer une activité partielle + ?<8>Face à la crise du coronavirus, les modalités de passage en + activité partielle ont été allégées. L'employeur est autorisé a placer + ses salariés en activité partielle avant que la demande officielle ne + soit déposée. Celui-ci dispose ensuite d'un délai de <2>30 jours + pour se mettre en règle. Les indemnités seront versées avec un effet + rétro-actif débutant à la mise en place du chômage partiel.<9>👉 + <2>Effectuer la demande de chômage partiel<10> Quelles sont les + cotisations sociales à payer pour l'indemnité d'activité partielle + ?<11>L'indemnité d'activité partielle est soumise à la CSG/CRDS et + à une contribution maladie dans certains cas. Pour en savoir plus, voir + la page explicative sur <2>le site de l'Urssaf. + shortname: Chômage partiel + title: "Covid-19 : Simulateur de chômage partiel" + comparaison: + meta: + description: Auto-entrepreneur, indépendant ou dirigeant de SASU ? Avec ce + comparatif, trouvez le régime qui vous correspond le mieux + title: "Création d'entreprise : le comparatif des régimes sociaux" + shortname: Comparaison des statuts + title: "Indépendant, assimilé salarié ou auto-entrepreneur : quel régime choisir + ?" + expert-comptable: + shortname: Expert-Comptable + title: Simulateur de revenus pour expert comptable et commissaire aux comptes en + libéral + indépendant: + cotisations-forfaitaires: "Montant des cotisations forfaitaires : " + meta: + description: Calcul du revenu net après impôt et des cotisations à partir du + chiffre d'affaires et inversement + title: "Indépendant : simulateur de revenus Urssaf" + retraite-droits-acquis: "<0>Retraite : droits acquis sur l'année + 2021<1><0>Retraite de base : <2><0><0> trimestres + acquis<1>Retraite complémentaire : <2><0>Ce simulateur ne + gère pas les droits acquis de retraite complémentaire pour les + professions libérales<3><0><0><0> points + acquis" + shortname: Indépendant + title: Simulateur de revenus pour indépendant + is: + meta: + description: Calculez votre impôt sur les sociétés + title: Impôt sur les sociétés + seo: <0>Comment est calculé l’impôt sur les sociétés ?<1>L’impôt sur les + sociétés s’applique aux bénéfices réalisés par les sociétés de capitaux + (SA, SAS, SASU, SARL, etc.) et sur option facultative pour certaines + autres sociétés (EIRL, EURL, SNC, etc.).<2>Il est calculé sur la + base des bénéfices réalisés en France au cours de l’exercice comptable. + La durée d’un exercice est normalement d’un an mais il peut être plus + court ou plus long (notamment en début d’activité ou à la dissolution de + l’entreprise). Dans ce cas le barème de l’impôt est pro-ratisé en + fonction de la durée de l’exercice, ce qui est pris en compte dans le + simulateur en modifiant les dates de début et de fin de + l’exercice.<3>Taux réduit et régimes spécifiques<4>Les PME + réalisant moins de 7,63 millions d’euros de chiffre d’affaires et dont + le capital est détenu à 75% par des personnes physiques bénéficient d’un + taux réduit d’impôt sur les sociétés. Ce taux est pris en compte sur le + simulateur et il n’est pour l’instant pas possible de simuler + l’inéligibilité aux taux réduits.<5>Enfin il existe des régimes + d’impositions spécifiques avec des taux dédiés pour certains types de + plus-values (cession de titres, cession de brevets). Ces régimes ne sont + pas intégrés dans le simulateur. + title: Simulateur d'impôt sur les sociétés + médecin: + shortname: Médecin + title: Simulateur de revenus pour médecin en libéral + pamc: + meta: + description: Calcul du revenu net pour les professions libérales du régime PAMC + (médecin, chirurgien-dentiste, sage-femme et auxiliaire médical) + title: Simulateurs régime PAMC + shortname: PAMC + title: "PAMC : simulateurs de cotisations et de revenu" + profession-libérale: + meta: + description: Calcul du revenu net pour les indépendants en libéral à l'impôt sur + le revenu (IR, BNC) + title: "Professions libérale : le simulateur Urssaf" + shortname: Profession libérale + title: Simulateur de revenus pour profession libérale + sage-femme: + shortname: Sage-femme + title: Simulateur de revenus pour sage-femme en libéral + salarié: + alt-image1: Salaire net (perçu par le salarié) = Salaire brut (inscrit dans le + contrat de travail) - cotisations salariales (retraite, csg, etc) + meta: + description: Calcul du salaire net, net après impôt et coût total employeur. + Beaucoup d'options disponibles (cadre, stage, apprentissage, heures + supplémentaires, etc.) + ogDescription: En tant que salarié, calculez immédiatement votre revenu net + après impôt à partir du brut mensuel ou annuel. En tant qu'employé, + estimez le coût total d'une embauche à partir du brut. Ce simulateur + est développé avec les experts de l'Urssaf, et il adapte les calculs à + votre situation (statut cadre, stage, apprentissage, heures + supplémentaire, titre-restaurants, mutuelle, temps partiel, convention + collective, etc.) + ogTitle: "Salaire brut, net, net après impôt, coût total : le simulateur ultime + pour salariés et employeurs" + titre: "Salaire brut / net : le convertisseur Urssaf" + seo: "<0>Comment calculer le salaire net ?<1>Lors de l'entretien d'embauche + l'employeur propose en général une rémunération exprimée en « brut ». Le + montant annoncé inclut ainsi les cotisations salariales, qui servent à + financer la protection sociale du salarié et qui sont retranchées du + salaire « net » perçu par le salarié.<2>Vous pouvez utiliser notre + simulateur pour convertir le <2>salaire brut en net : il vous suffit + pour cela saisir la rémunération annoncée dans la case salaire brut. La + simulation peut-être affinée en répondant aux différentes questions + (CDD, statut cadre, heures supplémentaires, temps partiel, + titre-restaurants, etc.).<3><4>Par ailleurs depuis 2019, + l'<1>impôt sur le revenu est prélevé à la source. Pour ce faire, la + direction générale des finances publiques (DGFiP) transmet à l'employeur + le taux d'imposition calculé à partir de la déclaration de revenu du + salarié. Si ce taux est inconnu, par exemple lors d'une première année + d'activité, l'employeur utilise le <4>taux neutre.<5>Comment + calculer le coût d'embauche ?<6>Si vous cherchez à embaucher, vous + pouvez calculer le coût total de la rémunération de votre salarié, ainsi + que les montants de cotisations patronales et salariales correspondant. + Cela vous permet de définir le niveau de rémunération en connaissant le + montant global de charge que cela représente pour votre + entreprise.<7>En plus du salaire, notre simulateur prend en compte + le calcul des avantages en nature (téléphone, véhicule de fonction, + etc.), ainsi que la mutuelle santé obligatoire.<8>Il existe des + <2>aides différées à l'embauche qui ne sont pas toutes prises en + compte par notre simulateur, vous pouvez les retrouver sur <6>le portail + officiel." + shortname: Salarié + title: Simulateur de revenus pour salarié + title-employeur: Simulateur de coûts d'embauche + sasu: + meta: + description: Calcul du salaire net à partir du total alloué à la rémunération et + inversement + ogDescription: En tant que dirigeant assimilé-salarié, calculez immédiatement + votre revenu net après impôt à partir du total alloué à votre + rémunération. + ogTitle: "Rémunération du dirigeant de SASU : un simulateur pour connaître votre + salaire net" + titre: "Dirigeant de SASU : simulateur de revenus Urssaf" + seo-explanation: "<0>Comment calculer le salaire d'un dirigeant de SASU ? + <1>Comme pour un salarié classique, le <2>dirigeant de sasu paye + des cotisations sociales sur la rémunération qu'il se verse. Les + cotisations sont calculées de la même manière que pour le salarié : + elles sont décomposées en partie employeur et partie salarié et sont + exprimées comme un pourcentage du salaire brut.<2>Le dirigeant + assimilé-salarié ne paye pas de <2>cotisations chômage. Par + ailleurs, il ne bénéficie pas de la <5>réduction générale de + cotisations ni des dispositifs encadrés par le code du travail comme + les <9>heures supplémentaires ou les primes.<3>Il peut en + revanche prétendre à la <2>réduction ACRE en debut d'activité, sous + certaines conditions.<4>Vous pouvez utiliser notre simulateur pour + calculer la <2>rémunération nette à partir d'un montant superbrut + alloué à la rémunération du dirigeant. Il vous suffit pour cela saisir + le montant total alloué dans la case \"total chargé\". La simulation + peut ensuite être affinée en répondant aux différentes questions." + shortname: Dirigeant de SASU + title: Simulateur de revenus pour dirigeant de SASU + économie-collaborative: + meta: + description: Airbnb, Drivy, Blablacar, Leboncoin... Découvrez comment être en + règle dans vos déclarations + title: "Déclaration des revenus des plateforme en ligne : guide intéractif" + shortname: Guide économie collaborative +payslip: + disclaimer: Il ne prend pour l'instant pas en compte les accords et conventions + collectives, ni la myriade d'aides aux entreprises. Trouvez votre convention + collective <2>ici, et explorez les aides + sur <4>aides-entreprises.fr. + notice: Le simulateur vous aide à comprendre votre bulletin de paie, sans lui + être opposable. Pour plus d'informations, rendez vous + sur <1>service-public.fr. + repartition: Répartition du total chargé +pour les accidents de trajet/travail et maladie pro: pour les accidents de trajet/travail et maladie pro +previousSimulationBanner: + info: "Votre précédente simulation a été sauvegardée :" + retrieveButton: Retrouver ma simulation +privacyContent: + ok: Vos préférences ont bien été enregistrées + texte: <0><1>Données personnelles<2>Nous recueillons des statistiques + anonymes sur l'utilisation du site, que nous utilisons dans le seul but + d'améliorer le service, conformément aux <2>recommandations de la CNIL + et au règlement RGPD. Ce sont les seules données qui quittent votre + navigateur.<3>Vous pouvez vous soustraire de cette mesure d'utilisation + du site ci-dessous :<4><0><0> Je souhaite ne pas envoyer de données + anonymes sur mon utilisation du site à des fins de mesures + d'audience +responsabilité: + bouton1: Société + bouton2: Entreprise individuelle + entreprise-individuelle: "<0>Entreprise individuelle : Une activité + économique exercée par une seule personne physique, en son nom propre. Moins + de formalités, mais plus de risques en cas de faillite, car votre patrimoine + personnel peut être mis à contribution. <3>Vous ne pouvez pas accueillir de + nouveaux associés en entreprise individuelle." + intro: "Ce choix determine votre degré de responsabilité et votre capacité à + accueillir de nouveaux associés dans le futur " + société: "<0>Société : Vous ne pouvez pas être tenu personnellement + responsable des dettes ou obligations de la société. En revanche, les + démarches de création sont un peu plus lourdes, puisqu'elles incluent + notamment la rédaction de statuts et le dépôt d'un capital." + titre: Entreprise individuelle ou société ? +shareSimulation: + banner: "Pour partager cette simulation : <2>Générer un lien dédié" + button: + copied: Copié + copy: Copier le lien + modal: + helpText: Le lien est sélectionné, vous pouvez le copier/coller + notice: Voici le lien que vous pouvez envoyer pour accéder à votre simulation. + title: Votre lien de partage + navigatorShare: Ma simulation Mon Entreprise +simulateurs: + explanation: + CNAPL: Elle recouvre les cotisations liées à votre retraite et au régime + d'invalidité-décès. + pamc: <0><0>Vos institutions + partenaires<1><0><1><2><0><0><0><1>En tant que + professionnel de santé conventionné, vous bénéficiez d'une prise en charge + d'une partie de vos cotisations par l'Assurance Maladie.<2><0> + <2><2><0> Les montants indiqués ci-dessus sont + calculés sans prendre en compte l'exonération de début d'activité + ACRE + 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: + année-courante: Le montant calculé correspond aux cotisations de l’année 2021 + (pour un revenu 2021). + artiste-auteur: + "1": Cette estimation est proposée à titre indicatif. Elle est faite à partir + des éléments réglementaires applicables et des éléments que vous avez + saisis, mais elle ne tient pas compte de l'ensemble de votre situation. + Le montant réel de vos cotisations peut donc être différent. + "2": Ce simulateur permet d'estimer le montant de vos cotisations à partir de + votre revenu projeté + auto-entrepreneur: Les auto-entrepreneurs bénéficient d’un régime très simplifié + avec un taux forfaitaire pour le calcul des cotisations et contributions + sociales appliqué sur le chiffre d’affaires. Selon le choix de la modalité + de paiement des impôts il est appliqué un abattement forfaitaire au titre + des frais professionnels. Il n’est pas possible de déduire des charges + réelles en plus. Votre revenu net est donc le chiffre d’affaires moins + toutes les charges engagées pour l’entreprise. + cfe: Le simulateur n'intègre pas la cotisation foncière des entreprise (CFE) qui + est dûe dès la deuxième année d'exercice. Son montant varie fortement en + fonction du chiffre d'affaires et de la domiciliation de l'entreprise. + <2>Plus d'infos. + cotisations-ordinales: Pour les professions réglementées, le simulateur ne + calcule pas le montant des cotisations à l'ordre. Elles doivent être + ajoutées manuellement dans la case « charges de fonctionnement ». + plus: Lire les précisions + profession-libérale: <0>Ce simulateur est à destination des professions + libérales en BNC. Il ne prend pas en compte les sociétés d'exercice + libéral. + sasu: L'impôt sur les sociétés et la gestion des dividendes ne sont pas encore + implémentés. + titre: Avant de commencer... + urssaf: Les calculs sont indicatifs. Ils ne se substituent pas aux décomptes + réels de l’Urssaf, de l’administration fiscale ou de toute autre + organisme. +simulation-end: + cta: Connaître les démarches + hiring: + text: Vous pouvez maintenant concrétiser votre projet d'embauche. + text: Vous avez maintenant accès à l'estimation la plus précise possible. + title: Vous avez complété cette simulation +statut du dirigeant: + description: <0>Ce choix est important car il détermine le régime de sécurité + sociale et la couverture sociale du dirigeant. Le montant et les modalités + de paiement des cotisations sociales sont également + impactés.<1><0> + page: + description: Ce choix est important parce qu'il détermine le régime de sécurité + sociale et la couverture sociale de l'administrateur. Chaque option a des + implications juridiques et conduit à un statut différent lors de la + création de votre entreprise. + titre: Définir le statut du dirigeant +supérieurs à: supérieurs à +sécu: + contenu: <0>Protection sociale <1>En France, tous les travailleurs + bénéficient d'une protection sociale de qualité. Ce système obligatoire + repose sur la solidarité et vise à assurer le <2>bien-être général de la + population.<2>En contrepartie du paiement de <2>contributions + sociales, le cotisant est couvert sur la maladie, les accidents du + travail, chômage ou encore la retraite. + page: + titre: Sécurité sociale +tous les 6 mois: tous les 6 mois +trimestriel: trimestriel +trouver: + description: Grâce à la base SIREN, les données publiques sur votre entreprise + seront automatiquement disponibles pour la suite du parcours sur le site. + titre: Retrouver mon entreprise +À quoi servent mes cotisations ?: À quoi servent mes cotisations ? +économieCollaborative: + accueil: + contenu: <0>Vous avez des revenus issus des <2>plateformes en ligne (Airbnb, + Abritel, Drivy, Blablacar, Leboncoin, etc.) ? Vous devez les déclarer dans + la plupart des cas. Cependant, il peut être difficile de s'y retrouver + <4>{emoji('🤔')}.<1>Suivez ce guide pour savoir en quelques clics + comment être en règle.<2>À partir de 2020, ces revenus seront + communiqués automatiquement par les plateformes à l’administration fiscale + et à l’Urssaf. + question: Quels types d'activités avez-vous exercé ? + réassurance: "PS : cet outil est là uniquement pour vous informer, aucune donnée + ne sera transmise aux administrations" + titre: Comment déclarer mes revenus des plateformes en ligne ? + activité: + choix: Quelles sont plus précisément les activités exercées ? + impôt: <0>Vous devez déclarez vos revenus aux impôts<1>Les revenus de cette + activité sont imposables. + pro: <0>Il s'agit d'une activité professionnelle<1>Les revenus de cette + activité sont considérés comme des <2>revenus professionnels dès le 1er + euro gagné. + revenusAnnuels: <0>Revenus annuels<1>Vos revenus annuels pour cette activité sont : + voirObligations: Voir mes obligations + exonération: + notice: Si aucun de ces cas ne s'applique à vous, vous n'aurez rien à déclarer. + question: Êtes-vous dans un des cas suivants ? + obligations: + aucune: <0>Rien à faire<1>Vous n'avez pas besoin de déclarer vos revenus + pour ces activités. + entreprise: <0>Avec une entreprise<1>Si vous possédez déjà une activité + déclarée, vous pouvez ajouter ces revenus à ceux de l'entreprise. Il vous + faudra seulement vérifier que son objet social est compatible avec les + activités concernées (et le changer si besoin). Sinon, vous aurez à créer + une nouvelle entreprise.<2>Créer une entreprise + guide: <0>Consulter le guide Urssaf<1>Découvrez les modalités des statuts + sociaux pour chaque type de locations (bien, meublé, courte durée, classé, + etc.).<2>PDF + impôts: <0>Déclarer vos revenus aux impôts<1>Pour ces activités, vous avez + uniquement besoin de déclarer vos revenus sur votre feuille d'imposition. + Pour en savoir plus, vous pouvez consulter la <2>page dédiée sur + impots.gouv.fr. + pro: <0>Déclarer en tant qu'activité professionnelle<1>Vos revenus sont + considérés comme revenus professionnels, ils sont soumis aux cotisations + sociales. En contrepartie, ils ouvrent vos droit à des prestations + sociales (retraite, assurance maladie, maternité, etc.). + régimeGénéral: <0>Avec l'option régime général<1>Pour certaines activités, + vous pouvez déclarer vos revenus directement sur le site de l'Urssaf. + C'est une option intéressante si vous ne souhaitez pas créer d'entreprise + ou modifier une entreprise existante. Vous devrez dans tous les cas + déclarer ces revenus aux impôts.<2>Déclarer au régime général + régimeGénéralDisponible: Régime général disponible + titre: Que dois-je faire pour être en règle ? + retourAccueil: Retour à la selection d'activités From 1ab6263dcd1867517e26b571d0939c7a5239f846 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Fri, 28 May 2021 16:57:40 +0200 Subject: [PATCH 161/319] =?UTF-8?q?=F0=9F=91=BD=20Corrige=20la=20traductio?= =?UTF-8?q?n=20du=20paragraphe=20=E2=80=9Cqui=20sommes=20nous=20=3F?= =?UTF-8?q?=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/locales/ui-en.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index d320cf532..bab37d146 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -781,13 +781,13 @@ indicationTempsPlein: in full-time gross salary equivalent inférieurs à: lower than jour: day landing: - aboutUs: "<0>Who are we?<1>We are a small <2>, autonomous and - multidisciplinary<0>team within<5>URSSAF. We have at heart to be - close to your needs in order to constantly improve this site in accordance - with the <8>beta.gouv.fr approach.<2>We have developed this site to - <2>support entrepreneurs in the development of their business.<3>Our - objective is to <2>remove all uncertainties regarding the administration - so that you can concentrate on what matters: your business." + aboutUs: "<0>Who are we?<1>We are a small, independent, multidisciplinary + <2>team within the <5>Urssaf. We are committed to being close to + your needs in order to constantly improve this site in accordance with the + <8>beta.gouv.fr approach.<2>We have developed this site to <2>assist + entrepreneurs in the development of their business.<3>Our objective + is to <2>remove all administrative uncertainties so that you can focus + on what really matters: your business." choice: create: <0>Create a company<1>Assistance in choosing the status and the complete list of creation steps From 489d017da3c1d7dd1835af9e20e28d1c6d9d072c Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 1 Jun 2021 09:37:58 +0200 Subject: [PATCH 162/319] :fountain_pen: remplace 'commerciale ou industrielle' par 'commerciale' (retour dnrti) --- modele-social/règles/dirigeant.yaml | 2 +- .../règles/déclaration-revenu-indépendant.yaml | 8 ++++---- modele-social/règles/entreprise-établissement.yaml | 10 +++++----- mon-entreprise/source/locales/rules-en.yaml | 10 +++++----- .../regressions/aide-déclaration-indépendants.yaml | 6 +++--- .../simulations-rémunération-dirigeant.yaml | 4 ++-- mon-entreprise/test/regressions/simulations.jest.js | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 9cfdf5286..1a180c106 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -192,7 +192,7 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC: dirigeant . auto-entrepreneur . cotisations et contributions . TFC . commerce: titre: taxe pour frais de chambre de commerce unité: €/mois - applicable si: entreprise . activité = 'commerciale ou industrielle' + applicable si: entreprise . activité = 'commerciale' produit: composantes: - assiette: entreprise . chiffre d'affaires . service BNC diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 42c0e9f8f..7b1a37e66 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -18,7 +18,7 @@ aide déclaration revenu indépendant 2020 . nature de l'activité: choix obligatoire: oui possibilités: - artisanale - - commerciale ou industrielle + - commerciale - libérale références: Vérifier la nature de son activité: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/verifier-nature-son-activite @@ -78,9 +78,9 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . libérale: références: fiche Wikipedia: https://fr.m.wikipedia.org/wiki/Profession_libérale -aide déclaration revenu indépendant 2020 . nature de l'activité . commerciale ou industrielle: - remplace: entreprise . activité . commerciale ou industrielle - formule: nature de l'activité = 'commerciale ou industrielle' +aide déclaration revenu indépendant 2020 . nature de l'activité . commerciale: + remplace: entreprise . activité . commerciale + formule: nature de l'activité = 'commerciale' description: | ### Activité commerciale - Achats de biens pour leur revente en l'état (commerce en gros ou de détail) diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 819799a70..802389475 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -717,13 +717,13 @@ entreprise . activité: titre: nature de l'activité question: Quelle est la nature de votre activité principale ? description: Votre type d'activité va déterminer une grande partie des calculs de cotisations, contributions et impôt. - par défaut: "'commerciale ou industrielle'" + par défaut: "'commerciale'" formule: une possibilité: choix obligatoire: oui possibilités: - artisanale - - commerciale ou industrielle + - commerciale - libérale références: Vérifier la nature de son activité: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/verifier-nature-son-activite @@ -741,7 +741,7 @@ entreprise . activité . libérale: fiche Wikipedia: https://fr.m.wikipedia.org/wiki/Profession_libérale liste des professions libérales: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/liste-professions-liberales -entreprise . activité . commerciale ou industrielle: +entreprise . activité . commerciale: description: | ### Activité commerciale - Achats de biens pour leur revente en l'état (commerce en gros ou de détail) @@ -767,7 +767,7 @@ entreprise . activité . service ou vente: applicable si: une de ces conditions: - activité = 'artisanale' - - activité = 'commerciale ou industrielle' + - activité = 'commerciale' question: Quelle est le type d'activité de l'entreprise ? formule: une possibilité: @@ -857,7 +857,7 @@ entreprise . activité . libérale réglementée: Liste des activités libérales: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/liste-professions-liberales entreprise . activité . débit de tabac: - applicable si: activité = 'commerciale ou industrielle' + applicable si: activité = 'commerciale' question: Exercez-vous une activité de vente de tabac ? par défaut: non diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index d34628c20..9ecab3f27 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -157,8 +157,8 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . artisanale: - Les activités artisanales sont répertoriées par un décret titre.en: '[automatic] artisanal' titre.fr: artisanale -? aide déclaration revenu indépendant 2020 . nature de l'activité . commerciale ou industrielle -: description.en: > +aide déclaration revenu indépendant 2020 . nature de l'activité . commerciale: + description.en: > [automatic] ### Commercial activity - Purchases of goods for resale in the same condition (wholesale or retail) @@ -183,7 +183,7 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . artisanale: Activité de production ou de transformation grâce à l'utilisation d'outils industriels, extraction, industries minières, manutention, magasinage et stockage titre.en: '[automatic] commercial or industrial' - titre.fr: commerciale ou industrielle + titre.fr: commerciale aide déclaration revenu indépendant 2020 . nature de l'activité . libérale: description.en: > [automatic] These are the "intellectual" professions, which are not attached @@ -6675,7 +6675,7 @@ entreprise . activité . artisanale: - Les activités artisanales sont répertoriées par un décret titre.en: Craft titre.fr: artisanale -entreprise . activité . commerciale ou industrielle: +entreprise . activité . commerciale: description.en: > [automatic] ### Commercial activity @@ -6701,7 +6701,7 @@ entreprise . activité . commerciale ou industrielle: Activité de production ou de transformation grâce à l'utilisation d'outils industriels, extraction, industries minières, manutention, magasinage et stockage titre.en: commercial or industrial - titre.fr: commerciale ou industrielle + titre.fr: commerciale entreprise . activité . débit de tabac: question.en: '[automatic] Do you engage in tobacco sales?' question.fr: Exercez-vous une activité de vente de tabac ? diff --git a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml index cc4560db6..6147c6dba 100644 --- a/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml +++ b/mon-entreprise/test/regressions/aide-déclaration-indépendants.yaml @@ -13,9 +13,9 @@ nature de l'activité: dirigeant . rémunération . totale: 50000 €/an - aide déclaration revenu indépendant 2020 . nature de l'activité: "'artisanale'" dirigeant . rémunération . totale: 5000 €/an - - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale ou industrielle'" + - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale'" dirigeant . rémunération . totale: 50000 €/an - - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale ou industrielle'" + - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale'" dirigeant . rémunération . totale: 5000 €/an - aide déclaration revenu indépendant 2020 . nature de l'activité: "'libérale'" dirigeant . rémunération . totale: 50000 €/an @@ -27,7 +27,7 @@ nature de l'activité: dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire: oui débit de tabac: - - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale ou industrielle'" + - aide déclaration revenu indépendant 2020 . nature de l'activité: "'commerciale'" dirigeant . rémunération . totale: 50000 €/an entreprise . activité . débit de tabac: oui dirigeant . indépendant . cotisations et contributions . déduction tabac: 30000 €/an diff --git a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml index fd9dac624..9b8022c94 100644 --- a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml +++ b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml @@ -34,10 +34,10 @@ activités: - dirigeant . rémunération . totale: 20000 €/an entreprise . activité: "'artisanale'" - dirigeant . rémunération . totale: 20000 €/an - entreprise . activité: "'commerciale ou industrielle'" + entreprise . activité: "'commerciale'" entreprise . activité . service ou vente: "'vente'" - dirigeant . rémunération . totale: 20000 €/an - entreprise . activité: "'commerciale ou industrielle'" + entreprise . activité: "'commerciale'" entreprise . activité . service ou vente: "'service'" Contrats Madelin: diff --git a/mon-entreprise/test/regressions/simulations.jest.js b/mon-entreprise/test/regressions/simulations.jest.js index 1331eba98..982ad639d 100644 --- a/mon-entreprise/test/regressions/simulations.jest.js +++ b/mon-entreprise/test/regressions/simulations.jest.js @@ -141,7 +141,7 @@ it('calculate aide-déclaration-indépendant', () => { aideDéclarationConfig.objectifs, { "aide déclaration revenu indépendant 2020 . nature de l'activité": - "'commerciale ou industrielle'", + "'commerciale'", ...aideDéclarationConfig.situation, } ) From 85ef5bedf2a6160aa38cc7acac9d50d6e4fd3bd0 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 1 Jun 2021 10:00:54 +0200 Subject: [PATCH 163/319] Corrige les dates de l'ACRE --- .../test/regressions/__snapshots__/simulations.jest.js.snap | 4 ++-- .../test/regressions/simulations-auto-entrepreneur.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 6842f3fc7..4db0d818f 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -114,7 +114,7 @@ Notifications affichées : dirigeant . auto-entrepreneur . notification calcul A `; exports[`calculate simulations-auto-entrepreneur: ACRE 3`] = ` -"[33228,269,30000,0,30000] +"[34449,371,30000,0,30000] Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" `; @@ -435,7 +435,7 @@ Notifications affichées : dirigeant . auto-entrepreneur . notification calcul A `; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): ACRE 3`] = ` -"[0,28046,28046,4350,4,12] +"[0,26126,26126,4350,4,12] Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" `; diff --git a/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml b/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml index ea4dcbb9d..9b722380f 100644 --- a/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml +++ b/mon-entreprise/test/regressions/simulations-auto-entrepreneur.yaml @@ -29,10 +29,10 @@ ACRE: entreprise . date de création: 01/01/2020 entreprise . ACRE: oui - dirigeant . auto-entrepreneur . net de cotisations: 30000 €/an - entreprise . date de création: 01/06/2019 + entreprise . date de création: 01/06/2020 entreprise . ACRE: oui - dirigeant . auto-entrepreneur . net de cotisations: 40000 €/an - entreprise . date de création: 01/06/2018 + entreprise . date de création: 01/06/2019 entreprise . ACRE: oui From 7c88ebff1efb90ae2838b6d7e0d65867a7dbc3ef Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 31 May 2021 18:03:28 +0200 Subject: [PATCH 164/319] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20le=20seuil=20m?= =?UTF-8?q?icro-bnc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/entreprise-établissement.yaml | 6 +++++- mon-entreprise/source/components/SchemeComparaison.tsx | 2 +- mon-entreprise/source/locales/ui-fr.yaml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 802389475..09de5ad66 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -326,9 +326,13 @@ entreprise . chiffre d'affaires . seuil micro dépassé: Bofip (dépassement micro-bic): https://bofip.impots.gouv.fr/bofip/1802-PGP.html autoentrepreneur.urssaf.fr: https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html unité: €/an + # TODO: les seuils micro sont dupliqués à plusieurs endroits (artiste-auteur . + # revenus . BNC . contrôle micro-bnc, tableau de la comparaison de régime, + # économie collaborative). Il faudrait référencer la même valeur partout où + # elle est utilisée. une de ces conditions: - entreprise . chiffre d'affaires > 176200 €/an - - entreprise . chiffre d'affaires . service > 72500 €/an + - entreprise . chiffre d'affaires . service > 72600 €/an entreprise . imposition . IR . information sur le report de déficit: diff --git a/mon-entreprise/source/components/SchemeComparaison.tsx b/mon-entreprise/source/components/SchemeComparaison.tsx index a5162d915..bb38bf6e3 100644 --- a/mon-entreprise/source/components/SchemeComparaison.tsx +++ b/mon-entreprise/source/components/SchemeComparaison.tsx @@ -267,7 +267,7 @@ export default function SchemeComparaison({
    Oui - (72 500 € en services / 176 200 € en vente de biens, + (72 600 € en services / 176 200 € en vente de biens, restauration ou hébergement)
    diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index dba24b2da..d1cc47fb8 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -203,7 +203,7 @@ comparaisonRégimes: tagline: La protection sociale à la carte mutuelle: <0>Mutuelle santé<1><1>Obligatoire<2>Fortement conseillée plafondCA: <0>Plafond de chiffre - d'affaires<1><0>Non<2><0>Oui<1>(72 500 € en services / 176 + d'affaires<1><0>Non<2><0>Oui<1>(72 600 € en services / 176 200 € en vente de biens, restauration ou hébergement) retraite: <0>Retraite retraiteEstimation: From b8142a26ea9f4684b19449521b569bbcc1df4cce Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 1 Jun 2021 15:18:15 +0200 Subject: [PATCH 165/319] =?UTF-8?q?=F0=9F=A4=96=20Robot=20Zammad=20pour=20?= =?UTF-8?q?les=20PR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/zammad-bot.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/zammad-bot.yaml b/.github/workflows/zammad-bot.yaml index 165df262b..16138ef20 100644 --- a/.github/workflows/zammad-bot.yaml +++ b/.github/workflows/zammad-bot.yaml @@ -3,6 +3,8 @@ name: Message du robot Zammad on: issues: types: [closed] + pull_request: + types: [closed] jobs: comment-when-issue-close: From c52cd1503087869875ba56bcfd5839c2862f5a29 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 1 Jun 2021 15:26:05 +0200 Subject: [PATCH 166/319] =?UTF-8?q?Revert=20"=F0=9F=A4=96=20Robot=20Zammad?= =?UTF-8?q?=20pour=20les=20PR"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit b8142a26ea9f4684b19449521b569bbcc1df4cce. --- .github/workflows/zammad-bot.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/zammad-bot.yaml b/.github/workflows/zammad-bot.yaml index 16138ef20..165df262b 100644 --- a/.github/workflows/zammad-bot.yaml +++ b/.github/workflows/zammad-bot.yaml @@ -3,8 +3,6 @@ name: Message du robot Zammad on: issues: types: [closed] - pull_request: - types: [closed] jobs: comment-when-issue-close: From 0df43dd665c794a56b629ec971c53d5de4ff9c41 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 6 May 2021 17:04:36 +0200 Subject: [PATCH 167/319] :art::fire: ajoute un composant Pageheader pour unifomrmiser le style Header + illustration --- .../source/components/PageHeader.tsx | 34 +++++++ mon-entreprise/source/pages/Créer/Home.tsx | 69 +++++++------- .../AideDéclarationIndépendant/index.tsx | 90 ++++++++++--------- .../undraw_fill_in_mie5.svg | 1 + .../pages/Gérer/DemandeMobilite/index.tsx | 14 +-- .../undraw_Traveling_re_weve.svg | 1 + mon-entreprise/source/pages/Gérer/Home.tsx | 41 ++++----- .../source/pages/Simulateurs/Home.tsx | 26 ++---- 8 files changed, 149 insertions(+), 127 deletions(-) create mode 100644 mon-entreprise/source/components/PageHeader.tsx create mode 100644 mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/undraw_fill_in_mie5.svg create mode 100644 mon-entreprise/source/pages/Gérer/DemandeMobilite/undraw_Traveling_re_weve.svg diff --git a/mon-entreprise/source/components/PageHeader.tsx b/mon-entreprise/source/components/PageHeader.tsx new file mode 100644 index 000000000..9a1e01361 --- /dev/null +++ b/mon-entreprise/source/components/PageHeader.tsx @@ -0,0 +1,34 @@ +import { ReactNode } from 'react' + +export default function PageHeader({ + titre, + children, + picture, +}: { + titre?: ReactNode + children: ReactNode + picture?: string +}) { + return ( +
    +
    + {titre &&

    {titre}

    } + {children} +
    + + {picture && ( + + )} +
    + ) +} diff --git a/mon-entreprise/source/pages/Créer/Home.tsx b/mon-entreprise/source/pages/Créer/Home.tsx index 553b7a148..7a05fe551 100644 --- a/mon-entreprise/source/pages/Créer/Home.tsx +++ b/mon-entreprise/source/pages/Créer/Home.tsx @@ -1,3 +1,4 @@ +import PageHeader from 'Components/PageHeader' import Animate from 'Components/ui/animate' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext } from 'react' @@ -25,45 +26,37 @@ export default function Créer() { {t('créer.titre', 'Créer une entreprise')} + Créer une entreprise} + picture={créerSvg} + > +

    + + Avant d'entamer les démarches administratives pour créer votre + entreprise, vous devez choisir un statut juridique adapté à votre + activité + +

    + + {!guideAlreadyStarted + ? t('créer.cta.default', 'Trouver le bon statut') + : t('créer.cta.continue', 'Continuer le guide')} + +

    + + Le cas des professions libérales réglementées n'est pas encore + traité + +

    +
    -

    - Créer une entreprise -

    -
    -
    -

    - - Avant d'entamer les démarches administratives pour créer votre - entreprise, vous devez choisir un statut juridique adapté à votre - activité - -

    - - {!guideAlreadyStarted - ? t('créer.cta.default', 'Trouver le bon statut') - : t('créer.cta.continue', 'Continuer le guide')} - -

    - - Le cas des professions libérales réglementées n'est pas encore - traité - -

    -
    - - -

    Ressources utiles

    diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index b2dc4d7db..02e3afa5c 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -3,6 +3,7 @@ import Aide from 'Components/conversation/Aide' import { Explicable, ExplicableRule } from 'Components/conversation/Explicable' import RuleInput from 'Components/conversation/RuleInput' import Value, { Condition, WhenAlreadyDefined } from 'Components/EngineValue' +import PageHeader from 'Components/PageHeader' import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' import RuleLink from 'Components/RuleLink' import 'Components/TargetSelection.css' @@ -24,7 +25,7 @@ import styled from 'styled-components' import { TrackPage } from '../../../ATInternetTracking' import { CompanySection } from '../Home' import simulationConfig from './config.yaml' - +import illustration from './undraw_fill_in_mie5.svg' export default function AideDéclarationIndépendant() { useSimulationConfig(simulationConfig) const dispatch = useDispatch() @@ -48,48 +49,50 @@ export default function AideDéclarationIndépendant() { engine.evaluate('dirigeant . rémunération . totale').nodeValue !== null return ( -
    + <> -

    - Cet outil est une aide à la déclaration de revenus à destination des - travailleurs indépendants. Il vous permet de connaître le montant des - charges sociales déductibles à partir de votre résultat net fiscal. -

    -

    - Vous restez entièrement responsable d'éventuelles omissions ou - inexactitudes dans votre déclarations. -

    -
    - -

    - Cet outil vous concerne si vous êtes dans tous les cas suivants : -

    -
      -
    • - vous cotisez au régime général des travailleurs indépendants -
    • -
    • - votre entreprise est au régime réel d'imposition et en - comptabilité d'engagement -
    • -
    -

    - Il ne vous concerne pas si vous êtes dans un des cas suivants : -

    -
      -
    • - vous exercez une activité libérale relevant d’un régime de - retraite des professions libérales -
    • -
    • - vous êtes gérants de société relevant de l’impôt sur les - sociétés -
    • -
    • vous avez opté pour le régime micro-fiscal
    • -
    • votre entreprise est domiciliée dans les DOM
    • -
    -
    -
    + +

    + Cet outil est une aide à la déclaration de revenus à destination des{' '} + travailleurs indépendants. Il vous permet de + connaître le montant des charges sociales déductibles à partir de + votre résultat net fiscal. +

    +

    + Vous restez entièrement responsable d'éventuelles omissions ou + inexactitudes dans votre déclarations. +

    +
    + + +

    + Cet outil vous concerne si vous êtes dans tous les cas suivants : +

    +
      +
    • + vous cotisez au régime général des travailleurs indépendants +
    • +
    • + votre entreprise est au régime réel d'imposition et en + comptabilité d'engagement +
    • +
    +

    + Il ne vous concerne pas si vous êtes dans un des cas suivants : +

    +
      +
    • + vous exercez une activité libérale relevant d’un régime de + retraite des professions libérales +
    • +
    • + vous êtes gérants de société relevant de l’impôt sur les sociétés +
    • +
    • vous avez opté pour le régime micro-fiscal
    • +
    • votre entreprise est domiciliée dans les DOM
    • +
    +
    + {!situation['dirigeant . rémunération . totale'] && ( )} @@ -112,6 +115,7 @@ export default function AideDéclarationIndépendant() { autoFocus /> + {displayForm ? ( ) : ( @@ -205,7 +209,7 @@ export default function AideDéclarationIndépendant() { )} -
    + ) } diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/undraw_fill_in_mie5.svg b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/undraw_fill_in_mie5.svg new file mode 100644 index 000000000..b02a345f3 --- /dev/null +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/undraw_fill_in_mie5.svg @@ -0,0 +1 @@ +fill_in \ No newline at end of file diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx b/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx index 89c379eb3..4f7817542 100644 --- a/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx +++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx @@ -1,6 +1,7 @@ import { Explicable } from 'Components/conversation/Explicable' import RuleInput from 'Components/conversation/RuleInput' import { Condition } from 'Components/EngineValue' +import PageHeader from 'Components/PageHeader' import * as Animate from 'Components/ui/animate' import Emoji from 'Components/utils/Emoji' import { EngineContext, EngineProvider } from 'Components/utils/EngineContext' @@ -28,13 +29,16 @@ export default function FormulaireMobilitéIndépendant() { const engine = new Engine(formulaire) return ( -

    Demande de mobilité internationale pour travailleur indépendant

    -

    - + +

    Travailleur indépendant exerçant son activité à l’étranger : Régime de Sécurité sociale applicable{' '} - -

    +

    +

    Vous exercez une activité non salariée ou salariée dans un ou plusieurs Etats (pays) membres de l’UE, de l’ diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/undraw_Traveling_re_weve.svg b/mon-entreprise/source/pages/Gérer/DemandeMobilite/undraw_Traveling_re_weve.svg new file mode 100644 index 000000000..3d036e4c5 --- /dev/null +++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/undraw_Traveling_re_weve.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mon-entreprise/source/pages/Gérer/Home.tsx b/mon-entreprise/source/pages/Gérer/Home.tsx index 01325e6f2..316779f14 100644 --- a/mon-entreprise/source/pages/Gérer/Home.tsx +++ b/mon-entreprise/source/pages/Gérer/Home.tsx @@ -6,6 +6,7 @@ import { import CompanyDetails from 'Components/CompanyDetails' import FindCompany from 'Components/FindCompany' import Overlay from 'Components/Overlay' +import PageHeader from 'Components/PageHeader' import * as Animate from 'Components/ui/animate' import { ScrollToTop } from 'Components/utils/Scroll' import { SitePathsContext } from 'Components/utils/SitePathsContext' @@ -58,30 +59,22 @@ export default function Gérer() { -

    - Gérer mon activité -

    -
    -
    - {!company && ( -

    - - Vous souhaitez vous verser un revenu ou embaucher ?
    - Vous aurez à payer des cotisations et des impôts.
    - Anticipez leurs montants grâce aux simulateurs adaptés à votre - situation. -
    -

    - )} - -
    - - -
    + Gérer mon activité} + > + {!company && ( +

    + + Vous souhaitez vous verser un revenu ou embaucher ?
    + Vous aurez à payer des cotisations et des impôts.
    + Anticipez leurs montants grâce aux simulateurs adaptés à votre + situation. +
    +

    + )} + +
    <>
    diff --git a/mon-entreprise/source/pages/Simulateurs/Home.tsx b/mon-entreprise/source/pages/Simulateurs/Home.tsx index 466064a73..7225c795d 100644 --- a/mon-entreprise/source/pages/Simulateurs/Home.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Home.tsx @@ -1,4 +1,5 @@ import classnames from 'classnames' +import PageHeader from 'Components/PageHeader' import InfoBulle from 'Components/ui/InfoBulle' import { IsEmbeddedContext } from 'Components/utils/embeddedContext' import { HeadingWithAnchorLink } from 'Components/utils/markdown' @@ -24,23 +25,14 @@ export default function Simulateurs() { {titre} -
    -
    -

    {titre}

    -

    - - Tous les simulateurs sur ce site sont maintenus à jour avec les - dernières évolutions législatives. - -

    -
    - - -
    + +

    + + Tous les simulateurs sur ce site sont maintenus à jour avec les + dernières évolutions législatives. + +

    +
    Salariés et employeurs From 5f46baafb39778231c80b5cad6a043f47bc9c05f Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 10 May 2021 12:22:31 +0200 Subject: [PATCH 168/319] =?UTF-8?q?:hammer:=20Ajoute=20l'option=20IS=20dan?= =?UTF-8?q?s=20l'aide=20=C3=A0=20la=20d=C3=A9claration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../déclaration-revenu-indépendant.yaml | 56 ++++++++- .../components/conversation/RuleInput.tsx | 7 +- .../AideDéclarationIndépendant/config.yaml | 2 +- .../AideDéclarationIndépendant/index.tsx | 107 +++++++++++------- 4 files changed, 125 insertions(+), 47 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 7b1a37e66..6755aea16 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -397,20 +397,35 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois aide déclaration revenu indépendant 2020 . revenu net fiscal: + applicable si: entreprise . imposition . IR titre: revenu net fiscal résumé: '[A]' description: Résultat avant déduction des charges sociales et exonérations fiscales valeur: dirigeant . rémunération . totale + + +aide déclaration revenu indépendant 2020 . rémunération nette dirigeant: + applicable si: entreprise . imposition . IS + résumé: '[X]' + description: | + La rémunération nette du dirigeant déductible du résultat pour l'impôt sur le revenu (charges sociales non incluse). + + À reporter dans : + - **régime réel simplifié :** la rubrique 250 du formulaire 2033-B-SD + - **régime réel normal :** la rubrique FZ du formulaire 2052-SD + - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD + valeur: dirigeant . rémunération . nette + aide déclaration revenu indépendant 2020 . cotisations obligatoires: titre: Cotisations sociales obligatoires déductibles résumé: '[C]' description: | À reporter dans : - - **la case DSCA/DSCB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) - - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD - - **régime réel normal :** la rubrique A5 du formulaire 2053-SD - - **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD + - **dans tous les cas :** la rubrique DSCA/DSCB du formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) + - **régime réel simplifié (IR uniquement) :** la rubrique 326 du formulaire 2033-D-SD + - **régime réel normal (IR uniquement):** la rubrique A5 du formulaire 2053-SD + - **déclaration contrôlée (IR uniquement):** la rubrique BT du formulaire 2035-A-SD unité: €/an somme: - dirigeant . indépendant . cotisations et contributions . cotisations @@ -418,18 +433,29 @@ aide déclaration revenu indépendant 2020 . cotisations obligatoires: références: Notice impots.gouv.fr: https://www.impots.gouv.fr/portail/www2/fichiers/documentation/brochure/ir_2021/pdf_som/11-bis-decla_fusion_fisc_185a195.pdf + aide déclaration revenu indépendant 2020 . CSG déductible: titre: CSG déductible résumé: '[B]' + applicable si: entreprise . imposition . IR description: "Montant de la CSG déductible à l'impôt sur le revenu" valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible +aide déclaration revenu indépendant 2020 . cotisations non déductible: + applicable si: entreprise . imposition . IS + titre: Cotisations non déductible + résumé: '[Y]' + description: "Montant des cotisations non déductible à l'impôt sur le revenu" + valeur: dirigeant . indépendant . cotisations et contributions . non déductibles + aide déclaration revenu indépendant 2020 . CFP: résumé: '[D]' + applicable si: entreprise . imposition . IR description: Contribution à la formation professionnelle valeur: dirigeant . indépendant . cotisations et contributions . formation professionnelle -aide déclaration revenu indépendant 2020 . total charges sociales déductible: +aide déclaration revenu indépendant 2020 . total charges sociales déductibles IR: + applicable si: entreprise . imposition . IR titre: charges sociales obligatoires déductibles fiscalement résumé: '[B + C + D]' somme: @@ -439,11 +465,29 @@ aide déclaration revenu indépendant 2020 . total charges sociales déductible: description: | À reporter dans : - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD - - **régime réel normal :** la rubrique FZ du formulaire 2052-SD + - **régime réel normal :** la rubrique FY du formulaire 2052-SD - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD + +aide déclaration revenu indépendant 2020 . total charges sociales déductibles IS: + applicable si: entreprise . imposition . IS + titre: charges sociales du dirigeant (déductibles de l'impôt sur les société) + valeur: dirigeant . indépendant . cotisations et contributions + description: | + À reporter dans : + - **régime réel simplifié** : la rubrique 252 du formulaire 2035-B-SD + - **régime réel normal** : la rubrique FY du formulaire 2052-SD + aide déclaration revenu indépendant 2020 . assiette sociale: résumé: '[A - (B + C + D)]' + applicable si: entreprise . imposition . IR description: Assiette utilisée pour le calcul des cotisations sociales valeur: dirigeant . indépendant . assiette des cotisations + +aide déclaration revenu indépendant 2020 . traitements et salaires: + applicable si: entreprise . imposition . IS + description: | + À reporter dans la case **1GB/1HB** de la déclaration n°2042 + résumé: '[X + Y]' + valeur: dirigeant . rémunération . imposable diff --git a/mon-entreprise/source/components/conversation/RuleInput.tsx b/mon-entreprise/source/components/conversation/RuleInput.tsx index 6d76771fb..017f7ee0b 100644 --- a/mon-entreprise/source/components/conversation/RuleInput.tsx +++ b/mon-entreprise/source/components/conversation/RuleInput.tsx @@ -24,7 +24,10 @@ type Props = Omit< required?: boolean autoFocus?: boolean dottedName: Name - onChange: (value: Parameters['evaluate']>[0] | undefined) => void + onChange: ( + value: Parameters['evaluate']>[0] | undefined, + dottedName: DottedName + ) => void // TODO: It would be preferable to replace this "showSuggestions" parameter by // a build-in logic in the engine, by setting the "applicability" of // suggestions. @@ -75,7 +78,7 @@ export default function RuleInput({ dottedName, value, missing: !showDefaultDateValue && !!evaluation.missingVariables[dottedName], - onChange, + onChange: (value) => onChange(value, dottedName), title: rule.title, id: props.id ?? dottedName, question: rule.rawNode.question, diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml index 0bdf7e47e..558d0c42f 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml @@ -1,6 +1,6 @@ objectifs: - aide déclaration revenu indépendant 2020 . cotisations obligatoires - - aide déclaration revenu indépendant 2020 . total charges sociales déductible + - aide déclaration revenu indépendant 2020 . total charges sociales déductibles IR situation: dirigeant: "'indépendant'" diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 02e3afa5c..ba933c89d 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -29,24 +29,21 @@ import illustration from './undraw_fill_in_mie5.svg' export default function AideDéclarationIndépendant() { useSimulationConfig(simulationConfig) const dispatch = useDispatch() - const engine = useEngine() const company = useSelector( (state: RootState) => state.inFranceApp.existingCompany ) const situation = useSelector(situationSelector) - - const setCurrentIncome = useCallback( - (currentIncome) => { - dispatch( - updateSituation('dirigeant . rémunération . totale', currentIncome) - ) + const setSituation = useCallback( + (value, dottedName) => { + dispatch(updateSituation(dottedName, value)) }, - [dispatch, updateSituation] + [dispatch] ) const displayForm = - engine.evaluate('dirigeant . rémunération . totale').nodeValue !== null + situation['dirigeant . rémunération . totale'] || + situation['dirigeant . rémunération . nette'] return ( <> @@ -55,8 +52,8 @@ export default function AideDéclarationIndépendant() {

    Cet outil est une aide à la déclaration de revenus à destination des{' '} travailleurs indépendants. Il vous permet de - connaître le montant des charges sociales déductibles à partir de - votre résultat net fiscal. + connaître le montant des charges sociales déductibles applicable à + votre rémunération.

    Vous restez entièrement responsable d'éventuelles omissions ou @@ -85,10 +82,10 @@ export default function AideDéclarationIndépendant() { vous exercez une activité libérale relevant d’un régime de retraite des professions libérales -

  • - vous êtes gérants de société relevant de l’impôt sur les sociétés -
  • vous avez opté pour le régime micro-fiscal
  • +
  • + vous êtes dans le cas d'une entreprise avec plusieurs associés +
  • votre entreprise est domiciliée dans les DOM
  • @@ -96,25 +93,52 @@ export default function AideDéclarationIndépendant() { {!situation['dirigeant . rémunération . totale'] && ( )} -

    - Quel est votre résultat fiscal en 2020 ?
    - - Charges sociales et exonérations fiscales non incluses{' '} - - -

    +

    Imposition et comptabilité

    - Le résultat fiscal correspond aux produits moins les charges. Il peut - être positif (bénéfice) ou négatif (déficit). + Ces quelques questions permettent de déterminer le type de déclaration + à remplir, ainsi que les modalités de calcul des cotisations social.

    + + + {situation['entreprise . imposition'] && ( + <> + +

    + Quel est votre résultat fiscal en 2020 ?
    + + Charges sociales et exonérations fiscales non incluses{' '} + + +

    +

    + Le résultat fiscal correspond aux produits moins les charges. Il + peut être positif (bénéfice) ou négatif (déficit). +

    + + + +
    + +

    + Quel est le montant net de votre rémunération en 2020 ? +
    + Sans tenir compte des charges sociales +

    + + + +
    + + )} - - - {displayForm ? ( @@ -413,15 +437,10 @@ function SimpleField({ const situation = useSelector(situationSelector) const dispatchValue = useCallback( - (value) => { + (value, dottedName) => { dispatch(updateSituation(dottedName, value)) - dispatch({ - type: 'STEP_ACTION', - name: 'fold', - step: dottedName, - }) }, - [dispatch, dottedName] + [dispatch] ) if ( @@ -502,10 +521,17 @@ function Results() { calculés à partir des informations saisies.

    {([ + 'aide déclaration revenu indépendant 2020 . total charges sociales déductibles IS', + 'aide déclaration revenu indépendant 2020 . rémunération nette dirigeant', + 'aide déclaration revenu indépendant 2020 . traitements et salaires', 'aide déclaration revenu indépendant 2020 . cotisations obligatoires', - 'aide déclaration revenu indépendant 2020 . total charges sociales déductible', + 'aide déclaration revenu indépendant 2020 . total charges sociales déductibles IR', ] as const).map((dottedName) => { const r = engine.getRule(dottedName) + const evaluation = engine.evaluate(dottedName) + if (evaluation.nodeValue == null || evaluation.nodeValue == false) { + return + } return (
    {([ + 'aide déclaration revenu indépendant 2020 . cotisations non déductible', 'aide déclaration revenu indépendant 2020 . réduction covid . total', 'aide déclaration revenu indépendant 2020 . revenu net fiscal', 'aide déclaration revenu indépendant 2020 . CSG déductible', @@ -557,6 +584,10 @@ function Results() { 'aide déclaration revenu indépendant 2020 . assiette sociale', ] as const).map((dottedName) => { const r = engine.getRule(dottedName) + const evaluation = engine.evaluate(dottedName) + if (evaluation.nodeValue == null || evaluation.nodeValue == false) { + return + } return (
    Date: Tue, 11 May 2021 09:05:23 +0200 Subject: [PATCH 169/319] :hammer: Ajoute les contrats Madelin pour l'option IS --- .../ExplicationResultatFiscal.tsx | 148 ++++++++++ .../AideDéclarationIndépendant/Fields.tsx | 108 ++++++++ .../AideDéclarationIndépendant/index.tsx | 259 +----------------- 3 files changed, 264 insertions(+), 251 deletions(-) create mode 100644 mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx create mode 100644 mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx new file mode 100644 index 000000000..e679a2f92 --- /dev/null +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/ExplicationResultatFiscal.tsx @@ -0,0 +1,148 @@ +import { Explicable } from 'Components/conversation/Explicable' + +export function ExplicationsResultatFiscal() { + return ( + + <> +

    Quelles exonérations inclure ?

    +

    + Pour calculer le montant du résultat fiscal avant déduction des + exonérations et des charges sociales à indiquer dans ce simulateur, + vous pouvez utiliser votre liasse fiscale, en reprenant les montants + indiqués dans les lignes fiscales du tableau ci-dessous, en fonction + de votre situation (imposition au réel normal ou au réel simplifié). +

    +

    L’opération à effectuer est la suivante :

    +
      +
    • + Déterminez le résultat fiscal dans votre liasse, sans déduire le + montant de vos cotisations et contributions sociales aux régimes + obligatoires de sécurité sociale. Prenez le résultat fiscal + correspondant (1) +
    • +
    • + Ajoutez les exonérations (2) +
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Exonérations (2) +
    + Résultat fiscal (1) + + Exonérations liées aux zones / activités + + Exonérations Madelin et plan d’épargne retraite + + Exonérations de plus-values à court terme + Suramortissement productif
    BIC réel normal + 2058-A-SD +
    + Ligne XN (bénéfice) Ligne XO (déficit) +
    + 2058-A-SD +
    + Lignes K9 / L6 / ØV / PP / L2 / 1F / PC / L5 / PA / XC / PB +
    + 2053-SD +
    + Lignes A7 et A8 +
    + 2058-A-SD +
    + Ligne XG (montant inclus) +
    + 2058-A-SD +
    + Lignes X9 et YA +
    BIC réel simplifié + 2033-B-SD +
    + Ligne 370 (bénéfice) Ligne 372 (déficit) +
    + 2033 B-SD +
    + Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 138 / 990 / 993 +
    + 2033-SD +
    + Lignes 325 et 327 +
    + 2033 B-SD +
    + Ligne 350 (montant inclus) +
    + 2033 B-SD +
    + Lignes 655 et 643 +
    BNC déclaration contrôlée + 2035-B-SD +
    + Ligne CP (bénéfice) Ligne CR (déficit) +
    + 2035-B-SD +
    + Lignes CS / AW / CU / CI / AX / CQ +
    + 2035-A-SD +
    + Lignes BZ et BU +
    + 2035-A-SD +
    + Ligne CL (montant inclus) +
    + +
    + ) +} diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx new file mode 100644 index 000000000..6386f000e --- /dev/null +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx @@ -0,0 +1,108 @@ +import { updateSituation } from 'Actions/actions' +import { ExplicableRule } from 'Components/conversation/Explicable' +import RuleInput from 'Components/conversation/RuleInput' +import Animate from 'Components/ui/animate' +import { EngineContext } from 'Components/utils/EngineContext' +import { useNextQuestions } from 'Components/utils/useNextQuestion' +import { DottedName } from 'modele-social' +import { RuleNode } from 'publicodes' +import { useCallback, useContext } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { situationSelector } from 'Selectors/simulationSelectors' +import { Question } from './index' + +type SubSectionProp = { + dottedName: DottedName + hideTitle?: boolean +} +export function SubSection({ + dottedName: sectionDottedName, + hideTitle = false, +}: SubSectionProp) { + const engine = useContext(EngineContext) + const ruleTitle = engine.getRule(sectionDottedName)?.title + const nextSteps = useNextQuestions() + const situation = useSelector(situationSelector) + const title = hideTitle ? null : ruleTitle + const subQuestions = [ + ...(Object.keys(situation) as Array), + ...nextSteps, + ].filter((nextStep) => { + const { + dottedName, + rawNode: { question }, + } = engine.getRule(nextStep) + return !!question && dottedName.startsWith(sectionDottedName) + }) + + return ( + <> + {!!subQuestions.length && title &&

    {title}

    } + {subQuestions.map((dottedName) => ( + + ))} + + ) +} +type SimpleFieldProps = { + dottedName: DottedName + summary?: RuleNode['rawNode']['résumé'] + question?: RuleNode['rawNode']['question'] + showSuggestions?: boolean +} +export function SimpleField({ + dottedName, + question, + summary, + showSuggestions, +}: SimpleFieldProps) { + const dispatch = useDispatch() + const engine = useContext(EngineContext) + const evaluation = engine.evaluate(dottedName) + const rule = engine.getRule(dottedName) + const situation = useSelector(situationSelector) + + const dispatchValue = useCallback( + (value, dottedName) => { + dispatch(updateSituation(dottedName, value)) + }, + [dispatch] + ) + + if ( + !(dottedName in situation) && + evaluation.nodeValue === false && + !(dottedName in evaluation.missingVariables) + ) { + return null + } + return ( +
    + + +
    +

    + {question ?? rule.rawNode.question}  + +

    +

    {summary ?? rule.rawNode.résumé}

    +
    + +
    +
    +
    + ) +} diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index ba933c89d..8e5db7ffe 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -1,6 +1,5 @@ import { updateSituation } from 'Actions/actions' import Aide from 'Components/conversation/Aide' -import { Explicable, ExplicableRule } from 'Components/conversation/Explicable' import RuleInput from 'Components/conversation/RuleInput' import Value, { Condition, WhenAlreadyDefined } from 'Components/EngineValue' import PageHeader from 'Components/PageHeader' @@ -9,13 +8,10 @@ import RuleLink from 'Components/RuleLink' import 'Components/TargetSelection.css' import Animate from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' -import { EngineContext, useEngine } from 'Components/utils/EngineContext' +import { useEngine } from 'Components/utils/EngineContext' import { Markdown } from 'Components/utils/markdown' -import { useNextQuestions } from 'Components/utils/useNextQuestion' import useSimulationConfig from 'Components/utils/useSimulationConfig' -import { DottedName } from 'modele-social' -import { RuleNode } from 'publicodes' -import { useCallback, useContext } from 'react' +import { useCallback } from 'react' import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -25,6 +21,8 @@ import styled from 'styled-components' import { TrackPage } from '../../../ATInternetTracking' import { CompanySection } from '../Home' import simulationConfig from './config.yaml' +import { ExplicationsResultatFiscal } from './ExplicationResultatFiscal' +import { SimpleField, SubSection } from './Fields' import illustration from './undraw_fill_in_mie5.svg' export default function AideDéclarationIndépendant() { useSimulationConfig(simulationConfig) @@ -211,6 +209,9 @@ export default function AideDéclarationIndépendant() { dottedName="dirigeant . indépendant . cotisations et contributions . exonérations" hideTitle /> + + +

    International @@ -237,250 +238,6 @@ export default function AideDéclarationIndépendant() { ) } -type SubSectionProp = { - dottedName: DottedName - hideTitle?: boolean -} -function ExplicationsResultatFiscal() { - return ( - - <> -

    Quelles exonérations inclure ?

    -

    - Pour calculer le montant du résultat fiscal avant déduction des - exonérations et des charges sociales à indiquer dans ce simulateur, - vous pouvez utiliser votre liasse fiscale, en reprenant les montants - indiqués dans les lignes fiscales du tableau ci-dessous, en fonction - de votre situation (imposition au réel normal ou au réel simplifié). -

    -

    L’opération à effectuer est la suivante :

    -
      -
    • - Déterminez le résultat fiscal dans votre liasse, sans déduire le - montant de vos cotisations et contributions sociales aux régimes - obligatoires de sécurité sociale. Prenez le résultat fiscal - correspondant (1) -
    • -
    • - Ajoutez les exonérations (2) -
    • -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Exonérations (2) -
    - Résultat fiscal (1) - - Exonérations liées aux zones / activités - - Exonérations Madelin et plan d’épargne retraite - - Exonérations de plus-values à court terme - Suramortissement productif
    BIC réel normal - 2058-A-SD -
    - Ligne XN (bénéfice) Ligne XO (déficit) -
    - 2058-A-SD -
    - Lignes K9 / L6 / ØV / PP / L2 / 1F / PC / L5 / PA / XC / PB -
    - 2053-SD -
    - Lignes A7 et A8 -
    - 2058-A-SD -
    - Ligne XG (montant inclus) -
    - 2058-A-SD -
    - Lignes X9 et YA -
    BIC réel simplifié - 2033-B-SD -
    - Ligne 370 (bénéfice) Ligne 372 (déficit) -
    - 2033 B-SD -
    - Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 138 / 990 / 993 -
    - 2033-SD -
    - Lignes 325 et 327 -
    - 2033 B-SD -
    - Ligne 350 (montant inclus) -
    - 2033 B-SD -
    - Lignes 655 et 643 -
    BNC déclaration contrôlée - 2035-B-SD -
    - Ligne CP (bénéfice) Ligne CR (déficit) -
    - 2035-B-SD -
    - Lignes CS / AW / CU / CI / AX / CQ -
    - 2035-A-SD -
    - Lignes BZ et BU -
    - 2035-A-SD -
    - Ligne CL (montant inclus) -
    - -
    - ) -} - -function SubSection({ - dottedName: sectionDottedName, - hideTitle = false, -}: SubSectionProp) { - const engine = useContext(EngineContext) - const ruleTitle = engine.getRule(sectionDottedName)?.title - const nextSteps = useNextQuestions() - const situation = useSelector(situationSelector) - const title = hideTitle ? null : ruleTitle - const subQuestions = [ - ...(Object.keys(situation) as Array), - ...nextSteps, - ].filter((nextStep) => { - const { - dottedName, - rawNode: { question }, - } = engine.getRule(nextStep) - return !!question && dottedName.startsWith(sectionDottedName) - }) - - return ( - <> - {!!subQuestions.length && title &&

    {title}

    } - {subQuestions.map((dottedName) => ( - - ))} - - ) -} - -type SimpleFieldProps = { - dottedName: DottedName - summary?: RuleNode['rawNode']['résumé'] - question?: RuleNode['rawNode']['question'] - showSuggestions?: boolean -} -function SimpleField({ - dottedName, - question, - summary, - showSuggestions, -}: SimpleFieldProps) { - const dispatch = useDispatch() - const engine = useContext(EngineContext) - const evaluation = engine.evaluate(dottedName) - const rule = engine.getRule(dottedName) - const situation = useSelector(situationSelector) - - const dispatchValue = useCallback( - (value, dottedName) => { - dispatch(updateSituation(dottedName, value)) - }, - [dispatch] - ) - - if ( - !(dottedName in situation) && - evaluation.nodeValue === false && - !(dottedName in evaluation.missingVariables) - ) { - return null - } - return ( -
    - - -
    -

    - {question ?? rule.rawNode.question}  - -

    -

    {summary ?? rule.rawNode.résumé}

    -
    - -
    -
    -
    - ) -} - function Results() { const engine = useEngine() @@ -651,7 +408,7 @@ const FormBlock = styled.section` } ` -const Question = styled.div` +export const Question = styled.div` margin-top: 1em; ` const BigInput = styled.div` From b722003ff2a372ccf44c76e2487cb4d443aed675 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 12 May 2021 14:46:54 +0200 Subject: [PATCH 170/319] Export le type PublicodeExpression$ --- .../source/components/EngineValue.tsx | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/mon-entreprise/source/components/EngineValue.tsx b/mon-entreprise/source/components/EngineValue.tsx index 58b7cdf97..78bfd344f 100644 --- a/mon-entreprise/source/components/EngineValue.tsx +++ b/mon-entreprise/source/components/EngineValue.tsx @@ -1,18 +1,26 @@ +<<<<<<< HEAD +import { DottedName } from 'modele-social' import Engine, { ASTNode, formatValue, - PublicodesExpression, - isNotYetDefined, - UNSAFE_isNotApplicable, + + isNotYetDefined, PublicodesExpression, + + UNSAFE_isNotApplicable } from 'publicodes' import React from 'react' import { useTranslation } from 'react-i18next' -import { DottedName } from 'modele-social' import RuleLink from './RuleLink' import { useEngine } from './utils/EngineContext' +======= +import { DottedName } from 'modele-social' +import Engine, { formatValue, PublicodesExpression } from 'publicodes' +import React, { useContext } from 'react' +import { useTranslation } from 'react-i18next' +>>>>>>> e9c1f6e8 (Export le type PublicodeExpression$) export type ValueProps = { - expression: string + expression: PublicodesExpression unit?: string engine?: Engine displayedUnit?: string @@ -34,7 +42,8 @@ export default function Value({ throw new TypeError('expression cannot be null') } const e = engine ?? useEngine() - const isRule = expression in e.getParsedRules() + const isRule = + typeof expression === 'string' && expression in e.getParsedRules() const evaluation = e.evaluate({ valeur: expression, ...(unit && { unité: unit }), From 9266fbbd334975b519ce4ab2853c7e9d046c1672 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 11 May 2021 18:19:26 +0200 Subject: [PATCH 171/319] =?UTF-8?q?:art:=20:hammer:=20Change=20la=20pr?= =?UTF-8?q?=C3=A9sentation=20des=20r=C3=A9sultat=20de=20l'aide=20=C3=A0=20?= =?UTF-8?q?d=C3=A9claration=20vers=20une=20vue=20par=20formulaire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Par ailleurs, ajoute la prise en compte des cotiz madelin et des champs spéciaux déduction tabac / revenu étrangers --- modele-social/règles/dirigeant.yaml | 1 + .../déclaration-revenu-indépendant.yaml | 396 ++++++++++++----- .../règles/entreprise-établissement.yaml | 2 +- .../source/components/EngineValue.tsx | 14 +- .../AideDéclarationIndépendant/config.yaml | 11 +- .../AideDéclarationIndépendant/index.tsx | 417 +++++++++--------- 6 files changed, 505 insertions(+), 336 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 1a180c106..c098988a4 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -855,6 +855,7 @@ dirigeant . indépendant . contrats madelin . part non-déductible fiscalement: dirigeant . indépendant . contrats madelin . mutuelle: titre: Souscription à un contrat de prévoyance complémentaire Madelin question: Quel est le montant que vous versez pour vos contrats Madelin de prévoyance complémentaire (santé, perte d'emploi subie) ? + unité: €/an description: | Si vous cotisez au titre d'un contrat de prévoyance complémentaire (santé, perte d'emploi subie) de type loi Madelin, vous pouvez déduire ces cotisations des bénéfices diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 6755aea16..678aca374 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -5,13 +5,79 @@ aide déclaration revenu indépendant 2020: Ces règles calculent les montants demandés dans la déclaration de revenu des indépendants de 2021 sur les revenus 2020. formule: non - remplace: + remplace: règle: entreprise . ACRE par: ACRE +aide déclaration revenu indépendant 2020 . régime d'imposition: oui +aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée: + titre: régime de la déclaration contrôlée + applicable si: entreprise . activité . libérale + non applicable si: + une de ces conditions: + - entreprise . imposition . IS + - entreprise . imposition . IR . micro-fiscal + valeur: oui + description: | + Si vous devez déclarer des bénéfices non commerciaux (BNC), vous pouvez être soumis au régime de la déclaration contrôlée ou au régime micro-BNC ; cela dépend du montant de vos bénéfices. + + Le régime de la déclaration contrôlée est le régime obligatoire si les bénéfices non commerciaux à déclarer sont supérieurs à 70 000 € HT. Si les bénéfices sont inférieurs, les professionnels dépendent du régime micro-BNC mais peuvent tout de même opter pour le régime de la déclaration contrôlée. + + Dans le cas de la déclaration contrôlée, le contribuable est imposé sur les bénéfices effectivement réalisés. Dans le cas du régime micro-BNC, un abattement forfaitaire de 34 % est appliqué automatiquement après déclaration du chiffre d’affaires. + +aide déclaration revenu indépendant 2020 . régime d'imposition . réel: + description: | + Le régime simplifié d'imposition (RSI) et le régime réel normal (RN) s'appliquent aux bénéfices réalisés au cours de l'exercice et à la taxe sur la valeur ajoutée (TVA). + + C'est principalement le détail demandé lors du remplissage des obligations comptables qui différencie ces 2 régimes d'imposition. + + question: Quel est le régime d'imposition applicable à l'exercice ? + non applicable si: + une de ces conditions: + - entreprise . imposition . IR . micro-fiscal + - déclaration contrôlée + formule: + une possibilité: + choix obligatoire: oui + possibilités: + - simplifié + - normal + +aide déclaration revenu indépendant 2020 . régime d'imposition . réel . simplifié: + description: | + Les entreprises soumises au régime d'imposition réel simplifié doivent tenir une comptabilité classique : un bilan, un compte de résultat et des annexes. Des dispositions particulières s’appliquent pour alléger vos obligations comptables : + + - le livre journal n’enregistre journellement que les recettes encaissées et les dépenses payées + - les créances et les dettes sont constatées à la clôture de l’exercice + - le bilan fourni à l’administration fiscale est un bilan simplifié + + titre: régime réel simplifié + acronyme: RSI + valeur: réel = 'simplifié' + +aide déclaration revenu indépendant 2020 . régime d'imposition . réel . normal: + description: | + La comptabilité de l’entreprise soumise au régime réel normal doit être plus précise que pour le régime réel simplifié : + + - Elle doit s'appuyer sur des pièces justificatives. + - L'entreprise est obligée de procéder à l'enregistrement comptable chronologique des mouvements affectant son patrimoine. + - L'entreprise doit procéder à un inventaire au moins une fois tous les 12 mois. + - L'entreprise doit établir des comptes annuels comprenant un bilan, un compte de résultat et des annexes. + - L'entreprise doit tenir un livre journal et un grand livre. + + titre: régime réel normal + acronyme: RN + valeur: réel = 'normal' aide déclaration revenu indépendant 2020 . nature de l'activité: - remplace: entreprise . activité + remplace: + - entreprise . activité + - règle: entreprise . activité . libérale + par: libérale + - règle: entreprise . activité . artisanale + par: artisanale + - règle: entreprise . activité . commerciale ou industrielle + par: commerciale ou industrielle question: Quelle est la nature de votre activité ? formule: une possibilité: @@ -30,7 +96,7 @@ aide déclaration revenu indépendant 2020 . ACRE: description: >- L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une exonération partielle de charges sociales, dite exonération de début - d'activité pendant 12 mois. + d'activité pendant 12 mois. Elle est automatique pour les sociétés et les entreprises individuelles @@ -55,7 +121,7 @@ aide déclaration revenu indépendant 2020 . ACRE: - Si le revenu est inférieur à 75% du PASS l’exonération est totale. - - Si le revenu est compris entre 75% et 100% du PASS l’exonération est dégressive. + - Si le revenu est compris entre 75% et 100% du PASS l’exonération est dégressive. - Si le revenu est supérieur à 100% du PASS l’exonération est nulle. @@ -65,7 +131,6 @@ aide déclaration revenu indépendant 2020 . ACRE: aide déclaration revenu indépendant 2020 . nature de l'activité . libérale: rend non applicable: dirigeant . indépendant . PL . CIPAV - remplace: entreprise . activité . libérale formule: nature de l'activité = 'libérale' titre: Libérale rattachée au régime général description: | @@ -92,7 +157,6 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . commerciale aide déclaration revenu indépendant 2020 . nature de l'activité . artisanale: formule: nature de l'activité = 'artisanale' - remplace: entreprise . activité . artisanale description: | C'est une activité de service, de production, de transformation, ou de réparation exercée par un professionnel qualifié, et qui nécessite des compétences et un savoir-faire spécifiques. @@ -124,9 +188,9 @@ aide déclaration revenu indépendant 2020 . période: aide déclaration revenu indépendant 2020 . réduction covid: titre: Réduction de cotisation Covid - remplace: + remplace: - règle: dirigeant . indépendant . cotisations et contributions . cotisations - par: + par: valeur: dirigeant . indépendant . cotisations et contributions . cotisations abattement: réduction covid . part cotisations - règle: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible @@ -142,7 +206,7 @@ aide déclaration revenu indépendant 2020 . réduction covid: - un premier dispositif de réduction des cotisations et contributions sociales prévu par la 3ème loi de finance rectificative (LFR3) pour 2020(1) dans le cadre de la première période d’état d’urgence sanitaire du printemps 2020, - un second dispositif de réduction prévu par la loi de financement de la sécurité sociale (LFSS) pour 2021 (2) dans le cadre de la seconde période d’état d’urgence sanitaire de l’automne 2020. - + références: (1) Décret n° 2020-1103 du 1er septembre 2020: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000042297236/ (2) Décret 2021-75 du 27 janvier 2021: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000043070140 @@ -159,7 +223,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . montant: - automne 2020 aide déclaration revenu indépendant 2020 . réduction covid . conjoint collaborateur: applicable si: dirigeant . indépendant . conjoint collaborateur - remplace: + remplace: règle: dirigeant . indépendant . conjoint collaborateur . cotisations par: valeur: dirigeant . indépendant . conjoint collaborateur . cotisations @@ -172,7 +236,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . total: somme: - montant - conjoint collaborateur - + aide déclaration revenu indépendant 2020 . réduction covid . part cotisations: @@ -187,7 +251,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . pourcentage coti unité: '%' valeur: dirigeant . indépendant . cotisations et contributions . cotisations / (dirigeant . indépendant . cotisations et contributions . cotisations + dirigeant . indépendant . cotisations et contributions . CSG et CRDS) - + aide déclaration revenu indépendant 2020 . réduction covid . part CSG: titre: Part réduction Covid sur CSG @@ -195,22 +259,22 @@ aide déclaration revenu indépendant 2020 . réduction covid . part CSG: aide déclaration revenu indépendant 2020 . réduction covid . part CSG . déductible: titre: Part réduction Covid sur CSG/CRDS déductible - produit: + produit: assiette: part CSG taux: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible . taux / taux CSG arrondi: oui - + aide déclaration revenu indépendant 2020 . réduction covid . part CSG . non déductible: titre: Part réduction Covid sur CSG/CRDS non déductible valeur: part CSG - part CSG . déductible -aide déclaration revenu indépendant 2020 . réduction covid . taux CSG: +aide déclaration revenu indépendant 2020 . réduction covid . taux CSG: unité: '%' - valeur: - somme: - - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible . taux + valeur: + somme: + - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible . taux - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible . taux - + aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020: applicable si: éligible aide printemps 2020 formule: @@ -230,7 +294,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi # apparaît que les métiers concernés (médecins, avocats...) sont incompatibles # avec les secteurs d'activités concernés par l'aide (hôtels, restaurants...) description: | - Les conditions d’éligibilité aux aides « Covid » dépendent du secteur d’activité + Les conditions d’éligibilité aux aides « Covid » dépendent du secteur d’activité dont relève l’activité principale. Les hôtels, restaurants, bars, etc. sont dans @@ -265,7 +329,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis: titre: Secteur dit S1 bis - description: | + description: | Secteurs dont l’activité dépend de celle des secteurs 1 et qui ont subi une très forte baisse de leur chiffre d’affaires. aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2: @@ -283,9 +347,9 @@ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide p ### Secteur S1 Activité principale exercée relevant des secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel (Voir liste détaillée des activités relevant du secteur S1). - + Votre activité doit avoir débuté avant le 1er juillet 2020. - + Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020. ### Secteur S1 bis @@ -338,8 +402,8 @@ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide a Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction d’accueil du public. ### Secteur dit S1 bis - Activité principale exercée dépendant de celles du secteur S1 - + Activité principale exercée dépendant de celles du secteur S1 + Mois concerné | Conditions d'éligibilité --------------|-------------------------- Octobre 2020 | Avoir fait l’objet d’une mesure d’interdiction d’accueil du public **OU** Avoir subi une forte baisse du chiffre d’affaires mensuel(ca) @@ -358,7 +422,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . éligible aide a Activité principale exercée dans un secteur autre que S1 et S1 bis - **Mois concerné** : novembre 2020, février 2021, mars 2021 - - **Conditions d'éligibilité**: Avoir fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de l’activité, en application du décret n° 2020-1310 du 29 octobre 2020 + - **Conditions d'éligibilité**: Avoir fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de l’activité, en application du décret n° 2020-1310 du 29 octobre 2020 Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 30 octobre 2020. @@ -372,7 +436,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois arrondi: oui aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 et S1bis: - applicable si: + applicable si: toutes ces conditions: - éligible aide automne 2020 - une de ces conditions: @@ -386,7 +450,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois plafond: 6 mois éligibles aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2: - applicable si: + applicable si: toutes ces conditions: - éligible aide automne 2020 - secteur d'activité = 'S2' @@ -396,98 +460,214 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois plafond: 3 mois éligibles -aide déclaration revenu indépendant 2020 . revenu net fiscal: - applicable si: entreprise . imposition . IR - titre: revenu net fiscal - résumé: '[A]' - description: Résultat avant déduction des charges sociales et exonérations fiscales - valeur: dirigeant . rémunération . totale - - - -aide déclaration revenu indépendant 2020 . rémunération nette dirigeant: - applicable si: entreprise . imposition . IS - résumé: '[X]' - description: | - La rémunération nette du dirigeant déductible du résultat pour l'impôt sur le revenu (charges sociales non incluse). - - À reporter dans : - - **régime réel simplifié :** la rubrique 250 du formulaire 2033-B-SD - - **régime réel normal :** la rubrique FZ du formulaire 2052-SD - - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD - valeur: dirigeant . rémunération . nette - -aide déclaration revenu indépendant 2020 . cotisations obligatoires: - titre: Cotisations sociales obligatoires déductibles - résumé: '[C]' - description: | - À reporter dans : - - **dans tous les cas :** la rubrique DSCA/DSCB du formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) - - **régime réel simplifié (IR uniquement) :** la rubrique 326 du formulaire 2033-D-SD - - **régime réel normal (IR uniquement):** la rubrique A5 du formulaire 2053-SD - - **déclaration contrôlée (IR uniquement):** la rubrique BT du formulaire 2035-A-SD +aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles: unité: €/an - somme: + somme: - dirigeant . indépendant . cotisations et contributions . cotisations - dirigeant . indépendant . conjoint collaborateur . cotisations références: - Notice impots.gouv.fr: https://www.impots.gouv.fr/portail/www2/fichiers/documentation/brochure/ir_2021/pdf_som/11-bis-decla_fusion_fisc_185a195.pdf +aide déclaration revenu indépendant 2020 . total charges sociales déductibles: + titre: charges sociales obligatoires déductibles fiscalement + valeur: dirigeant . rémunération . cotisations + abattement: + applicable si: entreprise . imposition . IR + valeur: dirigeant . indépendant . cotisations et contributions . non déductibles + +aide déclaration revenu indépendant 2020 . rémunération déductible: + variations: + - si: entreprise . imposition . IS + alors: dirigeant . rémunération . nette + - sinon: 0€ + -aide déclaration revenu indépendant 2020 . CSG déductible: - titre: CSG déductible - résumé: '[B]' +aide déclaration revenu indépendant 2020 . formulaire 2033: + titre: formulaire 2033-SD + applicable si: régime d'imposition . réel . simplifié + valeur: oui + résumé: Liasse fiscale du régime réel simplifié + référence: + formulaire: https://www.impots.gouv.fr/portail/files/formulaires/2033-sd/2021/2033-sd_3330.pdf + notice: https://www.impots.gouv.fr/portail/files/formulaires/2033-sd/2021/2033-sd_3498.pdf + +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 250: + résumé: Rémunérations du personnel (+) + valeur: rémunération déductible + description: | + Si votre entreprise emploie des salarié, ajoutez à ce montant le total des rémunération brute versée durant l'exercice + +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 252: + résumé: Charges sociales (+) + valeur: total charges sociales déductibles + description: | + Si votre entreprise emploie des salarié, ajoutez à ce montant le total des cotisations patronales payées durant l'exercice + +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 381: applicable si: entreprise . imposition . IR - description: "Montant de la CSG déductible à l'impôt sur le revenu" + résumé: Primes et cotisations complémentaires facultatives + valeur: rubrique 325 + description: Ajoutez le montant des cotisations facultatives aux nouveaux plans d'épargne retraite si nécessaire (327) + +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 325: + applicable si: entreprise . imposition . IR + résumé: Dont montant déductible des cotisations facultatives versées en application du I de l'article 154 bis du CGI dont cotisations facultatives Madelin (I de l’art. 154 bis du CGI) + valeur: dirigeant . indépendant . contrats madelin . part déductible fiscalement + +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 380: + applicable si: entreprise . imposition . IR + résumé: Cotisations personnelles obligatoires de l'exploitant + valeur: total charges sociales déductibles + +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 326: + applicable si: entreprise . imposition . IR + résumé: Dont montant déductible des cotisations sociales obligatoires hors CSG-CRDS + valeur: cotisations obligatoires déductibles + +aide déclaration revenu indépendant 2020 . formulaire 2050: + titre: formulaire 2052-SD et 2053-SD + applicable si: régime d'imposition . réel . normal + valeur: oui + résumé: Liasse fiscale du régime réel normal + référence: + formulaire: https://www.impots.gouv.fr/portail/files/formulaires/2050-liasse/2021/2050-liasse_3391.pdf + +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FY: + résumé: Salaires et traitements (+) + valeur: rémunération déductible + description: | + Si votre entreprise emploie des salarié, ajoutez à ce montant le total des rémunérations et indemnités versée durant l'exercice + +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FZ: + résumé: Charges sociales (+) + valeur: rubrique A2 + description: | + Si votre entreprise emploie des salarié, ajoutez à ce montant le total des cotisations patronales payées durant l'exercice, ainsi que toutes les autres charges sociales + +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A2: + applicable si: entreprise . imposition . IR + résumé: Cotisations personnelles de l'exploitant (+) + valeur: total charges sociales déductibles + +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A5: + applicable si: entreprise . imposition . IR + résumé: Dont montant des cotisations sociales obligatoires hors CSG/CRDS + valeur: cotisations obligatoires déductibles + +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A6: + applicable si: entreprise . imposition . IR + résumé: Primes et cotisations complémentaires personnelles facultatives (+) + description: Ajoutez les sommes versées sur les nouveaux plans d'épargne complémentaire (A8) + valeur: rubrique A7 + +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A7: + applicable si: entreprise . imposition . IR + résumé: Dont cotisations facultatives Madelin + valeur: dirigeant . indépendant . contrats madelin . part déductible fiscalement + +aide déclaration revenu indépendant 2020 . formulaire 2035: + titre: formulaire 2035-A-SD + applicable si: régime d'imposition . déclaration contrôlée + valeur: oui + résumé: Liasse fiscale du régime de la déclaration contrôlée + référence: + formulaire: https://www.impots.gouv.fr/portail/formulaire/2035-sd/revenus-non-commerciaux-et-assimiles-regime-de-la-declaration-controlee + +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BS: + résumé: Autres impôts (+) + description: Contribution à la formation professionnelle de l'exploitant et de son conjoint, à ajouter aux autres impôts existants. + valeur: dirigeant . indépendant . cotisations et contributions . formation professionnelle + +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BV: + résumé: Contribution sociale généralisée déductible valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible -aide déclaration revenu indépendant 2020 . cotisations non déductible: - applicable si: entreprise . imposition . IS - titre: Cotisations non déductible - résumé: '[Y]' - description: "Montant des cotisations non déductible à l'impôt sur le revenu" - valeur: dirigeant . indépendant . cotisations et contributions . non déductibles +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BK: + résumé: Charges sociales personnelles (+) + description: La rubrique BU n'est pas prise en compte ici. Il faut l'ajouter à ce montant si elle est non nulle. + valeur: total charges sociales déductibles + abattement: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible + +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BT: + résumé: Dont obligatoires + valeur: cotisations obligatoires déductibles + +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BZ: + résumé: Dont cotisations facultatives Madelin + valeur: dirigeant . indépendant . contrats madelin . part déductible fiscalement + +aide déclaration revenu indépendant 2020 . formulaire 2042: + valeur: oui + résumé: Déclaration des revenus + référence: + formulaire: https://www.impots.gouv.fr/portail/formulaire/2042/declaration-des-revenus + notice fusion déclaration sociale/fiscale: https://www.impots.gouv.fr/portail/www2/fichiers/documentation/brochure/ir_2021/pdf_som/11-bis-decla_fusion_fisc_185a195.pdf + +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique 1GB: + titre: rubrique 1GB / 1HB + applicable si: entreprise . imposition . IS + résumé: Traitements et salaires (+) + valeur: dirigeant . rémunération . imposable + description: A ajouter à vos éventuels revenus salariés -aide déclaration revenu indépendant 2020 . CFP: - résumé: '[D]' - applicable si: entreprise . imposition . IR - description: Contribution à la formation professionnelle - valeur: dirigeant . indépendant . cotisations et contributions . formation professionnelle -aide déclaration revenu indépendant 2020 . total charges sociales déductibles IR: - applicable si: entreprise . imposition . IR - titre: charges sociales obligatoires déductibles fiscalement - résumé: '[B + C + D]' - somme: - - CSG déductible - - cotisations obligatoires - - CFP - description: | - À reporter dans : - - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD - - **régime réel normal :** la rubrique FY du formulaire 2052-SD - - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSCA: + titre: rubrique DSCA / DSCB + résumé: Cotisations sociales obligatoires + description: Rubrique DSCA/DSCB du formulaire de donnée complémentaire à la déclaration de revenus des indépendant + valeur: cotisations obligatoires déductibles + références: + notice: https://www.impots.gouv.fr/portail/www2/fichiers/documentation/brochure/ir_2021/pdf_som/11-bis-decla_fusion_fisc_185a195.pdf -aide déclaration revenu indépendant 2020 . total charges sociales déductibles IS: - applicable si: entreprise . imposition . IS - titre: charges sociales du dirigeant (déductibles de l'impôt sur les société) - valeur: dirigeant . indépendant . cotisations et contributions - description: | - À reporter dans : - - **régime réel simplifié** : la rubrique 252 du formulaire 2035-B-SD - - **régime réel normal** : la rubrique FY du formulaire 2052-SD - - +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSEA: + titre: rubrique DSEA / DSEB + description: Ajoutez les sommes versées sur les nouveaux plans d'épargne complémentaire + résumé: Cotisations facultatives (+) + formule: dirigeant . indépendant . contrats madelin . part déductible fiscalement -aide déclaration revenu indépendant 2020 . assiette sociale: - résumé: '[A - (B + C + D)]' - applicable si: entreprise . imposition . IR - description: Assiette utilisée pour le calcul des cotisations sociales +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSIA: + titre: rubrique DSIA / DSIB + résumé: Débit de tabac + formule: dirigeant . indépendant . cotisations et contributions . déduction tabac + +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSLA: + titre: rubrique DSLA / DSLB + résumé: Revenus étrangers imposables mais exonérés de CSG-CRDS + formule: dirigeant . indépendant . revenus étrangers . montant + +aide déclaration revenu indépendant 2020 . informations : oui +aide déclaration revenu indépendant 2020 . informations . réduction Covid: + description: La réduction de cotisation applicable dans le cas du dispositif Covid + valeur: réduction covid . total + + +aide déclaration revenu indépendant 2020 . informations . rémunération totale: + titre: Total rémunération dirigeant + résumé: '[A]' + description: La rémunération "superbrute" du dirigeant, incluant toutes les cotisations et contributions sociales. + valeur: dirigeant . rémunération . totale + +aide déclaration revenu indépendant 2020 . informations . cotisations déductibles: + résumé: '[C1]' + description: "Cotisations et contributions sociales déductibles pour le calcul de l'assiette sociale" + somme: + - cotisations obligatoires déductibles + - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible + - dirigeant . indépendant . cotisations et contributions . formation professionnelle + +aide déclaration revenu indépendant 2020 . informations . cotisations non déductibles: + résumé: '[C2]' + description: Cotisations et contributions sociales non déductibles pour le calcul de l'assiette sociale + somme: + - dirigeant . indépendant . contrats madelin . montant + - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible + +aide déclaration revenu indépendant 2020 . informations . assiette sociale: + résumé: '[A - C1]' + description: Assiette utilisée pour le calcul des cotisations sociales. valeur: dirigeant . indépendant . assiette des cotisations -aide déclaration revenu indépendant 2020 . traitements et salaires: - applicable si: entreprise . imposition . IS - description: | - À reporter dans la case **1GB/1HB** de la déclaration n°2042 - résumé: '[X + Y]' - valeur: dirigeant . rémunération . imposable +aide déclaration revenu indépendant 2020 . informations . rémunération nette: + résumé: '[A - C1 - C2]' + description: Le revenu net du dirigeant avant impôt sur le revenu. C'est la rémunération effectivement versée. + valeur: dirigeant . rémunération . nette + diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 09de5ad66..54ba1c6f4 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -236,7 +236,7 @@ entreprise . résultat fiscal: entreprise . imposition: - question: À quel régime d'imposition l'entreprise est-elle soumise ? + question: Comment l'entreprise est-elle imposée ? description: | Le créateur d'entreprise peut opter pour l'un des deux régimes d'imposition des bénéfices de son activité : - l'impôt sur le revenu, où les bénéfices sont déclarés sur la déclaration de revenus personnelle et imposés au barème progressif diff --git a/mon-entreprise/source/components/EngineValue.tsx b/mon-entreprise/source/components/EngineValue.tsx index 78bfd344f..04c7baba6 100644 --- a/mon-entreprise/source/components/EngineValue.tsx +++ b/mon-entreprise/source/components/EngineValue.tsx @@ -1,23 +1,15 @@ -<<<<<<< HEAD import { DottedName } from 'modele-social' import Engine, { ASTNode, formatValue, - - isNotYetDefined, PublicodesExpression, - - UNSAFE_isNotApplicable + isNotYetDefined, + PublicodesExpression, + UNSAFE_isNotApplicable, } from 'publicodes' import React from 'react' import { useTranslation } from 'react-i18next' import RuleLink from './RuleLink' import { useEngine } from './utils/EngineContext' -======= -import { DottedName } from 'modele-social' -import Engine, { formatValue, PublicodesExpression } from 'publicodes' -import React, { useContext } from 'react' -import { useTranslation } from 'react-i18next' ->>>>>>> e9c1f6e8 (Export le type PublicodeExpression$) export type ValueProps = { expression: PublicodesExpression diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml index 558d0c42f..9ce8d1620 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml @@ -1,9 +1,16 @@ objectifs: - - aide déclaration revenu indépendant 2020 . cotisations obligatoires - - aide déclaration revenu indépendant 2020 . total charges sociales déductibles IR + - aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles + - aide déclaration revenu indépendant 2020 . total charges sociales déductibles + - dirigeant . rémunération . totale + - dirigeant . rémunération . nette + - aide déclaration revenu indépendant 2020 . formulaire 2033 + - aide déclaration revenu indépendant 2020 . formulaire 2050 + - aide déclaration revenu indépendant 2020 . formulaire 2042 + - aide déclaration revenu indépendant 2020 . formulaire 2035 situation: dirigeant: "'indépendant'" aide déclaration revenu indépendant 2020: oui dirigeant . indépendant . PL . CIPAV: non # TODO En attendant la transitivité des remplacements + impôt: non unité par défaut: '€/an' diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 8e5db7ffe..1026e9c5f 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -1,17 +1,19 @@ import { updateSituation } from 'Actions/actions' import Aide from 'Components/conversation/Aide' +import { Explicable } from 'Components/conversation/Explicable' import RuleInput from 'Components/conversation/RuleInput' -import Value, { Condition, WhenAlreadyDefined } from 'Components/EngineValue' +import Value, { Condition } from 'Components/EngineValue' import PageHeader from 'Components/PageHeader' import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' import RuleLink from 'Components/RuleLink' import 'Components/TargetSelection.css' import Animate from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' -import { useEngine } from 'Components/utils/EngineContext' +import { EngineContext, useEngine } from 'Components/utils/EngineContext' import { Markdown } from 'Components/utils/markdown' import useSimulationConfig from 'Components/utils/useSimulationConfig' -import { useCallback } from 'react' +import { DottedName } from 'modele-social' +import { useCallback, useContext, useMemo } from 'react' import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -39,10 +41,10 @@ export default function AideDéclarationIndépendant() { }, [dispatch] ) - const displayForm = + const displayForm = !!( situation['dirigeant . rémunération . totale'] || situation['dirigeant . rémunération . nette'] - + ) return ( <> @@ -60,17 +62,11 @@ export default function AideDéclarationIndépendant() { -

    - Cet outil vous concerne si vous êtes dans tous les cas suivants : -

    +

    Cet outil vous concerne si vous êtes dans le cas suivant :

    • vous cotisez au régime général des travailleurs indépendants
    • -
    • - votre entreprise est au régime réel d'imposition et en - comptabilité d'engagement -

    Il ne vous concerne pas si vous êtes dans un des cas suivants : @@ -81,62 +77,62 @@ export default function AideDéclarationIndépendant() { retraite des professions libérales
  • vous avez opté pour le régime micro-fiscal
  • -
  • - vous êtes dans le cas d'une entreprise avec plusieurs associés -
  • votre entreprise est domiciliée dans les DOM
  • +
  • + vous vous versez des dividendes soumis à cotisations sociales +
  • {!situation['dirigeant . rémunération . totale'] && ( )} -

    Imposition et comptabilité

    +

    Imposition

    Ces quelques questions permettent de déterminer le type de déclaration à remplir, ainsi que les modalités de calcul des cotisations social.

    - - - {situation['entreprise . imposition'] && ( - <> - -

    - Quel est votre résultat fiscal en 2020 ?
    - - Charges sociales et exonérations fiscales non incluses{' '} - - -

    -

    - Le résultat fiscal correspond aux produits moins les charges. Il - peut être positif (bénéfice) ou négatif (déficit). -

    - - - -
    - -

    - Quel est le montant net de votre rémunération en 2020 ? -
    - Sans tenir compte des charges sociales -

    - - - -
    - - )} + + + {situation['entreprise . imposition'] !== undefined && ( + + +

    + Quel est votre résultat fiscal en 2020 ?
    + + Charges sociales et exonérations fiscales non incluses{' '} + + +

    +

    + Le résultat fiscal correspond aux produits moins les charges. Il + peut être positif (bénéfice) ou négatif (déficit). +

    + + + +
    + +

    + Quel est le montant net de votre rémunération en 2020 ? +
    + Sans tenir compte des charges sociales +

    + + + +
    +
    + )} {displayForm ? ( @@ -165,72 +161,67 @@ export default function AideDéclarationIndépendant() { dottedName="entreprise . date de création" showSuggestions={false} /> - {situation['entreprise . date de création'] && ( - <> - - - Cette aide à la déclaration concerne uniquement les - entreprises déjà en activité en 2020 - - - - + + + Cette aide à la déclaration concerne uniquement les + entreprises déjà en activité en 2020 + + + + {/* PLNR */} + + + - {/* PLNR */} - - - - +

    + Situation personnelle +

    + + + - +

    + Exonérations +

    + + + -

    - Situation personnelle -

    - - - + + -

    - Exonérations -

    - - - - - - - - - -

    - International -

    - - -
    -
    - - )} +

    + International +

    + + - - + + + - + )} @@ -240,9 +231,13 @@ export default function AideDéclarationIndépendant() { function Results() { const engine = useEngine() - + const informations = (Object.keys(engine.getParsedRules()) as DottedName[]) + .filter((s) => + s.startsWith('aide déclaration revenu indépendant 2020 . informations . ') + ) + .map((dottedName) => engine.getRule(dottedName)) return ( -
    {emoji('📄')}{' '} - Montants à reporter dans votre déclaration de revenus + Vos déclarations fiscales

    - L'ancienne Déclaration Sociale des Indépendant (DSI) qui était - précédemment à effectuer sur le site net-entreprises.fr est désormais - intégrée à la déclaration fiscale des revenus (déclaration 2042) sur - impots.gouv.fr.{' '} - - En savoir plus - -

    -

    - Vous pouvez reporter les montants suivants dans votre déclaration, - calculés à partir des informations saisies. + Important : les montants affichés ici concernent uniquement le calcul + des cotisations de l'exploitant (et du conjoint collaborateur si + présent). Les rubriques avec le symbole (+) signifient qu'il vous + faudra peut-être ajouter d'autres éléments au montant affiché pour une + déclaration correcte.{' '}

    +

    En cas de doute, référez-vous à votre expert comptable.

    {([ - 'aide déclaration revenu indépendant 2020 . total charges sociales déductibles IS', - 'aide déclaration revenu indépendant 2020 . rémunération nette dirigeant', - 'aide déclaration revenu indépendant 2020 . traitements et salaires', - 'aide déclaration revenu indépendant 2020 . cotisations obligatoires', - 'aide déclaration revenu indépendant 2020 . total charges sociales déductibles IR', - ] as const).map((dottedName) => { - const r = engine.getRule(dottedName) - const evaluation = engine.evaluate(dottedName) - if (evaluation.nodeValue == null || evaluation.nodeValue == false) { - return - } - return ( - -
    -

    - {r.title} {r.rawNode.résumé} -

    -

    - - - - - -

    - {r.rawNode.description && ( -
    - -
    - )} -
    -
    - ) - })} -

    {emoji('ℹ️')} Pour votre information

    -
    - {([ - 'aide déclaration revenu indépendant 2020 . cotisations non déductible', - 'aide déclaration revenu indépendant 2020 . réduction covid . total', - 'aide déclaration revenu indépendant 2020 . revenu net fiscal', - 'aide déclaration revenu indépendant 2020 . CSG déductible', - 'aide déclaration revenu indépendant 2020 . CFP', - 'aide déclaration revenu indépendant 2020 . assiette sociale', - ] as const).map((dottedName) => { - const r = engine.getRule(dottedName) - const evaluation = engine.evaluate(dottedName) - if (evaluation.nodeValue == null || evaluation.nodeValue == false) { - return - } - return ( - + 'aide déclaration revenu indépendant 2020 . formulaire 2035', + 'aide déclaration revenu indépendant 2020 . formulaire 2033', + 'aide déclaration revenu indépendant 2020 . formulaire 2050', + 'aide déclaration revenu indépendant 2020 . formulaire 2042', + ] as const).map((dottedName) => ( + + ))} + +

    {emoji('ℹ️')} Pour votre information

    +
    + {informations.map((r) => ( + +
    -

    - {' '} +

    + +
    {r.rawNode.résumé}

    @@ -365,22 +297,79 @@ function Results() {
    )}

    - - - +

    - ) - })} + + ))}

    -
    +
    + ) +} + +function DeclarationForm({ dottedName }: { dottedName: DottedName }) { + const engine = useContext(EngineContext) + const r = engine.getRule(dottedName) + const rubriques = useMemo( + () => + Object.keys(engine.getParsedRules()).filter((name) => + name.startsWith(dottedName + ' . ') + ), + [engine, dottedName] + ) + return ( + + +
    +

    + {r.title} {r.rawNode.résumé} +

    +
      + {rubriques + .map((dottedName) => engine.getRule(dottedName)) + .map((node) => ( + + +
    • + + {node.rawNode.résumé} + {node.rawNode.description && ( + +
      + +
      +
      + )} +
      +
      + + {node.title} :{' '} + + {' '} + {/* + */} +
    • +
      +
      + ))} +
    +
    +
    +
    ) } From e2fd619ff482f9fa1857939743681fdf5ba9832d Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 12 May 2021 18:16:09 +0200 Subject: [PATCH 172/319] =?UTF-8?q?Ajoute=20la=20comptabilit=C3=A9=20de=20?= =?UTF-8?q?tr=C3=A9sorerie=20au=20formulaire=20d'aide=20=C3=A0=20la=20d?= =?UTF-8?q?=C3=A9claration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../déclaration-revenu-indépendant.yaml | 97 +++++++- .../AideDéclarationIndépendant/index.tsx | 219 ++++++++++-------- 2 files changed, 214 insertions(+), 102 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 678aca374..a696b478c 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -9,6 +9,93 @@ aide déclaration revenu indépendant 2020: règle: entreprise . ACRE par: ACRE +aide déclaration revenu indépendant 2020 . comptabilité: + titre: régime de la déclaration contrôlée + question: Quel méthode de gestion de la comptabilité est utilisée pour l'entreprise ? + formule: + une possibilité: + choix obligatoire: oui + possibilités: + - trésorerie + - engagement + +aide déclaration revenu indépendant 2020 . comptabilité . trésorerie: + remplace: + règle: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible + par: CSG non déductible + CRDS + valeur: comptabilité = 'trésorerie' + titre: comptabilité de trésorerie + +aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . total charges sociale: + remplace: + règle: dirigeant . rémunération . cotisations + par: + somme: + - total charges sociale + - dirigeant . indépendant . contrats madelin . montant + unité: €/an + question: Quel est le montant total des cotisations et contributions sociales payées pendant l'exercice ? + description: | + Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre : + + 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html) + 2. Allez dans l'onglet "Document" + 3. Selectionnez "relevé de situation comptable" + 4. Reportez dans ce champs le montant de la colonne "Cotisation", ligne "Année 2020" + +aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG déductible: + question: Quel est le montant total de CSG déductible payé cette année ? + remplace: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible + unité: €/an + description: | + Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre : + + 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html) + 2. Allez dans l'onglet "Document" + 3. Selectionnez "demander une attestation" + 3. Puis, "attestation CSG/CRDS" + 4. Reportez dans ce champs le total de la colonne "Montant déductible CSG" (dernière ligne) + + +aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG non déductible: + question: Quel est le montant total de CSG non déductible payé cette année ? + unité: €/an + description: | + Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre : + + 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html) + 2. Allez dans l'onglet "Document" + 3. Selectionnez "demander une attestation" + 3. Puis, "attestation CSG/CRDS" + 4. Reportez dans ce champs le total de la colonne "Montant non déductible : CSG" (dernière ligne) + +aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: + question: Quel est le montant total de CRDS payé cette année ? + unité: €/an + description: | + Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre : + + 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html) + 2. Allez dans l'onglet "Document" + 3. Selectionnez "demander une attestation" + 3. Puis, "attestation CSG/CRDS" + 4. Reportez dans ce champs le total de la colonne "Montant non déductible : CRDS" (dernière ligne) + +aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . cotisations obligatoires déductibles: + remplace: cotisations obligatoires déductibles + unité: €/an + valeur: total charges sociale + abattement: + somme: + - CSG non déductible + - CRDS + - dirigeant . indépendant . cotisations et contributions . formation professionnelle + +aide déclaration revenu indépendant 2020 . comptabilité . engagement: + valeur: comptabilité = 'engagement' + titre: comptabilité d'engagement + + aide déclaration revenu indépendant 2020 . régime d'imposition: oui aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée: titre: régime de la déclaration contrôlée @@ -517,6 +604,7 @@ aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 380: applicable si: entreprise . imposition . IR résumé: Cotisations personnelles obligatoires de l'exploitant valeur: total charges sociales déductibles + abattement: dirigeant . indépendant . contrats madelin . part déductible fiscalement aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 326: applicable si: entreprise . imposition . IR @@ -539,7 +627,7 @@ aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FY: aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FZ: résumé: Charges sociales (+) - valeur: rubrique A2 + valeur: total charges sociales déductibles description: | Si votre entreprise emploie des salarié, ajoutez à ce montant le total des cotisations patronales payées durant l'exercice, ainsi que toutes les autres charges sociales @@ -605,9 +693,8 @@ aide déclaration revenu indépendant 2020 . formulaire 2042: aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique 1GB: titre: rubrique 1GB / 1HB applicable si: entreprise . imposition . IS - résumé: Traitements et salaires (+) + résumé: Traitements et salaires valeur: dirigeant . rémunération . imposable - description: A ajouter à vos éventuels revenus salariés aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSCA: @@ -634,7 +721,9 @@ aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSLA: résumé: Revenus étrangers imposables mais exonérés de CSG-CRDS formule: dirigeant . indépendant . revenus étrangers . montant -aide déclaration revenu indépendant 2020 . informations : oui +aide déclaration revenu indépendant 2020 . informations : + applicable si: comptabilité . engagement + valeur: oui aide déclaration revenu indépendant 2020 . informations . réduction Covid: description: La réduction de cotisation applicable dans le cas du dispositif Covid valeur: réduction covid . total diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 1026e9c5f..a3851f83a 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -94,6 +94,7 @@ export default function AideDéclarationIndépendant() {

    + {situation['entreprise . imposition'] !== undefined && ( @@ -143,74 +144,95 @@ export default function AideDéclarationIndépendant() { <> - -

    Entreprise et activité

    -
    -
    - {!company && ( -

    - - Facultatif : Vous pouvez renseigner votre - entreprise pour pré-remplir le formulaire - -

    - )} - -
    - - - - Cette aide à la déclaration concerne uniquement les - entreprises déjà en activité en 2020 - + + +

    Entreprise et activité

    +
    +
    + {!company && ( +

    + + Facultatif : Vous pouvez renseigner + votre entreprise pour pré-remplir le formulaire + +

    + )} + +
    + + + + Cette aide à la déclaration concerne uniquement les + entreprises déjà en activité en 2020 + + + + {/* PLNR */} + + + + +

    + Situation personnelle +

    + + + + +

    + Exonérations +

    + + + + + + +

    + International +

    + +
    - - {/* PLNR */} - - - + + + + -

    - Situation personnelle -

    - - - + -

    - Exonérations -

    - - - + {/* We can't use a subsection here cause revenu étrangers is not missing when CSG is replaced */} +

    + Revenus étranger +

    + + + + +
    - - - -

    - International -

    - - + + +
    - + ( ))} + +

    {emoji('ℹ️')} Pour votre information

    +
    + {informations.map((r) => ( + + +
    +

    + +
    + {r.rawNode.résumé} +

    -

    {emoji('ℹ️')} Pour votre information

    -
    - {informations.map((r) => ( - - -
    -

    - -
    - {r.rawNode.résumé} -

    - - {r.rawNode.description && ( -
    - -
    - )} -

    - -

    -
    -
    -
    - ))} -
    + {r.rawNode.description && ( +
    + +
    + )} +

    + +

    +
    +
    +
    + ))} +
    +
    ) From 4706822fca130cc241fa4420960b64c4c806d90e Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 17 May 2021 10:06:55 +0200 Subject: [PATCH 173/319] =?UTF-8?q?:green=5Fheart:=20r=C3=A9pare=20les=20t?= =?UTF-8?q?ests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/components/PaySlipSections.tsx | 6 +- .../components/conversation/Conversation.tsx | 5 +- .../components/conversation/RuleInput.tsx | 24 +- mon-entreprise/source/locales/rules-en.yaml | 599 +++++++++++++++--- mon-entreprise/source/locales/ui-en.yaml | 1 + .../__snapshots__/simulations.jest.js.snap | 199 +++--- .../test/regressions/simulations.jest.js | 3 + 7 files changed, 639 insertions(+), 198 deletions(-) diff --git a/mon-entreprise/source/components/PaySlipSections.tsx b/mon-entreprise/source/components/PaySlipSections.tsx index b0b1d82f6..0b15baccd 100644 --- a/mon-entreprise/source/components/PaySlipSections.tsx +++ b/mon-entreprise/source/components/PaySlipSections.tsx @@ -1,7 +1,7 @@ import Value, { Condition, ValueProps } from 'Components/EngineValue' import RuleLink from 'Components/RuleLink' import { DottedName } from 'modele-social' -import { isNotYetDefined, isNotApplicable } from 'publicodes' +import { isNotApplicable, isNotYetDefined } from 'publicodes' import { Trans } from 'react-i18next' import { useEngine } from './utils/EngineContext' @@ -91,7 +91,7 @@ export function Line({ return null return ( - <> + 0`}> - + ) } diff --git a/mon-entreprise/source/components/conversation/Conversation.tsx b/mon-entreprise/source/components/conversation/Conversation.tsx index 9adc4f9b9..8a716aa69 100644 --- a/mon-entreprise/source/components/conversation/Conversation.tsx +++ b/mon-entreprise/source/components/conversation/Conversation.tsx @@ -1,10 +1,11 @@ import { goToQuestion, stepAction, updateSituation } from 'Actions/actions' -import RuleInput, { InputProps } from 'Components/conversation/RuleInput' +import RuleInput from 'Components/conversation/RuleInput' import Notifications from 'Components/Notifications' import QuickLinks from 'Components/QuickLinks' import * as Animate from 'Components/ui/animate' import { EngineContext } from 'Components/utils/EngineContext' import { useNextQuestions } from 'Components/utils/useNextQuestion' +import { PublicodesExpression } from 'publicodes' import React, { useContext, useEffect } from 'react' import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' @@ -43,7 +44,7 @@ export default function Conversation({ customEndMessages }: ConversationProps) { dispatch(stepAction(currentQuestion, source)) } - const onChange: InputProps['onChange'] = (value) => { + const onChange = (value: PublicodesExpression | undefined) => { dispatch(updateSituation(currentQuestion, value)) } diff --git a/mon-entreprise/source/components/conversation/RuleInput.tsx b/mon-entreprise/source/components/conversation/RuleInput.tsx index 017f7ee0b..a27e45923 100644 --- a/mon-entreprise/source/components/conversation/RuleInput.tsx +++ b/mon-entreprise/source/components/conversation/RuleInput.tsx @@ -7,7 +7,12 @@ import PercentageField from 'Components/PercentageField' import ToggleSwitch from 'Components/ui/ToggleSwitch' import { EngineContext } from 'Components/utils/EngineContext' import { DottedName } from 'modele-social' -import Engine, { ASTNode, formatValue, reduceAST } from 'publicodes' +import Engine, { + ASTNode, + formatValue, + PublicodesExpression, + reduceAST, +} from 'publicodes' import { EvaluatedNode, Evaluation } from 'publicodes/dist/types/AST/types' import { RuleNode } from 'publicodes/dist/types/rule' import React, { useContext } from 'react' @@ -25,7 +30,7 @@ type Props = Omit< autoFocus?: boolean dottedName: Name onChange: ( - value: Parameters['evaluate']>[0] | undefined, + value: PublicodesExpression | undefined, dottedName: DottedName ) => void // TODO: It would be preferable to replace this "showSuggestions" parameter by @@ -42,11 +47,15 @@ type Props = Omit< modifiers?: Record } -export type InputProps = Props & +export type InputProps = Omit< + Props, + 'onChange' +> & Pick & { question: RuleNode['rawNode']['question'] value: EvaluatedNode['nodeValue'] missing: boolean + onChange: (value: PublicodesExpression | undefined) => void } export const binaryQuestion = [ @@ -78,7 +87,8 @@ export default function RuleInput({ dottedName, value, missing: !showDefaultDateValue && !!evaluation.missingVariables[dottedName], - onChange: (value) => onChange(value, dottedName), + onChange: (value: PublicodesExpression | undefined) => + onChange(value, dottedName), title: rule.title, id: props.id ?? dottedName, question: rule.rawNode.question, @@ -126,7 +136,7 @@ export default function RuleInput({ ) => - onChange(evt.target.checked ? 'oui' : 'non') + commonProps.onChange(evt.target.checked ? 'oui' : 'non') } /> ) : ( @@ -159,7 +169,9 @@ export default function RuleInput({ name={dottedName} {...commonProps} onSubmit={() => {}} - onChange={(evt) => onChange({ valeur: evt.target.value, unité })} + onChange={(evt) => + commonProps.onChange({ valeur: evt.target.value, unité }) + } value={value as number} /> diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 9ecab3f27..0f2fd02e4 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -18,35 +18,35 @@ aide déclaration revenu indépendant 2020: titre.fr: aide déclaration revenu indépendant 2020 aide déclaration revenu indépendant 2020 . ACRE: description.en: >- - [automatic] The aid for the creation or takeover of a business (Acre) - consists of a partial exemption from social security contributions, known as - the exemption for the start of activity for 12 months. + [automatic] The aid for creating or taking over a business (Acre) consists + of a partial exemption from social security charges, known as the start-up + exemption, for 12 months. It is automatic for companies and sole proprietorships (under certain conditions, such as not having benefited from it in the last three years). - Moreover, for classic self-employed workers it is necessary to respect the condition of being considered as a creator in the sense of [article R131-3 of the Social Security Code](https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000034727582&cidTexte=LEGITEXT000006073189&dateTexte=20170511). + In addition, for classic self-employed workers it is necessary to respect the condition of being considered as a creator in the sense of [article R131-3 of the Social Security Code](https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000034727582&cidTexte=LEGITEXT000006073189&dateTexte=20170511). - ### Details + Details - This exemption covers all contributions except for the supplementary pension contribution and the CSG/CRDS and CFP contributions. + This exemption applies to all contributions except for the supplementary pension contribution and the CSG/CRDS and CFP contributions. - This exemption may be total, partial or nil depending on the income declared: + This exemption can be total, partial or zero depending on the income declared: - - If the income is less than 75% of the PASS, the exemption is total. + - If the income is less than 75% of the PASS the exemption is total. - - If the income is between 75% and 100% of the PASS, the exemption is degressive. + - If the income is between 75% and 100% of the PASS the exemption is degressive. - - If the income is higher than 100% of the PASS, the exemption is nil. + - If the income is higher than 100% of the PASS the exemption is nil. description.fr: >- L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une exonération partielle de charges sociales, dite exonération de début - d'activité pendant 12 mois. + d'activité pendant 12 mois. Elle est automatique pour les sociétés et les entreprises individuelles (sous certaines conditions, comme par exemple ne pas en avoir bénéficié les trois dernières années). @@ -66,65 +66,408 @@ aide déclaration revenu indépendant 2020 . ACRE: - Si le revenu est inférieur à 75% du PASS l’exonération est totale. - - Si le revenu est compris entre 75% et 100% du PASS l’exonération est dégressive. + - Si le revenu est compris entre 75% et 100% du PASS l’exonération est dégressive. - Si le revenu est supérieur à 100% du PASS l’exonération est nulle. question.en: '[automatic] Does your company benefit from ACRE?' question.fr: Votre entreprise bénéficie-t-elle de l'ACRE ? titre.en: '[automatic] ACRE' titre.fr: ACRE -aide déclaration revenu indépendant 2020 . CFP: - description.en: '[automatic] Contribution to professional training' - description.fr: Contribution à la formation professionnelle - résumé.en: '[automatic] [D]' - résumé.fr: '[D]' - titre.en: '[automatic] PSC' - titre.fr: CFP -aide déclaration revenu indépendant 2020 . CSG déductible: - description.en: '[automatic] Amount of CSG deductible from income tax' - description.fr: Montant de la CSG déductible à l'impôt sur le revenu - résumé.en: '[automatic] [B]' - résumé.fr: '[B]' - titre.en: '[automatic] Deductible CSG' - titre.fr: CSG déductible aide déclaration revenu indépendant 2020 . PRCI: titre.en: '[automatic] PRCI' titre.fr: PRCI aide déclaration revenu indépendant 2020 . SMIC 2020: titre.en: '[automatic] MINIMUM WAGE 2020' titre.fr: SMIC 2020 -aide déclaration revenu indépendant 2020 . assiette sociale: - description.en: '[automatic] Basis for calculating social security contributions' - description.fr: Assiette utilisée pour le calcul des cotisations sociales - résumé.en: '[automatic] [A - (B + C + D)]' - résumé.fr: '[A - (B + C + D)]' +aide déclaration revenu indépendant 2020 . comptabilité: + question.en: '[automatic] What method of accounting management is used for the company?' + question.fr: Quel méthode de gestion de la comptabilité est utilisée pour l'entreprise ? + titre.en: '[automatic] controlled declaration regime' + titre.fr: régime de la déclaration contrôlée +aide déclaration revenu indépendant 2020 . comptabilité . engagement: + titre.en: '[automatic] accrual accounting' + titre.fr: comptabilité d'engagement +aide déclaration revenu indépendant 2020 . comptabilité . trésorerie: + titre.en: '[automatic] cash accounting' + titre.fr: comptabilité de trésorerie +aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: + description.en: > + [automatic] You can find this amount in your personal Urssaf space. Here are + the steps to follow: + + + 1. Log on to your [Urssaf personal space](https://www.urssaf.fr/portail/home.html) + + 2. Go to the "Document" tab + + 3. Select "request a certificate". + + 3. Then, "CSG/CRDS certificate". + + 4. Enter in this field the total of the column "Amount not deductible: CRDS" (last line) + description.fr: > + Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici + la marche à suivre : + + + 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html) + + 2. Allez dans l'onglet "Document" + + 3. Selectionnez "demander une attestation" + + 3. Puis, "attestation CSG/CRDS" + + 4. Reportez dans ce champs le total de la colonne "Montant non déductible : CRDS" (dernière ligne) + question.en: '[automatic] What is the total amount of CRDS paid this year?' + question.fr: Quel est le montant total de CRDS payé cette année ? + titre.en: '[automatic] CRDS' + titre.fr: CRDS +? aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG déductible +: description.en: > + [automatic] You can find this amount in your personal Urssaf space. Here are + the steps to follow: + + + 1. Log on to your [Urssaf personal space](https://www.urssaf.fr/portail/home.html) + + 2. Go to the "Document" tab + + 3. Select "request a certificate". + + 3. Then, "CSG/CRDS certificate". + + 4. Enter in this field the total of the column "Amount deductible CSG" (last line) (last line) + description.fr: > + Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici + la marche à suivre : + + + 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html) + + 2. Allez dans l'onglet "Document" + + 3. Selectionnez "demander une attestation" + + 3. Puis, "attestation CSG/CRDS" + + 4. Reportez dans ce champs le total de la colonne "Montant déductible CSG" (dernière ligne) + question.en: '[automatic] What is the total amount of deductible CSG paid this year?' + question.fr: Quel est le montant total de CSG déductible payé cette année ? + titre.en: '[automatic] Deductible CSG' + titre.fr: CSG déductible +? aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG non déductible +: description.en: > + [automatic] You can find this amount in your personal Urssaf space. Here are + the steps to follow: + + + 1. Log on to your [Urssaf personal space](https://www.urssaf.fr/portail/home.html) + + 2. Go to the "Document" tab + + 3. Select "request a certificate". + + 3. Then, "CSG/CRDS certificate". + + 4. Enter in this field the total of the column "Amount not deductible: CSG" (last line) (last line) + description.fr: > + Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici + la marche à suivre : + + + 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html) + + 2. Allez dans l'onglet "Document" + + 3. Selectionnez "demander une attestation" + + 3. Puis, "attestation CSG/CRDS" + + 4. Reportez dans ce champs le total de la colonne "Montant non déductible : CSG" (dernière ligne) + question.en: '[automatic] What is the total amount of non-deductible CSG paid this year?' + question.fr: Quel est le montant total de CSG non déductible payé cette année ? + titre.en: '[automatic] Non-deductible CSG' + titre.fr: CSG non déductible +? aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . cotisations obligatoires déductibles +: titre.en: '[automatic] deductible mandatory contributions' + titre.fr: cotisations obligatoires déductibles +? aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . total charges sociale +: description.en: > + [automatic] You can find this amount in your personal Urssaf space. Here are + the steps to follow: + + + 1. Log on to your [Urssaf personal space](https://www.urssaf.fr/portail/home.html) + + 2. Go to the "Document" tab + + 3. Select "statement of account". + + 4. Enter in this field the amount of the column "Contribution", line "Year 2020". + description.fr: > + Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici + la marche à suivre : + + + 1. Connectez-vous à votre [espace personnel Urssaf](https://www.urssaf.fr/portail/home.html) + + 2. Allez dans l'onglet "Document" + + 3. Selectionnez "relevé de situation comptable" + + 4. Reportez dans ce champs le montant de la colonne "Cotisation", ligne "Année 2020" + question.en: + '[automatic] What is the total amount of social contributions paid + during the year?' + question.fr: + Quel est le montant total des cotisations et contributions sociales + payées pendant l'exercice ? + titre.en: '[automatic] total social charges' + titre.fr: total charges sociale +aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles: + titre.en: '[automatic] deductible mandatory contributions' + titre.fr: cotisations obligatoires déductibles +aide déclaration revenu indépendant 2020 . formulaire 2033: + résumé.en: '[automatic] Tax package for the simplified actual system' + résumé.fr: Liasse fiscale du régime réel simplifié + titre.en: '[automatic] form 2033-SD' + titre.fr: formulaire 2033-SD +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 250: + description.en: > + [automatic] If your business employs employees, add to this amount the total + gross remuneration paid during the year + description.fr: > + Si votre entreprise emploie des salarié, ajoutez à ce montant le total des + rémunération brute versée durant l'exercice + résumé.en: '[automatic] Staff remuneration (+)' + résumé.fr: Rémunérations du personnel (+) + titre.en: '[automatic] item 250' + titre.fr: rubrique 250 +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 252: + description.en: > + [automatic] If your business employs employees, add to this amount the total + employer contributions paid during the year + description.fr: > + Si votre entreprise emploie des salarié, ajoutez à ce montant le total des + cotisations patronales payées durant l'exercice + résumé.en: '[automatic] Social security charges (+)' + résumé.fr: Charges sociales (+) + titre.en: '[automatic] heading 252' + titre.fr: rubrique 252 +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 325: + résumé.en: '[automatic] Of which, deductible amount of optional contributions + paid in application of I of Article 154 bis of the CGI of which optional + Madelin contributions (I of Article 154 bis of the CGI)' + résumé.fr: Dont montant déductible des cotisations + facultatives versées en application du I + de l'article 154 bis du CGI dont + cotisations facultatives Madelin (I de l’art. 154 bis du CGI) + titre.en: '[automatic] heading 325' + titre.fr: rubrique 325 +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 326: + résumé.en: '[automatic] Of which amount deductible from compulsory social + security contributions excluding CSG-CRDS' + résumé.fr: Dont montant déductible des cotisations sociales obligatoires hors CSG-CRDS + titre.en: '[automatic] heading 326' + titre.fr: rubrique 326 +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 380: + résumé.en: '[automatic] Compulsory personal contributions of the operator' + résumé.fr: Cotisations personnelles obligatoires de l'exploitant + titre.en: '[automatic] item 380' + titre.fr: rubrique 380 +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 381: + description.en: '[automatic] Add optional contributions to new retirement + savings plans if necessary (327)' + description.fr: Ajoutez le montant des cotisations facultatives aux nouveaux + plans d'épargne retraite si nécessaire (327) + résumé.en: '[automatic] Optional supplementary premiums and contributions' + résumé.fr: Primes et cotisations complémentaires facultatives + titre.en: '[automatic] heading 381' + titre.fr: rubrique 381 +aide déclaration revenu indépendant 2020 . formulaire 2035: + résumé.en: '[automatic] Tax package for the controlled declaration system' + résumé.fr: Liasse fiscale du régime de la déclaration contrôlée + titre.en: '[automatic] form 2035-A-SD' + titre.fr: formulaire 2035-A-SD +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BK: + description.en: '[automatic] The BU heading is not taken into account here. It + must be added to this amount if it is not zero.' + description.fr: + La rubrique BU n'est pas prise en compte ici. Il faut l'ajouter + à ce montant si elle est non nulle. + résumé.en: '[automatic] Personal social charges (+)' + résumé.fr: Charges sociales personnelles (+) + titre.en: '[automatic] BK section' + titre.fr: rubrique BK +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BS: + description.en: '[automatic] Contribution to the professional training of the + farmer and his spouse, to be added to other existing taxes.' + description.fr: Contribution à la formation professionnelle de l'exploitant et + de son conjoint, à ajouter aux autres impôts existants. + résumé.en: '[automatic] Other taxes (+)' + résumé.fr: Autres impôts (+) + titre.en: '[automatic] BS section' + titre.fr: rubrique BS +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BT: + résumé.en: '[automatic] Of which mandatory' + résumé.fr: Dont obligatoires + titre.en: '[automatic] LV section' + titre.fr: rubrique BT +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BV: + résumé.en: '[automatic] Deductible generalized social contribution' + résumé.fr: Contribution sociale généralisée déductible + titre.en: '[automatic] BV section' + titre.fr: rubrique BV +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BZ: + résumé.en: '[automatic] Of which optional Madelin contributions' + résumé.fr: Dont cotisations facultatives Madelin + titre.en: '[automatic] section BZ' + titre.fr: rubrique BZ +aide déclaration revenu indépendant 2020 . formulaire 2042: + résumé.en: '[automatic] Income tax return' + résumé.fr: Déclaration des revenus + titre.en: '[automatic] form 2042' + titre.fr: formulaire 2042 +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique 1GB: + résumé.en: '[automatic] Salaries and wages' + résumé.fr: Traitements et salaires + titre.en: '[automatic] item 1GB / 1HB' + titre.fr: rubrique 1GB / 1HB +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSCA: + description.en: '[automatic] Heading SCPD/SCBD on the Supplementary Data Form + for the Self-employed Income Tax Return' + description.fr: Rubrique DSCA/DSCB du formulaire de donnée complémentaire à la + déclaration de revenus des indépendant + résumé.en: '[automatic] Compulsory social security contributions' + résumé.fr: Cotisations sociales obligatoires + titre.en: '[automatic] DSCA / DSCB section' + titre.fr: rubrique DSCA / DSCB +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSEA: + description.en: '[automatic] Add the amounts paid into the new supplementary savings plans' + description.fr: Ajoutez les sommes versées sur les nouveaux plans d'épargne complémentaire + résumé.en: '[automatic] Optional contributions (+)' + résumé.fr: Cotisations facultatives (+) + titre.en: '[automatic] DSEA / DSEB section' + titre.fr: rubrique DSEA / DSEB +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSIA: + résumé.en: '[automatic] Tobacco shop' + résumé.fr: Débit de tabac + titre.en: '[automatic] DSIA / DSIB section' + titre.fr: rubrique DSIA / DSIB +aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSLA: + résumé.en: '[automatic] Foreign income taxable but exempt from CSG-CRDS' + résumé.fr: Revenus étrangers imposables mais exonérés de CSG-CRDS + titre.en: '[automatic] DSLA / DSLB section' + titre.fr: rubrique DSLA / DSLB +aide déclaration revenu indépendant 2020 . formulaire 2050: + résumé.en: '[automatic] Tax package for the normal actual system' + résumé.fr: Liasse fiscale du régime réel normal + titre.en: '[automatic] form 2052-SD and 2053-SD' + titre.fr: formulaire 2052-SD et 2053-SD +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A2: + résumé.en: '[automatic] Personal contributions of the operator (+)' + résumé.fr: Cotisations personnelles de l'exploitant (+) + titre.en: '[automatic] item A2' + titre.fr: rubrique A2 +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A5: + résumé.en: '[automatic] Of which amount of compulsory social contributions + excluding CSG/CRDS' + résumé.fr: Dont montant des cotisations sociales obligatoires hors CSG/CRDS + titre.en: '[automatic] section A5' + titre.fr: rubrique A5 +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A6: + description.en: '[automatic] Add amounts paid into new supplementary savings plans (A8)' + description.fr: Ajoutez les sommes versées sur les nouveaux plans d'épargne + complémentaire (A8) + résumé.en: '[automatic] Optional personal supplementary premiums and contributions (+)' + résumé.fr: Primes et cotisations complémentaires personnelles facultatives (+) + titre.en: '[automatic] heading A6' + titre.fr: rubrique A6 +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A7: + résumé.en: '[automatic] Of which optional Madelin contributions' + résumé.fr: Dont cotisations facultatives Madelin + titre.en: '[automatic] section A7' + titre.fr: rubrique A7 +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FY: + description.en: > + [automatic] If your business employs employees, add to this amount the total + of all remuneration and allowances paid during the year + description.fr: > + Si votre entreprise emploie des salarié, ajoutez à ce montant le total des + rémunérations et indemnités versée durant l'exercice + résumé.en: '[automatic] Wages and salaries (+)' + résumé.fr: Salaires et traitements (+) + titre.en: '[automatic] section FY' + titre.fr: rubrique FY +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FZ: + description.en: > + [automatic] If your business employs employees, add to this amount the total + employer's contributions paid during the year, as well as any other social + security charges + description.fr: > + Si votre entreprise emploie des salarié, ajoutez à ce montant le total des + cotisations patronales payées durant l'exercice, ainsi que toutes les autres + charges sociales + résumé.en: '[automatic] Social security charges (+)' + résumé.fr: Charges sociales (+) + titre.en: '[automatic] section FZ' + titre.fr: rubrique FZ +aide déclaration revenu indépendant 2020 . informations: + titre.en: '[automatic] information' + titre.fr: informations +aide déclaration revenu indépendant 2020 . informations . assiette sociale: + description.en: '[automatic] The base used to calculate social security contributions.' + description.fr: Assiette utilisée pour le calcul des cotisations sociales. + résumé.en: '[automatic] [A - C1]' + résumé.fr: '[A - C1]' titre.en: '[automatic] social base' titre.fr: assiette sociale -aide déclaration revenu indépendant 2020 . cotisations obligatoires: - description.en: > - [automatic] To be reported in : - - - the DSCA/DSCB box** on the supplementary data form for the self-employed tax return (form 2042) - - - simplified actual system:** item 326 of form 2033-D-SD - - - normal actual regime:** item A5 of form 2053-SD - - - controlled declaration:** item BT of form 2035-A-SD - description.fr: > - À reporter dans : - - - **la case DSCA/DSCB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) - - - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD - - - **régime réel normal :** la rubrique A5 du formulaire 2053-SD - - - **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD - résumé.en: '[automatic] [C]' - résumé.fr: '[C]' - titre.en: '[automatic] Deductible mandatory social security contributions' - titre.fr: Cotisations sociales obligatoires déductibles +? aide déclaration revenu indépendant 2020 . informations . cotisations déductibles +: description.en: + '[automatic] Deductible social contributions for the calculation + of the social security base' + description.fr: + Cotisations et contributions sociales déductibles pour le calcul + de l'assiette sociale + résumé.en: '[automatic] [C1]' + résumé.fr: '[C1]' + titre.en: '[automatic] deductible contributions' + titre.fr: cotisations déductibles +? aide déclaration revenu indépendant 2020 . informations . cotisations non déductibles +: description.en: '[automatic] Non-deductible social contributions for the + calculation of the social security base' + description.fr: Cotisations et contributions sociales non déductibles pour le + calcul de l'assiette sociale + résumé.en: '[automatic] [C2]' + résumé.fr: '[C2]' + titre.en: '[automatic] non-deductible contributions' + titre.fr: cotisations non déductibles +aide déclaration revenu indépendant 2020 . informations . réduction Covid: + description.en: '[automatic] The contribution reduction applicable in the case + of the Covid scheme' + description.fr: La réduction de cotisation applicable dans le cas du dispositif Covid + titre.en: '[automatic] Covid discount' + titre.fr: réduction Covid +aide déclaration revenu indépendant 2020 . informations . rémunération nette: + description.en: + "[automatic] The executive's net income before income tax. This + is the remuneration actually paid." + description.fr: Le revenu net du dirigeant avant impôt sur le revenu. C'est la + rémunération effectivement versée. + résumé.en: '[automatic] [A - C1 - C2]' + résumé.fr: '[A - C1 - C2]' + titre.en: '[automatic] net pay' + titre.fr: rémunération nette +aide déclaration revenu indépendant 2020 . informations . rémunération totale: + description.en: '[automatic] The manager''s "superbrute" remuneration, + including all social contributions.' + description.fr: La rémunération "superbrute" du dirigeant, incluant toutes les + cotisations et contributions sociales. + résumé.en: '[automatic] [A]' + résumé.fr: '[A]' + titre.en: '[automatic] Total executive compensation' + titre.fr: Total rémunération dirigeant aide déclaration revenu indépendant 2020 . nature de l'activité: question.en: '[automatic] What is the nature of your business?' question.fr: Quelle est la nature de votre activité ? @@ -209,15 +552,6 @@ aide déclaration revenu indépendant 2020 . plafond sécurité sociale 2020: aide déclaration revenu indépendant 2020 . période: titre.en: '[automatic] period' titre.fr: période -aide déclaration revenu indépendant 2020 . revenu net fiscal: - description.en: - '[automatic] Income before deduction of social security charges - and tax exemptions' - description.fr: Résultat avant déduction des charges sociales et exonérations fiscales - résumé.en: '[automatic] [A]' - résumé.fr: '[A]' - titre.en: '[automatic] net tax income' - titre.fr: revenu net fiscal aide déclaration revenu indépendant 2020 . réduction covid: description.en: > [automatic] Within the framework of the health crisis, the Government has @@ -306,7 +640,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . part cotisations aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: description.en: > [automatic] The conditions of eligibility for "Covid" aid depend on the - sector of activity + sector of activity of which the main activity is part. @@ -333,7 +667,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi The procedures are specified on the Urssaf website. description.fr: > Les conditions d’éligibilité aux aides « Covid » dépendent du secteur - d’activité + d’activité dont relève l’activité principale. @@ -438,7 +772,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . total: Sector known as S1 bis - Main activity carried out depending on those of sector S1 + Main activity carried out depending on those of sector S1 Month concerned | Conditions of eligibility @@ -470,7 +804,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . total: - Month concerned** : November 2020, February 2021, March 2021 - - Conditions of eligibility**: To have been the subject of a prohibition measure that predominantly affects the pursuit of the activity, pursuant to Decree no. 2020-1310 of 29 October 2020 + - Conditions of eligibility**: To have been the subject of a prohibition measure that predominantly affects the pursuit of the activity, pursuant to Decree no. 2020-1310 of 29 October 2020 If you have ceased your activity, the cessation must be after or equal to 30 October 2020. @@ -517,7 +851,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . total: ### Secteur dit S1 bis - Activité principale exercée dépendant de celles du secteur S1 + Activité principale exercée dépendant de celles du secteur S1 Mois concerné | Conditions d'éligibilité @@ -549,7 +883,7 @@ aide déclaration revenu indépendant 2020 . réduction covid . total: - **Mois concerné** : novembre 2020, février 2021, mars 2021 - - **Conditions d'éligibilité**: Avoir fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de l’activité, en application du décret n° 2020-1310 du 29 octobre 2020 + - **Conditions d'éligibilité**: Avoir fait l’objet d’une mesure d’interdiction affectant de manière prépondérante la poursuite de l’activité, en application du décret n° 2020-1310 du 29 octobre 2020 Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 30 octobre 2020. @@ -671,19 +1005,112 @@ aide déclaration revenu indépendant 2020 . réduction covid . total: première vague de la crise sanitaire du printemps 2020 ? titre.en: '[automatic] eligible for aid spring 2020' titre.fr: éligible aide printemps 2020 -aide déclaration revenu indépendant 2020 . total charges sociales déductible: - description.en: | - [automatic] To be reported in : - - simplified actual system:** item 252 of form 2033-B-SD - - normal real system:** item FZ of form 2052-SD - - controlled declaration:** item BK of form 2035-A-SD - description.fr: | - À reporter dans : - - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD - - **régime réel normal :** la rubrique FZ du formulaire 2052-SD - - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD - résumé.en: '[automatic] [B + C + D]' - résumé.fr: '[B + C + D]' +aide déclaration revenu indépendant 2020 . régime d'imposition: + titre.en: '[automatic] tax regime' + titre.fr: régime d'imposition +? aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée +: description.en: > + [automatic] If you have to declare non-commercial profits (BNC), you may be + subject to the controlled declaration regime or the micro-BNC regime; this + depends on the amount of your profits. + + + The controlled declaration regime is the compulsory regime if the non-commercial profits to be declared are greater than €70,000 excluding tax. If the profits are lower, professionals are subject to the micro-BNC regime but can still opt for the controlled declaration regime. + + + In the case of the controlled declaration, the taxpayer is taxed on the profits actually made. In the case of the micro-BNC system, a flat-rate deduction of 34% is automatically applied after the turnover is declared. + description.fr: > + Si vous devez déclarer des bénéfices non commerciaux (BNC), vous pouvez être + soumis au régime de la déclaration contrôlée ou au régime micro-BNC ; cela + dépend du montant de vos bénéfices. + + + Le régime de la déclaration contrôlée est le régime obligatoire si les bénéfices non commerciaux à déclarer sont supérieurs à 70 000 € HT. Si les bénéfices sont inférieurs, les professionnels dépendent du régime micro-BNC mais peuvent tout de même opter pour le régime de la déclaration contrôlée. + + + Dans le cas de la déclaration contrôlée, le contribuable est imposé sur les bénéfices effectivement réalisés. Dans le cas du régime micro-BNC, un abattement forfaitaire de 34 % est appliqué automatiquement après déclaration du chiffre d’affaires. + titre.en: '[automatic] controlled declaration regime' + titre.fr: régime de la déclaration contrôlée +aide déclaration revenu indépendant 2020 . régime d'imposition . réel: + description.en: > + [automatic] The simplified tax regime (RSI) and the normal tax regime (RN) + apply to profits made during the financial year and to value added tax + (VAT). + + + It is mainly the detail required when filling in the accounting obligations that differentiates these 2 tax systems. + description.fr: > + Le régime simplifié d'imposition (RSI) et le régime réel normal (RN) + s'appliquent aux bénéfices réalisés au cours de l'exercice et à la taxe sur + la valeur ajoutée (TVA). + + + C'est principalement le détail demandé lors du remplissage des obligations comptables qui différencie ces 2 régimes d'imposition. + question.en: '[automatic] What is the tax regime applicable to the year?' + question.fr: Quel est le régime d'imposition applicable à l'exercice ? + titre.en: '[automatic] real' + titre.fr: réel +aide déclaration revenu indépendant 2020 . régime d'imposition . réel . normal: + description.en: > + [automatic] The accounting of the company subjected to the normal real + regime must be more precise than for the simplified real regime: + + + - It must be based on supporting documents. + + - The company is obliged to proceed with the chronological recording of the movements affecting its assets. + + - The company must carry out an inventory at least once every 12 months. + + - The company must draw up annual accounts comprising a balance sheet, an income statement and annexes. + + - The company must keep a journal book and a general ledger. + description.fr: > + La comptabilité de l’entreprise soumise au régime réel normal doit être plus + précise que pour le régime réel simplifié : + + + - Elle doit s'appuyer sur des pièces justificatives. + + - L'entreprise est obligée de procéder à l'enregistrement comptable chronologique des mouvements affectant son patrimoine. + + - L'entreprise doit procéder à un inventaire au moins une fois tous les 12 mois. + + - L'entreprise doit établir des comptes annuels comprenant un bilan, un compte de résultat et des annexes. + + - L'entreprise doit tenir un livre journal et un grand livre. + titre.en: '[automatic] standard real estate regime' + titre.fr: régime réel normal +? aide déclaration revenu indépendant 2020 . régime d'imposition . réel . simplifié +: description.en: > + [automatic] Companies subject to the simplified real tax regime must keep + standard accounts: a balance sheet, an income statement and annexes. Special + provisions apply to lighten your accounting obligations: + + + - the journal book only records daily the income received and the expenses paid + + - receivables and payables are recorded at the end of the financial year + + - the balance sheet provided to the tax authorities is a simplified balance sheet + description.fr: > + Les entreprises soumises au régime d'imposition réel simplifié doivent tenir + une comptabilité classique : un bilan, un compte de résultat et des annexes. + Des dispositions particulières s’appliquent pour alléger vos obligations + comptables : + + + - le livre journal n’enregistre journellement que les recettes encaissées et les dépenses payées + + - les créances et les dettes sont constatées à la clôture de l’exercice + + - le bilan fourni à l’administration fiscale est un bilan simplifié + titre.en: '[automatic] simplified real estate regime' + titre.fr: régime réel simplifié +aide déclaration revenu indépendant 2020 . rémunération déductible: + titre.en: '[automatic] deductible remuneration' + titre.fr: rémunération déductible +aide déclaration revenu indépendant 2020 . total charges sociales déductibles: titre.en: '[automatic] tax-deductible mandatory social security charges' titre.fr: charges sociales obligatoires déductibles fiscalement artiste-auteur: @@ -7346,8 +7773,8 @@ entreprise . imposition: - l'impôt sur le revenu, où les bénéfices sont déclarés sur la déclaration de revenus personnelle et imposés au barème progressif - l'impôt sur les sociétés, où les bénéfices sont déclarés au nom de la société - question.en: '[automatic] What tax regime is the company subject to?' - question.fr: À quel régime d'imposition l'entreprise est-elle soumise ? + question.en: '[automatic] How is the company taxed?' + question.fr: Comment l'entreprise est-elle imposée ? titre.en: '[automatic] taxation' titre.fr: imposition entreprise . imposition . IR: diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index bab37d146..5feedd697 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -152,6 +152,7 @@ Revenu (incluant les dépenses liées à l'activité): Revenue (including expens Revenu disponible: Disposable income "Revenu net avec chômage partiel :": "Net income with short-time work :" Revenu net mensuel: Monthly net income +Revenus étranger: Foreign income Réductions: Discounts Rémunération du dirigeant: Director's remuneration Répartition du chiffre d'affaires: Breakdown of turnover diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 4db0d818f..565132231 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,93 +1,90 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9020,12300]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9020,12300,50000,36345,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,1965]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,1965,15000,12630,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,715]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,715,5000,4152,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,2220]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,2220,10000,7511,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,1339]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,1339,10000,8392,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11409,14535]"`; +exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11408,14534,50000,34049,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[82,210]"`; +exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[86,214,500,275,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,1436]"`; +exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1060,1475,5000,3392,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9021,11468]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9020,11467,50000,37540,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,119]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,119,5000,4881,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[33,183]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[33,183,15000,14803,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7546,9433]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7546,9433,35000,24814,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,17408]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14092,17407,50000,31239,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[11933,15248]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13578,16893,50000,31753,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11933,15248]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11461,14776,50000,33870,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14098,17393]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14097,17392,50000,31254,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,14776]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,14776,50000,33870,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5652,8932]"`; +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5651,8931,50000,39714,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: international 1`] = ` -"[14610,14713] -Notifications affichées : impôt . domiciliation étranger non implémentée" -`; +exports[`calculate aide-déclaration-indépendant: international 1`] = `"[14610,14713,50000,35287,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,13245]"`; +exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,13245,50000,36215,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11365,14660]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11362,14657,50000,33989,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1368,1798]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1366,1796,5000,3071,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11369,14649]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11367,14647,50000,33998,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1369,1784]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1368,1783,5000,3084,0,1,1,0]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[11369,14649] +"[11367,14647,50000,33998,0,0,1,1] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1369,1784]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1368,1783,5000,3084,0,0,1,1]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` -"[9454,12734] +"[9453,12733,50000,35912,0,0,1,1] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[1042,1170] +"[1041,1169,500,-680,0,1,1,0] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[1042,1202] +"[1041,1201,1000,-225,0,1,1,0] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1067,1259]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1066,1258,1500,204,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1110,1334]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1109,1333,2000,615,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1369,1784]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1368,1783,5000,3084,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2204,2937]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2203,2936,10000,6795,0,1,1,0]"`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` -"[20929,27392] +"[20929,27392,100000,69895,0,1,1,0] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` -"[106448,170215] +"[106448,170215,1000000,802634,0,1,1,0] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -205,92 +202,92 @@ exports[`calculate simulations-impot-société: prorata temporis 3`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13181,16819,17881,467,16352,0,30000,7359]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13180,16820,17883,467,16353,0,30000,7072]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14381,15619,17881,467,15152,0,30000,8559]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14380,15620,17883,467,15153,0,30000,8272]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10381,19619,20431,874,18745,0,30000,4559]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,875,18746,0,30000,4272]"`; -exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6732,13268,13809,0,13268,0,20000,4059]"`; +exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6730,13270,13810,0,13270,0,20000,3772]"`; exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` -"[300000,79622,220378,228521,82429,137949,0,300000,10059] +"[300000,79622,220378,228521,82429,137949,0,300000,9772] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3559]"`; +exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3272]"`; -exports[`calculate simulations-indépendant: activité 1`] = `"[29086,9086,20000,20787,931,19069,0,29086,3559]"`; +exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000,20787,931,19069,0,29084,3272]"`; -exports[`calculate simulations-indépendant: activité 2`] = `"[29102,9102,20000,20787,931,19069,0,29102,3575]"`; +exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,931,19069,0,29100,3288]"`; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1375,1275,100,135,0,100,0,1375,3559]"`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1372,1272,100,134,0,100,0,1372,3272]"`; -exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[244,144,100,104,0,100,0,244,3211]"`; +exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246,3272]"`; exports[`calculate simulations-indépendant: imposition à l'IS 1`] = ` -"[100000,30105,69895,72609,15123,54772,0,100000,3559] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[100000,30104,69896,72608,15122,54774,0,100000,3272] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" `; exports[`calculate simulations-indépendant: imposition à l'IS 2`] = ` -"[100000,30105,69895,72609,15123,54772,0,100000,3559] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[100000,30104,69896,72608,15122,54774,0,100000,3272] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" `; -exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29086,9086,20000,20787,603,19397,0,29086,3559]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084,3272]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3559]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3272]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29086,9086,20000,20787,2079,17921,0,29086,3559]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084,3272]"`; -exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1386,614,666,0,614,0,2000,3559]"`; +exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1385,615,667,0,615,0,2000,3272]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16004,33996,35351,4611,29385,0,50000,3559]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,4612,29385,0,50000,3272]"`; -exports[`calculate simulations-indépendant: inversions 3`] = `"[14597,4597,10000,10394,0,10000,0,14597,3559]"`; +exports[`calculate simulations-indépendant: inversions 3`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; -exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3559]"`; +exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3272]"`; -exports[`calculate simulations-indépendant: inversions 5`] = `"[14597,4597,10000,10394,0,10000,1000,15597,3559]"`; +exports[`calculate simulations-indépendant: inversions 5`] = `"[14596,4596,10000,10394,0,10000,1000,15596,3272]"`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5929,13071,13584,0,13071,1000,20000,3559]"`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5927,13073,13585,0,13073,1000,20000,3272]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5627,12373,12860,0,12373,2000,20000,3559]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5624,12376,12861,0,12376,2000,20000,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1861,1361,500,548,0,500,0,1861,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1859,1359,500,548,0,500,0,1859,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3683,1683,2000,2097,0,2000,0,3683,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3682,1682,2000,2097,0,2000,0,3682,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7428,2428,5000,5199,0,5000,0,7428,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7427,2427,5000,5199,0,5000,0,7427,3272]"`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14597,4597,10000,10394,0,10000,0,14597,3559]"`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` -"[139593,39593,100000,103788,28472,71528,0,139593,3559] +"[139593,39593,100000,103788,28472,71528,0,139593,3272] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` -"[1239954,239954,1000000,1033666,473591,526409,0,1239954,3559] +"[1239954,239954,1000000,1033666,473591,526409,0,1239954,3272] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[3147,0,2647,500,0,500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[2873,0,2373,500,0,500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3708,0,2708,1000,0,1000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3433,0,2433,1000,0,1000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[4267,0,2767,1500,0,1500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[3994,0,2494,1500,0,1500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4827,0,2827,2000,0,2000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4554,0,2554,2000,0,2000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[8245,0,3245,5000,0,5000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[7987,0,2987,5000,0,5000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14422,0,4422,10000,0,10000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14244,0,4244,10000,0,10000]"`; exports[`calculate simulations-professions-libérales: CIPAV 7`] = ` "[146241,0,46241,100000,28546,71454] @@ -318,7 +315,7 @@ exports[`calculate simulations-professions-libérales: avocat 2`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5076,14924,81,14843]"`; +exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,85,14866]"`; exports[`calculate simulations-professions-libérales: expert-comptable 2`] = ` "[50000,0,14877,35123,4949,30174] @@ -487,63 +484,63 @@ exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): éc Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] = `"[0,8392,0,6077,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] = `"[0,8392,0,6102,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12220,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12270,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22330,0,16241,4,32]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22331,0,16308,4,32]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16819,0,13265,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16820,0,13327,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15619,0,13265,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15620,0,13327,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19619,0,14540,4,28]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19621,0,14602,4,28]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13268,0,9793,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13270,0,9835,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` -"[0,220378,0,57407,4,56] +"[0,220378,0,57933,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13168,0,9743,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13170,0,9785,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13768,0,10043,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14515,0,null,4,0]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,null,4,0]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10035,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10076,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13768,0,10043,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13768,0,10043,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6794,0,4956,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6795,0,4976,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13768,0,10043,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13770,0,10085,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` -"[0,-1045,0,0,3,21] +"[0,-1044,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` -"[0,-226,0,0,3,21] +"[0,-225,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,614,0,468,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,615,0,471,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3083,0,2257,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3084,0,2266,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6794,0,4956,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6795,0,4976,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13768,0,10043,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13770,0,10085,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33996,0,24810,4,48]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33997,0,24913,4,48]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 8`] = ` -"[0,69895,0,36204,4,56] +"[0,69895,0,36428,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; diff --git a/mon-entreprise/test/regressions/simulations.jest.js b/mon-entreprise/test/regressions/simulations.jest.js index 982ad639d..f7184a562 100644 --- a/mon-entreprise/test/regressions/simulations.jest.js +++ b/mon-entreprise/test/regressions/simulations.jest.js @@ -142,6 +142,9 @@ it('calculate aide-déclaration-indépendant', () => { { "aide déclaration revenu indépendant 2020 . nature de l'activité": "'commerciale'", + 'aide déclaration revenu indépendant 2020 . comptabilité': "'engagement'", + "aide déclaration revenu indépendant 2020 . régime d'imposition . réel": + "'normal'", ...aideDéclarationConfig.situation, } ) From e8a58c3dfff6a0ee1a582bc8fbddf368c25fc48e Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 17 May 2021 10:39:10 +0200 Subject: [PATCH 174/319] :fountain_pen: Corrige la rubrique A2 --- modele-social/règles/déclaration-revenu-indépendant.yaml | 3 ++- mon-entreprise/source/locales/rules-en.yaml | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index a696b478c..a749aae97 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -591,7 +591,7 @@ aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 252: aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 381: applicable si: entreprise . imposition . IR - résumé: Primes et cotisations complémentaires facultatives + résumé: Primes et cotisations complémentaires facultatives (+) valeur: rubrique 325 description: Ajoutez le montant des cotisations facultatives aux nouveaux plans d'épargne retraite si nécessaire (327) @@ -634,6 +634,7 @@ aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FZ: aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A2: applicable si: entreprise . imposition . IR résumé: Cotisations personnelles de l'exploitant (+) + description: Ajoutez les sommes versées sur les nouveaux plans d'épargne complémentaire (A8) valeur: total charges sociales déductibles aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A5: diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 0f2fd02e4..4d70bf5e4 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -281,8 +281,8 @@ aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 381: savings plans if necessary (327)' description.fr: Ajoutez le montant des cotisations facultatives aux nouveaux plans d'épargne retraite si nécessaire (327) - résumé.en: '[automatic] Optional supplementary premiums and contributions' - résumé.fr: Primes et cotisations complémentaires facultatives + résumé.en: '[automatic] Optional supplementary premiums and contributions (+)' + résumé.fr: Primes et cotisations complémentaires facultatives (+) titre.en: '[automatic] heading 381' titre.fr: rubrique 381 aide déclaration revenu indépendant 2020 . formulaire 2035: @@ -366,6 +366,9 @@ aide déclaration revenu indépendant 2020 . formulaire 2050: titre.en: '[automatic] form 2052-SD and 2053-SD' titre.fr: formulaire 2052-SD et 2053-SD aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A2: + description.en: '[automatic] Add amounts paid into new supplementary savings plans (A8)' + description.fr: Ajoutez les sommes versées sur les nouveaux plans d'épargne + complémentaire (A8) résumé.en: '[automatic] Personal contributions of the operator (+)' résumé.fr: Cotisations personnelles de l'exploitant (+) titre.en: '[automatic] item A2' From b32b27ce4ecf7a0d67e06962e7e000baa373666f Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 20 May 2021 15:58:19 +0200 Subject: [PATCH 175/319] Ajoute les PER et corrige quelques montants de case --- modele-social/règles/dirigeant.yaml | 85 ++++++++----- .../déclaration-revenu-indépendant.yaml | 114 +++++++++++------- .../règles/entreprise-établissement.yaml | 2 +- .../AideDéclarationIndépendant/config.yaml | 2 +- .../AideDéclarationIndépendant/index.tsx | 4 +- .../configs/profession-libérale.yaml | 2 +- .../regressions/simulations-indépendant.yaml | 32 +++-- .../simulations-rémunération-dirigeant.yaml | 34 +++--- 8 files changed, 166 insertions(+), 109 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index c098988a4..6bdf87e6e 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -490,7 +490,7 @@ dirigeant . indépendant . assiette des cotisations: nom: sans plancher somme: - revenu professionnel - - contrats madelin . part déductible fiscalement + - cotisations facultatives . déductibles plancher: 0 dirigeant . indépendant . conjoint collaborateur: @@ -511,7 +511,7 @@ dirigeant . indépendant . cotisations et contributions . non déductibles: titre: Cotisations et contributions non déductibles fiscalement somme: - CSG et CRDS . non déductible - - contrats madelin . part non-déductible fiscalement + - cotisations facultatives . non déductibles dirigeant . indépendant . cotisations et contributions . exonérations . ACRE: applicable si: entreprise . ACRE @@ -736,7 +736,7 @@ dirigeant . indépendant . cotisations et contributions: somme: - cotisations et contributions . cotisations - conjoint collaborateur . cotisations - - contrats madelin . montant + - cotisations facultatives . total - CSG et CRDS - contributions spéciales - formation professionnelle @@ -823,36 +823,59 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac . rev valeur: assiette des cotisations abattement: déduction tabac -dirigeant . indépendant . contrats madelin: - titre: Contrats Madelin - question: | - Avez-vous souscrit à un contrat de prévoyance et / ou de retraite complémentaire privé dits « contrat Madelin » + +dirigeant . indépendant . cotisations facultatives: + question: Avez-vous souscrit à des contrats de prévoyance et / ou de retraite complémentaire privés (contrats Madelin, plans d'épargne retraite) ? + description: | + Il est possible pour l'indépendant de souscrire à des contrats privés pour la complémentaire santé, ou un plan d'épargne retraite. + Les versements à ces contrats sont désigné par l'appellation "cotisations facultative" par l'administration fiscale. + + Ils sont déductible d'impôts (dans la limite d'un plafond), mais non déductible pour l'assiette des cotisations et contributions sociales. par défaut: non + références: + Contrats Madelin: https://www.economie.gouv.fr/particuliers/reduction-impot-revenu-investissements-entreprise-pme-madelin + PER: https://www.economie.gouv.fr/PER-epargne-retraite + +dirigeant . indépendant . cotisations facultatives . total: + titre: Total des cotisations facultatives + somme: + - contrats madelin + - PER + +dirigeant . indépendant . cotisations facultatives . déductibles: + titre: Part des cotisations facultatives déductible fiscalement + formule: + somme: + - valeur: contrats madelin . prévoyance + plafond: plafond prévoyance + - somme: + - PER + - contrats madelin . retraite + plafond: plafond retraite complémentaire + +dirigeant . indépendant . cotisations facultatives . non déductibles: + titre: Part des cotisations facultatives non déductible fiscalement + formule: total - déductibles + +dirigeant . indépendant . cotisations facultatives . PER: + description: + Le PER individuel est ouvert à tous. Vous pouvez le souscrire auprès d'un établissement financier ou d'un organisme d'assurance. Ce nouveau plan succède au PERP et au contrat Madelin, qui ne seront plus proposés à partir du 1er octobre 2020. Votre épargne accumulée sur le Perp et le Madelin peut être à votre demande transférée sur le PER individuel. Ce contrat donne droit à des avantages fiscaux et vos droits sont transférables vers les autres PER. Il y a des cas de déblocage anticipé. + titre: Plan d'épargne retraite + unité: €/an + question: Quel est le montant des cotisations que vous versez dans le cadre d'un PER (nouveau plan épargne retraite, depuis le 1er octobre 2019) ? + par défaut: 0 €/mois références: - economie.gouv.fr: https://www.economie.gouv.fr/particuliers/reduction-impot-revenu-investissements-entreprise-pme-madelin + Fiche service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F34982 + Fiche economie.gouv.fr: https://www.economie.gouv.fr/PER-epargne-retraite -dirigeant . indépendant . contrats madelin . montant: + +dirigeant . indépendant . cotisations facultatives . contrats madelin: titre: Somme des cotisations à contrats Madelin - formule: - somme: - - mutuelle - - retraite + somme: + - prévoyance + - retraite - -dirigeant . indépendant . contrats madelin . part déductible fiscalement: - titre: Part de la cotisation à contrat Madelin qui est déductible fiscalement - formule: - somme: - - valeur: mutuelle - plafond: mutuelle . plafond - - valeur: retraite - plafond: retraite . plafond - -dirigeant . indépendant . contrats madelin . part non-déductible fiscalement: - titre: Part de la cotisation à contrat Madelin qui n'est pas déductible fiscalement - formule: montant - part déductible fiscalement - -dirigeant . indépendant . contrats madelin . mutuelle: +dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: titre: Souscription à un contrat de prévoyance complémentaire Madelin question: Quel est le montant que vous versez pour vos contrats Madelin de prévoyance complémentaire (santé, perte d'emploi subie) ? unité: €/an @@ -866,7 +889,7 @@ dirigeant . indépendant . contrats madelin . mutuelle: Article de loi: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000029042287&cidTexte=LEGITEXT000006069577&dateTexte=20140530&fastReqId=1900907951&nbResultRech=1 par défaut: 50 €/mois -dirigeant . indépendant . contrats madelin . mutuelle . plafond: +dirigeant . indépendant . cotisations facultatives . plafond prévoyance : unité: €/an formule: somme: @@ -885,7 +908,7 @@ dirigeant . indépendant . contrats madelin . mutuelle . plafond: Réassurez-moi: https://reassurez-moi.fr/guide/pro/tns/plafond#le_plafond_de_deduction_madelin_pour_une_mutuelle_santenbsp note: | Normalement c'est le résultat fiscal qui devrait être utilisé pour l'assiette du plafond, mais on utilise le revenu professionnel pour éviter un cycle. -dirigeant . indépendant . contrats madelin . retraite: +dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: titre: Souscription à une retraite Madelin question: Quel est le montant que vous versez pour votre contrat Madelin retraite complémentaire ? description: | @@ -898,7 +921,7 @@ dirigeant . indépendant . contrats madelin . retraite: Article de loi: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000029042287&cidTexte=LEGITEXT000006069577&dateTexte=20140530&fastReqId=1900907951&nbResultRech=1 par défaut: 0 €/an -dirigeant . indépendant . contrats madelin . retraite . plafond: +dirigeant . indépendant . cotisations facultatives . plafond retraite complémentaire: unité: €/an formule: le maximum de: diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index a749aae97..cefc3f58d 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -16,8 +16,8 @@ aide déclaration revenu indépendant 2020 . comptabilité: une possibilité: choix obligatoire: oui possibilités: - - trésorerie - engagement + - trésorerie aide déclaration revenu indépendant 2020 . comptabilité . trésorerie: remplace: @@ -28,11 +28,11 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie: aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . total charges sociale: remplace: - règle: dirigeant . rémunération . cotisations + règle: dirigeant . indépendant . cotisations et contributions par: somme: - - total charges sociale - - dirigeant . indépendant . contrats madelin . montant + - comptabilité . trésorerie . total charges sociale + - dirigeant . indépendant . cotisations facultatives . total unité: €/an question: Quel est le montant total des cotisations et contributions sociales payées pendant l'exercice ? description: | @@ -84,11 +84,10 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . cotisations obligatoires déductibles: remplace: cotisations obligatoires déductibles unité: €/an - valeur: total charges sociale + valeur: comptabilité . trésorerie . total charges sociale abattement: somme: - - CSG non déductible - - CRDS + - dirigeant . indépendant . cotisations et contributions . CSG et CRDS - dirigeant . indépendant . cotisations et contributions . formation professionnelle aide déclaration revenu indépendant 2020 . comptabilité . engagement: @@ -548,19 +547,11 @@ aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles: - unité: €/an + description: Cotisations obligatoires déductibles, utile pour calculer l'assiette de la CSG/CRDS somme: - dirigeant . indépendant . cotisations et contributions . cotisations - dirigeant . indépendant . conjoint collaborateur . cotisations - références: -aide déclaration revenu indépendant 2020 . total charges sociales déductibles: - titre: charges sociales obligatoires déductibles fiscalement - valeur: dirigeant . rémunération . cotisations - abattement: - applicable si: entreprise . imposition . IR - valeur: dirigeant . indépendant . cotisations et contributions . non déductibles - aide déclaration revenu indépendant 2020 . rémunération déductible: variations: - si: entreprise . imposition . IS @@ -579,32 +570,50 @@ aide déclaration revenu indépendant 2020 . formulaire 2033: aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 250: résumé: Rémunérations du personnel (+) - valeur: rémunération déductible + valeur: rémunération déductible description: | Si votre entreprise emploie des salarié, ajoutez à ce montant le total des rémunération brute versée durant l'exercice aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 252: résumé: Charges sociales (+) - valeur: total charges sociales déductibles + valeur: dirigeant . indépendant . cotisations et contributions description: | Si votre entreprise emploie des salarié, ajoutez à ce montant le total des cotisations patronales payées durant l'exercice +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 324: + résumé: Impôts et taxes non déductibles + applicable si: entreprise . imposition . IR + valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible + +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 330: + résumé: Divers à réintégrer (+) + description: Réintégrer également les montants spécifiés [page 8 de la notice dédiée](https://www.impots.gouv.fr/portail/files/formulaires/2033-sd/2019/2033-sd_2570.pdf#page=8) + applicable si: + toutes ces conditions: + - entreprise . imposition . IR + - dirigeant . indépendant . cotisations facultatives . non déductibles > 0 + valeur: dirigeant . indépendant . cotisations facultatives . non déductibles + aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 381: applicable si: entreprise . imposition . IR - résumé: Primes et cotisations complémentaires facultatives (+) - valeur: rubrique 325 - description: Ajoutez le montant des cotisations facultatives aux nouveaux plans d'épargne retraite si nécessaire (327) + résumé: Primes et cotisations complémentaires facultatives + valeur: dirigeant . indépendant . cotisations facultatives . total aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 325: applicable si: entreprise . imposition . IR résumé: Dont montant déductible des cotisations facultatives versées en application du I de l'article 154 bis du CGI dont cotisations facultatives Madelin (I de l’art. 154 bis du CGI) - valeur: dirigeant . indépendant . contrats madelin . part déductible fiscalement + valeur: dirigeant . indépendant . cotisations facultatives . déductibles +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 327: + applicable si: entreprise . imposition . IR + résumé: Dont cotisations facultatives aux nouveaux plans d'épargne retraite + valeur: dirigeant . indépendant . cotisations facultatives . PER + aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 380: applicable si: entreprise . imposition . IR résumé: Cotisations personnelles obligatoires de l'exploitant - valeur: total charges sociales déductibles - abattement: dirigeant . indépendant . contrats madelin . part déductible fiscalement + valeur: dirigeant . indépendant . cotisations et contributions + abattement: dirigeant . indépendant . cotisations facultatives . total aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 326: applicable si: entreprise . imposition . IR @@ -618,7 +627,7 @@ aide déclaration revenu indépendant 2020 . formulaire 2050: résumé: Liasse fiscale du régime réel normal référence: formulaire: https://www.impots.gouv.fr/portail/files/formulaires/2050-liasse/2021/2050-liasse_3391.pdf - + notice: https://www.impots.gouv.fr/portail/files/formulaires/2032-not-sd/2020/2032-not-sd_2959.pdf aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FY: résumé: Salaires et traitements (+) valeur: rémunération déductible @@ -627,15 +636,15 @@ aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FY: aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FZ: résumé: Charges sociales (+) - valeur: total charges sociales déductibles + valeur: dirigeant . indépendant . cotisations et contributions description: | Si votre entreprise emploie des salarié, ajoutez à ce montant le total des cotisations patronales payées durant l'exercice, ainsi que toutes les autres charges sociales aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A2: applicable si: entreprise . imposition . IR - résumé: Cotisations personnelles de l'exploitant (+) - description: Ajoutez les sommes versées sur les nouveaux plans d'épargne complémentaire (A8) - valeur: total charges sociales déductibles + résumé: Cotisations personnelles de l'exploitant + valeur: dirigeant . indépendant . cotisations et contributions + abattement: dirigeant . indépendant . cotisations facultatives . total aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A5: applicable si: entreprise . imposition . IR @@ -644,14 +653,24 @@ aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A5: aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A6: applicable si: entreprise . imposition . IR - résumé: Primes et cotisations complémentaires personnelles facultatives (+) - description: Ajoutez les sommes versées sur les nouveaux plans d'épargne complémentaire (A8) - valeur: rubrique A7 + résumé: Primes et cotisations complémentaires personnelles facultatives + valeur: dirigeant . indépendant . cotisations facultatives . déductibles aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A7: applicable si: entreprise . imposition . IR - résumé: Dont cotisations facultatives Madelin - valeur: dirigeant . indépendant . contrats madelin . part déductible fiscalement + résumé: Dont cotisations facultatives Madelin + valeur: dirigeant . indépendant . cotisations facultatives . contrats madelin + +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A8: + applicable si: entreprise . imposition . IR + résumé: Dont cotisations facultatives aux nouveaux plans d'épargne retraite + valeur: dirigeant . indépendant . cotisations facultatives . PER + +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique WQ: + applicable si: entreprise . imposition . IR + valeur: dirigeant . indépendant . cotisations et contributions . non déductibles + résumé: Réintégrations diverses (+) + description: Ajouter toutes les réintégrations listée dans la [page 9 de la notice](https://www.impots.gouv.fr/portail/files/formulaires/2032-not-sd/2020/2032-not-sd_2959.pdf#page=9) aide déclaration revenu indépendant 2020 . formulaire 2035: titre: formulaire 2035-A-SD @@ -671,10 +690,10 @@ aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BV: valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BK: - résumé: Charges sociales personnelles (+) - description: La rubrique BU n'est pas prise en compte ici. Il faut l'ajouter à ce montant si elle est non nulle. - valeur: total charges sociales déductibles - abattement: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible + résumé: Charges sociales personnelles + somme: + - cotisations obligatoires déductibles + - dirigeant . indépendant . cotisations facultatives . déductibles aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BT: résumé: Dont obligatoires @@ -682,7 +701,11 @@ aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BT: aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BZ: résumé: Dont cotisations facultatives Madelin - valeur: dirigeant . indépendant . contrats madelin . part déductible fiscalement + valeur: dirigeant . indépendant . cotisations facultatives . contrats madelin + +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BU: + résumé: Dont facultatives aux nouveaux plans d’épargne retraite + valeur: dirigeant . indépendant . cotisations facultatives . PER aide déclaration revenu indépendant 2020 . formulaire 2042: valeur: oui @@ -697,7 +720,6 @@ aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique 1GB: résumé: Traitements et salaires valeur: dirigeant . rémunération . imposable - aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSCA: titre: rubrique DSCA / DSCB résumé: Cotisations sociales obligatoires @@ -708,9 +730,8 @@ aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSCA: aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSEA: titre: rubrique DSEA / DSEB - description: Ajoutez les sommes versées sur les nouveaux plans d'épargne complémentaire - résumé: Cotisations facultatives (+) - formule: dirigeant . indépendant . contrats madelin . part déductible fiscalement + résumé: Cotisations facultatives + formule: dirigeant . indépendant . cotisations facultatives . déductibles aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSIA: titre: rubrique DSIA / DSIB @@ -747,9 +768,10 @@ aide déclaration revenu indépendant 2020 . informations . cotisations déducti aide déclaration revenu indépendant 2020 . informations . cotisations non déductibles: résumé: '[C2]' description: Cotisations et contributions sociales non déductibles pour le calcul de l'assiette sociale - somme: - - dirigeant . indépendant . contrats madelin . montant - - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible + valeur: + somme: + - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible + - dirigeant . indépendant . cotisations facultatives . total aide déclaration revenu indépendant 2020 . informations . assiette sociale: résumé: '[A - C1]' diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 54ba1c6f4..df59c4a0a 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -254,7 +254,7 @@ entreprise . imposition . IR: titre: Impôt sur le revenu entreprise . imposition . IR . micro-fiscal: - rend non applicable: dirigeant . indépendant . contrats madelin + rend non applicable: dirigeant . indépendant . cotisations facultatives question: Avez-vous opté pour le régime micro-fiscal ? description: | Avec le régime micro fiscal, les charges déductibles sont estimées forfaitairement,en fonction d’un pourcentage du chiffre d’affaires. Ce pourcentage dépend du type d’activité : 71% pour les activités de vente, restauration et hébergement (location de meublé de tourisme classé et chambre d’hôte), 50% pour les prestations de service commerciales ou artisanales, 34% pour les activités libérales. diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml index 9ce8d1620..0cefa7422 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml @@ -1,6 +1,6 @@ objectifs: - aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles - - aide déclaration revenu indépendant 2020 . total charges sociales déductibles + - aide déclaration revenu indépendant 2020 . informations . cotisations déductibles - dirigeant . rémunération . totale - dirigeant . rémunération . nette - aide déclaration revenu indépendant 2020 . formulaire 2033 diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index a3851f83a..959966f4f 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -200,7 +200,7 @@ export default function AideDéclarationIndépendant() { hideTitle /> - +

    International

    @@ -215,7 +215,7 @@ export default function AideDéclarationIndépendant() { - + {/* We can't use a subsection here cause revenu étrangers is not missing when CSG is replaced */}

    diff --git a/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml b/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml index 4e5237eb4..6eb78495a 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml @@ -19,7 +19,7 @@ questions: - situation personnelle - impôt non prioritaires: - - dirigeant . indépendant . contrats madelin + - dirigeant . indépendant . cotisations facultatives - dirigeant . indépendant . IJSS - dirigeant . indépendant . cotisations et contributions . exonérations - dirigeant . indépendant . revenus étrangers diff --git a/mon-entreprise/test/regressions/simulations-indépendant.yaml b/mon-entreprise/test/regressions/simulations-indépendant.yaml index ec1e495c5..aa61564c4 100644 --- a/mon-entreprise/test/regressions/simulations-indépendant.yaml +++ b/mon-entreprise/test/regressions/simulations-indépendant.yaml @@ -44,32 +44,38 @@ impôt sur le revenu: impôt . méthode de calcul: "'taux personnalisé'" impôt . taux personnalisé: 10% -Contrats Madelin: +cotisations facultatives: # Cas retraite: la cotisation Madelin est inferieure au plafond => le revenu net de # cotisations (résultat comptable) n'est pas affecté car l'assiette des # cotisations ne change pas: - dirigeant . rémunération . totale: 30000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 3800 €/an # plafond: 10% PSS donc environ 4100 + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 3800 €/an # plafond: 10% PSS donc environ 4100 # Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de # cotisations est affecté car l'assiette des cotisations est plus élevée - dirigeant . rémunération . totale: 30000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 5000 €/an # plafond: 10% PSS donc environ 4100 + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 5000 €/an # plafond: 10% PSS donc environ 4100 # Cas mutuelle - dirigeant . rémunération . totale: 30000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 1000 €/an + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1000 €/an # Cas global madelin faible - dirigeant . rémunération . totale: 20000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 200 €/an - dirigeant . indépendant . contrats madelin . retraite: 300 €/an + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 200 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 300 €/an # Cas global madelin grand (plafonds calculés différemment) - dirigeant . rémunération . totale: 300000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 1500 €/an - dirigeant . indépendant . contrats madelin . retraite: 5000 €/an + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an + # Cas madelin + PER grand + - dirigeant . rémunération . totale: 300000 €/an + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . PER: 3500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an imposition à l'IS : diff --git a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml index 9b8022c94..8657737e4 100644 --- a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml +++ b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml @@ -46,34 +46,40 @@ Contrats Madelin: # cotisations ne change pas: - dirigeant . rémunération . totale: 30000 €/an entreprise . charges: 10000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 3800 €/an # plafond: 10% PSS donc environ 4100 + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 3800 €/an # plafond: 10% PSS donc environ 4100 # Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de # cotisations est affecté car l'assiette des cotisations est plus élevée - dirigeant . rémunération . totale: 30000 €/an entreprise . charges: 10000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 5000 €/an # plafond: 10% PSS donc environ 4100 + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 5000 €/an # plafond: 10% PSS donc environ 4100 # Cas mutuelle - dirigeant . rémunération . totale: 30000 €/an entreprise . charges: 10000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 1000 €/an + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1000 €/an # Cas global madelin faible - dirigeant . rémunération . totale: 20000 €/an entreprise . charges: 1000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 200 €/an + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 200 €/an dirigeant . indépendant . contrats madelin . retraite: 300 €/an # Cas global madelin grand (plafonds calculés différemment) - dirigeant . rémunération . totale: 300000 €/an entreprise . charges: 15000 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 1500 €/an - dirigeant . indépendant . contrats madelin . retraite: 5000 €/an + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an # Cas charges plus faibles que total madelin - dirigeant . rémunération . totale: 20000 €/an entreprise . charges: 500 €/an - dirigeant . indépendant . contrats madelin: oui - dirigeant . indépendant . contrats madelin . mutuelle: 300 €/an - dirigeant . indépendant . contrats madelin . retraite: 300 €/an + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 300 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 300 €/an + # PER + - dirigeant . rémunération . totale: 20000 €/an + dirigeant . indépendant . cotisations facultatives: oui + dirigeant . indépendant . cotisations facultatives . PER: 5500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 900 €/an From 3b4210c27a1fd560a018b411265384e96cd177e8 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 20 May 2021 17:45:48 +0200 Subject: [PATCH 176/319] =?UTF-8?q?:green=5Fheart:=20r=C3=A9pare=20les=20t?= =?UTF-8?q?ests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/locales/rules-en.yaml | 280 +++++++++++------- .../__snapshots__/simulations.jest.js.snap | 37 ++- .../simulations-rémunération-dirigeant.yaml | 2 +- 3 files changed, 198 insertions(+), 121 deletions(-) diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 4d70bf5e4..e60bc0c4c 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -226,6 +226,10 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: titre.en: '[automatic] total social charges' titre.fr: total charges sociale aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles: + description.en: '[automatic] Deductible compulsory contributions, useful for + calculating the CSG/CRDS base' + description.fr: Cotisations obligatoires déductibles, utile pour calculer + l'assiette de la CSG/CRDS titre.en: '[automatic] deductible mandatory contributions' titre.fr: cotisations obligatoires déductibles aide déclaration revenu indépendant 2020 . formulaire 2033: @@ -255,6 +259,11 @@ aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 252: résumé.fr: Charges sociales (+) titre.en: '[automatic] heading 252' titre.fr: rubrique 252 +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 324: + résumé.en: '[automatic] Non-deductible taxes' + résumé.fr: Impôts et taxes non déductibles + titre.en: '[automatic] heading 324' + titre.fr: rubrique 324 aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 325: résumé.en: '[automatic] Of which, deductible amount of optional contributions paid in application of I of Article 154 bis of the CGI of which optional @@ -271,18 +280,33 @@ aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 326: résumé.fr: Dont montant déductible des cotisations sociales obligatoires hors CSG-CRDS titre.en: '[automatic] heading 326' titre.fr: rubrique 326 +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 327: + résumé.en: '[automatic] Of which, voluntary contributions to new retirement + savings plans' + résumé.fr: Dont cotisations facultatives aux nouveaux plans d'épargne retraite + titre.en: '[automatic] heading 327' + titre.fr: rubrique 327 +aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 330: + description.en: + "[automatic] Also add back the amounts specified [page 8 of the + dedicated + notice](https://www.impots.gouv.fr/portail/files/formulaires/2033-sd/2019/2\ + 033-sd_2570.pdf#page=8)" + description.fr: + Réintégrer également les montants spécifiés [page 8 de la notice + dédiée](https://www.impots.gouv.fr/portail/files/formulaires/2033-sd/2019/2033-sd_2570.pdf#page=8) + résumé.en: '[automatic] Miscellaneous to be added back (+)' + résumé.fr: Divers à réintégrer (+) + titre.en: '[automatic] section 330' + titre.fr: rubrique 330 aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 380: résumé.en: '[automatic] Compulsory personal contributions of the operator' résumé.fr: Cotisations personnelles obligatoires de l'exploitant titre.en: '[automatic] item 380' titre.fr: rubrique 380 aide déclaration revenu indépendant 2020 . formulaire 2033 . rubrique 381: - description.en: '[automatic] Add optional contributions to new retirement - savings plans if necessary (327)' - description.fr: Ajoutez le montant des cotisations facultatives aux nouveaux - plans d'épargne retraite si nécessaire (327) - résumé.en: '[automatic] Optional supplementary premiums and contributions (+)' - résumé.fr: Primes et cotisations complémentaires facultatives (+) + résumé.en: '[automatic] Optional supplementary premiums and contributions' + résumé.fr: Primes et cotisations complémentaires facultatives titre.en: '[automatic] heading 381' titre.fr: rubrique 381 aide déclaration revenu indépendant 2020 . formulaire 2035: @@ -291,13 +315,8 @@ aide déclaration revenu indépendant 2020 . formulaire 2035: titre.en: '[automatic] form 2035-A-SD' titre.fr: formulaire 2035-A-SD aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BK: - description.en: '[automatic] The BU heading is not taken into account here. It - must be added to this amount if it is not zero.' - description.fr: - La rubrique BU n'est pas prise en compte ici. Il faut l'ajouter - à ce montant si elle est non nulle. - résumé.en: '[automatic] Personal social charges (+)' - résumé.fr: Charges sociales personnelles (+) + résumé.en: '[automatic] Personal social charges' + résumé.fr: Charges sociales personnelles titre.en: '[automatic] BK section' titre.fr: rubrique BK aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BS: @@ -314,6 +333,11 @@ aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BT: résumé.fr: Dont obligatoires titre.en: '[automatic] LV section' titre.fr: rubrique BT +aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BU: + résumé.en: '[automatic] Of which, optional to new retirement savings plans' + résumé.fr: Dont facultatives aux nouveaux plans d’épargne retraite + titre.en: '[automatic] BU section' + titre.fr: rubrique BU aide déclaration revenu indépendant 2020 . formulaire 2035 . rubrique BV: résumé.en: '[automatic] Deductible generalized social contribution' résumé.fr: Contribution sociale généralisée déductible @@ -344,10 +368,8 @@ aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSCA: titre.en: '[automatic] DSCA / DSCB section' titre.fr: rubrique DSCA / DSCB aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSEA: - description.en: '[automatic] Add the amounts paid into the new supplementary savings plans' - description.fr: Ajoutez les sommes versées sur les nouveaux plans d'épargne complémentaire - résumé.en: '[automatic] Optional contributions (+)' - résumé.fr: Cotisations facultatives (+) + résumé.en: '[automatic] Optional contributions' + résumé.fr: Cotisations facultatives titre.en: '[automatic] DSEA / DSEB section' titre.fr: rubrique DSEA / DSEB aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSIA: @@ -366,11 +388,8 @@ aide déclaration revenu indépendant 2020 . formulaire 2050: titre.en: '[automatic] form 2052-SD and 2053-SD' titre.fr: formulaire 2052-SD et 2053-SD aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A2: - description.en: '[automatic] Add amounts paid into new supplementary savings plans (A8)' - description.fr: Ajoutez les sommes versées sur les nouveaux plans d'épargne - complémentaire (A8) - résumé.en: '[automatic] Personal contributions of the operator (+)' - résumé.fr: Cotisations personnelles de l'exploitant (+) + résumé.en: "[automatic] Operator's personal contributions" + résumé.fr: Cotisations personnelles de l'exploitant titre.en: '[automatic] item A2' titre.fr: rubrique A2 aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A5: @@ -380,11 +399,8 @@ aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A5: titre.en: '[automatic] section A5' titre.fr: rubrique A5 aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A6: - description.en: '[automatic] Add amounts paid into new supplementary savings plans (A8)' - description.fr: Ajoutez les sommes versées sur les nouveaux plans d'épargne - complémentaire (A8) - résumé.en: '[automatic] Optional personal supplementary premiums and contributions (+)' - résumé.fr: Primes et cotisations complémentaires personnelles facultatives (+) + résumé.en: '[automatic] Optional personal supplementary premiums and contributions' + résumé.fr: Primes et cotisations complémentaires personnelles facultatives titre.en: '[automatic] heading A6' titre.fr: rubrique A6 aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A7: @@ -392,6 +408,12 @@ aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A7: résumé.fr: Dont cotisations facultatives Madelin titre.en: '[automatic] section A7' titre.fr: rubrique A7 +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique A8: + résumé.en: '[automatic] Of which, voluntary contributions to new retirement + savings plans' + résumé.fr: Dont cotisations facultatives aux nouveaux plans d'épargne retraite + titre.en: '[automatic] item A8' + titre.fr: rubrique A8 aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FY: description.en: > [automatic] If your business employs employees, add to this amount the total @@ -416,6 +438,16 @@ aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique FZ: résumé.fr: Charges sociales (+) titre.en: '[automatic] section FZ' titre.fr: rubrique FZ +aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique WQ: + description.en: "[automatic] Add all reinstatements listed on [page 9 of the + record](https://www.impots.gouv.fr/portail/files/formulaires/2032-not-sd/20\ + 20/2032-not-sd_2959.pdf#page=9)" + description.fr: Ajouter toutes les réintégrations listée dans la [page 9 de la + notice](https://www.impots.gouv.fr/portail/files/formulaires/2032-not-sd/2020/2032-not-sd_2959.pdf#page=9) + résumé.en: '[automatic] Miscellaneous reinstatements (+)' + résumé.fr: Réintégrations diverses (+) + titre.en: '[automatic] WQ section' + titre.fr: rubrique WQ aide déclaration revenu indépendant 2020 . informations: titre.en: '[automatic] information' titre.fr: informations @@ -1113,9 +1145,6 @@ aide déclaration revenu indépendant 2020 . régime d'imposition . réel . norm aide déclaration revenu indépendant 2020 . rémunération déductible: titre.en: '[automatic] deductible remuneration' titre.fr: rémunération déductible -aide déclaration revenu indépendant 2020 . total charges sociales déductibles: - titre.en: '[automatic] tax-deductible mandatory social security charges' - titre.fr: charges sociales obligatoires déductibles fiscalement artiste-auteur: description.en: The artist-author regime description.fr: Le régime des artistes-auteurs @@ -6453,83 +6482,6 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . assiette: ? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite de base : titre.en: basic retirement titre.fr: retraite de base -dirigeant . indépendant . contrats madelin: - question.en: > - [automatic] Have you subscribed to a private provident and/or supplementary - pension contract known as a "Madelin contract"? - question.fr: > - Avez-vous souscrit à un contrat de prévoyance et / ou de retraite - complémentaire privé dits « contrat Madelin » - titre.en: Madelin Contracts - titre.fr: Contrats Madelin -dirigeant . indépendant . contrats madelin . montant: - titre.en: Sum of subscriptions to Madelin contracts - titre.fr: Somme des cotisations à contrats Madelin -dirigeant . indépendant . contrats madelin . mutuelle: - description.en: > - [automatic] If you contribute to a supplementary insurance contract (health, - loss of employment) - - under the Madelin law, you can deduct these contributions from the taxable profits - - that you declare for your self-employed activity. - description.fr: > - Si vous cotisez au titre d'un contrat de prévoyance complémentaire (santé, - perte d'emploi subie) - - de type loi Madelin, vous pouvez déduire ces cotisations des bénéfices - - imposables que vous déclarez pour votre activité non salariée. - question.en: '[automatic] How much do you pay for your Madelin supplementary - insurance policies (health, sudden loss of employment)?' - question.fr: Quel est le montant que vous versez pour vos contrats Madelin de - prévoyance complémentaire (santé, perte d'emploi subie) ? - titre.en: '[automatic] Subscribing to a Madelin supplementary insurance contract' - titre.fr: Souscription à un contrat de prévoyance complémentaire Madelin -dirigeant . indépendant . contrats madelin . mutuelle . plafond: - note.en: > - [automatic] Normally it is the tax result that should be used for the cap - base, but business income is used to avoid a cycle. - note.fr: > - Normalement c'est le résultat fiscal qui devrait être utilisé pour - l'assiette du plafond, mais on utilise le revenu professionnel pour éviter - un cycle. - titre.en: ceiling - titre.fr: plafond -dirigeant . indépendant . contrats madelin . part déductible fiscalement: - titre.en: Part of the Madelin contract subscription which is fiscally deductible - titre.fr: Part de la cotisation à contrat Madelin qui est déductible fiscalement -dirigeant . indépendant . contrats madelin . part non-déductible fiscalement: - titre.en: Part of the Madelin contract subscription which is not fiscally deductible - titre.fr: Part de la cotisation à contrat Madelin qui n'est pas déductible fiscalement -dirigeant . indépendant . contrats madelin . retraite: - description.en: > - [automatic] If you are contributing under a pension contract such as the - Madelin law, - - you can deduct part of these contributions from your profits; and - - taxable persons that you declare for your self-employed activity. - description.fr: | - Si vous cotisez au titre d'un contrat retraite de type loi Madelin, - vous pouvez déduire une partie de ces cotisations des bénéfices - imposables que vous déclarez pour votre activité non salariée. - question.en: '[automatic] How much do you pay for your Madelin supplementary - pension contract?' - question.fr: Quel est le montant que vous versez pour votre contrat Madelin - retraite complémentaire ? - titre.en: '[automatic] Madelin Retirement Subscription' - titre.fr: Souscription à une retraite Madelin -dirigeant . indépendant . contrats madelin . retraite . plafond: - note.en: > - [automatic] Normally it is the tax result that should be used for the cap - base, but business income is used to avoid a cycle. - note.fr: > - Normalement c'est le résultat fiscal qui devrait être utilisé pour - l'assiette du plafond, mais on utilise le revenu professionnel pour éviter - un cycle. - titre.en: ceiling - titre.fr: plafond dirigeant . indépendant . cotisations et contributions: description.en: '[automatic] ' description.fr: | @@ -6914,6 +6866,120 @@ dirigeant . indépendant . cotisations et contributions . régularisation: (attention cependant, vous serez tenus de faire une estimation précise). titre.en: '[automatic] How the adjustment of provisional contributions works' titre.fr: Comment fonctionne la régularisation des cotisations provisionnelles +dirigeant . indépendant . cotisations facultatives: + description.en: > + [automatic] It is possible for the self-employed to subscribe to private + contracts for complementary health care or a retirement savings plan. + + Payments to these contracts are designated as "optional contributions" by the tax authorities. + + + They are tax deductible (up to a limit), but not deductible for the basis of social contributions. + description.fr: > + Il est possible pour l'indépendant de souscrire à des contrats privés pour + la complémentaire santé, ou un plan d'épargne retraite. + + Les versements à ces contrats sont désigné par l'appellation "cotisations facultative" par l'administration fiscale. + + + Ils sont déductible d'impôts (dans la limite d'un plafond), mais non déductible pour l'assiette des cotisations et contributions sociales. + question.en: '[automatic] Have you subscribed to any private provident and/or + supplementary pension contracts (Madelin contracts, retirement savings + plans)?' + question.fr: + Avez-vous souscrit à des contrats de prévoyance et / ou de retraite + complémentaire privés (contrats Madelin, plans d'épargne retraite) ? + titre.en: '[automatic] optional contributions' + titre.fr: cotisations facultatives +dirigeant . indépendant . cotisations facultatives . PER: + description.en: '[automatic] The individual PER is open to everyone. You can + subscribe to it with a financial institution or an insurance company. This + new plan is the successor to the PERP and Madelin contracts, which will no + longer be offered from 1 October 2020. Your savings accumulated on the Perp + and Madelin can be transferred to the individual PER at your request. This + contract entitles you to tax benefits and your rights are transferable to + the other PERs. There are cases of early release.' + description.fr: Le PER individuel est ouvert à tous. Vous pouvez le souscrire + auprès d'un établissement financier ou d'un organisme d'assurance. Ce + nouveau plan succède au PERP et au contrat Madelin, qui ne seront plus + proposés à partir du 1er octobre 2020. Votre épargne accumulée sur le Perp + et le Madelin peut être à votre demande transférée sur le PER individuel. Ce + contrat donne droit à des avantages fiscaux et vos droits sont transférables + vers les autres PER. Il y a des cas de déblocage anticipé. + question.en: '[automatic] How much do you contribute to a PER (new retirement + savings plan, as of October 1, 2019)?' + question.fr: Quel est le montant des cotisations que vous versez dans le cadre + d'un PER (nouveau plan épargne retraite, depuis le 1er octobre 2019) ? + titre.en: '[automatic] Retirement savings plan' + titre.fr: Plan d'épargne retraite +dirigeant . indépendant . cotisations facultatives . contrats madelin: + titre.en: '[automatic] Sum of contributions to Madelin contracts' + titre.fr: Somme des cotisations à contrats Madelin +? dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance +: description.en: > + [automatic] If you contribute to a supplementary insurance contract (health, + loss of employment) + + under the Madelin law, you can deduct these contributions from the taxable profits + + that you declare for your self-employed activity. + description.fr: > + Si vous cotisez au titre d'un contrat de prévoyance complémentaire (santé, + perte d'emploi subie) + + de type loi Madelin, vous pouvez déduire ces cotisations des bénéfices + + imposables que vous déclarez pour votre activité non salariée. + question.en: '[automatic] How much do you pay for your Madelin supplementary + insurance policies (health, sudden loss of employment)?' + question.fr: Quel est le montant que vous versez pour vos contrats Madelin de + prévoyance complémentaire (santé, perte d'emploi subie) ? + titre.en: '[automatic] Subscribing to a Madelin supplementary insurance contract' + titre.fr: Souscription à un contrat de prévoyance complémentaire Madelin +? dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite +: description.en: | + [automatic] If you contribute to a Madelin-type retirement contract + you can deduct part of these contributions from the taxable profits + that you declare for your self-employed activity. + description.fr: | + Si vous cotisez au titre d'un contrat retraite de type loi Madelin, + vous pouvez déduire une partie de ces cotisations des bénéfices + imposables que vous déclarez pour votre activité non salariée. + question.en: '[automatic] How much do you pay for your Madelin supplementary + pension contract?' + question.fr: Quel est le montant que vous versez pour votre contrat Madelin + retraite complémentaire ? + titre.en: '[automatic] Subscription to a Madelin pension' + titre.fr: Souscription à une retraite Madelin +dirigeant . indépendant . cotisations facultatives . déductibles: + titre.en: '[automatic] Tax-deductible portion of voluntary contributions' + titre.fr: Part des cotisations facultatives déductible fiscalement +dirigeant . indépendant . cotisations facultatives . non déductibles: + titre.en: '[automatic] Non-deductible portion of voluntary contributions' + titre.fr: Part des cotisations facultatives non déductible fiscalement +dirigeant . indépendant . cotisations facultatives . plafond prévoyance: + note.en: > + [automatic] Normally it is the tax result that should be used for the basis + of the ceiling, but we use the professional income to avoid a cycle. + note.fr: > + Normalement c'est le résultat fiscal qui devrait être utilisé pour + l'assiette du plafond, mais on utilise le revenu professionnel pour éviter + un cycle. + titre.en: '[automatic] planning ceiling' + titre.fr: plafond prévoyance +? dirigeant . indépendant . cotisations facultatives . plafond retraite complémentaire +: note.en: > + [automatic] Normally it is the tax result that should be used for the basis + of the ceiling, but we use the professional income to avoid a cycle. + note.fr: > + Normalement c'est le résultat fiscal qui devrait être utilisé pour + l'assiette du plafond, mais on utilise le revenu professionnel pour éviter + un cycle. + titre.en: '[automatic] supplementary pension ceiling' + titre.fr: plafond retraite complémentaire +dirigeant . indépendant . cotisations facultatives . total: + titre.en: '[automatic] Total optional contributions' + titre.fr: Total des cotisations facultatives dirigeant . indépendant . revenu professionnel: description.en: "[automatic] remuneration of the manager under the self-employed diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 565132231..8c8a09553 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -202,25 +202,30 @@ exports[`calculate simulations-impot-société: prorata temporis 3`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: Contrats Madelin 1`] = `"[30000,13180,16820,17883,467,16353,0,30000,7072]"`; - -exports[`calculate simulations-indépendant: Contrats Madelin 2`] = `"[30000,14380,15620,17883,467,15153,0,30000,8272]"`; - -exports[`calculate simulations-indépendant: Contrats Madelin 3`] = `"[30000,10379,19621,20433,875,18746,0,30000,4272]"`; - -exports[`calculate simulations-indépendant: Contrats Madelin 4`] = `"[20000,6730,13270,13810,0,13270,0,20000,3772]"`; - -exports[`calculate simulations-indépendant: Contrats Madelin 5`] = ` -"[300000,79622,220378,228521,82429,137949,0,300000,9772] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" -`; - exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3272]"`; exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000,20787,931,19069,0,29084,3272]"`; exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,931,19069,0,29100,3288]"`; +exports[`calculate simulations-indépendant: cotisations facultatives 1`] = `"[30000,13180,16820,17883,467,16353,0,30000,7072]"`; + +exports[`calculate simulations-indépendant: cotisations facultatives 2`] = `"[30000,14380,15620,17883,467,15153,0,30000,8272]"`; + +exports[`calculate simulations-indépendant: cotisations facultatives 3`] = `"[30000,10379,19621,20433,875,18746,0,30000,4272]"`; + +exports[`calculate simulations-indépendant: cotisations facultatives 4`] = `"[20000,6730,13270,13810,0,13270,0,20000,3772]"`; + +exports[`calculate simulations-indépendant: cotisations facultatives 5`] = ` +"[300000,79622,220378,228521,82429,137949,0,300000,9772] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; + +exports[`calculate simulations-indépendant: cotisations facultatives 6`] = ` +"[300000,83122,216878,225021,80854,136024,0,300000,13272] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; + exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1372,1272,100,134,0,100,0,1372,3272]"`; exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246,3272]"`; @@ -391,6 +396,8 @@ exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Co exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 6`] = `"[917,10998,0,10651,4,20]"`; +exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): Contrats Madelin 7`] = `"[917,10998,0,10651,4,20]"`; + exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 1`] = `"[917,10998,0,10651,4,20]"`; exports[`calculate simulations-rémunération-dirigeant (assimilé salarié): activités 2`] = `"[917,10998,0,null,4,0]"`; @@ -451,6 +458,8 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 6`] = `"[0,17852,17852,2973,3,8]"`; +exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): Contrats Madelin 7`] = `"[0,17417,17417,2900,3,8]"`; + exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 1`] = `"[0,15580,15580,6600,4,18]"`; exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): activités 2`] = `"[0,15560,15560,null,4,0]"`; @@ -505,6 +514,8 @@ Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA d exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13170,0,9785,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 7`] = `"[0,6870,0,7778,4,21]"`; + exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13770,0,10085,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,null,4,0]"`; diff --git a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml index 8657737e4..b1cefd788 100644 --- a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml +++ b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml @@ -64,7 +64,7 @@ Contrats Madelin: entreprise . charges: 1000 €/an dirigeant . indépendant . cotisations facultatives: oui dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 200 €/an - dirigeant . indépendant . contrats madelin . retraite: 300 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 300 €/an # Cas global madelin grand (plafonds calculés différemment) - dirigeant . rémunération . totale: 300000 €/an entreprise . charges: 15000 €/an From 2752e0a424cccf8acbaa4c0bff3b8cf18fcf0919 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 20 May 2021 17:56:03 +0200 Subject: [PATCH 177/319] =?UTF-8?q?Am=C3=A9liore=20le=20tracking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Gérer/AideDéclarationIndépendant/index.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 959966f4f..c6cf41cab 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -83,7 +83,11 @@ export default function AideDéclarationIndépendant() { - + {displayForm ? ( + + ) : ( + + )} {!situation['dirigeant . rémunération . totale'] && ( )} @@ -135,11 +139,6 @@ export default function AideDéclarationIndépendant() { )} - {displayForm ? ( - - ) : ( - - )} {displayForm && ( <> @@ -234,6 +233,7 @@ export default function AideDéclarationIndépendant() { + + From 47775c4321a016b005445e4b7c1db857a7e8b047 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 27 May 2021 13:59:54 +0200 Subject: [PATCH 178/319] =?UTF-8?q?:fire:=20D=C3=A9place=20le=20bloc=20R?= =?UTF-8?q?=C3=A9sultat=20de=20l'aide=20=C3=A0=20la=20d=C3=A9claration=20d?= =?UTF-8?q?ans=20un=20fichier=20s=C3=A9par=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RésultatsParFormulaire.tsx | 180 ++++++++++++++++++ .../AideDéclarationIndépendant/index.tsx | 170 +---------------- 2 files changed, 190 insertions(+), 160 deletions(-) create mode 100644 mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx new file mode 100644 index 000000000..cff063b8c --- /dev/null +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx @@ -0,0 +1,180 @@ +import { Explicable } from 'Components/conversation/Explicable' +import Value, { Condition } from 'Components/EngineValue' +import RuleLink from 'Components/RuleLink' +import Animate from 'Components/ui/animate' +import { useEngine } from 'Components/utils/EngineContext' +import { Markdown } from 'Components/utils/markdown' +import { DottedName } from 'modele-social' +import { useMemo } from 'react' +import emoji from 'react-easy-emoji' +import { Trans } from 'react-i18next' +import styled from 'styled-components' + +export default function ResultatsParFormulaire() { + const engine = useEngine() + const informations = (Object.keys(engine.getParsedRules()) as DottedName[]) + .filter((s) => + s.startsWith('aide déclaration revenu indépendant 2020 . informations . ') + ) + .map((dottedName) => engine.getRule(dottedName)) + return ( +
    +
    +

    + {emoji('📄')}{' '} + + Vos déclarations fiscales + +

    +

    + Important : les montants affichés ici concernent uniquement le calcul + des cotisations de l'exploitant (et du conjoint collaborateur si + présent). Les rubriques avec le symbole (+) signifient qu'il vous + faudra peut-être ajouter d'autres éléments au montant affiché pour une + déclaration correcte.{' '} +

    +

    En cas de doute, référez-vous à votre expert comptable.

    + {([ + 'aide déclaration revenu indépendant 2020 . formulaire 2035', + 'aide déclaration revenu indépendant 2020 . formulaire 2033', + 'aide déclaration revenu indépendant 2020 . formulaire 2050', + 'aide déclaration revenu indépendant 2020 . formulaire 2042', + ] as const).map((dottedName) => ( + + ))} + +

    {emoji('ℹ️')} Pour votre information

    +
    + {informations.map((r) => ( + + +
    +

    + +
    + {r.rawNode.résumé} +

    + + {r.rawNode.description && ( +
    + +
    + )} +

    + +

    +
    +
    +
    + ))} +
    +
    +
    +
    + ) +} + +function DeclarationForm({ dottedName }: { dottedName: DottedName }) { + const engine = useEngine() + const r = engine.getRule(dottedName) + const rubriques = useMemo( + () => + Object.keys(engine.getParsedRules()).filter((name) => + name.startsWith(dottedName + ' . ') + ), + [engine, dottedName] + ) as DottedName[] + return ( + + +
    +

    + {r.title} {r.rawNode.résumé} +

    +
      + {rubriques + .map((dottedName) => engine.getRule(dottedName)) + .map((node) => ( + + +
    • + + {node.rawNode.résumé} + {node.rawNode.description && ( + +
      + +
      +
      + )} +
      +
      + + {node.title} :{' '} + + {' '} + {/* + */} +
    • +
      +
      + ))} +
    +
    +
    +
    + ) +} + +const FormBlock = styled.section` + max-width: 500px; + padding: 0; + + h3 { + margin-top: 2rem; + } + h2 { + border-top: 1px solid var(--lighterColor); + padding-top: 2rem; + break-after: avoid; + } + + select, + input[type='text'] { + font-size: 1.05em; + padding: 5px 10px; + } + ul { + padding: 0; + margin: 0; + } +` diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index c6cf41cab..b4aa09855 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -1,20 +1,14 @@ import { updateSituation } from 'Actions/actions' import Aide from 'Components/conversation/Aide' -import { Explicable } from 'Components/conversation/Explicable' import RuleInput from 'Components/conversation/RuleInput' -import Value, { Condition } from 'Components/EngineValue' +import { Condition } from 'Components/EngineValue' import PageHeader from 'Components/PageHeader' import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' -import RuleLink from 'Components/RuleLink' import 'Components/TargetSelection.css' import Animate from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' -import { EngineContext, useEngine } from 'Components/utils/EngineContext' -import { Markdown } from 'Components/utils/markdown' import useSimulationConfig from 'Components/utils/useSimulationConfig' -import { DottedName } from 'modele-social' -import { useCallback, useContext, useMemo } from 'react' -import emoji from 'react-easy-emoji' +import { useCallback } from 'react' import { Trans } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' import { RootState } from 'Reducers/rootReducer' @@ -25,6 +19,7 @@ import { CompanySection } from '../Home' import simulationConfig from './config.yaml' import { ExplicationsResultatFiscal } from './ExplicationResultatFiscal' import { SimpleField, SubSection } from './Fields' +import ResultatsParFormulaire from './RésultatsParFormulaire' import illustration from './undraw_fill_in_mie5.svg' export default function AideDéclarationIndépendant() { useSimulationConfig(simulationConfig) @@ -243,7 +238,7 @@ export default function AideDéclarationIndépendant() { }} > - + @@ -252,150 +247,12 @@ export default function AideDéclarationIndépendant() { ) } -function Results() { - const engine = useEngine() - const informations = (Object.keys(engine.getParsedRules()) as DottedName[]) - .filter((s) => - s.startsWith('aide déclaration revenu indépendant 2020 . informations . ') - ) - .map((dottedName) => engine.getRule(dottedName)) - return ( -
    -
    -

    - {emoji('📄')}{' '} - - Vos déclarations fiscales - -

    -

    - Important : les montants affichés ici concernent uniquement le calcul - des cotisations de l'exploitant (et du conjoint collaborateur si - présent). Les rubriques avec le symbole (+) signifient qu'il vous - faudra peut-être ajouter d'autres éléments au montant affiché pour une - déclaration correcte.{' '} -

    -

    En cas de doute, référez-vous à votre expert comptable.

    - {([ - 'aide déclaration revenu indépendant 2020 . formulaire 2035', - 'aide déclaration revenu indépendant 2020 . formulaire 2033', - 'aide déclaration revenu indépendant 2020 . formulaire 2050', - 'aide déclaration revenu indépendant 2020 . formulaire 2042', - ] as const).map((dottedName) => ( - - ))} - -

    {emoji('ℹ️')} Pour votre information

    -
    - {informations.map((r) => ( - - -
    -

    - -
    - {r.rawNode.résumé} -

    - - {r.rawNode.description && ( -
    - -
    - )} -

    - -

    -
    -
    -
    - ))} -
    -
    -
    -
    - ) -} - -function DeclarationForm({ dottedName }: { dottedName: DottedName }) { - const engine = useContext(EngineContext) - const r = engine.getRule(dottedName) - const rubriques = useMemo( - () => - Object.keys(engine.getParsedRules()).filter((name) => - name.startsWith(dottedName + ' . ') - ), - [engine, dottedName] - ) - return ( - - -
    -

    - {r.title} {r.rawNode.résumé} -

    -
      - {rubriques - .map((dottedName) => engine.getRule(dottedName)) - .map((node) => ( - - -
    • - - {node.rawNode.résumé} - {node.rawNode.description && ( - -
      - -
      -
      - )} -
      -
      - - {node.title} :{' '} - - {' '} - {/* - */} -
    • -
      -
      - ))} -
    -
    -
    -
    - ) -} +export const Question = styled.div` + margin-top: 1em; +` +const BigInput = styled.div` + font-size: 130%; +` const FormBlock = styled.section` max-width: 500px; @@ -420,10 +277,3 @@ const FormBlock = styled.section` margin: 0; } ` - -export const Question = styled.div` - margin-top: 1em; -` -const BigInput = styled.div` - font-size: 130%; -` From 22abf17a508a0f8d88f0d94961c6b01bc99e0a97 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 27 May 2021 15:26:06 +0200 Subject: [PATCH 179/319] =?UTF-8?q?:fire:=20Retour=20=C3=A0=20la=20version?= =?UTF-8?q?=20d'origine=20des=20r=C3=A9sultats=20du=20formulaire=20d'aide?= =?UTF-8?q?=20=C3=A0=20la=20d=C3=A9claration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Suite aux retours Acoss La version améliorée a été cachée sous un feature flag --- modele-social/règles/dirigeant.yaml | 1 + .../déclaration-revenu-indépendant.yaml | 115 ++++++++-- mon-entreprise/source/locales/rules-en.yaml | 128 ++++++++--- .../FormulaireRésultatComplet.tsx | 0 .../RésultatSimple.tsx | 146 +++++++++++++ .../RésultatsParFormulaire.tsx | 25 --- .../AideDéclarationIndépendant/config.yaml | 1 - .../AideDéclarationIndépendant/index.tsx | 182 +++++++++------- .../__snapshots__/simulations.jest.js.snap | 200 +++++++++--------- .../regressions/simulations-indépendant.yaml | 12 +- .../simulations-rémunération-dirigeant.yaml | 14 +- 11 files changed, 561 insertions(+), 263 deletions(-) create mode 100644 mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/FormulaireRésultatComplet.tsx create mode 100644 mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 6bdf87e6e..efac6cb99 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -1199,6 +1199,7 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette plancher: 0 €/mois dirigeant . indépendant . cotisations et contributions . formation professionnelle: + acronyme: CFP produit: assiette: plafond sécurité sociale temps plein taux: diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index cefc3f58d..665b98fb6 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -11,6 +11,7 @@ aide déclaration revenu indépendant 2020: aide déclaration revenu indépendant 2020 . comptabilité: titre: régime de la déclaration contrôlée + non applicable si: entreprise . imposition . IS question: Quel méthode de gestion de la comptabilité est utilisée pour l'entreprise ? formule: une possibilité: @@ -20,18 +21,39 @@ aide déclaration revenu indépendant 2020 . comptabilité: - trésorerie aide déclaration revenu indépendant 2020 . comptabilité . trésorerie: - remplace: - règle: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible - par: CSG non déductible + CRDS valeur: comptabilité = 'trésorerie' titre: comptabilité de trésorerie -aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . total charges sociale: +aide déclaration revenu indépendant 2020 . comptabilité . engagement: + valeur: comptabilité = 'engagement' + titre: comptabilité d'engagement + + +aide déclaration revenu indépendant 2020 . cotisations payées: + remplace: + - règle: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible + par: CSG non déductible + CRDS + - règle: aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires + par: + valeur: cotisations payées . total charges sociale + abattement: + somme: + - dirigeant . indépendant . cotisations et contributions . formation professionnelle + - CSG non déductible + - CRDS + - CSG déductible + applicable si: + une de ces conditions: + - comptabilité . trésorerie + - entreprise . imposition . IS + valeur: oui + +aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociale: remplace: règle: dirigeant . indépendant . cotisations et contributions par: somme: - - comptabilité . trésorerie . total charges sociale + - cotisations payées . total charges sociale - dirigeant . indépendant . cotisations facultatives . total unité: €/an question: Quel est le montant total des cotisations et contributions sociales payées pendant l'exercice ? @@ -43,7 +65,7 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . total 3. Selectionnez "relevé de situation comptable" 4. Reportez dans ce champs le montant de la colonne "Cotisation", ligne "Année 2020" -aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG déductible: +aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductible: question: Quel est le montant total de CSG déductible payé cette année ? remplace: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible unité: €/an @@ -57,7 +79,7 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG d 4. Reportez dans ce champs le total de la colonne "Montant déductible CSG" (dernière ligne) -aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG non déductible: +aide déclaration revenu indépendant 2020 . cotisations payées . CSG non déductible: question: Quel est le montant total de CSG non déductible payé cette année ? unité: €/an description: | @@ -69,7 +91,7 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG n 3. Puis, "attestation CSG/CRDS" 4. Reportez dans ce champs le total de la colonne "Montant non déductible : CSG" (dernière ligne) -aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: +aide déclaration revenu indépendant 2020 . cotisations payées . CRDS: question: Quel est le montant total de CRDS payé cette année ? unité: €/an description: | @@ -81,19 +103,15 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: 3. Puis, "attestation CSG/CRDS" 4. Reportez dans ce champs le total de la colonne "Montant non déductible : CRDS" (dernière ligne) -aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . cotisations obligatoires déductibles: +aide déclaration revenu indépendant 2020 . cotisations payées . cotisations obligatoires déductibles: remplace: cotisations obligatoires déductibles unité: €/an - valeur: comptabilité . trésorerie . total charges sociale + valeur: cotisations payées . total charges sociale abattement: somme: - dirigeant . indépendant . cotisations et contributions . CSG et CRDS - dirigeant . indépendant . cotisations et contributions . formation professionnelle -aide déclaration revenu indépendant 2020 . comptabilité . engagement: - valeur: comptabilité = 'engagement' - titre: comptabilité d'engagement - aide déclaration revenu indépendant 2020 . régime d'imposition: oui aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée: @@ -743,21 +761,21 @@ aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSLA: résumé: Revenus étrangers imposables mais exonérés de CSG-CRDS formule: dirigeant . indépendant . revenus étrangers . montant -aide déclaration revenu indépendant 2020 . informations : +aide déclaration revenu indépendant 2020 . informations résultat par formulaire : applicable si: comptabilité . engagement valeur: oui -aide déclaration revenu indépendant 2020 . informations . réduction Covid: +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . réduction Covid: description: La réduction de cotisation applicable dans le cas du dispositif Covid valeur: réduction covid . total -aide déclaration revenu indépendant 2020 . informations . rémunération totale: +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération totale: titre: Total rémunération dirigeant résumé: '[A]' description: La rémunération "superbrute" du dirigeant, incluant toutes les cotisations et contributions sociales. valeur: dirigeant . rémunération . totale -aide déclaration revenu indépendant 2020 . informations . cotisations déductibles: +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations déductibles: résumé: '[C1]' description: "Cotisations et contributions sociales déductibles pour le calcul de l'assiette sociale" somme: @@ -765,7 +783,7 @@ aide déclaration revenu indépendant 2020 . informations . cotisations déducti - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible - dirigeant . indépendant . cotisations et contributions . formation professionnelle -aide déclaration revenu indépendant 2020 . informations . cotisations non déductibles: +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations non déductibles: résumé: '[C2]' description: Cotisations et contributions sociales non déductibles pour le calcul de l'assiette sociale valeur: @@ -773,13 +791,68 @@ aide déclaration revenu indépendant 2020 . informations . cotisations non déd - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible - dirigeant . indépendant . cotisations facultatives . total -aide déclaration revenu indépendant 2020 . informations . assiette sociale: +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . assiette sociale: résumé: '[A - C1]' description: Assiette utilisée pour le calcul des cotisations sociales. valeur: dirigeant . indépendant . assiette des cotisations -aide déclaration revenu indépendant 2020 . informations . rémunération nette: +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération nette: résumé: '[A - C1 - C2]' description: Le revenu net du dirigeant avant impôt sur le revenu. C'est la rémunération effectivement versée. valeur: dirigeant . rémunération . nette + + +aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal: + titre: revenu net fiscal + résumé: '[A]' + description: Résultat avant déduction des charges sociales et exonérations fiscales + valeur: dirigeant . rémunération . totale + +aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires: + titre: Cotisations sociales obligatoires déductibles + résumé: '[C]' + description: | + À reporter dans : + - **la case DSCA/DSCB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) + - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD + - **régime réel normal :** la rubrique A5 du formulaire 2053-SD + - **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD + unité: €/an + somme: + - dirigeant . indépendant . cotisations et contributions . cotisations + - dirigeant . indépendant . conjoint collaborateur . cotisations + références: + Notice impots.gouv.fr: https://www.impots.gouv.fr/portail/www2/fichiers/documentation/brochure/ir_2021/pdf_som/11-bis-decla_fusion_fisc_185a195.pdf + + + +aide déclaration revenu indépendant 2020 . résultat simple: oui +aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible: + titre: CSG déductible + résumé: '[B]' + description: "Montant de la CSG déductible à l'impôt sur le revenu" + valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible + +aide déclaration revenu indépendant 2020 . résultat simple . CFP: + résumé: '[D]' + description: Contribution à la formation professionnelle + valeur: dirigeant . indépendant . cotisations et contributions . formation professionnelle + +aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible: + titre: charges sociales obligatoires déductibles fiscalement + résumé: '[B + C + D]' + somme: + - CSG déductible + - cotisations obligatoires + - CFP + description: | + À reporter dans : + - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD + - **régime réel normal :** la rubrique FZ du formulaire 2052-SD + - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD + +aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale: + résumé: '[A - (B + C + D)]' + description: Assiette utilisée pour le calcul des cotisations sociales + valeur: dirigeant . indépendant . assiette des cotisations diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index e60bc0c4c..faee0861a 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -90,7 +90,17 @@ aide déclaration revenu indépendant 2020 . comptabilité . engagement: aide déclaration revenu indépendant 2020 . comptabilité . trésorerie: titre.en: '[automatic] cash accounting' titre.fr: comptabilité de trésorerie -aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: +aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles: + description.en: '[automatic] Deductible compulsory contributions, useful for + calculating the CSG/CRDS base' + description.fr: Cotisations obligatoires déductibles, utile pour calculer + l'assiette de la CSG/CRDS + titre.en: '[automatic] deductible mandatory contributions' + titre.fr: cotisations obligatoires déductibles +aide déclaration revenu indépendant 2020 . cotisations payées: + titre.en: '[automatic] contributions paid' + titre.fr: cotisations payées +aide déclaration revenu indépendant 2020 . cotisations payées . CRDS: description.en: > [automatic] You can find this amount in your personal Urssaf space. Here are the steps to follow: @@ -123,8 +133,8 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: question.fr: Quel est le montant total de CRDS payé cette année ? titre.en: '[automatic] CRDS' titre.fr: CRDS -? aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG déductible -: description.en: > +aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductible: + description.en: > [automatic] You can find this amount in your personal Urssaf space. Here are the steps to follow: @@ -156,7 +166,7 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: question.fr: Quel est le montant total de CSG déductible payé cette année ? titre.en: '[automatic] Deductible CSG' titre.fr: CSG déductible -? aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CSG non déductible +? aide déclaration revenu indépendant 2020 . cotisations payées . CSG non déductible : description.en: > [automatic] You can find this amount in your personal Urssaf space. Here are the steps to follow: @@ -189,10 +199,10 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: question.fr: Quel est le montant total de CSG non déductible payé cette année ? titre.en: '[automatic] Non-deductible CSG' titre.fr: CSG non déductible -? aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . cotisations obligatoires déductibles +? aide déclaration revenu indépendant 2020 . cotisations payées . cotisations obligatoires déductibles : titre.en: '[automatic] deductible mandatory contributions' titre.fr: cotisations obligatoires déductibles -? aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . total charges sociale +? aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociale : description.en: > [automatic] You can find this amount in your personal Urssaf space. Here are the steps to follow: @@ -225,13 +235,6 @@ aide déclaration revenu indépendant 2020 . comptabilité . trésorerie . CRDS: payées pendant l'exercice ? titre.en: '[automatic] total social charges' titre.fr: total charges sociale -aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles: - description.en: '[automatic] Deductible compulsory contributions, useful for - calculating the CSG/CRDS base' - description.fr: Cotisations obligatoires déductibles, utile pour calculer - l'assiette de la CSG/CRDS - titre.en: '[automatic] deductible mandatory contributions' - titre.fr: cotisations obligatoires déductibles aide déclaration revenu indépendant 2020 . formulaire 2033: résumé.en: '[automatic] Tax package for the simplified actual system' résumé.fr: Liasse fiscale du régime réel simplifié @@ -448,17 +451,17 @@ aide déclaration revenu indépendant 2020 . formulaire 2050 . rubrique WQ: résumé.fr: Réintégrations diverses (+) titre.en: '[automatic] WQ section' titre.fr: rubrique WQ -aide déclaration revenu indépendant 2020 . informations: - titre.en: '[automatic] information' - titre.fr: informations -aide déclaration revenu indépendant 2020 . informations . assiette sociale: - description.en: '[automatic] The base used to calculate social security contributions.' +aide déclaration revenu indépendant 2020 . informations résultat par formulaire: + titre.en: '[automatic] result information by form' + titre.fr: informations résultat par formulaire +? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . assiette sociale +: description.en: '[automatic] The base used to calculate social security contributions.' description.fr: Assiette utilisée pour le calcul des cotisations sociales. résumé.en: '[automatic] [A - C1]' résumé.fr: '[A - C1]' titre.en: '[automatic] social base' titre.fr: assiette sociale -? aide déclaration revenu indépendant 2020 . informations . cotisations déductibles +? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations déductibles : description.en: '[automatic] Deductible social contributions for the calculation of the social security base' @@ -469,7 +472,7 @@ aide déclaration revenu indépendant 2020 . informations . assiette sociale: résumé.fr: '[C1]' titre.en: '[automatic] deductible contributions' titre.fr: cotisations déductibles -? aide déclaration revenu indépendant 2020 . informations . cotisations non déductibles +? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations non déductibles : description.en: '[automatic] Non-deductible social contributions for the calculation of the social security base' description.fr: Cotisations et contributions sociales non déductibles pour le @@ -478,14 +481,14 @@ aide déclaration revenu indépendant 2020 . informations . assiette sociale: résumé.fr: '[C2]' titre.en: '[automatic] non-deductible contributions' titre.fr: cotisations non déductibles -aide déclaration revenu indépendant 2020 . informations . réduction Covid: - description.en: '[automatic] The contribution reduction applicable in the case +? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . réduction Covid +: description.en: '[automatic] The contribution reduction applicable in the case of the Covid scheme' description.fr: La réduction de cotisation applicable dans le cas du dispositif Covid titre.en: '[automatic] Covid discount' titre.fr: réduction Covid -aide déclaration revenu indépendant 2020 . informations . rémunération nette: - description.en: +? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération nette +: description.en: "[automatic] The executive's net income before income tax. This is the remuneration actually paid." description.fr: Le revenu net du dirigeant avant impôt sur le revenu. C'est la @@ -494,8 +497,8 @@ aide déclaration revenu indépendant 2020 . informations . rémunération nette résumé.fr: '[A - C1 - C2]' titre.en: '[automatic] net pay' titre.fr: rémunération nette -aide déclaration revenu indépendant 2020 . informations . rémunération totale: - description.en: '[automatic] The manager''s "superbrute" remuneration, +? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération totale +: description.en: '[automatic] The manager''s "superbrute" remuneration, including all social contributions.' description.fr: La rémunération "superbrute" du dirigeant, incluant toutes les cotisations et contributions sociales. @@ -1145,6 +1148,79 @@ aide déclaration revenu indépendant 2020 . régime d'imposition . réel . norm aide déclaration revenu indépendant 2020 . rémunération déductible: titre.en: '[automatic] deductible remuneration' titre.fr: rémunération déductible +aide déclaration revenu indépendant 2020 . résultat simple: + titre.en: '[automatic] simple result' + titre.fr: résultat simple +aide déclaration revenu indépendant 2020 . résultat simple . CFP: + description.en: '[automatic] Contribution to professional training' + description.fr: Contribution à la formation professionnelle + résumé.en: '[automatic] [D]' + résumé.fr: '[D]' + titre.en: '[automatic] PSC' + titre.fr: CFP +aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible: + description.en: '[automatic] Amount of CSG deductible from income tax' + description.fr: Montant de la CSG déductible à l'impôt sur le revenu + résumé.en: '[automatic] [B]' + résumé.fr: '[B]' + titre.en: '[automatic] Deductible CSG' + titre.fr: CSG déductible +aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale: + description.en: '[automatic] Basis for calculating social security contributions' + description.fr: Assiette utilisée pour le calcul des cotisations sociales + résumé.en: '[automatic] [A - (B + C + D)]' + résumé.fr: '[A - (B + C + D)]' + titre.en: '[automatic] social base' + titre.fr: assiette sociale +? aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires +: description.en: > + [automatic] To be reported in : + + - the DSCA/DSCB box** on the supplementary data form for the self-employed tax return (form 2042) + + - simplified actual system:** item 326 of form 2033-D-SD + + - normal actual regime:** item A5 of form 2053-SD + + - controlled declaration:** item BT of form 2035-A-SD + description.fr: > + À reporter dans : + + - **la case DSCA/DSCB** dans le formulaire de donnée complémentaire à la déclaration de revenus des indépendant (formulaire 2042) + + - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD + + - **régime réel normal :** la rubrique A5 du formulaire 2053-SD + + - **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD + résumé.en: '[automatic] [C]' + résumé.fr: '[C]' + titre.en: '[automatic] Deductible mandatory social security contributions' + titre.fr: Cotisations sociales obligatoires déductibles +aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal: + description.en: + '[automatic] Income before deduction of social security charges + and tax exemptions' + description.fr: Résultat avant déduction des charges sociales et exonérations fiscales + résumé.en: '[automatic] [A]' + résumé.fr: '[A]' + titre.en: '[automatic] net tax income' + titre.fr: revenu net fiscal +? aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible +: description.en: | + [automatic] To be reported in : + - simplified actual system:** item 252 of form 2033-B-SD + - normal real system:** item FZ of form 2052-SD + - controlled declaration:** item BK of form 2035-A-SD + description.fr: | + À reporter dans : + - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD + - **régime réel normal :** la rubrique FZ du formulaire 2052-SD + - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD + résumé.en: '[automatic] [B + C + D]' + résumé.fr: '[B + C + D]' + titre.en: '[automatic] tax-deductible mandatory social security charges' + titre.fr: charges sociales obligatoires déductibles fiscalement artiste-auteur: description.en: The artist-author regime description.fr: Le régime des artistes-auteurs diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/FormulaireRésultatComplet.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/FormulaireRésultatComplet.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx new file mode 100644 index 000000000..e036d2062 --- /dev/null +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx @@ -0,0 +1,146 @@ +import Value, { Condition } from 'Components/EngineValue' +import RuleLink from 'Components/RuleLink' +import Animate from 'Components/ui/animate' +import { useEngine } from 'Components/utils/EngineContext' +import { Markdown } from 'Components/utils/markdown' +import emoji from 'react-easy-emoji' +import { Trans } from 'react-i18next' + +export default function ResultatsSimples() { + const engine = useEngine() + + return ( +
    +
    +

    + {emoji('📄')}{' '} + + Montants à reporter dans votre déclaration de revenus + +

    +

    + L'ancienne Déclaration Sociale des Indépendant (DSI) qui était + précédemment à effectuer sur le site net-entreprises.fr est désormais + intégrée à la déclaration fiscale des revenus (déclaration 2042) sur + impots.gouv.fr.{' '} + + En savoir plus + +

    +

    + Vous pouvez reporter les montants suivants dans votre déclaration, + calculés à partir des informations saisies. +

    + {([ + 'aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires', + 'aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible', + ] as const).map((dottedName) => { + const r = engine.getRule(dottedName) + return ( + +
    +

    + {r.title} + + {r.rawNode.résumé} + +

    +

    + + + + + +

    + {r.rawNode.description && ( +
    + +
    + )} +
    +
    + ) + })} + +

    {emoji('ℹ️')} Pour votre information

    +
    + {([ + 'aide déclaration revenu indépendant 2020 . réduction covid . total', + 'aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal', + 'aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible', + 'aide déclaration revenu indépendant 2020 . résultat simple . CFP', + 'aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale', + ] as const).map((dottedName) => { + const r = engine.getRule(dottedName) + return ( + +
    +

    + {' '} + {r.rawNode.résumé} +

    + + {r.rawNode.description && ( +
    + +
    + )} +

    + + + +

    +
    +
    + ) + })} +
    +
    +
    +
    + ) +} diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx index cff063b8c..8cf84a90e 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx @@ -8,7 +8,6 @@ import { DottedName } from 'modele-social' import { useMemo } from 'react' import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' -import styled from 'styled-components' export default function ResultatsParFormulaire() { const engine = useEngine() @@ -154,27 +153,3 @@ function DeclarationForm({ dottedName }: { dottedName: DottedName }) { ) } - -const FormBlock = styled.section` - max-width: 500px; - padding: 0; - - h3 { - margin-top: 2rem; - } - h2 { - border-top: 1px solid var(--lighterColor); - padding-top: 2rem; - break-after: avoid; - } - - select, - input[type='text'] { - font-size: 1.05em; - padding: 5px 10px; - } - ul { - padding: 0; - margin: 0; - } -` diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml index 0cefa7422..a8ff0aabc 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/config.yaml @@ -1,6 +1,5 @@ objectifs: - aide déclaration revenu indépendant 2020 . cotisations obligatoires déductibles - - aide déclaration revenu indépendant 2020 . informations . cotisations déductibles - dirigeant . rémunération . totale - dirigeant . rémunération . nette - aide déclaration revenu indépendant 2020 . formulaire 2033 diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index b4aa09855..69cc443d0 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -19,8 +19,21 @@ import { CompanySection } from '../Home' import simulationConfig from './config.yaml' import { ExplicationsResultatFiscal } from './ExplicationResultatFiscal' import { SimpleField, SubSection } from './Fields' +import ResultatsSimples from './RésultatSimple' import ResultatsParFormulaire from './RésultatsParFormulaire' import illustration from './undraw_fill_in_mie5.svg' + +/** + * Nous avons proposé une nouvelle vision des résultat plus complète, avec une proposition d'aide pour + * l'ensemble des cases liées aux cotisations sociale. + * + * Hors de propos pour 2021, étant donné que cela prendrait beaucoup de temps à valider par la DGFiP + * En attendant, on propose la version "simple" (mais moins utile). + * + * Le but est de faire valider la version plus complète pour la déclaration de revenu 2021. + */ +const FEATURE_FLAG_RESULTATS_COMPLETS = false + export default function AideDéclarationIndépendant() { useSimulationConfig(simulationConfig) const dispatch = useDispatch() @@ -69,13 +82,10 @@ export default function AideDéclarationIndépendant() {
    • vous exercez une activité libérale relevant d’un régime de - retraite des professions libérales + retraite des professions libérales en comptabilité d'engagement
    • -
    • vous avez opté pour le régime micro-fiscal
    • votre entreprise est domiciliée dans les DOM
    • -
    • - vous vous versez des dividendes soumis à cotisations sociales -
    • +
    • vous avez opté pour le régime micro-fiscal
    {displayForm ? ( @@ -93,47 +103,57 @@ export default function AideDéclarationIndépendant() {

    - - - {situation['entreprise . imposition'] !== undefined && ( - - -

    - Quel est votre résultat fiscal en 2020 ?
    - - Charges sociales et exonérations fiscales non incluses{' '} - - -

    -

    - Le résultat fiscal correspond aux produits moins les charges. Il - peut être positif (bénéfice) ou négatif (déficit). -

    - - - + {situation['entreprise . imposition'] != null && ( + <> + {/* */} + + {/* */} + + + +

    + Quel est votre résultat fiscal en 2020 ?
    + + Charges sociales et exonérations fiscales non incluses{' '} + + +

    +

    + Le résultat fiscal correspond aux produits moins les charges. + Il peut être positif (bénéfice) ou négatif (déficit). +

    + + + +
    + +

    + Quel est le montant net de votre rémunération en 2020 ? +
    + Sans tenir compte des charges sociales +

    + + + +
    +
    - -

    - Quel est le montant net de votre rémunération en 2020 ? -
    - Sans tenir compte des charges sociales -

    - - - -
    -
    + )} - {displayForm && ( <> @@ -193,8 +213,9 @@ export default function AideDéclarationIndépendant() { dottedName="dirigeant . indépendant . cotisations et contributions . exonérations" hideTitle /> - - + {FEATURE_FLAG_RESULTATS_COMPLETS && ( + + )}

    International

    @@ -203,43 +224,50 @@ export default function AideDéclarationIndépendant() { dottedName="dirigeant . indépendant . revenus étrangers" hideTitle /> - - - - - - - - {/* We can't use a subsection here cause revenu étrangers is not missing when CSG is replaced */} -

    - Revenus étranger -

    - - - - -
    - - + + + + {FEATURE_FLAG_RESULTATS_COMPLETS && ( + <> + + + + {/* We can't use a subsection here cause revenu étrangers is not missing when CSG is replaced */} +

    + Revenus étranger +

    + + + + + + + )} +
    + {FEATURE_FLAG_RESULTATS_COMPLETS ? ( + <> + + + + + + + ) : ( + + )} - - - - - - )} diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 8c8a09553..d3c6f121b 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,90 +1,90 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9020,12300,50000,36345,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9020,50000,36345,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,1965,15000,12630,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,15000,12630,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,715,5000,4152,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,5000,4152,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,2220,10000,7511,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,10000,7511,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,1339,10000,8392,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,10000,8392,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11408,14534,50000,34049,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11409,50000,34048,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[86,214,500,275,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[82,500,279,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1060,1475,5000,3392,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,5000,3431,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9020,11467,50000,37540,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9021,50000,37539,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,119,5000,4881,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,5000,4881,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[33,183,15000,14803,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[33,15000,14803,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7546,9433,35000,24814,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7546,35000,24814,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14092,17407,50000,31239,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,50000,31238,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[13578,16893,50000,31753,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[11933,50000,33398,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11461,14776,50000,33870,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11933,50000,33398,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14097,17392,50000,31254,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14098,50000,31253,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,14776,50000,33870,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,50000,33870,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5651,8931,50000,39714,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5652,50000,39713,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: international 1`] = `"[14610,14713,50000,35287,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: international 1`] = `"[14610,50000,35287,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,13245,50000,36215,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,50000,36215,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11362,14657,50000,33989,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11365,50000,33986,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1366,1796,5000,3071,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1368,5000,3069,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11367,14647,50000,33998,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11369,50000,33996,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1368,1783,5000,3084,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1369,5000,3083,0,1,1,0]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[11367,14647,50000,33998,0,0,1,1] +"[11369,50000,33996,0,0,1,1] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1368,1783,5000,3084,0,0,1,1]"`; +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1369,5000,3083,0,0,1,1]"`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` -"[9453,12733,50000,35912,0,0,1,1] +"[9454,50000,35911,0,0,1,1] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[1041,1169,500,-680,0,1,1,0] +"[1042,500,-681,0,1,1,0] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[1041,1201,1000,-225,0,1,1,0] +"[1042,1000,-226,0,1,1,0] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1066,1258,1500,204,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1067,1500,203,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1109,1333,2000,615,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1110,2000,614,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1368,1783,5000,3084,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1369,5000,3083,0,1,1,0]"`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2203,2936,10000,6795,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2204,10000,6794,0,1,1,0]"`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` -"[20929,27392,100000,69895,0,1,1,0] +"[20929,100000,69895,0,1,1,0] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` -"[106448,170215,1000000,802634,0,1,1,0] +"[106448,1000000,802634,0,1,1,0] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; @@ -202,97 +202,97 @@ exports[`calculate simulations-impot-société: prorata temporis 3`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3272]"`; +exports[`calculate simulations-indépendant: acre 1`] = `"[73023,23023,50000,51980,9600,40400,0,73023,3559]"`; -exports[`calculate simulations-indépendant: activité 1`] = `"[29084,9084,20000,20787,931,19069,0,29084,3272]"`; +exports[`calculate simulations-indépendant: activité 1`] = `"[29086,9086,20000,20787,931,19069,0,29086,3559]"`; -exports[`calculate simulations-indépendant: activité 2`] = `"[29100,9100,20000,20787,931,19069,0,29100,3288]"`; +exports[`calculate simulations-indépendant: activité 2`] = `"[29102,9102,20000,20787,931,19069,0,29102,3575]"`; -exports[`calculate simulations-indépendant: cotisations facultatives 1`] = `"[30000,13180,16820,17883,467,16353,0,30000,7072]"`; +exports[`calculate simulations-indépendant: cotisations facultatives 1`] = `"[30000,13181,16819,17881,467,16352,0,30000,7359]"`; -exports[`calculate simulations-indépendant: cotisations facultatives 2`] = `"[30000,14380,15620,17883,467,15153,0,30000,8272]"`; +exports[`calculate simulations-indépendant: cotisations facultatives 2`] = `"[30000,14381,15619,17881,467,15152,0,30000,8559]"`; -exports[`calculate simulations-indépendant: cotisations facultatives 3`] = `"[30000,10379,19621,20433,875,18746,0,30000,4272]"`; +exports[`calculate simulations-indépendant: cotisations facultatives 3`] = `"[30000,10381,19619,20431,874,18745,0,30000,4559]"`; -exports[`calculate simulations-indépendant: cotisations facultatives 4`] = `"[20000,6730,13270,13810,0,13270,0,20000,3772]"`; +exports[`calculate simulations-indépendant: cotisations facultatives 4`] = `"[20000,6732,13268,13809,0,13268,0,20000,4059]"`; exports[`calculate simulations-indépendant: cotisations facultatives 5`] = ` -"[300000,79622,220378,228521,82429,137949,0,300000,9772] +"[300000,79622,220378,228521,82429,137949,0,300000,10059] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: cotisations facultatives 6`] = ` -"[300000,83122,216878,225021,80854,136024,0,300000,13272] +"[300000,83122,216878,225021,80854,136024,0,300000,13559] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1372,1272,100,134,0,100,0,1372,3272]"`; +exports[`calculate simulations-indépendant: cotisations minimales 1`] = `"[1375,1275,100,135,0,100,0,1375,3559]"`; -exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[246,146,100,104,0,100,0,246,3272]"`; +exports[`calculate simulations-indépendant: cotisations minimales 2`] = `"[244,144,100,104,0,100,0,244,3211]"`; exports[`calculate simulations-indépendant: imposition à l'IS 1`] = ` -"[100000,30104,69896,72608,15122,54774,0,100000,3272] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" +"[100000,30105,69895,72609,15123,54772,0,100000,3559] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: imposition à l'IS 2`] = ` -"[100000,30104,69896,72608,15122,54774,0,100000,3272] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification, entreprise . imposition . IS . information sur le report de déficit" +"[100000,30105,69895,72609,15123,54772,0,100000,3559] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29084,9084,20000,20787,603,19397,0,29084,3272]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 1`] = `"[29086,9086,20000,20787,603,19397,0,29086,3559]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3272]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 2`] = `"[73023,23023,50000,51980,8213,41787,0,73023,3559]"`; -exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29084,9084,20000,20787,2079,17921,0,29084,3272]"`; +exports[`calculate simulations-indépendant: impôt sur le revenu 3`] = `"[29086,9086,20000,20787,2079,17921,0,29086,3559]"`; -exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1385,615,667,0,615,0,2000,3272]"`; +exports[`calculate simulations-indépendant: inversions 1`] = `"[2000,1386,614,666,0,614,0,2000,3559]"`; -exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16003,33997,35353,4612,29385,0,50000,3272]"`; +exports[`calculate simulations-indépendant: inversions 2`] = `"[50000,16004,33996,35351,4611,29385,0,50000,3559]"`; -exports[`calculate simulations-indépendant: inversions 3`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; +exports[`calculate simulations-indépendant: inversions 3`] = `"[14597,4597,10000,10394,0,10000,0,14597,3559]"`; -exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3272]"`; +exports[`calculate simulations-indépendant: inversions 4`] = `"[72181,22762,49419,51376,9419,40000,0,72181,3559]"`; -exports[`calculate simulations-indépendant: inversions 5`] = `"[14596,4596,10000,10394,0,10000,1000,15596,3272]"`; +exports[`calculate simulations-indépendant: inversions 5`] = `"[14597,4597,10000,10394,0,10000,1000,15597,3559]"`; -exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5927,13073,13585,0,13073,1000,20000,3272]"`; +exports[`calculate simulations-indépendant: inversions 6`] = `"[19000,5929,13071,13584,0,13071,1000,20000,3559]"`; -exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5624,12376,12861,0,12376,2000,20000,3272]"`; +exports[`calculate simulations-indépendant: inversions 7`] = `"[18000,5627,12373,12860,0,12373,2000,20000,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1859,1359,500,548,0,500,0,1859,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 1`] = `"[1861,1361,500,548,0,500,0,1861,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 2`] = `"[2466,1466,1000,1064,0,1000,0,2466,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 3`] = `"[3075,1575,1500,1581,0,1500,0,3075,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3682,1682,2000,2097,0,2000,0,3682,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 4`] = `"[3683,1683,2000,2097,0,2000,0,3683,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7427,2427,5000,5199,0,5000,0,7427,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 5`] = `"[7428,2428,5000,5199,0,5000,0,7428,3559]"`; -exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14596,4596,10000,10394,0,10000,0,14596,3272]"`; +exports[`calculate simulations-indépendant: échelle de revenus 6`] = `"[14597,4597,10000,10394,0,10000,0,14597,3559]"`; exports[`calculate simulations-indépendant: échelle de revenus 7`] = ` -"[139593,39593,100000,103788,28472,71528,0,139593,3272] +"[139593,39593,100000,103788,28472,71528,0,139593,3559] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; exports[`calculate simulations-indépendant: échelle de revenus 8`] = ` -"[1239954,239954,1000000,1033666,473591,526409,0,1239954,3272] +"[1239954,239954,1000000,1033666,473591,526409,0,1239954,3559] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[2873,0,2373,500,0,500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 1`] = `"[3147,0,2647,500,0,500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3433,0,2433,1000,0,1000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 2`] = `"[3708,0,2708,1000,0,1000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[3994,0,2494,1500,0,1500]"`; +exports[`calculate simulations-professions-libérales: CIPAV 3`] = `"[4267,0,2767,1500,0,1500]"`; -exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4554,0,2554,2000,0,2000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 4`] = `"[4827,0,2827,2000,0,2000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[7987,0,2987,5000,0,5000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 5`] = `"[8245,0,3245,5000,0,5000]"`; -exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14244,0,4244,10000,0,10000]"`; +exports[`calculate simulations-professions-libérales: CIPAV 6`] = `"[14422,0,4422,10000,0,10000]"`; exports[`calculate simulations-professions-libérales: CIPAV 7`] = ` "[146241,0,46241,100000,28546,71454] @@ -320,7 +320,7 @@ exports[`calculate simulations-professions-libérales: avocat 2`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5049,14951,85,14866]"`; +exports[`calculate simulations-professions-libérales: expert-comptable 1`] = `"[20000,0,5076,14924,81,14843]"`; exports[`calculate simulations-professions-libérales: expert-comptable 2`] = ` "[50000,0,14877,35123,4949,30174] @@ -493,65 +493,65 @@ exports[`calculate simulations-rémunération-dirigeant (auto-entrepreneur): éc Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] = `"[0,8392,0,6102,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 1`] = `"[0,8392,0,6077,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12270,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 2`] = `"[0,16871,0,12220,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22331,0,16308,4,32]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): ACRE 3`] = `"[0,22330,0,16241,4,32]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16820,0,13327,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 1`] = `"[0,16819,0,13265,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15620,0,13327,4,24]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 2`] = `"[0,15619,0,13265,4,24]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19621,0,14602,4,28]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 3`] = `"[0,19619,0,14540,4,28]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13270,0,9835,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 4`] = `"[0,13268,0,9793,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 5`] = ` -"[0,220378,0,57933,4,56] +"[0,220378,0,57407,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13170,0,9785,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 6`] = `"[0,13168,0,9743,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 7`] = `"[0,6870,0,7778,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): Contrats Madelin 7`] = `"[0,6868,0,7736,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 1`] = `"[0,13768,0,10043,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14555,0,null,4,0]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 2`] = `"[0,14515,0,null,4,0]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10076,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 3`] = `"[0,13758,0,10035,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 4`] = `"[0,13768,0,10043,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): activités 5`] = `"[0,13768,0,10043,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6795,0,4976,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 1`] = `"[0,6794,0,4956,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): avec charges 2`] = `"[0,13768,0,10043,4,21]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 1`] = ` -"[0,-1044,0,0,3,21] +"[0,-1045,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 2`] = ` -"[0,-225,0,0,3,21] +"[0,-226,0,0,3,21] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,615,0,471,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 3`] = `"[0,614,0,468,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3084,0,2266,3,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 4`] = `"[0,3083,0,2257,3,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6795,0,4976,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 5`] = `"[0,6794,0,4956,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13770,0,10085,4,21]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 6`] = `"[0,13768,0,10043,4,21]"`; -exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33997,0,24913,4,48]"`; +exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 7`] = `"[0,33996,0,24810,4,48]"`; exports[`calculate simulations-rémunération-dirigeant (indépendant): échelle de rémunération 8`] = ` -"[0,69895,0,36428,4,56] +"[0,69895,0,36204,4,56] Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" `; diff --git a/mon-entreprise/test/regressions/simulations-indépendant.yaml b/mon-entreprise/test/regressions/simulations-indépendant.yaml index aa61564c4..0810a526c 100644 --- a/mon-entreprise/test/regressions/simulations-indépendant.yaml +++ b/mon-entreprise/test/regressions/simulations-indépendant.yaml @@ -50,31 +50,31 @@ cotisations facultatives: # cotisations ne change pas: - dirigeant . rémunération . totale: 30000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 3800 €/an # plafond: 10% PSS donc environ 4100 + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 3800 €/an # plafond: 10% PSS donc environ 4100 # Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de # cotisations est affecté car l'assiette des cotisations est plus élevée - dirigeant . rémunération . totale: 30000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 5000 €/an # plafond: 10% PSS donc environ 4100 + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 5000 €/an # plafond: 10% PSS donc environ 4100 # Cas mutuelle - dirigeant . rémunération . totale: 30000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1000 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1000 €/an # Cas global madelin faible - dirigeant . rémunération . totale: 20000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 200 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 200 €/an dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 300 €/an # Cas global madelin grand (plafonds calculés différemment) - dirigeant . rémunération . totale: 300000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1500 €/an dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an # Cas madelin + PER grand - dirigeant . rémunération . totale: 300000 €/an dirigeant . indépendant . cotisations facultatives: oui dirigeant . indépendant . cotisations facultatives . PER: 3500 €/an - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1500 €/an dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an diff --git a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml index b1cefd788..8c955ab3c 100644 --- a/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml +++ b/mon-entreprise/test/regressions/simulations-rémunération-dirigeant.yaml @@ -47,39 +47,39 @@ Contrats Madelin: - dirigeant . rémunération . totale: 30000 €/an entreprise . charges: 10000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 3800 €/an # plafond: 10% PSS donc environ 4100 + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 3800 €/an # plafond: 10% PSS donc environ 4100 # Cas retraite: la cotisation Madelin est supérieure au plafond => le revenu net de # cotisations est affecté car l'assiette des cotisations est plus élevée - dirigeant . rémunération . totale: 30000 €/an entreprise . charges: 10000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 5000 €/an # plafond: 10% PSS donc environ 4100 + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 5000 €/an # plafond: 10% PSS donc environ 4100 # Cas mutuelle - dirigeant . rémunération . totale: 30000 €/an entreprise . charges: 10000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1000 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1000 €/an # Cas global madelin faible - dirigeant . rémunération . totale: 20000 €/an entreprise . charges: 1000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 200 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 200 €/an dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 300 €/an # Cas global madelin grand (plafonds calculés différemment) - dirigeant . rémunération . totale: 300000 €/an entreprise . charges: 15000 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 1500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 1500 €/an dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 5000 €/an # Cas charges plus faibles que total madelin - dirigeant . rémunération . totale: 20000 €/an entreprise . charges: 500 €/an dirigeant . indépendant . cotisations facultatives: oui - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 300 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 300 €/an dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 300 €/an # PER - dirigeant . rémunération . totale: 20000 €/an dirigeant . indépendant . cotisations facultatives: oui dirigeant . indépendant . cotisations facultatives . PER: 5500 €/an - dirigeant . indépendant . cotisations facultatives . contrats madelin . mutuelle: 500 €/an + dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: 500 €/an dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: 900 €/an From fb758376d3bb232d80dfa2c720fe05563c277265 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 27 May 2021 15:29:28 +0200 Subject: [PATCH 180/319] :fountain_pen: Typos --- .../déclaration-revenu-indépendant.yaml | 3 +- .../règles/entreprise-établissement.yaml | 6 ++-- mon-entreprise/source/locales/rules-en.yaml | 32 ++++++++++++------- .../AideDéclarationIndépendant/index.tsx | 4 +-- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index 665b98fb6..cb7cf0b3a 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -741,7 +741,8 @@ aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique 1GB: aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSCA: titre: rubrique DSCA / DSCB résumé: Cotisations sociales obligatoires - description: Rubrique DSCA/DSCB du formulaire de donnée complémentaire à la déclaration de revenus des indépendant + description: | + La rubrique DSCA ou DSCB de la déclaration de revenu fiscale et sociale unifiée correspond au montant des cotisations sociales obligatoires déductibles fiscalement (ces cotisations seront soumises à CSG-CRDS). La rubrique DSCA ou DSCB figure dans le volet social « déclaration de revenus des indépendants » de la déclaration 2042. valeur: cotisations obligatoires déductibles références: notice: https://www.impots.gouv.fr/portail/www2/fichiers/documentation/brochure/ir_2021/pdf_som/11-bis-decla_fusion_fisc_185a195.pdf diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index df59c4a0a..579a6855a 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -238,9 +238,9 @@ entreprise . résultat fiscal: entreprise . imposition: question: Comment l'entreprise est-elle imposée ? description: | - Le créateur d'entreprise peut opter pour l'un des deux régimes d'imposition des bénéfices de son activité : - - l'impôt sur le revenu, où les bénéfices sont déclarés sur la déclaration de revenus personnelle et imposés au barème progressif - - l'impôt sur les sociétés, où les bénéfices sont déclarés au nom de la société + Indiquez si le régime d’imposition des revenus liés à l’activité indépendante relèvent : + - de l’impôt sur le revenu : les bénéfices de l’entreprise sont imposés directement auprès du travailleurs indépendant, au barème progressif de l’impôt sur le revenu. + - de l’impôt sur les sociétés : les bénéfices de l’entreprise sont imposés au nom de la société, au taux de l’impôt sur les sociétés. formule: une possibilité: choix obligatoire: oui diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index faee0861a..42258950c 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -362,10 +362,18 @@ aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique 1GB: titre.en: '[automatic] item 1GB / 1HB' titre.fr: rubrique 1GB / 1HB aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSCA: - description.en: '[automatic] Heading SCPD/SCBD on the Supplementary Data Form - for the Self-employed Income Tax Return' - description.fr: Rubrique DSCA/DSCB du formulaire de donnée complémentaire à la - déclaration de revenus des indépendant + description.en: > + [automatic] The DSCA or DSCB item of the unified tax and social security + return corresponds to the amount of compulsory social contributions that are + tax deductible (these contributions will be subject to CSG-CRDS). The DSCA + or DSCB item appears in the social section "declaration of income of the + self-employed" of the 2042 declaration. + description.fr: > + La rubrique DSCA ou DSCB de la déclaration de revenu fiscale et sociale + unifiée correspond au montant des cotisations sociales obligatoires + déductibles fiscalement (ces cotisations seront soumises à CSG-CRDS). La + rubrique DSCA ou DSCB figure dans le volet social « déclaration de revenus + des indépendants » de la déclaration 2042. résumé.en: '[automatic] Compulsory social security contributions' résumé.fr: Cotisations sociales obligatoires titre.en: '[automatic] DSCA / DSCB section' @@ -7905,19 +7913,19 @@ entreprise . exonérée de TVA: titre.fr: exonérée de TVA entreprise . imposition: description.en: > - [automatic] The entrepreneur can opt for one of two tax regimes for the - profits of his or her business: + [automatic] Indicate if the taxation system of the income related to the + self-employed activity is : - - income tax, where profits are declared on the personal income tax return and taxed on a progressive scale + - Income tax: the company's profits are taxed directly to the self-employed person, at the progressive income tax rate. - - corporate income tax, where profits are declared in the name of the company + - corporate tax: the company's profits are taxed in the name of the company, at the corporate tax rate. description.fr: > - Le créateur d'entreprise peut opter pour l'un des deux régimes d'imposition - des bénéfices de son activité : + Indiquez si le régime d’imposition des revenus liés à l’activité + indépendante relèvent : - - l'impôt sur le revenu, où les bénéfices sont déclarés sur la déclaration de revenus personnelle et imposés au barème progressif + - de l’impôt sur le revenu : les bénéfices de l’entreprise sont imposés directement auprès du travailleurs indépendant, au barème progressif de l’impôt sur le revenu. - - l'impôt sur les sociétés, où les bénéfices sont déclarés au nom de la société + - de l’impôt sur les sociétés : les bénéfices de l’entreprise sont imposés au nom de la société, au taux de l’impôt sur les sociétés. question.en: '[automatic] How is the company taxed?' question.fr: Comment l'entreprise est-elle imposée ? titre.en: '[automatic] taxation' diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 69cc443d0..0a51808a4 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -65,7 +65,7 @@ export default function AideDéclarationIndépendant() {

    Vous restez entièrement responsable d'éventuelles omissions ou - inexactitudes dans votre déclarations. + inexactitudes dans votre déclaration.

    @@ -99,7 +99,7 @@ export default function AideDéclarationIndépendant() {

    Imposition

    Ces quelques questions permettent de déterminer le type de déclaration - à remplir, ainsi que les modalités de calcul des cotisations social. + à remplir, ainsi que les modalités de calcul des cotisations sociale.

    From bdb1c9a0aa799178f56c10c82385503aae70eedb Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 27 May 2021 16:35:04 +0200 Subject: [PATCH 181/319] =?UTF-8?q?:sparkles:=20ajoute=20l'option=20micro-?= =?UTF-8?q?fiscal=20sur=20l'aide=20=C3=A0=20la=20d=C3=A9claration=20revenu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../déclaration-revenu-indépendant.yaml | 30 +++ .../règles/entreprise-établissement.yaml | 7 +- mon-entreprise/source/locales/rules-en.yaml | 18 ++ .../RésultatSimple.tsx | 15 +- .../RésultatsParFormulaire.tsx | 7 +- .../AideDéclarationIndépendant/index.tsx | 180 +++++++++++------- 6 files changed, 181 insertions(+), 76 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index cb7cf0b3a..d86865967 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -21,6 +21,7 @@ aide déclaration revenu indépendant 2020 . comptabilité: - trésorerie aide déclaration revenu indépendant 2020 . comptabilité . trésorerie: + rend non applicable: entreprise . imposition . IR . micro-fiscal valeur: comptabilité = 'trésorerie' titre: comptabilité de trésorerie @@ -183,6 +184,7 @@ aide déclaration revenu indépendant 2020 . nature de l'activité: - règle: entreprise . activité . commerciale ou industrielle par: commerciale ou industrielle question: Quelle est la nature de votre activité ? + par défaut: "'commerciale ou industrielle'" formule: une possibilité: choix obligatoire: oui @@ -762,8 +764,30 @@ aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSLA: résumé: Revenus étrangers imposables mais exonérés de CSG-CRDS formule: dirigeant . indépendant . revenus étrangers . montant +aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C: + valeur: oui + applicable si: entreprise . imposition . IR . micro-fiscal + références: + formulaire: https://www.impots.gouv.fr/portail/files/formulaires/2042/2021/2042_3451.pdf + +aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C . rubrique 5KO: + titre: rubrique 5KO / 5LO + résumé: Revenus imposables micro BIC (ventes de marchandises et assimilées) + valeur: entreprise . chiffre d'affaires . vente restauration hébergement + +aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C . rubrique 5KP: + titre: rubrique 5KP / 5LP + résumé: Revenus imposables micro BIC (prestations de services et locations meublées) + valeur: entreprise . chiffre d'affaires . service BIC + +aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C . rubrique 5HQ: + titre: rubrique 5HQ / 5IQ + résumé: Régime déclaratif spécial ou micro BNC (recettes brutes) + valeur: entreprise . chiffre d'affaires . service BNC + aide déclaration revenu indépendant 2020 . informations résultat par formulaire : applicable si: comptabilité . engagement + non applicable si: entreprise . imposition . IR . micro-fiscal valeur: oui aide déclaration revenu indépendant 2020 . informations résultat par formulaire . réduction Covid: description: La réduction de cotisation applicable dans le cas du dispositif Covid @@ -805,6 +829,8 @@ aide déclaration revenu indépendant 2020 . informations résultat par formulai aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal: + non applicable si: entreprise . imposition . IR . micro-fiscal + titre: revenu net fiscal résumé: '[A]' description: Résultat avant déduction des charges sociales et exonérations fiscales @@ -830,17 +856,20 @@ aide déclaration revenu indépendant 2020 . résultat simple . cotisations obli aide déclaration revenu indépendant 2020 . résultat simple: oui aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible: + non applicable si: entreprise . imposition . IR . micro-fiscal titre: CSG déductible résumé: '[B]' description: "Montant de la CSG déductible à l'impôt sur le revenu" valeur: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible aide déclaration revenu indépendant 2020 . résultat simple . CFP: + non applicable si: entreprise . imposition . IR . micro-fiscal résumé: '[D]' description: Contribution à la formation professionnelle valeur: dirigeant . indépendant . cotisations et contributions . formation professionnelle aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible: + non applicable si: entreprise . imposition . IR . micro-fiscal titre: charges sociales obligatoires déductibles fiscalement résumé: '[B + C + D]' somme: @@ -854,6 +883,7 @@ aide déclaration revenu indépendant 2020 . résultat simple . total charges so - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale: + non applicable si: entreprise . imposition . IR . micro-fiscal résumé: '[A - (B + C + D)]' description: Assiette utilisée pour le calcul des cotisations sociales valeur: dirigeant . indépendant . assiette des cotisations diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 579a6855a..c7bd9cb67 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -255,6 +255,7 @@ entreprise . imposition . IR: entreprise . imposition . IR . micro-fiscal: rend non applicable: dirigeant . indépendant . cotisations facultatives + question: Avez-vous opté pour le régime micro-fiscal ? description: | Avec le régime micro fiscal, les charges déductibles sont estimées forfaitairement,en fonction d’un pourcentage du chiffre d’affaires. Ce pourcentage dépend du type d’activité : 71% pour les activités de vente, restauration et hébergement (location de meublé de tourisme classé et chambre d’hôte), 50% pour les prestations de service commerciales ou artisanales, 34% pour les activités libérales. @@ -270,7 +271,10 @@ entreprise . imposition . IR . micro-fiscal . revenu abattu: Le micro-entrepreneur est dispensé d'établir une déclaration professionnelle de bénéfices au titre des BNC ou BIC. Il lui suffit de porter dans la déclaration complémentaire de revenu (n°2042-C Pro) le montant annuel du chiffre d'affaires brut (BIC) ou des recettes (BNC). - valeur: chiffre d'affaires + somme: + - entreprise . chiffre d'affaires . vente restauration hébergement + - entreprise . chiffre d'affaires . service BIC + - entreprise . chiffre d'affaires . service BNC abattement: produit: composantes: @@ -801,6 +805,7 @@ entreprise . activité . service ou vente . service: entreprise . activité . mixte: titre: Activités mixtes + applicable si: entreprise . imposition . IR . micro-fiscal question: Votre entreprise a-t-elle plusieurs types d'activités ? par défaut: non description: | diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 42258950c..2017396d1 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -393,6 +393,24 @@ aide déclaration revenu indépendant 2020 . formulaire 2042 . rubrique DSLA: résumé.fr: Revenus étrangers imposables mais exonérés de CSG-CRDS titre.en: '[automatic] DSLA / DSLB section' titre.fr: rubrique DSLA / DSLB +aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C: + titre.en: '[automatic] form 2042 PRO C' + titre.fr: formulaire 2042 PRO C +aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C . rubrique 5HQ: + résumé.en: '[automatic] Special declarative regime or micro BNC (gross receipts)' + résumé.fr: Régime déclaratif spécial ou micro BNC (recettes brutes) + titre.en: '[automatic] item 5HQ / 5IQ' + titre.fr: rubrique 5HQ / 5IQ +aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C . rubrique 5KO: + résumé.en: '[automatic] Micro BIC taxable income (sales of goods and similar)' + résumé.fr: Revenus imposables micro BIC (ventes de marchandises et assimilées) + titre.en: '[automatic] heading 5KO / 5LO' + titre.fr: rubrique 5KO / 5LO +aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C . rubrique 5KP: + résumé.en: '[automatic] Micro BIC taxable income (services and furnished rentals)' + résumé.fr: Revenus imposables micro BIC (prestations de services et locations meublées) + titre.en: '[automatic] item 5KP / 5LP' + titre.fr: rubrique 5KP / 5LP aide déclaration revenu indépendant 2020 . formulaire 2050: résumé.en: '[automatic] Tax package for the normal actual system' résumé.fr: Liasse fiscale du régime réel normal diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx index e036d2062..a9cc000e1 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx @@ -50,6 +50,9 @@ export default function ResultatsSimples() { 'aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible', ] as const).map((dottedName) => { const r = engine.getRule(dottedName) + if (engine.evaluate(dottedName).nodeValue === false) { + return null + } return (
    ) })} - +

    {emoji('ℹ️')} Pour votre information

    { const r = engine.getRule(dottedName) + if (engine.evaluate(dottedName).nodeValue === false) { + return null + } return (
    - s.startsWith('aide déclaration revenu indépendant 2020 . informations . ') + s.startsWith( + 'aide déclaration revenu indépendant 2020 . informations résultat par formulaire . ' + ) ) .map((dottedName) => engine.getRule(dottedName)) return ( @@ -49,10 +51,11 @@ export default function ResultatsParFormulaire() { 'aide déclaration revenu indépendant 2020 . formulaire 2033', 'aide déclaration revenu indépendant 2020 . formulaire 2050', 'aide déclaration revenu indépendant 2020 . formulaire 2042', + 'aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C', ] as const).map((dottedName) => ( ))} - +

    {emoji('ℹ️')} Pour votre information

    {informations.map((r) => ( diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 0a51808a4..544e0af20 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -32,27 +32,18 @@ import illustration from './undraw_fill_in_mie5.svg' * * Le but est de faire valider la version plus complète pour la déclaration de revenu 2021. */ -const FEATURE_FLAG_RESULTATS_COMPLETS = false +const FEATURE_FLAG_RESULTATS_COMPLETS = document.location.search.includes( + 'next' +) export default function AideDéclarationIndépendant() { useSimulationConfig(simulationConfig) - const dispatch = useDispatch() const company = useSelector( (state: RootState) => state.inFranceApp.existingCompany ) - const situation = useSelector(situationSelector) - const setSituation = useCallback( - (value, dottedName) => { - dispatch(updateSituation(dottedName, value)) - }, - [dispatch] - ) - const displayForm = !!( - situation['dirigeant . rémunération . totale'] || - situation['dirigeant . rémunération . nette'] - ) + const displayForm = true return ( <> @@ -85,7 +76,6 @@ export default function AideDéclarationIndépendant() { retraite des professions libérales en comptabilité d'engagement
  • votre entreprise est domiciliée dans les DOM
  • -
  • vous avez opté pour le régime micro-fiscal
  • {displayForm ? ( @@ -102,58 +92,7 @@ export default function AideDéclarationIndépendant() { à remplir, ainsi que les modalités de calcul des cotisations sociale.

    - - {situation['entreprise . imposition'] != null && ( - <> - {/* */} - - {/* */} - - - -

    - Quel est votre résultat fiscal en 2020 ?
    - - Charges sociales et exonérations fiscales non incluses{' '} - - -

    -

    - Le résultat fiscal correspond aux produits moins les charges. - Il peut être positif (bénéfice) ou négatif (déficit). -

    - - - -
    - -

    - Quel est le montant net de votre rémunération en 2020 ? -
    - Sans tenir compte des charges sociales -

    - - - -
    -
    -
    - - )} + {displayForm && ( <> @@ -188,6 +127,7 @@ export default function AideDéclarationIndépendant() { + {/* PLNR */} @@ -197,7 +137,9 @@ export default function AideDéclarationIndépendant() { Situation personnelle

    - + + +

    @@ -220,11 +162,12 @@ export default function AideDéclarationIndépendant() { International

    - - + + + @@ -257,6 +200,7 @@ export default function AideDéclarationIndépendant() { 'une de ces conditions': [ "aide déclaration revenu indépendant 2020 . régime d'imposition . réel", "aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée", + 'entreprise . imposition . IR . micro-fiscal', ], }} > @@ -275,6 +219,98 @@ export default function AideDéclarationIndépendant() { ) } +function ImpositionSection() { + const dispatch = useDispatch() + + const situation = useSelector(situationSelector) + const setSituation = useCallback( + (value, dottedName) => { + dispatch(updateSituation(dottedName, value)) + }, + [dispatch] + ) + return ( + <> + + {situation['entreprise . imposition'] != null && ( + <> + {/* */} + + {/* */} + + + + + + +

    + Quel est votre chiffre d'affaires hors taxes en 2020 ?
    +

    + + + + + + + + + + +
    + +

    + Quel est votre résultat fiscal en 2020 ?
    + + Charges sociales et exonérations fiscales non incluses{' '} + + +

    +

    + Le résultat fiscal correspond aux produits moins les + charges. Il peut être positif (bénéfice) ou négatif + (déficit). +

    + + + +
    +
    + +

    + Quel est le montant net de votre rémunération en 2020 ? +
    + Sans tenir compte des charges sociales +

    + + + +
    +
    +
    + + )} + + ) +} + export const Question = styled.div` margin-top: 1em; ` From a716f15a726d5a831c3028bbb5d4fb13d4776e66 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 31 May 2021 10:17:58 +0200 Subject: [PATCH 182/319] Retours Acoss --- .../déclaration-revenu-indépendant.yaml | 37 ++++++++++++++++--- .../règles/entreprise-établissement.yaml | 8 ++-- .../AideDéclarationIndépendant/index.tsx | 35 +++++++++--------- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index d86865967..ac55d055b 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -6,8 +6,12 @@ aide déclaration revenu indépendant 2020: indépendants de 2021 sur les revenus 2020. formule: non remplace: - règle: entreprise . ACRE - par: ACRE + - règle: entreprise . ACRE + par: ACRE + + - # Par défaut on considère que l'entreprise est mixte et on affiche tous les champs + règle: entreprise . activité . mixte + par: oui aide déclaration revenu indépendant 2020 . comptabilité: titre: régime de la déclaration contrôlée @@ -181,10 +185,10 @@ aide déclaration revenu indépendant 2020 . nature de l'activité: par: libérale - règle: entreprise . activité . artisanale par: artisanale - - règle: entreprise . activité . commerciale ou industrielle - par: commerciale ou industrielle + - règle: entreprise . activité . commerciale + par: commerciale question: Quelle est la nature de votre activité ? - par défaut: "'commerciale ou industrielle'" + par défaut: "'commerciale'" formule: une possibilité: choix obligatoire: oui @@ -198,6 +202,7 @@ aide déclaration revenu indépendant 2020 . nature de l'activité: + aide déclaration revenu indépendant 2020 . ACRE: description: >- L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une @@ -249,8 +254,28 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . libérale: références: fiche Wikipedia: https://fr.m.wikipedia.org/wiki/Profession_libérale + +aide déclaration revenu indépendant 2020 . nature de l'activité . libérale . recettes: + remplace: entreprise . chiffre d'affaires . service BNC + titre: Recette de l'activité libérale (BNC) + résumé: Recettes hors taxe + question: Quelles sont les recettes issues de l’activité libérale ? + arrondi: oui + unité: €/an + plancher: 0€/an + description: | + Ce sont toutes les opérations dont l'activité intellectuelle tient + un rôle essentiel. + + **Exemples** : conseil, accompagnement, traduction, développement, + formation, enseignement, sportif + + Les revenus tirés de ce chiffre d'affaires sont imposable au régime BNC (bénéfices non commerciaux) + références: + liste des activités libérales: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/liste-professions-liberales + + aide déclaration revenu indépendant 2020 . nature de l'activité . commerciale: - remplace: entreprise . activité . commerciale formule: nature de l'activité = 'commerciale' description: | ### Activité commerciale diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index c7bd9cb67..b50c93859 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -76,7 +76,7 @@ entreprise . chiffre d'affaires: entreprise . chiffre d'affaires . vente restauration hébergement: titre: Vente de biens, restauration, hébergement (BIC) résumé: Chiffre d'affaires hors taxe - question: Quel est le chiffre d'affaires issus de la vente de bien, restauration ou hébergement ? + question: Quel est le chiffre d'affaires issu de la vente de biens, restauration ou hébergement ? unité: €/an variations: - si: activité . mixte @@ -113,7 +113,7 @@ entreprise . chiffre d'affaires . service BIC: arrondi: oui résumé: Chiffre d'affaires hors taxe titre: Prestations de service commerciales ou artisanales (BIC) - question: Quel est le chiffre d'affaires issus de prestations de service commerciales ou artisanales ? + question: Quel est le chiffre d'affaires issu de prestations de service commerciales ou artisanales ? description: | Il s’agit de toute opération ne comportant pas de transfert de propriété de biens corporels (c'est-à-dire ayant une existence matérielle), dont @@ -140,7 +140,7 @@ entreprise . chiffre d'affaires . service BIC: entreprise . chiffre d'affaires . service BNC: titre: Autres prestations de service et activités libérales (BNC) résumé: Chiffre d'affaires hors taxe - question: Quel est le chiffre d'affaires issus de prestations de service libérale ? + question: Quel est le chiffre d'affaires issu de prestations de service libérale ? arrondi: oui plancher: 0€/an description: | @@ -239,7 +239,7 @@ entreprise . imposition: question: Comment l'entreprise est-elle imposée ? description: | Indiquez si le régime d’imposition des revenus liés à l’activité indépendante relèvent : - - de l’impôt sur le revenu : les bénéfices de l’entreprise sont imposés directement auprès du travailleurs indépendant, au barème progressif de l’impôt sur le revenu. + - de l’impôt sur le revenu : les bénéfices de l’entreprise sont imposés directement auprès du travailleur indépendant, au barème progressif de l’impôt sur le revenu. - de l’impôt sur les sociétés : les bénéfices de l’entreprise sont imposés au nom de la société, au taux de l’impôt sur les sociétés. formule: une possibilité: diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index 544e0af20..e5fee48df 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -25,7 +25,7 @@ import illustration from './undraw_fill_in_mie5.svg' /** * Nous avons proposé une nouvelle vision des résultat plus complète, avec une proposition d'aide pour - * l'ensemble des cases liées aux cotisations sociale. + * l'ensemble des cases liées aux cotisations sociales. * * Hors de propos pour 2021, étant donné que cela prendrait beaucoup de temps à valider par la DGFiP * En attendant, on propose la version "simple" (mais moins utile). @@ -89,7 +89,7 @@ export default function AideDéclarationIndépendant() {

    Imposition

    Ces quelques questions permettent de déterminer le type de déclaration - à remplir, ainsi que les modalités de calcul des cotisations sociale. + à remplir, ainsi que les modalités de calcul des cotisations sociales.

    @@ -126,8 +126,9 @@ export default function AideDéclarationIndépendant() { entreprises déjà en activité en 2020
    - - + + + {/* PLNR */} @@ -248,24 +249,22 @@ function ImpositionSection() { - +

    - Quel est votre chiffre d'affaires hors taxes en 2020 ?
    + Quel est votre chiffre d'affaires hors taxes en 2020 ?

    - - - +

    + Indiquez le montant hors taxes de votre chiffre d’affaires + ou de vos recettes bruts (avant déduction de l’abattement + forfaitaire pour frais et charges) et avant déduction des + exonérations fiscales dont vous avez bénéficié +

    + + + - - - - - +

    From cea242bd2d78800496852a5d316ccb0c4b79f818 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 31 May 2021 10:18:44 +0200 Subject: [PATCH 183/319] :alien: Traductions manquantes --- mon-entreprise/source/locales/rules-en.yaml | 51 +++++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 2017396d1..618bf3bb0 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -610,6 +610,38 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . libérale: 1er janvier 2020. titre.en: '[automatic] Liberal attached to the general regime' titre.fr: Libérale rattachée au régime général +? aide déclaration revenu indépendant 2020 . nature de l'activité . libérale . recettes +: description.en: > + [automatic] These are all operations in which intellectual activity plays an + essential role. + + an essential role. + + + Examples**: consulting, coaching, translation, development, + + training, teaching, sports + + + The income from this turnover is taxable under the BNC regime (non-commercial profits) + description.fr: > + Ce sont toutes les opérations dont l'activité intellectuelle tient + + un rôle essentiel. + + + **Exemples** : conseil, accompagnement, traduction, développement, + + formation, enseignement, sportif + + + Les revenus tirés de ce chiffre d'affaires sont imposable au régime BNC (bénéfices non commerciaux) + question.en: '[automatic] What are the revenues from the liberal activity?' + question.fr: Quelles sont les recettes issues de l’activité libérale ? + résumé.en: '[automatic] Revenue excluding tax' + résumé.fr: Recettes hors taxe + titre.en: '[automatic] Income from liberal activity (BNC)' + titre.fr: Recette de l'activité libérale (BNC) aide déclaration revenu indépendant 2020 . plafond sécurité sociale 2020: titre.en: '[automatic] social security ceiling 2020' titre.fr: plafond sécurité sociale 2020 @@ -7608,8 +7640,8 @@ entreprise . chiffre d'affaires . service BIC: services qui nécessite plus qu'un ordinateur pour être effectuées. **Exemples** : transports, service à la personne, réparation etc. - question.en: '[automatic] What is the turnover from commercial or artisanal services?' - question.fr: Quel est le chiffre d'affaires issus de prestations de service + question.en: '[automatic] What is the turnover from commercial or craft services?' + question.fr: Quel est le chiffre d'affaires issu de prestations de service commerciales ou artisanales ? résumé.en: '[automatic] Turnover excluding tax' résumé.fr: Chiffre d'affaires hors taxe @@ -7641,7 +7673,7 @@ entreprise . chiffre d'affaires . service BNC: Les revenus tirés de ce chiffre d'affaires sont imposable au régime BNC (bénéfices non commerciaux) question.en: '[automatic] What is the turnover from liberal services?' - question.fr: Quel est le chiffre d'affaires issus de prestations de service libérale ? + question.fr: Quel est le chiffre d'affaires issu de prestations de service libérale ? résumé.en: '[automatic] Turnover excluding tax' résumé.fr: Chiffre d'affaires hors taxe titre.en: '[automatic] Other services and liberal activities (BNC)' @@ -7768,9 +7800,10 @@ entreprise . chiffre d'affaires . vente restauration hébergement: Ces revenus sont imposables dans la catégorie des BIC - question.en: '[automatic] What is the turnover from the sale of goods, food or - accommodation?' - question.fr: Quel est le chiffre d'affaires issus de la vente de bien, + question.en: + '[automatic] What is the turnover from the sale of goods, catering + or accommodation?' + question.fr: Quel est le chiffre d'affaires issu de la vente de biens, restauration ou hébergement ? résumé.en: '[automatic] Turnover excluding tax' résumé.fr: Chiffre d'affaires hors taxe @@ -7931,8 +7964,8 @@ entreprise . exonérée de TVA: titre.fr: exonérée de TVA entreprise . imposition: description.en: > - [automatic] Indicate if the taxation system of the income related to the - self-employed activity is : + [automatic] Indicate whether the taxation system of the income related to + the self-employed activity is : - Income tax: the company's profits are taxed directly to the self-employed person, at the progressive income tax rate. @@ -7941,7 +7974,7 @@ entreprise . imposition: Indiquez si le régime d’imposition des revenus liés à l’activité indépendante relèvent : - - de l’impôt sur le revenu : les bénéfices de l’entreprise sont imposés directement auprès du travailleurs indépendant, au barème progressif de l’impôt sur le revenu. + - de l’impôt sur le revenu : les bénéfices de l’entreprise sont imposés directement auprès du travailleur indépendant, au barème progressif de l’impôt sur le revenu. - de l’impôt sur les sociétés : les bénéfices de l’entreprise sont imposés au nom de la société, au taux de l’impôt sur les sociétés. question.en: '[automatic] How is the company taxed?' From c4f7b7b2cee64243960dcfef85b2a4b58f08e99b Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 31 May 2021 10:25:16 +0200 Subject: [PATCH 184/319] :fountain_pen: Corrige les contenus --- mon-entreprise/source/locales/ui-en.yaml | 31 +-- mon-entreprise/source/locales/ui-fr.yaml | 33 +-- .../RésultatSimple.tsx | 9 +- .../AideDéclarationIndépendant/index.tsx | 260 +++++++++--------- 4 files changed, 161 insertions(+), 172 deletions(-) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 5feedd697..2f3d8a543 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -197,29 +197,24 @@ Vous êtes dirigeant d'une SAS(U) ? <2>Accéder au simulateur de revenu dédié< aide: aid or subsidy aide-déclaration-indépendant: banner: Find out more about our tax<1>returntool - description: <0>Help with your 2019 income tax return<1>This tool is a tax - (income) and social security<1> (ISD) declaration aid for self-employed - workers. It enables you to find out the amount of social security charges - deductible from your net tax result.<2>You remain fully responsible for - any omissions or inaccuracies in your statements.<3><0><0>This tool - concerns you if you are in any of the following cases :<1><0>you - contribute to the general scheme for self-employed persons<1>your - company is in the actual tax system and in accrual accounting<2>It - does not concern you if you are in one of the following cases:<3><0>you - are self-employed under a pension scheme for the liberal - professions<1>you are managers of companies subject to corporate income - tax<2>you have opted for the micro-fiscal regime<3>your company is - domiciled in the DOM (French Overseas Departments and - Territories)<4>What is your tax result in - 2019?<1><2>Social security charges and tax exemptions not - included<2> <5>The tax result corresponds to income less - expenses. It can be positive (profit) or negative (deficit). + description: <0><0>This tool is an aid for the declaration of income for + <2>self-employed workers. It allows you to find out the amount of social + security contributions that are deductible for tax purposes.<1>You + remain entirely responsible for any omissions or inaccuracies in your + declaration.<1><0>This tool concerns you if you are in the following + situation:<1><0>you contribute to the general scheme for self-employed + workers<2>It does not concern you if you are in one of the following + cases:<3><0>you carry out a liberal activity covered by a pension scheme + for the liberal professions in accrual accounting<1>your company is + domiciled in the DOM<2>Taxation<3>These few questions help + determine the type of declaration to be completed, as well as the methods of + calculating social security contributions. entreprise: description: You can fill in your company to pre-fill in the form titre: <0>Company and activity results: ongoing: Calculation in progress... - title: Reporting help 📄 + title: Your tax returns an: year année: year applicable si: applicable if diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index d1cc47fb8..1d2f6ebd6 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -60,6 +60,7 @@ Ressources utiles: Ressources utiles Retour: Retour Retour à la création: Retour à la création Retour à mon activité: Retour à mon activité +Revenus étranger: Revenus étranger Répartition du chiffre d'affaires: Répartition du chiffre d'affaires S'inscrire: S'inscrire Salaire: Salaire @@ -82,29 +83,25 @@ Votre forme juridique: Votre forme juridique Vous êtes dirigeant d'une SAS(U) ? <2>Accéder au simulateur de revenu dédié: Vous êtes dirigeant d'une SAS(U) ? <2>Accéder au simulateur de revenu dédié aide-déclaration-indépendant: banner: Découvrez notre outil d'<1>aide à la déclaration des revenus - description: >- - <0>Cet outil est une aide à la déclaration de revenus à destination des - travailleurs indépendants. Il vous permet de connaître le montant des - charges sociales déductibles à partir de votre résultat net - fiscal.<1>Vous restez entièrement responsable d'éventuelles omissions ou - inexactitudes dans votre déclarations.<2><0><0>Cet outil vous concerne - si vous êtes dans tous les cas suivants :<1><0>vous cotisez au régime - général des travailleurs indépendants<1>votre entreprise est au régime - réel d'imposition et en comptabilité d'engagement<2>Il ne vous - concerne pas si vous êtes dans un des cas suivants :<3><0>vous exercez - une activité libérale relevant d’un régime de retraite des professions - libérales<1>vous êtes gérants de société relevant de l’impôt sur les - sociétés<2>vous avez opté pour le régime micro-fiscal<3>votre - entreprise est domiciliée dans les DOM{!situation['dirigeant - . rémunération . totale'] && ( - - )}<4>Quel est votre résultat fiscal en 2020 ?<1><2>Charges sociales et exonérations fiscales non incluses <2><5>Le résultat fiscal correspond aux produits moins les charges. Il peut être positif (bénéfice) ou négatif (déficit). + description: <0><0>Cet outil est une aide à la déclaration de revenus à + destination des <2>travailleurs indépendants. Il vous permet de + connaître le montant des charges sociales déductibles pour le calcul de + l'impôt.<1>Vous restez entièrement responsable d'éventuelles omissions + ou inexactitudes dans votre déclaration.<1><0>Cet outil vous + concerne si vous êtes dans le cas suivant :<1><0>vous cotisez au régime + général des travailleurs indépendants<2>Il ne vous concerne pas si + vous êtes dans un des cas suivants :<3><0>vous exercez une activité + libérale relevant d’un régime de retraite des professions libérales en + comptabilité d'engagement<1>votre entreprise est domiciliée dans les + DOM<2>Imposition<3>Ces quelques questions permettent de + déterminer le type de déclaration à remplir, ainsi que les modalités de + calcul des cotisations sociales. entreprise: description: "<0>Facultatif : Vous pouvez renseigner votre entreprise pour pré-remplir le formulaire" titre: <0>Entreprise et activité results: - title: Montants à reporter dans votre déclaration de revenus + title: Vos déclarations fiscales après: ape: description: Le code APE correspond au <1>secteur d'activité de votre diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx index a9cc000e1..ad74c26c5 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx @@ -65,7 +65,14 @@ export default function ResultatsSimples() { >

    {r.title} - + {r.rawNode.résumé}

    diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index e5fee48df..a9bcb0b10 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -3,7 +3,6 @@ import Aide from 'Components/conversation/Aide' import RuleInput from 'Components/conversation/RuleInput' import { Condition } from 'Components/EngineValue' import PageHeader from 'Components/PageHeader' -import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' import 'Components/TargetSelection.css' import Animate from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' @@ -43,7 +42,6 @@ export default function AideDéclarationIndépendant() { (state: RootState) => state.inFranceApp.existingCompany ) const situation = useSelector(situationSelector) - const displayForm = true return ( <> @@ -51,8 +49,8 @@ export default function AideDéclarationIndépendant() {

    Cet outil est une aide à la déclaration de revenus à destination des{' '} travailleurs indépendants. Il vous permet de - connaître le montant des charges sociales déductibles applicable à - votre rémunération. + connaître le montant des charges sociales déductibles pour le calcul + de l'impôt.

    Vous restez entièrement responsable d'éventuelles omissions ou @@ -78,144 +76,136 @@ export default function AideDéclarationIndépendant() {

  • votre entreprise est domiciliée dans les DOM
  • - {displayForm ? ( - - ) : ( - - )} - {!situation['dirigeant . rémunération . totale'] && ( - - )} +

    Imposition

    Ces quelques questions permettent de déterminer le type de déclaration à remplir, ainsi que les modalités de calcul des cotisations sociales.

    - - {displayForm && ( - <> - - - - -

    Entreprise et activité

    -
    -
    - {!company && ( -

    - - Facultatif : Vous pouvez renseigner - votre entreprise pour pré-remplir le formulaire - -

    - )} - -
    - - - - Cette aide à la déclaration concerne uniquement les - entreprises déjà en activité en 2020 - - - - - - {/* PLNR */} - - - - -

    - Situation personnelle -

    - - - - - - -

    - Exonérations -

    - - - - - {FEATURE_FLAG_RESULTATS_COMPLETS && ( - - )} -

    - International -

    - - - - - -
    - - - - {FEATURE_FLAG_RESULTATS_COMPLETS && ( - <> - - - - {/* We can't use a subsection here cause revenu étrangers is not missing when CSG is replaced */} -

    - Revenus étranger -

    - - - - - - - )} -
    -
    -
    - {FEATURE_FLAG_RESULTATS_COMPLETS ? ( - <> - - - - - - - ) : ( - - )} - - - + {Object.keys(situation).length ? ( + + ) : ( + )} + + + + + + +

    Entreprise et activité

    +
    +
    + {!company && ( +

    + + Facultatif : Vous pouvez renseigner votre + entreprise pour pré-remplir le formulaire + +

    + )} + +
    + + + + Cette aide à la déclaration concerne uniquement les entreprises + déjà en activité en 2020 + + + + + + {/* PLNR */} + + + + +

    + Situation personnelle +

    + + + + + + +

    + Exonérations +

    + + + + + {FEATURE_FLAG_RESULTATS_COMPLETS && ( + + )} +

    + International +

    + + + + + +
    + + + + {FEATURE_FLAG_RESULTATS_COMPLETS && ( + <> + + + + {/* We can't use a subsection here cause revenu étrangers is not missing when CSG is replaced */} +

    + Revenus étranger +

    + + + + + + + )} +
    +
    +
    + {FEATURE_FLAG_RESULTATS_COMPLETS ? ( + <> + + + + + + + ) : ( + + )} + + ) } From 90395c398a5cf10ef82c70754f3dc515e2c4e920 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 31 May 2021 17:32:05 +0200 Subject: [PATCH 185/319] Retours Acoss --- .../déclaration-revenu-indépendant.yaml | 53 +++++++------ .../règles/entreprise-établissement.yaml | 4 +- mon-entreprise/source/locales/rules-en.yaml | 74 ++++++++++--------- mon-entreprise/source/locales/ui-en.yaml | 22 +++--- mon-entreprise/source/locales/ui-fr.yaml | 22 +++--- .../RésultatSimple.tsx | 4 +- .../AideDéclarationIndépendant/index.tsx | 50 ++++++------- 7 files changed, 118 insertions(+), 111 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index ac55d055b..c8caeae34 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -51,6 +51,7 @@ aide déclaration revenu indépendant 2020 . cotisations payées: une de ces conditions: - comptabilité . trésorerie - entreprise . imposition . IS + non applicable si: résultat simple valeur: oui aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociale: @@ -83,7 +84,6 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductib 3. Puis, "attestation CSG/CRDS" 4. Reportez dans ce champs le total de la colonne "Montant déductible CSG" (dernière ligne) - aide déclaration revenu indépendant 2020 . cotisations payées . CSG non déductible: question: Quel est le montant total de CSG non déductible payé cette année ? unité: €/an @@ -117,6 +117,35 @@ aide déclaration revenu indépendant 2020 . cotisations payées . cotisations o - dirigeant . indépendant . cotisations et contributions . CSG et CRDS - dirigeant . indépendant . cotisations et contributions . formation professionnelle +aide déclaration revenu indépendant 2020 . cotisations payées version simple: + applicable si: + toutes ces conditions: + - une de ces conditions: + - comptabilité . trésorerie + - entreprise . imposition . IS + - résultat simple + valeur: oui + remplace: + - règle: résultat simple . cotisations obligatoires + par: cotisations payées version simple . cotisations sociales + - règle: résultat simple . total charges sociales déductible + par: + somme: + - cotisations payées version simple . cotisations sociales + - cotisations payées version simple . CSG déductible et CFP + + +aide déclaration revenu indépendant 2020 . cotisations payées version simple . CSG déductible et CFP: + question: Quel est le montant total de CSG déductible et CFP payées cette année ? + unité: €/an + description: | + Indiquez le montant de la part de CSG déductible et de CFP que vous avez payé en 2020 (peu importe l’année à laquelle ces contributions se rapportent). +aide déclaration revenu indépendant 2020 . cotisations payées version simple . cotisations sociales: + question: Quel est le montant de vos cotisations sociales payées cette année ? + unité: €/an + description: | + Indiquez le montant des cotisations sociales aux régimes obligatoires (maladie-maternité, vieillesse, invalidité-décès, famille) que vous avez payées en 2020 (peu importe l’année à laquelle ces cotisations se rapportent). + aide déclaration revenu indépendant 2020 . régime d'imposition: oui aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée: @@ -254,27 +283,6 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . libérale: références: fiche Wikipedia: https://fr.m.wikipedia.org/wiki/Profession_libérale - -aide déclaration revenu indépendant 2020 . nature de l'activité . libérale . recettes: - remplace: entreprise . chiffre d'affaires . service BNC - titre: Recette de l'activité libérale (BNC) - résumé: Recettes hors taxe - question: Quelles sont les recettes issues de l’activité libérale ? - arrondi: oui - unité: €/an - plancher: 0€/an - description: | - Ce sont toutes les opérations dont l'activité intellectuelle tient - un rôle essentiel. - - **Exemples** : conseil, accompagnement, traduction, développement, - formation, enseignement, sportif - - Les revenus tirés de ce chiffre d'affaires sont imposable au régime BNC (bénéfices non commerciaux) - références: - liste des activités libérales: https://bpifrance-creation.fr/encyclopedie/trouver-proteger-tester-son-idee/verifiertester-son-idee/liste-professions-liberales - - aide déclaration revenu indépendant 2020 . nature de l'activité . commerciale: formule: nature de l'activité = 'commerciale' description: | @@ -870,6 +878,7 @@ aide déclaration revenu indépendant 2020 . résultat simple . cotisations obli - **régime réel simplifié :** la rubrique 326 du formulaire 2033-D-SD - **régime réel normal :** la rubrique A5 du formulaire 2053-SD - **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD + - **régime micro fiscal :** pas de liasse professionnelle fiscale à souscrire unité: €/an somme: - dirigeant . indépendant . cotisations et contributions . cotisations diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index b50c93859..6589c39ba 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -139,8 +139,8 @@ entreprise . chiffre d'affaires . service BIC: entreprise . chiffre d'affaires . service BNC: titre: Autres prestations de service et activités libérales (BNC) - résumé: Chiffre d'affaires hors taxe - question: Quel est le chiffre d'affaires issu de prestations de service libérale ? + résumé: Recettes hors taxes + question: Quelles sont les recettes issues de l’activité libérale ? arrondi: oui plancher: 0€/an description: | diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 618bf3bb0..ff72a9429 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -235,6 +235,36 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductib payées pendant l'exercice ? titre.en: '[automatic] total social charges' titre.fr: total charges sociale +aide déclaration revenu indépendant 2020 . cotisations payées version simple: + titre.en: '[automatic] dues paid simple version' + titre.fr: cotisations payées version simple +? aide déclaration revenu indépendant 2020 . cotisations payées version simple . CSG déductible et CFP +: description.en: > + [automatic] Enter the amount of the deductible CSG and PSC you paid in 2020 + (regardless of the year to which these contributions relate). + description.fr: > + Indiquez le montant de la part de CSG déductible et de CFP que vous avez + payé en 2020 (peu importe l’année à laquelle ces contributions se + rapportent). + question.en: '[automatic] What is the total amount of deductible CSG and CFP + paid this year?' + question.fr: Quel est le montant total de CSG déductible et CFP payées cette année ? + titre.en: '[automatic] Deductible CSG and PSC' + titre.fr: CSG déductible et CFP +? aide déclaration revenu indépendant 2020 . cotisations payées version simple . cotisations sociales +: description.en: > + [automatic] Indicate the amount of social contributions to the compulsory + schemes (sickness-maternity, old age, disability-death, family) that you + paid in 2020 (regardless of the year to which these contributions relate). + description.fr: > + Indiquez le montant des cotisations sociales aux régimes obligatoires + (maladie-maternité, vieillesse, invalidité-décès, famille) que vous avez + payées en 2020 (peu importe l’année à laquelle ces cotisations se + rapportent). + question.en: '[automatic] How much social security contribution did you pay this year?' + question.fr: Quel est le montant de vos cotisations sociales payées cette année ? + titre.en: '[automatic] social contributions' + titre.fr: cotisations sociales aide déclaration revenu indépendant 2020 . formulaire 2033: résumé.en: '[automatic] Tax package for the simplified actual system' résumé.fr: Liasse fiscale du régime réel simplifié @@ -610,38 +640,6 @@ aide déclaration revenu indépendant 2020 . nature de l'activité . libérale: 1er janvier 2020. titre.en: '[automatic] Liberal attached to the general regime' titre.fr: Libérale rattachée au régime général -? aide déclaration revenu indépendant 2020 . nature de l'activité . libérale . recettes -: description.en: > - [automatic] These are all operations in which intellectual activity plays an - essential role. - - an essential role. - - - Examples**: consulting, coaching, translation, development, - - training, teaching, sports - - - The income from this turnover is taxable under the BNC regime (non-commercial profits) - description.fr: > - Ce sont toutes les opérations dont l'activité intellectuelle tient - - un rôle essentiel. - - - **Exemples** : conseil, accompagnement, traduction, développement, - - formation, enseignement, sportif - - - Les revenus tirés de ce chiffre d'affaires sont imposable au régime BNC (bénéfices non commerciaux) - question.en: '[automatic] What are the revenues from the liberal activity?' - question.fr: Quelles sont les recettes issues de l’activité libérale ? - résumé.en: '[automatic] Revenue excluding tax' - résumé.fr: Recettes hors taxe - titre.en: '[automatic] Income from liberal activity (BNC)' - titre.fr: Recette de l'activité libérale (BNC) aide déclaration revenu indépendant 2020 . plafond sécurité sociale 2020: titre.en: '[automatic] social security ceiling 2020' titre.fr: plafond sécurité sociale 2020 @@ -1241,6 +1239,8 @@ aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale - normal actual regime:** item A5 of form 2053-SD - controlled declaration:** item BT of form 2035-A-SD + + - micro fiscal regime:** no professional tax return to be filed description.fr: > À reporter dans : @@ -1251,6 +1251,8 @@ aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale - **régime réel normal :** la rubrique A5 du formulaire 2053-SD - **déclaration contrôlée :** la rubrique BT du formulaire 2035-A-SD + + - **régime micro fiscal :** pas de liasse professionnelle fiscale à souscrire résumé.en: '[automatic] [C]' résumé.fr: '[C]' titre.en: '[automatic] Deductible mandatory social security contributions' @@ -7672,10 +7674,10 @@ entreprise . chiffre d'affaires . service BNC: Les revenus tirés de ce chiffre d'affaires sont imposable au régime BNC (bénéfices non commerciaux) - question.en: '[automatic] What is the turnover from liberal services?' - question.fr: Quel est le chiffre d'affaires issu de prestations de service libérale ? - résumé.en: '[automatic] Turnover excluding tax' - résumé.fr: Chiffre d'affaires hors taxe + question.en: '[automatic] What are the revenues from the liberal activity?' + question.fr: Quelles sont les recettes issues de l’activité libérale ? + résumé.en: '[automatic] Revenue excluding taxes' + résumé.fr: Recettes hors taxes titre.en: '[automatic] Other services and liberal activities (BNC)' titre.fr: Autres prestations de service et activités libérales (BNC) entreprise . chiffre d'affaires . seuil micro dépassé: diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 2f3d8a543..4ef169014 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -198,17 +198,17 @@ aide: aid or subsidy aide-déclaration-indépendant: banner: Find out more about our tax<1>returntool description: <0><0>This tool is an aid for the declaration of income for - <2>self-employed workers. It allows you to find out the amount of social - security contributions that are deductible for tax purposes.<1>You - remain entirely responsible for any omissions or inaccuracies in your - declaration.<1><0>This tool concerns you if you are in the following - situation:<1><0>you contribute to the general scheme for self-employed - workers<2>It does not concern you if you are in one of the following - cases:<3><0>you carry out a liberal activity covered by a pension scheme - for the liberal professions in accrual accounting<1>your company is - domiciled in the DOM<2>Taxation<3>These few questions help - determine the type of declaration to be completed, as well as the methods of - calculating social security contributions. + <2>self-employed workers. It allows you to know the amount of deductible + social charges.<1>You remain entirely responsible for any omissions or + inaccuracies in your declaration.<1><0>This tool concerns you if you + are in the following situation:<1><0>you contribute to the general + scheme for self-employed workers<2>It does not concern you if you + are in one of the following cases:<3><0>you carry out a liberal activity + covered by a pension scheme for the liberal professions in accrual + accounting<1>your company is domiciled in the + DOM<2><3>Taxation<4>These few questions help determine + the type of declaration to be completed, as well as the methods of + calculating social security contributions. entreprise: description: You can fill in your company to pre-fill in the form titre: <0>Company and activity diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index 1d2f6ebd6..b6c1b3c17 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -85,17 +85,17 @@ aide-déclaration-indépendant: banner: Découvrez notre outil d'<1>aide à la déclaration des revenus description: <0><0>Cet outil est une aide à la déclaration de revenus à destination des <2>travailleurs indépendants. Il vous permet de - connaître le montant des charges sociales déductibles pour le calcul de - l'impôt.<1>Vous restez entièrement responsable d'éventuelles omissions - ou inexactitudes dans votre déclaration.<1><0>Cet outil vous - concerne si vous êtes dans le cas suivant :<1><0>vous cotisez au régime - général des travailleurs indépendants<2>Il ne vous concerne pas si - vous êtes dans un des cas suivants :<3><0>vous exercez une activité - libérale relevant d’un régime de retraite des professions libérales en - comptabilité d'engagement<1>votre entreprise est domiciliée dans les - DOM<2>Imposition<3>Ces quelques questions permettent de - déterminer le type de déclaration à remplir, ainsi que les modalités de - calcul des cotisations sociales. + connaître le montant des charges sociales déductibles.<1>Vous restez + entièrement responsable d'éventuelles omissions ou inexactitudes dans votre + déclaration.<1><0>Cet outil vous concerne si vous êtes dans le cas + suivant :<1><0>vous cotisez au régime général des travailleurs + indépendants<2>Il ne vous concerne pas si vous êtes dans un des cas + suivants :<3><0>vous exercez une activité libérale relevant d’un régime + de retraite des professions libérales en comptabilité + d'engagement<1>votre entreprise est domiciliée dans les + DOM<2><3>Imposition<4>Ces quelques questions permettent + de déterminer le type de déclaration à remplir, ainsi que les modalités de + calcul des cotisations sociales. entreprise: description: "<0>Facultatif : Vous pouvez renseigner votre entreprise pour pré-remplir le formulaire" diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx index ad74c26c5..333db2174 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx @@ -68,7 +68,7 @@ export default function ResultatsSimples() { Cet outil est une aide à la déclaration de revenus à destination des{' '} travailleurs indépendants. Il vous permet de - connaître le montant des charges sociales déductibles pour le calcul - de l'impôt. + connaître le montant des charges sociales déductibles.

    Vous restez entièrement responsable d'éventuelles omissions ou inexactitudes dans votre déclaration.

    -

    Cet outil vous concerne si vous êtes dans le cas suivant :

      @@ -76,6 +75,7 @@ export default function AideDéclarationIndépendant() {
    • votre entreprise est domiciliée dans les DOM
    +

    Imposition

    @@ -90,6 +90,7 @@ export default function AideDéclarationIndépendant() { )} + @@ -121,9 +122,8 @@ export default function AideDéclarationIndépendant() { déjà en activité en 2020 - - - + + {/* PLNR */} @@ -163,25 +163,25 @@ export default function AideDéclarationIndépendant() { + - {FEATURE_FLAG_RESULTATS_COMPLETS && ( - <> - + + + {/* We can't use a subsection here cause revenu étrangers is not missing when CSG is replaced */} +

    + Revenus étranger +

    + + + + +
    - - {/* We can't use a subsection here cause revenu étrangers is not missing when CSG is replaced */} -

    - Revenus étranger -

    - - - - - - - )} + + + @@ -232,14 +232,13 @@ function ImpositionSection() { expression={ FEATURE_FLAG_RESULTATS_COMPLETS ? 'oui' - : 'aide déclaration revenu indépendant 2020 . cotisations payées = non' + : 'aide déclaration revenu indépendant 2020 . cotisations payées version simple = non' } > -

    Quel est votre chiffre d'affaires hors taxes en 2020 ?

    @@ -251,10 +250,7 @@ function ImpositionSection() {

    - - - - +

    From b5c75cb9e052faaac75ba80f8ecc6537853f4b15 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 1 Jun 2021 15:07:39 +0200 Subject: [PATCH 186/319] =?UTF-8?q?Met=20le=20CA=20=C3=A0=20z=C3=A9ro=20pa?= =?UTF-8?q?r=20d=C3=A9faut=20dans=20la=20d=C3=A9claration=20de=20revenu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../déclaration-revenu-indépendant.yaml | 12 +- mon-entreprise/source/locales/rules-en.yaml | 12 +- .../__snapshots__/simulations.jest.js.snap | 215 ++++++++++++------ 3 files changed, 168 insertions(+), 71 deletions(-) diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index c8caeae34..111789c00 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -12,6 +12,9 @@ aide déclaration revenu indépendant 2020: - # Par défaut on considère que l'entreprise est mixte et on affiche tous les champs règle: entreprise . activité . mixte par: oui + - # Par défaut, le CA est à zéro + règle: entreprise . chiffre d'affaires + par: 0€/an aide déclaration revenu indépendant 2020 . comptabilité: titre: régime de la déclaration contrôlée @@ -40,7 +43,7 @@ aide déclaration revenu indépendant 2020 . cotisations payées: par: CSG non déductible + CRDS - règle: aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires par: - valeur: cotisations payées . total charges sociale + valeur: cotisations payées . total charges sociales abattement: somme: - dirigeant . indépendant . cotisations et contributions . formation professionnelle @@ -54,12 +57,12 @@ aide déclaration revenu indépendant 2020 . cotisations payées: non applicable si: résultat simple valeur: oui -aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociale: +aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociales: remplace: règle: dirigeant . indépendant . cotisations et contributions par: somme: - - cotisations payées . total charges sociale + - cotisations payées . total charges sociales - dirigeant . indépendant . cotisations facultatives . total unité: €/an question: Quel est le montant total des cotisations et contributions sociales payées pendant l'exercice ? @@ -111,7 +114,7 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CRDS: aide déclaration revenu indépendant 2020 . cotisations payées . cotisations obligatoires déductibles: remplace: cotisations obligatoires déductibles unité: €/an - valeur: cotisations payées . total charges sociale + valeur: cotisations payées . total charges sociales abattement: somme: - dirigeant . indépendant . cotisations et contributions . CSG et CRDS @@ -915,6 +918,7 @@ aide déclaration revenu indépendant 2020 . résultat simple . total charges so - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD - **régime réel normal :** la rubrique FZ du formulaire 2052-SD - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD + - **régime micro fiscal :** pas de liasse professionnelle fiscale à souscrire aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale: non applicable si: entreprise . imposition . IR . micro-fiscal diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index ff72a9429..fcb6429d3 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -202,7 +202,7 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductib ? aide déclaration revenu indépendant 2020 . cotisations payées . cotisations obligatoires déductibles : titre.en: '[automatic] deductible mandatory contributions' titre.fr: cotisations obligatoires déductibles -? aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociale +? aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociales : description.en: > [automatic] You can find this amount in your personal Urssaf space. Here are the steps to follow: @@ -234,7 +234,7 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductib Quel est le montant total des cotisations et contributions sociales payées pendant l'exercice ? titre.en: '[automatic] total social charges' - titre.fr: total charges sociale + titre.fr: total charges sociales aide déclaration revenu indépendant 2020 . cotisations payées version simple: titre.en: '[automatic] dues paid simple version' titre.fr: cotisations payées version simple @@ -1272,11 +1272,17 @@ aide déclaration revenu indépendant 2020 . résultat simple . revenu net fisca - simplified actual system:** item 252 of form 2033-B-SD - normal real system:** item FZ of form 2052-SD - controlled declaration:** item BK of form 2035-A-SD - description.fr: | + - micro fiscal regime:** no professional tax return to be filed + description.fr: > À reporter dans : + - **régime réel simplifié :** la rubrique 252 du formulaire 2033-B-SD + - **régime réel normal :** la rubrique FZ du formulaire 2052-SD + - **déclaration contrôlée :** la rubrique BK du formulaire 2035-A-SD + + - **régime micro fiscal :** pas de liasse professionnelle fiscale à souscrire résumé.en: '[automatic] [B + C + D]' résumé.fr: '[B + C + D]' titre.en: '[automatic] tax-deductible mandatory social security charges' diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index d3c6f121b..388a80e01 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -1,91 +1,178 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`calculate aide-déclaration-indépendant: ACRE 1`] = `"[9020,50000,36345,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: ACRE 2`] = `"[913,15000,12630,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: ACRE 3`] = `"[300,5000,4152,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: ACRE 4`] = `"[1487,10000,7511,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: ACRE 5`] = `"[606,10000,8392,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = `"[11409,50000,34048,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: RSA 1`] = `"[82,500,279,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: RSA 2`] = `"[1021,5000,3431,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = `"[9021,50000,37539,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = `"[0,5000,4881,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = `"[33,15000,14803,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = `"[7546,35000,24814,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = `"[14093,50000,31238,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = `"[11933,50000,33398,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = `"[11933,50000,33398,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = `"[14098,50000,31253,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = `"[11461,50000,33870,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = `"[5652,50000,39713,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: international 1`] = `"[14610,50000,35287,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: international 2`] = `"[11875,50000,36215,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = `"[11365,50000,33986,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = `"[1368,5000,3069,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = `"[11369,50000,33996,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = `"[1369,5000,3083,0,1,1,0]"`; - -exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` -"[11369,50000,33996,0,0,1,1] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +exports[`calculate aide-déclaration-indépendant: ACRE 1`] = ` +"[0,50000,49897,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = `"[1369,5000,3083,0,0,1,1]"`; +exports[`calculate aide-déclaration-indépendant: ACRE 2`] = ` +"[0,15000,14897,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: ACRE 3`] = ` +"[0,5000,4897,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: ACRE 4`] = ` +"[525,10000,9372,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: ACRE 5`] = ` +"[0,10000,9897,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: IJSS (indemnité sécurité sociale) 1`] = ` +"[1042,50000,48185,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: RSA 1`] = ` +"[0,500,397,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: RSA 2`] = ` +"[0,5000,4897,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: aide covid 2020 1`] = ` +"[0,50000,49881,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: aide covid 2020 2`] = ` +"[0,5000,4881,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: aide covid 2020 3`] = ` +"[0,15000,14881,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: aide covid 2020 4`] = ` +"[1312,35000,33569,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 1`] = ` +"[4754,50000,45106,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 2`] = ` +"[1823,50000,48037,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 3`] = ` +"[1823,50000,48037,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 4`] = ` +"[4754,50000,45127,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: conjoint collaborateur 5`] = ` +"[1823,50000,48037,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: débit de tabac 1`] = ` +"[1042,50000,48855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: international 1`] = ` +"[1042,50000,48855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: international 2`] = ` +"[1042,50000,48855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 1`] = ` +"[1042,50000,48839,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 2`] = ` +"[1042,5000,3839,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 3`] = ` +"[1042,50000,48855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 4`] = ` +"[1042,5000,3855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 5`] = ` +"[1042,50000,48855,0,0,1,1] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; + +exports[`calculate aide-déclaration-indépendant: nature de l'activité 6`] = ` +"[1042,5000,3855,0,0,1,1] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; exports[`calculate aide-déclaration-indépendant: nature de l'activité 7`] = ` -"[9454,50000,35911,0,0,1,1] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[1042,50000,48855,0,0,1,1] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 1`] = ` -"[1042,500,-681,0,1,1,0] +"[1042,500,-645,0,1,1,0] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 2`] = ` -"[1042,1000,-226,0,1,1,0] +"[1042,1000,-145,0,1,1,0] Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = `"[1067,1500,203,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 3`] = ` +"[1042,1500,355,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = `"[1110,2000,614,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 4`] = ` +"[1042,2000,855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = `"[1369,5000,3083,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 5`] = ` +"[1042,5000,3855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; -exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = `"[2204,10000,6794,0,1,1,0]"`; +exports[`calculate aide-déclaration-indépendant: échelle de revenus 6`] = ` +"[1042,10000,8855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" +`; exports[`calculate aide-déclaration-indépendant: échelle de revenus 7`] = ` -"[20929,100000,69895,0,1,1,0] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[1042,100000,98855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate aide-déclaration-indépendant: échelle de revenus 8`] = ` -"[106448,1000000,802634,0,1,1,0] -Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +"[1042,1000000,998855,0,1,1,0] +Notifications affichées : entreprise . imposition . IR . information sur le report de déficit" `; exports[`calculate simulations-artiste-auteur: bnc 1`] = `"[1230]"`; From 8c0fd73d7944a1613a446708134056c389e7b1fe Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 2 Jun 2021 11:50:16 +0200 Subject: [PATCH 187/319] =?UTF-8?q?=E2=AC=86=20MAJ=20Typescript=20vers=204?= =?UTF-8?q?.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- publicodes/core/package.json | 2 +- publicodes/ui-react/package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index cea2fb1ba..882c1b542 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "style-loader": "^0.23.1", "terser-webpack-plugin": "^3.0.2", "toml-loader": "^1.0.0", - "typescript": "^4.2.4", + "typescript": "^4.3.2", "url-loader": "^4.1.0", "webpack": "^4.42.0", "webpack-bundle-analyzer": "^3.7.0", diff --git a/publicodes/core/package.json b/publicodes/core/package.json index 646ca39b9..f40bb2bde 100644 --- a/publicodes/core/package.json +++ b/publicodes/core/package.json @@ -27,7 +27,7 @@ "devDependencies": { "chai": "^4.2.0", "intl": "^1.2.5", - "typescript": "^4.2.4", + "typescript": "^4.3.2", "dedent-js": "1.0.1" }, "dependencies": { diff --git a/publicodes/ui-react/package.json b/publicodes/ui-react/package.json index edad380e8..a85317804 100644 --- a/publicodes/ui-react/package.json +++ b/publicodes/ui-react/package.json @@ -33,6 +33,6 @@ }, "devDependencies": { "js-yaml": "^4.0.0", - "typescript": "^4.2.4" + "typescript": "^4.3.2" } } diff --git a/yarn.lock b/yarn.lock index dac84ed1c..36a05628a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13495,10 +13495,10 @@ typescript@^3.6.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== -typescript@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" - integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== +typescript@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" + integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== uglify-js@3.4.x: version "3.4.10" From b6e9ddc392105de9c00c10c47b85b3b0858a84bb Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 2 Jun 2021 11:58:35 +0200 Subject: [PATCH 188/319] =?UTF-8?q?=F0=9F=90=9B=20Plafond=20micro-bnc=20de?= =?UTF-8?q?s=20artistes-auteurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Oublié dans #1591 --- modele-social/règles/artiste-auteur.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modele-social/règles/artiste-auteur.yaml b/modele-social/règles/artiste-auteur.yaml index d0aa23f8f..41c232662 100644 --- a/modele-social/règles/artiste-auteur.yaml +++ b/modele-social/règles/artiste-auteur.yaml @@ -31,7 +31,7 @@ artiste-auteur . revenus . BNC . contrôle micro-bnc: formule: toutes ces conditions: - recettes != 0 - - recettes > 72500 €/an + - recettes > 72600 €/an artiste-auteur . revenus . BNC . recettes: titre: Revenu en BNC From 8b919954ccc9af6bb20a19811374fe0b6f528e23 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 1 Jun 2021 17:17:13 +0200 Subject: [PATCH 189/319] =?UTF-8?q?=F0=9F=94=A8=20MAJ=20activit=C3=A9=20pa?= =?UTF-8?q?rtielle=201er=20juin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Et désactivation de ce dispositif dans le simulateur de coûts d'embauche. --- modele-social/règles/salarié.yaml | 24 +++++++++++++++---- .../integration/mon-entreprise/covid19.js | 2 +- .../pages/Simulateurs/configs/salarié.yaml | 2 +- .../__snapshots__/simulations.jest.js.snap | 16 ++++++------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index 5e4e7160a..2858c0e7d 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -416,7 +416,12 @@ contrat salarié . activité partielle . indemnités . base: formule: multiplication: assiette: retrait absence - taux: 70% + # Historique: + # - avant le 01/07/2021: 70% + # - à partir du 01/07/2021 : 60% (sauf pour les secteurs protégés, date repoussée au 01/09/2021) + taux: + valeur: 70% + nom: taux contrat salarié . activité partielle . indemnités . complémentaire: titre: indemnité complémentaire @@ -444,11 +449,11 @@ contrat salarié . activité partielle . indemnités . conventionnelle: grille: assiette: rémunération . assiette congés payés tranches: - - montant: 95% - 70% + - montant: 95% - indemnités . base . taux plafond: 2000 €/mois - - montant: 80% - 70% + - montant: 80% - indemnités . base . taux plafond: plafond sécurité sociale temps plein - - montant: 75% - 70% + - montant: 75% - indemnités . base . taux références: Legifrance: https://www.legifrance.gouv.fr/affichIDCCArticle.do?idArticle=KALIARTI000028465400&cidTexte=KALITEXT000028465378&dateTexte=29990101&categorieLien=id Juritravail: https://www.juritravail.com/Actualite/Hygiene-securite-travail-employeur/Id/327284 @@ -505,8 +510,17 @@ contrat salarié . activité partielle . indemnisation entreprise . taux d'indem formule: variations: - si: secteur d'activité restreint + # Historique: + # - avant le 01/07/2021: 70% + # - avant le 01/08/2021: 60% + # - avant le 01/09/2021: 52% + # - à partir du 01/09/2021: 36% alors: 70% - - sinon: 60% + # Historique: + # - avant le 01/06/2021: 60% + # - avant le 01/07/2021: 52% + # - à partir du 01/07/2021: 36% + - sinon: 52% contrat salarié . activité partielle . secteur d'activité restreint: question: >- diff --git a/mon-entreprise/cypress/integration/mon-entreprise/covid19.js b/mon-entreprise/cypress/integration/mon-entreprise/covid19.js index 2732c9d6d..6e75851ac 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/covid19.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/covid19.js @@ -23,6 +23,6 @@ describe('Page covid-19', function () { it('should display 85 % de prise en charge pour un salaire médian', () => { cy.contains('salaire médian').click() testText('comparaison-net', 'Soit 85 % du revenu net') - testText('comparaison-total', 'Soit 8 % du coût habituel') + testText('comparaison-total', 'Soit 13 % du coût habituel') }) }) diff --git a/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml b/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml index d1ec21520..551718662 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/salarié.yaml @@ -7,7 +7,6 @@ objectifs: questions: à l'affiche: - Chômage partiel: contrat salarié . activité partielle Temps partiel: contrat salarié . temps de travail . temps partiel Emploi franc: contrat salarié . aides employeur . emploi franc . éligible Cadre: contrat salarié . statut cadre @@ -26,4 +25,5 @@ questions: unité par défaut: €/mois situation: dirigeant: non + contrat salarié . activité partielle: non impôt . méthode de calcul . par défaut: "'taux neutre'" diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 388a80e01..005189775 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -693,25 +693,25 @@ exports[`calculate simulations-salarié: JEI 3`] = `"[4518,0,4000,3141,2745]"`; exports[`calculate simulations-salarié: activité partielle 1`] = `"[27,0,1560,1209,1209]"`; -exports[`calculate simulations-salarié: activité partielle 2`] = `"[427,0,4000,2594,2392]"`; +exports[`calculate simulations-salarié: activité partielle 2`] = `"[747,0,4000,2594,2392]"`; -exports[`calculate simulations-salarié: activité partielle 3`] = `"[1429,0,8000,5209,4245]"`; +exports[`calculate simulations-salarié: activité partielle 3`] = `"[1989,0,8000,5209,4245]"`; -exports[`calculate simulations-salarié: activité partielle 4`] = `"[1172,0,4000,2704,2426]"`; +exports[`calculate simulations-salarié: activité partielle 4`] = `"[1428,0,4000,2704,2426]"`; -exports[`calculate simulations-salarié: activité partielle 5`] = `"[2670,0,4000,2870,2574]"`; +exports[`calculate simulations-salarié: activité partielle 5`] = `"[2830,0,4000,2870,2574]"`; -exports[`calculate simulations-salarié: activité partielle 6`] = `"[327,3750,3000,1940,1833]"`; +exports[`calculate simulations-salarié: activité partielle 6`] = `"[567,3750,3000,1940,1833]"`; -exports[`calculate simulations-salarié: activité partielle 7`] = `"[427,0,4000,2594,2485]"`; +exports[`calculate simulations-salarié: activité partielle 7`] = `"[747,0,4000,2594,2485]"`; exports[`calculate simulations-salarié: activité partielle 8`] = `"[397,0,2000,1555,1522]"`; exports[`calculate simulations-salarié: activité partielle 9`] = `"[1241,0,2000,1555,1521]"`; -exports[`calculate simulations-salarié: activité partielle 10`] = `"[927,0,6000,4182,3498]"`; +exports[`calculate simulations-salarié: activité partielle 10`] = `"[1407,0,6000,4182,3498]"`; -exports[`calculate simulations-salarié: activité partielle 11`] = `"[2653,0,9000,6237,4945]"`; +exports[`calculate simulations-salarié: activité partielle 11`] = `"[3213,0,9000,6237,4945]"`; exports[`calculate simulations-salarié: aides 1`] = `"[2303,0,2000,1561,1527]"`; From 0b6bcded0fb6b05743b224a9ef343ba2afdd19ad Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Mon, 31 May 2021 17:29:17 +0200 Subject: [PATCH 190/319] =?UTF-8?q?Uniformise=20l'unit=C3=A9=20des=20arron?= =?UTF-8?q?dis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 2 +- modele-social/règles/salarié.yaml | 2 +- publicodes/core/source/mecanisms/arrondi.ts | 17 ++++++++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index efac6cb99..00a8e2182 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -1040,7 +1040,7 @@ dirigeant . indépendant . cotisations et contributions . maladie: tranches: - taux: valeur: taux progressif - arrondi: 2 unités + arrondi: 2 décimales plafond: 110% - taux: 6.35% plafond: 5 diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index 2858c0e7d..309623654 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -661,7 +661,7 @@ contrat salarié . CDD . congés dus sur la durée du contrat: produit: assiette: 25 jours ouvrés/an facteur: durée contrat - arrondi: 2 unités + arrondi: 2 décimales contrat salarié . CDD . contrôle congés non pris max: type: notification diff --git a/publicodes/core/source/mecanisms/arrondi.ts b/publicodes/core/source/mecanisms/arrondi.ts index 58d1cd88a..ed219e20e 100644 --- a/publicodes/core/source/mecanisms/arrondi.ts +++ b/publicodes/core/source/mecanisms/arrondi.ts @@ -2,7 +2,9 @@ import { EvaluationFunction, simplifyNodeUnit } from '..' import { mergeAllMissing } from '../evaluation' import { registerEvaluationFunction } from '../evaluationFunctions' import parse from '../parse' -import { ASTNode } from '../AST/types' +import { ASTNode, EvaluatedNode } from '../AST/types' +import { serializeUnit } from '../units' +import { evaluationError } from '../error' export type ArrondiNode = { explanation: { @@ -24,6 +26,19 @@ const evaluate: EvaluationFunction<'arrondi'> = function (node) { let arrondi = node.explanation.arrondi if (nodeValue !== false) { arrondi = this.evaluate(arrondi) + + if ( + typeof (arrondi as EvaluatedNode).nodeValue === 'number' && + !serializeUnit((arrondi as EvaluatedNode).unit)?.match(/décimales?/) + ) { + evaluationError( + this.options.logger, + this.cache._meta.evaluationRuleStack[0], + `L'unité ${serializeUnit( + (arrondi as EvaluatedNode).unit + )} de l'arrondi est inconnu. Vous devez utiliser l'unité “décimales”` + ) + } } return { From 6c619a257b1e268e671c964b199d90dc469103c3 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Thu, 27 May 2021 19:44:57 +0200 Subject: [PATCH 191/319] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20=20Cypress=20to=20?= =?UTF-8?q?7.4.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- yarn.lock | 285 ++++++++++++++++++++++++++++----------------------- 2 files changed, 159 insertions(+), 128 deletions(-) diff --git a/package.json b/package.json index 882c1b542..aafd1f36a 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ }, "optionalDependencies": { "bundlesize": "^0.18.0", - "cypress": "^6.8.0", + "cypress": "^7.4.0", "prerender-spa-plugin": "^3.4.0" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index 36a05628a..359986f7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2273,7 +2273,7 @@ dependencies: "@types/color-name" "*" -"@types/color-name@*", "@types/color-name@^1.1.1": +"@types/color-name@*": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== @@ -2377,10 +2377,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.0.tgz#7d4411bf5157339337d7cff864d9ff45f177b499" integrity sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA== -"@types/node@12.12.50": - version "12.12.50" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.50.tgz#e9b2e85fafc15f2a8aa8fdd41091b983da5fd6ee" - integrity sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w== +"@types/node@^14.14.31": + version "14.17.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.1.tgz#5e07e0cb2ff793aa7a1b41deae76221e6166049f" + integrity sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -2538,15 +2538,15 @@ dependencies: "@types/sinonjs__fake-timers" "*" -"@types/sinonjs__fake-timers@*", "@types/sinonjs__fake-timers@^6.0.1": +"@types/sinonjs__fake-timers@*", "@types/sinonjs__fake-timers@^6.0.2": version "6.0.2" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae" integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg== "@types/sizzle@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" - integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== "@types/source-list-map@*": version "0.1.2" @@ -2639,6 +2639,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" + integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + dependencies: + "@types/node" "*" + "@types/yoga-layout@1.9.2": version "1.9.2" resolved "https://registry.yarnpkg.com/@types/yoga-layout/-/yoga-layout-1.9.2.tgz#efaf9e991a7390dc081a0b679185979a83a9639a" @@ -3159,21 +3166,13 @@ ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" @@ -3212,7 +3211,7 @@ arch@^2.1.0: resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf" integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ== -arch@^2.1.2: +arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== @@ -3615,9 +3614,9 @@ balanced-match@^0.4.2: integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.0.2, base64-js@^1.1.2: version "1.3.1" @@ -3697,7 +3696,7 @@ blob-stream@^0.1.3: dependencies: blob "0.0.4" -blob-util@2.0.2: +blob-util@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== @@ -4231,9 +4230,9 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4 supports-color "^5.3.0" chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -4346,6 +4345,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -5113,19 +5117,19 @@ cypress-plugin-tab@^1.0.5: dependencies: ally.js "^1.4.1" -cypress@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-6.8.0.tgz#8338f39212a8f71e91ff8c017a1b6e22d823d8c1" - integrity sha512-W2e9Oqi7DmF48QtOD0LfsOLVq6ef2hcXZvJXI/E3PgFNmZXEVwBefhAxVCW9yTPortjYA2XkM20KyC4HRkOm9w== +cypress@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-7.4.0.tgz#679bfe75335b9a4873d44f0d989e9f0367f00665" + integrity sha512-+CmSoT5DS88e92YDfc6aDA3Zf3uCBRKVB92caWsjXMilz0tf6NpByFvIbLLVWXiYOwrhtWV0m/k93+rzodYwRQ== dependencies: "@cypress/listr-verbose-renderer" "^0.4.1" "@cypress/request" "^2.88.5" "@cypress/xvfb" "^1.2.4" - "@types/node" "12.12.50" - "@types/sinonjs__fake-timers" "^6.0.1" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "^6.0.2" "@types/sizzle" "^2.3.2" - arch "^2.1.2" - blob-util "2.0.2" + arch "^2.2.0" + blob-util "^2.0.2" bluebird "^3.7.2" cachedir "^2.3.0" chalk "^4.1.0" @@ -5133,27 +5137,26 @@ cypress@^6.8.0: cli-table3 "~0.6.0" commander "^5.1.0" common-tags "^1.8.0" - dayjs "^1.9.3" + dayjs "^1.10.4" debug "4.3.2" - eventemitter2 "^6.4.2" - execa "^4.0.2" + eventemitter2 "^6.4.3" + execa "4.1.0" executable "^4.1.1" - extract-zip "^1.7.0" - fs-extra "^9.0.1" + extract-zip "2.0.1" + fs-extra "^9.1.0" getos "^3.2.1" - is-ci "^2.0.0" - is-installed-globally "^0.3.2" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" lazy-ass "^1.6.0" listr "^0.14.3" - lodash "^4.17.19" + lodash "^4.17.21" log-symbols "^4.0.0" minimist "^1.2.5" - moment "^2.29.1" ospath "^1.2.2" - pretty-bytes "^5.4.1" + pretty-bytes "^5.6.0" ramda "~0.27.1" request-progress "^3.0.0" - supports-color "^7.2.0" + supports-color "^8.1.1" tmp "~0.2.1" untildify "^4.0.0" url "^0.11.0" @@ -5248,10 +5251,10 @@ date-fns@^2.16.1: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.21.1.tgz#679a4ccaa584c0706ea70b3fa92262ac3009d2b0" integrity sha512-m1WR0xGiC6j6jNFAyW4Nvh4WxAi4JF4w9jRJwSI8nBmNcyZXPcP9VUQG+6gHQXAmqaGEKDKhOqAtENDC941UkA== -dayjs@^1.9.3: - version "1.10.4" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2" - integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw== +dayjs@^1.10.4: + version "1.10.5" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.5.tgz#5600df4548fc2453b3f163ebb2abbe965ccfb986" + integrity sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g== de-indent@^1.0.2: version "1.0.2" @@ -6146,7 +6149,7 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eventemitter2@^6.4.2: +eventemitter2@^6.4.3: version "6.4.4" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.4.tgz#aa96e8275c4dbeb017a5d0e03780c65612a1202b" integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw== @@ -6174,6 +6177,21 @@ exec-sh@^0.3.2: resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -6213,21 +6231,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - executable@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -6361,7 +6364,18 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.6.6, extract-zip@^1.7.0: +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extract-zip@^1.6.6: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== @@ -6710,15 +6724,15 @@ fs-extra@^6.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== +fs-extra@^9.0.1, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" - universalify "^1.0.0" + universalify "^2.0.0" fs-minipass@^2.0.0: version "2.1.0" @@ -6848,7 +6862,7 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" -get-stream@^5.0.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -6929,7 +6943,7 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -6941,12 +6955,24 @@ glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" - integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== +glob@^7.1.3: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: - ini "1.3.7" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" global-modules@^1.0.0: version "1.0.0" @@ -7035,12 +7061,12 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.2.0: +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -7653,16 +7679,21 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@1.3.7, ini@^1.3.5, ini@~1.3.0: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" - integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== ini@^1.3.4: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@^1.3.5, ini@~1.3.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + inquirer@^7.0.0: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" @@ -7814,6 +7845,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-ci@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" + integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== + dependencies: + ci-info "^3.1.1" + is-core-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" @@ -7926,13 +7964,13 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== -is-installed-globally@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" + global-dirs "^3.0.0" + is-path-inside "^3.0.2" is-module@^1.0.0: version "1.0.0" @@ -7978,7 +8016,7 @@ is-observable@^1.1.0: dependencies: symbol-observable "^1.1.0" -is-path-inside@^3.0.1: +is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -9066,12 +9104,12 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@~4.17.4: +lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@~4.17.4: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.21: +lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9336,10 +9374,10 @@ mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== -mime-db@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== +mime-db@1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-db@~1.33.0: version "1.33.0" @@ -9354,11 +9392,11 @@ mime-types@2.1.18: mime-db "~1.33.0" mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.46.0" + mime-db "1.47.0" mime-types@^2.1.27, mime-types@~2.1.24: version "2.1.27" @@ -9601,11 +9639,6 @@ mock-local-storage@^1.0.5: core-js "^0.8.3" global "^4.3.2" -moment@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - monaco-editor-webpack-plugin@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-1.9.0.tgz#5b547281b9f404057dc5d8c5722390df9ac90be6" @@ -10865,11 +10898,16 @@ prettier@^2.2.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== -pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: +pretty-bytes@^5.3.0: version "5.4.1" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.4.1.tgz#cd89f79bbcef21e3d21eb0da68ffe93f803e884b" integrity sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA== +pretty-bytes@^5.4.1, pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + pretty-error@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -12125,10 +12163,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.3.3: - version "6.6.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" - integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg== +rxjs@^6.3.3, rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" @@ -12139,13 +12177,6 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" -rxjs@^6.6.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -13006,21 +13037,21 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== dependencies: has-flag "^4.0.0" -supports-color@^7.2.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.1.0: +supports-color@^8.1.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -13416,11 +13447,16 @@ ts-toolbelt@^6.3.3: resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz#cb3b43ed725cb63644782c64fbcad7d8f28c0a83" integrity sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A== -tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.8.1, tslib@^1.9.3: version "1.13.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" @@ -13669,11 +13705,6 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" From 6faf98964a025f318443f66d41489ceeb26ff31a Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Thu, 27 May 2021 19:52:43 +0200 Subject: [PATCH 192/319] =?UTF-8?q?=E2=9C=85=20Split=20Cypress=20simulateu?= =?UTF-8?q?r=20tests=20&=20some=20improvements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * modularize generic simulateurs tests * split salarié * improve perf (mostly: remove cy.wait calls) * ignore downloads folder --- mon-entreprise/.gitignore | 1 + .../integration/mon-entreprise/iframe.js | 1 - .../mon-entreprise/localisation-field.js | 19 +++ .../mon-entreprise/partage-simulation.js | 35 +++++ .../mon-entreprise/persistence-simulation.js | 34 +++++ .../mon-entreprise/simulateur-ae.js | 28 ++++ .../mon-entreprise/simulateur-salarie.js | 41 ++++++ .../simulateurs-generic/auto-entrepreneur.js | 3 + .../simulateurs-generic/dirigeant-sasu.js | 3 + .../simulateurs-generic/indépendant.js | 3 + .../profession-liberale.js | 3 + .../profession-liberale/auxiliaire-medical.js | 3 + .../chirurgien-dentiste.js | 3 + .../profession-liberale/medecin.js | 3 + .../profession-liberale/sage-femme.js | 3 + .../simulateurs-generic/salarié.js | 3 + .../integration/mon-entreprise/simulateurs.js | 125 ------------------ .../cypress/integration/publi.codes/index.js | 1 - mon-entreprise/cypress/support/simulateur.js | 68 ++++++++++ 19 files changed, 253 insertions(+), 127 deletions(-) create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/localisation-field.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/partage-simulation.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/persistence-simulation.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateur-ae.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateur-salarie.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/auto-entrepreneur.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/dirigeant-sasu.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/indépendant.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/auxiliaire-medical.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/chirurgien-dentiste.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/medecin.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/sage-femme.js create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/salarié.js create mode 100644 mon-entreprise/cypress/support/simulateur.js diff --git a/mon-entreprise/.gitignore b/mon-entreprise/.gitignore index d0deaa9b6..8cb3d3668 100644 --- a/mon-entreprise/.gitignore +++ b/mon-entreprise/.gitignore @@ -3,3 +3,4 @@ source/data/* !source/data/versement-transport.json cypress/videos cypress/screenshots +cypress/downloads diff --git a/mon-entreprise/cypress/integration/mon-entreprise/iframe.js b/mon-entreprise/cypress/integration/mon-entreprise/iframe.js index 86b694f5e..fa926412f 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/iframe.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/iframe.js @@ -5,7 +5,6 @@ describe('Iframe integration test', function () { it('should display an iframe of the simulateur', function () { cy.visit('/dev/integration-test') cy.contains('Visualiser').click() - cy.wait(1000) cy.get('#simulateurEmbauche').iframe().contains('Salaire net') }) }) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/localisation-field.js b/mon-entreprise/cypress/integration/mon-entreprise/localisation-field.js new file mode 100644 index 000000000..43ec586b9 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/localisation-field.js @@ -0,0 +1,19 @@ +const fr = Cypress.env('language') === 'fr' +const inputSelector = 'input.currencyInput__input:not([name$="charges"])' + +describe('Champs localisation (simulateur salarié)', () => { + if (!fr) { + return + } + before(() => cy.visit(encodeURI('/simulateurs/salarié'))) + + it('should not crash when selecting localisation', function () { + cy.get(inputSelector).first().type('{selectall}42') + cy.contains('Commune').click({ force: true }) + cy.get('fieldset input[type="search"]').type('Steenvoorde') + cy.contains('Steenvoorde (59114)').click({ force: true }) + cy.contains('Suivant').click({ force: true }) + cy.contains('Voir mes paramètres').click({ force: true }) + cy.contains('Steenvoorde') + }) +}) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/partage-simulation.js b/mon-entreprise/cypress/integration/mon-entreprise/partage-simulation.js new file mode 100644 index 000000000..729ff5e66 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/partage-simulation.js @@ -0,0 +1,35 @@ +const fr = Cypress.env('language') === 'fr' + +describe('Partage (simulateur salarié)', () => { + const brutInputSelector = + 'input.currencyInput__input[name="contrat salarié . rémunération . brut de base"]' + const simulatorUrl = '/simulateurs/salaire-brut-net' + const searchParams = new URLSearchParams({ + 'contrat salarié': "'CDD'", + 'salaire-brut': '1539€/mois', + }) + searchParams.set('utm_source', 'sharing') + + const urlWithState = `${simulatorUrl}?${searchParams.toString()}` + if (!fr) { + return + } + it('should set input value from URL', function () { + cy.visit(urlWithState) + cy.get(brutInputSelector).first().invoke('val').should('eq', '1 539') + + cy.contains('Voir mes paramètres').click() + cy.get('span.answerContent').first().contains('CDD') + }) + it('should set URL from input value', function () { + cy.visit(simulatorUrl) + cy.get(brutInputSelector).first().type('{selectall}1539') + cy.contains('De quel type de contrat').should('be.visible') + cy.get('.step').contains('CDD').should('be.visible').click() + cy.get('button').contains('Suivant').should('be.visible') + cy.contains('Générer un lien').click() + cy.get('.shareableLink') + .invoke('val') + .should('eq', Cypress.config().baseUrl + urlWithState) + }) +}) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/persistence-simulation.js b/mon-entreprise/cypress/integration/mon-entreprise/persistence-simulation.js new file mode 100644 index 000000000..24d7504c8 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/persistence-simulation.js @@ -0,0 +1,34 @@ +const fr = Cypress.env('language') === 'fr' +const inputSelector = 'input.currencyInput__input:not([name$="charges"])' + +describe('Persistence (simulateur salarié)', () => { + if (!fr) { + return + } + before(() => cy.visit(encodeURI('/simulateurs/salarié'))) + beforeEach(() => { + cy.clearLocalStorage() + }) + + it('should persist the current simulation (persistSimulation)', function () { + cy.get(inputSelector).first().type('{selectall}42') + cy.contains('Passer').click() + cy.contains('Passer').click() + cy.contains('Passer').click() + cy.get('body').should(() => { + expect( + window.localStorage.getItem( + 'mon-entreprise::persisted-simulation::v5::/simulateurs/salaire-brut-net' + ) + ).to.be.not.null + }) + cy.visit('/simulateurs/auto-entrepreneur') + cy.get(inputSelector).first().type('{selectall}007') + cy.contains('Passer').click() + cy.contains('Passer').click() + cy.contains('Passer').click() + cy.visit(encodeURI('/simulateurs/salarié')) + cy.contains('Retrouver ma simulation').click() + cy.get(inputSelector).first().invoke('val').should('match', /42/) + }) +}) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateur-ae.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateur-ae.js new file mode 100644 index 000000000..708a7ad89 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateur-ae.js @@ -0,0 +1,28 @@ +const fr = Cypress.env('language') === 'fr' +const inputSelector = 'input.currencyInput__input:not([name$="charges"])' + +describe('Simulateur auto-entrepreneur', () => { + if (!fr) { + return + } + before(() => cy.visit('/simulateurs/auto-entrepreneur')) + + it('should allow to enter the date of creation', () => { + cy.get(inputSelector).first().type('{selectall}50000') + cy.contains('Passer').click() + cy.contains('Passer').click() + cy.contains('Début 2021').click() + cy.contains('ACRE') + }) + it('should not have negative value', () => { + cy.contains('Mensuel').click() + cy.wait(100) + cy.get(inputSelector).first().type('{selectall}5000') + cy.get(inputSelector).each(($input) => { + cy.wrap($input).should(($i) => { + const val = +$i.val().replace(/[\s,.]/g, '') + expect(val).not.to.be.below(4000) + }) + }) + }) +}) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateur-salarie.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateur-salarie.js new file mode 100644 index 000000000..e41934b31 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateur-salarie.js @@ -0,0 +1,41 @@ +const fr = Cypress.env('language') === 'fr' + +describe('Simulateur salarié', () => { + if (!fr) { + return + } + before(() => cy.visit(encodeURI('/simulateurs/salarié'))) + + describe('part time contract', () => { + before(() => { + cy.visit(encodeURI('/simulateurs/salarié')) + cy.get('input[name$="brut de base"]').click() + cy.get('button').contains('SMIC').click() + cy.contains('Voir mes paramètres').click() + cy.contains('Temps partiel').click() + cy.get('input[value="oui"]').parent().click() + cy.wait(100) + }) + + it('should permit selecting the smic before part-time contrat', () => { + cy.get('input[name$="brut de base"]').should(($input) => { + expect(+$input.val().replace(/[\s,.]/g, '')) + .to.be.above(1300) + .and.to.be.below(1500) + }) + }) + + it('should permit customizing the number of worked hours and clear the input value', () => { + cy.contains('Suivant').click() + cy.get('fieldset input[type="text"]').type(25) + cy.get('input[name$="net après impôt"]').should(($input) => { + expect(+$input.val().replace(/[\s,.]/g, '')).to.be.below(1000) + }) + + cy.get('fieldset input[type="text"]').clear() + cy.get('input[name$="net après impôt"]').should(($input) => { + expect(+$input.val().replace(/[\s,.]/g, '')).to.be.above(1000) + }) + }) + }) +}) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/auto-entrepreneur.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/auto-entrepreneur.js new file mode 100644 index 000000000..a0650b464 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/auto-entrepreneur.js @@ -0,0 +1,3 @@ +import { runSimulateurTest } from '../../../support/simulateur' + +runSimulateurTest('auto-entrepreneur') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/dirigeant-sasu.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/dirigeant-sasu.js new file mode 100644 index 000000000..b8fa0adc2 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/dirigeant-sasu.js @@ -0,0 +1,3 @@ +import { runSimulateurTest } from '../../../support/simulateur' + +runSimulateurTest('dirigeant-sasu') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/indépendant.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/indépendant.js new file mode 100644 index 000000000..820cb22be --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/indépendant.js @@ -0,0 +1,3 @@ +import { runSimulateurTest } from '../../../support/simulateur' + +runSimulateurTest('indépendant') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale.js new file mode 100644 index 000000000..58242a1fb --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale.js @@ -0,0 +1,3 @@ +import { runSimulateurTest } from '../../../support/simulateur' + +runSimulateurTest('profession-liberale') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/auxiliaire-medical.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/auxiliaire-medical.js new file mode 100644 index 000000000..6ba1f1489 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/auxiliaire-medical.js @@ -0,0 +1,3 @@ +import { runSimulateurTest } from '../../../../support/simulateur' + +runSimulateurTest('profession-liberale/auxiliaire-medical') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/chirurgien-dentiste.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/chirurgien-dentiste.js new file mode 100644 index 000000000..567d874a1 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/chirurgien-dentiste.js @@ -0,0 +1,3 @@ +import { runSimulateurTest } from '../../../../support/simulateur' + +runSimulateurTest('profession-liberale/chirurgien-dentiste') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/medecin.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/medecin.js new file mode 100644 index 000000000..aaba909a2 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/medecin.js @@ -0,0 +1,3 @@ +import { runSimulateurTest } from '../../../../support/simulateur' + +runSimulateurTest('profession-liberale/medecin') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/sage-femme.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/sage-femme.js new file mode 100644 index 000000000..9674099db --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/profession-liberale/sage-femme.js @@ -0,0 +1,3 @@ +import { runSimulateurTest } from '../../../../support/simulateur' + +runSimulateurTest('profession-liberale/sage-femme') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/salarié.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/salarié.js new file mode 100644 index 000000000..ea222411d --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs-generic/salarié.js @@ -0,0 +1,3 @@ +import { runSimulateurTest } from '../../../support/simulateur' + +runSimulateurTest('salarié') diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js index 5a10c0b35..968731d52 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js @@ -76,128 +76,3 @@ describe('Simulateurs', function () { }) ) }) -describe('Simulateur auto-entrepreneur', () => { - if (!fr) { - return - } - before(() => cy.visit('/simulateurs/auto-entrepreneur')) - - it('should allow to enter the date of creation', () => { - cy.get(inputSelector).first().type('{selectall}50000') - cy.contains('Passer').click() - cy.contains('Passer').click() - cy.contains('Début 2021').click() - cy.contains('ACRE') - }) - it('should not have negative value', () => { - cy.contains('Mensuel').click() - cy.wait(100) - cy.get(inputSelector).first().type('{selectall}5000') - cy.wait(800) - cy.get(inputSelector).each(($input) => { - const val = +$input.val().replace(/[\s,.]/g, '') - expect(val).not.to.be.below(4000) - }) - }) -}) - -describe('Simulateur salarié mode partagé', () => { - const brutInputSelector = - 'input.currencyInput__input[name="contrat salarié . rémunération . brut de base"]' - const simulatorUrl = '/simulateurs/salaire-brut-net' - const searchParams = new URLSearchParams({ - 'contrat salarié': "'CDD'", - 'salaire-brut': '1539€/mois', - }) - searchParams.set('utm_source', 'sharing') - - const urlWithState = `${simulatorUrl}?${searchParams.toString()}` - if (!fr) { - return - } - it('should set input value from URL', function () { - cy.visit(urlWithState) - cy.wait(800) - cy.get(brutInputSelector).first().invoke('val').should('eq', '1 539') - - cy.contains('Voir mes paramètres').click() - cy.get('span.answerContent').first().contains('CDD') - }) - it('should set URL from input value', function () { - cy.visit(simulatorUrl) - cy.get(brutInputSelector).first().type('{selectall}1539') - cy.wait(1000) - cy.get('.step').find('input[value="\'CDD\'"]').click({ force: true }) - cy.wait(1000) - cy.contains('Générer un lien').click() - cy.get('.shareableLink') - .invoke('val') - .should('eq', Cypress.config().baseUrl + urlWithState) - }) -}) - -describe('Simulateur salarié', () => { - if (!fr) { - return - } - before(() => cy.visit(encodeURI('/simulateurs/salarié'))) - - it('should persist the current simulation (persistSimulation)', function () { - cy.get(inputSelector).first().type('{selectall}42') - cy.contains('Passer').click() - cy.contains('Passer').click() - cy.contains('Passer').click() - cy.wait(1600) - cy.visit('/simulateurs/auto-entrepreneur') - cy.get(inputSelector).first().type('{selectall}007') - cy.contains('Passer').click() - cy.contains('Passer').click() - cy.contains('Passer').click() - cy.wait(1600) - cy.visit(encodeURI('/simulateurs/salarié')) - cy.contains('Retrouver ma simulation').click() - cy.get(inputSelector).first().invoke('val').should('match', /42/) - }) - - it('should not crash when selecting localisation', function () { - cy.contains('Commune').click() - cy.get('fieldset input[type="search"]').type('Steenvoorde') - cy.contains('Steenvoorde (59114)').click() - cy.contains('Suivant').click() - cy.contains('Voir mes paramètres').click() - cy.contains('Steenvoorde') - }) - - describe('part time contract', () => { - before(() => { - cy.visit(encodeURI('/simulateurs/salarié')) - cy.get('input[name$="brut de base"]').click() - cy.get('button').contains('SMIC').click() - cy.contains('Voir mes paramètres').click() - cy.contains('Temps partiel').click() - cy.get('input[value="oui"]').parent().click() - cy.wait(100) - }) - - it('should permit selecting the smic before part-time contrat', () => { - cy.get('input[name$="brut de base"]').should(($input) => { - expect(+$input.val().replace(/[\s,.]/g, '')) - .to.be.above(1300) - .and.to.be.below(1500) - }) - }) - - it('should permit customizing the number of worked hours and clear the input value', () => { - cy.contains('Suivant').click() - cy.get('fieldset input[type="text"]').type(25) - cy.get('input[name$="net après impôt"]').should(($input) => { - expect(+$input.val().replace(/[\s,.]/g, '')).to.be.below(1000) - }) - - cy.get('fieldset input[type="text"]').clear() - cy.get('input[name$="net après impôt"]').should(($input) => { - expect(+$input.val().replace(/[\s,.]/g, '')).to.be.above(1000) - }) - }) - }) -}) diff --git a/mon-entreprise/cypress/integration/publi.codes/index.js b/mon-entreprise/cypress/integration/publi.codes/index.js index ba756f0c4..ffe07863d 100644 --- a/mon-entreprise/cypress/integration/publi.codes/index.js +++ b/mon-entreprise/cypress/integration/publi.codes/index.js @@ -9,7 +9,6 @@ describe('Navigation', function () { }) it('bac à sable should work', function () { cy.contains('Bac à sable').click() - cy.wait(5000) cy.contains('Dépenses primeur') cy.contains('11,50') }) diff --git a/mon-entreprise/cypress/support/simulateur.js b/mon-entreprise/cypress/support/simulateur.js new file mode 100644 index 000000000..b98bcca05 --- /dev/null +++ b/mon-entreprise/cypress/support/simulateur.js @@ -0,0 +1,68 @@ +const inputSelector = 'input.currencyInput__input:not([name$="charges"])' +const chargeInputSelector = 'input.currencyInput__input[name$="charges"]' +const fr = Cypress.env('language') === 'fr' + +export const runSimulateurTest = (simulateur) => { + if (!fr) return + + describe(`Simulateur ${simulateur}`, () => { + before(() => cy.visit(encodeURI(`/simulateurs/${simulateur}`))) + it('should not crash', function () { + cy.get(inputSelector) + }) + + it('should display a result when entering a value in any of the currency input', () => { + cy.contains('Annuel').click() + if (['indépendant', 'profession-liberale'].includes(simulateur)) { + cy.get(chargeInputSelector).type(1000) + } + cy.get(inputSelector).each(($testedInput) => { + cy.wrap($testedInput) + .type('{selectall}60111') + .and(($i) => + expect($i.val().replace(/[\s,.]/g, '')).to.match(/[1-9][\d]{3,6}$/) + ) + cy.get(inputSelector).each(($input) => { + if ($testedInput.get(0) === $input.get(0)) return + cy.wrap($input).and(($i) => { + const val = $i.val().replace(/[\s,.]/g, '') + expect(val).not.to.be.eq('60111') + expect(val).to.match(/[1-9][\d]{3,6}$/) + }) + }) + cy.contains('Cotisations') + }) + }) + + it('should allow to change period', function () { + cy.contains('Annuel').click() + cy.get(inputSelector).first().type('{selectall}12000') + if (['indépendant', 'profession-liberale'].includes(simulateur)) { + cy.get(chargeInputSelector).type('{selectall}6000') + } + cy.get(inputSelector).eq(1).invoke('val').should('not.be.empty') + cy.contains('Mensuel').click() + cy.get(inputSelector) + .first() + .invoke('val') + .should('match', /1[\s]000/) + if (['indépendant', 'profession-liberale'].includes(simulateur)) { + cy.get(chargeInputSelector).first().invoke('val').should('eq', '500') + } + cy.contains('Annuel').click() + }) + + it('should allow to navigate to a documentation page', function () { + cy.get(inputSelector).first().type('{selectall}2000') + cy.contains('Cotisations').click() + cy.location().should((loc) => { + expect(loc.pathname).to.match(/\/documentation\/.*\/cotisations/) + }) + }) + + it('should allow to go back to the simulation', function () { + cy.contains('← ').click() + cy.get(inputSelector).first().invoke('val').should('eq', '2 000') + }) + }) +} From 8e5322fc27d6fc40f4d28bb673246155a876008b Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Fri, 28 May 2021 15:22:26 +0200 Subject: [PATCH 193/319] =?UTF-8?q?=E2=9C=85=20Fix=20demande=20mobilit?= =?UTF-8?q?=C3=A9=20e2e=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The spec (describe) was stateful, which it shouldn't. Fix #1559 --- .../mon-entreprise/demande-mobilité.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js b/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js index f8ef40e8b..d6599eb53 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/demande-mobilité.js @@ -16,7 +16,8 @@ describe( it('should not crash', () => { cy.contains('Demande de mobilité internationale') }) - it('should allow to complete "coordonnées" section', () => { + it('should allow to complete and download', () => { + // "coordonnées" section cy.contains('SIRET').click() cy.focused() .type('684 064 0011') @@ -56,8 +57,8 @@ describe( .tab() .type('06 85 69 78 54') .tab() - }) - it('should allow to complete "activité en France" section', () => { + + // "activité en France" section cy.focused() .type('Deaux & Fils') .tab() @@ -68,8 +69,8 @@ describe( cy.contains('29240').click() cy.contains('Organisme Urssaf').click() cy.focused().type('Bretagne').tab().tab().type('Boulangerie') - }) - it('should allow to complete "votre demande" section', () => { + + // "votre demande" section cy.get("input[name='demande . pays unique'][value='oui']").next().click() cy.get("input[name='demande . infrastructure sauvegardée'][value='oui']") .next() @@ -98,8 +99,8 @@ describe( ) .next() .click() - }) - it.skip('should allow to download PDF', () => { + + // download PDF cy.contains( 'Je certifie l’exactitude des informations communiquées ci-dessus' ).click() From 9e1b0304f13b72a2a89e9112eefeac78b86587fa Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Wed, 2 Jun 2021 11:02:57 +0200 Subject: [PATCH 194/319] =?UTF-8?q?=E2=9C=85=20Cypress=20stubbing=20for=20?= =?UTF-8?q?g=C3=A9rer.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To build fixtures, run: $ yarn workspace mon-entreprise test:record-http-calls:mon-entreprise --spec .../gérer.js Usual cypress runs will automatically stub API responses using the fixtures. --- ...V4dC9qb2hhbiUyMGdpcm9kP3Blcl9wYWdlPTU=.json | 240 +++++++ ...YxL2Z1bGxfdGV4dC9tZW5vej9wZXJfcGFnZT01.json | 596 ++++++++++++++++++ ...Q4MDEzNDc4Mj9zdGF0dXRfZGlmZnVzaW9uPU8=.json | 296 +++++++++ ...Q5MzA5NjU4MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json | 233 +++++++ ...QwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json | 296 +++++++++ ...UxMTEyNTEyMj9zdGF0dXRfZGlmZnVzaW9uPU8=.json | 233 +++++++ ...UzNDg4NjY1MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json | 359 +++++++++++ ...gwMDU1OTA2ND9zdGF0dXRfZGlmZnVzaW9uPU8=.json | 233 +++++++ ...gzNDM2NDI5MT9zdGF0dXRfZGlmZnVzaW9uPU8=.json | 170 +++++ .../ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json | 12 + .../ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json | 12 + .../integration/mon-entreprise/gérer.js | 70 +- mon-entreprise/package.json | 1 + 13 files changed, 2748 insertions(+), 3 deletions(-) create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YxL2Z1bGxfdGV4dC9qb2hhbiUyMGdpcm9kP3Blcl9wYWdlPTU=.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YxL2Z1bGxfdGV4dC9tZW5vej9wZXJfcGFnZT01.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQ4MDEzNDc4Mj9zdGF0dXRfZGlmZnVzaW9uPU8=.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQ5MzA5NjU4MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzUxMTEyNTEyMj9zdGF0dXRfZGlmZnVzaW9uPU8=.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzUzNDg4NjY1MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzgwMDU1OTA2ND9zdGF0dXRfZGlmZnVzaW9uPU8=.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzgzNDM2NDI5MT9zdGF0dXRfZGlmZnVzaW9uPU8=.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvMzQxNjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json create mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvNzUxMjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YxL2Z1bGxfdGV4dC9qb2hhbiUyMGdpcm9kP3Blcl9wYWdlPTU=.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YxL2Z1bGxfdGV4dC9qb2hhbiUyMGdpcm9kP3Blcl9wYWdlPTU=.json new file mode 100644 index 000000000..47e2b1c49 --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YxL2Z1bGxfdGV4dC9qb2hhbiUyMGdpcm9kP3Blcl9wYWdlPTU=.json @@ -0,0 +1,240 @@ +{ + "total_results": 2, + "total_pages": 1, + "per_page": 5, + "page": 1, + "etablissement": [ + { + "id": 148523409, + "siren": "493096580", + "siret": "49309658000029", + "nic": "00029", + "l1_normalisee": "MONSIEUR JOHAN GIROD", + "l2_normalisee": null, + "l3_normalisee": null, + "l4_normalisee": "ROUTE DE SAINT PONS", + "l5_normalisee": null, + "l6_normalisee": "34390 MONS", + "l7_normalisee": null, + "l1_declaree": "PAYSAGISTE DU CAROUX", + "l2_declaree": null, + "l3_declaree": null, + "l4_declaree": "ROUTE DE SAINT PONS", + "l5_declaree": null, + "l6_declaree": "34390 MONS", + "l7_declaree": null, + "numero_voie": null, + "indice_repetition": null, + "type_voie": "RTE", + "libelle_voie": "DE SAINT PONS", + "code_postal": "34390", + "cedex": null, + "region": "76", + "libelle_region": "Occitanie", + "departement": "34", + "arrondissement": "1", + "canton": "24", + "commune": "160", + "libelle_commune": "MONS", + "departement_unite_urbaine": "34", + "taille_unite_urbaine": "0", + "numero_unite_urbaine": "34000", + "etablissement_public_cooperation_intercommunale": "200066348", + "tranche_commune_detaillee": "11", + "zone_emploi": "9108", + "is_siege": "1", + "enseigne": null, + "indicateur_champ_publipostage": "A", + "statut_prospection": null, + "date_introduction_base_diffusion": "201310", + "nature_entrepreneur_individuel": null, + "libelle_nature_entrepreneur_individuel": null, + "activite_principale": "8130Z", + "libelle_activite_principale": "Services d'aménagement paysager", + "date_validite_activite_principale": null, + "tranche_effectif_salarie": "NN", + "libelle_tranche_effectif_salarie": null, + "tranche_effectif_salarie_centaine_pret": null, + "date_validite_effectif_salarie": null, + "origine_creation": null, + "date_creation": "20101022", + "date_debut_activite": "20131001", + "nature_activite": null, + "lieu_activite": null, + "type_magasin": null, + "is_saisonnier": null, + "modalite_activite_principale": null, + "caractere_productif": null, + "participation_particuliere_production": null, + "caractere_auxiliaire": null, + "nom_raison_sociale": "GIROD*JOHAN/", + "sigle": null, + "nom": "GIROD", + "prenom": "JOHAN", + "civilite": "MONSIEUR", + "numero_rna": null, + "nic_siege": "00029", + "region_siege": "76", + "departement_commune_siege": "34160", + "email": null, + "nature_juridique_entreprise": "1000", + "libelle_nature_juridique_entreprise": "Entrepreneur individuel", + "activite_principale_entreprise": "8130Z", + "libelle_activite_principale_entreprise": "Services d'aménagement paysager", + "date_validite_activite_principale_entreprise": null, + "activite_principale_registre_metier": null, + "is_ess": null, + "date_ess": null, + "tranche_effectif_salarie_entreprise": "NN", + "libelle_tranche_effectif_salarie_entreprise": null, + "tranche_effectif_salarie_entreprise_centaine_pret": null, + "date_validite_effectif_salarie_entreprise": null, + "categorie_entreprise": "PME", + "date_creation_entreprise": "200612", + "date_introduction_base_diffusion_entreprise": "201303", + "indice_monoactivite_entreprise": null, + "modalite_activite_principale_entreprise": null, + "caractere_productif_entreprise": null, + "date_validite_rubrique_niveau_entreprise_esa": null, + "tranche_chiffre_affaire_entreprise_esa": null, + "activite_principale_entreprise_esa": null, + "premiere_activite_secondaire_entreprise_esa": null, + "deuxieme_activite_secondaire_entreprise_esa": null, + "troisieme_activite_secondaire_entreprise_esa": null, + "quatrieme_activite_secondaire_entreprise_esa": null, + "nature_mise_a_jour": null, + "indicateur_mise_a_jour_1": null, + "indicateur_mise_a_jour_2": null, + "indicateur_mise_a_jour_3": null, + "date_mise_a_jour": "2021-02-23T14:00:31", + "created_at": "2021-05-19T19:22:31.000+02:00", + "updated_at": "2021-05-19T19:22:31.000+02:00", + "longitude": "2.951149", + "latitude": "43.565835", + "geo_score": "0.84", + "geo_type": "street", + "geo_adresse": "Route de Saint-pons 34390 Mons", + "geo_id": "34160_0061", + "geo_ligne": "G", + "geo_l4": "ROUTE DE SAINT PONS", + "geo_l5": null + }, + { + "id": 155776227, + "siren": "534886650", + "siret": "53488665000041", + "nic": "00041", + "l1_normalisee": "MONSIEUR JOHAN HERVOIS", + "l2_normalisee": null, + "l3_normalisee": null, + "l4_normalisee": "2 RUE GIRODET", + "l5_normalisee": null, + "l6_normalisee": "45000 ORLEANS", + "l7_normalisee": null, + "l1_declaree": "HERVOIS", + "l2_declaree": null, + "l3_declaree": null, + "l4_declaree": "2 RUE GIRODET", + "l5_declaree": null, + "l6_declaree": "45000 ORLEANS", + "l7_declaree": null, + "numero_voie": "2", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "GIRODET", + "code_postal": "45000", + "cedex": null, + "region": "24", + "libelle_region": "Centre-Val de Loire", + "departement": "45", + "arrondissement": "2", + "canton": "99", + "commune": "234", + "libelle_commune": "ORLEANS", + "departement_unite_urbaine": "45", + "taille_unite_urbaine": "7", + "numero_unite_urbaine": "45701", + "etablissement_public_cooperation_intercommunale": "244500468", + "tranche_commune_detaillee": "61", + "zone_emploi": "2418", + "is_siege": "1", + "enseigne": null, + "indicateur_champ_publipostage": "A", + "statut_prospection": null, + "date_introduction_base_diffusion": "201507", + "nature_entrepreneur_individuel": null, + "libelle_nature_entrepreneur_individuel": null, + "activite_principale": "6910Z", + "libelle_activite_principale": "Activités juridiques", + "date_validite_activite_principale": null, + "tranche_effectif_salarie": null, + "libelle_tranche_effectif_salarie": null, + "tranche_effectif_salarie_centaine_pret": null, + "date_validite_effectif_salarie": null, + "origine_creation": null, + "date_creation": "20150701", + "date_debut_activite": "20150701", + "nature_activite": null, + "lieu_activite": null, + "type_magasin": null, + "is_saisonnier": null, + "modalite_activite_principale": null, + "caractere_productif": null, + "participation_particuliere_production": null, + "caractere_auxiliaire": null, + "nom_raison_sociale": "HERVOIS*JOHAN CEDRIC ALEXANDRE/", + "sigle": null, + "nom": "HERVOIS", + "prenom": "JOHAN", + "civilite": "MONSIEUR", + "numero_rna": null, + "nic_siege": "00041", + "region_siege": "24", + "departement_commune_siege": "45234", + "email": null, + "nature_juridique_entreprise": "1000", + "libelle_nature_juridique_entreprise": "Entrepreneur individuel", + "activite_principale_entreprise": "6910Z", + "libelle_activite_principale_entreprise": "Activités juridiques", + "date_validite_activite_principale_entreprise": null, + "activite_principale_registre_metier": null, + "is_ess": null, + "date_ess": null, + "tranche_effectif_salarie_entreprise": null, + "libelle_tranche_effectif_salarie_entreprise": null, + "tranche_effectif_salarie_entreprise_centaine_pret": null, + "date_validite_effectif_salarie_entreprise": null, + "categorie_entreprise": "PME", + "date_creation_entreprise": "201110", + "date_introduction_base_diffusion_entreprise": "201507", + "indice_monoactivite_entreprise": null, + "modalite_activite_principale_entreprise": null, + "caractere_productif_entreprise": null, + "date_validite_rubrique_niveau_entreprise_esa": null, + "tranche_chiffre_affaire_entreprise_esa": null, + "activite_principale_entreprise_esa": null, + "premiere_activite_secondaire_entreprise_esa": null, + "deuxieme_activite_secondaire_entreprise_esa": null, + "troisieme_activite_secondaire_entreprise_esa": null, + "quatrieme_activite_secondaire_entreprise_esa": null, + "nature_mise_a_jour": null, + "indicateur_mise_a_jour_1": null, + "indicateur_mise_a_jour_2": null, + "indicateur_mise_a_jour_3": null, + "date_mise_a_jour": "2021-02-23T15:56:48", + "created_at": "2021-05-19T20:34:05.000+02:00", + "updated_at": "2021-05-19T20:34:05.000+02:00", + "longitude": "1.90327", + "latitude": "47.907448", + "geo_score": "0.96", + "geo_type": "housenumber", + "geo_adresse": "2 Rue Girodet 45000 Orléans", + "geo_id": "45234_3240_00002", + "geo_ligne": "G", + "geo_l4": "2 RUE GIRODET", + "geo_l5": null + } + ], + "spellcheck": null, + "suggestions": [] +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YxL2Z1bGxfdGV4dC9tZW5vej9wZXJfcGFnZT01.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YxL2Z1bGxfdGV4dC9tZW5vej9wZXJfcGFnZT01.json new file mode 100644 index 000000000..c44c5f56a --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YxL2Z1bGxfdGV4dC9tZW5vej9wZXJfcGFnZT01.json @@ -0,0 +1,596 @@ +{ + "total_results": 36, + "total_pages": 8, + "per_page": 5, + "page": 1, + "etablissement": [ + { + "id": 155435688, + "siren": "511125122", + "siret": "51112512200024", + "nic": "00024", + "l1_normalisee": "SCI MENOZA", + "l2_normalisee": null, + "l3_normalisee": null, + "l4_normalisee": "160 RUELLE DU HERLIN", + "l5_normalisee": null, + "l6_normalisee": "62700 BRUAY-LA-BUISSIERE", + "l7_normalisee": null, + "l1_declaree": null, + "l2_declaree": null, + "l3_declaree": null, + "l4_declaree": "160 RUELLE DU HERLIN", + "l5_declaree": null, + "l6_declaree": "62700 BRUAY-LA-BUISSIERE", + "l7_declaree": null, + "numero_voie": "160", + "indice_repetition": null, + "type_voie": "RLE", + "libelle_voie": "DU HERLIN", + "code_postal": "62700", + "cedex": null, + "region": "32", + "libelle_region": "Hauts-de-France", + "departement": "62", + "arrondissement": "2", + "canton": "16", + "commune": "178", + "libelle_commune": "BRUAY LA BUISSIERE", + "departement_unite_urbaine": "62", + "taille_unite_urbaine": "7", + "numero_unite_urbaine": "00752", + "etablissement_public_cooperation_intercommunale": "200072460", + "tranche_commune_detaillee": "41", + "zone_emploi": "3123", + "is_siege": "1", + "enseigne": null, + "indicateur_champ_publipostage": "A", + "statut_prospection": null, + "date_introduction_base_diffusion": "201312", + "nature_entrepreneur_individuel": null, + "libelle_nature_entrepreneur_individuel": null, + "activite_principale": "6820B", + "libelle_activite_principale": "Location de terrains et d'autres biens immobiliers", + "date_validite_activite_principale": null, + "tranche_effectif_salarie": null, + "libelle_tranche_effectif_salarie": null, + "tranche_effectif_salarie_centaine_pret": null, + "date_validite_effectif_salarie": null, + "origine_creation": null, + "date_creation": "20131201", + "date_debut_activite": "20131201", + "nature_activite": null, + "lieu_activite": null, + "type_magasin": null, + "is_saisonnier": null, + "modalite_activite_principale": null, + "caractere_productif": null, + "participation_particuliere_production": null, + "caractere_auxiliaire": null, + "nom_raison_sociale": "SCI MENOZA", + "sigle": null, + "nom": null, + "prenom": null, + "civilite": null, + "numero_rna": null, + "nic_siege": "00024", + "region_siege": "32", + "departement_commune_siege": "62178", + "email": null, + "nature_juridique_entreprise": "6540", + "libelle_nature_juridique_entreprise": "Société civile immobilière", + "activite_principale_entreprise": "6820B", + "libelle_activite_principale_entreprise": "Location de terrains et d'autres biens immobiliers", + "date_validite_activite_principale_entreprise": null, + "activite_principale_registre_metier": null, + "is_ess": null, + "date_ess": null, + "tranche_effectif_salarie_entreprise": null, + "libelle_tranche_effectif_salarie_entreprise": null, + "tranche_effectif_salarie_entreprise_centaine_pret": null, + "date_validite_effectif_salarie_entreprise": null, + "categorie_entreprise": null, + "date_creation_entreprise": "200902", + "date_introduction_base_diffusion_entreprise": "201312", + "indice_monoactivite_entreprise": null, + "modalite_activite_principale_entreprise": null, + "caractere_productif_entreprise": null, + "date_validite_rubrique_niveau_entreprise_esa": null, + "tranche_chiffre_affaire_entreprise_esa": null, + "activite_principale_entreprise_esa": null, + "premiere_activite_secondaire_entreprise_esa": null, + "deuxieme_activite_secondaire_entreprise_esa": null, + "troisieme_activite_secondaire_entreprise_esa": null, + "quatrieme_activite_secondaire_entreprise_esa": null, + "nature_mise_a_jour": null, + "indicateur_mise_a_jour_1": null, + "indicateur_mise_a_jour_2": null, + "indicateur_mise_a_jour_3": null, + "date_mise_a_jour": "2021-02-23T15:19:11", + "created_at": "2021-05-19T20:31:59.000+02:00", + "updated_at": "2021-05-19T20:31:59.000+02:00", + "longitude": "2.564399", + "latitude": "50.499922", + "geo_score": "0.85", + "geo_type": "housenumber", + "geo_adresse": "160 Ruelle du Herlin 62700 Bruay-la-Buissière", + "geo_id": "62482_0098_00160", + "geo_ligne": "G", + "geo_l4": "160 RUELLE DU HERLIN", + "geo_l5": null + }, + { + "id": 151659509, + "siren": "834364291", + "siret": "83436429100015", + "nic": "00015", + "l1_normalisee": "MENOZ", + "l2_normalisee": null, + "l3_normalisee": null, + "l4_normalisee": "55 RUE DES PYRENEES", + "l5_normalisee": null, + "l6_normalisee": "75020 PARIS 20", + "l7_normalisee": null, + "l1_declaree": null, + "l2_declaree": null, + "l3_declaree": null, + "l4_declaree": "55 RUE DES PYRENEES", + "l5_declaree": null, + "l6_declaree": "75020 PARIS 20", + "l7_declaree": null, + "numero_voie": "55", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "DES PYRENEES", + "code_postal": "75020", + "cedex": null, + "region": "11", + "libelle_region": null, + "departement": "75", + "arrondissement": "1", + "canton": null, + "commune": "120", + "libelle_commune": "PARIS 20E ARRONDISSEMENT", + "departement_unite_urbaine": null, + "taille_unite_urbaine": null, + "numero_unite_urbaine": null, + "etablissement_public_cooperation_intercommunale": null, + "tranche_commune_detaillee": "80", + "zone_emploi": null, + "is_siege": "1", + "enseigne": null, + "indicateur_champ_publipostage": "A", + "statut_prospection": null, + "date_introduction_base_diffusion": "201803", + "nature_entrepreneur_individuel": null, + "libelle_nature_entrepreneur_individuel": null, + "activite_principale": "6201Z", + "libelle_activite_principale": "Programmation informatique", + "date_validite_activite_principale": null, + "tranche_effectif_salarie": "01", + "libelle_tranche_effectif_salarie": null, + "tranche_effectif_salarie_centaine_pret": null, + "date_validite_effectif_salarie": "2018", + "origine_creation": null, + "date_creation": "20180102", + "date_debut_activite": "20180325", + "nature_activite": null, + "lieu_activite": null, + "type_magasin": null, + "is_saisonnier": null, + "modalite_activite_principale": null, + "caractere_productif": null, + "participation_particuliere_production": null, + "caractere_auxiliaire": null, + "nom_raison_sociale": "MENOZ", + "sigle": null, + "nom": null, + "prenom": null, + "civilite": null, + "numero_rna": null, + "nic_siege": "00015", + "region_siege": "11", + "departement_commune_siege": "75120", + "email": null, + "nature_juridique_entreprise": "5710", + "libelle_nature_juridique_entreprise": "SAS, société par actions simplifiée", + "activite_principale_entreprise": "6201Z", + "libelle_activite_principale_entreprise": "Programmation informatique", + "date_validite_activite_principale_entreprise": null, + "activite_principale_registre_metier": null, + "is_ess": null, + "date_ess": null, + "tranche_effectif_salarie_entreprise": "01", + "libelle_tranche_effectif_salarie_entreprise": null, + "tranche_effectif_salarie_entreprise_centaine_pret": null, + "date_validite_effectif_salarie_entreprise": "2018", + "categorie_entreprise": "PME", + "date_creation_entreprise": "201801", + "date_introduction_base_diffusion_entreprise": "201803", + "indice_monoactivite_entreprise": null, + "modalite_activite_principale_entreprise": null, + "caractere_productif_entreprise": null, + "date_validite_rubrique_niveau_entreprise_esa": null, + "tranche_chiffre_affaire_entreprise_esa": null, + "activite_principale_entreprise_esa": null, + "premiere_activite_secondaire_entreprise_esa": null, + "deuxieme_activite_secondaire_entreprise_esa": null, + "troisieme_activite_secondaire_entreprise_esa": null, + "quatrieme_activite_secondaire_entreprise_esa": null, + "nature_mise_a_jour": null, + "indicateur_mise_a_jour_1": null, + "indicateur_mise_a_jour_2": null, + "indicateur_mise_a_jour_3": null, + "date_mise_a_jour": "2020-08-25T11:39:32", + "created_at": "2021-05-19T20:08:58.000+02:00", + "updated_at": "2021-05-19T20:08:58.000+02:00", + "longitude": "2.406091", + "latitude": "48.851856", + "geo_score": "0.92", + "geo_type": "housenumber", + "geo_adresse": "55 Rue des Pyrénées 75020 Paris 20e Arrondissement", + "geo_id": "BANO_751207904L_55", + "geo_ligne": "G", + "geo_l4": "55 RUE DES PYRENEES", + "geo_l5": null + }, + { + "id": 146709262, + "siren": "403049448", + "siret": "40304944800034", + "nic": "00034", + "l1_normalisee": "MISTRAL MENOZZI", + "l2_normalisee": null, + "l3_normalisee": null, + "l4_normalisee": "551 ROUTE DE GADAGNE", + "l5_normalisee": null, + "l6_normalisee": "84450 SAINT-SATURNIN-LES-AVIGNON", + "l7_normalisee": null, + "l1_declaree": null, + "l2_declaree": null, + "l3_declaree": null, + "l4_declaree": "551 ROUTE DE GADAGNE", + "l5_declaree": null, + "l6_declaree": "84450 SAINT-SATURNIN-LES-AVIGNON", + "l7_declaree": null, + "numero_voie": "551", + "indice_repetition": null, + "type_voie": "RTE", + "libelle_voie": "DE GADAGNE", + "code_postal": "84450", + "cedex": null, + "region": "93", + "libelle_region": "Provence-Alpes-Côte d'Azur", + "departement": "84", + "arrondissement": "2", + "canton": "14", + "commune": "119", + "libelle_commune": "SAINT SATURNIN LES AVIGNON", + "departement_unite_urbaine": "84", + "taille_unite_urbaine": "7", + "numero_unite_urbaine": "00754", + "etablissement_public_cooperation_intercommunale": "248400251", + "tranche_commune_detaillee": "18", + "zone_emploi": "59", + "is_siege": "1", + "enseigne": null, + "indicateur_champ_publipostage": "A", + "statut_prospection": null, + "date_introduction_base_diffusion": "201909", + "nature_entrepreneur_individuel": null, + "libelle_nature_entrepreneur_individuel": null, + "activite_principale": "6820A", + "libelle_activite_principale": "Location de logements", + "date_validite_activite_principale": null, + "tranche_effectif_salarie": null, + "libelle_tranche_effectif_salarie": null, + "tranche_effectif_salarie_centaine_pret": null, + "date_validite_effectif_salarie": null, + "origine_creation": null, + "date_creation": "20190902", + "date_debut_activite": "20190902", + "nature_activite": null, + "lieu_activite": null, + "type_magasin": null, + "is_saisonnier": null, + "modalite_activite_principale": null, + "caractere_productif": null, + "participation_particuliere_production": null, + "caractere_auxiliaire": null, + "nom_raison_sociale": "MISTRAL MENOZZI", + "sigle": null, + "nom": null, + "prenom": null, + "civilite": null, + "numero_rna": null, + "nic_siege": "00034", + "region_siege": "93", + "departement_commune_siege": "84119", + "email": null, + "nature_juridique_entreprise": "6540", + "libelle_nature_juridique_entreprise": "Société civile immobilière", + "activite_principale_entreprise": "6820A", + "libelle_activite_principale_entreprise": "Location de logements", + "date_validite_activite_principale_entreprise": null, + "activite_principale_registre_metier": null, + "is_ess": null, + "date_ess": null, + "tranche_effectif_salarie_entreprise": "NN", + "libelle_tranche_effectif_salarie_entreprise": null, + "tranche_effectif_salarie_entreprise_centaine_pret": null, + "date_validite_effectif_salarie_entreprise": null, + "categorie_entreprise": null, + "date_creation_entreprise": "199511", + "date_introduction_base_diffusion_entreprise": "201909", + "indice_monoactivite_entreprise": null, + "modalite_activite_principale_entreprise": null, + "caractere_productif_entreprise": null, + "date_validite_rubrique_niveau_entreprise_esa": null, + "tranche_chiffre_affaire_entreprise_esa": null, + "activite_principale_entreprise_esa": null, + "premiere_activite_secondaire_entreprise_esa": null, + "deuxieme_activite_secondaire_entreprise_esa": null, + "troisieme_activite_secondaire_entreprise_esa": null, + "quatrieme_activite_secondaire_entreprise_esa": null, + "nature_mise_a_jour": null, + "indicateur_mise_a_jour_1": null, + "indicateur_mise_a_jour_2": null, + "indicateur_mise_a_jour_3": null, + "date_mise_a_jour": "2020-01-21T19:35:08", + "created_at": "2021-05-19T18:55:44.000+02:00", + "updated_at": "2021-05-19T18:55:44.000+02:00", + "longitude": "4.938683", + "latitude": "43.953835", + "geo_score": "0.85", + "geo_type": "housenumber", + "geo_adresse": "551 Route de Gadagne 84450 Saint-Saturnin-lès-Avignon", + "geo_id": "84119_0298_00551", + "geo_ligne": "G", + "geo_l4": "551 ROUTE DE GADAGNE", + "geo_l5": null + }, + { + "id": 150749873, + "siren": "800559064", + "siret": "80055906400012", + "nic": "00012", + "l1_normalisee": "MENOZZI VAISE", + "l2_normalisee": "CLASS CROUTE", + "l3_normalisee": null, + "l4_normalisee": null, + "l5_normalisee": null, + "l6_normalisee": "69009 LYON 9EME", + "l7_normalisee": null, + "l1_declaree": "CLASS'CROUTE", + "l2_declaree": null, + "l3_declaree": null, + "l4_declaree": null, + "l5_declaree": null, + "l6_declaree": "69009 LYON 9EME", + "l7_declaree": null, + "numero_voie": "51", + "indice_repetition": "B", + "type_voie": "RUE", + "libelle_voie": "DE ST CYR", + "code_postal": "69009", + "cedex": null, + "region": "84", + "libelle_region": null, + "departement": "69", + "arrondissement": "1", + "canton": null, + "commune": "389", + "libelle_commune": "LYON 9E ARRONDISSEMENT", + "departement_unite_urbaine": null, + "taille_unite_urbaine": null, + "numero_unite_urbaine": null, + "etablissement_public_cooperation_intercommunale": null, + "tranche_commune_detaillee": null, + "zone_emploi": null, + "is_siege": "1", + "enseigne": "CLASS'CROUTE", + "indicateur_champ_publipostage": "A", + "statut_prospection": null, + "date_introduction_base_diffusion": "201404", + "nature_entrepreneur_individuel": null, + "libelle_nature_entrepreneur_individuel": null, + "activite_principale": "5610C", + "libelle_activite_principale": "Restauration de type rapide", + "date_validite_activite_principale": null, + "tranche_effectif_salarie": "11", + "libelle_tranche_effectif_salarie": null, + "tranche_effectif_salarie_centaine_pret": null, + "date_validite_effectif_salarie": "2018", + "origine_creation": null, + "date_creation": "20140220", + "date_debut_activite": "20140401", + "nature_activite": null, + "lieu_activite": null, + "type_magasin": null, + "is_saisonnier": null, + "modalite_activite_principale": null, + "caractere_productif": null, + "participation_particuliere_production": null, + "caractere_auxiliaire": null, + "nom_raison_sociale": "MENOZZI VAISE", + "sigle": null, + "nom": null, + "prenom": null, + "civilite": null, + "numero_rna": null, + "nic_siege": "00012", + "region_siege": "84", + "departement_commune_siege": "69389", + "email": null, + "nature_juridique_entreprise": "5499", + "libelle_nature_juridique_entreprise": "Société à responsabilité limitée (sans autre indication)", + "activite_principale_entreprise": "5610C", + "libelle_activite_principale_entreprise": "Restauration de type rapide", + "date_validite_activite_principale_entreprise": null, + "activite_principale_registre_metier": null, + "is_ess": null, + "date_ess": null, + "tranche_effectif_salarie_entreprise": "11", + "libelle_tranche_effectif_salarie_entreprise": null, + "tranche_effectif_salarie_entreprise_centaine_pret": null, + "date_validite_effectif_salarie_entreprise": "2018", + "categorie_entreprise": "PME", + "date_creation_entreprise": "201402", + "date_introduction_base_diffusion_entreprise": "201602", + "indice_monoactivite_entreprise": null, + "modalite_activite_principale_entreprise": null, + "caractere_productif_entreprise": null, + "date_validite_rubrique_niveau_entreprise_esa": null, + "tranche_chiffre_affaire_entreprise_esa": null, + "activite_principale_entreprise_esa": null, + "premiere_activite_secondaire_entreprise_esa": null, + "deuxieme_activite_secondaire_entreprise_esa": null, + "troisieme_activite_secondaire_entreprise_esa": null, + "quatrieme_activite_secondaire_entreprise_esa": null, + "nature_mise_a_jour": null, + "indicateur_mise_a_jour_1": null, + "indicateur_mise_a_jour_2": null, + "indicateur_mise_a_jour_3": null, + "date_mise_a_jour": "2020-08-25T11:09:50", + "created_at": "2021-05-19T19:55:31.000+02:00", + "updated_at": "2021-05-19T19:55:31.000+02:00", + "longitude": null, + "latitude": null, + "geo_score": "0", + "geo_type": null, + "geo_adresse": null, + "geo_id": null, + "geo_ligne": null, + "geo_l4": null, + "geo_l5": null + }, + { + "id": 148032813, + "siren": "480134782", + "siret": "48013478200014", + "nic": "00014", + "l1_normalisee": "MENOZZI CITE", + "l2_normalisee": "CITE INTERNATIONALE", + "l3_normalisee": null, + "l4_normalisee": null, + "l5_normalisee": null, + "l6_normalisee": "69006 LYON 6EME", + "l7_normalisee": null, + "l1_declaree": null, + "l2_declaree": null, + "l3_declaree": null, + "l4_declaree": null, + "l5_declaree": null, + "l6_declaree": "69006 LYON 6EME", + "l7_declaree": null, + "numero_voie": "85", + "indice_repetition": null, + "type_voie": "QUAI", + "libelle_voie": "CHARLES DE GAULLE", + "code_postal": "69006", + "cedex": null, + "region": "84", + "libelle_region": null, + "departement": "69", + "arrondissement": "1", + "canton": null, + "commune": "386", + "libelle_commune": "LYON 6E ARRONDISSEMENT", + "departement_unite_urbaine": null, + "taille_unite_urbaine": null, + "numero_unite_urbaine": null, + "etablissement_public_cooperation_intercommunale": null, + "tranche_commune_detaillee": null, + "zone_emploi": null, + "is_siege": "1", + "enseigne": null, + "indicateur_champ_publipostage": "A", + "statut_prospection": null, + "date_introduction_base_diffusion": "200801", + "nature_entrepreneur_individuel": null, + "libelle_nature_entrepreneur_individuel": null, + "activite_principale": "5610C", + "libelle_activite_principale": "Restauration de type rapide", + "date_validite_activite_principale": null, + "tranche_effectif_salarie": "11", + "libelle_tranche_effectif_salarie": null, + "tranche_effectif_salarie_centaine_pret": null, + "date_validite_effectif_salarie": "2018", + "origine_creation": null, + "date_creation": "20041228", + "date_debut_activite": "20080101", + "nature_activite": null, + "lieu_activite": null, + "type_magasin": null, + "is_saisonnier": null, + "modalite_activite_principale": null, + "caractere_productif": null, + "participation_particuliere_production": null, + "caractere_auxiliaire": null, + "nom_raison_sociale": "MENOZZI CITE", + "sigle": null, + "nom": null, + "prenom": null, + "civilite": null, + "numero_rna": null, + "nic_siege": "00014", + "region_siege": "84", + "departement_commune_siege": "69386", + "email": null, + "nature_juridique_entreprise": "5710", + "libelle_nature_juridique_entreprise": "SAS, société par actions simplifiée", + "activite_principale_entreprise": "5610C", + "libelle_activite_principale_entreprise": "Restauration de type rapide", + "date_validite_activite_principale_entreprise": null, + "activite_principale_registre_metier": null, + "is_ess": null, + "date_ess": null, + "tranche_effectif_salarie_entreprise": "11", + "libelle_tranche_effectif_salarie_entreprise": null, + "tranche_effectif_salarie_entreprise_centaine_pret": null, + "date_validite_effectif_salarie_entreprise": "2018", + "categorie_entreprise": "PME", + "date_creation_entreprise": "200412", + "date_introduction_base_diffusion_entreprise": "201812", + "indice_monoactivite_entreprise": null, + "modalite_activite_principale_entreprise": null, + "caractere_productif_entreprise": null, + "date_validite_rubrique_niveau_entreprise_esa": null, + "tranche_chiffre_affaire_entreprise_esa": null, + "activite_principale_entreprise_esa": null, + "premiere_activite_secondaire_entreprise_esa": null, + "deuxieme_activite_secondaire_entreprise_esa": null, + "troisieme_activite_secondaire_entreprise_esa": null, + "quatrieme_activite_secondaire_entreprise_esa": null, + "nature_mise_a_jour": null, + "indicateur_mise_a_jour_1": null, + "indicateur_mise_a_jour_2": null, + "indicateur_mise_a_jour_3": null, + "date_mise_a_jour": "2021-02-23T13:43:00", + "created_at": "2021-05-19T19:15:14.000+02:00", + "updated_at": "2021-05-19T19:15:14.000+02:00", + "longitude": null, + "latitude": null, + "geo_score": "0", + "geo_type": null, + "geo_adresse": null, + "geo_id": null, + "geo_ligne": null, + "geo_l4": null, + "geo_l5": null + } + ], + "spellcheck": null, + "suggestions": [ + "menoz", + "menozzi*albertini/marie agnes/", + "menozzi*dominique emile/", + "menoz compagnie yado", + "menozzi champagne", + "menozzi cite", + "menozzi holding", + "menozzi industrie", + "menozzi vaise", + "menozzi*amerio/laurence/" + ] +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQ4MDEzNDc4Mj9zdGF0dXRfZGlmZnVzaW9uPU8=.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQ4MDEzNDc4Mj9zdGF0dXRfZGlmZnVzaW9uPU8=.json new file mode 100644 index 000000000..ecbd42510 --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQ4MDEzNDc4Mj9zdGF0dXRfZGlmZnVzaW9uPU8=.json @@ -0,0 +1,296 @@ +{ + "unite_legale": { + "id": 167812870, + "siren": "480134782", + "statut_diffusion": "O", + "unite_purgee": null, + "date_creation": "2004-12-28", + "sigle": null, + "sexe": null, + "prenom_1": null, + "prenom_2": null, + "prenom_3": null, + "prenom_4": null, + "prenom_usuel": null, + "pseudonyme": null, + "identifiant_association": null, + "tranche_effectifs": "11", + "annee_effectifs": "2018", + "date_dernier_traitement": "2020-08-25T10:24:08", + "nombre_periodes": "8", + "categorie_entreprise": "PME", + "annee_categorie_entreprise": "2018", + "date_fin": null, + "date_debut": "2018-12-31", + "etat_administratif": "A", + "nom": null, + "nom_usage": null, + "denomination": "MENOZZI CITE", + "denomination_usuelle_1": "CLASS'CROUTE", + "denomination_usuelle_2": null, + "denomination_usuelle_3": null, + "categorie_juridique": "5710", + "activite_principale": "56.10C", + "nomenclature_activite_principale": "NAFRev2", + "nic_siege": "00014", + "economie_sociale_solidaire": "N", + "caractere_employeur": "O", + "created_at": "2021-06-02T02:59:06.804+02:00", + "updated_at": "2021-06-02T02:59:06.804+02:00", + "etablissement_siege": { + "id": 458281566, + "siren": "480134782", + "nic": "00014", + "siret": "48013478200014", + "statut_diffusion": "O", + "date_creation": "2004-12-28", + "tranche_effectifs": "11", + "annee_effectifs": "2018", + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2021-02-23T13:43:00", + "etablissement_siege": "true", + "nombre_periodes": "3", + "complement_adresse": "CITE INTERNATIONALE", + "numero_voie": "85", + "indice_repetition": null, + "type_voie": "QUAI", + "libelle_voie": "CHARLES DE GAULLE", + "code_postal": "69006", + "libelle_commune": "LYON 6EME", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "69386", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2008-01-01", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "56.10C", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "4.852064", + "latitude": "45.78402", + "geo_score": "0.67", + "geo_type": "housenumber", + "geo_adresse": "85 Quai Charles de Gaulle 69006 Lyon", + "geo_id": "69386_1380_00085", + "geo_ligne": "G", + "geo_l4": "85 QUAI CHARLES DE GAULLE", + "geo_l5": null, + "unite_legale_id": 167812870, + "created_at": "2021-06-02T04:17:22.197+02:00", + "updated_at": "2021-06-02T04:17:22.197+02:00" + }, + "numero_tva_intra": "FR45480134782", + "etablissements": [ + { + "id": 458281568, + "siren": "480134782", + "nic": "00030", + "siret": "48013478200030", + "statut_diffusion": "O", + "date_creation": "2016-02-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2019-12-22T03:32:01", + "etablissement_siege": "false", + "nombre_periodes": "3", + "complement_adresse": "41-43", + "numero_voie": "41", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "DES CHARTREUX", + "code_postal": "69001", + "libelle_commune": "LYON 1ER", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "69381", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2018-12-31", + "etat_administratif": "F", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "52.10B", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "4.825305", + "latitude": "45.771974", + "geo_score": "0.62", + "geo_type": "housenumber", + "geo_adresse": "41 Rue des Chartreux 69001 Lyon", + "geo_id": "69381_1550_00041", + "geo_ligne": "G", + "geo_l4": "41 RUE DES CHARTREUX", + "geo_l5": null, + "unite_legale_id": 167812870, + "created_at": "2021-06-02T04:17:22.197+02:00", + "updated_at": "2021-06-02T04:17:22.197+02:00" + }, + { + "id": 458281567, + "siren": "480134782", + "nic": "00022", + "siret": "48013478200022", + "statut_diffusion": "O", + "date_creation": "2008-10-27", + "tranche_effectifs": "NN", + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2016-04-26T02:56:45", + "etablissement_siege": "false", + "nombre_periodes": "2", + "complement_adresse": null, + "numero_voie": "51", + "indice_repetition": "B", + "type_voie": "RUE", + "libelle_voie": "DE ST CYR", + "code_postal": "69009", + "libelle_commune": "LYON 9EME", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "69389", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2014-03-31", + "etat_administratif": "F", + "enseigne_1": "CLASS'ROUTE", + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "56.10C", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "4.807071", + "latitude": "45.782404", + "geo_score": "0.49", + "geo_type": "housenumber", + "geo_adresse": "51 bis Rue de Saint-cyr 69009 Lyon", + "geo_id": "69389_6295_00051_bis", + "geo_ligne": "G", + "geo_l4": "51 BIS RUE DE SAINT CYR", + "geo_l5": null, + "unite_legale_id": 167812870, + "created_at": "2021-06-02T04:17:22.197+02:00", + "updated_at": "2021-06-02T04:17:22.197+02:00" + }, + { + "id": 458281566, + "siren": "480134782", + "nic": "00014", + "siret": "48013478200014", + "statut_diffusion": "O", + "date_creation": "2004-12-28", + "tranche_effectifs": "11", + "annee_effectifs": "2018", + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2021-02-23T13:43:00", + "etablissement_siege": "true", + "nombre_periodes": "3", + "complement_adresse": "CITE INTERNATIONALE", + "numero_voie": "85", + "indice_repetition": null, + "type_voie": "QUAI", + "libelle_voie": "CHARLES DE GAULLE", + "code_postal": "69006", + "libelle_commune": "LYON 6EME", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "69386", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2008-01-01", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "56.10C", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "4.852064", + "latitude": "45.78402", + "geo_score": "0.67", + "geo_type": "housenumber", + "geo_adresse": "85 Quai Charles de Gaulle 69006 Lyon", + "geo_id": "69386_1380_00085", + "geo_ligne": "G", + "geo_l4": "85 QUAI CHARLES DE GAULLE", + "geo_l5": null, + "unite_legale_id": 167812870, + "created_at": "2021-06-02T04:17:22.197+02:00", + "updated_at": "2021-06-02T04:17:22.197+02:00" + } + ] + } +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQ5MzA5NjU4MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQ5MzA5NjU4MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json new file mode 100644 index 000000000..e0837de5a --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQ5MzA5NjU4MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json @@ -0,0 +1,233 @@ +{ + "unite_legale": { + "id": 168713230, + "siren": "493096580", + "statut_diffusion": "O", + "unite_purgee": null, + "date_creation": "2006-12-01", + "sigle": null, + "sexe": "M", + "prenom_1": "JOHAN", + "prenom_2": null, + "prenom_3": null, + "prenom_4": null, + "prenom_usuel": "JOHAN", + "pseudonyme": null, + "identifiant_association": null, + "tranche_effectifs": "NN", + "annee_effectifs": null, + "date_dernier_traitement": "2017-05-20T10:02:30", + "nombre_periodes": "4", + "categorie_entreprise": "PME", + "annee_categorie_entreprise": "2018", + "date_fin": null, + "date_debut": "2013-03-10", + "etat_administratif": "A", + "nom": "GIROD", + "nom_usage": null, + "denomination": null, + "denomination_usuelle_1": null, + "denomination_usuelle_2": null, + "denomination_usuelle_3": null, + "categorie_juridique": "1000", + "activite_principale": "81.30Z", + "nomenclature_activite_principale": "NAFRev2", + "nic_siege": "00029", + "economie_sociale_solidaire": null, + "caractere_employeur": "O", + "created_at": "2021-06-02T03:04:22.060+02:00", + "updated_at": "2021-06-02T03:04:22.060+02:00", + "etablissement_siege": { + "id": 448732924, + "siren": "493096580", + "nic": "00029", + "siret": "49309658000029", + "statut_diffusion": "O", + "date_creation": "2010-10-22", + "tranche_effectifs": "NN", + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2021-02-23T14:00:31", + "etablissement_siege": "true", + "nombre_periodes": "3", + "complement_adresse": null, + "numero_voie": null, + "indice_repetition": null, + "type_voie": "RTE", + "libelle_voie": "DE SAINT PONS", + "code_postal": "34390", + "libelle_commune": "MONS", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "34160", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2013-10-01", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": "PAYSAGISTE DU CAROUX", + "activite_principale": "81.30Z", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "2.951149", + "latitude": "43.565835", + "geo_score": "0.84", + "geo_type": "street", + "geo_adresse": "Route de Saint-pons 34390 Mons", + "geo_id": "34160_0061", + "geo_ligne": "G", + "geo_l4": "ROUTE DE SAINT PONS", + "geo_l5": null, + "unite_legale_id": 168713230, + "created_at": "2021-06-02T03:11:07.176+02:00", + "updated_at": "2021-06-02T03:11:07.176+02:00" + }, + "numero_tva_intra": "FR79493096580", + "etablissements": [ + { + "id": 448732924, + "siren": "493096580", + "nic": "00029", + "siret": "49309658000029", + "statut_diffusion": "O", + "date_creation": "2010-10-22", + "tranche_effectifs": "NN", + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2021-02-23T14:00:31", + "etablissement_siege": "true", + "nombre_periodes": "3", + "complement_adresse": null, + "numero_voie": null, + "indice_repetition": null, + "type_voie": "RTE", + "libelle_voie": "DE SAINT PONS", + "code_postal": "34390", + "libelle_commune": "MONS", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "34160", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2013-10-01", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": "PAYSAGISTE DU CAROUX", + "activite_principale": "81.30Z", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "2.951149", + "latitude": "43.565835", + "geo_score": "0.84", + "geo_type": "street", + "geo_adresse": "Route de Saint-pons 34390 Mons", + "geo_id": "34160_0061", + "geo_ligne": "G", + "geo_l4": "ROUTE DE SAINT PONS", + "geo_l5": null, + "unite_legale_id": 168713230, + "created_at": "2021-06-02T03:11:07.176+02:00", + "updated_at": "2021-06-02T03:11:07.176+02:00" + }, + { + "id": 448732923, + "siren": "493096580", + "nic": "00011", + "siret": "49309658000011", + "statut_diffusion": "O", + "date_creation": "2006-12-01", + "tranche_effectifs": "NN", + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2012-05-05T11:53:52", + "etablissement_siege": "false", + "nombre_periodes": "3", + "complement_adresse": "LA POMAREDE", + "numero_voie": null, + "indice_repetition": null, + "type_voie": null, + "libelle_voie": null, + "code_postal": "34390", + "libelle_commune": "SAINT MARTIN DE L'ARCON", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "34273", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2010-10-22", + "etat_administratif": "F", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "81.30Z", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "2.995838", + "latitude": "43.575053", + "geo_score": "0.91", + "geo_type": "locality", + "geo_adresse": "Hameau de la Pomarède 34390 Saint-Martin-de-l'Arçon", + "geo_id": "34273_b038", + "geo_ligne": "D", + "geo_l4": "HAMEAU DE LA POMAREDE", + "geo_l5": null, + "unite_legale_id": 168713230, + "created_at": "2021-06-02T03:11:07.176+02:00", + "updated_at": "2021-06-02T03:11:07.176+02:00" + } + ] + } +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json new file mode 100644 index 000000000..3ab24960e --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json @@ -0,0 +1,296 @@ +{ + "unite_legale": { + "id": 163930767, + "siren": "403049448", + "statut_diffusion": "O", + "unite_purgee": null, + "date_creation": "1995-11-29", + "sigle": null, + "sexe": null, + "prenom_1": null, + "prenom_2": null, + "prenom_3": null, + "prenom_4": null, + "prenom_usuel": null, + "pseudonyme": null, + "identifiant_association": null, + "tranche_effectifs": "NN", + "annee_effectifs": null, + "date_dernier_traitement": "2020-01-21T19:35:08", + "nombre_periodes": "5", + "categorie_entreprise": null, + "annee_categorie_entreprise": null, + "date_fin": null, + "date_debut": "2019-09-02", + "etat_administratif": "A", + "nom": null, + "nom_usage": null, + "denomination": "MISTRAL MENOZZI", + "denomination_usuelle_1": null, + "denomination_usuelle_2": null, + "denomination_usuelle_3": null, + "categorie_juridique": "6540", + "activite_principale": "68.20A", + "nomenclature_activite_principale": "NAFRev2", + "nic_siege": "00034", + "economie_sociale_solidaire": "N", + "caractere_employeur": "N", + "created_at": "2021-06-02T02:36:00.235+02:00", + "updated_at": "2021-06-02T02:36:00.235+02:00", + "etablissement_siege": { + "id": 465543867, + "siren": "403049448", + "nic": "00034", + "siret": "40304944800034", + "statut_diffusion": "O", + "date_creation": "2019-09-02", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2020-01-21T19:35:08", + "etablissement_siege": "true", + "nombre_periodes": "1", + "complement_adresse": null, + "numero_voie": "551", + "indice_repetition": null, + "type_voie": "RTE", + "libelle_voie": "DE GADAGNE", + "code_postal": "84450", + "libelle_commune": "SAINT-SATURNIN-LES-AVIGNON", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "84119", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2019-09-02", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "68.20A", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "4.938683", + "latitude": "43.953835", + "geo_score": "0.85", + "geo_type": "housenumber", + "geo_adresse": "551 Route de Gadagne 84450 Saint-Saturnin-lès-Avignon", + "geo_id": "84119_0298_00551", + "geo_ligne": "G", + "geo_l4": "551 ROUTE DE GADAGNE", + "geo_l5": null, + "unite_legale_id": 163930767, + "created_at": "2021-06-02T04:50:13.598+02:00", + "updated_at": "2021-06-02T04:50:13.598+02:00" + }, + "numero_tva_intra": "FR94403049448", + "etablissements": [ + { + "id": 465543867, + "siren": "403049448", + "nic": "00034", + "siret": "40304944800034", + "statut_diffusion": "O", + "date_creation": "2019-09-02", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2020-01-21T19:35:08", + "etablissement_siege": "true", + "nombre_periodes": "1", + "complement_adresse": null, + "numero_voie": "551", + "indice_repetition": null, + "type_voie": "RTE", + "libelle_voie": "DE GADAGNE", + "code_postal": "84450", + "libelle_commune": "SAINT-SATURNIN-LES-AVIGNON", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "84119", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2019-09-02", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "68.20A", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "4.938683", + "latitude": "43.953835", + "geo_score": "0.85", + "geo_type": "housenumber", + "geo_adresse": "551 Route de Gadagne 84450 Saint-Saturnin-lès-Avignon", + "geo_id": "84119_0298_00551", + "geo_ligne": "G", + "geo_l4": "551 ROUTE DE GADAGNE", + "geo_l5": null, + "unite_legale_id": 163930767, + "created_at": "2021-06-02T04:50:13.598+02:00", + "updated_at": "2021-06-02T04:50:13.598+02:00" + }, + { + "id": 465543866, + "siren": "403049448", + "nic": "00026", + "siret": "40304944800026", + "statut_diffusion": "O", + "date_creation": "2007-02-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2020-01-21T19:35:08", + "etablissement_siege": "false", + "nombre_periodes": "3", + "complement_adresse": null, + "numero_voie": "1950", + "indice_repetition": null, + "type_voie": "CHE", + "libelle_voie": "DE SAINT GENS", + "code_postal": "84200", + "libelle_commune": "CARPENTRAS", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "84031", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2019-09-02", + "etat_administratif": "F", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "68.20A", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "5.046323", + "latitude": "44.032154", + "geo_score": "0.87", + "geo_type": "housenumber", + "geo_adresse": "1950 Chemin de Saint-gens 84200 Carpentras", + "geo_id": "84031_1805_01950", + "geo_ligne": "G", + "geo_l4": "1950 CHEMIN DE SAINT GENS", + "geo_l5": null, + "unite_legale_id": 163930767, + "created_at": "2021-06-02T04:50:13.598+02:00", + "updated_at": "2021-06-02T04:50:13.598+02:00" + }, + { + "id": 465543865, + "siren": "403049448", + "nic": "00018", + "siret": "40304944800018", + "statut_diffusion": "O", + "date_creation": "1995-11-29", + "tranche_effectifs": "NN", + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2007-02-15T11:44:24", + "etablissement_siege": "false", + "nombre_periodes": "3", + "complement_adresse": null, + "numero_voie": "145", + "indice_repetition": null, + "type_voie": "AV", + "libelle_voie": "DWIGHT EISENHOWER", + "code_postal": "84200", + "libelle_commune": "CARPENTRAS", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "84031", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2007-02-01", + "etat_administratif": "F", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "70.2A", + "nomenclature_activite_principale": "NAFRev1", + "caractere_employeur": "N", + "longitude": "5.045559", + "latitude": "44.043377", + "geo_score": "0.73", + "geo_type": "street", + "geo_adresse": "Avenue Dwight Eisenhower 84200 Carpentras", + "geo_id": "84031_0589", + "geo_ligne": "G", + "geo_l4": "AVENUE DWIGHT EISENHOWER", + "geo_l5": null, + "unite_legale_id": 163930767, + "created_at": "2021-06-02T04:50:13.598+02:00", + "updated_at": "2021-06-02T04:50:13.598+02:00" + } + ] + } +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzUxMTEyNTEyMj9zdGF0dXRfZGlmZnVzaW9uPU8=.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzUxMTEyNTEyMj9zdGF0dXRfZGlmZnVzaW9uPU8=.json new file mode 100644 index 000000000..59e6a3e09 --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzUxMTEyNTEyMj9zdGF0dXRfZGlmZnVzaW9uPU8=.json @@ -0,0 +1,233 @@ +{ + "unite_legale": { + "id": 169854230, + "siren": "511125122", + "statut_diffusion": "O", + "unite_purgee": null, + "date_creation": "2009-02-10", + "sigle": null, + "sexe": null, + "prenom_1": null, + "prenom_2": null, + "prenom_3": null, + "prenom_4": null, + "prenom_usuel": null, + "pseudonyme": null, + "identifiant_association": null, + "tranche_effectifs": null, + "annee_effectifs": null, + "date_dernier_traitement": "2018-09-07T04:20:27", + "nombre_periodes": "2", + "categorie_entreprise": null, + "annee_categorie_entreprise": null, + "date_fin": null, + "date_debut": "2013-12-01", + "etat_administratif": "A", + "nom": null, + "nom_usage": null, + "denomination": "SCI MENOZA", + "denomination_usuelle_1": null, + "denomination_usuelle_2": null, + "denomination_usuelle_3": null, + "categorie_juridique": "6540", + "activite_principale": "68.20B", + "nomenclature_activite_principale": "NAFRev2", + "nic_siege": "00024", + "economie_sociale_solidaire": null, + "caractere_employeur": "N", + "created_at": "2021-06-02T03:10:49.548+02:00", + "updated_at": "2021-06-02T03:10:49.548+02:00", + "etablissement_siege": { + "id": 455925398, + "siren": "511125122", + "nic": "00024", + "siret": "51112512200024", + "statut_diffusion": "O", + "date_creation": "2013-12-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2021-02-23T15:19:11", + "etablissement_siege": "true", + "nombre_periodes": "1", + "complement_adresse": null, + "numero_voie": "160", + "indice_repetition": null, + "type_voie": "RLE", + "libelle_voie": "DU HERLIN", + "code_postal": "62700", + "libelle_commune": "BRUAY-LA-BUISSIERE", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "62178", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2013-12-01", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "68.20B", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "2.564399", + "latitude": "50.499922", + "geo_score": "0.85", + "geo_type": "housenumber", + "geo_adresse": "160 Ruelle du Herlin 62700 Bruay-la-Buissière", + "geo_id": "62482_0098_00160", + "geo_ligne": "G", + "geo_l4": "160 RUELLE DU HERLIN", + "geo_l5": null, + "unite_legale_id": 169854230, + "created_at": "2021-06-02T04:06:44.890+02:00", + "updated_at": "2021-06-02T04:06:44.890+02:00" + }, + "numero_tva_intra": "FR57511125122", + "etablissements": [ + { + "id": 455925398, + "siren": "511125122", + "nic": "00024", + "siret": "51112512200024", + "statut_diffusion": "O", + "date_creation": "2013-12-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2021-02-23T15:19:11", + "etablissement_siege": "true", + "nombre_periodes": "1", + "complement_adresse": null, + "numero_voie": "160", + "indice_repetition": null, + "type_voie": "RLE", + "libelle_voie": "DU HERLIN", + "code_postal": "62700", + "libelle_commune": "BRUAY-LA-BUISSIERE", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "62178", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2013-12-01", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "68.20B", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "2.564399", + "latitude": "50.499922", + "geo_score": "0.85", + "geo_type": "housenumber", + "geo_adresse": "160 Ruelle du Herlin 62700 Bruay-la-Buissière", + "geo_id": "62482_0098_00160", + "geo_ligne": "G", + "geo_l4": "160 RUELLE DU HERLIN", + "geo_l5": null, + "unite_legale_id": 169854230, + "created_at": "2021-06-02T04:06:44.890+02:00", + "updated_at": "2021-06-02T04:06:44.890+02:00" + }, + { + "id": 455925397, + "siren": "511125122", + "nic": "00016", + "siret": "51112512200016", + "statut_diffusion": "O", + "date_creation": "2009-02-10", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2013-12-19T16:19:05", + "etablissement_siege": "false", + "nombre_periodes": "2", + "complement_adresse": null, + "numero_voie": "148", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "ALEXANDRE PONNELLE", + "code_postal": "62400", + "libelle_commune": "BETHUNE", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "62119", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2013-12-01", + "etat_administratif": "F", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "68.20B", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "2.642524", + "latitude": "50.533418", + "geo_score": "0.95", + "geo_type": "housenumber", + "geo_adresse": "148 Rue Alexandre Ponnelle 62400 Béthune", + "geo_id": "62119_0090_00148", + "geo_ligne": "G", + "geo_l4": "148 RUE ALEXANDRE PONNELLE", + "geo_l5": null, + "unite_legale_id": 169854230, + "created_at": "2021-06-02T04:06:44.890+02:00", + "updated_at": "2021-06-02T04:06:44.890+02:00" + } + ] + } +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzUzNDg4NjY1MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzUzNDg4NjY1MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json new file mode 100644 index 000000000..cb9aff650 --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzUzNDg4NjY1MD9zdGF0dXRfZGlmZnVzaW9uPU8=.json @@ -0,0 +1,359 @@ +{ + "unite_legale": { + "id": 171535165, + "siren": "534886650", + "statut_diffusion": "O", + "unite_purgee": null, + "date_creation": "2011-10-01", + "sigle": null, + "sexe": "M", + "prenom_1": "JOHAN", + "prenom_2": "CEDRIC", + "prenom_3": "ALEXANDRE", + "prenom_4": null, + "prenom_usuel": "JOHAN", + "pseudonyme": null, + "identifiant_association": null, + "tranche_effectifs": null, + "annee_effectifs": null, + "date_dernier_traitement": "2020-02-18T14:08:16", + "nombre_periodes": "5", + "categorie_entreprise": "PME", + "annee_categorie_entreprise": "2018", + "date_fin": null, + "date_debut": "2015-07-01", + "etat_administratif": "A", + "nom": "HERVOIS", + "nom_usage": null, + "denomination": null, + "denomination_usuelle_1": null, + "denomination_usuelle_2": null, + "denomination_usuelle_3": null, + "categorie_juridique": "1000", + "activite_principale": "69.10Z", + "nomenclature_activite_principale": "NAFRev2", + "nic_siege": "00041", + "economie_sociale_solidaire": null, + "caractere_employeur": "N", + "created_at": "2021-06-02T03:20:25.201+02:00", + "updated_at": "2021-06-02T03:20:25.201+02:00", + "etablissement_siege": { + "id": 451973942, + "siren": "534886650", + "nic": "00041", + "siret": "53488665000041", + "statut_diffusion": "O", + "date_creation": "2015-07-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2021-02-23T15:56:48", + "etablissement_siege": "true", + "nombre_periodes": "1", + "complement_adresse": null, + "numero_voie": "2", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "GIRODET", + "code_postal": "45000", + "libelle_commune": "ORLEANS", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "45234", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2015-07-01", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "69.10Z", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "1.90327", + "latitude": "47.907448", + "geo_score": "0.96", + "geo_type": "housenumber", + "geo_adresse": "2 Rue Girodet 45000 Orléans", + "geo_id": "45234_3240_00002", + "geo_ligne": "G", + "geo_l4": "2 RUE GIRODET", + "geo_l5": null, + "unite_legale_id": 171535165, + "created_at": "2021-06-02T03:36:27.148+02:00", + "updated_at": "2021-06-02T03:36:27.148+02:00" + }, + "numero_tva_intra": "FR20534886650", + "etablissements": [ + { + "id": 451973942, + "siren": "534886650", + "nic": "00041", + "siret": "53488665000041", + "statut_diffusion": "O", + "date_creation": "2015-07-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2021-02-23T15:56:48", + "etablissement_siege": "true", + "nombre_periodes": "1", + "complement_adresse": null, + "numero_voie": "2", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "GIRODET", + "code_postal": "45000", + "libelle_commune": "ORLEANS", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "45234", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2015-07-01", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "69.10Z", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "1.90327", + "latitude": "47.907448", + "geo_score": "0.96", + "geo_type": "housenumber", + "geo_adresse": "2 Rue Girodet 45000 Orléans", + "geo_id": "45234_3240_00002", + "geo_ligne": "G", + "geo_l4": "2 RUE GIRODET", + "geo_l5": null, + "unite_legale_id": 171535165, + "created_at": "2021-06-02T03:36:27.148+02:00", + "updated_at": "2021-06-02T03:36:27.148+02:00" + }, + { + "id": 451973941, + "siren": "534886650", + "nic": "00033", + "siret": "53488665000033", + "statut_diffusion": "O", + "date_creation": "2014-11-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2017-02-28T14:59:25", + "etablissement_siege": "false", + "nombre_periodes": "2", + "complement_adresse": null, + "numero_voie": "46", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "BANNIER", + "code_postal": "45000", + "libelle_commune": "ORLEANS", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "45234", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2015-07-01", + "etat_administratif": "F", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "69.10Z", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "1.902991", + "latitude": "47.904217", + "geo_score": "0.88", + "geo_type": "housenumber", + "geo_adresse": "46 Rue du Faubourg Bannier 45000 Orléans", + "geo_id": "45234_0510_00046", + "geo_ligne": "G", + "geo_l4": "46 RUE DU FAUBOURG BANNIER", + "geo_l5": null, + "unite_legale_id": 171535165, + "created_at": "2021-06-02T03:36:27.148+02:00", + "updated_at": "2021-06-02T03:36:27.148+02:00" + }, + { + "id": 451973940, + "siren": "534886650", + "nic": "00025", + "siret": "53488665000025", + "statut_diffusion": "O", + "date_creation": "2014-01-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2014-11-24T10:21:17", + "etablissement_siege": "false", + "nombre_periodes": "2", + "complement_adresse": null, + "numero_voie": "6", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "DU COLOMBIER", + "code_postal": "45000", + "libelle_commune": "ORLEANS", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "45234", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2014-11-01", + "etat_administratif": "F", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "69.10Z", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "1.902405", + "latitude": "47.903641", + "geo_score": "0.96", + "geo_type": "housenumber", + "geo_adresse": "6 Rue du Colombier 45000 Orléans", + "geo_id": "45234_1850_00006", + "geo_ligne": "G", + "geo_l4": "6 RUE DU COLOMBIER", + "geo_l5": null, + "unite_legale_id": 171535165, + "created_at": "2021-06-02T03:36:27.148+02:00", + "updated_at": "2021-06-02T03:36:27.148+02:00" + }, + { + "id": 443402073, + "siren": "534886650", + "nic": "00017", + "siret": "53488665000017", + "statut_diffusion": "O", + "date_creation": "2011-10-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2013-12-19T10:47:47", + "etablissement_siege": "false", + "nombre_periodes": "2", + "complement_adresse": null, + "numero_voie": "130", + "indice_repetition": null, + "type_voie": "BD", + "libelle_voie": "LEROY", + "code_postal": "14000", + "libelle_commune": "CAEN", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "14118", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2012-06-01", + "etat_administratif": "F", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "85.59B", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "-0.342479", + "latitude": "49.173431", + "geo_score": "0.81", + "geo_type": "housenumber", + "geo_adresse": "130 Boulevard Leroy 14000 Caen", + "geo_id": "14118_4470_00130", + "geo_ligne": "G", + "geo_l4": "130 BOULEVARD LEROY", + "geo_l5": null, + "unite_legale_id": 171535165, + "created_at": "2021-06-02T02:31:00.260+02:00", + "updated_at": "2021-06-02T02:31:00.260+02:00" + } + ] + } +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzgwMDU1OTA2ND9zdGF0dXRfZGlmZnVzaW9uPU8=.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzgwMDU1OTA2ND9zdGF0dXRfZGlmZnVzaW9uPU8=.json new file mode 100644 index 000000000..fc4007ece --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzgwMDU1OTA2ND9zdGF0dXRfZGlmZnVzaW9uPU8=.json @@ -0,0 +1,233 @@ +{ + "unite_legale": { + "id": 174239061, + "siren": "800559064", + "statut_diffusion": "O", + "unite_purgee": null, + "date_creation": "2014-02-20", + "sigle": null, + "sexe": null, + "prenom_1": null, + "prenom_2": null, + "prenom_3": null, + "prenom_4": null, + "prenom_usuel": null, + "pseudonyme": null, + "identifiant_association": null, + "tranche_effectifs": "11", + "annee_effectifs": "2018", + "date_dernier_traitement": "2020-08-25T11:09:50", + "nombre_periodes": "4", + "categorie_entreprise": "PME", + "annee_categorie_entreprise": "2018", + "date_fin": null, + "date_debut": "2016-02-01", + "etat_administratif": "A", + "nom": null, + "nom_usage": null, + "denomination": "MENOZZI VAISE", + "denomination_usuelle_1": null, + "denomination_usuelle_2": null, + "denomination_usuelle_3": null, + "categorie_juridique": "5499", + "activite_principale": "56.10C", + "nomenclature_activite_principale": "NAFRev2", + "nic_siege": "00012", + "economie_sociale_solidaire": "N", + "caractere_employeur": "O", + "created_at": "2021-06-02T03:35:18.675+02:00", + "updated_at": "2021-06-02T03:35:18.675+02:00", + "etablissement_siege": { + "id": 458568568, + "siren": "800559064", + "nic": "00012", + "siret": "80055906400012", + "statut_diffusion": "O", + "date_creation": "2014-02-20", + "tranche_effectifs": "11", + "annee_effectifs": "2018", + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2020-08-25T11:09:50", + "etablissement_siege": "true", + "nombre_periodes": "3", + "complement_adresse": null, + "numero_voie": "51", + "indice_repetition": "B", + "type_voie": "RUE", + "libelle_voie": "DE ST CYR", + "code_postal": "69009", + "libelle_commune": "LYON 9EME", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "69389", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2014-04-01", + "etat_administratif": "A", + "enseigne_1": "CLASS'CROUTE", + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": "CLASS'CROUTE", + "activite_principale": "56.10C", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "4.807071", + "latitude": "45.782404", + "geo_score": "0.49", + "geo_type": "housenumber", + "geo_adresse": "51 bis Rue de Saint-cyr 69009 Lyon", + "geo_id": "69389_6295_00051_bis", + "geo_ligne": "G", + "geo_l4": "51 BIS RUE DE SAINT CYR", + "geo_l5": null, + "unite_legale_id": 174239061, + "created_at": "2021-06-02T04:18:43.738+02:00", + "updated_at": "2021-06-02T04:18:43.738+02:00" + }, + "numero_tva_intra": "FR78800559064", + "etablissements": [ + { + "id": 458568569, + "siren": "800559064", + "nic": "00020", + "siret": "80055906400020", + "statut_diffusion": "O", + "date_creation": "2016-02-01", + "tranche_effectifs": null, + "annee_effectifs": null, + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2019-12-20T03:51:22", + "etablissement_siege": "false", + "nombre_periodes": "2", + "complement_adresse": "41-43", + "numero_voie": "41", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "DES CHARTREUX", + "code_postal": "69001", + "libelle_commune": "LYON 1ER", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "69381", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2018-12-31", + "etat_administratif": "F", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "52.10B", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "N", + "longitude": "4.825305", + "latitude": "45.771974", + "geo_score": "0.62", + "geo_type": "housenumber", + "geo_adresse": "41 Rue des Chartreux 69001 Lyon", + "geo_id": "69381_1550_00041", + "geo_ligne": "G", + "geo_l4": "41 RUE DES CHARTREUX", + "geo_l5": null, + "unite_legale_id": 174239061, + "created_at": "2021-06-02T04:18:43.738+02:00", + "updated_at": "2021-06-02T04:18:43.738+02:00" + }, + { + "id": 458568568, + "siren": "800559064", + "nic": "00012", + "siret": "80055906400012", + "statut_diffusion": "O", + "date_creation": "2014-02-20", + "tranche_effectifs": "11", + "annee_effectifs": "2018", + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2020-08-25T11:09:50", + "etablissement_siege": "true", + "nombre_periodes": "3", + "complement_adresse": null, + "numero_voie": "51", + "indice_repetition": "B", + "type_voie": "RUE", + "libelle_voie": "DE ST CYR", + "code_postal": "69009", + "libelle_commune": "LYON 9EME", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "69389", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2014-04-01", + "etat_administratif": "A", + "enseigne_1": "CLASS'CROUTE", + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": "CLASS'CROUTE", + "activite_principale": "56.10C", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "4.807071", + "latitude": "45.782404", + "geo_score": "0.49", + "geo_type": "housenumber", + "geo_adresse": "51 bis Rue de Saint-cyr 69009 Lyon", + "geo_id": "69389_6295_00051_bis", + "geo_ligne": "G", + "geo_l4": "51 BIS RUE DE SAINT CYR", + "geo_l5": null, + "unite_legale_id": 174239061, + "created_at": "2021-06-02T04:18:43.738+02:00", + "updated_at": "2021-06-02T04:18:43.738+02:00" + } + ] + } +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzgzNDM2NDI5MT9zdGF0dXRfZGlmZnVzaW9uPU8=.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzgzNDM2NDI5MT9zdGF0dXRfZGlmZnVzaW9uPU8=.json new file mode 100644 index 000000000..cd989a7aa --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzgzNDM2NDI5MT9zdGF0dXRfZGlmZnVzaW9uPU8=.json @@ -0,0 +1,170 @@ +{ + "unite_legale": { + "id": 176793512, + "siren": "834364291", + "statut_diffusion": "O", + "unite_purgee": null, + "date_creation": "2018-01-02", + "sigle": null, + "sexe": null, + "prenom_1": null, + "prenom_2": null, + "prenom_3": null, + "prenom_4": null, + "prenom_usuel": null, + "pseudonyme": null, + "identifiant_association": null, + "tranche_effectifs": "01", + "annee_effectifs": "2018", + "date_dernier_traitement": "2020-08-25T11:39:32", + "nombre_periodes": "2", + "categorie_entreprise": "PME", + "annee_categorie_entreprise": "2018", + "date_fin": null, + "date_debut": "2018-03-25", + "etat_administratif": "A", + "nom": null, + "nom_usage": null, + "denomination": "MENOZ", + "denomination_usuelle_1": null, + "denomination_usuelle_2": null, + "denomination_usuelle_3": null, + "categorie_juridique": "5710", + "activite_principale": "62.01Z", + "nomenclature_activite_principale": "NAFRev2", + "nic_siege": "00015", + "economie_sociale_solidaire": null, + "caractere_employeur": "O", + "created_at": "2021-06-02T03:50:03.514+02:00", + "updated_at": "2021-06-02T03:50:03.514+02:00", + "etablissement_siege": { + "id": 462664601, + "siren": "834364291", + "nic": "00015", + "siret": "83436429100015", + "statut_diffusion": "O", + "date_creation": "2018-01-02", + "tranche_effectifs": "01", + "annee_effectifs": "2018", + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2020-08-25T11:39:32", + "etablissement_siege": "true", + "nombre_periodes": "2", + "complement_adresse": null, + "numero_voie": "55", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "DES PYRENEES", + "code_postal": "75020", + "libelle_commune": "PARIS 20", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "75120", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2018-03-25", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "62.01Z", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "2.406077", + "latitude": "48.851854", + "geo_score": "0.61", + "geo_type": "housenumber", + "geo_adresse": "55 Rue des Pyrénées 75020 Paris", + "geo_id": "75120_7904_00055", + "geo_ligne": "G", + "geo_l4": "55 RUE DES PYRENEES", + "geo_l5": null, + "unite_legale_id": 176793512, + "created_at": "2021-06-02T04:37:11.627+02:00", + "updated_at": "2021-06-02T04:37:11.627+02:00" + }, + "numero_tva_intra": "FR28834364291", + "etablissements": [ + { + "id": 462664601, + "siren": "834364291", + "nic": "00015", + "siret": "83436429100015", + "statut_diffusion": "O", + "date_creation": "2018-01-02", + "tranche_effectifs": "01", + "annee_effectifs": "2018", + "activite_principale_registre_metiers": null, + "date_dernier_traitement": "2020-08-25T11:39:32", + "etablissement_siege": "true", + "nombre_periodes": "2", + "complement_adresse": null, + "numero_voie": "55", + "indice_repetition": null, + "type_voie": "RUE", + "libelle_voie": "DES PYRENEES", + "code_postal": "75020", + "libelle_commune": "PARIS 20", + "libelle_commune_etranger": null, + "distribution_speciale": null, + "code_commune": "75120", + "code_cedex": null, + "libelle_cedex": null, + "code_pays_etranger": null, + "libelle_pays_etranger": null, + "complement_adresse_2": null, + "numero_voie_2": null, + "indice_repetition_2": null, + "type_voie_2": null, + "libelle_voie_2": null, + "code_postal_2": null, + "libelle_commune_2": null, + "libelle_commune_etranger_2": null, + "distribution_speciale_2": null, + "code_commune_2": null, + "code_cedex_2": null, + "libelle_cedex_2": null, + "code_pays_etranger_2": null, + "libelle_pays_etranger_2": null, + "date_debut": "2018-03-25", + "etat_administratif": "A", + "enseigne_1": null, + "enseigne_2": null, + "enseigne_3": null, + "denomination_usuelle": null, + "activite_principale": "62.01Z", + "nomenclature_activite_principale": "NAFRev2", + "caractere_employeur": "O", + "longitude": "2.406077", + "latitude": "48.851854", + "geo_score": "0.61", + "geo_type": "housenumber", + "geo_adresse": "55 Rue des Pyrénées 75020 Paris", + "geo_id": "75120_7904_00055", + "geo_ligne": "G", + "geo_l4": "55 RUE DES PYRENEES", + "geo_l5": null, + "unite_legale_id": 176793512, + "created_at": "2021-06-02T04:37:11.627+02:00", + "updated_at": "2021-06-02T04:37:11.627+02:00" + } + ] + } +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvMzQxNjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvMzQxNjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json new file mode 100644 index 000000000..8987a60b4 --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvMzQxNjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json @@ -0,0 +1,12 @@ +{ + "nom": "Mons", + "code": "34160", + "departement": { + "code": "34", + "nom": "Hérault" + }, + "region": { + "code": "76", + "nom": "Occitanie" + } +} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvNzUxMjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvNzUxMjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json new file mode 100644 index 000000000..fe941ed7f --- /dev/null +++ b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvNzUxMjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json @@ -0,0 +1,12 @@ +{ + "nom": "Paris 20e Arrondissement", + "code": "75120", + "departement": { + "code": "75", + "nom": "Paris" + }, + "region": { + "code": "11", + "nom": "Île-de-France" + } +} \ No newline at end of file diff --git a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js index e1ec6f40d..d72673612 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js @@ -1,12 +1,76 @@ +const fr = Cypress.env('language') === 'fr' + +const FIXTURES_FOLDER = 'cypress/fixtures' +const GERER_FIXTURES_FOLDER = `${FIXTURES_FOLDER}/gérer` +const writeFixtures = Cypress.env('record_http') !== undefined +const stubFixtures = !writeFixtures +const setInterceptResponses = (requestsMatches, responses, ...urlsMatch) => { + // TODO: just capture everything by default? + if (writeFixtures) { + urlsMatch.forEach((urlMatch) => { + cy.intercept(urlMatch, (req) => { + requestsMatches.push(urlMatch) + req.on('after:response', (res) => { + responses[res.url] = res.body + }) + }).as(urlMatch) + }) + } else if (stubFixtures) { + const urlOfFilepath = (filename) => { + return atob(filename.slice(0, -'.json'.length)) + } + cy.exec(`find ${GERER_FIXTURES_FOLDER} -type f`) + .then((result) => { + return result.stdout.split('\n') + }) + .then((filepaths) => { + filepaths.forEach((filepath) => { + const shortPath = filepath.slice(FIXTURES_FOLDER.length + 1) + const filename = filepath.slice(GERER_FIXTURES_FOLDER.length + 1) + cy.intercept(urlOfFilepath(filename), { fixture: shortPath }) + }) + }) + } +} +const waitResponses = (requestsMatches, responses) => { + if (writeFixtures) { + if (!requestsMatches.length) return + // TODO: we pobably don't need to `cy.wait`. + // Caveat: for a given urlMatch, when any of the matching responses is + // received (the first one), the `cy.wait` will resolve. + // see https://docs.cypress.io/api/commands/intercept#Waiting-on-a-request + cy.wait(requestsMatches.map((urlMatch) => `@${urlMatch}`)).then(() => { + Object.keys(responses).map((url) => { + cy.writeFile( + `${GERER_FIXTURES_FOLDER}/${btoa(url)}.json`, + JSON.stringify(responses[url], null, 2) + ) + }) + }) + } +} + describe('Manage page test', function () { - const fr = Cypress.env('language') === 'fr' + let requestsMatches = [] + let responses = {} + const urlsMatch = [ + 'https://entreprise.data.gouv.fr/api/sirene/v1/full_text/**', + 'https://entreprise.data.gouv.fr/api/sirene/v3/unites_legales/**', + 'https://geo.api.gouv.fr/communes/**', + ] beforeEach(() => { + requestsMatches = [] + responses = {} + setInterceptResponses(requestsMatches, responses, ...urlsMatch) cy.visit(fr ? encodeURI('/gérer') : '/manage') }) + afterEach(() => { + waitResponses(requestsMatches, responses) + }) it('should not crash', function () { cy.contains(fr ? 'Gérer mon activité' : 'Manage my business') }) - it.skip('should allow to retrieve company and show link corresponding to the legal status', function () { + it('should allow to retrieve company and show link corresponding to the legal status', function () { cy.get('button.cta').click() cy.get('input').first().type('menoz') cy.contains('834364291').click() @@ -15,7 +79,7 @@ describe('Manage page test', function () { expect(loc.pathname).to.match(fr ? /dirigeant-sasu$/ : /sasu-chairman$/) }) }) - it.skip('should allow auto entrepreneur to access the corresponding income simulator', function () { + it('should allow auto entrepreneur to access the corresponding income simulator', function () { cy.get('button.cta').click() cy.get('input').first().type('johan girod') cy.contains('MONSIEUR').click() diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index bd0af5bad..3c830f513 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -116,6 +116,7 @@ "test:dev-e2e:publicodes": "cypress open --browser chromium --config baseUrl=http://localhost:8080/publicodes,integrationFolder=cypress/integration/publi.codes", "test:dev-e2e:mon-entreprise": "cypress open --browser chromium", "test:dev-e2e:mycompanyinfrance": "cypress open --browser chromium --config baseUrl=http://localhost:8080/infrance", + "test:record-http-calls:mon-entreprise": "cypress run --env record_http=", "i18n:rules:check": "node scripts/i18n/check-missing-rule-translation.js", "i18n:rules:translate": "node scripts/i18n/translate-rules.js", "i18n:ui:check": "yarn run i18next -c scripts/i18n/parser.config.js && node scripts/i18n/check-missing-UI-translation", From 7bd3dff988e523b6869e9c9df828161a82ff3fb1 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Wed, 2 Jun 2021 13:10:42 +0200 Subject: [PATCH 195/319] =?UTF-8?q?=E2=9C=85=20Cypress=20stubbing=20simpli?= =?UTF-8?q?fied?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * filter on hostnames * do not call cy.wait on responses --- ...QwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json | 296 ------------------ .../ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json | 12 - .../integration/mon-entreprise/gérer.js | 50 ++- 3 files changed, 19 insertions(+), 339 deletions(-) delete mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json delete mode 100644 mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvNzUxMjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json deleted file mode 100644 index 3ab24960e..000000000 --- a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9lbnRyZXByaXNlLmRhdGEuZ291di5mci9hcGkvc2lyZW5lL3YzL3VuaXRlc19sZWdhbGVzLzQwMzA0OTQ0OD9zdGF0dXRfZGlmZnVzaW9uPU8=.json +++ /dev/null @@ -1,296 +0,0 @@ -{ - "unite_legale": { - "id": 163930767, - "siren": "403049448", - "statut_diffusion": "O", - "unite_purgee": null, - "date_creation": "1995-11-29", - "sigle": null, - "sexe": null, - "prenom_1": null, - "prenom_2": null, - "prenom_3": null, - "prenom_4": null, - "prenom_usuel": null, - "pseudonyme": null, - "identifiant_association": null, - "tranche_effectifs": "NN", - "annee_effectifs": null, - "date_dernier_traitement": "2020-01-21T19:35:08", - "nombre_periodes": "5", - "categorie_entreprise": null, - "annee_categorie_entreprise": null, - "date_fin": null, - "date_debut": "2019-09-02", - "etat_administratif": "A", - "nom": null, - "nom_usage": null, - "denomination": "MISTRAL MENOZZI", - "denomination_usuelle_1": null, - "denomination_usuelle_2": null, - "denomination_usuelle_3": null, - "categorie_juridique": "6540", - "activite_principale": "68.20A", - "nomenclature_activite_principale": "NAFRev2", - "nic_siege": "00034", - "economie_sociale_solidaire": "N", - "caractere_employeur": "N", - "created_at": "2021-06-02T02:36:00.235+02:00", - "updated_at": "2021-06-02T02:36:00.235+02:00", - "etablissement_siege": { - "id": 465543867, - "siren": "403049448", - "nic": "00034", - "siret": "40304944800034", - "statut_diffusion": "O", - "date_creation": "2019-09-02", - "tranche_effectifs": null, - "annee_effectifs": null, - "activite_principale_registre_metiers": null, - "date_dernier_traitement": "2020-01-21T19:35:08", - "etablissement_siege": "true", - "nombre_periodes": "1", - "complement_adresse": null, - "numero_voie": "551", - "indice_repetition": null, - "type_voie": "RTE", - "libelle_voie": "DE GADAGNE", - "code_postal": "84450", - "libelle_commune": "SAINT-SATURNIN-LES-AVIGNON", - "libelle_commune_etranger": null, - "distribution_speciale": null, - "code_commune": "84119", - "code_cedex": null, - "libelle_cedex": null, - "code_pays_etranger": null, - "libelle_pays_etranger": null, - "complement_adresse_2": null, - "numero_voie_2": null, - "indice_repetition_2": null, - "type_voie_2": null, - "libelle_voie_2": null, - "code_postal_2": null, - "libelle_commune_2": null, - "libelle_commune_etranger_2": null, - "distribution_speciale_2": null, - "code_commune_2": null, - "code_cedex_2": null, - "libelle_cedex_2": null, - "code_pays_etranger_2": null, - "libelle_pays_etranger_2": null, - "date_debut": "2019-09-02", - "etat_administratif": "A", - "enseigne_1": null, - "enseigne_2": null, - "enseigne_3": null, - "denomination_usuelle": null, - "activite_principale": "68.20A", - "nomenclature_activite_principale": "NAFRev2", - "caractere_employeur": "N", - "longitude": "4.938683", - "latitude": "43.953835", - "geo_score": "0.85", - "geo_type": "housenumber", - "geo_adresse": "551 Route de Gadagne 84450 Saint-Saturnin-lès-Avignon", - "geo_id": "84119_0298_00551", - "geo_ligne": "G", - "geo_l4": "551 ROUTE DE GADAGNE", - "geo_l5": null, - "unite_legale_id": 163930767, - "created_at": "2021-06-02T04:50:13.598+02:00", - "updated_at": "2021-06-02T04:50:13.598+02:00" - }, - "numero_tva_intra": "FR94403049448", - "etablissements": [ - { - "id": 465543867, - "siren": "403049448", - "nic": "00034", - "siret": "40304944800034", - "statut_diffusion": "O", - "date_creation": "2019-09-02", - "tranche_effectifs": null, - "annee_effectifs": null, - "activite_principale_registre_metiers": null, - "date_dernier_traitement": "2020-01-21T19:35:08", - "etablissement_siege": "true", - "nombre_periodes": "1", - "complement_adresse": null, - "numero_voie": "551", - "indice_repetition": null, - "type_voie": "RTE", - "libelle_voie": "DE GADAGNE", - "code_postal": "84450", - "libelle_commune": "SAINT-SATURNIN-LES-AVIGNON", - "libelle_commune_etranger": null, - "distribution_speciale": null, - "code_commune": "84119", - "code_cedex": null, - "libelle_cedex": null, - "code_pays_etranger": null, - "libelle_pays_etranger": null, - "complement_adresse_2": null, - "numero_voie_2": null, - "indice_repetition_2": null, - "type_voie_2": null, - "libelle_voie_2": null, - "code_postal_2": null, - "libelle_commune_2": null, - "libelle_commune_etranger_2": null, - "distribution_speciale_2": null, - "code_commune_2": null, - "code_cedex_2": null, - "libelle_cedex_2": null, - "code_pays_etranger_2": null, - "libelle_pays_etranger_2": null, - "date_debut": "2019-09-02", - "etat_administratif": "A", - "enseigne_1": null, - "enseigne_2": null, - "enseigne_3": null, - "denomination_usuelle": null, - "activite_principale": "68.20A", - "nomenclature_activite_principale": "NAFRev2", - "caractere_employeur": "N", - "longitude": "4.938683", - "latitude": "43.953835", - "geo_score": "0.85", - "geo_type": "housenumber", - "geo_adresse": "551 Route de Gadagne 84450 Saint-Saturnin-lès-Avignon", - "geo_id": "84119_0298_00551", - "geo_ligne": "G", - "geo_l4": "551 ROUTE DE GADAGNE", - "geo_l5": null, - "unite_legale_id": 163930767, - "created_at": "2021-06-02T04:50:13.598+02:00", - "updated_at": "2021-06-02T04:50:13.598+02:00" - }, - { - "id": 465543866, - "siren": "403049448", - "nic": "00026", - "siret": "40304944800026", - "statut_diffusion": "O", - "date_creation": "2007-02-01", - "tranche_effectifs": null, - "annee_effectifs": null, - "activite_principale_registre_metiers": null, - "date_dernier_traitement": "2020-01-21T19:35:08", - "etablissement_siege": "false", - "nombre_periodes": "3", - "complement_adresse": null, - "numero_voie": "1950", - "indice_repetition": null, - "type_voie": "CHE", - "libelle_voie": "DE SAINT GENS", - "code_postal": "84200", - "libelle_commune": "CARPENTRAS", - "libelle_commune_etranger": null, - "distribution_speciale": null, - "code_commune": "84031", - "code_cedex": null, - "libelle_cedex": null, - "code_pays_etranger": null, - "libelle_pays_etranger": null, - "complement_adresse_2": null, - "numero_voie_2": null, - "indice_repetition_2": null, - "type_voie_2": null, - "libelle_voie_2": null, - "code_postal_2": null, - "libelle_commune_2": null, - "libelle_commune_etranger_2": null, - "distribution_speciale_2": null, - "code_commune_2": null, - "code_cedex_2": null, - "libelle_cedex_2": null, - "code_pays_etranger_2": null, - "libelle_pays_etranger_2": null, - "date_debut": "2019-09-02", - "etat_administratif": "F", - "enseigne_1": null, - "enseigne_2": null, - "enseigne_3": null, - "denomination_usuelle": null, - "activite_principale": "68.20A", - "nomenclature_activite_principale": "NAFRev2", - "caractere_employeur": "N", - "longitude": "5.046323", - "latitude": "44.032154", - "geo_score": "0.87", - "geo_type": "housenumber", - "geo_adresse": "1950 Chemin de Saint-gens 84200 Carpentras", - "geo_id": "84031_1805_01950", - "geo_ligne": "G", - "geo_l4": "1950 CHEMIN DE SAINT GENS", - "geo_l5": null, - "unite_legale_id": 163930767, - "created_at": "2021-06-02T04:50:13.598+02:00", - "updated_at": "2021-06-02T04:50:13.598+02:00" - }, - { - "id": 465543865, - "siren": "403049448", - "nic": "00018", - "siret": "40304944800018", - "statut_diffusion": "O", - "date_creation": "1995-11-29", - "tranche_effectifs": "NN", - "annee_effectifs": null, - "activite_principale_registre_metiers": null, - "date_dernier_traitement": "2007-02-15T11:44:24", - "etablissement_siege": "false", - "nombre_periodes": "3", - "complement_adresse": null, - "numero_voie": "145", - "indice_repetition": null, - "type_voie": "AV", - "libelle_voie": "DWIGHT EISENHOWER", - "code_postal": "84200", - "libelle_commune": "CARPENTRAS", - "libelle_commune_etranger": null, - "distribution_speciale": null, - "code_commune": "84031", - "code_cedex": null, - "libelle_cedex": null, - "code_pays_etranger": null, - "libelle_pays_etranger": null, - "complement_adresse_2": null, - "numero_voie_2": null, - "indice_repetition_2": null, - "type_voie_2": null, - "libelle_voie_2": null, - "code_postal_2": null, - "libelle_commune_2": null, - "libelle_commune_etranger_2": null, - "distribution_speciale_2": null, - "code_commune_2": null, - "code_cedex_2": null, - "libelle_cedex_2": null, - "code_pays_etranger_2": null, - "libelle_pays_etranger_2": null, - "date_debut": "2007-02-01", - "etat_administratif": "F", - "enseigne_1": null, - "enseigne_2": null, - "enseigne_3": null, - "denomination_usuelle": null, - "activite_principale": "70.2A", - "nomenclature_activite_principale": "NAFRev1", - "caractere_employeur": "N", - "longitude": "5.045559", - "latitude": "44.043377", - "geo_score": "0.73", - "geo_type": "street", - "geo_adresse": "Avenue Dwight Eisenhower 84200 Carpentras", - "geo_id": "84031_0589", - "geo_ligne": "G", - "geo_l4": "AVENUE DWIGHT EISENHOWER", - "geo_l5": null, - "unite_legale_id": 163930767, - "created_at": "2021-06-02T04:50:13.598+02:00", - "updated_at": "2021-06-02T04:50:13.598+02:00" - } - ] - } -} \ No newline at end of file diff --git a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvNzUxMjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json b/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvNzUxMjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json deleted file mode 100644 index fe941ed7f..000000000 --- a/mon-entreprise/cypress/fixtures/gérer/aHR0cHM6Ly9nZW8uYXBpLmdvdXYuZnIvY29tbXVuZXMvNzUxMjA/ZmllbGRzPWRlcGFydGVtZW50LHJlZ2lvbg==.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "nom": "Paris 20e Arrondissement", - "code": "75120", - "departement": { - "code": "75", - "nom": "Paris" - }, - "region": { - "code": "11", - "nom": "Île-de-France" - } -} \ No newline at end of file diff --git a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js index d72673612..74ee277cb 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js @@ -4,16 +4,13 @@ const FIXTURES_FOLDER = 'cypress/fixtures' const GERER_FIXTURES_FOLDER = `${FIXTURES_FOLDER}/gérer` const writeFixtures = Cypress.env('record_http') !== undefined const stubFixtures = !writeFixtures -const setInterceptResponses = (requestsMatches, responses, ...urlsMatch) => { - // TODO: just capture everything by default? +const setInterceptResponses = (responses, hostnames) => { if (writeFixtures) { - urlsMatch.forEach((urlMatch) => { - cy.intercept(urlMatch, (req) => { - requestsMatches.push(urlMatch) - req.on('after:response', (res) => { - responses[res.url] = res.body - }) - }).as(urlMatch) + cy.intercept('*', (req) => { + if (!hostnames.includes(new URL(req.url).hostname)) return + req.on('after:response', (res) => { + responses[res.url] = res.body + }) }) } else if (stubFixtures) { const urlOfFilepath = (filename) => { @@ -32,40 +29,31 @@ const setInterceptResponses = (requestsMatches, responses, ...urlsMatch) => { }) } } -const waitResponses = (requestsMatches, responses) => { +const waitResponses = (responses) => { if (writeFixtures) { - if (!requestsMatches.length) return - // TODO: we pobably don't need to `cy.wait`. - // Caveat: for a given urlMatch, when any of the matching responses is - // received (the first one), the `cy.wait` will resolve. - // see https://docs.cypress.io/api/commands/intercept#Waiting-on-a-request - cy.wait(requestsMatches.map((urlMatch) => `@${urlMatch}`)).then(() => { - Object.keys(responses).map((url) => { - cy.writeFile( - `${GERER_FIXTURES_FOLDER}/${btoa(url)}.json`, - JSON.stringify(responses[url], null, 2) - ) - }) + // No need to `cy.wait`, we anyway don't care about not-yet-received + // responses, as we don't care about responses not yet utilized in the + // test itself. Caveat: fixtures folder is undeterministic when recording. + Object.keys(responses).map((url) => { + if (responses[url] === undefined) return + cy.writeFile( + `${GERER_FIXTURES_FOLDER}/${btoa(url)}.json`, + JSON.stringify(responses[url], null, 2) + ) }) } } describe('Manage page test', function () { - let requestsMatches = [] let responses = {} - const urlsMatch = [ - 'https://entreprise.data.gouv.fr/api/sirene/v1/full_text/**', - 'https://entreprise.data.gouv.fr/api/sirene/v3/unites_legales/**', - 'https://geo.api.gouv.fr/communes/**', - ] + const hostnamesToRecord = ['entreprise.data.gouv.fr', 'geo.api.gouv.fr'] beforeEach(() => { - requestsMatches = [] responses = {} - setInterceptResponses(requestsMatches, responses, ...urlsMatch) + setInterceptResponses(responses, hostnamesToRecord) cy.visit(fr ? encodeURI('/gérer') : '/manage') }) afterEach(() => { - waitResponses(requestsMatches, responses) + waitResponses(responses) }) it('should not crash', function () { cy.contains(fr ? 'Gérer mon activité' : 'Manage my business') From 2250dccf4b9001fcedf30dc8f48580f106d2275a Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Wed, 2 Jun 2021 23:18:16 +0200 Subject: [PATCH 196/319] =?UTF-8?q?=F0=9F=92=9A=20Fix=20Pole=20emploi=20if?= =?UTF-8?q?rame=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cypress/integration/external/external-integrations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mon-entreprise/cypress/integration/external/external-integrations.js b/mon-entreprise/cypress/integration/external/external-integrations.js index b5613e51e..0632104dc 100644 --- a/mon-entreprise/cypress/integration/external/external-integrations.js +++ b/mon-entreprise/cypress/integration/external/external-integrations.js @@ -1,7 +1,7 @@ describe('Pole emploi', function () { it('should display an iframe of the simulateur', function () { cy.on('uncaught:exception', (err) => { - return !err.message.contains('Unexpected token <') + return !err.message.includes("Unexpected token '<'") }) cy.visit('https://entreprise.pole-emploi.fr/cout-salarie/') cy.get('#simulateurEmbauche').iframe().contains('Salaire net') From 1e913a3a30b3354e08e20b4d82d3947d99cb50c9 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Sat, 15 May 2021 12:52:45 +0200 Subject: [PATCH 197/319] =?UTF-8?q?=F0=9F=93=88=20Stats=20page=20-=20indic?= =?UTF-8?q?ateurs=20globaux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Ajout des indicateurs globaux (depuis le début et 30 derniers jours) en haut de page * Améliore typage page Stats * Refactor SatisfactionChart fix #1473 --- CONTRIBUTING.md | 6 + .../source/components/LangSwitcher.tsx | 5 +- .../source/pages/Stats/GlobalStats.tsx | 192 ++++++++++++++++++ .../source/pages/Stats/SatisfactionChart.tsx | 55 ++--- mon-entreprise/source/pages/Stats/Stats.tsx | 128 +++++------- mon-entreprise/source/pages/Stats/types.ts | 64 ++++++ mon-entreprise/source/pages/Stats/utils.tsx | 66 ++++++ 7 files changed, 410 insertions(+), 106 deletions(-) create mode 100644 mon-entreprise/source/pages/Stats/GlobalStats.tsx create mode 100644 mon-entreprise/source/pages/Stats/types.ts create mode 100644 mon-entreprise/source/pages/Stats/utils.tsx diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3f0f241e8..f2f0b4c2b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,6 +30,9 @@ Nous utilisons : ### Démarrage +Tout d'abord assurez-vous d'avoir toutes les clés d'API nécessaires dans votre fichier `mon-entreprise/.env`. +Demandez les détails à vos collègues (ces informations n'étant pas publiques). + Si l'historique des commits est trop volumineux, vous pouvez utiliser le paramètre `depth` de git pour ne télécharger que les derniers commits. ``` @@ -39,6 +42,9 @@ git clone --depth 100 git@github.com:betagouv/mon-entreprise.git && cd mon-entre # Install the Javascript dependencies through Yarn yarn install +# Download some data +yarn prepare + # Watch changes in publicodes and run the server for mon-entreprise yarn start ``` diff --git a/mon-entreprise/source/components/LangSwitcher.tsx b/mon-entreprise/source/components/LangSwitcher.tsx index c090901c5..e8c6a04b1 100644 --- a/mon-entreprise/source/components/LangSwitcher.tsx +++ b/mon-entreprise/source/components/LangSwitcher.tsx @@ -1,3 +1,4 @@ +import { AvailableLangs } from 'locales/i18n' import emoji from 'react-easy-emoji' import { useTranslation } from 'react-i18next' @@ -9,7 +10,7 @@ const languageCodeToEmoji = { export default function LangSwitcher({ className }: { className: string }) { const { i18n } = useTranslation() const languageCode = i18n.language - const unusedLanguageCode = + const unusedLanguageCode: AvailableLangs = !languageCode || languageCode === 'fr' ? 'en' : 'fr' const changeLanguage = () => { i18n.changeLanguage(unusedLanguageCode) @@ -19,7 +20,7 @@ export default function LangSwitcher({ className }: { className: string }) { className={className ?? 'ui__ link-button'} onClick={changeLanguage} > - {emoji(languageCodeToEmoji[languageCode as 'fr' | 'en'])}{' '} + {emoji(languageCodeToEmoji[languageCode as AvailableLangs])}{' '} {languageCode.toUpperCase()} ) diff --git a/mon-entreprise/source/pages/Stats/GlobalStats.tsx b/mon-entreprise/source/pages/Stats/GlobalStats.tsx new file mode 100644 index 000000000..62cfaf73a --- /dev/null +++ b/mon-entreprise/source/pages/Stats/GlobalStats.tsx @@ -0,0 +1,192 @@ +import emoji from 'react-easy-emoji' +import { Indicators, Indicator } from './utils' +import { SatisfactionLevel, StatsStruct } from './types' +import { useTranslation } from 'react-i18next' +import { SatisfactionStyle } from './SatisfactionChart' + +const add = (a: number, b: number) => a + b +const lastCompare = (startDate: Date, dateStr: string) => + startDate < new Date(dateStr) + +const BigIndicator: typeof Indicator = ({ main, subTitle, footnote }) => ( + + {main} +

    + } + subTitle={subTitle} + footnote={footnote} + /> +) + +const RetoursAsProgress = ({ + percentages, +}: { + percentages: Record +}) => ( +
    + {' '} + {SatisfactionStyle.map(([level, { emoji: emojiStr, color }]) => ( +
    + {emoji(emojiStr)} +
    + {Math.round(percentages[level])}% +
    +
    + ))} +
    +) +export default function GlobalStats({ stats }: { stats: StatsStruct }) { + const { i18n } = useTranslation() + const formatNumber = Intl.NumberFormat(i18n.language).format.bind(null) + + const totalVisits = formatNumber( + stats.visitesMois.site.map(({ nombre }) => nombre).reduce(add, 0) + ) + const totalCommenceATI = stats.visitesMois.pages + .filter(({ page }) => page === 'simulation_commencee') + .map(({ nombre }) => nombre) + .reduce(add, 0) + // Hardcoded stuff from https://github.com/betagouv/mon-entreprise/pull/1563#discussion_r635893624 + const totalCommenceMatomo = Object.values({ + 2019: Math.floor((1262601 * 45) / 100), + 2020: 1373536, + 2021: 273731, + }).reduce(add, 0) + const totalCommence = formatNumber(totalCommenceMatomo + totalCommenceATI) + + const day30before = new Date(new Date().setDate(new Date().getDate() - 30)) + + const last30dVisitsNum = stats.visitesJours.site + .filter(({ date }) => lastCompare(day30before, date)) + .map(({ nombre }) => nombre) + .reduce(add, 0) + const last30dVisits = formatNumber(last30dVisitsNum) + const last30dCommenceNum = stats.visitesJours.pages + .filter( + ({ date, page }) => + lastCompare(day30before, date) && page === 'simulation_commencee' + ) + .map(({ nombre }) => nombre) + .reduce(add, 0) + const last30dCommence = formatNumber(last30dCommenceNum) + const last30dConv = Math.round((100 * last30dCommenceNum) / last30dVisitsNum) + + const last30dSatisfactions = stats.satisfaction + .filter(({ date }) => lastCompare(day30before, date)) + .reduce( + (acc, { click: satisfactionLevel, nombre }) => ({ + ...acc, + [satisfactionLevel]: acc[satisfactionLevel] + nombre, + }), + { + [SatisfactionLevel.Mauvais]: 0, + [SatisfactionLevel.Moyen]: 0, + [SatisfactionLevel.Bien]: 0, + [SatisfactionLevel.TrèsBien]: 0, + } + ) + const last30dSatisfactionTotal = Object.values(last30dSatisfactions).reduce( + (a, b) => a + b + ) + const last30dSatisfactionPercentages = Object.fromEntries( + Object.entries(last30dSatisfactions).map(([level, count]) => [ + level, + (100 * count) / last30dSatisfactionTotal, + ]) + ) as Record + + return ( + <> + {' '} + + + + + + + + +
    + + Taux de conversion vers une simulation :{' '} + {last30dConv}% + +
    + + + {' '} + +
    + } + footnote={`${last30dSatisfactionTotal} avis sur les 30 derniers jours`} + width="75%" + /> + + + ) +} diff --git a/mon-entreprise/source/pages/Stats/SatisfactionChart.tsx b/mon-entreprise/source/pages/Stats/SatisfactionChart.tsx index 8e1dbe2a6..fc20a7cde 100644 --- a/mon-entreprise/source/pages/Stats/SatisfactionChart.tsx +++ b/mon-entreprise/source/pages/Stats/SatisfactionChart.tsx @@ -1,6 +1,4 @@ -import { ThemeColorsContext } from 'Components/utils/colors' import { add, mapObjIndexed } from 'ramda' -import React, { useContext } from 'react' import emoji from 'react-easy-emoji' import { Bar, @@ -10,6 +8,22 @@ import { Tooltip, XAxis, } from 'recharts' +import { SatisfactionLevel } from './types' + +export const SatisfactionStyle: [ + SatisfactionLevel, + { emoji: string; color: string } +][] = [ + [SatisfactionLevel.Mauvais, { emoji: '🙁', color: '#ff5959' }], + [SatisfactionLevel.Moyen, { emoji: '😐', color: '#fff339' }], + [SatisfactionLevel.Bien, { emoji: '🙂', color: '#90e789' }], + [SatisfactionLevel.TrèsBien, { emoji: '😀', color: '#0fc700' }], +] + +function toPercentage(data: Record): Record { + const total = Object.values(data).reduce(add) + return { ...mapObjIndexed((value) => (100 * value) / total, data), total } +} type SatisfactionChartProps = { data: Array<{ @@ -17,13 +31,7 @@ type SatisfactionChartProps = { nombre: Record }> } - -function toPercentage(data: Record): Record { - const total = Object.values(data).reduce(add) - return { ...mapObjIndexed((value) => (100 * value) / total, data), total } -} export default function SatisfactionChart({ data }: SatisfactionChartProps) { - const { color, lightColor, lighterColor } = useContext(ThemeColorsContext) if (!data.length) { return null } @@ -34,22 +42,21 @@ export default function SatisfactionChart({ data }: SatisfactionChartProps) { } /> - - '🙁'} position="left" /> - - - '😐'} position="left" /> - - - '🙂'} position="left" /> - - - '😀'} - position="left" - /> - + {SatisfactionStyle.map(([level, { emoji, color }]) => ( + + emoji} + position="left" + /> + + ))} diff --git a/mon-entreprise/source/pages/Stats/Stats.tsx b/mon-entreprise/source/pages/Stats/Stats.tsx index ae8f71001..07145d260 100644 --- a/mon-entreprise/source/pages/Stats/Stats.tsx +++ b/mon-entreprise/source/pages/Stats/Stats.tsx @@ -10,18 +10,23 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react' import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { useHistory, useLocation } from 'react-router-dom' -import styled from 'styled-components' import { TrackPage } from '../../ATInternetTracking' -import stats from '../../data/stats.json' +import statsJson from '../../data/stats.json' import { debounce } from '../../utils' import { SimulateurCard } from '../Simulateurs/Home' import useSimulatorsData, { SimulatorData } from '../Simulateurs/metadata' import Chart from './Chart' import DemandeUtilisateurs from './DemandesUtilisateurs' +import GlobalStats from './GlobalStats' +import { formatDay, formatMonth, Indicators, Indicator } from './utils' import SatisfactionChart from './SatisfactionChart' +import { StatsStruct, PageChapter2, Page, PageSatisfaction } from './types' + +const stats = (statsJson as unknown) as StatsStruct type Period = 'mois' | 'jours' -type Chapter2 = typeof stats.visitesJours.pages[number]['page_chapter2'] | 'PAM' +type Chapter2 = PageChapter2 | 'PAM' + const chapters2: Chapter2[] = [ ...new Set(stats.visitesMois.pages.map((p) => p.page_chapter2)), 'PAM', @@ -31,6 +36,8 @@ type Data = | Array<{ date: string; nombre: number }> | Array<{ date: string; nombre: Record }> +type Pageish = Page & PageSatisfaction + const isPAM = (name: string | undefined) => name && [ @@ -39,23 +46,15 @@ const isPAM = (name: string | undefined) => 'auxiliaire_medical', 'sage_femme', ].includes(name) -type RawData = Array<{ - date: string - page_chapter1?: string - page_chapter2: string - page_chapter3?: string - page?: string - click?: string - nombre: number -}> + const filterByChapter2 = ( - data: RawData, - chapter2: Chapter2 + pages: Pageish[], + chapter2: Chapter2 | '' ): Array<{ date: string; nombre: Record }> => { return toPairs( groupBy( (p) => p.date, - data.filter( + pages.filter( (p) => !chapter2 || (p.page !== 'accueil_pamc' && @@ -72,7 +71,7 @@ const filterByChapter2 = ( })) } -function groupByDate(data: RawData) { +function groupByDate(data: Pageish[]) { return toPairs( groupBy( (p) => p.date, @@ -102,7 +101,7 @@ const computeTotals = (data: Data): number | Record => { .reduce(mergeWith(add), {}) } -export default function Stats() { +const StatsDetail = () => { const defaultPeriod = 'mois' const history = useHistory() const location = useLocation() @@ -113,7 +112,7 @@ export default function Stats() { (urlParams.get('periode') as Period) ?? defaultPeriod ) const [chapter2, setChapter2] = useState( - urlParams.get('module') ?? '' + (urlParams.get('module') as Chapter2) ?? '' ) // The logic to persist some state in query parameters in the URL could be @@ -134,16 +133,16 @@ export default function Stats() { if (!chapter2) { return rawData.site } - return filterByChapter2(rawData.pages, chapter2) + return filterByChapter2(rawData.pages as Pageish[], chapter2) }, [period, chapter2]) const repartition = useMemo(() => { const rawData = stats.visitesMois - return groupByDate(rawData.pages) + return groupByDate(rawData.pages as Pageish[]) }, []) const satisfaction = useMemo(() => { - return filterByChapter2(stats.satisfaction, chapter2) + return filterByChapter2(stats.satisfaction as Pageish[], chapter2) }, [chapter2]) const [[startDateIndex, endDateIndex], setDateIndex] = useState< @@ -173,21 +172,10 @@ export default function Stats() { () => computeTotals(slicedVisits), [slicedVisits] ) + return ( <> - - - -

    - Statistiques <>{emoji('📊')} -

    -

    - Découvrez nos statistiques d'utilisation mises à jour quotidiennement. -
    - Les données recueillies sont anonymisées.{' '} - -

    - +

    Statistiques détaillées

    1. Sélectionner la fonctionnalité :

    @@ -315,57 +303,34 @@ export default function Stats() { />
    - - ) } -const Indicators = styled.div` - display: flex; - flex-direction: row; - justify-content: space-around; - margin: 2rem 0; -` - -type IndicatorProps = { - main?: string - subTitle?: React.ReactNode -} - -function Indicator({ main, subTitle }: IndicatorProps) { +export default function Stats() { return ( -
    - {subTitle} -
    - {main} -
    + <> + + + +

    + Statistiques <>{emoji('📊')} +

    +

    + Découvrez nos statistiques d'utilisation mises à jour quotidiennement. +
    + Les données recueillies sont anonymisées.{' '} + +

    + + + + + + ) } -function formatDay(date: string | Date) { - return new Date(date).toLocaleString('default', { - weekday: 'long', - day: 'numeric', - month: 'long', - }) -} - -function formatMonth(date: string | Date) { - return new Date(date).toLocaleString('default', { - month: 'long', - year: 'numeric', - }) -} - function getChapter2(s: SimulatorData[keyof SimulatorData]): Chapter2 | '' { if (s.iframePath === 'pamc') { return 'PAM' @@ -373,9 +338,10 @@ function getChapter2(s: SimulatorData[keyof SimulatorData]): Chapter2 | '' { if (!s.tracking) { return '' } - return typeof s.tracking === 'string' ? s.tracking : s.tracking.chapter2 ?? '' + const tracking = s.tracking as { chapter2?: Chapter2 } + return typeof tracking === 'string' ? tracking : tracking.chapter2 ?? '' } -function SelectedSimulator(props: { chapter2: Chapter2 }) { +function SelectedSimulator(props: { chapter2: Chapter2 | '' }) { const simulateur = Object.values(useSimulatorsData()).find( (s) => getChapter2(s) === props.chapter2 && !(s.tracking as any).chapter3 ) @@ -440,7 +406,9 @@ function SimulateursChoice(props: { type="radio" name="simulateur" value={getChapter2(s)} - onChange={(evt) => props.onChange(evt.target.value)} + onChange={(evt) => + props.onChange(evt.target.value as Chapter2 | '') + } checked={getChapter2(s) === props.value} /> diff --git a/mon-entreprise/source/pages/Stats/types.ts b/mon-entreprise/source/pages/Stats/types.ts new file mode 100644 index 000000000..bf418a24f --- /dev/null +++ b/mon-entreprise/source/pages/Stats/types.ts @@ -0,0 +1,64 @@ +import statsJson from '../../data/stats.json' + +// Generated using app.quicktype.io + +export interface StatsStruct { + visitesJours: Visites + visitesMois: Visites + satisfaction: PageSatisfaction[] + retoursUtilisateurs: RetoursUtilisateurs +} + +export interface RetoursUtilisateurs { + open: Closed[] + closed: Closed[] +} + +export interface Closed { + title: string + closedAt: string | null + number: number + count: number +} + +export interface BasePage { + date: string + nombre: number + page_chapter1: string + page_chapter2: PageChapter2 + page_chapter3: string +} +export type Page = BasePage & { page: string } +export type PageSatisfaction = BasePage & { click: SatisfactionLevel } + +export enum SatisfactionLevel { + Bien = 'bien', + Mauvais = 'mauvais', + Moyen = 'moyen', + TrèsBien = 'très bien', +} + +export interface Visites { + pages: Page[] + site: Site[] +} + +export interface Site { + date: string + nombre: number +} + +export enum PageChapter2 { + AideDeclarationIndependant = 'aide_declaration_independant', + ArtisteAuteur = 'artiste_auteur', + AutoEntrepreneur = 'auto_entrepreneur', + ChomagePartiel = 'chomage_partiel', + ComparaisonStatut = 'comparaison_statut', + DirigeantSasu = 'dirigeant_sasu', + EconomieCollaborative = 'economie_collaborative', + Guide = 'guide', + ImpotSociete = 'impot_societe', + Independant = 'independant', + ProfessionLiberale = 'profession_liberale', + Salarie = 'salarie', +} diff --git a/mon-entreprise/source/pages/Stats/utils.tsx b/mon-entreprise/source/pages/Stats/utils.tsx new file mode 100644 index 000000000..b36cd0c5d --- /dev/null +++ b/mon-entreprise/source/pages/Stats/utils.tsx @@ -0,0 +1,66 @@ +import React from 'react' +import styled from 'styled-components' + +export const Indicators = styled.div` + display: flex; + flex-direction: row; + justify-content: space-around; + margin: 2rem 0; +` +type IndicatorProps = { + main?: React.ReactNode + subTitle?: React.ReactNode + footnote?: string + width?: string +} +export function Indicator({ main, subTitle, footnote, width }: IndicatorProps) { + return ( +
    + + {subTitle} + + + {main} + + {footnote && ( + + {footnote} + + )} +
    + ) +} +export function formatDay(date: string | Date) { + return new Date(date).toLocaleString('default', { + weekday: 'long', + day: 'numeric', + month: 'long', + }) +} +export function formatMonth(date: string | Date) { + return new Date(date).toLocaleString('default', { + month: 'long', + year: 'numeric', + }) +} From 1a7cb87ec08375eb6a8b80d25dd76c347b33d1ac Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 7 Jun 2021 13:51:00 +0200 Subject: [PATCH 198/319] :bug: Corrige le calcul de l'assiette des cotisations du conjoint collab fix #1608 --- modele-social/règles/dirigeant.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 00a8e2182..9500b4b4a 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -583,6 +583,7 @@ dirigeant . indépendant . conjoint collaborateur . assiette: - forfaitaire - revenu sans partage - revenu avec partage + dirigeant . indépendant . conjoint collaborateur . assiette . forfaitaire: titre: assiette forfaitaire description: | @@ -639,7 +640,8 @@ dirigeant . indépendant . conjoint collaborateur . cotisations . assiette: - si: assiette . pourcentage . moitié alors: taux: 50% - # sinon rien ne change + - sinon: oui + # sinon rien ne change dirigeant . indépendant . conjoint collaborateur . cotisations: titre: Cotisations conjoint collaborateur From 0187c3a3cda85dc9a8c905e887ca75cf9577a10b Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 7 Jun 2021 14:07:23 +0200 Subject: [PATCH 199/319] :white_check_mark: ajoute des tests de non regression pour le conjoint collab --- .../__snapshots__/simulations.jest.js.snap | 15 +++++++++++++++ .../regressions/simulations-indépendant.yaml | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index 005189775..a312fb376 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -295,6 +295,21 @@ exports[`calculate simulations-indépendant: activité 1`] = `"[29086,9086,20000 exports[`calculate simulations-indépendant: activité 2`] = `"[29102,9102,20000,20787,931,19069,0,29102,3575]"`; +exports[`calculate simulations-indépendant: conjoint collaborateur 1`] = `"[77179,27179,50000,52092,9633,40367,0,77179,7308]"`; + +exports[`calculate simulations-indépendant: conjoint collaborateur 2`] = `"[78241,28241,50000,52121,9642,40358,0,78241,4487]"`; + +exports[`calculate simulations-indépendant: conjoint collaborateur 3`] = `"[80761,30761,50000,52189,9663,40337,0,80761,4811]"`; + +exports[`calculate simulations-indépendant: conjoint collaborateur 4`] = `"[75298,25298,50000,52041,9618,40382,0,75298,3809]"`; + +exports[`calculate simulations-indépendant: conjoint collaborateur 5`] = `"[75297,25297,50000,52041,9618,40382,0,75297,3951]"`; + +exports[`calculate simulations-indépendant: conjoint collaborateur 6`] = ` +"[652233,152233,500000,517707,220771,279229,0,652233,4487] +Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA dépassée . notification" +`; + exports[`calculate simulations-indépendant: cotisations facultatives 1`] = `"[30000,13181,16819,17881,467,16352,0,30000,7359]"`; exports[`calculate simulations-indépendant: cotisations facultatives 2`] = `"[30000,14381,15619,17881,467,15152,0,30000,8559]"`; diff --git a/mon-entreprise/test/regressions/simulations-indépendant.yaml b/mon-entreprise/test/regressions/simulations-indépendant.yaml index 0810a526c..e977a9e88 100644 --- a/mon-entreprise/test/regressions/simulations-indépendant.yaml +++ b/mon-entreprise/test/regressions/simulations-indépendant.yaml @@ -44,6 +44,25 @@ impôt sur le revenu: impôt . méthode de calcul: "'taux personnalisé'" impôt . taux personnalisé: 10% +conjoint collaborateur: + - &conjoint-collab + dirigeant . rémunération . nette: 50000 €/an + dirigeant . indépendant . conjoint collaborateur: oui + - <<: *conjoint-collab + dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'" + - <<: *conjoint-collab + dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'" + dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: "'moitié'" + - <<: *conjoint-collab + dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'" + - <<: *conjoint-collab + dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu avec partage'" + dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: "'moitié'" + - <<: *conjoint-collab + dirigeant . rémunération . nette: 500000 €/an + dirigeant . indépendant . conjoint collaborateur . assiette: "'revenu sans partage'" + + cotisations facultatives: # Cas retraite: la cotisation Madelin est inferieure au plafond => le revenu net de # cotisations (résultat comptable) n'est pas affecté car l'assiette des From 93b76438b840ccb6c1bc2a42bb432996f9250c3c Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Mon, 7 Jun 2021 15:26:16 +0200 Subject: [PATCH 200/319] =?UTF-8?q?=F0=9F=94=A5=20Remove=20simulateurs.js?= =?UTF-8?q?=20file=20(miss=20from=206faf98964a025f318443f66d41489ceeb26ff3?= =?UTF-8?q?1a)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integration/mon-entreprise/simulateurs.js | 78 ------------------- 1 file changed, 78 deletions(-) delete mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js deleted file mode 100644 index 968731d52..000000000 --- a/mon-entreprise/cypress/integration/mon-entreprise/simulateurs.js +++ /dev/null @@ -1,78 +0,0 @@ -const fr = Cypress.env('language') === 'fr' -const inputSelector = 'input.currencyInput__input:not([name$="charges"])' -const chargeInputSelector = 'input.currencyInput__input[name$="charges"]' -describe('Simulateurs', function () { - if (!fr) { - return - } - ;[ - 'indépendant', - 'dirigeant-sasu', - 'auto-entrepreneur', - 'salarié', - 'profession-liberale', - 'profession-liberale/medecin', - 'profession-liberale/sage-femme', - 'profession-liberale/auxiliaire-medical', - 'profession-liberale/chirurgien-dentiste', - ].forEach((simulateur) => - describe(simulateur, () => { - before(() => cy.visit(encodeURI(`/simulateurs/${simulateur}`))) - it('should not crash', function () { - cy.get(inputSelector) - }) - - it('should display a result when entering a value in any of the currency input', () => { - cy.contains('Annuel').click() - if (['indépendant', 'profession-liberale'].includes(simulateur)) { - cy.get(chargeInputSelector).type(1000) - } - cy.get(inputSelector).each((testedInput, i) => { - cy.wrap(testedInput).type('{selectall}60111') - cy.wait(1500) - cy.contains('Cotisations') - cy.get(inputSelector).each(($input, j) => { - const val = $input.val().replace(/[\s,.]/g, '') - if (i != j) { - expect(val).not.to.be.eq('60111') - } - expect(val).to.match(/[1-9][\d]{3,6}$/) - }) - }) - }) - - it('should allow to change period', function () { - cy.contains('Annuel').click() - cy.wait(200) - cy.get(inputSelector).first().type('{selectall}12000') - if (['indépendant', 'profession-liberale'].includes(simulateur)) { - cy.get(chargeInputSelector).type('{selectall}6000') - } - cy.wait(800) - cy.contains('Mensuel').click() - cy.get(inputSelector) - .first() - .invoke('val') - .should('match', /1[\s]000/) - if (['indépendant', 'profession-liberale'].includes(simulateur)) { - cy.get(chargeInputSelector).first().invoke('val').should('eq', '500') - } - cy.contains('Annuel').click() - }) - - it('should allow to navigate to a documentation page', function () { - cy.get(inputSelector).first().type('{selectall}2000') - cy.wait(700) - cy.contains('Cotisations').click() - cy.location().should((loc) => { - expect(loc.pathname).to.match(/\/documentation\/.*\/cotisations/) - }) - }) - - it('should allow to go back to the simulation', function () { - cy.contains('← ').click() - cy.get(inputSelector).first().invoke('val').should('eq', '2 000') - }) - }) - ) -}) From ceed10146010887c5d688e18289ad2a0ca1af854 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Wed, 2 Jun 2021 18:16:57 +0200 Subject: [PATCH 201/319] =?UTF-8?q?=E2=9C=85=20Run=20external-integration?= =?UTF-8?q?=20tests=20in=20separate=20ghaction=20cron-style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create new Github Action * Install cypress packages from mon-entreprise dev dependencies --- .github/workflows/deploy.yaml | 14 +------- .../workflows/test-external-integrations.yaml | 33 +++++++++++++++++++ mon-entreprise/package.json | 1 + .../scripts/get-cypress-packages.js | 10 ++++++ package.json | 1 - yarn.lock | 6 ++-- 6 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 .github/workflows/test-external-integrations.yaml create mode 100644 mon-entreprise/scripts/get-cypress-packages.js diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index e5187a9d8..50e53eec3 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -173,7 +173,6 @@ jobs: integrationFolder: mon-entreprise baseUrl: ${{ needs.deploy-context.outputs.fr_url }} language: fr - test-external: ${{ needs.deploy-context.outputs.env-name == 'master' }} - site: en integrationFolder: mon-entreprise baseUrl: ${{ needs.deploy-context.outputs.en_url }} @@ -197,7 +196,7 @@ jobs: ~/.cache/Cypress node_modules key: cypress-cache-${{ runner.os }}-${{ hashFiles('package-lock.json') }} - - run: npm i cypress cypress-plugin-tab + - run: node mon-entreprise/scripts/get-cypress-packages.js | xargs npm i - name: Test mon-entreprise uses: cypress-io/github-action@v2 with: @@ -209,14 +208,3 @@ jobs: env: language=${{ matrix.language }} env: COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }} - - - name: Test external integration - if: matrix.test-external - uses: cypress-io/github-action@v2 - with: - install: false - working-directory: mon-entreprise - record: true - tag: external-integration - config: integrationFolder=cypress/integration/external,baseUrl=${{ matrix.baseUrl }} - \ No newline at end of file diff --git a/.github/workflows/test-external-integrations.yaml b/.github/workflows/test-external-integrations.yaml new file mode 100644 index 000000000..74b11ea84 --- /dev/null +++ b/.github/workflows/test-external-integrations.yaml @@ -0,0 +1,33 @@ +name: Test external integrations +on: + schedule: + - cron: '47 3,15 * * *' + +jobs: + test-external-integrations: + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} + runs-on: ubuntu-16.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + + - uses: actions/cache@v2 + # Custom cache as we do not care about installing all the other dependancies + with: + path: | + ~/.cache/Cypress + node_modules + key: cypress-cache-${{ runner.os }}-${{ hashFiles('package-lock.json') }} + + - run: node mon-entreprise/scripts/get-cypress-packages.js | xargs npm i + + - name: Test external integration + uses: cypress-io/github-action@v2 + with: + install: false + working-directory: mon-entreprise + record: true + tag: external-integration + config: integrationFolder=cypress/integration/external,baseUrl=https://mon-entreprise.fr diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index 3c830f513..65ea048e0 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -43,6 +43,7 @@ "autoprefixer": "^9.7.6", "babel-plugin-styled-components": "^1.10.7", "copy-webpack-plugin": "^4.5.2", + "cypress": "^7.4.0", "cypress-plugin-tab": "^1.0.5", "eslint-plugin-react": "^7.12.4", "html-webpack-plugin": "^3.2.0", diff --git a/mon-entreprise/scripts/get-cypress-packages.js b/mon-entreprise/scripts/get-cypress-packages.js new file mode 100644 index 000000000..c1b4d3f17 --- /dev/null +++ b/mon-entreprise/scripts/get-cypress-packages.js @@ -0,0 +1,10 @@ +const fs = require('fs') + +const packages = JSON.parse(fs.readFileSync(`${__dirname}/../package.json`)) + +console.log('cypress@' + packages.devDependencies.cypress) +for (const key of Object.keys(packages.devDependencies).filter( + (k) => k !== 'cypress' && k.startsWith('cypress') +)) { + console.log(key + '@' + packages.devDependencies[key]) +} diff --git a/package.json b/package.json index aafd1f36a..0f5f8aeff 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,6 @@ }, "optionalDependencies": { "bundlesize": "^0.18.0", - "cypress": "^7.4.0", "prerender-spa-plugin": "^3.4.0" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index 359986f7e..67c7dac59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2378,9 +2378,9 @@ integrity sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA== "@types/node@^14.14.31": - version "14.17.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.1.tgz#5e07e0cb2ff793aa7a1b41deae76221e6166049f" - integrity sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw== + version "14.17.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.2.tgz#1e94476db57ec93a372c7f7d29aa5707cfb92339" + integrity sha512-sld7b/xmFum66AAKuz/rp/CUO8+98fMpyQ3SBfzzBNGMd/1iHBTAg9oyAvcYlAj46bpc74r91jSw2iFdnx29nw== "@types/normalize-package-data@^2.4.0": version "2.4.0" From 3dd7842b0b4ab96d1898ebc8f522b405b162134a Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Sat, 5 Jun 2021 21:50:52 +0200 Subject: [PATCH 202/319] =?UTF-8?q?=E2=9C=85=20Run=20e2e=20tests=20with=20?= =?UTF-8?q?external=20API=20calls=20in=20cron?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test-external-integrations.yaml | 12 ++++++++++++ .../cypress/integration/mon-entreprise/gérer.js | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-external-integrations.yaml b/.github/workflows/test-external-integrations.yaml index 74b11ea84..73fbfdfc1 100644 --- a/.github/workflows/test-external-integrations.yaml +++ b/.github/workflows/test-external-integrations.yaml @@ -31,3 +31,15 @@ jobs: record: true tag: external-integration config: integrationFolder=cypress/integration/external,baseUrl=https://mon-entreprise.fr + + - name: e2e tests with external API calls + uses: cypress-io/github-action@v2 + with: + install: false + working-directory: mon-entreprise + # List here all the specs that are making external API calls: + spec: cypress/integration/mon-entreprise/gérer.js + record: true + tag: external-integration + config: integrationFolder=cypress/integration/mon-entreprise,baseUrl=https://mon-entreprise.fr + env: record_http= # prevent stubbing diff --git a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js index 74ee277cb..b8601b74f 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/gérer.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/gérer.js @@ -44,7 +44,9 @@ const waitResponses = (responses) => { } } -describe('Manage page test', function () { +describe(`Manage page test (${ + writeFixtures ? 'record mode' : 'stubbed mode' +})`, function () { let responses = {} const hostnamesToRecord = ['entreprise.data.gouv.fr', 'geo.api.gouv.fr'] beforeEach(() => { From f420974da3fceddb31f23c0a61c6c83eb78bfd39 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 8 Jun 2021 09:26:17 +0200 Subject: [PATCH 203/319] =?UTF-8?q?:bug:=20Ajoute=20le=20pr=C3=A9l=C3=A8ve?= =?UTF-8?q?ment=20lib=C3=A9ratoire=20de=20l'IR=20au=20revenu=20apr=C3=A8s?= =?UTF-8?q?=20imp=C3=B4t=20pour=20les=20auto-entrepreneurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix #1613 --- modele-social/règles/dirigeant.yaml | 11 +++++++---- .../source/pages/Simulateurs/AutoEntrepreneur.tsx | 6 +++++- .../__snapshots__/simulations.jest.js.snap | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 9500b4b4a..816a18078 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -58,10 +58,13 @@ dirigeant . rémunération . imposable: alors: auto-entrepreneur . impôt . revenu imposable dirigeant . rémunération . impôt: - produit: - assiette: imposable - taux: impôt . taux d'imposition - + titre: impôt sur le revenu + somme: + - produit: + assiette: imposable + taux: impôt . taux d'imposition + - auto-entrepreneur . impôt . versement libératoire . montant + arrondi: oui dirigeant . rémunération . nette après impôt: titre: Revenu après impôt diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index a6e1e4ed6..45c89ff81 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -104,7 +104,11 @@ export default function AutoEntrepreneur() { /> - + diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap index a312fb376..2c746c8a7 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.js.snap @@ -223,7 +223,7 @@ exports[`calculate simulations-auto-entrepreneur: aides 2`] = ` Notifications affichées : dirigeant . auto-entrepreneur . notification calcul ACRE annuel" `; -exports[`calculate simulations-auto-entrepreneur: impôt sur le revenu 1`] = `"[32092,591,25000,0,25000]"`; +exports[`calculate simulations-auto-entrepreneur: impôt sur le revenu 1`] = `"[32092,591,25000,706,24294]"`; exports[`calculate simulations-auto-entrepreneur: échelle de revenus 1`] = `"[574,6,500,0,500]"`; From fe10d05fc9d436685fc4a9d89550b7b3cc6cf140 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 8 Jun 2021 09:42:51 +0200 Subject: [PATCH 204/319] =?UTF-8?q?:bug:=20enl=C3=A8ve=20l'affichage=20des?= =?UTF-8?q?=20questions=20initial=20lorsque=20la=20situation=20est=20pr?= =?UTF-8?q?=C3=A9remplie=20avec=20des=20donn=C3=A9es=20de=20l'entreprise?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix #1611 --- .../source/components/utils/EngineContext.tsx | 2 +- .../source/selectors/simulationSelectors.ts | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/mon-entreprise/source/components/utils/EngineContext.tsx b/mon-entreprise/source/components/utils/EngineContext.tsx index 7891de9cb..d829b710e 100644 --- a/mon-entreprise/source/components/utils/EngineContext.tsx +++ b/mon-entreprise/source/components/utils/EngineContext.tsx @@ -1,6 +1,6 @@ +import { DottedName } from 'modele-social' import Engine, { Rule } from 'publicodes' import React, { createContext, useContext } from 'react' -import { DottedName } from 'modele-social' import i18n from '../../locales/i18n' export type Rules = Record diff --git a/mon-entreprise/source/selectors/simulationSelectors.ts b/mon-entreprise/source/selectors/simulationSelectors.ts index 1081c6b89..685998545 100644 --- a/mon-entreprise/source/selectors/simulationSelectors.ts +++ b/mon-entreprise/source/selectors/simulationSelectors.ts @@ -23,15 +23,20 @@ const emptySituation: Partial< export const situationSelector = (state: RootState) => state.simulation?.situation ?? emptySituation +export const initialSituationSelector = (state: RootState) => + state.simulation?.initialSituation ?? emptySituation + export const configSituationSelector = (state: RootState) => configSelector(state).situation ?? emptySituation export const firstStepCompletedSelector = createSelector( - [situationSelector, configSituationSelector], - (situation, baseSituation) => { + [situationSelector, configSituationSelector, initialSituationSelector], + (situation, baseSituation, initialSituation) => { return ( Object.keys(situation).filter( - (dottedName) => !Object.keys(baseSituation).includes(dottedName) + (dottedName) => + !Object.keys(baseSituation).includes(dottedName) && + !Object.keys(initialSituation).includes(dottedName) ).length > 0 ) } From 011623b4bb49c8f10501417bd065badefa81463a Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 8 Jun 2021 09:49:32 +0200 Subject: [PATCH 205/319] :alien: ajoute les traductions manquantes --- mon-entreprise/source/locales/rules-en.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index fcb6429d3..a43546cb9 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -7167,8 +7167,8 @@ dirigeant . rémunération . imposable: titre.en: '[automatic] taxable income' titre.fr: revenu imposable dirigeant . rémunération . impôt: - titre.en: '[automatic] tax' - titre.fr: impôt + titre.en: '[automatic] income tax' + titre.fr: impôt sur le revenu dirigeant . rémunération . nette: question.en: '[automatic] What is your net income?' question.fr: Quelle est votre revenu net ? From f79d209c5ab99465a72f39c6ca1bda364324c281 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Mon, 7 Jun 2021 18:45:48 +0200 Subject: [PATCH 206/319] =?UTF-8?q?=E2=9C=85=20Move=20smarttag.js=20in=20s?= =?UTF-8?q?tatic=20folder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prevents it from being loaded when loading Tracker.ts in node --- mon-entreprise/index.html | 1 + mon-entreprise/source/ATInternetTracking/Tracker.ts | 2 -- .../source/{ATInternetTracking => static}/.eslintrc.yaml | 0 .../source/{ATInternetTracking => static/scripts}/smarttag.js | 0 4 files changed, 1 insertion(+), 2 deletions(-) rename mon-entreprise/source/{ATInternetTracking => static}/.eslintrc.yaml (100%) rename mon-entreprise/source/{ATInternetTracking => static/scripts}/smarttag.js (100%) diff --git a/mon-entreprise/index.html b/mon-entreprise/index.html index 4606eccde..2c2586f7b 100644 --- a/mon-entreprise/index.html +++ b/mon-entreprise/index.html @@ -278,5 +278,6 @@ <% for (var chunk in htmlWebpackPlugin.files.chunks) { %> <% } %> + diff --git a/mon-entreprise/source/ATInternetTracking/Tracker.ts b/mon-entreprise/source/ATInternetTracking/Tracker.ts index b9f42369d..a5954c1ce 100644 --- a/mon-entreprise/source/ATInternetTracking/Tracker.ts +++ b/mon-entreprise/source/ATInternetTracking/Tracker.ts @@ -1,5 +1,3 @@ -import './smarttag.js' - // Ci-dessous les indicateurs personnalisés de site et de page // https://developers.atinternet-solutions.com/javascript-fr/contenus-javascript-fr/indicateurs-de-site-et-de-page-javascript-fr/ export const INDICATOR = { diff --git a/mon-entreprise/source/ATInternetTracking/.eslintrc.yaml b/mon-entreprise/source/static/.eslintrc.yaml similarity index 100% rename from mon-entreprise/source/ATInternetTracking/.eslintrc.yaml rename to mon-entreprise/source/static/.eslintrc.yaml diff --git a/mon-entreprise/source/ATInternetTracking/smarttag.js b/mon-entreprise/source/static/scripts/smarttag.js similarity index 100% rename from mon-entreprise/source/ATInternetTracking/smarttag.js rename to mon-entreprise/source/static/scripts/smarttag.js From 82e9f18b0e8dad5defd115eee08aa9d47df9682b Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Tue, 8 Jun 2021 10:32:41 +0200 Subject: [PATCH 207/319] =?UTF-8?q?:bug::art:=20R=C3=A9pare=20le=20flicker?= =?UTF-8?q?ing=20au=20premier=20rendu=20des=20simulateurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/components/SimulationGoals.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mon-entreprise/source/components/SimulationGoals.tsx b/mon-entreprise/source/components/SimulationGoals.tsx index 3d4b475ba..871f4f602 100644 --- a/mon-entreprise/source/components/SimulationGoals.tsx +++ b/mon-entreprise/source/components/SimulationGoals.tsx @@ -8,6 +8,7 @@ import { useCallback, useContext, useEffect, + useMemo, useState, } from 'react' import { useDispatch, useSelector } from 'react-redux' @@ -32,7 +33,10 @@ export function SimulationGoals({ className = '', children, }: SimulationGoalsProps) { - const initialRender = useInitialRender() + const [initialRender, setInitialRender] = useState(true) + useEffect(() => { + setInitialRender(false) + }, []) return ( @@ -49,11 +53,9 @@ export function SimulationGoals({ } function useInitialRender() { - const [initialRender, setInitialRender] = useState(true) - useEffect(() => { - setInitialRender(false) - }, []) - return initialRender + const initialRender = useContext(InitialRenderContext) + const unChangedInitialRender = useMemo(() => initialRender, []) + return unChangedInitialRender } type SimulationGoalProps = { @@ -90,7 +92,7 @@ export function SimulationGoal({ ...(!boolean ? { unité: currentUnit, arrondi: 'oui' } : {}), }) const rule = engine.getRule(dottedName) - const initialRender = useContext(InitialRenderContext) + const initialRender = useInitialRender() const [isFocused, setFocused] = useState(false) const isFirstStepCompleted = useSelector(firstStepCompletedSelector) const onChange = useCallback( From 4eb158ce461f618ff64ede78ae30e15627ca75e6 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 8 Jun 2021 14:30:25 +0200 Subject: [PATCH 208/319] =?UTF-8?q?Revert=20"=E2=9C=85=20Move=20smarttag.j?= =?UTF-8?q?s=20in=20static=20folder"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f79d209c5ab99465a72f39c6ca1bda364324c281. --- mon-entreprise/index.html | 1 - .../source/{static => ATInternetTracking}/.eslintrc.yaml | 0 mon-entreprise/source/ATInternetTracking/Tracker.ts | 2 ++ .../source/{static/scripts => ATInternetTracking}/smarttag.js | 0 4 files changed, 2 insertions(+), 1 deletion(-) rename mon-entreprise/source/{static => ATInternetTracking}/.eslintrc.yaml (100%) rename mon-entreprise/source/{static/scripts => ATInternetTracking}/smarttag.js (100%) diff --git a/mon-entreprise/index.html b/mon-entreprise/index.html index 2c2586f7b..4606eccde 100644 --- a/mon-entreprise/index.html +++ b/mon-entreprise/index.html @@ -278,6 +278,5 @@ <% for (var chunk in htmlWebpackPlugin.files.chunks) { %> <% } %> - diff --git a/mon-entreprise/source/static/.eslintrc.yaml b/mon-entreprise/source/ATInternetTracking/.eslintrc.yaml similarity index 100% rename from mon-entreprise/source/static/.eslintrc.yaml rename to mon-entreprise/source/ATInternetTracking/.eslintrc.yaml diff --git a/mon-entreprise/source/ATInternetTracking/Tracker.ts b/mon-entreprise/source/ATInternetTracking/Tracker.ts index a5954c1ce..b9f42369d 100644 --- a/mon-entreprise/source/ATInternetTracking/Tracker.ts +++ b/mon-entreprise/source/ATInternetTracking/Tracker.ts @@ -1,3 +1,5 @@ +import './smarttag.js' + // Ci-dessous les indicateurs personnalisés de site et de page // https://developers.atinternet-solutions.com/javascript-fr/contenus-javascript-fr/indicateurs-de-site-et-de-page-javascript-fr/ export const INDICATOR = { diff --git a/mon-entreprise/source/static/scripts/smarttag.js b/mon-entreprise/source/ATInternetTracking/smarttag.js similarity index 100% rename from mon-entreprise/source/static/scripts/smarttag.js rename to mon-entreprise/source/ATInternetTracking/smarttag.js From 9ebd0cb703d95c8e347c858984f9e758c4f095ce Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 26 May 2021 15:11:14 +0200 Subject: [PATCH 209/319] =?UTF-8?q?:bug:=20R=C3=A9pare=20la=20gestion=20de?= =?UTF-8?q?=20l'activit=C3=A9=20mixte=20chez=20les=20auto-entrepreneur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix #1471 --- modele-social/règles/dirigeant.yaml | 1 + .../règles/entreprise-établissement.yaml | 27 +++++++++---------- .../pages/Simulateurs/AutoEntrepreneur.tsx | 6 +++-- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 816a18078..829287751 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -382,6 +382,7 @@ dirigeant . auto-entrepreneur . impôt . revenu imposable: valeur: entreprise . chiffre d'affaires abattement: + applicable si: entreprise . imposition . IR . micro-fiscal produit: composantes: - assiette: entreprise . chiffre d'affaires . vente restauration hébergement diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 6589c39ba..582324cbe 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -831,23 +831,20 @@ entreprise . activité . mixte . proportions: unité: '%' somme: - nom: service BIC - par défaut: - variations: - - si: activité = 'libérale' - alors: 0 - - sinon: 50% + variations: + - si: activité = 'libérale' + alors: 0 + - sinon: 50% - nom: service BNC - par défaut: - variations: - - si: activité = 'libérale' - alors: 2 / 3 - - sinon: 0 + variations: + - si: activité = 'libérale' + alors: 2 / 3 + - sinon: 0 - nom: vente restauration hébergement - par défaut: - variations: - - si: activité = 'libérale' - alors: 1 / 3 - - sinon: 50% + variations: + - si: activité = 'libérale' + alors: 1 / 3 + - sinon: 50% entreprise . activité . libérale réglementée: diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index 45c89ff81..97637e4c4 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -31,7 +31,9 @@ function useAdjustProportions(): () => void { const nouveauCA = serializeEvaluation( engine.evaluate({ somme: Object.values(proportions) - .map((name) => serializeEvaluation(engine.evaluate(name))) + .map((chiffreAffaire) => + serializeEvaluation(engine.evaluate(chiffreAffaire)) + ) .filter(Boolean), }) ) @@ -52,7 +54,7 @@ function useAdjustProportions(): () => void { return { ...acc, [proportionName]: newProportion } }, - { "entreprise . chiffre d'affaires": nouveauCA } + { "dirigeant . auto-entrepreneur . chiffre d'affaires": nouveauCA } ) dispatch(batchUpdateSituation(situation)) }, [engine, dispatch]) From acbfb58a3a4d8ea207f880a18f864cc9a431bd16 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 26 May 2021 11:06:58 +0200 Subject: [PATCH 210/319] Ajoute un simulateur pour les dirigeant d'entreprise individuelle --- .../source/components/ui/Typography.css | 1 + .../source/pages/Simulateurs/Home.tsx | 1 + .../{ISSimulation.tsx => ImpôtSociété.tsx} | 0 ...épendantSimulation.tsx => Indépendant.tsx} | 12 ++ .../{SalariéSimulation.tsx => Salarié.tsx} | 0 .../source/pages/Simulateurs/metadata.tsx | 105 +++++++++++++++++- mon-entreprise/source/sitePaths.ts | 2 + 7 files changed, 118 insertions(+), 3 deletions(-) rename mon-entreprise/source/pages/Simulateurs/{ISSimulation.tsx => ImpôtSociété.tsx} (100%) rename mon-entreprise/source/pages/Simulateurs/{IndépendantSimulation.tsx => Indépendant.tsx} (93%) rename mon-entreprise/source/pages/Simulateurs/{SalariéSimulation.tsx => Salarié.tsx} (100%) diff --git a/mon-entreprise/source/components/ui/Typography.css b/mon-entreprise/source/components/ui/Typography.css index f1c2cba1a..0b576cf60 100644 --- a/mon-entreprise/source/components/ui/Typography.css +++ b/mon-entreprise/source/components/ui/Typography.css @@ -43,6 +43,7 @@ h2:not(.h), margin-top: 2rem; margin-bottom: 1rem; font-size: 1.4rem; + line-height: 2.1rem; } h3:not(.h), .ui__.h.h3 { diff --git a/mon-entreprise/source/pages/Simulateurs/Home.tsx b/mon-entreprise/source/pages/Simulateurs/Home.tsx index 7225c795d..e27fcae8a 100644 --- a/mon-entreprise/source/pages/Simulateurs/Home.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Home.tsx @@ -50,6 +50,7 @@ export default function Simulateurs() { + diff --git a/mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx similarity index 100% rename from mon-entreprise/source/pages/Simulateurs/ISSimulation.tsx rename to mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx diff --git a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx similarity index 93% rename from mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx rename to mon-entreprise/source/pages/Simulateurs/Indépendant.tsx index 406d78e97..c7ef7e371 100644 --- a/mon-entreprise/source/pages/Simulateurs/IndépendantSimulation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx @@ -26,6 +26,18 @@ export function IndépendantPLSimulation() { ) } +export function EntrepriseIndividuelle() { + return ( + <> + + }> + + + + + ) +} + export default function IndépendantSimulation() { const sitePaths = useContext(SitePathsContext) return ( diff --git a/mon-entreprise/source/pages/Simulateurs/SalariéSimulation.tsx b/mon-entreprise/source/pages/Simulateurs/Salarié.tsx similarity index 100% rename from mon-entreprise/source/pages/Simulateurs/SalariéSimulation.tsx rename to mon-entreprise/source/pages/Simulateurs/Salarié.tsx diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 5db9ca817..4117b270f 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -28,12 +28,13 @@ import logoFranceRelance from './images/logo-france-relance.svg' import RémunérationSASUPreview from './images/RémunérationSASUPreview.png' import salaireBrutNetPreviewEN from './images/SalaireBrutNetPreviewEN.png' import salaireBrutNetPreviewFR from './images/SalaireBrutNetPreviewFR.png' +import ISSimulation from './ImpôtSociété' import IndépendantSimulation, { + EntrepriseIndividuelle, IndépendantPLSimulation, -} from './IndépendantSimulation' -import ISSimulation from './ISSimulation' +} from './Indépendant' import PAMCHome from './PAMCHome' -import SalariéSimulation from './SalariéSimulation' +import SalariéSimulation from './Salarié' import SchemeComparaisonPage from './SchemeComparaison' import ÉconomieCollaborative from './ÉconomieCollaborative' @@ -45,6 +46,7 @@ const simulateurs = [ 'chômage-partiel', 'artiste-auteur', 'comparaison-statuts', + 'entreprise-individuelle', 'économie-collaborative', 'aide-déclaration-indépendant', 'demande-mobilité', @@ -207,6 +209,103 @@ export function getSimulatorsData({ ), nextSteps: ['chômage-partiel', 'aides-embauche'], }, + 'entreprise-individuelle': { + tracking: 'entreprise_individuelle', + config: { + ...indépendantConfig, + situation: { + ...indépendantConfig.situation, + 'entreprise . imposition': "'IR'", + }, + }, + icône: '', + iframePath: 'simulateur-EI', + meta: { + description: t( + 'pages.simulateurs.EI.meta.description', + "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts" + ), + ogDescription: t( + 'pages.simulateurs.EI.meta.ogDescription', + "Grâce au simulateur de revenu auto-entrepreneur développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu." + ), + ogImage: AutoEntrepreneurPreview, + ogTitle: t( + 'pages.simulateurs.EI.meta.ogTitle', + 'Entreprise individuelle (EI) : calculez rapidement votre revenu net à partir du CA et vice-versa' + ), + title: t( + 'pages.simulateurs.EI.meta.titre', + 'Entreprise individuelle (EI) : simulateur de revenus' + ), + }, + component: EntrepriseIndividuelle, + path: sitePaths.simulateurs['entreprise-individuelle'], + shortName: t('pages.simulateurs.EI.shortname', 'Entreprise individuelle'), + title: t( + 'pages.simulateurs.EI.title', + 'Simulateur de revenus pour entreprise individuelle (EI)' + ), + seoExplanations: ( + +

    + Comment calculer le revenu net d'un dirigeant d'entreprise + individuelle (EI) ? +

    +

    + Un dirigeant d'entreprise individuelle doit payer des cotisations et + contributions sociales à l'administration. Ces cotisations servent + au financement de la sécurité sociale, et ouvrent des droits + notamment pour la retraite et pour l'assurance maladie. Elles + permettent également de financer la formation professionnelle. +

    +

    + {' '} + + Voir le détail du calcul des cotisations + +

    +

    + Il ne faut pas oublier de retrancher toutes les dépenses effectuées + dans le cadre de l'activité professionnelle (équipements, matières + premières, local, transport). Ces dernières sont déductibles du + résultat de l'entreprise, cela veut dire que vous ne payerez pas + d'impôt ou de cotisations sur leur montant (sauf si vous avez opté + pour l'option micro-fiscal). +

    +

    + La formule de calcul complète est donc : +

    + + Revenu net = Chiffres d'affaires − Dépenses professionnelles - + Cotisations sociales + +
    +

    +

    + Comment calculer les cotisations sociales d'une entreprise + individuelle ? +

    +

    + Le dirigeant d'une entreprise individuelle paye des cotisations + sociales, proportionnelle au{' '} + de + l'entreprise. Leur montant varie en fonction du type d'activité + (profession libérale, artisan, commerçants, etc), où des éventuelles + exonérations accordées (ACRE, ZFU, RSA, etc.). Pour connaître leur + montant, vous pouvez utiliser ce simulateur, et affiner le +

    +

    + {' '} + Comme le résultat d'une entreprise n'est connu qu'à la fin de + l'exercice comptable, le dirigeant paye des cotisations + provisionnelles qui seront ensuite régularisée une fois le revenu + réel déclaré, l'année suivante. +

    +
    + ), + nextSteps: ['indépendant', 'comparaison-statuts'], + }, 'auto-entrepreneur': { tracking: 'auto_entrepreneur', config: autoEntrepreneurConfig, diff --git a/mon-entreprise/source/sitePaths.ts b/mon-entreprise/source/sitePaths.ts index fab64fcb4..891a96c41 100644 --- a/mon-entreprise/source/sitePaths.ts +++ b/mon-entreprise/source/sitePaths.ts @@ -55,6 +55,7 @@ const sitePathsFr = { comparaison: '/comparaison-régimes-sociaux', pamc: '/pamc', salarié: '/salaire-brut-net', + 'entreprise-individuelle': '/entreprise-individuelle', 'artiste-auteur': '/artiste-auteur', 'profession-libérale': { index: '/profession-liberale', @@ -114,6 +115,7 @@ const sitePathsEn = { index: '/calculators', SASU: '/sasu-chairman', indépendant: '/independant', + 'entreprise-individuelle': '/sole-proprietorship', 'auto-entrepreneur': '/auto-entrepreneur', pamc: '/pamc', comparaison: '/social-scheme-comparaison', From ea24a47a3fdacc42b3c52fc951715627d709dc7d Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 26 May 2021 16:21:46 +0200 Subject: [PATCH 211/319] =?UTF-8?q?Ajoute=20l'activit=C3=A9=20mixte=20aux?= =?UTF-8?q?=20simulateurs=20ind=C3=A9pendants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Factorise la logique de la saisie des CA dans un nouveau composant --- .../règles/entreprise-établissement.yaml | 5 +- .../ChiffreAffairesActivitéMixte.tsx | 148 ++++++++++++++++++ .../pages/Simulateurs/AutoEntrepreneur.tsx | 136 +--------------- .../source/pages/Simulateurs/Indépendant.tsx | 16 +- .../configs/auto-entrepreneur.yaml | 4 +- 5 files changed, 167 insertions(+), 142 deletions(-) create mode 100644 mon-entreprise/source/components/ChiffreAffairesActivitéMixte.tsx diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index 582324cbe..77aad9492 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -833,18 +833,19 @@ entreprise . activité . mixte . proportions: - nom: service BIC variations: - si: activité = 'libérale' - alors: 0 + alors: 0% - sinon: 50% - nom: service BNC variations: - si: activité = 'libérale' alors: 2 / 3 - - sinon: 0 + - sinon: 0% - nom: vente restauration hébergement variations: - si: activité = 'libérale' alors: 1 / 3 - sinon: 50% + note: Il appartient à l'utilisateur de bien vérifier que la somme des trois pourcentages renseignés vaut 100%. entreprise . activité . libérale réglementée: diff --git a/mon-entreprise/source/components/ChiffreAffairesActivitéMixte.tsx b/mon-entreprise/source/components/ChiffreAffairesActivitéMixte.tsx new file mode 100644 index 000000000..6faa6dffb --- /dev/null +++ b/mon-entreprise/source/components/ChiffreAffairesActivitéMixte.tsx @@ -0,0 +1,148 @@ +import { batchUpdateSituation } from 'Actions/actions' +import { DottedName } from 'modele-social' +import { serializeEvaluation } from 'publicodes' +import { useCallback } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { situationSelector } from 'Selectors/simulationSelectors' +import { Explicable } from './conversation/Explicable' +import { Condition } from './EngineValue' +import { SimulationGoal } from './SimulationGoals' +import { useEngine } from './utils/EngineContext' +import { Markdown } from './utils/markdown' + +const proportions = { + 'entreprise . activité . mixte . proportions . service BIC': + "entreprise . chiffre d'affaires . service BIC", + 'entreprise . activité . mixte . proportions . service BNC': + "entreprise . chiffre d'affaires . service BNC", + 'entreprise . activité . mixte . proportions . vente restauration hébergement': + "entreprise . chiffre d'affaires . vente restauration hébergement", +} as const + +export default function ChiffreAffairesActivitéMixte({ + dottedName, +}: { + dottedName: DottedName +}) { + const adjustProportions = useAdjustProportions(dottedName) + const dispatch = useDispatch() + const clearChiffreAffaireMixte = useCallback(() => { + dispatch( + batchUpdateSituation( + Object.values(proportions).reduce( + (acc, chiffreAffaires) => ({ ...acc, [chiffreAffaires]: undefined }), + {} + ) + ) + ) + }, [dispatch]) + return ( + <> + + + + +
  • +
      + {Object.values(proportions).map((chiffreAffaires) => ( + + ))} +
    +
  • +
    + + ) +} +export function useAdjustProportions(CADottedName: DottedName): () => void { + const engine = useEngine() + const dispatch = useDispatch() + + return useCallback(() => { + const nouveauCA = serializeEvaluation( + engine.evaluate({ + somme: Object.values(proportions) + .map((chiffreAffaire) => + serializeEvaluation(engine.evaluate(chiffreAffaire)) + ) + .filter(Boolean), + }) + ) + if (nouveauCA === '0€/an') { + return // Avoid division by 0 + } + const situation = Object.entries(proportions).reduce( + (acc, [proportionName, valueName]) => { + const value = serializeEvaluation( + engine.evaluate({ valeur: valueName, 'par défaut': '0€/an' }) + ) + const newProportion = serializeEvaluation( + engine.evaluate({ + valeur: `${value} / ${nouveauCA}`, + unité: '%', + }) + ) + + return { ...acc, [proportionName]: newProportion } + }, + { [CADottedName]: nouveauCA } + ) + dispatch(batchUpdateSituation(situation)) + }, [engine, dispatch]) +} + +function ActivitéMixte() { + const dispatch = useDispatch() + const situation = useSelector(situationSelector) + const rule = useEngine().getRule('entreprise . activité . mixte') + const defaultChecked = + useEngine().evaluate('entreprise . activité . mixte').nodeValue === true + + const onMixteChecked = useCallback( + (checked: boolean) => { + dispatch( + batchUpdateSituation( + Object.values(proportions).reduce( + (acc, dottedName) => ({ ...acc, [dottedName]: undefined }), + { 'entreprise . activité . mixte': checked ? 'oui' : 'non' } + ) + ) + ) + }, + [dispatch, situation] + ) + return ( +
  • + +
  • + ) +} diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index 97637e4c4..2b553f0f4 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -1,104 +1,22 @@ -import { batchUpdateSituation } from 'Actions/actions' -import { Explicable } from 'Components/conversation/Explicable' -import { Condition, WhenAlreadyDefined } from 'Components/EngineValue' +import ChiffreAffairesActivitéMixte from 'Components/ChiffreAffairesActivitéMixte' +import { WhenAlreadyDefined } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' import Simulation from 'Components/Simulation' import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import StackedBarChart from 'Components/StackedBarChart' import { ThemeColorsContext } from 'Components/utils/colors' -import { useEngine } from 'Components/utils/EngineContext' -import { Markdown } from 'Components/utils/markdown' -import { serializeEvaluation } from 'publicodes' -import { default as React, useCallback, useContext } from 'react' +import { default as React, useContext } from 'react' import { Trans, useTranslation } from 'react-i18next' -import { useDispatch, useSelector } from 'react-redux' -import { situationSelector } from 'Selectors/simulationSelectors' - -const proportions = { - 'entreprise . activité . mixte . proportions . service BIC': - "entreprise . chiffre d'affaires . service BIC", - 'entreprise . activité . mixte . proportions . service BNC': - "entreprise . chiffre d'affaires . service BNC", - 'entreprise . activité . mixte . proportions . vente restauration hébergement': - "entreprise . chiffre d'affaires . vente restauration hébergement", -} as const -function useAdjustProportions(): () => void { - const engine = useEngine() - const dispatch = useDispatch() - - return useCallback(() => { - const nouveauCA = serializeEvaluation( - engine.evaluate({ - somme: Object.values(proportions) - .map((chiffreAffaire) => - serializeEvaluation(engine.evaluate(chiffreAffaire)) - ) - .filter(Boolean), - }) - ) - if (nouveauCA === '0€/an') { - return // Avoid division by 0 - } - const situation = Object.entries(proportions).reduce( - (acc, [proportionName, valueName]) => { - const value = serializeEvaluation( - engine.evaluate({ valeur: valueName, 'par défaut': '0€/an' }) - ) - const newProportion = serializeEvaluation( - engine.evaluate({ - valeur: `${value} / ${nouveauCA}`, - unité: '%', - }) - ) - - return { ...acc, [proportionName]: newProportion } - }, - { "dirigeant . auto-entrepreneur . chiffre d'affaires": nouveauCA } - ) - dispatch(batchUpdateSituation(situation)) - }, [engine, dispatch]) -} export default function AutoEntrepreneur() { - const adjustProportions = useAdjustProportions() - const activitéMixte = - useEngine().evaluate('entreprise . activité . mixte').nodeValue === true - return ( <> }> - - - -
  • -
      - - - -
    -
  • -
    - + { - dispatch( - batchUpdateSituation( - Object.values(proportions).reduce( - (acc, dottedName) => ({ ...acc, [dottedName]: undefined }), - { 'entreprise . activité . mixte': checked ? 'oui' : 'non' } - ) - ) - ) - }, - [dispatch, situation] - ) - return ( -
  • - -
  • - ) -} - function Explanation() { const { t } = useTranslation() const { palettes } = useContext(ThemeColorsContext) diff --git a/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx index c7ef7e371..144edd79d 100644 --- a/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx @@ -1,5 +1,6 @@ import { updateSituation } from 'Actions/actions' import Banner from 'Components/Banner' +import ChiffreAffairesActivitéMixte from 'Components/ChiffreAffairesActivitéMixte' import { Condition, WhenAlreadyDefined } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' @@ -78,11 +79,16 @@ function IndépendantSimulationGoals() { return ( - + + + + + + Date: Fri, 28 May 2021 10:18:24 +0200 Subject: [PATCH 212/319] =?UTF-8?q?:hammer:=20Ajoute=20une=20r=C3=A9f?= =?UTF-8?q?=C3=A9rence=20vers=20le=20texte=20de=20loi=20pour=20les=20trime?= =?UTF-8?q?stres=20valid=C3=A9s=20de=20retraite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/protection-sociale.yaml | 2 +- mon-entreprise/source/locales/rules-en.yaml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modele-social/règles/protection-sociale.yaml b/modele-social/règles/protection-sociale.yaml index db4694747..0f0e7258a 100644 --- a/modele-social/règles/protection-sociale.yaml +++ b/modele-social/règles/protection-sociale.yaml @@ -121,7 +121,7 @@ protection sociale . retraite . trimestres validés . barème trimestres génér - montant: 4 références: cnav.fr: https://www.legislation.cnav.fr/Pages/bareme.aspx?Nom=salaire_validant_un_trimestre_montant_bar - + Article R351-9 du code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000028751530/2014-03-21 protection sociale . retraite . trimestres validés . trimestres auto-entrepreneur: applicable si: dirigeant . auto-entrepreneur description: Les seuils de chiffre d'affaires minimum pour la validation des trimestres pour la retraite en auto-entrepreneur. En-dessous du montant minimum, vous n'aurez accès qu'à l'allocation de solidarité. diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index a43546cb9..5beddc0f0 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -7458,6 +7458,10 @@ entreprise . activité . mixte: entreprise . activité . mixte . proportions: description.en: '[automatic] Share of the various activities in turnover' description.fr: Part des différentes activités dans le chiffre d'affaires + note.en: '[automatic] It is up to the user to check that the sum of the three + percentages is 100%.' + note.fr: Il appartient à l'utilisateur de bien vérifier que la somme des trois + pourcentages renseignés vaut 100%. titre.en: '[automatic] activity proportion' titre.fr: proportion activité entreprise . activité . service ou vente: From 087ee4bbbbf889d9b31aa785e25945eebf281f60 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Fri, 28 May 2021 10:26:19 +0200 Subject: [PATCH 213/319] :alien: traductions manquantes' --- mon-entreprise/source/locales/ui-en.yaml | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 4ef169014..5b0c2d8cc 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1001,6 +1001,41 @@ pages: title: "Self-employed: demand for mobility in Europe" shortname: Demand for mobility in Europe simulateurs: + EI: + meta: + description: Calculation of income from turnover, after deduction of + contributions and taxes + ogDescription: "Thanks to the auto-entrepreneur income simulator developed by + Urssaf, you can estimate your income based on your monthly or annual + turnover to better manage your cash flow. Or the other way round: find + out how much to charge to achieve a certain income." + ogTitle: "Sole proprietorship: quickly calculate your net income from your + turnover and vice versa" + titre: "Sole proprietorship (EI): income simulator" + seo explanation: <0>How to calculate the net income of a sole trader?<1>A + sole trader must pay social security contributions to the authorities. + These contributions are used to finance social security, and open up + rights, particularly for retirement and health insurance. They are also + used to finance professional training.<2><0> <2>See the details + of the calculation of contributions<3>Do not forget to deduct + all expenses incurred in the course of the business (equipment, raw + materials, premises, transport). These are deductible from the company's + income, which means that you will not pay tax or contributions on their + amount (unless you have opted for the micro-tax option).<4>The + complete calculation formula is therefore :<1><0>Net income = Turnover - + Professional expenses - Social contributions<5>How do you + calculate the social security contributions of a sole + proprietorship?<6>The manager of a sole proprietorship pays social + security contributions, proportional to the company's <2>. Their + amount varies according to the type of activity (liberal profession, + craftsman, shopkeeper, etc.), or any exemptions granted (ACRE, ZFU, RSA, + etc.). To find out the amount, you can use this simulator, and refine + the<7> As a company's result is only known at the end of the + accounting year, the manager pays provisional contributions which will + then be adjusted once the real income has been declared, the following + year. + shortname: Sole proprietorship + title: Income simulator for sole proprietorship (EI) accueil: header: All the simulators on this site are kept up to date with the latest legislative developments. From 071ebb60d42078c51ce9951dacedd30fa86e3ddc Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Fri, 28 May 2021 10:59:05 +0200 Subject: [PATCH 214/319] =?UTF-8?q?:hammer:=20Enl=C3=A8ve=20les=20cotisati?= =?UTF-8?q?ons=20facultatives=20des=20cotisations=20provisionnelle=20de=20?= =?UTF-8?q?d=C3=A9but=20d'activit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/dirigeant.yaml | 1 + .../source/components/ChiffreAffairesActivitéMixte.tsx | 2 ++ .../source/pages/Simulateurs/configs/indépendant.yaml | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 829287751..0cb6b3f52 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -979,6 +979,7 @@ dirigeant . indépendant . cotisations et contributions . début activité: maladie . taux progressif . assiette: 40% * plafond sécurité sociale temps plein assiette des cotisations: assiette forfaitaire CSG et CRDS . assiette: assiette forfaitaire + dirigeant . indépendant . cotisations facultatives: non références: Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/lajustement-et-la-regularisation.html diff --git a/mon-entreprise/source/components/ChiffreAffairesActivitéMixte.tsx b/mon-entreprise/source/components/ChiffreAffairesActivitéMixte.tsx index 6faa6dffb..7800dc39b 100644 --- a/mon-entreprise/source/components/ChiffreAffairesActivitéMixte.tsx +++ b/mon-entreprise/source/components/ChiffreAffairesActivitéMixte.tsx @@ -36,6 +36,7 @@ export default function ChiffreAffairesActivitéMixte({ ) ) }, [dispatch]) + return ( <> {Object.values(proportions).map((chiffreAffaires) => ( Date: Fri, 28 May 2021 12:47:39 +0200 Subject: [PATCH 215/319] :sparkles: ajoute les simulateurs EIRL et EURL --- .../source/components/SimulateurWarning.tsx | 2 +- .../source/components/TargetSelection.css | 7 - .../source/components/TargetSelection.tsx | 13 +- mon-entreprise/source/components/ui/Card.css | 2 +- mon-entreprise/source/locales/ui-en.yaml | 62 ++++ .../source/pages/Simulateurs/Home.tsx | 28 +- .../source/pages/Simulateurs/Indépendant.tsx | 6 +- .../source/pages/Simulateurs/metadata.tsx | 288 ++++++++++++------ mon-entreprise/source/sitePaths.ts | 10 +- netlify.toml | 10 +- 10 files changed, 292 insertions(+), 136 deletions(-) diff --git a/mon-entreprise/source/components/SimulateurWarning.tsx b/mon-entreprise/source/components/SimulateurWarning.tsx index dd31c8a9f..35dcefbeb 100644 --- a/mon-entreprise/source/components/SimulateurWarning.tsx +++ b/mon-entreprise/source/components/SimulateurWarning.tsx @@ -59,7 +59,7 @@ export default function SimulateurWarning({ )} - {simulateur === 'SASU' && ( + {simulateur === 'sasu' && (
  • L'impôt sur les sociétés et la gestion des dividendes ne sont pas diff --git a/mon-entreprise/source/components/TargetSelection.css b/mon-entreprise/source/components/TargetSelection.css index 4cd362298..3c4eeac66 100644 --- a/mon-entreprise/source/components/TargetSelection.css +++ b/mon-entreprise/source/components/TargetSelection.css @@ -1,10 +1,3 @@ -#targetSelection h1 { - margin: 0.6em; - color: inherit; - text-align: center; - font-size: 180%; -} - #targetSelection .targets { list-style: none; padding: 0; diff --git a/mon-entreprise/source/components/TargetSelection.tsx b/mon-entreprise/source/components/TargetSelection.tsx index aea3cbaee..ae65eccaa 100644 --- a/mon-entreprise/source/components/TargetSelection.tsx +++ b/mon-entreprise/source/components/TargetSelection.tsx @@ -39,7 +39,6 @@ export default function TargetSelection({ showPeriodSwitch = true }) { const objectifs = useSelector( (state: RootState) => state.simulation?.config.objectifs || [] ) - const colors = useContext(ThemeColorsContext) return (
    {((typeof objectifs[0] === 'string' @@ -62,15 +61,9 @@ export default function TargetSelection({ showPeriodSwitch = true }) {
    ) @@ -108,7 +119,7 @@ function RevenueRepartitionSection(props: { onSeePayslip: () => void }) { function PaySlipSection() { return ( -
    +

    Fiche de paie

    @@ -118,11 +129,13 @@ function PaySlipSection() { } export const DistributionSection = ({ - children = , + disableAnimation, + children = , }: { + disableAnimation: boolean children?: React.ReactNode }) => ( -
    +

    À quoi servent mes cotisations ?

    diff --git a/mon-entreprise/source/components/ui/SocialIcon.tsx b/mon-entreprise/source/components/ui/SocialIcon.tsx index 9433843ac..fa5ae1918 100644 --- a/mon-entreprise/source/components/ui/SocialIcon.tsx +++ b/mon-entreprise/source/components/ui/SocialIcon.tsx @@ -3,24 +3,34 @@ import { useContext } from 'react' export const icons = { facebook: { - icon: 'M34.1,47V33.3h4.6l0.7-5.3h-5.3v-3.4c0-1.5,0.4-2.6,2.6-2.6l2.8,0v-4.8c-0.5-0.1-2.2-0.2-4.1-0.2 c-4.1,0-6.9,2.5-6.9,7V28H24v5.3h4.6V47H34.1z', - mask: 'M0,0v64h64V0H0z M39.6,22l-2.8,0c-2.2,0-2.6,1.1-2.6,2.6V28h5.3l-0.7,5.3h-4.6V47h-5.5V33.3H24V28h4.6V24 c0-4.6,2.8-7,6.9-7c2,0,3.6,0.1,4.1,0.2V22z', + icon: + 'M34.1,47V33.3h4.6l0.7-5.3h-5.3v-3.4c0-1.5,0.4-2.6,2.6-2.6l2.8,0v-4.8c-0.5-0.1-2.2-0.2-4.1-0.2 c-4.1,0-6.9,2.5-6.9,7V28H24v5.3h4.6V47H34.1z', + mask: + 'M0,0v64h64V0H0z M39.6,22l-2.8,0c-2.2,0-2.6,1.1-2.6,2.6V28h5.3l-0.7,5.3h-4.6V47h-5.5V33.3H24V28h4.6V24 c0-4.6,2.8-7,6.9-7c2,0,3.6,0.1,4.1,0.2V22z', }, twitter: { - icon: 'M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z', - mask: 'M0,0v64h64V0H0z M44.7,25.5c0,0.3,0,0.6,0,0.8C44.7,35,38.1,45,26.1,45c-3.7,0-7.2-1.1-10.1-2.9 c0.5,0.1,1,0.1,1.6,0.1c3.1,0,5.9-1,8.2-2.8c-2.9-0.1-5.3-2-6.1-4.6c0.4,0.1,0.8,0.1,1.2,0.1c0.6,0,1.2-0.1,1.7-0.2 c-3-0.6-5.3-3.3-5.3-6.4c0,0,0-0.1,0-0.1c0.9,0.5,1.9,0.8,3,0.8c-1.8-1.2-2.9-3.2-2.9-5.5c0-1.2,0.3-2.3,0.9-3.3 c3.2,4,8.1,6.6,13.5,6.9c-0.1-0.5-0.2-1-0.2-1.5c0-3.6,2.9-6.6,6.6-6.6c1.9,0,3.6,0.8,4.8,2.1c1.5-0.3,2.9-0.8,4.2-1.6 c-0.5,1.5-1.5,2.8-2.9,3.6c1.3-0.2,2.6-0.5,3.8-1C47.1,23.4,46,24.5,44.7,25.5z', + icon: + 'M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z', + mask: + 'M0,0v64h64V0H0z M44.7,25.5c0,0.3,0,0.6,0,0.8C44.7,35,38.1,45,26.1,45c-3.7,0-7.2-1.1-10.1-2.9 c0.5,0.1,1,0.1,1.6,0.1c3.1,0,5.9-1,8.2-2.8c-2.9-0.1-5.3-2-6.1-4.6c0.4,0.1,0.8,0.1,1.2,0.1c0.6,0,1.2-0.1,1.7-0.2 c-3-0.6-5.3-3.3-5.3-6.4c0,0,0-0.1,0-0.1c0.9,0.5,1.9,0.8,3,0.8c-1.8-1.2-2.9-3.2-2.9-5.5c0-1.2,0.3-2.3,0.9-3.3 c3.2,4,8.1,6.6,13.5,6.9c-0.1-0.5-0.2-1-0.2-1.5c0-3.6,2.9-6.6,6.6-6.6c1.9,0,3.6,0.8,4.8,2.1c1.5-0.3,2.9-0.8,4.2-1.6 c-0.5,1.5-1.5,2.8-2.9,3.6c1.3-0.2,2.6-0.5,3.8-1C47.1,23.4,46,24.5,44.7,25.5z', }, linkedin: { - icon: 'M20.4,44h5.4V26.6h-5.4V44z M23.1,18c-1.7,0-3.1,1.4-3.1,3.1c0,1.7,1.4,3.1,3.1,3.1 c1.7,0,3.1-1.4,3.1-3.1C26.2,19.4,24.8,18,23.1,18z M39.5,26.2c-2.6,0-4.4,1.4-5.1,2.8h-0.1v-2.4h-5.2V44h5.4v-8.6 c0-2.3,0.4-4.5,3.2-4.5c2.8,0,2.8,2.6,2.8,4.6V44H46v-9.5C46,29.8,45,26.2,39.5,26.2z', - mask: 'M0,0v64h64V0H0z M25.8,44h-5.4V26.6h5.4V44z M23.1,24.3c-1.7,0-3.1-1.4-3.1-3.1c0-1.7,1.4-3.1,3.1-3.1 c1.7,0,3.1,1.4,3.1,3.1C26.2,22.9,24.8,24.3,23.1,24.3z M46,44h-5.4v-8.4c0-2,0-4.6-2.8-4.6c-2.8,0-3.2,2.2-3.2,4.5V44h-5.4V26.6 h5.2V29h0.1c0.7-1.4,2.5-2.8,5.1-2.8c5.5,0,6.5,3.6,6.5,8.3V44z', + icon: + 'M20.4,44h5.4V26.6h-5.4V44z M23.1,18c-1.7,0-3.1,1.4-3.1,3.1c0,1.7,1.4,3.1,3.1,3.1 c1.7,0,3.1-1.4,3.1-3.1C26.2,19.4,24.8,18,23.1,18z M39.5,26.2c-2.6,0-4.4,1.4-5.1,2.8h-0.1v-2.4h-5.2V44h5.4v-8.6 c0-2.3,0.4-4.5,3.2-4.5c2.8,0,2.8,2.6,2.8,4.6V44H46v-9.5C46,29.8,45,26.2,39.5,26.2z', + mask: + 'M0,0v64h64V0H0z M25.8,44h-5.4V26.6h5.4V44z M23.1,24.3c-1.7,0-3.1-1.4-3.1-3.1c0-1.7,1.4-3.1,3.1-3.1 c1.7,0,3.1,1.4,3.1,3.1C26.2,22.9,24.8,24.3,23.1,24.3z M46,44h-5.4v-8.4c0-2,0-4.6-2.8-4.6c-2.8,0-3.2,2.2-3.2,4.5V44h-5.4V26.6 h5.2V29h0.1c0.7-1.4,2.5-2.8,5.1-2.8c5.5,0,6.5,3.6,6.5,8.3V44z', }, github: { - icon: 'M32,16c-8.8,0-16,7.2-16,16c0,7.1,4.6,13.1,10.9,15.2 c0.8,0.1,1.1-0.3,1.1-0.8c0-0.4,0-1.4,0-2.7c-4.5,1-5.4-2.1-5.4-2.1c-0.7-1.8-1.8-2.3-1.8-2.3c-1.5-1,0.1-1,0.1-1 c1.6,0.1,2.5,1.6,2.5,1.6c1.4,2.4,3.7,1.7,4.7,1.3c0.1-1,0.6-1.7,1-2.1c-3.6-0.4-7.3-1.8-7.3-7.9c0-1.7,0.6-3.2,1.6-4.3 c-0.2-0.4-0.7-2,0.2-4.2c0,0,1.3-0.4,4.4,1.6c1.3-0.4,2.6-0.5,4-0.5c1.4,0,2.7,0.2,4,0.5c3.1-2.1,4.4-1.6,4.4-1.6 c0.9,2.2,0.3,3.8,0.2,4.2c1,1.1,1.6,2.5,1.6,4.3c0,6.1-3.7,7.5-7.3,7.9c0.6,0.5,1.1,1.5,1.1,3c0,2.1,0,3.9,0,4.4 c0,0.4,0.3,0.9,1.1,0.8C43.4,45.1,48,39.1,48,32C48,23.2,40.8,16,32,16z', - mask: 'M0,0v64h64V0H0z M37.1,47.2c-0.8,0.2-1.1-0.3-1.1-0.8c0-0.5,0-2.3,0-4.4c0-1.5-0.5-2.5-1.1-3 c3.6-0.4,7.3-1.7,7.3-7.9c0-1.7-0.6-3.2-1.6-4.3c0.2-0.4,0.7-2-0.2-4.2c0,0-1.3-0.4-4.4,1.6c-1.3-0.4-2.6-0.5-4-0.5 c-1.4,0-2.7,0.2-4,0.5c-3.1-2.1-4.4-1.6-4.4-1.6c-0.9,2.2-0.3,3.8-0.2,4.2c-1,1.1-1.6,2.5-1.6,4.3c0,6.1,3.7,7.5,7.3,7.9 c-0.5,0.4-0.9,1.1-1,2.1c-0.9,0.4-3.2,1.1-4.7-1.3c0,0-0.8-1.5-2.5-1.6c0,0-1.6,0-0.1,1c0,0,1,0.5,1.8,2.3c0,0,0.9,3.1,5.4,2.1 c0,1.3,0,2.3,0,2.7c0,0.4-0.3,0.9-1.1,0.8C20.6,45.1,16,39.1,16,32c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16 C48,39.1,43.4,45.1,37.1,47.2z', + icon: + 'M32,16c-8.8,0-16,7.2-16,16c0,7.1,4.6,13.1,10.9,15.2 c0.8,0.1,1.1-0.3,1.1-0.8c0-0.4,0-1.4,0-2.7c-4.5,1-5.4-2.1-5.4-2.1c-0.7-1.8-1.8-2.3-1.8-2.3c-1.5-1,0.1-1,0.1-1 c1.6,0.1,2.5,1.6,2.5,1.6c1.4,2.4,3.7,1.7,4.7,1.3c0.1-1,0.6-1.7,1-2.1c-3.6-0.4-7.3-1.8-7.3-7.9c0-1.7,0.6-3.2,1.6-4.3 c-0.2-0.4-0.7-2,0.2-4.2c0,0,1.3-0.4,4.4,1.6c1.3-0.4,2.6-0.5,4-0.5c1.4,0,2.7,0.2,4,0.5c3.1-2.1,4.4-1.6,4.4-1.6 c0.9,2.2,0.3,3.8,0.2,4.2c1,1.1,1.6,2.5,1.6,4.3c0,6.1-3.7,7.5-7.3,7.9c0.6,0.5,1.1,1.5,1.1,3c0,2.1,0,3.9,0,4.4 c0,0.4,0.3,0.9,1.1,0.8C43.4,45.1,48,39.1,48,32C48,23.2,40.8,16,32,16z', + mask: + 'M0,0v64h64V0H0z M37.1,47.2c-0.8,0.2-1.1-0.3-1.1-0.8c0-0.5,0-2.3,0-4.4c0-1.5-0.5-2.5-1.1-3 c3.6-0.4,7.3-1.7,7.3-7.9c0-1.7-0.6-3.2-1.6-4.3c0.2-0.4,0.7-2-0.2-4.2c0,0-1.3-0.4-4.4,1.6c-1.3-0.4-2.6-0.5-4-0.5 c-1.4,0-2.7,0.2-4,0.5c-3.1-2.1-4.4-1.6-4.4-1.6c-0.9,2.2-0.3,3.8-0.2,4.2c-1,1.1-1.6,2.5-1.6,4.3c0,6.1,3.7,7.5,7.3,7.9 c-0.5,0.4-0.9,1.1-1,2.1c-0.9,0.4-3.2,1.1-4.7-1.3c0,0-0.8-1.5-2.5-1.6c0,0-1.6,0-0.1,1c0,0,1,0.5,1.8,2.3c0,0,0.9,3.1,5.4,2.1 c0,1.3,0,2.3,0,2.7c0,0.4-0.3,0.9-1.1,0.8C20.6,45.1,16,39.1,16,32c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16 C48,39.1,43.4,45.1,37.1,47.2z', }, email: { - icon: 'M17,22v20h30V22H17z M41.1,25L32,32.1L22.9,25H41.1z M20,39V26.6l12,9.3l12-9.3V39H20z', - mask: 'M41.1,25H22.9l9.1,7.1L41.1,25z M44,26.6l-12,9.3l-12-9.3V39h24V26.6z M0,0v64h64V0H0z M47,42H17V22h30V42z', + icon: + 'M17,22v20h30V22H17z M41.1,25L32,32.1L22.9,25H41.1z M20,39V26.6l12,9.3l12-9.3V39H20z', + mask: + 'M41.1,25H22.9l9.1,7.1L41.1,25z M44,26.6l-12,9.3l-12-9.3V39h24V26.6z M0,0v64h64V0H0z M47,42H17V22h30V42z', }, } diff --git a/mon-entreprise/source/components/ui/WarningBlock.tsx b/mon-entreprise/source/components/ui/WarningBlock.tsx index 36a009773..634dbd134 100644 --- a/mon-entreprise/source/components/ui/WarningBlock.tsx +++ b/mon-entreprise/source/components/ui/WarningBlock.tsx @@ -16,7 +16,7 @@ export default function Warning({ localStorageKey, children }: WarningProps) { margin-bottom: 1rem; `} > -

    +

    {emoji('🚩 ')} @@ -40,7 +40,7 @@ export default function Warning({ localStorageKey, children }: WarningProps) { css="padding-top: 1rem; padding-bottom: 0.4rem" > {children} -

    +
  • { if (inIframe) { return @@ -56,6 +57,10 @@ export default function ChômagePartiel() { { + setAnimationDisabled(true) + }} + disableAnimation={animationDisabled} results={} customEndMessages={ Voir les résultats au-dessus diff --git a/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx index 787dafc0c..c7540330d 100644 --- a/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx @@ -10,16 +10,31 @@ import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import { useEngine } from 'Components/utils/EngineContext' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { DottedName } from 'modele-social' -import { useContext } from 'react' +import { useContext, useState } from 'react' import { Trans } from 'react-i18next' import { useDispatch } from 'react-redux' import { Link } from 'react-router-dom' -export function IndépendantPLSimulation() { +interface IndépendantSimulationProps { + disableAnimation: boolean +} + +export function IndépendantPLSimulation({ + disableAnimation, +}: IndépendantSimulationProps) { + const [animationDisabled, setAnimationDisabled] = useState(false) return ( <> - }> + { + setAnimationDisabled(true) + }} + disableAnimation={animationDisabled} + explanations={ + + } + > @@ -27,11 +42,22 @@ export function IndépendantPLSimulation() { ) } -export function EntrepriseIndividuelle() { +export function EntrepriseIndividuelle({ + disableAnimation, +}: IndépendantSimulationProps) { + const [animationDisabled, setAnimationDisabled] = useState(false) return ( <> - }> + { + setAnimationDisabled(true) + }} + disableAnimation={animationDisabled} + explanations={ + + } + > @@ -39,12 +65,23 @@ export function EntrepriseIndividuelle() { ) } -export default function IndépendantSimulation() { +export default function IndépendantSimulation({ + disableAnimation, +}: IndépendantSimulationProps) { const sitePaths = useContext(SitePathsContext) + const [animationDisabled, setAnimationDisabled] = useState(false) return ( <> - }> + { + setAnimationDisabled(true) + }} + disableAnimation={animationDisabled} + explanations={ + + } + > @@ -53,7 +48,6 @@ type DistributionBranchProps = { value: number maximum: number icon?: string - disableAnimation: boolean } export function DistributionBranch({ @@ -61,7 +55,6 @@ export function DistributionBranch({ value, icon, maximum, - disableAnimation, }: DistributionBranchProps) { const branche = useContext(EngineContext).getRule(dottedName) @@ -73,7 +66,6 @@ export function DistributionBranch({ icon={icon ?? branche.rawNode.icônes} description={branche.rawNode.résumé} unit="€" - disableAnimation={disableAnimation} /> ) } diff --git a/mon-entreprise/source/components/ExportSimulationBanner.tsx b/mon-entreprise/source/components/ExportSimulationBanner.tsx index 13febe1b2..1314f1d1a 100644 --- a/mon-entreprise/source/components/ExportSimulationBanner.tsx +++ b/mon-entreprise/source/components/ExportSimulationBanner.tsx @@ -1,24 +1,9 @@ import { LinkButton } from 'Components/ui/Button' -import React, { useEffect, useState } from 'react' +import React from 'react' import { Trans } from 'react-i18next' import Banner from './Banner' -interface ExportSimulationBannerProps { - userWillExport: () => void - disableAnimation: boolean -} - -export default function ExportSimulationBanner({ - userWillExport, - disableAnimation, -}: ExportSimulationBannerProps) { - const [printRequired, setPrintRequired] = useState(false) - useEffect(() => { - if (printRequired) { - window.print() - setPrintRequired(false) - } - }, [disableAnimation]) +export default function ExportSimulationBanner() { return ( { - setPrintRequired(true) - disableAnimation ? window.print() : userWillExport() + window.print() }} > Imprimer ou sauvegarder en PDF diff --git a/mon-entreprise/source/components/NewsletterRegister.tsx b/mon-entreprise/source/components/NewsletterRegister.tsx index 420087b64..13dac054e 100644 --- a/mon-entreprise/source/components/NewsletterRegister.tsx +++ b/mon-entreprise/source/components/NewsletterRegister.tsx @@ -1,8 +1,8 @@ -import * as animate from 'Components/ui/animate' import { usePersistingState } from 'Components/utils/persistState' import { useRef, useState } from 'react' import emoji from 'react-easy-emoji' import { Trans, useTranslation } from 'react-i18next' +import { FromBottom } from './ui/animate' // We don't want to load the full sendinblue iframe, so we reimplement a simple // logic to the a HTTP Post request to their URL with the email data. @@ -37,7 +37,7 @@ export default function NewsletterRegister() { if (userJustRegistered) { return ( - +
    {(['IR', 'IS'] as const).map((imposition) => ( -

    Ressources utiles

    @@ -196,27 +198,32 @@ export function SimulatorRessourceCard({ const guidesUrssaf = [ { - url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf', + url: + 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf', associatedRule: "dirigeant . indépendant . PL . métier = 'santé . médecin'", title: 'Guide Urssaf pour les médecins libéraux', }, { - url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf', + url: + 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf', associatedRule: 'entreprise . activité . libérale réglementée', title: 'Guide Urssaf pour les professions libérales réglementées', }, { - url: 'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf', + url: + 'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf', associatedRule: 'dirigeant . auto-entrepreneur', title: 'Guide Urssaf pour les auto-entrepreneurs', }, { - url: 'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf', + url: + 'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf', associatedRule: "dirigeant = 'artiste-auteur'", title: 'Guide Urssaf pour les artistes-auteurs', }, { - url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf', + url: + 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf', associatedRule: 'dirigeant', title: 'Guide Urssaf pour les indépendants', }, diff --git a/mon-entreprise/source/pages/Simulateurs/Salarié.tsx b/mon-entreprise/source/pages/Simulateurs/Salarié.tsx index f056699e1..cf5fa92ae 100644 --- a/mon-entreprise/source/pages/Simulateurs/Salarié.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Salarié.tsx @@ -1,4 +1,5 @@ import Banner from 'Components/Banner' +import { useState } from 'react' import Simulation from 'Components/Simulation' import SalaryExplanation from 'Components/simulationExplanation/SalaryExplanation' import { SitePathsContext } from 'Components/utils/SitePathsContext' @@ -7,12 +8,19 @@ import { Trans } from 'react-i18next' import { Link } from 'react-router-dom' export default function SalariéSimulation() { + const [animationDisabled, setAnimationDisabled] = useState(false) const sitePaths = useContext(SitePathsContext) return ( <> } + userWillExport={() => { + setAnimationDisabled(true) + }} + disableAnimation={animationDisabled} + explanations={ + + } customEndMessages={ <> diff --git a/mon-entreprise/source/pages/Simulateurs/index.tsx b/mon-entreprise/source/pages/Simulateurs/index.tsx index 4dd5f22e6..0414f7af5 100644 --- a/mon-entreprise/source/pages/Simulateurs/index.tsx +++ b/mon-entreprise/source/pages/Simulateurs/index.tsx @@ -59,7 +59,7 @@ export default function Simulateurs() { {(!lastState || lastState?.fromSimulateurs) && ( Voir les autres simulateurs diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 3063c2240..ce1f98982 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -4,7 +4,7 @@ import Simulation from 'Components/Simulation' import SalaryExplanation from 'Components/simulationExplanation/SalaryExplanation' import Emoji from 'Components/utils/Emoji' import { SitePathsContext } from 'Components/utils/SitePathsContext' -import React, { useContext, useMemo } from 'react' +import React, { useContext, useMemo, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { SimulationConfig } from 'Reducers/rootReducer' import { constructLocalizedSitePath } from '../../sitePaths' @@ -139,74 +139,77 @@ export function getSimulatorsData({ shortName: t('pages.simulateurs.salarié.shortname', 'Salarié'), seoExplanations: ( -

    Comment calculer le salaire net ?

    -

    - Lors de l'entretien d'embauche l'employeur propose en général une - rémunération exprimée en « brut ». Le montant annoncé inclut ainsi - les cotisations salariales, qui servent à financer la protection - sociale du salarié et qui sont retranchées du salaire « net » perçu - par le salarié. -

    -

    - Vous pouvez utiliser notre simulateur pour convertir le{' '} - salaire brut en net : il vous suffit pour cela - saisir la rémunération annoncée dans la case salaire brut. La - simulation peut-être affinée en répondant aux différentes questions - (CDD, statut cadre, heures supplémentaires, temps partiel, - titre-restaurants, etc.). -

    - {t( -

    - Par ailleurs depuis 2019, l' - impôt sur le revenu est - prélevé à la source. Pour ce faire, la direction générale des - finances publiques (DGFiP) transmet à l'employeur le taux - d'imposition calculé à partir de la déclaration de revenu du - salarié. Si ce taux est inconnu, par exemple lors d'une première - année d'activité, l'employeur utilise le{' '} - - taux neutre - - . -

    -

    Comment calculer le coût d'embauche ?

    -

    - Si vous cherchez à embaucher, vous pouvez calculer le coût total de - la rémunération de votre salarié, ainsi que les montants de - cotisations patronales et salariales correspondant. Cela vous permet - de définir le niveau de rémunération en connaissant le montant - global de charge que cela représente pour votre entreprise. -

    -

    - En plus du salaire, notre simulateur prend en compte le calcul des - avantages en nature (téléphone, véhicule de fonction, etc.), ainsi - que la mutuelle santé obligatoire. -

    -

    - Il existe des{' '} - - aides différées - {' '} - à l'embauche qui ne sont pas toutes prises en compte par notre - simulateur, vous pouvez les retrouver sur{' '} - - le portail officiel - - . -

    +
    +

    Comment calculer le salaire net ?

    +

    + Lors de l'entretien d'embauche l'employeur propose en général une + rémunération exprimée en « brut ». Le montant annoncé inclut ainsi + les cotisations salariales, qui servent à financer la protection + sociale du salarié et qui sont retranchées du salaire « net » + perçu par le salarié. +

    +

    + Vous pouvez utiliser notre simulateur pour convertir le{' '} + salaire brut en net : il vous suffit pour cela + saisir la rémunération annoncée dans la case salaire brut. La + simulation peut-être affinée en répondant aux différentes + questions (CDD, statut cadre, heures supplémentaires, temps + partiel, titre-restaurants, etc.). +

    + {t( +

    + Par ailleurs depuis 2019, l' + impôt sur le revenu est + prélevé à la source. Pour ce faire, la direction générale des + finances publiques (DGFiP) transmet à l'employeur le taux + d'imposition calculé à partir de la déclaration de revenu du + salarié. Si ce taux est inconnu, par exemple lors d'une première + année d'activité, l'employeur utilise le{' '} + + taux neutre + + . +

    +

    Comment calculer le coût d'embauche ?

    +

    + Si vous cherchez à embaucher, vous pouvez calculer le coût total + de la rémunération de votre salarié, ainsi que les montants de + cotisations patronales et salariales correspondant. Cela vous + permet de définir le niveau de rémunération en connaissant le + montant global de charge que cela représente pour votre + entreprise. +

    +

    + En plus du salaire, notre simulateur prend en compte le calcul des + avantages en nature (téléphone, véhicule de fonction, etc.), ainsi + que la mutuelle santé obligatoire. +

    +

    + Il existe des{' '} + + aides différées + {' '} + à l'embauche qui ne sont pas toutes prises en compte par notre + simulateur, vous pouvez les retrouver sur{' '} + + le portail officiel + + . +

    +
    ), nextSteps: ['chômage-partiel', 'aides-embauche'], @@ -244,7 +247,9 @@ export function getSimulatorsData({ 'Entreprise individuelle (EI) : simulateur de revenus' ), }, - component: EntrepriseIndividuelle, + component: () => { + return + }, path: sitePaths.simulateurs['entreprise-individuelle'], shortName: t('pages.simulateurs.ei.shortname', 'EI'), title: t( @@ -253,67 +258,70 @@ export function getSimulatorsData({ ), seoExplanations: ( -

    - Comment calculer le revenu net d'un dirigeant d'entreprise - individuelle (EI) ? -

    -

    - Un dirigeant d'entreprise individuelle doit payer des cotisations et - contributions sociales à l'administration. Ces cotisations servent - au financement de la sécurité sociale, et ouvrent des droits - notamment pour la retraite et pour l'assurance maladie. Elles - permettent également de financer la formation professionnelle. -

    -

    - {' '} - - Voir le détail du calcul des cotisations - -

    -

    - Il ne faut pas oublier de retrancher toutes les dépenses effectuées - dans le cadre de l'activité professionnelle (équipements, matières - premières, local, transport). Ces dernières sont déductibles du - résultat de l'entreprise, cela veut dire que vous ne payerez pas - d'impôt ou de cotisations sur leur montant (sauf si vous avez opté - pour l'option micro-fiscal). -

    -

    - La formule de calcul complète est donc : -

    - - Revenu net = Chiffres d'affaires − Dépenses professionnelles - - Cotisations sociales - -
    -

    -

    - Comment calculer les cotisations sociales d'une entreprise - individuelle ? -

    -

    - Le dirigeant d'une entreprise individuelle paye des cotisations - sociales, proportionnelle au{' '} - - résultat fiscal - {' '} - de l'entreprise. Leur montant varie également en fonction du type - d'activité (profession libérale, artisan, commerçants, etc), où des - éventuelles exonérations accordées (ACRE, ZFU, RSA, etc.). -

    -

    - {' '} - Comme le résultat d'une entreprise n'est connu qu'à la fin de - l'exercice comptable, le dirigeant paye des cotisations - provisionnelles qui seront ensuite régularisée une fois le revenu - réel déclaré, l'année suivante. -

    -

    - Ce simulateur permet de calculer le montant exact des cotisations - sociale en partant d'un chiffre d'affaires ou d'un revenu net - souhaité. Vous pourrez préciser votre situation en répondant aux - questions s'affichant en dessous de la simulation. -

    +
    +

    + Comment calculer le revenu net d'un dirigeant d'entreprise + individuelle (EI) ? +

    +

    + Un dirigeant d'entreprise individuelle doit payer des cotisations + et contributions sociales à l'administration. Ces cotisations + servent au financement de la sécurité sociale, et ouvrent des + droits notamment pour la retraite et pour l'assurance maladie. + Elles permettent également de financer la formation + professionnelle. +

    +

    + {' '} + + Voir le détail du calcul des cotisations + +

    +

    + Il ne faut pas oublier de retrancher toutes les dépenses + effectuées dans le cadre de l'activité professionnelle + (équipements, matières premières, local, transport). Ces dernières + sont déductibles du résultat de l'entreprise, cela veut dire que + vous ne payerez pas d'impôt ou de cotisations sur leur montant + (sauf si vous avez opté pour l'option micro-fiscal). +

    +

    + La formule de calcul complète est donc : +

    + + Revenu net = Chiffres d'affaires − Dépenses professionnelles - + Cotisations sociales + +
    +

    +

    + Comment calculer les cotisations sociales d'une entreprise + individuelle ? +

    +

    + Le dirigeant d'une entreprise individuelle paye des cotisations + sociales, proportionnelle au{' '} + + résultat fiscal + {' '} + de l'entreprise. Leur montant varie également en fonction du type + d'activité (profession libérale, artisan, commerçants, etc), où + des éventuelles exonérations accordées (ACRE, ZFU, RSA, etc.). +

    +

    + {' '} + Comme le résultat d'une entreprise n'est connu qu'à la fin de + l'exercice comptable, le dirigeant paye des cotisations + provisionnelles qui seront ensuite régularisée une fois le revenu + réel déclaré, l'année suivante. +

    +

    + Ce simulateur permet de calculer le montant exact des cotisations + sociale en partant d'un chiffre d'affaires ou d'un revenu net + souhaité. Vous pourrez préciser votre situation en répondant aux + questions s'affichant en dessous de la simulation. +

    +
    ), nextSteps: ['comparaison-statuts'], @@ -345,7 +353,9 @@ export function getSimulatorsData({ 'EIRL : simulateur de revenus pour dirigeant' ), }, - component: IndépendantSimulation, + component: () => { + return + }, path: sitePaths.simulateurs.eirl, shortName: t('pages.simulateurs.eirl.shortname', 'EIRL'), title: t('pages.simulateurs.eirl.title', "Simulateur d'EIRL"), @@ -383,52 +393,63 @@ export function getSimulatorsData({ shortName: t('pages.simulateurs.sasu.shortname', 'SASU'), title: t('pages.simulateurs.sasu.title', 'Simulateur de SASU'), component: function SasuSimulation() { + const [animationDisabled, setAnimationDisabled] = useState(false) return ( <> - } /> + { + setAnimationDisabled(true) + }} + disableAnimation={animationDisabled} + explanations={ + + } + /> ) }, seoExplanations: ( -

    Comment calculer le salaire d'un dirigeant de SASU ?

    -

    - Comme pour un salarié classique, le{' '} - dirigeant de sasu paye des cotisations sociales sur - la rémunération qu'il se verse. Les cotisations sont calculées de la - même manière que pour le salarié : elles sont décomposées en partie - employeur et partie salarié et sont exprimées comme un pourcentage - du salaire brut. -

    -

    - Le dirigeant assimilé-salarié ne paye pas de{' '} - cotisations chômage. Par ailleurs, il ne bénéficie - pas de la{' '} - - réduction générale de cotisations - {' '} - ni des dispositifs encadrés par le code du travail comme les{' '} - - heures supplémentaires - {' '} - ou les primes. -

    -

    - Il peut en revanche prétendre à la{' '} - - réduction ACRE - {' '} - en debut d'activité, sous certaines conditions. -

    -

    - Vous pouvez utiliser notre simulateur pour calculer la{' '} - rémunération nette à partir d'un montant superbrut - alloué à la rémunération du dirigeant. Il vous suffit pour cela - saisir le montant total alloué dans la case "total chargé". La - simulation peut ensuite être affinée en répondant aux différentes - questions. -

    +
    +

    Comment calculer le salaire d'un dirigeant de SASU ?

    +

    + Comme pour un salarié classique, le{' '} + dirigeant de sasu paye des cotisations sociales + sur la rémunération qu'il se verse. Les cotisations sont calculées + de la même manière que pour le salarié : elles sont décomposées en + partie employeur et partie salarié et sont exprimées comme un + pourcentage du salaire brut. +

    +

    + Le dirigeant assimilé-salarié ne paye pas de{' '} + cotisations chômage. Par ailleurs, il ne + bénéficie pas de la{' '} + + réduction générale de cotisations + {' '} + ni des dispositifs encadrés par le code du travail comme les{' '} + + heures supplémentaires + {' '} + ou les primes. +

    +

    + Il peut en revanche prétendre à la{' '} + + réduction ACRE + {' '} + en debut d'activité, sous certaines conditions. +

    +

    + Vous pouvez utiliser notre simulateur pour calculer la{' '} + rémunération nette à partir d'un montant + superbrut alloué à la rémunération du dirigeant. Il vous suffit + pour cela saisir le montant total alloué dans la case "total + chargé". La simulation peut ensuite être affinée en répondant aux + différentes questions. +

    +
    ), nextSteps: ['is', 'comparaison-statuts'], @@ -469,7 +490,9 @@ export function getSimulatorsData({ path: sitePaths.simulateurs.eurl, shortName: t('pages.simulateurs.sasu.shortname', 'EURL'), title: t('pages.simulateurs.sasu.title', "Simulateur d'EURL"), - component: IndépendantSimulation, + component: () => { + return + }, nextSteps: ['is', 'comparaison-statuts'], }, 'auto-entrepreneur': { @@ -508,67 +531,70 @@ export function getSimulatorsData({ ), seoExplanations: ( -

    Comment calculer le revenu net d'un auto-entrepreneur ?

    -

    - Un auto-entrepreneur doit payer des cotisations et contributions - sociales à l'administration. Ces cotisations servent au financement - de la sécurité sociale, et ouvrent des droits notamment pour la - retraite et pour l'assurance maladie. Elles permettent également de - financer la formation professionnelle. Leur montant varie en - fonction du type d'activité. -

    -

    - {' '} - - Voir le détail du calcul des cotisations - -

    -

    - Il ne faut pas oublier de retrancher toutes les dépenses effectuées - dans le cadre de l'activité professionnelle (équipements, matières - premières, local, transport). Bien qu'elles ne soient pas utilisées - pour le calcul des cotisations et de l'impôt, elles doivent être - prises en compte pour vérifier si l'activité est viable - économiquement. -

    -

    - La formule de calcul complète est donc : -

    - - Revenu net = Chiffres d'affaires − Cotisations sociales − - Dépenses professionnelles - -
    -

    -

    - Comment calculer l'impôt sur le revenu pour un auto-entrepreneur ? -

    -

    - Si vous avez opté pour le versement libératoire lors de la création - de votre auto-entreprise, l'impôt sur le revenu est payé en même - temps que les cotisations sociales. -

    -

    - {' '} - - Voir comment est calculé le montant du versement libératoire - -

    -

    - Sinon, vous serez imposé selon le barème standard de l'impôt sur le - revenu. Le revenu imposable est alors calculé comme un pourcentage - du chiffre d'affaires. C'est qu'on appel l'abattement forfaitaire. - Ce pourcentage varie en fonction du type d'activité excercé. On dit - qu'il est forfaitaire car il ne prends pas en compte les dépenses - réelles effectuées dans le cadre de l'activité. -

    -

    - {' '} - - Voir le détail du calcul du revenu abattu pour un - auto-entrepreneur - -

    +
    +

    Comment calculer le revenu net d'un auto-entrepreneur ?

    +

    + Un auto-entrepreneur doit payer des cotisations et contributions + sociales à l'administration. Ces cotisations servent au + financement de la sécurité sociale, et ouvrent des droits + notamment pour la retraite et pour l'assurance maladie. Elles + permettent également de financer la formation professionnelle. + Leur montant varie en fonction du type d'activité. +

    +

    + {' '} + + Voir le détail du calcul des cotisations + +

    +

    + Il ne faut pas oublier de retrancher toutes les dépenses + effectuées dans le cadre de l'activité professionnelle + (équipements, matières premières, local, transport). Bien qu'elles + ne soient pas utilisées pour le calcul des cotisations et de + l'impôt, elles doivent être prises en compte pour vérifier si + l'activité est viable économiquement. +

    +

    + La formule de calcul complète est donc : +

    + + Revenu net = Chiffres d'affaires − Cotisations sociales − + Dépenses professionnelles + +
    +

    +

    + Comment calculer l'impôt sur le revenu pour un auto-entrepreneur ? +

    +

    + Si vous avez opté pour le versement libératoire lors de la + création de votre auto-entreprise, l'impôt sur le revenu est payé + en même temps que les cotisations sociales. +

    +

    + {' '} + + Voir comment est calculé le montant du versement libératoire + +

    +

    + Sinon, vous serez imposé selon le barème standard de l'impôt sur + le revenu. Le revenu imposable est alors calculé comme un + pourcentage du chiffre d'affaires. C'est qu'on appel l'abattement + forfaitaire. Ce pourcentage varie en fonction du type d'activité + excercé. On dit qu'il est forfaitaire car il ne prends pas en + compte les dépenses réelles effectuées dans le cadre de + l'activité. +

    +

    + {' '} + + Voir le détail du calcul du revenu abattu pour un + auto-entrepreneur + +

    +
    ), nextSteps: ['indépendant', 'comparaison-statuts'], @@ -594,7 +620,9 @@ export function getSimulatorsData({ "Calcul du revenu net après impôt et des cotisations à partir du chiffre d'affaires et inversement" ), }, - component: IndépendantSimulation, + component: () => { + return + }, nextSteps: ['comparaison-statuts', 'is'], }, @@ -662,74 +690,77 @@ export function getSimulatorsData({ ), seoExplanations: ( -

    Comment calculer l'indemnité d'activité partielle ?

    -

    - L'indemnité d'activité partielle de base est fixée par la loi à{' '} - 70% du brut. Elle est proratisée en fonction du - nombre d'heures chômées. Pour un salarié à 2300 € brut mensuel, qui - travaille à 50% de son temps usuel, cela donne{' '} - 2300 € × 50% × 70% = 805 € -

    -

    - A cette indemnité de base s'ajoute l'indemnité complémentaire pour - les salaires proches du SMIC. Ce complément intervient lorsque le - cumul de la rémunération et de l'indemnité de base est en dessous - d'un SMIC net. Ces indemnités sont prises en charge par l'employeur, - qui sera ensuite remboursé en parti ou en totalité par l'État. -

    -

    - 👉{' '} - - Voir le détail du calcul de l'indemnité - -

    -

    Comment calculer la part remboursée par l'État ?

    -

    - L'État prend en charge une partie de l'indemnité partielle pour les - salaires allant jusqu'à 4,5 SMIC, avec un minimum à - 8,03€ par heures chômée. Concrètement, cela abouti à une prise en - charge à100% pour les salaires proches du SMIC. - Celle-ci diminue progressivement jusqu'à se stabiliser à{' '} - 93% pour les salaires compris{' '} - entre 2000 € et 7000 € (salaire correspondant à la - limite de 4,5 SMIC). -

    -

    - 👉{' '} - - Voir le détail du calcul du remboursement de l'indemnité - -

    -

    Comment déclarer une activité partielle ?

    -

    - Face à la crise du coronavirus, les modalités de passage en activité - partielle ont été allégées. L'employeur est autorisé a placer ses - salariés en activité partielle avant que la demande officielle ne - soit déposée. Celui-ci dispose ensuite d'un délai de{' '} - 30 jours pour se mettre en règle. Les indemnités - seront versées avec un effet rétro-actif débutant à la mise en place - du chômage partiel. -

    -

    - 👉{' '} - - Effectuer la demande de chômage partiel - -

    -

    - {' '} - Quelles sont les cotisations sociales à payer pour l'indemnité - d'activité partielle ? -

    -

    - L'indemnité d'activité partielle est soumise à la CSG/CRDS et à une - contribution maladie dans certains cas. Pour en savoir plus, voir la - page explicative sur{' '} - - le site de l'Urssaf - - . -

    +
    +

    Comment calculer l'indemnité d'activité partielle ?

    +

    + L'indemnité d'activité partielle de base est fixée par la loi à{' '} + 70% du brut. Elle est proratisée en fonction du + nombre d'heures chômées. Pour un salarié à 2300 € brut mensuel, + qui travaille à 50% de son temps usuel, cela donne{' '} + 2300 € × 50% × 70% = 805 € +

    +

    + A cette indemnité de base s'ajoute l'indemnité complémentaire pour + les salaires proches du SMIC. Ce complément intervient lorsque le + cumul de la rémunération et de l'indemnité de base est en dessous + d'un SMIC net. Ces indemnités sont prises en charge par + l'employeur, qui sera ensuite remboursé en parti ou en totalité + par l'État. +

    +

    + 👉{' '} + + Voir le détail du calcul de l'indemnité + +

    +

    Comment calculer la part remboursée par l'État ?

    +

    + L'État prend en charge une partie de l'indemnité partielle pour + les salaires allant jusqu'à 4,5 SMIC, avec un + minimum à 8,03€ par heures chômée. Concrètement, cela abouti à une + prise en charge à100% pour les salaires proches + du SMIC. Celle-ci diminue progressivement jusqu'à se stabiliser à{' '} + 93% pour les salaires compris{' '} + entre 2000 € et 7000 € (salaire correspondant à + la limite de 4,5 SMIC). +

    +

    + 👉{' '} + + Voir le détail du calcul du remboursement de l'indemnité + +

    +

    Comment déclarer une activité partielle ?

    +

    + Face à la crise du coronavirus, les modalités de passage en + activité partielle ont été allégées. L'employeur est autorisé a + placer ses salariés en activité partielle avant que la demande + officielle ne soit déposée. Celui-ci dispose ensuite d'un délai de{' '} + 30 jours pour se mettre en règle. Les indemnités + seront versées avec un effet rétro-actif débutant à la mise en + place du chômage partiel. +

    +

    + 👉{' '} + + Effectuer la demande de chômage partiel + +

    +

    + {' '} + Quelles sont les cotisations sociales à payer pour l'indemnité + d'activité partielle ? +

    +

    + L'indemnité d'activité partielle est soumise à la CSG/CRDS et à + une contribution maladie dans certains cas. Pour en savoir plus, + voir la page explicative sur{' '} + + le site de l'Urssaf + + . +

    +
    ), nextSteps: ['salarié', 'aides-embauche'], @@ -844,7 +875,9 @@ export function getSimulatorsData({ 'pages.simulateurs.médecin.title', 'Simulateur de revenus pour médecin en libéral' ), - component: IndépendantPLSimulation, + component: () => { + return + }, }, 'chirurgien-dentiste': { config: dentisteConfig, @@ -863,7 +896,9 @@ export function getSimulatorsData({ 'pages.simulateurs.chirurgien-dentiste.title', 'Simulateur de revenus pour chirurgien-dentiste en libéral' ), - component: IndépendantPLSimulation, + component: () => { + return + }, }, 'sage-femme': { config: sageFemmeConfig, @@ -879,7 +914,9 @@ export function getSimulatorsData({ 'pages.simulateurs.sage-femme.title', 'Simulateur de revenus pour sage-femme en libéral' ), - component: IndépendantPLSimulation, + component: () => { + return + }, }, 'auxiliaire-médical': { config: auxiliaireConfig, @@ -899,7 +936,9 @@ export function getSimulatorsData({ 'pages.simulateurs.auxiliaire.title', 'Simulateur de revenus pour auxiliaire médical en libéral' ), - component: IndépendantPLSimulation, + component: () => { + return + }, }, avocat: { config: avocatConfig, @@ -915,7 +954,9 @@ export function getSimulatorsData({ 'pages.simulateurs.avocat.title', 'Simulateur de revenus pour avocat en libéral' ), - component: IndépendantPLSimulation, + component: () => { + return + }, }, 'expert-comptable': { config: expertComptableConfig, @@ -934,7 +975,9 @@ export function getSimulatorsData({ 'pages.simulateurs.expert-comptable.title', 'Simulateur de revenus pour expert comptable et commissaire aux comptes en libéral' ), - component: IndépendantPLSimulation, + component: () => { + return + }, }, 'profession-libérale': { config: professionLibéraleConfig, @@ -962,7 +1005,9 @@ export function getSimulatorsData({ 'pages.simulateurs.profession-libérale.title', 'Simulateur de revenus pour profession libérale' ), - component: IndépendantPLSimulation, + component: () => { + return + }, }, pamc: { private: true, @@ -1063,35 +1108,40 @@ export function getSimulatorsData({ component: ISSimulation, seoExplanations: ( -

    Comment est calculé l’impôt sur les sociétés ?

    -

    - L’impôt sur les sociétés s’applique aux bénéfices réalisés par les - sociétés de capitaux (SA, SAS, SASU, SARL, etc.) et sur option - facultative pour certaines autres sociétés (EIRL, EURL, SNC, etc.). -

    -

    - Il est calculé sur la base des bénéfices réalisés en France au cours - de l’exercice comptable. La durée d’un exercice est normalement d’un - an mais il peut être plus court ou plus long (notamment en début - d’activité ou à la dissolution de l’entreprise). Dans ce cas le - barème de l’impôt est pro-ratisé en fonction de la durée de - l’exercice, ce qui est pris en compte dans le simulateur en - modifiant les dates de début et de fin de l’exercice. -

    -

    Taux réduit et régimes spécifiques

    -

    - Les PME réalisant moins de 7,63 millions d’euros de chiffre - d’affaires et dont le capital est détenu à 75% par des personnes - physiques bénéficient d’un taux réduit d’impôt sur les sociétés. Ce - taux est pris en compte sur le simulateur et il n’est pour l’instant - pas possible de simuler l’inéligibilité aux taux réduits. -

    -

    - Enfin il existe des régimes d’impositions spécifiques avec des taux - dédiés pour certains types de plus-values (cession de titres, - cession de brevets). Ces régimes ne sont pas intégrés dans le - simulateur. -

    +
    +

    Comment est calculé l’impôt sur les sociétés ?

    +

    + L’impôt sur les sociétés s’applique aux bénéfices réalisés par les + sociétés de capitaux (SA, SAS, SASU, SARL, etc.) et sur option + facultative pour certaines autres sociétés (EIRL, EURL, SNC, + etc.). +

    +

    + Il est calculé sur la base des bénéfices réalisés en France au + cours de l’exercice comptable. La durée d’un exercice est + normalement d’un an mais il peut être plus court ou plus long + (notamment en début d’activité ou à la dissolution de + l’entreprise). Dans ce cas le barème de l’impôt est pro-ratisé en + fonction de la durée de l’exercice, ce qui est pris en compte dans + le simulateur en modifiant les dates de début et de fin de + l’exercice. +

    +

    Taux réduit et régimes spécifiques

    +

    + Les PME réalisant moins de 7,63 millions d’euros de chiffre + d’affaires et dont le capital est détenu à 75% par des personnes + physiques bénéficient d’un taux réduit d’impôt sur les sociétés. + Ce taux est pris en compte sur le simulateur et il n’est pour + l’instant pas possible de simuler l’inéligibilité aux taux + réduits. +

    +

    + Enfin il existe des régimes d’impositions spécifiques avec des + taux dédiés pour certains types de plus-values (cession de titres, + cession de brevets). Ces régimes ne sont pas intégrés dans le + simulateur. +

    +
    ), nextSteps: ['salarié', 'comparaison-statuts'], diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx index 87a695161..52f463704 100644 --- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx @@ -41,9 +41,9 @@ export default function VotreSituation() { } const déclarations = déclarationsSelector(state) - const régimeGénéralDisponible = activitésEffectuéesSelector(state).some( - (activité) => régimeGénéralDisponibleSelector(state, activité) - ) + const régimeGénéralDisponible = activitésEffectuéesSelector( + state + ).some((activité) => régimeGénéralDisponibleSelector(state, activité)) return ( diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js index f239f1baa..def769e08 100644 --- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js +++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js @@ -1,14 +1,12 @@ import { hasConditions } from './activitésData' -const filterActivités = - (filter = () => true) => - (state) => - Object.entries(state) - .filter( - ([activitéTitle, activitéData]) => - activitéData.effectuée && filter(activitéData, activitéTitle) - ) - .map(([activité]) => activité) +const filterActivités = (filter = () => true) => (state) => + Object.entries(state) + .filter( + ([activitéTitle, activitéData]) => + activitéData.effectuée && filter(activitéData, activitéTitle) + ) + .map(([activité]) => activité) export const nextActivitéSelector = (state, currentActivité) => filterActivités( diff --git a/mon-entreprise/source/pages/Stats/Stats.tsx b/mon-entreprise/source/pages/Stats/Stats.tsx index ace3158ad..2018bc1bf 100644 --- a/mon-entreprise/source/pages/Stats/Stats.tsx +++ b/mon-entreprise/source/pages/Stats/Stats.tsx @@ -22,7 +22,7 @@ import SatisfactionChart from './SatisfactionChart' import { Page, PageChapter2, PageSatisfaction, StatsStruct } from './types' import { formatDay, formatMonth, Indicator, Indicators } from './utils' -const stats = statsJson as unknown as StatsStruct +const stats = (statsJson as unknown) as StatsStruct type Period = 'mois' | 'jours' type Chapter2 = PageChapter2 | 'PAM' diff --git a/mon-entreprise/source/reducers/rootReducer.ts b/mon-entreprise/source/reducers/rootReducer.ts index f493dab0e..d250d67f1 100644 --- a/mon-entreprise/source/reducers/rootReducer.ts +++ b/mon-entreprise/source/reducers/rootReducer.ts @@ -103,9 +103,9 @@ function simulation( unfoldedStep: null, } case 'BATCH_UPDATE_SITUATION': { - return ( - Object.entries(action.situation as any) as Array<[Names, unknown]> - ).reduce( + return (Object.entries(action.situation as any) as Array< + [Names, unknown] + >).reduce( (newState, [fieldName, value]) => simulation(newState, { type: 'UPDATE_SITUATION', diff --git a/mon-entreprise/source/selectors/companyStatusSelectors.ts b/mon-entreprise/source/selectors/companyStatusSelectors.ts index e0c5f9368..96007c7ef 100644 --- a/mon-entreprise/source/selectors/companyStatusSelectors.ts +++ b/mon-entreprise/source/selectors/companyStatusSelectors.ts @@ -97,21 +97,21 @@ const QUESTION_LIST: Array = keys( mergeAll(flatten(Object.values(LEGAL_STATUS_DETAILS))) ) -const isCompatibleStatusWith = - (answers: any) => - (statusRequirements: LegalStatusRequirements): boolean => { - const stringify = map((x) => (!isNil(x) ? JSON.stringify(x) : x)) - const answerCompatibility = Object.values( - mergeWith( - (answer, statusValue) => - isNil(answer) || isNil(statusValue) || answer === statusValue, - stringify(statusRequirements as any), - stringify(answers) - ) +const isCompatibleStatusWith = (answers: any) => ( + statusRequirements: LegalStatusRequirements +): boolean => { + const stringify = map((x) => (!isNil(x) ? JSON.stringify(x) : x)) + const answerCompatibility = Object.values( + mergeWith( + (answer, statusValue) => + isNil(answer) || isNil(statusValue) || answer === statusValue, + stringify(statusRequirements as any), + stringify(answers) ) - const isCompatibleStatus = answerCompatibility.every((x) => x !== false) - return isCompatibleStatus - } + ) + const isCompatibleStatus = answerCompatibility.every((x) => x !== false) + return isCompatibleStatus +} const possibleStatus = ( answers: Array | LegalStatusRequirements ): Record => @@ -140,23 +140,24 @@ export const nextQuestionSelector = (state: RootState): Question | null => { ).filter(isCompatibleStatusWith(legalStatusRequirements) as any) const unansweredQuestions = difference(QUESTION_LIST, questionAnswered) - const shannonEntropyByQuestion = unansweredQuestions.map( - (question): [typeof question, number] => { - const answerPopulation = Object.values(possibleStatusList).map( - (status: any) => status[question] + const shannonEntropyByQuestion = unansweredQuestions.map((question): [ + typeof question, + number + ] => { + const answerPopulation = Object.values(possibleStatusList).map( + (status: any) => status[question] + ) + const frequencyOfAnswers = Object.values( + countBy( + (x) => x, + answerPopulation.filter((x) => x !== undefined) ) - const frequencyOfAnswers = Object.values( - countBy( - (x) => x, - answerPopulation.filter((x) => x !== undefined) - ) - ).map((numOccurrence) => numOccurrence / answerPopulation.length) - const shannonEntropy = -frequencyOfAnswers - .map((p) => p * Math.log2(p)) - .reduce(add, 0) - return [question, shannonEntropy] - } - ) + ).map((numOccurrence) => numOccurrence / answerPopulation.length) + const shannonEntropy = -frequencyOfAnswers + .map((p) => p * Math.log2(p)) + .reduce(add, 0) + return [question, shannonEntropy] + }) const sortedPossibleNextQuestions = sortBy( ([, entropy]) => -entropy, diff --git a/mon-entreprise/source/sentry.ts b/mon-entreprise/source/sentry.ts index 839f21f54..abf7d7ce8 100644 --- a/mon-entreprise/source/sentry.ts +++ b/mon-entreprise/source/sentry.ts @@ -1,8 +1,9 @@ import * as Sentry from '@sentry/react' import { Integrations } from '@sentry/tracing' -let branch: string | undefined = - process.env.GITHUB_REF?.split('/')?.slice(-1)?.[0] +let branch: string | undefined = process.env.GITHUB_REF?.split('/')?.slice( + -1 +)?.[0] if (branch === 'merge') { branch = process.env.GITHUB_HEAD_REF @@ -27,7 +28,8 @@ export const productionMode = ['master', 'next'].includes(branch ?? '') if (productionMode) { Sentry.init({ - dsn: 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', + dsn: + 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', integrations: [new Integrations.BrowserTracing()], release, // Set tracesSampleRate to 1.0 to capture 100% diff --git a/mon-entreprise/test/real-rules.test.js b/mon-entreprise/test/real-rules.test.js index dffdb19f3..09ca149e1 100644 --- a/mon-entreprise/test/real-rules.test.js +++ b/mon-entreprise/test/real-rules.test.js @@ -13,8 +13,11 @@ let runExamples = (examples, rule) => const situation = Object.entries(ex.situation).reduce( (acc, [name, value]) => ({ ...acc, - [disambiguateRuleReference(engine.parsedRules, rule.dottedName, name)]: - value, + [disambiguateRuleReference( + engine.parsedRules, + rule.dottedName, + name + )]: value, }), {} ) diff --git a/publicodes/core/source/AST/index.ts b/publicodes/core/source/AST/index.ts index 4a1977cc9..b07baa71d 100644 --- a/publicodes/core/source/AST/index.ts +++ b/publicodes/core/source/AST/index.ts @@ -295,14 +295,16 @@ const traversePlancherNode: TraverseFunction<'plancher'> = (fn, node) => ({ }, }) -const traverseRésoudreRéférenceCirculaireNode: TraverseFunction<'résoudre référence circulaire'> = - (fn, node) => ({ - ...node, - explanation: { - ...node.explanation, - valeur: fn(node.explanation.valeur), - }, - }) +const traverseRésoudreRéférenceCirculaireNode: TraverseFunction<'résoudre référence circulaire'> = ( + fn, + node +) => ({ + ...node, + explanation: { + ...node.explanation, + valeur: fn(node.explanation.valeur), + }, +}) const traversePlafondNode: TraverseFunction<'plafond'> = (fn, node) => ({ ...node, diff --git a/publicodes/core/source/format.ts b/publicodes/core/source/format.ts index 8016f3c89..d54970a27 100644 --- a/publicodes/core/source/format.ts +++ b/publicodes/core/source/format.ts @@ -2,35 +2,33 @@ import { Evaluation, Unit } from './AST/types' import { simplifyNodeUnit } from './nodeUnits' import { formatUnit, serializeUnit } from './units' -export const numberFormatter = - ({ +export const numberFormatter = ({ + style, + maximumFractionDigits = 2, + minimumFractionDigits = 0, + language, +}: { + style?: string + maximumFractionDigits?: number + minimumFractionDigits?: number + language?: string +}) => (value: number) => { + // When we format currency we don't want to display a single decimal digit + // ie 8,1€ but we want to display 8,10€ + const adaptedMinimumFractionDigits = + style === 'currency' && + maximumFractionDigits >= 2 && + minimumFractionDigits === 0 && + !Number.isInteger(value) + ? 2 + : minimumFractionDigits + return Intl.NumberFormat(language, { style, - maximumFractionDigits = 2, - minimumFractionDigits = 0, - language, - }: { - style?: string - maximumFractionDigits?: number - minimumFractionDigits?: number - language?: string - }) => - (value: number) => { - // When we format currency we don't want to display a single decimal digit - // ie 8,1€ but we want to display 8,10€ - const adaptedMinimumFractionDigits = - style === 'currency' && - maximumFractionDigits >= 2 && - minimumFractionDigits === 0 && - !Number.isInteger(value) - ? 2 - : minimumFractionDigits - return Intl.NumberFormat(language, { - style, - currency: 'EUR', - maximumFractionDigits, - minimumFractionDigits: adaptedMinimumFractionDigits, - }).format(value) - } + currency: 'EUR', + maximumFractionDigits, + minimumFractionDigits: adaptedMinimumFractionDigits, + }).format(value) +} export const formatCurrency = ( nodeValue: number | undefined, @@ -170,10 +168,9 @@ export function serializeValue( { nodeValue, unit }: { nodeValue: Evaluation; unit?: Unit }, { format }: { format: formatUnit } ) { - const serializedUnit = ( - unit && typeof nodeValue === 'number' - ? serializeUnit(unit, nodeValue, format) - : '' + const serializedUnit = (unit && typeof nodeValue === 'number' + ? serializeUnit(unit, nodeValue, format) + : '' )?.replace(/\s*\/\s*/g, '/') return `${nodeValue} ${serializedUnit}`.trim() } diff --git a/publicodes/core/source/grammarFunctions.js b/publicodes/core/source/grammarFunctions.js index 0a812f9f6..043305909 100644 --- a/publicodes/core/source/grammarFunctions.js +++ b/publicodes/core/source/grammarFunctions.js @@ -2,23 +2,19 @@ The advantage of putting them here is to get prettier's JS formatting, since Nealrey doesn't support it https://github.com/kach/nearley/issues/310 */ import { normalizeDateString } from './date' -export let binaryOperation = - (operationType) => - ([A, , operator, , B]) => ({ - [operator]: { - operationType, - explanation: [A, B], - }, - }) +export let binaryOperation = (operationType) => ([A, , operator, , B]) => ({ + [operator]: { + operationType, + explanation: [A, B], + }, +}) -export let unaryOperation = - (operationType) => - ([operator, , A]) => ({ - [operator]: { - operationType, - explanation: [number([{ value: '0' }]), A], - }, - }) +export let unaryOperation = (operationType) => ([operator, , A]) => ({ + [operator]: { + operationType, + explanation: [number([{ value: '0' }]), A], + }, +}) export let variable = ([firstFragment, nextFragment], _, reject) => { const fragments = [firstFragment, ...nextFragment].map(({ value }) => value) diff --git a/publicodes/core/source/mecanisms/recalcul.ts b/publicodes/core/source/mecanisms/recalcul.ts index 1f7443b9b..bfcecf8f1 100644 --- a/publicodes/core/source/mecanisms/recalcul.ts +++ b/publicodes/core/source/mecanisms/recalcul.ts @@ -18,7 +18,7 @@ export type RecalculNode = { const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { if (this.cache._meta.inRecalcul) { - return defaultNode(null) as any as RecalculNode & EvaluatedNode + return (defaultNode(null) as any) as RecalculNode & EvaluatedNode } const amendedSituation = node.explanation.amendedSituation diff --git a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts index acfb823cf..240559222 100644 --- a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts +++ b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts @@ -14,83 +14,84 @@ export type RésoudreRéférenceCirculaireNode = { nodeKind: 'résoudre référence circulaire' } -export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoudre référence circulaire'> = - function (node) { - const originalCache = this.cache - let inversionNumberOfIterations = 0 +export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoudre référence circulaire'> = function ( + node +) { + const originalCache = this.cache + let inversionNumberOfIterations = 0 - const evaluateWithValue = ( - n: number, - unit: Unit = { numerators: [], denominators: [] } - ) => { - inversionNumberOfIterations++ - this.resetCache() + const evaluateWithValue = ( + n: number, + unit: Unit = { numerators: [], denominators: [] } + ) => { + inversionNumberOfIterations++ + this.resetCache() - this.parsedSituation[node.explanation.ruleToSolve] = { - unit: unit, - nodeKind: 'unité', - explanation: { - nodeKind: 'constant', - nodeValue: n, - type: 'number', - } as ConstantNode, - } as UnitéNode - return this.evaluate(node.explanation.valeur) - } - - let nodeValue: number | null | undefined = null - - const x0 = 0 - let valeur = evaluateWithValue(x0) - - const y0 = valeur.nodeValue as number - const unit = valeur.unit - const missingVariables = valeur.missingVariables - let i = 0 - if (y0 !== null) { - // The `uniroot` function parameter. It will be called with its `min` and - // `max` arguments, so we can use our cached nodes if the function is called - // with the already computed x1 or x2. - const test = (x: number): number => { - if (x === x0) { - return y0 - x0 - } - valeur = evaluateWithValue(x, unit) - const y = valeur.nodeValue - i++ - return (y as number) - x - } - - const defaultMin = -1_000_000 - const defaultMax = 100_000_000 - - nodeValue = uniroot(test, defaultMin, defaultMax, 0.5, 30, 2) - } - - this.cache = originalCache - - if (nodeValue === undefined) { - nodeValue = null - this.cache._meta.inversionFail = true - } - if (nodeValue !== null) { - valeur = evaluateWithValue(nodeValue, unit) - } - delete this.parsedSituation[node.explanation.ruleToSolve] - - return { - ...node, - unit, - nodeValue, + this.parsedSituation[node.explanation.ruleToSolve] = { + unit: unit, + nodeKind: 'unité', explanation: { - ...node.explanation, - valeur, - inversionNumberOfIterations, - }, - missingVariables, - } + nodeKind: 'constant', + nodeValue: n, + type: 'number', + } as ConstantNode, + } as UnitéNode + return this.evaluate(node.explanation.valeur) } + let nodeValue: number | null | undefined = null + + const x0 = 0 + let valeur = evaluateWithValue(x0) + + const y0 = valeur.nodeValue as number + const unit = valeur.unit + const missingVariables = valeur.missingVariables + let i = 0 + if (y0 !== null) { + // The `uniroot` function parameter. It will be called with its `min` and + // `max` arguments, so we can use our cached nodes if the function is called + // with the already computed x1 or x2. + const test = (x: number): number => { + if (x === x0) { + return y0 - x0 + } + valeur = evaluateWithValue(x, unit) + const y = valeur.nodeValue + i++ + return (y as number) - x + } + + const defaultMin = -1_000_000 + const defaultMax = 100_000_000 + + nodeValue = uniroot(test, defaultMin, defaultMax, 0.5, 30, 2) + } + + this.cache = originalCache + + if (nodeValue === undefined) { + nodeValue = null + this.cache._meta.inversionFail = true + } + if (nodeValue !== null) { + valeur = evaluateWithValue(nodeValue, unit) + } + delete this.parsedSituation[node.explanation.ruleToSolve] + + return { + ...node, + unit, + nodeValue, + explanation: { + ...node.explanation, + valeur, + inversionNumberOfIterations, + }, + missingVariables, + } +} + export default function parseRésoudreRéférenceCirculaire(v, context: Context) { return { explanation: { diff --git a/publicodes/core/source/units.ts b/publicodes/core/source/units.ts index 1e486a277..55e602370 100644 --- a/publicodes/core/source/units.ts +++ b/publicodes/core/source/units.ts @@ -101,12 +101,13 @@ const equals = (a: T, b: T) => { } } -export const removeOnce = - (element: T, eqFn: (a: T, b: T) => boolean = equals) => - (list: Array): Array => { - const index = list.findIndex((e) => eqFn(e, element)) - return list.filter((_, i) => i !== index) - } +export const removeOnce = ( + element: T, + eqFn: (a: T, b: T) => boolean = equals +) => (list: Array): Array => { + const index = list.findIndex((e) => eqFn(e, element)) + return list.filter((_, i) => i !== index) +} const simplify = ( unit: Unit, diff --git a/publicodes/site/entry.tsx b/publicodes/site/entry.tsx index b14af37bd..0fd9db88d 100644 --- a/publicodes/site/entry.tsx +++ b/publicodes/site/entry.tsx @@ -8,7 +8,8 @@ import 'regenerator-runtime/runtime' import App from './components/App' Sentry.init({ - dsn: 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', + dsn: + 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', integrations: [new Integrations.BrowserTracing()], // Set tracesSampleRate to 1.0 to capture 100% diff --git a/publicodes/ui-react/source/mecanisms/Replacement.tsx b/publicodes/ui-react/source/mecanisms/Replacement.tsx index 5922f2410..dd0247410 100644 --- a/publicodes/ui-react/source/mecanisms/Replacement.tsx +++ b/publicodes/ui-react/source/mecanisms/Replacement.tsx @@ -2,9 +2,8 @@ import { VariationNode } from 'publicodes/source/mecanisms/variations' import Explanation from '../Explanation' export default function Replacement(node: VariationNode) { - const applicableReplacement = node.explanation.find( - (ex) => ex.satisfied - )?.consequence + const applicableReplacement = node.explanation.find((ex) => ex.satisfied) + ?.consequence const replacedNode = node.explanation.slice(-1)[0].consequence return } From 822a460a75eee55e9e81c4bade5602d031fb8058 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 26 Aug 2021 13:14:16 +0200 Subject: [PATCH 268/319] =?UTF-8?q?:racehorse:=20utilise=20les=20polices?= =?UTF-8?q?=20syst=C3=A8me=20en=20attendant=20le=20chargement=20des=20poli?= =?UTF-8?q?ces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/components/ui/Fonts.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mon-entreprise/source/components/ui/Fonts.css b/mon-entreprise/source/components/ui/Fonts.css index 1e94f39f7..f1d97215c 100644 --- a/mon-entreprise/source/components/ui/Fonts.css +++ b/mon-entreprise/source/components/ui/Fonts.css @@ -7,6 +7,7 @@ url('/fonts/roboto-v20-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ url('/fonts/roboto-v20-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + font-display: swap; } /* roboto-italic - latin */ @@ -18,6 +19,7 @@ url('/fonts/roboto-v20-latin-italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ url('/fonts/roboto-v20-latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + font-display: swap; } /* roboto-500 - latin */ @@ -29,6 +31,7 @@ url('/fonts/roboto-v20-latin-500.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ url('/fonts/roboto-v20-latin-500.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + font-display: swap; } /* montserrat-600 - latin */ @@ -40,4 +43,5 @@ url('/fonts/montserrat-v15-latin-600.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ url('/fonts/montserrat-v15-latin-600.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + font-display: swap; } From 3354861543b609192331203113225bdf24dad564 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 26 Aug 2021 16:06:37 +0200 Subject: [PATCH 269/319] =?UTF-8?q?:fire:=20Utilise=20un=20context=20react?= =?UTF-8?q?=20pour=20d=C3=A9sactiver=20les=20animations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/Provider.tsx | 21 +- mon-entreprise/source/components/Banner.tsx | 6 +- mon-entreprise/source/components/BarChart.tsx | 13 +- .../source/components/Distribution.tsx | 12 +- .../components/ExportSimulationBanner.tsx | 22 +- .../source/components/NewsletterRegister.tsx | 6 +- .../source/components/Notifications.tsx | 6 +- mon-entreprise/source/components/Overlay.tsx | 6 +- .../source/components/SchemeComparaison.tsx | 6 +- .../components/ShareSimulationBanner.tsx | 6 +- .../source/components/Simulation.tsx | 15 +- .../source/components/SimulationGoals.tsx | 8 +- .../source/components/StackedBarChart.tsx | 21 +- .../source/components/TargetSelection.tsx | 18 +- .../components/conversation/Conversation.tsx | 6 +- .../conversation/select/SelectCommune.tsx | 5 +- .../IndépendantCotisationsForfaitaires.tsx | 6 +- .../IndépendantCotisationsRégularisation.tsx | 6 +- .../IndépendantExplanation.tsx | 13 +- .../simulationExplanation/PLExplanation.tsx | 5 +- .../SalaryExplanation.tsx | 27 +-- .../source/components/ui/Checklist/index.tsx | 6 +- .../source/components/ui/animate.tsx | 195 ++++++++---------- mon-entreprise/source/components/ui/index.css | 6 +- .../utils/DisableAnimationContext.tsx | 30 +++ .../components/utils/embeddedContext.ts | 2 - ...embeddedContext.js => embeddedContext.tsx} | 0 .../source/pages/Créer/AfterRegistration.tsx | 6 +- .../source/pages/Créer/CreationChecklist.tsx | 6 +- .../source/pages/Créer/GuideStatut/index.tsx | 6 +- mon-entreprise/source/pages/Créer/Home.tsx | 6 +- mon-entreprise/source/pages/Documentation.tsx | 6 +- .../AideDéclarationIndépendant/Fields.tsx | 6 +- .../RésultatSimple.tsx | 10 +- .../RésultatsParFormulaire.tsx | 14 +- .../AideDéclarationIndépendant/index.tsx | 10 +- .../source/pages/Gérer/AideOrganismeLocal.tsx | 6 +- .../pages/Gérer/DemandeMobilite/index.tsx | 10 +- .../source/pages/Gérer/Embaucher.tsx | 8 +- mon-entreprise/source/pages/Gérer/Home.tsx | 6 +- .../source/pages/Gérer/SécuritéSociale.tsx | 6 +- .../pages/Simulateurs/AidesEmbauche.tsx | 6 +- .../pages/Simulateurs/ArtisteAuteur.tsx | 30 +-- .../pages/Simulateurs/AutoEntrepreneur.tsx | 18 +- .../pages/Simulateurs/ChômagePartiel.tsx | 11 +- .../source/pages/Simulateurs/ImpôtSociété.tsx | 6 +- .../source/pages/Simulateurs/Indépendant.tsx | 51 +---- .../source/pages/Simulateurs/Salarié.tsx | 10 +- .../source/pages/Simulateurs/metadata.tsx | 57 ++--- .../ÉconomieCollaborative/Activité.tsx | 10 +- .../ActivitésSelection.tsx | 6 +- .../ÉconomieCollaborative/VotreSituation.tsx | 6 +- .../pages/Stats/DemandesUtilisateurs.tsx | 6 +- 53 files changed, 312 insertions(+), 484 deletions(-) create mode 100644 mon-entreprise/source/components/utils/DisableAnimationContext.tsx delete mode 100644 mon-entreprise/source/components/utils/embeddedContext.ts rename mon-entreprise/source/components/utils/{embeddedContext.js => embeddedContext.tsx} (100%) diff --git a/mon-entreprise/source/Provider.tsx b/mon-entreprise/source/Provider.tsx index 2011229a8..d7da3f937 100644 --- a/mon-entreprise/source/Provider.tsx +++ b/mon-entreprise/source/Provider.tsx @@ -1,5 +1,6 @@ import { ErrorBoundary } from '@sentry/react' import { ThemeColorsProvider } from 'Components/utils/colors' +import { DisableAnimationOnPrintProvider } from 'Components/utils/DisableAnimationContext' import { SitePathProvider, SitePaths } from 'Components/utils/SitePathsContext' import { createBrowserHistory } from 'history' import i18next from 'i18next' @@ -155,15 +156,17 @@ export default function Provider({ }) } > - - - - - <>{children} - - - - + + + + + + <>{children} + + + + + diff --git a/mon-entreprise/source/components/Banner.tsx b/mon-entreprise/source/components/Banner.tsx index 1aba75427..ed08adc6c 100644 --- a/mon-entreprise/source/components/Banner.tsx +++ b/mon-entreprise/source/components/Banner.tsx @@ -2,8 +2,8 @@ import React from 'react' import emoji from 'react-easy-emoji' import { useSelector } from 'react-redux' import { firstStepCompletedSelector } from 'Selectors/simulationSelectors' -import Animate from 'Components/ui/animate' import './Banner.css' +import { FadeIn } from './ui/animate' type BannerProps = { children: React.ReactNode @@ -24,11 +24,11 @@ export default function Banner({ const hidden = hiddenProp || (hideAfterFirstStep && hiddenState) return !hidden ? ( - +
    {icon && emoji(icon)}
    {children}
    -
    + ) : null } diff --git a/mon-entreprise/source/components/BarChart.tsx b/mon-entreprise/source/components/BarChart.tsx index 133d3e0cf..d836b9569 100644 --- a/mon-entreprise/source/components/BarChart.tsx +++ b/mon-entreprise/source/components/BarChart.tsx @@ -1,10 +1,11 @@ -import React, { useContext, useState } from 'react' -import emoji from 'react-easy-emoji' -import { animated, config, useSpring } from 'react-spring' -import useDisplayOnIntersecting from 'Components/utils/useDisplayOnIntersecting' import { ThemeColorsContext } from 'Components/utils/colors' +import useDisplayOnIntersecting from 'Components/utils/useDisplayOnIntersecting' import { formatValue } from 'publicodes' +import React, { useContext } from 'react' +import emoji from 'react-easy-emoji' import { useTranslation } from 'react-i18next' +import { animated, config, useSpring } from 'react-spring' +import { DisableAnimationContext } from './utils/DisableAnimationContext' const ANIMATION_SPRING = config.gentle @@ -51,7 +52,6 @@ type BarChartBranchProps = { maximum: number description?: string unit?: string - disableAnimation: boolean } export default function BarChartBranch({ @@ -61,7 +61,6 @@ export default function BarChartBranch({ maximum, description, unit, - disableAnimation, }: BarChartBranchProps) { const [intersectionRef, brancheInViewport] = useDisplayOnIntersecting({ threshold: 0.5, @@ -75,7 +74,7 @@ export default function BarChartBranch({ }, }) as { flex: number; opacity: number } // TODO: problème avec les types de react-spring ? - return !disableAnimation ? ( + return !useContext(DisableAnimationContext) ? ( ))}

    - + ) } diff --git a/mon-entreprise/source/components/Notifications.tsx b/mon-entreprise/source/components/Notifications.tsx index bd7291d59..ca12570e8 100644 --- a/mon-entreprise/source/components/Notifications.tsx +++ b/mon-entreprise/source/components/Notifications.tsx @@ -1,5 +1,4 @@ import { hideNotification } from 'Actions/actions' -import animate from 'Components/ui/animate' import { useEngine, useInversionFail } from 'Components/utils/EngineContext' import { DottedName } from 'modele-social' import Engine, { RuleNode } from 'publicodes' @@ -9,6 +8,7 @@ import { useDispatch, useSelector } from 'react-redux' import { RootState } from 'Reducers/rootReducer' import './Notifications.css' import RuleLink from './RuleLink' +import { FromTop } from './ui/animate' import { Markdown } from './utils/markdown' import { ScrollToElement } from './utils/Scroll' @@ -65,7 +65,7 @@ export default function Notifications() {
      {messages.map(({ sévérité, dottedName, résumé, description }) => hiddenNotifications?.includes(dottedName) ? null : ( - +
    • {emoji(sévérité == 'avertissement' ? '⚠️' : '💁🏻')} @@ -87,7 +87,7 @@ export default function Notifications() {
    • -
      + ) )}
    diff --git a/mon-entreprise/source/components/Overlay.tsx b/mon-entreprise/source/components/Overlay.tsx index 12b735f9d..ca7393c39 100644 --- a/mon-entreprise/source/components/Overlay.tsx +++ b/mon-entreprise/source/components/Overlay.tsx @@ -1,8 +1,8 @@ -import * as animate from 'Components/ui/animate' import FocusTrap from 'focus-trap-react' import { PageInfo } from 'iframe-resizer' import React, { useEffect, useState } from 'react' import styled, { css } from 'styled-components' +import { FromBottom } from './ui/animate' type OverlayProps = React.HTMLAttributes & { onClose?: () => void @@ -46,7 +46,7 @@ export default function Overlay({ return (
    - + - +
    ) diff --git a/mon-entreprise/source/components/SchemeComparaison.tsx b/mon-entreprise/source/components/SchemeComparaison.tsx index bb38bf6e3..f17d70ee5 100644 --- a/mon-entreprise/source/components/SchemeComparaison.tsx +++ b/mon-entreprise/source/components/SchemeComparaison.tsx @@ -6,7 +6,6 @@ import { import classnames from 'classnames' import Conversation from 'Components/conversation/Conversation' import Value from 'Components/EngineValue' -import * as Animate from 'Components/ui/animate' import InfoBulle from 'Components/ui/InfoBulle' import revenusSVG from 'Images/revenus.svg' import { useCallback, useMemo, useState } from 'react' @@ -19,6 +18,7 @@ import SeeAnswersButton from './conversation/SeeAnswersButton' import PeriodSwitch from './PeriodSwitch' import './SchemeComparaison.css' import { SimulationGoal, SimulationGoals } from './SimulationGoals' +import { FromBottom } from './ui/animate' import { useEngine } from './utils/EngineContext' import useSimulationConfig from './utils/useSimulationConfig' @@ -342,7 +342,7 @@ export default function SchemeComparaison({ {displayResult && ( - +
    -
    + )} )} diff --git a/mon-entreprise/source/components/ShareSimulationBanner.tsx b/mon-entreprise/source/components/ShareSimulationBanner.tsx index c22984f7b..099213016 100644 --- a/mon-entreprise/source/components/ShareSimulationBanner.tsx +++ b/mon-entreprise/source/components/ShareSimulationBanner.tsx @@ -1,4 +1,3 @@ -import Animate from 'Components/ui/animate' import { LinkButton } from 'Components/ui/Button' import React, { useContext, useEffect, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' @@ -6,6 +5,7 @@ import { useSelector } from 'react-redux' import { situationSelector } from 'Selectors/simulationSelectors' import { TrackingContext } from '../ATInternetTracking' import Banner from './Banner' +import { FromTop } from './ui/animate' import { useParamsFromSituation } from './utils/useSearchParamsSimulationSharing' export function useUrl() { @@ -52,7 +52,7 @@ export default function ShareSimulationBanner() { className="ui__ print-display-none" > {opened ? ( - +
    -
    + ) : ( Pour partager cette simulation :{' '} diff --git a/mon-entreprise/source/components/Simulation.tsx b/mon-entreprise/source/components/Simulation.tsx index ccc89c2be..9105fded6 100644 --- a/mon-entreprise/source/components/Simulation.tsx +++ b/mon-entreprise/source/components/Simulation.tsx @@ -6,7 +6,6 @@ import PageFeedback from 'Components/Feedback' import SearchButton from 'Components/SearchButton' import ShareSimulationBanner from 'Components/ShareSimulationBanner' import TargetSelection from 'Components/TargetSelection' -import * as Animate from 'Components/ui/animate' import Progress from 'Components/ui/Progress' import { useSimulationProgress } from 'Components/utils/useNextQuestion' import React from 'react' @@ -15,6 +14,7 @@ import { useSelector } from 'react-redux' import { firstStepCompletedSelector } from 'Selectors/simulationSelectors' import { TrackPage } from '../ATInternetTracking' import SeeAnswersButton from './conversation/SeeAnswersButton' +import { FromTop } from './ui/animate' type SimulationProps = { explanations?: React.ReactNode @@ -22,8 +22,6 @@ type SimulationProps = { children?: React.ReactNode customEndMessages?: ConversationProps['customEndMessages'] showPeriodSwitch?: boolean - userWillExport: () => void - disableAnimation: boolean } export default function Simulation({ @@ -32,8 +30,6 @@ export default function Simulation({ children, customEndMessages, showPeriodSwitch, - userWillExport, - disableAnimation, }: SimulationProps) { const firstStepCompleted = useSelector(firstStepCompletedSelector) @@ -48,13 +44,10 @@ export default function Simulation({ {!firstStepCompleted && } {firstStepCompleted && ( <> - + {results} - +
    @@ -98,7 +91,7 @@ export default function Simulation({
    -
    + )} diff --git a/mon-entreprise/source/components/SimulationGoals.tsx b/mon-entreprise/source/components/SimulationGoals.tsx index 871f4f602..d3a7fc3a1 100644 --- a/mon-entreprise/source/components/SimulationGoals.tsx +++ b/mon-entreprise/source/components/SimulationGoals.tsx @@ -1,6 +1,5 @@ import { updateSituation } from 'Actions/actions' import classnames from 'classnames' -import Animate from 'Components/ui/animate' import { DottedName } from 'modele-social' import { formatValue, UNSAFE_isNotApplicable } from 'publicodes' import { @@ -19,6 +18,7 @@ import { } from 'Selectors/simulationSelectors' import RuleInput, { InputProps } from './conversation/RuleInput' import RuleLink from './RuleLink' +import { Appear } from './ui/animate' import AnimatedTargetValue from './ui/AnimatedTargetValue' import { useEngine } from './utils/EngineContext' @@ -100,7 +100,7 @@ export function SimulationGoal({ dispatch(updateSituation(dottedName, x)) onUpdateSituation?.(dottedName, x) }, - [dispatch, onUpdateSituation] + [dispatch, onUpdateSituation, dottedName] ) if ( !alwaysShow && @@ -122,7 +122,7 @@ export function SimulationGoal({ } return (
  • - +
    -
    +
  • ) } diff --git a/mon-entreprise/source/components/StackedBarChart.tsx b/mon-entreprise/source/components/StackedBarChart.tsx index 8c4687ba7..3c5d0570f 100644 --- a/mon-entreprise/source/components/StackedBarChart.tsx +++ b/mon-entreprise/source/components/StackedBarChart.tsx @@ -2,11 +2,12 @@ import RuleLink from 'Components/RuleLink' import useDisplayOnIntersecting from 'Components/utils/useDisplayOnIntersecting' import { Names } from 'modele-social/dist/names' import { EvaluatedNode } from 'publicodes' -import React from 'react' +import React, { useContext } from 'react' import { useSelector } from 'react-redux' import { animated, useSpring } from 'react-spring' import { targetUnitSelector } from 'Selectors/simulationSelectors' import styled from 'styled-components' +import { DisableAnimationContext } from './utils/DisableAnimationContext' import { useEngine } from './utils/EngineContext' const BarStack = styled.div` @@ -83,20 +84,13 @@ export function roundedPercentages(values: Array) { ) } -type StackedBarChartProps = InnerStackedBarChartProps & { - disableAnimation: boolean -} - -export function StackedBarChart({ - data, - disableAnimation, -}: StackedBarChartProps) { +export function StackedBarChart({ data }: InnerStackedBarChartProps) { const [intersectionRef, displayChart] = useDisplayOnIntersecting({ threshold: 0.5, }) const styles = useSpring({ opacity: displayChart ? 1 : 0 }) - return !disableAnimation ? ( + return !useContext(DisableAnimationContext) ? ( @@ -154,13 +148,9 @@ function InnerStackedBarChart({ data }: InnerStackedBarChartProps) { type StackedRulesChartProps = { data: Array<{ color?: string; dottedName: Names; title?: string }> - disableAnimation: boolean } -export default function StackedRulesChart({ - data, - disableAnimation, -}: StackedRulesChartProps) { +export default function StackedRulesChart({ data }: StackedRulesChartProps) { const engine = useEngine() const targetUnit = useSelector(targetUnitSelector) return ( @@ -172,7 +162,6 @@ export default function StackedRulesChart({ legend: {title}, color, }))} - disableAnimation={disableAnimation} /> ) } diff --git a/mon-entreprise/source/components/TargetSelection.tsx b/mon-entreprise/source/components/TargetSelection.tsx index ae65eccaa..6ed48ec56 100644 --- a/mon-entreprise/source/components/TargetSelection.tsx +++ b/mon-entreprise/source/components/TargetSelection.tsx @@ -3,7 +3,6 @@ import classnames from 'classnames' import Value, { Condition } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import RuleLink from 'Components/RuleLink' -import Animate from 'Components/ui/animate' import AnimatedTargetValue from 'Components/ui/AnimatedTargetValue' import { ThemeColorsContext } from 'Components/utils/colors' import { @@ -34,6 +33,7 @@ import { import InputSuggestions from './conversation/InputSuggestions' import CurrencyInput from './CurrencyInput/CurrencyInput' import './TargetSelection.css' +import { Appear, FromTop } from './ui/animate' export default function TargetSelection({ showPeriodSwitch = true }) { const objectifs = useSelector( @@ -109,7 +109,7 @@ const Target = ({ dottedName }: TargetProps) => { key={target.dottedName} className={isSmallTarget ? 'small-target' : undefined} > - +
    @@ -122,7 +122,7 @@ const Target = ({ dottedName }: TargetProps) => { />
    -
    + ) } @@ -243,14 +243,14 @@ function TargetInputOrValue({ {(isActive || isFocused) && (
    - +
    -
    +
    )} @@ -262,7 +262,7 @@ function TitreRestaurant() { 'contrat salarié . frais professionnels . titres-restaurant . montant' return ( 0`}> - +
    +{' '} @@ -276,7 +276,7 @@ function TitreRestaurant() { en titres-restaurant {emoji(' 🍽')}
    -
    +
    ) } @@ -307,7 +307,7 @@ function AidesGlimpse() { ) return ( 0`}> - +
    en incluant{' '} @@ -321,7 +321,7 @@ function AidesGlimpse() { d'aides {emoji(aides.rawNode.icônes ?? '')}
    -
    +
    ) } diff --git a/mon-entreprise/source/components/conversation/Conversation.tsx b/mon-entreprise/source/components/conversation/Conversation.tsx index 8a716aa69..c28fa3a56 100644 --- a/mon-entreprise/source/components/conversation/Conversation.tsx +++ b/mon-entreprise/source/components/conversation/Conversation.tsx @@ -2,7 +2,7 @@ import { goToQuestion, stepAction, updateSituation } from 'Actions/actions' import RuleInput from 'Components/conversation/RuleInput' import Notifications from 'Components/Notifications' import QuickLinks from 'Components/QuickLinks' -import * as Animate from 'Components/ui/animate' +import { FadeIn } from 'Components/ui/animate' import { EngineContext } from 'Components/utils/EngineContext' import { useNextQuestions } from 'Components/utils/useNextQuestion' import { PublicodesExpression } from 'publicodes' @@ -63,7 +63,7 @@ export default function Conversation({ customEndMessages }: ConversationProps) { )}
    - +

    {engine.getRule(currentQuestion).rawNode.question} @@ -80,7 +80,7 @@ export default function Conversation({ customEndMessages }: ConversationProps) { />

    -
    +
    {previousAnswers.length > 0 && ( diff --git a/mon-entreprise/source/components/conversation/select/SelectCommune.tsx b/mon-entreprise/source/components/conversation/select/SelectCommune.tsx index 8d9ee010d..bdc5cf276 100644 --- a/mon-entreprise/source/components/conversation/select/SelectCommune.tsx +++ b/mon-entreprise/source/components/conversation/select/SelectCommune.tsx @@ -1,4 +1,3 @@ -import * as Animate from 'Components/ui/animate' import React, { useCallback, useMemo, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import styled, { css } from 'styled-components' @@ -210,7 +209,7 @@ export default function Select({ onChange, value, id, missing }: InputProps) { )} {!!searchResults && ( - +
      - + )}
    ) diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaires.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaires.tsx index 1b1e19d49..551d9785d 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaires.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsForfaitaires.tsx @@ -1,5 +1,5 @@ import Value from 'Components/EngineValue' -import * as Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import Emoji from 'Components/utils/Emoji' import { useEngine } from 'Components/utils/EngineContext' import { Markdown } from 'Components/utils/markdown' @@ -10,7 +10,7 @@ export default function CotisationsForfaitaires() { 'dirigeant . indépendant . cotisations et contributions . début activité' ) return ( - +

    {rule.title}

    @@ -41,6 +41,6 @@ export default function CotisationsForfaitaires() {

    )}
    -
    + ) } diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsRégularisation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsRégularisation.tsx index 9c91ad1a9..522eb54fe 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsRégularisation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantCotisationsRégularisation.tsx @@ -1,4 +1,4 @@ -import * as Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import Emoji from 'Components/utils/Emoji' import { useEngine } from 'Components/utils/EngineContext' import { Markdown } from 'Components/utils/markdown' @@ -9,7 +9,7 @@ export default function CotisationsRégularisation() { 'dirigeant . indépendant . cotisations et contributions . régularisation' ) return ( - +
    )}
    -
    + ) } diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 9a52c3ce3..46ca70671 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -20,13 +20,7 @@ import CotisationsRégularisation from './IndépendantCotisationsRégularisation import PLExplanation from './PLExplanation' import { DistributionSection } from './SalaryExplanation' -interface IndépendantExplanationProps { - disableAnimation: boolean -} - -export default function IndépendantExplanation({ - disableAnimation, -}: IndépendantExplanationProps) { +export default function IndépendantExplanation() { const { t } = useTranslation() const { palettes } = useContext(ThemeColorsContext) @@ -45,7 +39,6 @@ export default function IndépendantExplanation({

    Répartition du revenu

    - - + + ) diff --git a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx index d242fc5f8..619967022 100644 --- a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx @@ -1,5 +1,4 @@ import Value, { Condition } from 'Components/EngineValue' -import * as Animate from 'Components/ui/animate' import Emoji from 'Components/utils/Emoji' import { useEngine } from 'Components/utils/EngineContext' import assuranceMaladieSrc from 'Images/assurance-maladie.svg' @@ -16,7 +15,7 @@ export default function PLExplanation() { return (
    - +

    Vos institutions partenaires

    @@ -52,7 +51,7 @@ export default function PLExplanation() { compte l'exonération de début d'activité ACRE

    - +
    ) diff --git a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx index 25e4d0bb9..a917b59fa 100644 --- a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx @@ -1,7 +1,7 @@ import Distribution from 'Components/Distribution' import PaySlip from 'Components/PaySlip' import StackedBarChart from 'Components/StackedBarChart' -import * as Animate from 'Components/ui/animate' +import { FromTop } from 'Components/ui/animate' import { ThemeColorsContext } from 'Components/utils/colors' import Emoji from 'Components/utils/Emoji' import { useInversionFail } from 'Components/utils/EngineContext' @@ -9,13 +9,7 @@ import { useContext, useRef } from 'react' import emoji from 'react-easy-emoji' import { Trans, useTranslation } from 'react-i18next' -interface SalaryExplanationProps { - disableAnimation: boolean -} - -export default function SalaryExplanation({ - disableAnimation, -}: SalaryExplanationProps) { +export default function SalaryExplanation() { const payslipRef = useRef(null) if (useInversionFail()) { @@ -23,7 +17,7 @@ export default function SalaryExplanation({ } return ( - + payslipRef.current?.scrollIntoView({ @@ -31,10 +25,9 @@ export default function SalaryExplanation({ block: 'start', }) } - disableAnimation={disableAnimation} /> - +
    @@ -59,14 +52,11 @@ export default function SalaryExplanation({ aides-entreprises.fr.

    -
    + ) } -function RevenueRepartitionSection(props: { - onSeePayslip: () => void - disableAnimation: boolean -}) { +function RevenueRepartitionSection(props: { onSeePayslip: () => void }) { const { t } = useTranslation() const { palettes } = useContext(ThemeColorsContext) @@ -111,7 +101,6 @@ function RevenueRepartitionSection(props: { color: palettes[1][1], }, ]} - disableAnimation={props.disableAnimation} />
    ) @@ -129,10 +118,8 @@ function PaySlipSection() { } export const DistributionSection = ({ - disableAnimation, - children = , + children = , }: { - disableAnimation: boolean children?: React.ReactNode }) => (
    diff --git a/mon-entreprise/source/components/ui/Checklist/index.tsx b/mon-entreprise/source/components/ui/Checklist/index.tsx index 8169cf1a1..ab8900619 100644 --- a/mon-entreprise/source/components/ui/Checklist/index.tsx +++ b/mon-entreprise/source/components/ui/Checklist/index.tsx @@ -1,8 +1,8 @@ import classnames from 'classnames' -import Animate from 'Components/ui/animate' import { Markdown } from 'Components/utils/markdown' import { ScrollToElement } from 'Components/utils/Scroll' import React, { useEffect, useState } from 'react' +import { Appear } from '../animate' import Checkbox from '../Checkbox' import './index.css' @@ -55,7 +55,7 @@ export function CheckItem({
    {displayExplanations && explanations && ( - + {typeof explanations === 'string' ? ( + )} ) diff --git a/mon-entreprise/source/components/ui/animate.tsx b/mon-entreprise/source/components/ui/animate.tsx index b685e6c82..ba8fd181a 100644 --- a/mon-entreprise/source/components/ui/animate.tsx +++ b/mon-entreprise/source/components/ui/animate.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState } from 'react' +import { DisableAnimationContext } from 'Components/utils/DisableAnimationContext' +import React, { useContext, useEffect, useState } from 'react' import { animated, config as configPresets, @@ -6,7 +7,6 @@ import { Spring, SpringConfig, Trail, - Transition, } from 'react-spring/renderprops' type Props = { @@ -18,115 +18,98 @@ type Props = { } // Todo : better animate with fromRight on desktop -export const fromBottom = ({ +export function FromBottom({ children, config = configPresets.stiff, style: inheritedStyle = {}, delay = 0, -}: Props) => ( - i) ?? []} - native={true} - delay={delay} - config={config} - from={{ opacity: 0, y: 10 }} - to={{ opacity: 1, y: 0 }} - items={children} - > - {(item) => ({ y, ...style }) => ( - - y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' - ), - ...style, - ...inheritedStyle, - }} - > - {item} - - )} - -) -export const fromTop = ({ +}: Props) { + if (useContext(DisableAnimationContext)) { + return <>{children} + } + return ( + i) ?? []} + native={true} + delay={delay} + config={config} + from={{ opacity: 0, y: 10 }} + to={{ opacity: 1, y: 0 }} + items={children} + > + {(item) => ({ y, ...style }) => ( + + y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' + ), + ...style, + ...inheritedStyle, + }} + > + {item} + + )} + + ) +} +export function FromTop({ children, config = configPresets.stiff, style: inheritedStyle = {}, delay = 0, -}: Props) => ( - i) ?? []} - native={true} - delay={delay} - config={config} - from={{ opacity: 0, y: -20 }} - to={{ opacity: 1, y: 0 }} - items={children} - > - {(item) => ({ y, ...style }) => ( - - y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' - ), - ...style, - ...inheritedStyle, - }} - > - {item} - - )} - -) - -export const leftToRight = ({ - children, - config = configPresets.stiff, - delay = 0, -}: Props) => ( - - {(item) => (style) => {item}} - -) - -export const fadeIn = ({ +}: Props) { + if (useContext(DisableAnimationContext)) { + return <>{children} + } + return ( + i) ?? []} + native={true} + delay={delay} + config={config} + from={{ opacity: 0, y: -20 }} + to={{ opacity: 1, y: 0 }} + items={children} + > + {(item) => ({ y, ...style }) => ( + + y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' + ), + ...style, + ...inheritedStyle, + }} + > + {item} + + )} + + ) +} +export const FadeIn = ({ children, config = configPresets.default, delay = 0, -}: Props) => ( - - {(style) => {children}} - -) +}: Props) => + useContext(DisableAnimationContext) ? ( + <>{children} + ) : ( + + {(style) => {children}} + + ) -export function appear({ +export function Appear({ children, className, unless = false, @@ -134,13 +117,13 @@ export function appear({ delay = 0, style, }: Props & { unless?: boolean }) { - // TODO: We should rename this function Appear - // eslint-disable-next-line react-hooks/rules-of-hooks const [show, setShow] = useState(unless) - // eslint-disable-next-line react-hooks/rules-of-hooks useEffect(() => { window.setTimeout(() => setShow(true), 0) }, []) + if (useContext(DisableAnimationContext)) { + return <>{children} + } return ( ) } - -export default { - appear, - fromBottom, - leftToRight, - fromTop, - fadeIn, -} diff --git a/mon-entreprise/source/components/ui/index.css b/mon-entreprise/source/components/ui/index.css index 329c272a1..9129833b1 100644 --- a/mon-entreprise/source/components/ui/index.css +++ b/mon-entreprise/source/components/ui/index.css @@ -215,16 +215,16 @@ input.ui__::placeholder { } @media print { - .ui__ print-display-none { + .ui__.print-display-none { display: none !important; } - .print-break-avoid { + .ui__.print-break-avoid { page-break-inside: avoid; break-inside: avoid; } - .print-background-force { + .ui__.print-background-force { color-adjust: exact !important; -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; diff --git a/mon-entreprise/source/components/utils/DisableAnimationContext.tsx b/mon-entreprise/source/components/utils/DisableAnimationContext.tsx new file mode 100644 index 000000000..5b91e3387 --- /dev/null +++ b/mon-entreprise/source/components/utils/DisableAnimationContext.tsx @@ -0,0 +1,30 @@ +import React, { createContext, useCallback, useEffect, useState } from 'react' +export const DisableAnimationContext = createContext(false) + +export function DisableAnimationOnPrintProvider({ + children, +}: { + children: React.ReactNode +}) { + const [isPrintContext, setPrintContext] = useState(false) + const onPrintContextChange = useCallback( + (matchMedia: MediaQueryListEvent | MediaQueryList) => { + setPrintContext(matchMedia.matches) + }, + [setPrintContext] + ) + useEffect(() => { + const matchMediaPrint = window.matchMedia('print') + onPrintContextChange(matchMediaPrint) + matchMediaPrint.addEventListener('change', onPrintContextChange) + return () => { + matchMediaPrint.removeEventListener('change', onPrintContextChange) + } + }, [onPrintContextChange]) + + return ( + + {children} + + ) +} diff --git a/mon-entreprise/source/components/utils/embeddedContext.ts b/mon-entreprise/source/components/utils/embeddedContext.ts deleted file mode 100644 index aa0c62217..000000000 --- a/mon-entreprise/source/components/utils/embeddedContext.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { createContext } from 'react' -export const IsEmbeddedContext = createContext(false) diff --git a/mon-entreprise/source/components/utils/embeddedContext.js b/mon-entreprise/source/components/utils/embeddedContext.tsx similarity index 100% rename from mon-entreprise/source/components/utils/embeddedContext.js rename to mon-entreprise/source/components/utils/embeddedContext.tsx diff --git a/mon-entreprise/source/pages/Créer/AfterRegistration.tsx b/mon-entreprise/source/pages/Créer/AfterRegistration.tsx index 61ff7446e..912111536 100644 --- a/mon-entreprise/source/pages/Créer/AfterRegistration.tsx +++ b/mon-entreprise/source/pages/Créer/AfterRegistration.tsx @@ -1,4 +1,4 @@ -import Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { ScrollToTop } from 'Components/utils/Scroll' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext } from 'react' @@ -18,7 +18,7 @@ export default function AfterRegistration() { const isAutoentrepreneur = statutChoisi?.match('auto-entrepreneur') return ( - +
    @@ -116,6 +116,6 @@ export default function AfterRegistration() { d'équipement professionnel auprès de fournisseurs, etc.

    - + ) } diff --git a/mon-entreprise/source/pages/Créer/CreationChecklist.tsx b/mon-entreprise/source/pages/Créer/CreationChecklist.tsx index aa73855dc..6167ac806 100644 --- a/mon-entreprise/source/pages/Créer/CreationChecklist.tsx +++ b/mon-entreprise/source/pages/Créer/CreationChecklist.tsx @@ -3,7 +3,7 @@ import { initializeCompanyCreationChecklist, } from 'Actions/companyCreationChecklistActions' import { resetCompanyStatusChoice } from 'Actions/companyStatusActions' -import * as Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { CheckItem, Checklist } from 'Components/ui/Checklist' import Scroll from 'Components/utils/Scroll' import { SitePathsContext } from 'Components/utils/SitePathsContext' @@ -51,7 +51,7 @@ export default function CreateCompany({ statut }: CreateCompanyProps) { }) return ( - + {titre} @@ -565,7 +565,7 @@ export default function CreateCompany({ statut }: CreateCompanyProps) { )}
    -
    + ) } diff --git a/mon-entreprise/source/pages/Créer/GuideStatut/index.tsx b/mon-entreprise/source/pages/Créer/GuideStatut/index.tsx index 7ff5b4fda..2e4c0ad8c 100644 --- a/mon-entreprise/source/pages/Créer/GuideStatut/index.tsx +++ b/mon-entreprise/source/pages/Créer/GuideStatut/index.tsx @@ -1,5 +1,5 @@ import { resetCompanyStatusChoice } from 'Actions/companyStatusActions' -import Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { dropWhile, toPairs } from 'ramda' import { useContext, useEffect } from 'react' @@ -63,7 +63,7 @@ export default function Créer() { Choix du statut juridique - + @@ -84,7 +84,7 @@ export default function Créer() { - + ) } diff --git a/mon-entreprise/source/pages/Créer/Home.tsx b/mon-entreprise/source/pages/Créer/Home.tsx index 7a05fe551..d9c71b7a2 100644 --- a/mon-entreprise/source/pages/Créer/Home.tsx +++ b/mon-entreprise/source/pages/Créer/Home.tsx @@ -1,5 +1,5 @@ import PageHeader from 'Components/PageHeader' -import Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext } from 'react' import { Helmet } from 'react-helmet' @@ -20,7 +20,7 @@ export default function Créer() { !!Object.keys(state.inFranceApp.companyLegalStatus).length ) return ( - + @@ -102,6 +102,6 @@ export default function Créer() {
    - + ) } diff --git a/mon-entreprise/source/pages/Documentation.tsx b/mon-entreprise/source/pages/Documentation.tsx index 5b4dc87d7..44117b18c 100644 --- a/mon-entreprise/source/pages/Documentation.tsx +++ b/mon-entreprise/source/pages/Documentation.tsx @@ -1,6 +1,6 @@ import SearchBar from 'Components/SearchBar' import SearchButton from 'Components/SearchButton' -import * as Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { ThemeColorsProvider } from 'Components/utils/colors' import { useEngine } from 'Components/utils/EngineContext' import { ScrollToTop } from 'Components/utils/Scroll' @@ -36,7 +36,7 @@ export default function RulePage() { return } return ( - + - + ) } diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx index 6386f000e..5e1c566c1 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx @@ -1,7 +1,7 @@ import { updateSituation } from 'Actions/actions' import { ExplicableRule } from 'Components/conversation/Explicable' import RuleInput from 'Components/conversation/RuleInput' -import Animate from 'Components/ui/animate' +import { FromTop } from 'Components/ui/animate' import { EngineContext } from 'Components/utils/EngineContext' import { useNextQuestions } from 'Components/utils/useNextQuestion' import { DottedName } from 'modele-social' @@ -82,7 +82,7 @@ export function SimpleField({ break-inside: avoid; `} > - +
    - +
    ) } diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx index 333db2174..545b8232f 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx @@ -1,6 +1,6 @@ import Value, { Condition } from 'Components/EngineValue' import RuleLink from 'Components/RuleLink' -import Animate from 'Components/ui/animate' +import { FromTop } from 'Components/ui/animate' import { useEngine } from 'Components/utils/EngineContext' import { Markdown } from 'Components/utils/markdown' import emoji from 'react-easy-emoji' @@ -54,7 +54,7 @@ export default function ResultatsSimples() { return null } return ( - +
    )}
    -
    +
    ) })} +

    -
    + ) })} diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx index 44531fc84..7e8ddab73 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx @@ -1,7 +1,7 @@ import { Explicable } from 'Components/conversation/Explicable' import Value, { Condition } from 'Components/EngineValue' import RuleLink from 'Components/RuleLink' -import Animate from 'Components/ui/animate' +import { FromTop } from 'Components/ui/animate' import { useEngine } from 'Components/utils/EngineContext' import { Markdown } from 'Components/utils/markdown' import { DottedName } from 'modele-social' @@ -60,7 +60,7 @@ export default function ResultatsParFormulaire() {
    {informations.map((r) => ( - +

    -
    +
    ))}
    @@ -110,7 +110,7 @@ function DeclarationForm({ dottedName }: { dottedName: DottedName }) { ) as DottedName[] return ( - +
    engine.getRule(dottedName)) .map((node) => ( - +
  • {node.rawNode.résumé} @@ -147,12 +147,12 @@ function DeclarationForm({ dottedName }: { dottedName: DottedName }) { {/* */}
  • -
    +
    ))}
    -
    +
    ) } diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx index dbcf74cb6..6c066ce4c 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/index.tsx @@ -5,7 +5,7 @@ import { Condition } from 'Components/EngineValue' import PageHeader from 'Components/PageHeader' import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' import 'Components/TargetSelection.css' -import Animate from 'Components/ui/animate' +import { FromTop } from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' import useSimulationConfig from 'Components/utils/useSimulationConfig' import { useCallback } from 'react' @@ -91,7 +91,7 @@ export default function AideDéclarationIndépendant() { - + @@ -184,7 +184,7 @@ export default function AideDéclarationIndépendant() { - + {FEATURE_FLAG_RESULTATS_COMPLETS ? ( <> @@ -235,7 +235,7 @@ function ImpositionSection() { : 'aide déclaration revenu indépendant 2020 . cotisations payées version simple = non' } > - + @@ -288,7 +288,7 @@ function ImpositionSection() { /> - +
    )} diff --git a/mon-entreprise/source/pages/Gérer/AideOrganismeLocal.tsx b/mon-entreprise/source/pages/Gérer/AideOrganismeLocal.tsx index 656d7de65..5338106b1 100644 --- a/mon-entreprise/source/pages/Gérer/AideOrganismeLocal.tsx +++ b/mon-entreprise/source/pages/Gérer/AideOrganismeLocal.tsx @@ -1,7 +1,7 @@ +import { FromTop } from 'Components/ui/animate' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { RootState } from 'Reducers/rootReducer' -import animate from 'Components/ui/animate' import aideOrganismeSvg from './aideOrganisme.svg' const aideMidiPyrenéesAutoEntrepreneur = (state: RootState) => { @@ -26,7 +26,7 @@ export default function AideOrganismeLocal() { return null } return ( - +
    -
    + ) } diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx b/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx index 4f7817542..a88eeaabb 100644 --- a/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx +++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/index.tsx @@ -2,7 +2,7 @@ import { Explicable } from 'Components/conversation/Explicable' import RuleInput from 'Components/conversation/RuleInput' import { Condition } from 'Components/EngineValue' import PageHeader from 'Components/PageHeader' -import * as Animate from 'Components/ui/animate' +import { FromTop } from 'Components/ui/animate' import Emoji from 'Components/utils/Emoji' import { EngineContext, EngineProvider } from 'Components/utils/EngineContext' import { Markdown } from 'Components/utils/markdown' @@ -154,10 +154,10 @@ function FormulairePublicodes() { ) return ( - + {fields.map( ({ rawNode: { description, type, question }, title, dottedName }) => ( - + {type === 'groupe' ? ( <> {createElement( @@ -205,7 +205,7 @@ function FormulairePublicodes() { /> )} - + ) )} @@ -228,6 +228,6 @@ function FormulairePublicodes() { ) : isMissingValues ? ( ) : null} - + ) } diff --git a/mon-entreprise/source/pages/Gérer/Embaucher.tsx b/mon-entreprise/source/pages/Gérer/Embaucher.tsx index 901271c4e..37195af26 100644 --- a/mon-entreprise/source/pages/Gérer/Embaucher.tsx +++ b/mon-entreprise/source/pages/Gérer/Embaucher.tsx @@ -2,14 +2,14 @@ import { checkHiringItem, initializeHiringChecklist, } from 'Actions/hiringChecklistAction' -import Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { CheckItem, Checklist, ChecklistProps } from 'Components/ui/Checklist' -import { SimulatorRessourceCard } from '../Simulateurs/Page' import { Helmet } from 'react-helmet' import { Trans, useTranslation } from 'react-i18next' import { connect, useSelector } from 'react-redux' import { RootState } from 'Reducers/rootReducer' import { TrackPage } from '../../ATInternetTracking' +import { SimulatorRessourceCard } from '../Simulateurs/Page' type EmbaucherProps = { onChecklistInitialization: ChecklistProps['onInitialization'] @@ -22,7 +22,7 @@ function Embaucher({ onChecklistInitialization, onItemCheck }: EmbaucherProps) { (state: RootState) => state.inFranceApp.hiringChecklist ) return ( - + @@ -225,7 +225,7 @@ function Embaucher({ onChecklistInitialization, onItemCheck }: EmbaucherProps) { <div className="ui__ box-container"> <SimulatorRessourceCard simulatorId="salarié" /> </div> - </Animate.fromBottom> + </FromBottom> ) } diff --git a/mon-entreprise/source/pages/Gérer/Home.tsx b/mon-entreprise/source/pages/Gérer/Home.tsx index 3d6cd9f27..dac34dcc8 100644 --- a/mon-entreprise/source/pages/Gérer/Home.tsx +++ b/mon-entreprise/source/pages/Gérer/Home.tsx @@ -7,7 +7,7 @@ import CompanyDetails from 'Components/CompanyDetails' import FindCompany from 'Components/FindCompany' import Overlay from 'Components/Overlay' import PageHeader from 'Components/PageHeader' -import * as Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { ScrollToTop } from 'Components/utils/Scroll' import { SitePaths, SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext, useEffect, useRef, useState } from 'react' @@ -69,7 +69,7 @@ export default function Gérer() { </Helmet> <TrackPage name="accueil" /> <ScrollToTop /> - <Animate.fromBottom> + <FromBottom> <PageHeader picture={businessPlan} titre={<Trans i18nKey="gérer.titre">Gérer mon activité</Trans>} @@ -278,7 +278,7 @@ export default function Gérer() { </Link> </div> </> - </Animate.fromBottom> + </FromBottom> </> ) } diff --git a/mon-entreprise/source/pages/Gérer/SécuritéSociale.tsx b/mon-entreprise/source/pages/Gérer/SécuritéSociale.tsx index 3d9b6263f..8cce4abba 100644 --- a/mon-entreprise/source/pages/Gérer/SécuritéSociale.tsx +++ b/mon-entreprise/source/pages/Gérer/SécuritéSociale.tsx @@ -1,4 +1,4 @@ -import * as Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { Helmet } from 'react-helmet' import { Trans, useTranslation } from 'react-i18next' import { TrackPage } from '../../ATInternetTracking' @@ -12,7 +12,7 @@ export default function SocialSecurity() { <title>{t('sécu.page.titre', 'Sécurité sociale')} - +

    Protection sociale

    @@ -32,7 +32,7 @@ export default function SocialSecurity() {
    -
    +
    ) } diff --git a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx index 22b4fa88d..317bd018f 100644 --- a/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AidesEmbauche.tsx @@ -1,6 +1,6 @@ import Conversation from 'Components/conversation/Conversation' import { HiddenOptionContext } from 'Components/conversation/Question' -import Animate from 'Components/ui/animate' +import { FromTop } from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' import { ThemeColorsContext } from 'Components/utils/colors' import Emoji from 'Components/utils/Emoji' @@ -254,7 +254,7 @@ function Results() { /> ) : ( - +

    Aides disponibles @@ -267,7 +267,7 @@ function Results() {

    -
    + ) } diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx index 89334029c..9ab4ce8d4 100644 --- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx @@ -9,27 +9,18 @@ import 'Components/TargetSelection.css' import { EngineContext, useEngine } from 'Components/utils/EngineContext' import useSimulationConfig from 'Components/utils/useSimulationConfig' import ircecSrc from 'Images/logos-caisses-retraite/ircec.jpg' -import { useContext, useState } from 'react' +import { useContext } from 'react' import { Trans } from 'react-i18next' import styled from 'styled-components' import config from './configs/artiste-auteur.yaml' export default function ArtisteAuteur() { useSimulationConfig(config) - const [animationDisabled, setAnimationDisabled] = useState(false) return ( <> - { - setAnimationDisabled(true) - }} - disableAnimation={animationDisabled} - explanations={ - - } - > + }> @@ -42,16 +33,12 @@ export default function ArtisteAuteur() { ) } -interface CotisationResultProps { - disableAnimation: boolean -} - -function CotisationsResult({ disableAnimation }: CotisationResultProps) { +function CotisationsResult() { return ( <> - + ) @@ -112,13 +99,7 @@ const branches = [ }, ] as const -interface RepartitionCotisationsProps { - disableAnimation: boolean -} - -function RepartitionCotisations({ - disableAnimation, -}: RepartitionCotisationsProps) { +function RepartitionCotisations() { const engine = useContext(EngineContext) const cotisations = branches.map((branch) => ({ ...branch, @@ -137,7 +118,6 @@ function RepartitionCotisations({ ))} diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index c4a66aeb3..916969bf3 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -6,21 +6,14 @@ import Simulation from 'Components/Simulation' import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import StackedBarChart from 'Components/StackedBarChart' import { ThemeColorsContext } from 'Components/utils/colors' -import { default as React, useContext, useState } from 'react' +import { default as React, useContext } from 'react' import { Trans, useTranslation } from 'react-i18next' export default function AutoEntrepreneur() { - const [animationDisabled, setAnimationDisabled] = useState(false) return ( <> - { - setAnimationDisabled(true) - }} - disableAnimation={animationDisabled} - explanations={} - > + }> @@ -43,11 +36,7 @@ export default function AutoEntrepreneur() { ) } -interface ExplanationProps { - disableAnimation: boolean -} - -function Explanation({ disableAnimation }: ExplanationProps) { +function Explanation() { const { t } = useTranslation() const { palettes } = useContext(ThemeColorsContext) return ( @@ -56,7 +45,6 @@ function Explanation({ disableAnimation }: ExplanationProps) { Répartition du chiffre d'affaires { if (inIframe) { return @@ -57,10 +56,6 @@ export default function ChômagePartiel() { { - setAnimationDisabled(true) - }} - disableAnimation={animationDisabled} results={} customEndMessages={ Voir les résultats au-dessus @@ -84,7 +79,7 @@ function ExplanationSection() { const totalEntrepriseHabituel = 'chômage partiel . coût employeur habituel' return ( - +
    -
    + ) } diff --git a/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx b/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx index 5997202a1..0bfe4580b 100644 --- a/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx @@ -3,7 +3,7 @@ import RuleInput from 'Components/conversation/RuleInput' import Value from 'Components/EngineValue' import Notifications from 'Components/Notifications' import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' -import Animate from 'Components/ui/animate' +import { FromTop } from 'Components/ui/animate' import Warning from 'Components/ui/WarningBlock' import { ThemeColorsContext } from 'Components/utils/colors' import useSimulationConfig from 'Components/utils/useSimulationConfig' @@ -102,7 +102,7 @@ function Explanations() { return } return ( - +

    Montant de l'impôt sur les sociétés

    -
    + ) } diff --git a/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx index c7540330d..c4f0acc94 100644 --- a/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Indépendant.tsx @@ -10,31 +10,16 @@ import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import { useEngine } from 'Components/utils/EngineContext' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { DottedName } from 'modele-social' -import { useContext, useState } from 'react' +import { useContext } from 'react' import { Trans } from 'react-i18next' import { useDispatch } from 'react-redux' import { Link } from 'react-router-dom' -interface IndépendantSimulationProps { - disableAnimation: boolean -} - -export function IndépendantPLSimulation({ - disableAnimation, -}: IndépendantSimulationProps) { - const [animationDisabled, setAnimationDisabled] = useState(false) +export function IndépendantPLSimulation() { return ( <> - { - setAnimationDisabled(true) - }} - disableAnimation={animationDisabled} - explanations={ - - } - > + }> @@ -42,22 +27,11 @@ export function IndépendantPLSimulation({ ) } -export function EntrepriseIndividuelle({ - disableAnimation, -}: IndépendantSimulationProps) { - const [animationDisabled, setAnimationDisabled] = useState(false) +export function EntrepriseIndividuelle() { return ( <> - { - setAnimationDisabled(true) - }} - disableAnimation={animationDisabled} - explanations={ - - } - > + }> @@ -65,23 +39,12 @@ export function EntrepriseIndividuelle({ ) } -export default function IndépendantSimulation({ - disableAnimation, -}: IndépendantSimulationProps) { +export default function IndépendantSimulation() { const sitePaths = useContext(SitePathsContext) - const [animationDisabled, setAnimationDisabled] = useState(false) return ( <> - { - setAnimationDisabled(true) - }} - disableAnimation={animationDisabled} - explanations={ - - } - > + }>
    { - setAnimationDisabled(true) - }} - disableAnimation={animationDisabled} - explanations={ - - } + explanations={} customEndMessages={ <> diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index ce1f98982..de1c0263a 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -4,7 +4,7 @@ import Simulation from 'Components/Simulation' import SalaryExplanation from 'Components/simulationExplanation/SalaryExplanation' import Emoji from 'Components/utils/Emoji' import { SitePathsContext } from 'Components/utils/SitePathsContext' -import React, { useContext, useMemo, useState } from 'react' +import React, { useContext, useMemo } from 'react' import { Trans, useTranslation } from 'react-i18next' import { SimulationConfig } from 'Reducers/rootReducer' import { constructLocalizedSitePath } from '../../sitePaths' @@ -247,9 +247,7 @@ export function getSimulatorsData({ 'Entreprise individuelle (EI) : simulateur de revenus' ), }, - component: () => { - return - }, + component: EntrepriseIndividuelle, path: sitePaths.simulateurs['entreprise-individuelle'], shortName: t('pages.simulateurs.ei.shortname', 'EI'), title: t( @@ -353,9 +351,7 @@ export function getSimulatorsData({ 'EIRL : simulateur de revenus pour dirigeant' ), }, - component: () => { - return - }, + component: IndépendantSimulation, path: sitePaths.simulateurs.eirl, shortName: t('pages.simulateurs.eirl.shortname', 'EIRL'), title: t('pages.simulateurs.eirl.title', "Simulateur d'EIRL"), @@ -393,19 +389,10 @@ export function getSimulatorsData({ shortName: t('pages.simulateurs.sasu.shortname', 'SASU'), title: t('pages.simulateurs.sasu.title', 'Simulateur de SASU'), component: function SasuSimulation() { - const [animationDisabled, setAnimationDisabled] = useState(false) return ( <> - { - setAnimationDisabled(true) - }} - disableAnimation={animationDisabled} - explanations={ - - } - /> + } /> ) }, @@ -490,9 +477,7 @@ export function getSimulatorsData({ path: sitePaths.simulateurs.eurl, shortName: t('pages.simulateurs.sasu.shortname', 'EURL'), title: t('pages.simulateurs.sasu.title', "Simulateur d'EURL"), - component: () => { - return - }, + component: IndépendantSimulation, nextSteps: ['is', 'comparaison-statuts'], }, 'auto-entrepreneur': { @@ -620,9 +605,7 @@ export function getSimulatorsData({ "Calcul du revenu net après impôt et des cotisations à partir du chiffre d'affaires et inversement" ), }, - component: () => { - return - }, + component: IndépendantSimulation, nextSteps: ['comparaison-statuts', 'is'], }, @@ -875,9 +858,7 @@ export function getSimulatorsData({ 'pages.simulateurs.médecin.title', 'Simulateur de revenus pour médecin en libéral' ), - component: () => { - return - }, + component: IndépendantPLSimulation, }, 'chirurgien-dentiste': { config: dentisteConfig, @@ -896,9 +877,7 @@ export function getSimulatorsData({ 'pages.simulateurs.chirurgien-dentiste.title', 'Simulateur de revenus pour chirurgien-dentiste en libéral' ), - component: () => { - return - }, + component: IndépendantPLSimulation, }, 'sage-femme': { config: sageFemmeConfig, @@ -914,9 +893,7 @@ export function getSimulatorsData({ 'pages.simulateurs.sage-femme.title', 'Simulateur de revenus pour sage-femme en libéral' ), - component: () => { - return - }, + component: IndépendantPLSimulation, }, 'auxiliaire-médical': { config: auxiliaireConfig, @@ -936,9 +913,7 @@ export function getSimulatorsData({ 'pages.simulateurs.auxiliaire.title', 'Simulateur de revenus pour auxiliaire médical en libéral' ), - component: () => { - return - }, + component: IndépendantPLSimulation, }, avocat: { config: avocatConfig, @@ -954,9 +929,7 @@ export function getSimulatorsData({ 'pages.simulateurs.avocat.title', 'Simulateur de revenus pour avocat en libéral' ), - component: () => { - return - }, + component: IndépendantPLSimulation, }, 'expert-comptable': { config: expertComptableConfig, @@ -975,9 +948,7 @@ export function getSimulatorsData({ 'pages.simulateurs.expert-comptable.title', 'Simulateur de revenus pour expert comptable et commissaire aux comptes en libéral' ), - component: () => { - return - }, + component: IndépendantPLSimulation, }, 'profession-libérale': { config: professionLibéraleConfig, @@ -1005,9 +976,7 @@ export function getSimulatorsData({ 'pages.simulateurs.profession-libérale.title', 'Simulateur de revenus pour profession libérale' ), - component: () => { - return - }, + component: IndépendantPLSimulation, }, pamc: { private: true, diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/Activité.tsx b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/Activité.tsx index 404eeed1b..eeba80fca 100644 --- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/Activité.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/Activité.tsx @@ -1,4 +1,4 @@ -import Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { Markdown } from 'Components/utils/markdown' import { ScrollToTop } from 'Components/utils/Scroll' import { SitePathsContext } from 'Components/utils/SitePathsContext' @@ -36,7 +36,7 @@ export default function Activité({ if (activité.activités) { return ( - +

    {activité.titre}

    @@ -52,7 +52,7 @@ export default function Activité({ activités={activité.activités.map(({ titre }: Activity) => titre)} /> -
    + ) } @@ -61,7 +61,7 @@ export default function Activité({ return (
    - +

    {emoji(activité.icônes)} {activité.titre} @@ -188,7 +188,7 @@ export default function Activité({ )} - +

    ) } diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/ActivitésSelection.tsx b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/ActivitésSelection.tsx index ef445c0be..e0aa5752f 100644 --- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/ActivitésSelection.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/ActivitésSelection.tsx @@ -1,5 +1,5 @@ import classnames from 'classnames' -import Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import Checkbox from 'Components/ui/Checkbox' import InfoBulle from 'Components/ui/InfoBulle' import { ScrollToTop } from 'Components/utils/Scroll' @@ -29,7 +29,7 @@ export default function ActivitésSelection() { ) return ( <> - +

    {titre}

    @@ -70,7 +70,7 @@ export default function ActivitésSelection() { {emoji('😌')}

    -
    + ) } diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx index 52f463704..364071b90 100644 --- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx @@ -1,4 +1,4 @@ -import Animate from 'Components/ui/animate' +import { FromBottom } from 'Components/ui/animate' import { ScrollToTop } from 'Components/utils/Scroll' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext } from 'react' @@ -46,7 +46,7 @@ export default function VotreSituation() { ).some((activité) => régimeGénéralDisponibleSelector(state, activité)) return ( - + @@ -160,7 +160,7 @@ export default function VotreSituation() {
    -
    + ) } diff --git a/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx b/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx index ab44e228c..92bcd2ff8 100644 --- a/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx +++ b/mon-entreprise/source/pages/Stats/DemandesUtilisateurs.tsx @@ -1,4 +1,4 @@ -import Animate from 'Components/ui/animate' +import { FromTop } from 'Components/ui/animate' import { useState } from 'react' import stats from '../../data/stats.json' @@ -47,7 +47,7 @@ function Issue({ closedAt: string | null }) { return ( - +
  • {count > 1 && ( {count} demandes @@ -59,7 +59,7 @@ function Issue({ (Résolu en {formatMonth(new Date(closedAt))}) )}
  • -
    + ) } From 30096e64f21d98b2500c906580ca5368f3dbe790 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 26 Aug 2021 19:11:11 +0200 Subject: [PATCH 270/319] :bug: Corrige le bug d'affichage lors de l'impression sur firefox --- mon-entreprise/package.json | 1 + mon-entreprise/source/components/BarChart.tsx | 86 +++++++++++-------- .../source/components/Distribution.css | 10 ++- mon-entreprise/source/components/PaySlip.css | 4 + mon-entreprise/source/components/PaySlip.tsx | 22 +++-- .../source/components/TargetSelection.tsx | 2 +- .../simulationExplanation/ExportRecover.tsx | 14 +-- .../simulationExplanation/PLExplanation.tsx | 1 + .../SalaryExplanation.tsx | 3 +- .../source/components/ui/Typography.css | 13 +-- .../source/components/ui/animate.tsx | 56 ++++++------ mon-entreprise/source/components/ui/index.css | 10 ++- .../utils/DisableAnimationContext.tsx | 51 +++++++---- .../utils/useDisplayOnIntersecting.ts | 2 +- .../source/pages/Simulateurs/Page.tsx | 22 ++--- .../source/pages/Simulateurs/metadata.tsx | 12 +-- yarn.lock | 34 +++++--- 17 files changed, 202 insertions(+), 141 deletions(-) diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index 230a2d99e..234c5326b 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -67,6 +67,7 @@ "@rehooks/local-storage": "^2.1.1", "@sentry/react": "^6.3.5", "@sentry/tracing": "^6.3.5", + "@types/react-dom": "^17.0.0", "classnames": "^2.2.5", "color-convert": "^1.9.2", "core-js": "^3.2.1", diff --git a/mon-entreprise/source/components/BarChart.tsx b/mon-entreprise/source/components/BarChart.tsx index d836b9569..48f645072 100644 --- a/mon-entreprise/source/components/BarChart.tsx +++ b/mon-entreprise/source/components/BarChart.tsx @@ -1,4 +1,3 @@ -import { ThemeColorsContext } from 'Components/utils/colors' import useDisplayOnIntersecting from 'Components/utils/useDisplayOnIntersecting' import { formatValue } from 'publicodes' import React, { useContext } from 'react' @@ -7,19 +6,43 @@ import { useTranslation } from 'react-i18next' import { animated, config, useSpring } from 'react-spring' import { DisableAnimationContext } from './utils/DisableAnimationContext' -const ANIMATION_SPRING = config.gentle - type ChartItemBarProps = { numberToPlot: number unit?: string - style: React.CSSProperties + display: boolean + percentage: number } -function ChartItemBar({ style, numberToPlot, unit }: ChartItemBarProps) { +function ChartItemBar({ + numberToPlot, + unit, + display, + percentage, +}: ChartItemBarProps) { const language = useTranslation().i18n.language + const disableAnimation = useContext(DisableAnimationContext) + + const style = useSpring({ + config: config.slow, + delay: 100, + from: { + flex: 0, + }, + flex: display ? percentage : 0, + }) return ( -
    - +
    + {disableAnimation ? ( +
    + ) : ( + + )}
    + immediate: disableAnimation, + opacity: display ? 1 : 0, + }) + return ( + - ) : ( - ) } @@ -106,6 +117,7 @@ type InnerBarChartBranchProps = { icon?: string maximum: number description?: string + display: boolean unit?: string value: number } @@ -115,12 +127,12 @@ function InnerBarChartBranch({ title, icon, maximum, + display, description, unit, }: InnerBarChartBranchProps) { - const { color } = useContext(ThemeColorsContext) return ( - <> +
    {icon && }

    @@ -129,14 +141,12 @@ function InnerBarChartBranch({ {description && {description}}

    - +
    ) } diff --git a/mon-entreprise/source/components/Distribution.css b/mon-entreprise/source/components/Distribution.css index 3107e8c64..7b21cef1f 100644 --- a/mon-entreprise/source/components/Distribution.css +++ b/mon-entreprise/source/components/Distribution.css @@ -17,7 +17,15 @@ .distribution-chart__bar { border-radius: 0.4em; - min-height: 1.5em; + background-color: var(--color); + + min-height: 1.5rem; +} + +@media print { + .distribution-chart__bar { + min-height: 1rem; + } } .distribution-chart__item-content { diff --git a/mon-entreprise/source/components/PaySlip.css b/mon-entreprise/source/components/PaySlip.css index c8d370dfe..c592a3c77 100644 --- a/mon-entreprise/source/components/PaySlip.css +++ b/mon-entreprise/source/components/PaySlip.css @@ -1,6 +1,7 @@ .payslip__salarySection { display: grid; grid-template-columns: auto 8.2em; + overflow: visible; grid-gap: 0.3em 0em; } .payslip__salaryTitle { @@ -8,12 +9,15 @@ } .payslip__cotisationsSection { display: grid; + overflow: visible; + grid-template-columns: auto auto auto; grid-gap: 0.3em 0em; } .payslip__container h4 { border-bottom: 1px solid black; + color-adjust: exact !important; margin: 0; margin-top: 1.5em; padding-bottom: 0.5em; diff --git a/mon-entreprise/source/components/PaySlip.tsx b/mon-entreprise/source/components/PaySlip.tsx index c6b11f8c4..d4abf9d30 100644 --- a/mon-entreprise/source/components/PaySlip.tsx +++ b/mon-entreprise/source/components/PaySlip.tsx @@ -6,6 +6,7 @@ import { ASTNode, formatValue, ParsedRules, reduceAST } from 'publicodes' import { RuleNode } from 'publicodes/dist/types/rule' import { Fragment, useContext } from 'react' import { Trans, useTranslation } from 'react-i18next' +import { ExplicableRule } from './conversation/Explicable' import './PaySlip.css' import { Line, SalaireBrutSection, SalaireNetSection } from './PaySlipSections' @@ -52,10 +53,12 @@ export function getCotisationsBySection( ) } - const cotisations = ([ - ...findCotisations('contrat salarié . cotisations . patronales'), - ...findCotisations('contrat salarié . cotisations . salariales'), - ] as Array) + const cotisations = ( + [ + ...findCotisations('contrat salarié . cotisations . patronales'), + ...findCotisations('contrat salarié . cotisations . salariales'), + ] as Array + ) .map((cotisation) => cotisation.dottedName) .filter(Boolean) .map( @@ -124,7 +127,10 @@ export default function PaySlip() { return (
    - + {section.title}{' '} + + +
    {cotisations.map((cotisation) => ( @@ -216,14 +222,14 @@ function Cotisation({ dottedName }: { dottedName: DottedName }) { <> - + {partPatronale?.nodeValue ? formatValue(partPatronale, { displayedUnit: '€', language }) : '–'} - + {partSalariale?.nodeValue ? formatValue(partSalariale, { displayedUnit: '€', language }) : '–'} diff --git a/mon-entreprise/source/components/TargetSelection.tsx b/mon-entreprise/source/components/TargetSelection.tsx index 6ed48ec56..80b605930 100644 --- a/mon-entreprise/source/components/TargetSelection.tsx +++ b/mon-entreprise/source/components/TargetSelection.tsx @@ -242,7 +242,7 @@ function TargetInputOrValue({ )} {(isActive || isFocused) && ( -
    +
    -

    - - Vous souhaitez retrouver cette simulation ? - -

    - +

    + + + Vous souhaitez retrouver cette simulation ? + + + Retrouvez la, ainsi que d'autres outils d'aide à la création et à la gestion d'entreprise, sur{' '} diff --git a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx index 619967022..bdb77cff5 100644 --- a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx @@ -1,4 +1,5 @@ import Value, { Condition } from 'Components/EngineValue' +import { FromBottom } from 'Components/ui/animate' import Emoji from 'Components/utils/Emoji' import { useEngine } from 'Components/utils/EngineContext' import assuranceMaladieSrc from 'Images/assurance-maladie.svg' diff --git a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx index a917b59fa..0b307e05e 100644 --- a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx @@ -3,7 +3,6 @@ import PaySlip from 'Components/PaySlip' import StackedBarChart from 'Components/StackedBarChart' import { FromTop } from 'Components/ui/animate' import { ThemeColorsContext } from 'Components/utils/colors' -import Emoji from 'Components/utils/Emoji' import { useInversionFail } from 'Components/utils/EngineContext' import { useContext, useRef } from 'react' import emoji from 'react-easy-emoji' @@ -129,7 +128,7 @@ export const DistributionSection = ({ {children}

    - Pour en savoir plus, rendez-vous sur le site{' '} + Pour en savoir plus, rendez-vous sur le site{' '} aquoiserventlescotisations.urssaf.fr diff --git a/mon-entreprise/source/components/ui/Typography.css b/mon-entreprise/source/components/ui/Typography.css index 0b576cf60..2b45cacfa 100644 --- a/mon-entreprise/source/components/ui/Typography.css +++ b/mon-entreprise/source/components/ui/Typography.css @@ -7,6 +7,13 @@ html { font-size: 0.9em; } } + +@media print { + html { + font-size: 0.9em; + line-height: 1.5rem; + } +} @media (min-width: 500px) and (max-width: 1920px) { html { font-size: 1.1em; @@ -18,12 +25,6 @@ html { } } -@media print { - html { - font-size: 1em; - } -} - body { font-weight: 400; color: #040e19; diff --git a/mon-entreprise/source/components/ui/animate.tsx b/mon-entreprise/source/components/ui/animate.tsx index ba8fd181a..c01b68ee4 100644 --- a/mon-entreprise/source/components/ui/animate.tsx +++ b/mon-entreprise/source/components/ui/animate.tsx @@ -37,19 +37,21 @@ export function FromBottom({ to={{ opacity: 1, y: 0 }} items={children} > - {(item) => ({ y, ...style }) => ( - - y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' - ), - ...style, - ...inheritedStyle, - }} - > - {item} - - )} + {(item) => + ({ y, ...style }) => + ( + + y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' + ), + ...style, + ...inheritedStyle, + }} + > + {item} + + )} ) } @@ -72,19 +74,21 @@ export function FromTop({ to={{ opacity: 1, y: 0 }} items={children} > - {(item) => ({ y, ...style }) => ( - - y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' - ), - ...style, - ...inheritedStyle, - }} - > - {item} - - )} + {(item) => + ({ y, ...style }) => + ( + + y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' + ), + ...style, + ...inheritedStyle, + }} + > + {item} + + )} ) } diff --git a/mon-entreprise/source/components/ui/index.css b/mon-entreprise/source/components/ui/index.css index 9129833b1..50f4ec7f8 100644 --- a/mon-entreprise/source/components/ui/index.css +++ b/mon-entreprise/source/components/ui/index.css @@ -209,7 +209,7 @@ input.ui__::placeholder { color: grey; } @media screen { - .screen-display-none { + .ui__.screen-display-none { display: none !important; } } @@ -220,14 +220,16 @@ input.ui__::placeholder { } .ui__.print-break-avoid { - page-break-inside: avoid; break-inside: avoid; } + .ui__.print-page-break { + break-before: always; + margin-top: -2rem; + } + .ui__.print-background-force { color-adjust: exact !important; - -webkit-print-color-adjust: exact !important; - print-color-adjust: exact !important; } .ui__.toggle input[type='radio']:checked ~ * { diff --git a/mon-entreprise/source/components/utils/DisableAnimationContext.tsx b/mon-entreprise/source/components/utils/DisableAnimationContext.tsx index 5b91e3387..193180943 100644 --- a/mon-entreprise/source/components/utils/DisableAnimationContext.tsx +++ b/mon-entreprise/source/components/utils/DisableAnimationContext.tsx @@ -1,27 +1,44 @@ -import React, { createContext, useCallback, useEffect, useState } from 'react' +import React, { createContext, useEffect, useState } from 'react' +import { flushSync } from 'react-dom' + export const DisableAnimationContext = createContext(false) +const useIsPrintContext = () => { + const [isPrintContext, setPrintContext] = useState(false) + useEffect(() => { + const matchListener = (matchMedia: MediaQueryListEvent) => { + flushSync(() => setPrintContext(matchMedia.matches)) + } + const matchMediaPrint = window.matchMedia('print') + + setPrintContext(matchMediaPrint.matches) + matchMediaPrint.addEventListener('change', matchListener) + return () => { + matchMediaPrint.removeEventListener('change', matchListener) + } + }, []) + + // Fix for Firefox (see https://bugzilla.mozilla.org/show_bug.cgi?id=774398) + useEffect(() => { + window.onbeforeprint = () => { + flushSync(() => { + setPrintContext(true) + }) + } + return () => { + window.onbeforeprint = null + } + }, [setPrintContext]) + + return isPrintContext +} + export function DisableAnimationOnPrintProvider({ children, }: { children: React.ReactNode }) { - const [isPrintContext, setPrintContext] = useState(false) - const onPrintContextChange = useCallback( - (matchMedia: MediaQueryListEvent | MediaQueryList) => { - setPrintContext(matchMedia.matches) - }, - [setPrintContext] - ) - useEffect(() => { - const matchMediaPrint = window.matchMedia('print') - onPrintContextChange(matchMediaPrint) - matchMediaPrint.addEventListener('change', onPrintContextChange) - return () => { - matchMediaPrint.removeEventListener('change', onPrintContextChange) - } - }, [onPrintContextChange]) - + const isPrintContext = useIsPrintContext() return ( {children} diff --git a/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts b/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts index 732b0fc3b..7b081060e 100644 --- a/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts +++ b/mon-entreprise/source/components/utils/useDisplayOnIntersecting.ts @@ -41,7 +41,7 @@ export default function ({ return () => { node && unobserve && observer.unobserve(node) } - }, [root, rootMargin, threshold, ref.current]) + }, [root, rootMargin, threshold, unobserve]) return [ref, wasOnScreen] } diff --git a/mon-entreprise/source/pages/Simulateurs/Page.tsx b/mon-entreprise/source/pages/Simulateurs/Page.tsx index 1eed776d5..99ac0f1b8 100644 --- a/mon-entreprise/source/pages/Simulateurs/Page.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Page.tsx @@ -1,6 +1,5 @@ import { Condition } from 'Components/EngineValue' import PreviousSimulationBanner from 'Components/PreviousSimulationBanner' -import ExportRecover from 'Components/simulationExplanation/ExportRecover' import { ThemeColorsProvider } from 'Components/utils/colors' import { IsEmbeddedContext } from 'Components/utils/embeddedContext' import Emoji from 'Components/utils/Emoji' @@ -88,14 +87,14 @@ export default function PageData({ {config && } {!inIframe && ( - <> +

    +
    {seoExplanations} - - +
    )} @@ -198,32 +197,27 @@ export function SimulatorRessourceCard({ const guidesUrssaf = [ { - url: - 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf', + url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_Medecins.pdf', associatedRule: "dirigeant . indépendant . PL . métier = 'santé . médecin'", title: 'Guide Urssaf pour les médecins libéraux', }, { - url: - 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf', + url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_PL_statuts_hors_AE_et_PAM.pdf', associatedRule: 'entreprise . activité . libérale réglementée', title: 'Guide Urssaf pour les professions libérales réglementées', }, { - url: - 'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf', + url: 'https://www.autoentrepreneur.urssaf.fr/portail/files/Guides/Metropole/Presentation_AE.pdf', associatedRule: 'dirigeant . auto-entrepreneur', title: 'Guide Urssaf pour les auto-entrepreneurs', }, { - url: - 'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf', + url: 'http://www.secu-artistes-auteurs.fr/sites/default/files/pdf/Guide%20pratique%20de%20d%C3%A9but%20d%27activit%C3%A9.pdf', associatedRule: "dirigeant = 'artiste-auteur'", title: 'Guide Urssaf pour les artistes-auteurs', }, { - url: - 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf', + url: 'https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf', associatedRule: 'dirigeant', title: 'Guide Urssaf pour les indépendants', }, diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index de1c0263a..46078c77b 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -139,7 +139,7 @@ export function getSimulatorsData({ shortName: t('pages.simulateurs.salarié.shortname', 'Salarié'), seoExplanations: ( -
    +

    Comment calculer le salaire net ?

    Lors de l'entretien d'embauche l'employeur propose en général une @@ -256,7 +256,7 @@ export function getSimulatorsData({ ), seoExplanations: ( -

    +

    Comment calculer le revenu net d'un dirigeant d'entreprise individuelle (EI) ? @@ -398,7 +398,7 @@ export function getSimulatorsData({ }, seoExplanations: ( -
    +

    Comment calculer le salaire d'un dirigeant de SASU ?

    Comme pour un salarié classique, le{' '} @@ -516,7 +516,7 @@ export function getSimulatorsData({ ), seoExplanations: ( -

    +

    Comment calculer le revenu net d'un auto-entrepreneur ?

    Un auto-entrepreneur doit payer des cotisations et contributions @@ -673,7 +673,7 @@ export function getSimulatorsData({ ), seoExplanations: ( -

    +

    Comment calculer l'indemnité d'activité partielle ?

    L'indemnité d'activité partielle de base est fixée par la loi à{' '} @@ -1077,7 +1077,7 @@ export function getSimulatorsData({ component: ISSimulation, seoExplanations: ( -

    +

    Comment est calculé l’impôt sur les sociétés ?

    L’impôt sur les sociétés s’applique aux bénéfices réalisés par les diff --git a/yarn.lock b/yarn.lock index 136f1edb0..e4521d928 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3421,9 +3421,9 @@ integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== "@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== "@types/ramda@^0.26.43": version "0.26.44" @@ -3449,9 +3449,9 @@ "@types/reactcss" "*" "@types/react-dom@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.0.tgz#b3b691eb956c4b3401777ee67b900cb28415d95a" - integrity sha512-lUqY7OlkF/RbNtD5nIq7ot8NquXrdFrjSOR6+w9a9RFQevGi1oZO1dcJbXMeONAPKtZ2UrZOEJ5UOCVsxbLk/g== + version "17.0.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" + integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== dependencies: "@types/react" "*" @@ -3535,7 +3535,16 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17.0.0": +"@types/react@*": + version "17.0.19" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.19.tgz#8f2a85e8180a43b57966b237d26a29481dacc991" + integrity sha512-sX1HisdB1/ZESixMTGnMxH9TDe8Sk709734fEQZzCV/4lSu9kJCPbo2PbTRoZM+53Pp0P10hYVyReUueGwUi4A== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@^17.0.0": version "17.0.0" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.0.tgz#5af3eb7fad2807092f0046a1302b7823e27919b8" integrity sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw== @@ -3573,6 +3582,11 @@ dependencies: "@types/node" "*" +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + "@types/sinon-chai@^3.2.5": version "3.2.5" resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48" @@ -6480,9 +6494,9 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" - integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== + version "3.0.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" + integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== csv-loader@^2.1.1: version "2.1.1" From edeb706f80b73c46c4c5bcb3086e3dc523844db2 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 1 Sep 2021 12:39:04 +0200 Subject: [PATCH 271/319] =?UTF-8?q?:fountain=5Fpen:=20Met=20=C3=A0=20jour?= =?UTF-8?q?=20le=20lien=20vers=20la=20recherche=20de=20convention=20collec?= =?UTF-8?q?tive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/simulationExplanation/SalaryExplanation.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx index 0b307e05e..b5a07ceba 100644 --- a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx @@ -46,7 +46,9 @@ export default function SalaryExplanation() { Il ne prend pour l'instant pas en compte les accords et conventions collectives, ni la myriade d'aides aux entreprises. Trouvez votre convention collective{' '} - ici + + ici + , et explorez les aides sur  aides-entreprises.fr. From b4710cb188796c95a601eef3a11a3f1fe13f0712 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 1 Sep 2021 12:56:13 +0200 Subject: [PATCH 272/319] =?UTF-8?q?:art:=20Am=C3=A9liore=20les=20couleurs?= =?UTF-8?q?=20d'impression=20sur=20chrome?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/components/TargetSelection.tsx | 22 ++--- mon-entreprise/source/components/ui/Card.css | 86 ++++++++++--------- 2 files changed, 53 insertions(+), 55 deletions(-) diff --git a/mon-entreprise/source/components/TargetSelection.tsx b/mon-entreprise/source/components/TargetSelection.tsx index 80b605930..b35fe696a 100644 --- a/mon-entreprise/source/components/TargetSelection.tsx +++ b/mon-entreprise/source/components/TargetSelection.tsx @@ -4,7 +4,6 @@ import Value, { Condition } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import RuleLink from 'Components/RuleLink' import AnimatedTargetValue from 'Components/ui/AnimatedTargetValue' -import { ThemeColorsContext } from 'Components/utils/colors' import { EngineContext, useEngine, @@ -41,13 +40,15 @@ export default function TargetSelection({ showPeriodSwitch = true }) { ) return (

    - {((typeof objectifs[0] === 'string' - ? [{ objectifs }] - : objectifs) as Array<{ - icône?: string - nom?: string - objectifs: Array - }>).map(({ icône, objectifs: targets, nom }, index: number) => ( + {( + (typeof objectifs[0] === 'string' + ? [{ objectifs }] + : objectifs) as Array<{ + icône?: string + nom?: string + objectifs: Array + }> + ).map(({ icône, objectifs: targets, nom }, index: number) => (
    @@ -160,7 +161,6 @@ function TargetInputOrValue({ isSmallTarget, }: TargetInputOrValueProps) { const { language } = useTranslation().i18n - const colors = useContext(ThemeColorsContext) const dispatch = useDispatch() const [isFocused, setFocused] = useState(false) const targetUnit = useSelector(targetUnitSelector) @@ -201,10 +201,6 @@ function TargetInputOrValue({ <> {!isFocused && } Date: Wed, 1 Sep 2021 13:29:52 +0200 Subject: [PATCH 273/319] =?UTF-8?q?:fire:=20Enl=C3=A8ve=20le=20fichier=20E?= =?UTF-8?q?xplicable.css=20(inutilis=C3=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/conversation/Explicable.css | 23 ------------------- .../components/conversation/Explicable.tsx | 1 - 2 files changed, 24 deletions(-) delete mode 100644 mon-entreprise/source/components/conversation/Explicable.css diff --git a/mon-entreprise/source/components/conversation/Explicable.css b/mon-entreprise/source/components/conversation/Explicable.css deleted file mode 100644 index 99449e3dd..000000000 --- a/mon-entreprise/source/components/conversation/Explicable.css +++ /dev/null @@ -1,23 +0,0 @@ -@media print { - .explicable { - display: none; - } -} -.explicable .icon { - display: inline-block; - padding: 0.15rem 0.6rem; - height: 100%; - margin-left: 0.2rem; - text-align: center; - cursor: pointer; - vertical-align: text-top; -} - -.explicable .icon:hover { - filter: brightness(90%); -} - -.variantLeaf .explicable .icon img { - width: 1.5em !important; - height: 1.5em !important; -} diff --git a/mon-entreprise/source/components/conversation/Explicable.tsx b/mon-entreprise/source/components/conversation/Explicable.tsx index 8b4a2bc98..6120ae8e6 100644 --- a/mon-entreprise/source/components/conversation/Explicable.tsx +++ b/mon-entreprise/source/components/conversation/Explicable.tsx @@ -6,7 +6,6 @@ import React, { useContext, useState } from 'react' import emoji from 'react-easy-emoji' import { useDispatch } from 'react-redux' import usePortal from 'react-useportal' -import './Explicable.css' export function ExplicableRule({ dottedName }: { dottedName: DottedName }) { const engine = useContext(EngineContext) From f1961e5e2213d4a9d2d430f78f9095d08bf5d2e2 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 1 Sep 2021 15:11:32 +0200 Subject: [PATCH 274/319] :art: Ajuste le style de l'impression sur chrome et FF --- .../source/components/Simulation.tsx | 3 +- .../conversation/select/SelectCommune.tsx | 8 +- .../simulationExplanation/ExportRecover.tsx | 12 +- .../SalaryExplanation.tsx | 70 +- .../source/components/ui/Layout.css | 57 +- .../source/components/ui/Typography.css | 26 +- mon-entreprise/source/components/ui/index.css | 18 +- .../AideDéclarationIndépendant/Fields.tsx | 6 +- .../AideDéclarationIndépendant/index.tsx | 6 +- .../source/pages/Simulateurs/Page.tsx | 8 +- .../source/pages/Simulateurs/metadata.tsx | 667 +++++++++--------- 11 files changed, 425 insertions(+), 456 deletions(-) diff --git a/mon-entreprise/source/components/Simulation.tsx b/mon-entreprise/source/components/Simulation.tsx index 9105fded6..3fc52b8b9 100644 --- a/mon-entreprise/source/components/Simulation.tsx +++ b/mon-entreprise/source/components/Simulation.tsx @@ -14,6 +14,7 @@ import { useSelector } from 'react-redux' import { firstStepCompletedSelector } from 'Selectors/simulationSelectors' import { TrackPage } from '../ATInternetTracking' import SeeAnswersButton from './conversation/SeeAnswersButton' +import ExportRecover from './simulationExplanation/ExportRecover' import { FromTop } from './ui/animate' type SimulationProps = { @@ -38,6 +39,7 @@ export default function Simulation({ ) return ( <> + {simulationBloc} @@ -49,7 +51,6 @@ export default function Simulation({ -
    {explanations && ( diff --git a/mon-entreprise/source/components/conversation/select/SelectCommune.tsx b/mon-entreprise/source/components/conversation/select/SelectCommune.tsx index bdc5cf276..fa7647a00 100644 --- a/mon-entreprise/source/components/conversation/select/SelectCommune.tsx +++ b/mon-entreprise/source/components/conversation/select/SelectCommune.tsx @@ -1,3 +1,4 @@ +import { FromTop } from 'Components/ui/animate' import React, { useCallback, useMemo, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import styled, { css } from 'styled-components' @@ -94,9 +95,10 @@ export default function Select({ onChange, value, id, missing }: InputProps) { }, [setSearchResults, setLoadingState] ) - const debouncedHandleSearch = useMemo(() => debounce(300, handleSearch), [ - handleSearch, - ]) + const debouncedHandleSearch = useMemo( + () => debounce(300, handleSearch), + [handleSearch] + ) const handleSubmit = useCallback( async (commune: Commune) => { diff --git a/mon-entreprise/source/components/simulationExplanation/ExportRecover.tsx b/mon-entreprise/source/components/simulationExplanation/ExportRecover.tsx index df5ba41c6..5b7a9ffb3 100644 --- a/mon-entreprise/source/components/simulationExplanation/ExportRecover.tsx +++ b/mon-entreprise/source/components/simulationExplanation/ExportRecover.tsx @@ -4,17 +4,11 @@ import { Trans } from 'react-i18next' export default function ExportRecover() { return ( -
    +

    - - - Vous souhaitez retrouver cette simulation ? - - - - Retrouvez la, ainsi que d'autres outils d'aide à la création et à la - gestion d'entreprise, sur{' '} + Retrouvez cette simulation ainsi que d'autres outils d'aide à la + création et à la gestion d'entreprise, sur{' '} mon-entreprise.fr diff --git a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx index b5a07ceba..35e25399d 100644 --- a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx @@ -25,34 +25,37 @@ export default function SalaryExplanation() { }) } /> - -

    - -
    -
    -

    - - Le simulateur vous aide à comprendre votre bulletin de paie, sans lui - être opposable. Pour plus d'informations, rendez vous sur  - - service-public.fr - - . - -

    -

    - - Il ne prend pour l'instant pas en compte les accords et conventions - collectives, ni la myriade d'aides aux entreprises. Trouvez votre - convention collective{' '} - - ici - - , et explorez les aides sur  - aides-entreprises.fr. - -

    + +
    +

    + Fiche de paie +

    + +

    + + Le simulateur vous aide à comprendre votre bulletin de paie, sans + lui être opposable. Pour plus d'informations, rendez vous + sur  + + service-public.fr + + . + +

    +

    + + Il ne prend pour l'instant pas en compte les accords et conventions + collectives, ni la myriade d'aides aux entreprises. Trouvez votre + convention collective{' '} + + ici + + , et explorez les aides sur  + aides-entreprises.fr. + +

    +
    ) } @@ -107,23 +110,12 @@ function RevenueRepartitionSection(props: { onSeePayslip: () => void }) { ) } -function PaySlipSection() { - return ( -
    -

    - Fiche de paie -

    - -
    - ) -} - export const DistributionSection = ({ children = , }: { children?: React.ReactNode }) => ( -
    +

    À quoi servent mes cotisations ?

    diff --git a/mon-entreprise/source/components/ui/Layout.css b/mon-entreprise/source/components/ui/Layout.css index 9479fd63b..ce0562fc0 100644 --- a/mon-entreprise/source/components/ui/Layout.css +++ b/mon-entreprise/source/components/ui/Layout.css @@ -1,36 +1,37 @@ section { padding: 1rem 0; } - -.ui__.container { - width: 100%; - max-width: 850px; - margin-right: auto; - margin-left: auto; - padding-right: 0.6rem; - padding-left: 0.6rem; -} -.ui__.container .ui__.full-width { - --margin: calc((850px - 100vw - 0.6rem) / 2); - margin-right: var(--margin); - margin-left: var(--margin); -} -@media (max-width: 850px) { +@media screen { + .ui__.container { + width: 100%; + max-width: 850px; + margin-right: auto; + margin-left: auto; + padding-right: 0.6rem; + padding-left: 0.6rem; + } .ui__.container .ui__.full-width { - margin: 0 -0.6rem; + --margin: calc((850px - 100vw - 0.6rem) / 2); + margin-right: var(--margin); + margin-left: var(--margin); + } + @media (max-width: 850px) { + .ui__.container .ui__.full-width { + margin: 0 -0.6rem; + } + } + + .ui__.container-and-side-block { + display: flex; + flex-direction: column; + align-items: center; + } + .ui__.container-and-side-block > .container { + flex-shrink: 0; } } -.ui__.container-and-side-block { - display: flex; - flex-direction: column; - align-items: center; -} -.ui__.container-and-side-block > .container { - flex-shrink: 0; -} - -@media (min-width: 1200px) { +@media screen and (min-width: 1200px) { .ui__.container-and-side-block { flex-direction: row; align-items: flex-start; @@ -42,13 +43,13 @@ section { display: flex; flex-direction: column; } -@media (max-width: 1200px) { +@media screen and (max-width: 1200px) { .ui__.side-block { align-self: center; } } -@media (min-width: 1200px) { +@media screen and (min-width: 1200px) { .ui__.side-block { margin-top: -1rem; diff --git a/mon-entreprise/source/components/ui/Typography.css b/mon-entreprise/source/components/ui/Typography.css index 2b45cacfa..b419fdab8 100644 --- a/mon-entreprise/source/components/ui/Typography.css +++ b/mon-entreprise/source/components/ui/Typography.css @@ -1,25 +1,30 @@ html { transition: none !important; - line-height: 1.7rem; } -@media (max-width: 500px) { + +@media print { + html { + line-height: 1.5em; + } +} + +@media screen { + html { + line-height: 1.7em; + } +} +@media screen and (max-width: 500px) { html { font-size: 0.9em; } } -@media print { - html { - font-size: 0.9em; - line-height: 1.5rem; - } -} -@media (min-width: 500px) and (max-width: 1920px) { +@media screen and (min-width: 500px) and (max-width: 1920px) { html { font-size: 1.1em; } } -@media (min-width: 1920px) { +@media screen and (min-width: 1920px) { html { font-size: 1.16em; } @@ -46,6 +51,7 @@ h2:not(.h), font-size: 1.4rem; line-height: 2.1rem; } + h3:not(.h), .ui__.h.h3 { margin-top: 1rem; diff --git a/mon-entreprise/source/components/ui/index.css b/mon-entreprise/source/components/ui/index.css index 50f4ec7f8..3333053d8 100644 --- a/mon-entreprise/source/components/ui/index.css +++ b/mon-entreprise/source/components/ui/index.css @@ -218,16 +218,6 @@ input.ui__::placeholder { .ui__.print-display-none { display: none !important; } - - .ui__.print-break-avoid { - break-inside: avoid; - } - - .ui__.print-page-break { - break-before: always; - margin-top: -2rem; - } - .ui__.print-background-force { color-adjust: exact !important; } @@ -235,4 +225,12 @@ input.ui__::placeholder { .ui__.toggle input[type='radio']:checked ~ * { box-shadow: none; } + + body { + margin: 00mm; + } +} +@page { + margin-top: 0.7cm; + margin-bottom: 0.7cm; } diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx index 5e1c566c1..5cfe8119c 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/Fields.tsx @@ -77,11 +77,7 @@ export function SimpleField({ return null } return ( -
    +
    + {config && } {!inIframe && ( -
    -
    - {seoExplanations} + <> +
    {seoExplanations}
    -
    + )} diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 46078c77b..3063c2240 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -139,77 +139,74 @@ export function getSimulatorsData({ shortName: t('pages.simulateurs.salarié.shortname', 'Salarié'), seoExplanations: ( -
    -

    Comment calculer le salaire net ?

    -

    - Lors de l'entretien d'embauche l'employeur propose en général une - rémunération exprimée en « brut ». Le montant annoncé inclut ainsi - les cotisations salariales, qui servent à financer la protection - sociale du salarié et qui sont retranchées du salaire « net » - perçu par le salarié. -

    -

    - Vous pouvez utiliser notre simulateur pour convertir le{' '} - salaire brut en net : il vous suffit pour cela - saisir la rémunération annoncée dans la case salaire brut. La - simulation peut-être affinée en répondant aux différentes - questions (CDD, statut cadre, heures supplémentaires, temps - partiel, titre-restaurants, etc.). -

    - {t( -

    - Par ailleurs depuis 2019, l' - impôt sur le revenu est - prélevé à la source. Pour ce faire, la direction générale des - finances publiques (DGFiP) transmet à l'employeur le taux - d'imposition calculé à partir de la déclaration de revenu du - salarié. Si ce taux est inconnu, par exemple lors d'une première - année d'activité, l'employeur utilise le{' '} - - taux neutre - - . -

    -

    Comment calculer le coût d'embauche ?

    -

    - Si vous cherchez à embaucher, vous pouvez calculer le coût total - de la rémunération de votre salarié, ainsi que les montants de - cotisations patronales et salariales correspondant. Cela vous - permet de définir le niveau de rémunération en connaissant le - montant global de charge que cela représente pour votre - entreprise. -

    -

    - En plus du salaire, notre simulateur prend en compte le calcul des - avantages en nature (téléphone, véhicule de fonction, etc.), ainsi - que la mutuelle santé obligatoire. -

    -

    - Il existe des{' '} - - aides différées - {' '} - à l'embauche qui ne sont pas toutes prises en compte par notre - simulateur, vous pouvez les retrouver sur{' '} - - le portail officiel - - . -

    -
    +

    Comment calculer le salaire net ?

    +

    + Lors de l'entretien d'embauche l'employeur propose en général une + rémunération exprimée en « brut ». Le montant annoncé inclut ainsi + les cotisations salariales, qui servent à financer la protection + sociale du salarié et qui sont retranchées du salaire « net » perçu + par le salarié. +

    +

    + Vous pouvez utiliser notre simulateur pour convertir le{' '} + salaire brut en net : il vous suffit pour cela + saisir la rémunération annoncée dans la case salaire brut. La + simulation peut-être affinée en répondant aux différentes questions + (CDD, statut cadre, heures supplémentaires, temps partiel, + titre-restaurants, etc.). +

    + {t( +

    + Par ailleurs depuis 2019, l' + impôt sur le revenu est + prélevé à la source. Pour ce faire, la direction générale des + finances publiques (DGFiP) transmet à l'employeur le taux + d'imposition calculé à partir de la déclaration de revenu du + salarié. Si ce taux est inconnu, par exemple lors d'une première + année d'activité, l'employeur utilise le{' '} + + taux neutre + + . +

    +

    Comment calculer le coût d'embauche ?

    +

    + Si vous cherchez à embaucher, vous pouvez calculer le coût total de + la rémunération de votre salarié, ainsi que les montants de + cotisations patronales et salariales correspondant. Cela vous permet + de définir le niveau de rémunération en connaissant le montant + global de charge que cela représente pour votre entreprise. +

    +

    + En plus du salaire, notre simulateur prend en compte le calcul des + avantages en nature (téléphone, véhicule de fonction, etc.), ainsi + que la mutuelle santé obligatoire. +

    +

    + Il existe des{' '} + + aides différées + {' '} + à l'embauche qui ne sont pas toutes prises en compte par notre + simulateur, vous pouvez les retrouver sur{' '} + + le portail officiel + + . +

    ), nextSteps: ['chômage-partiel', 'aides-embauche'], @@ -256,70 +253,67 @@ export function getSimulatorsData({ ), seoExplanations: ( -
    -

    - Comment calculer le revenu net d'un dirigeant d'entreprise - individuelle (EI) ? -

    -

    - Un dirigeant d'entreprise individuelle doit payer des cotisations - et contributions sociales à l'administration. Ces cotisations - servent au financement de la sécurité sociale, et ouvrent des - droits notamment pour la retraite et pour l'assurance maladie. - Elles permettent également de financer la formation - professionnelle. -

    -

    - {' '} - - Voir le détail du calcul des cotisations - -

    -

    - Il ne faut pas oublier de retrancher toutes les dépenses - effectuées dans le cadre de l'activité professionnelle - (équipements, matières premières, local, transport). Ces dernières - sont déductibles du résultat de l'entreprise, cela veut dire que - vous ne payerez pas d'impôt ou de cotisations sur leur montant - (sauf si vous avez opté pour l'option micro-fiscal). -

    -

    - La formule de calcul complète est donc : -

    - - Revenu net = Chiffres d'affaires − Dépenses professionnelles - - Cotisations sociales - -
    -

    -

    - Comment calculer les cotisations sociales d'une entreprise - individuelle ? -

    -

    - Le dirigeant d'une entreprise individuelle paye des cotisations - sociales, proportionnelle au{' '} - - résultat fiscal - {' '} - de l'entreprise. Leur montant varie également en fonction du type - d'activité (profession libérale, artisan, commerçants, etc), où - des éventuelles exonérations accordées (ACRE, ZFU, RSA, etc.). -

    -

    - {' '} - Comme le résultat d'une entreprise n'est connu qu'à la fin de - l'exercice comptable, le dirigeant paye des cotisations - provisionnelles qui seront ensuite régularisée une fois le revenu - réel déclaré, l'année suivante. -

    -

    - Ce simulateur permet de calculer le montant exact des cotisations - sociale en partant d'un chiffre d'affaires ou d'un revenu net - souhaité. Vous pourrez préciser votre situation en répondant aux - questions s'affichant en dessous de la simulation. -

    -
    +

    + Comment calculer le revenu net d'un dirigeant d'entreprise + individuelle (EI) ? +

    +

    + Un dirigeant d'entreprise individuelle doit payer des cotisations et + contributions sociales à l'administration. Ces cotisations servent + au financement de la sécurité sociale, et ouvrent des droits + notamment pour la retraite et pour l'assurance maladie. Elles + permettent également de financer la formation professionnelle. +

    +

    + {' '} + + Voir le détail du calcul des cotisations + +

    +

    + Il ne faut pas oublier de retrancher toutes les dépenses effectuées + dans le cadre de l'activité professionnelle (équipements, matières + premières, local, transport). Ces dernières sont déductibles du + résultat de l'entreprise, cela veut dire que vous ne payerez pas + d'impôt ou de cotisations sur leur montant (sauf si vous avez opté + pour l'option micro-fiscal). +

    +

    + La formule de calcul complète est donc : +

    + + Revenu net = Chiffres d'affaires − Dépenses professionnelles - + Cotisations sociales + +
    +

    +

    + Comment calculer les cotisations sociales d'une entreprise + individuelle ? +

    +

    + Le dirigeant d'une entreprise individuelle paye des cotisations + sociales, proportionnelle au{' '} + + résultat fiscal + {' '} + de l'entreprise. Leur montant varie également en fonction du type + d'activité (profession libérale, artisan, commerçants, etc), où des + éventuelles exonérations accordées (ACRE, ZFU, RSA, etc.). +

    +

    + {' '} + Comme le résultat d'une entreprise n'est connu qu'à la fin de + l'exercice comptable, le dirigeant paye des cotisations + provisionnelles qui seront ensuite régularisée une fois le revenu + réel déclaré, l'année suivante. +

    +

    + Ce simulateur permet de calculer le montant exact des cotisations + sociale en partant d'un chiffre d'affaires ou d'un revenu net + souhaité. Vous pourrez préciser votre situation en répondant aux + questions s'affichant en dessous de la simulation. +

    ), nextSteps: ['comparaison-statuts'], @@ -398,45 +392,43 @@ export function getSimulatorsData({ }, seoExplanations: ( -
    -

    Comment calculer le salaire d'un dirigeant de SASU ?

    -

    - Comme pour un salarié classique, le{' '} - dirigeant de sasu paye des cotisations sociales - sur la rémunération qu'il se verse. Les cotisations sont calculées - de la même manière que pour le salarié : elles sont décomposées en - partie employeur et partie salarié et sont exprimées comme un - pourcentage du salaire brut. -

    -

    - Le dirigeant assimilé-salarié ne paye pas de{' '} - cotisations chômage. Par ailleurs, il ne - bénéficie pas de la{' '} - - réduction générale de cotisations - {' '} - ni des dispositifs encadrés par le code du travail comme les{' '} - - heures supplémentaires - {' '} - ou les primes. -

    -

    - Il peut en revanche prétendre à la{' '} - - réduction ACRE - {' '} - en debut d'activité, sous certaines conditions. -

    -

    - Vous pouvez utiliser notre simulateur pour calculer la{' '} - rémunération nette à partir d'un montant - superbrut alloué à la rémunération du dirigeant. Il vous suffit - pour cela saisir le montant total alloué dans la case "total - chargé". La simulation peut ensuite être affinée en répondant aux - différentes questions. -

    -
    +

    Comment calculer le salaire d'un dirigeant de SASU ?

    +

    + Comme pour un salarié classique, le{' '} + dirigeant de sasu paye des cotisations sociales sur + la rémunération qu'il se verse. Les cotisations sont calculées de la + même manière que pour le salarié : elles sont décomposées en partie + employeur et partie salarié et sont exprimées comme un pourcentage + du salaire brut. +

    +

    + Le dirigeant assimilé-salarié ne paye pas de{' '} + cotisations chômage. Par ailleurs, il ne bénéficie + pas de la{' '} + + réduction générale de cotisations + {' '} + ni des dispositifs encadrés par le code du travail comme les{' '} + + heures supplémentaires + {' '} + ou les primes. +

    +

    + Il peut en revanche prétendre à la{' '} + + réduction ACRE + {' '} + en debut d'activité, sous certaines conditions. +

    +

    + Vous pouvez utiliser notre simulateur pour calculer la{' '} + rémunération nette à partir d'un montant superbrut + alloué à la rémunération du dirigeant. Il vous suffit pour cela + saisir le montant total alloué dans la case "total chargé". La + simulation peut ensuite être affinée en répondant aux différentes + questions. +

    ), nextSteps: ['is', 'comparaison-statuts'], @@ -516,70 +508,67 @@ export function getSimulatorsData({ ), seoExplanations: ( -
    -

    Comment calculer le revenu net d'un auto-entrepreneur ?

    -

    - Un auto-entrepreneur doit payer des cotisations et contributions - sociales à l'administration. Ces cotisations servent au - financement de la sécurité sociale, et ouvrent des droits - notamment pour la retraite et pour l'assurance maladie. Elles - permettent également de financer la formation professionnelle. - Leur montant varie en fonction du type d'activité. -

    -

    - {' '} - - Voir le détail du calcul des cotisations - -

    -

    - Il ne faut pas oublier de retrancher toutes les dépenses - effectuées dans le cadre de l'activité professionnelle - (équipements, matières premières, local, transport). Bien qu'elles - ne soient pas utilisées pour le calcul des cotisations et de - l'impôt, elles doivent être prises en compte pour vérifier si - l'activité est viable économiquement. -

    -

    - La formule de calcul complète est donc : -

    - - Revenu net = Chiffres d'affaires − Cotisations sociales − - Dépenses professionnelles - -
    -

    -

    - Comment calculer l'impôt sur le revenu pour un auto-entrepreneur ? -

    -

    - Si vous avez opté pour le versement libératoire lors de la - création de votre auto-entreprise, l'impôt sur le revenu est payé - en même temps que les cotisations sociales. -

    -

    - {' '} - - Voir comment est calculé le montant du versement libératoire - -

    -

    - Sinon, vous serez imposé selon le barème standard de l'impôt sur - le revenu. Le revenu imposable est alors calculé comme un - pourcentage du chiffre d'affaires. C'est qu'on appel l'abattement - forfaitaire. Ce pourcentage varie en fonction du type d'activité - excercé. On dit qu'il est forfaitaire car il ne prends pas en - compte les dépenses réelles effectuées dans le cadre de - l'activité. -

    -

    - {' '} - - Voir le détail du calcul du revenu abattu pour un - auto-entrepreneur - -

    -
    +

    Comment calculer le revenu net d'un auto-entrepreneur ?

    +

    + Un auto-entrepreneur doit payer des cotisations et contributions + sociales à l'administration. Ces cotisations servent au financement + de la sécurité sociale, et ouvrent des droits notamment pour la + retraite et pour l'assurance maladie. Elles permettent également de + financer la formation professionnelle. Leur montant varie en + fonction du type d'activité. +

    +

    + {' '} + + Voir le détail du calcul des cotisations + +

    +

    + Il ne faut pas oublier de retrancher toutes les dépenses effectuées + dans le cadre de l'activité professionnelle (équipements, matières + premières, local, transport). Bien qu'elles ne soient pas utilisées + pour le calcul des cotisations et de l'impôt, elles doivent être + prises en compte pour vérifier si l'activité est viable + économiquement. +

    +

    + La formule de calcul complète est donc : +

    + + Revenu net = Chiffres d'affaires − Cotisations sociales − + Dépenses professionnelles + +
    +

    +

    + Comment calculer l'impôt sur le revenu pour un auto-entrepreneur ? +

    +

    + Si vous avez opté pour le versement libératoire lors de la création + de votre auto-entreprise, l'impôt sur le revenu est payé en même + temps que les cotisations sociales. +

    +

    + {' '} + + Voir comment est calculé le montant du versement libératoire + +

    +

    + Sinon, vous serez imposé selon le barème standard de l'impôt sur le + revenu. Le revenu imposable est alors calculé comme un pourcentage + du chiffre d'affaires. C'est qu'on appel l'abattement forfaitaire. + Ce pourcentage varie en fonction du type d'activité excercé. On dit + qu'il est forfaitaire car il ne prends pas en compte les dépenses + réelles effectuées dans le cadre de l'activité. +

    +

    + {' '} + + Voir le détail du calcul du revenu abattu pour un + auto-entrepreneur + +

    ), nextSteps: ['indépendant', 'comparaison-statuts'], @@ -673,77 +662,74 @@ export function getSimulatorsData({ ), seoExplanations: ( -
    -

    Comment calculer l'indemnité d'activité partielle ?

    -

    - L'indemnité d'activité partielle de base est fixée par la loi à{' '} - 70% du brut. Elle est proratisée en fonction du - nombre d'heures chômées. Pour un salarié à 2300 € brut mensuel, - qui travaille à 50% de son temps usuel, cela donne{' '} - 2300 € × 50% × 70% = 805 € -

    -

    - A cette indemnité de base s'ajoute l'indemnité complémentaire pour - les salaires proches du SMIC. Ce complément intervient lorsque le - cumul de la rémunération et de l'indemnité de base est en dessous - d'un SMIC net. Ces indemnités sont prises en charge par - l'employeur, qui sera ensuite remboursé en parti ou en totalité - par l'État. -

    -

    - 👉{' '} - - Voir le détail du calcul de l'indemnité - -

    -

    Comment calculer la part remboursée par l'État ?

    -

    - L'État prend en charge une partie de l'indemnité partielle pour - les salaires allant jusqu'à 4,5 SMIC, avec un - minimum à 8,03€ par heures chômée. Concrètement, cela abouti à une - prise en charge à100% pour les salaires proches - du SMIC. Celle-ci diminue progressivement jusqu'à se stabiliser à{' '} - 93% pour les salaires compris{' '} - entre 2000 € et 7000 € (salaire correspondant à - la limite de 4,5 SMIC). -

    -

    - 👉{' '} - - Voir le détail du calcul du remboursement de l'indemnité - -

    -

    Comment déclarer une activité partielle ?

    -

    - Face à la crise du coronavirus, les modalités de passage en - activité partielle ont été allégées. L'employeur est autorisé a - placer ses salariés en activité partielle avant que la demande - officielle ne soit déposée. Celui-ci dispose ensuite d'un délai de{' '} - 30 jours pour se mettre en règle. Les indemnités - seront versées avec un effet rétro-actif débutant à la mise en - place du chômage partiel. -

    -

    - 👉{' '} - - Effectuer la demande de chômage partiel - -

    -

    - {' '} - Quelles sont les cotisations sociales à payer pour l'indemnité - d'activité partielle ? -

    -

    - L'indemnité d'activité partielle est soumise à la CSG/CRDS et à - une contribution maladie dans certains cas. Pour en savoir plus, - voir la page explicative sur{' '} - - le site de l'Urssaf - - . -

    -
    +

    Comment calculer l'indemnité d'activité partielle ?

    +

    + L'indemnité d'activité partielle de base est fixée par la loi à{' '} + 70% du brut. Elle est proratisée en fonction du + nombre d'heures chômées. Pour un salarié à 2300 € brut mensuel, qui + travaille à 50% de son temps usuel, cela donne{' '} + 2300 € × 50% × 70% = 805 € +

    +

    + A cette indemnité de base s'ajoute l'indemnité complémentaire pour + les salaires proches du SMIC. Ce complément intervient lorsque le + cumul de la rémunération et de l'indemnité de base est en dessous + d'un SMIC net. Ces indemnités sont prises en charge par l'employeur, + qui sera ensuite remboursé en parti ou en totalité par l'État. +

    +

    + 👉{' '} + + Voir le détail du calcul de l'indemnité + +

    +

    Comment calculer la part remboursée par l'État ?

    +

    + L'État prend en charge une partie de l'indemnité partielle pour les + salaires allant jusqu'à 4,5 SMIC, avec un minimum à + 8,03€ par heures chômée. Concrètement, cela abouti à une prise en + charge à100% pour les salaires proches du SMIC. + Celle-ci diminue progressivement jusqu'à se stabiliser à{' '} + 93% pour les salaires compris{' '} + entre 2000 € et 7000 € (salaire correspondant à la + limite de 4,5 SMIC). +

    +

    + 👉{' '} + + Voir le détail du calcul du remboursement de l'indemnité + +

    +

    Comment déclarer une activité partielle ?

    +

    + Face à la crise du coronavirus, les modalités de passage en activité + partielle ont été allégées. L'employeur est autorisé a placer ses + salariés en activité partielle avant que la demande officielle ne + soit déposée. Celui-ci dispose ensuite d'un délai de{' '} + 30 jours pour se mettre en règle. Les indemnités + seront versées avec un effet rétro-actif débutant à la mise en place + du chômage partiel. +

    +

    + 👉{' '} + + Effectuer la demande de chômage partiel + +

    +

    + {' '} + Quelles sont les cotisations sociales à payer pour l'indemnité + d'activité partielle ? +

    +

    + L'indemnité d'activité partielle est soumise à la CSG/CRDS et à une + contribution maladie dans certains cas. Pour en savoir plus, voir la + page explicative sur{' '} + + le site de l'Urssaf + + . +

    ), nextSteps: ['salarié', 'aides-embauche'], @@ -1077,40 +1063,35 @@ export function getSimulatorsData({ component: ISSimulation, seoExplanations: ( -
    -

    Comment est calculé l’impôt sur les sociétés ?

    -

    - L’impôt sur les sociétés s’applique aux bénéfices réalisés par les - sociétés de capitaux (SA, SAS, SASU, SARL, etc.) et sur option - facultative pour certaines autres sociétés (EIRL, EURL, SNC, - etc.). -

    -

    - Il est calculé sur la base des bénéfices réalisés en France au - cours de l’exercice comptable. La durée d’un exercice est - normalement d’un an mais il peut être plus court ou plus long - (notamment en début d’activité ou à la dissolution de - l’entreprise). Dans ce cas le barème de l’impôt est pro-ratisé en - fonction de la durée de l’exercice, ce qui est pris en compte dans - le simulateur en modifiant les dates de début et de fin de - l’exercice. -

    -

    Taux réduit et régimes spécifiques

    -

    - Les PME réalisant moins de 7,63 millions d’euros de chiffre - d’affaires et dont le capital est détenu à 75% par des personnes - physiques bénéficient d’un taux réduit d’impôt sur les sociétés. - Ce taux est pris en compte sur le simulateur et il n’est pour - l’instant pas possible de simuler l’inéligibilité aux taux - réduits. -

    -

    - Enfin il existe des régimes d’impositions spécifiques avec des - taux dédiés pour certains types de plus-values (cession de titres, - cession de brevets). Ces régimes ne sont pas intégrés dans le - simulateur. -

    -
    +

    Comment est calculé l’impôt sur les sociétés ?

    +

    + L’impôt sur les sociétés s’applique aux bénéfices réalisés par les + sociétés de capitaux (SA, SAS, SASU, SARL, etc.) et sur option + facultative pour certaines autres sociétés (EIRL, EURL, SNC, etc.). +

    +

    + Il est calculé sur la base des bénéfices réalisés en France au cours + de l’exercice comptable. La durée d’un exercice est normalement d’un + an mais il peut être plus court ou plus long (notamment en début + d’activité ou à la dissolution de l’entreprise). Dans ce cas le + barème de l’impôt est pro-ratisé en fonction de la durée de + l’exercice, ce qui est pris en compte dans le simulateur en + modifiant les dates de début et de fin de l’exercice. +

    +

    Taux réduit et régimes spécifiques

    +

    + Les PME réalisant moins de 7,63 millions d’euros de chiffre + d’affaires et dont le capital est détenu à 75% par des personnes + physiques bénéficient d’un taux réduit d’impôt sur les sociétés. Ce + taux est pris en compte sur le simulateur et il n’est pour l’instant + pas possible de simuler l’inéligibilité aux taux réduits. +

    +

    + Enfin il existe des régimes d’impositions spécifiques avec des taux + dédiés pour certains types de plus-values (cession de titres, + cession de brevets). Ces régimes ne sont pas intégrés dans le + simulateur. +

    ), nextSteps: ['salarié', 'comparaison-statuts'], From f63da5be5537e5e9463fda486c5169d7d5efc0c9 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 1 Sep 2021 15:25:33 +0200 Subject: [PATCH 275/319] :green_heart: fix lint --- .../conventions-collectives/bâtiment.yaml | 20 +-- .../experts-comptables.yaml | 4 +- .../hôtels-cafés-restaurants.yaml | 4 +- .../conventions-collectives/optique.yaml | 4 +- .../spectacle-vivant.yaml | 20 +-- .../règles/conventions-collectives/sport.yaml | 96 ++++++------- modele-social/règles/dirigeant.yaml | 128 ++++++++--------- .../déclaration-revenu-indépendant.yaml | 116 +++++++-------- modele-social/règles/impôt.yaml | 8 +- modele-social/règles/profession-libérale.yaml | 84 +++++------ modele-social/règles/protection-sociale.yaml | 16 +-- modele-social/règles/salarié.yaml | 136 +++++++++--------- mon-entreprise/package.json | 3 +- .../source/ATInternetTracking/smarttag.js | 71 ++++++--- .../CurrencyInput/CurrencyInput.tsx | 7 +- .../source/components/Distribution.tsx | 24 ++-- .../source/components/FindCompany.tsx | 13 +- .../source/components/SchemeComparaison.tsx | 7 +- .../source/components/TargetSelection.tsx | 13 +- .../components/conversation/AnswerList.tsx | 8 +- .../components/conversation/Question.tsx | 2 +- .../components/conversation/RuleInput.tsx | 8 +- .../IndépendantExplanation.tsx | 32 ++--- .../simulationExplanation/PLExplanation.tsx | 3 +- .../source/components/ui/SocialIcon.tsx | 30 ++-- .../utils/useSearchParamsSimulationSharing.ts | 10 +- .../source/locales/translateRules.ts | 18 ++- mon-entreprise/source/locales/ui-en.yaml | 6 +- mon-entreprise/source/locales/ui-fr.yaml | 9 +- .../RésultatSimple.tsx | 26 ++-- .../RésultatsParFormulaire.tsx | 16 ++- .../pages/Gérer/DemandeMobilite/FieldsPDF.tsx | 10 +- .../DemandeMobilite/demande-mobilité.yaml | 116 +++++++-------- mon-entreprise/source/pages/Gérer/Home.tsx | 5 +- .../ÉconomieCollaborative/VotreSituation.tsx | 6 +- .../ÉconomieCollaborative/selectors.js | 16 ++- mon-entreprise/source/pages/Stats/Stats.tsx | 2 +- mon-entreprise/source/reducers/rootReducer.ts | 6 +- .../selectors/companyStatusSelectors.ts | 61 ++++---- mon-entreprise/source/sentry.ts | 8 +- mon-entreprise/test/real-rules.test.js | 7 +- publicodes/core/source/AST/index.ts | 18 ++- publicodes/core/source/format.ts | 61 ++++---- publicodes/core/source/grammarFunctions.js | 28 ++-- publicodes/core/source/mecanisms/recalcul.ts | 2 +- .../résoudre-référence-circulaire.ts | 135 +++++++++-------- publicodes/core/source/units.ts | 13 +- publicodes/site/entry.tsx | 3 +- .../ui-react/source/mecanisms/Replacement.tsx | 5 +- yarn.lock | 34 ++--- 50 files changed, 742 insertions(+), 736 deletions(-) diff --git a/modele-social/règles/conventions-collectives/bâtiment.yaml b/modele-social/règles/conventions-collectives/bâtiment.yaml index ef5a56a25..a30282a06 100644 --- a/modele-social/règles/conventions-collectives/bâtiment.yaml +++ b/modele-social/règles/conventions-collectives/bâtiment.yaml @@ -24,8 +24,8 @@ contrat salarié . convention collective . BTP . catégorie . ouvrier: icônes: 👨‍🔧 formule: catégorie = 'ouvrier' -? contrat salarié . convention collective . BTP . catégorie . ouvrier . prévoyance complémentaire -: produit: +contrat salarié . convention collective . BTP . catégorie . ouvrier . prévoyance complémentaire: + produit: assiette: rémunération . brut de base plafond: 3 * plafond sécurité sociale composantes: @@ -55,8 +55,8 @@ contrat salarié . convention collective . BTP . catégorie . etam: note: >- Répartition conventionnelle fixée par l’article 5 de l’Accord du BTP du 13 décembre 1990. -? contrat salarié . convention collective . BTP . catégorie . etam . prévoyance complémentaire -: produit: +contrat salarié . convention collective . BTP . catégorie . etam . prévoyance complémentaire: + produit: assiette: rémunération . brut de base plafond: 3 * plafond sécurité sociale composantes: @@ -77,8 +77,8 @@ contrat salarié . convention collective . BTP . catégorie . cadre: - règle: statut cadre par: oui -? contrat salarié . convention collective . BTP . catégorie . cadre . prévoyance complémentaire -: barème: +contrat salarié . convention collective . BTP . catégorie . cadre . prévoyance complémentaire: + barème: assiette: rémunération . brut de base multiplicateur: plafond sécurité sociale composantes: @@ -138,8 +138,8 @@ contrat salarié . convention collective . BTP . congés intempéries: CIBTP: https://www.cibtp.fr/ Article L3141-30 du Code du Travail: https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=DF6E6424807679A6EDC2915496BEA32D.tplgfr22s_2?idArticle=LEGIARTI000033020675&cidTexte=LEGITEXT000006072050&dateTexte=20200320 -? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement -: question: À quelle caisse l'entreprise est-elle rattachée pour le versement de la cotisation congés intempéries ? +contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement: + question: À quelle caisse l'entreprise est-elle rattachée pour le versement de la cotisation congés intempéries ? formule: une possibilité: choix obligatoire: oui @@ -155,8 +155,8 @@ contrat salarié . convention collective . BTP . congés intempéries: - sud ouest par défaut: "'idf'" -? contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . idf -: titre: Île-de-France +contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . idf: + titre: Île-de-France contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . nord ouest: contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . grand ouest: contrat salarié . convention collective . BTP . congés intempéries . caisse de rattachement . centre ouest: diff --git a/modele-social/règles/conventions-collectives/experts-comptables.yaml b/modele-social/règles/conventions-collectives/experts-comptables.yaml index 2ceff9b8f..2e53ae7f7 100644 --- a/modele-social/règles/conventions-collectives/experts-comptables.yaml +++ b/modele-social/règles/conventions-collectives/experts-comptables.yaml @@ -10,8 +10,8 @@ contrat salarié . convention collective . compta: Légifrance: https://www.legifrance.gouv.fr/affichIDCC.do?idConvention=KALICONT000005635826 Synthèse Dicotravail: https://www.dicotravail.com/convention-collective/experts-comptables-jo-3020-idcc-787/ -? contrat salarié . convention collective . compta . majoration heures supplémentaires -: remplace: temps de travail . heures supplémentaires . majoration +contrat salarié . convention collective . compta . majoration heures supplémentaires: + remplace: temps de travail . heures supplémentaires . majoration formule: barème: assiette: temps de travail . heures supplémentaires diff --git a/modele-social/règles/conventions-collectives/hôtels-cafés-restaurants.yaml b/modele-social/règles/conventions-collectives/hôtels-cafés-restaurants.yaml index 422ef65df..379cbc551 100644 --- a/modele-social/règles/conventions-collectives/hôtels-cafés-restaurants.yaml +++ b/modele-social/règles/conventions-collectives/hôtels-cafés-restaurants.yaml @@ -9,8 +9,8 @@ contrat salarié . convention collective . HCR . montant forfaitaire d'un repas: règle: rémunération . avantages en nature . nourriture . montant . repas forfaitaire formule: 3.62 €/repas -? contrat salarié . convention collective . HCR . majoration heures supplémentaires -: remplace: temps de travail . heures supplémentaires . majoration +contrat salarié . convention collective . HCR . majoration heures supplémentaires: + remplace: temps de travail . heures supplémentaires . majoration formule: barème: assiette: temps de travail . heures supplémentaires diff --git a/modele-social/règles/conventions-collectives/optique.yaml b/modele-social/règles/conventions-collectives/optique.yaml index 43216a8c8..553b2480c 100644 --- a/modele-social/règles/conventions-collectives/optique.yaml +++ b/modele-social/règles/conventions-collectives/optique.yaml @@ -25,8 +25,8 @@ contrat salarié . convention collective . optique . prime d'ancienneté: références: Légifrance: https://www.legifrance.gouv.fr/affichIDCC.do?idSectionTA=KALISCTA000005736434&cidTexte=KALITEXT000005649634&idConvention=KALICONT000005635912 -? contrat salarié . convention collective . optique . salaire minimum conventionnel -: unité: €/mois +contrat salarié . convention collective . optique . salaire minimum conventionnel: + unité: €/mois formule: variations: - si: coefficient < 110 diff --git a/modele-social/règles/conventions-collectives/spectacle-vivant.yaml b/modele-social/règles/conventions-collectives/spectacle-vivant.yaml index 09200b8af..ab9b11e1e 100644 --- a/modele-social/règles/conventions-collectives/spectacle-vivant.yaml +++ b/modele-social/règles/conventions-collectives/spectacle-vivant.yaml @@ -85,8 +85,8 @@ contrat salarié . intermittents du spectacle . caisse des congés spectacle: audiens.org: https://www.audiens.org/files/live/sites/siteAudiens/files/03_documents/entreprise/Fiches-techniques/Conges-Spectacles-Mode-d-emploi-employeur-2019.pdf Article L3141-30 du Code du Travail: https://www.legifrance.gouv.fr/affichCodeArticle.do;jsessionid=DF6E6424807679A6EDC2915496BEA32D.tplgfr22s_2?idArticle=LEGIARTI000033020675&cidTexte=LEGITEXT000006072050&dateTexte=20200320 -? contrat salarié . intermittents du spectacle . retraite complémentaire techniciens et cadre -: applicable si: +contrat salarié . intermittents du spectacle . retraite complémentaire techniciens et cadre: + applicable si: une de ces conditions: - statut cadre - technicien @@ -191,16 +191,16 @@ contrat salarié . intermittents du spectacle . artiste . réduction de taux: par: FNAL . taux * réduction de taux formule: 70% -? contrat salarié . intermittents du spectacle . artiste . réduction de taux . ATMP -: remplace: ATMP . taux +contrat salarié . intermittents du spectacle . artiste . réduction de taux . ATMP: + remplace: ATMP . taux formule: variations: - si: régime alsace moselle alors: 1.54% - sinon: 1.12% -? contrat salarié . intermittents du spectacle . artiste . nombre jours travaillés -: question: Pour combien de jours continus l'artiste est-il engagé ? +contrat salarié . intermittents du spectacle . artiste . nombre jours travaillés: + question: Pour combien de jours continus l'artiste est-il engagé ? par défaut: 5 jours contrat salarié . intermittents du spectacle . artiste . plafond proratisé: @@ -222,12 +222,12 @@ contrat salarié . intermittents du spectacle . artiste . acteur de complément: question: L'artiste est-il un acteur de complément engagé à la journée pour une production cinématographique ? par defaut: non -? contrat salarié . intermittents du spectacle . artiste . acteur de complément . nombre jours travaillés -: remplace: artiste . nombre jours travaillés +contrat salarié . intermittents du spectacle . artiste . acteur de complément . nombre jours travaillés: + remplace: artiste . nombre jours travaillés formule: 1 -? contrat salarié . intermittents du spectacle . artiste . acteur de complément . assiette forfaitaire -: applicable si: rémunération . brut < 6% * plafond sécurité sociale temps plein +contrat salarié . intermittents du spectacle . artiste . acteur de complément . assiette forfaitaire: + applicable si: rémunération . brut < 6% * plafond sécurité sociale temps plein remplace: - contrat salarié . cotisations . assiette forfaitaire - règle: nombre jours travaillés diff --git a/modele-social/règles/conventions-collectives/sport.yaml b/modele-social/règles/conventions-collectives/sport.yaml index 430e82c3e..f9f193a82 100644 --- a/modele-social/règles/conventions-collectives/sport.yaml +++ b/modele-social/règles/conventions-collectives/sport.yaml @@ -17,8 +17,8 @@ contrat salarié . convention collective . sport . cotisations . patronales: - prévoyance . employeur - financement du paritarisme -? contrat salarié . convention collective . sport . cotisations . financement du paritarisme -: # TODO +contrat salarié . convention collective . sport . cotisations . financement du paritarisme: + # TODO note: se calcule sur la masse salariale formule: produit: @@ -49,15 +49,15 @@ contrat salarié . convention collective . sport . cotisations . prévoyance: références: Article 10.8 de la CCNS (IDCC 2511): https://www.legifrance.gouv.fr/affichIDCCArticle.do;?idArticle=KALIARTI000033304755&cidTexte=KALITEXT000017577657&dateTexte=29990101&categorieLien=id -? contrat salarié . convention collective . sport . cotisations . régime frais de santé -: remplace: contrat salarié . complémentaire santé . forfait +contrat salarié . convention collective . sport . cotisations . régime frais de santé: + remplace: contrat salarié . complémentaire santé . forfait formule: produit: assiette: plafond sécurité sociale temps plein taux: taux -? contrat salarié . convention collective . sport . cotisations . régime frais de santé . taux -: formule: +contrat salarié . convention collective . sport . cotisations . régime frais de santé . taux: + formule: variations: - si: régime alsace moselle alors: @@ -80,8 +80,8 @@ contrat salarié . convention collective . sport . cotisations . prévoyance: unamens.fr: https://www.umanens.fr/reglementation-couverture-sante-obligatoire/ccn-sport unamens (notice pdf): https://www.umanens.fr/documents/doc-offres-2018/sport/juin-2019/CCN_SPORT_PLAQ_EMPLOYEUR_2019.pdf -? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option -: question: Quel option a été choisi pour le régime des frais de santé ? +contrat salarié . convention collective . sport . cotisations . régime frais de santé . option: + question: Quel option a été choisi pour le régime des frais de santé ? formule: une possibilité: choix obligatoire: oui @@ -92,15 +92,15 @@ contrat salarié . convention collective . sport . cotisations . prévoyance: par défaut: "'R1'" références: unamens.fr: https://www.umanens.fr/reglementation-couverture-sante-obligatoire/ccn-sport -? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R1 -: formule: option = 'R1' -? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R2 -: formule: option = 'R2' -? contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R3 -: formule: option = 'R3' +contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R1: + formule: option = 'R1' +contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R2: + formule: option = 'R2' +contrat salarié . convention collective . sport . cotisations . régime frais de santé . option . R3: + formule: option = 'R3' -? contrat salarié . convention collective . sport . cotisations . formation professionnelle -: remplace: contrat salarié . formation professionnelle +contrat salarié . convention collective . sport . cotisations . formation professionnelle: + remplace: contrat salarié . formation professionnelle formule: somme: - plan de formation @@ -110,8 +110,8 @@ contrat salarié . convention collective . sport . cotisations . prévoyance: références: Article 8.6 de la CCNS (IDCC2511): https://www.legifrance.gouv.fr/affichIDCCArticle.do;?idArticle=KALIARTI000034406905&cidTexte=KALITEXT000017577657&dateTexte=29990101&categorieLien=id -? contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation -: formule: +contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation: + formule: produit: assiette: cotisations . assiette taux: @@ -122,12 +122,12 @@ contrat salarié . convention collective . sport . cotisations . prévoyance: alors: 0.90% plancher: versement minimum -? contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation . versement minimum -: applicable si: entreprise . effectif < 10 +contrat salarié . convention collective . sport . cotisations . formation professionnelle . plan de formation . versement minimum: + applicable si: entreprise . effectif < 10 formule: 30 €/mois -? contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation -: formule: +contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation: + formule: produit: assiette: cotisations . assiette taux: @@ -138,12 +138,12 @@ contrat salarié . convention collective . sport . cotisations . prévoyance: alors: 0.50% plancher: versement minimum -? contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation . versement minimum -: applicable si: entreprise . effectif < 10 +contrat salarié . convention collective . sport . cotisations . formation professionnelle . professionnalisation . versement minimum: + applicable si: entreprise . effectif < 10 formule: 5 €/mois -? contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDI -: applicable si: +contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDI: + applicable si: toutes ces conditions: - CDI - entreprise . effectif >= 20 @@ -152,15 +152,15 @@ contrat salarié . convention collective . sport . cotisations . prévoyance: assiette: cotisations . assiette taux: 0.20% -? contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDD -: applicable si: CDD +contrat salarié . convention collective . sport . cotisations . formation professionnelle . CIF CDD: + applicable si: CDD formule: produit: assiette: cotisations . assiette taux: 1% -? contrat salarié . convention collective . sport . cotisations . assiette franchisée -: formule: +contrat salarié . convention collective . sport . cotisations . assiette franchisée: + formule: valeur: cotisations . assiette abattement: franchise @@ -178,13 +178,13 @@ contrat salarié . convention collective . sport . exonération cotisation AT: par: non formule: oui -? contrat salarié . convention collective . sport . exonération cotisation AT . refus -: titre: refus exonération AT +contrat salarié . convention collective . sport . exonération cotisation AT . refus: + titre: refus exonération AT question: L'employeur a-t'il refusé d'être exonéré de cotisations AT ? par défaut: non -? contrat salarié . convention collective . sport . cotisations . assiette forfaitaire -: applicable si: assiette franchisée < SMIC horaire * 115 heures/mois +contrat salarié . convention collective . sport . cotisations . assiette forfaitaire: + applicable si: assiette franchisée < SMIC horaire * 115 heures/mois remplace: contrat salarié . cotisations . assiette forfaitaire formule: grille: @@ -203,8 +203,8 @@ contrat salarié . convention collective . sport . exonération cotisation AT: - montant: 50 * SMIC horaire plafond: 115 heures -? contrat salarié . convention collective . sport . primes . nombre de manifestations -: question: Combien de manifestations rémunérées le joueur a-t'il effectué ? +contrat salarié . convention collective . sport . primes . nombre de manifestations: + question: Combien de manifestations rémunérées le joueur a-t'il effectué ? #TODO : gérer la période par défaut: 0 manifestations @@ -227,8 +227,8 @@ contrat salarié . convention collective . sport . primes . manifestation 1: applicable si: nombre de manifestations > 0 par défaut: 100 € -? contrat salarié . convention collective . sport . primes . manifestation 1 . franchise -: titre: franchise manifestation 1 +contrat salarié . convention collective . sport . primes . manifestation 1 . franchise: + titre: franchise manifestation 1 formule: valeur: manifestation 1 plafond: 70% * plafond journalier sécurité sociale @@ -238,8 +238,8 @@ contrat salarié . convention collective . sport . primes . manifestation 2: applicable si: nombre de manifestations > 1 par défaut: 100 € -? contrat salarié . convention collective . sport . primes . manifestation 2 . franchise -: titre: franchise manifestation 2 +contrat salarié . convention collective . sport . primes . manifestation 2 . franchise: + titre: franchise manifestation 2 formule: valeur: manifestation 2 plafond: 70% * plafond journalier sécurité sociale @@ -249,8 +249,8 @@ contrat salarié . convention collective . sport . primes . manifestation 3: applicable si: nombre de manifestations > 2 par défaut: 100 € -? contrat salarié . convention collective . sport . primes . manifestation 3 . franchise -: titre: franchise manifestation 3 +contrat salarié . convention collective . sport . primes . manifestation 3 . franchise: + titre: franchise manifestation 3 formule: valeur: manifestation 3 plafond: 70% * plafond journalier sécurité sociale @@ -260,8 +260,8 @@ contrat salarié . convention collective . sport . primes . manifestation 4: applicable si: nombre de manifestations > 3 par défaut: 100 € -? contrat salarié . convention collective . sport . primes . manifestation 4 . franchise -: titre: franchise manifestation 4 +contrat salarié . convention collective . sport . primes . manifestation 4 . franchise: + titre: franchise manifestation 4 formule: valeur: manifestation 4 plafond: 70% * plafond journalier sécurité sociale @@ -271,14 +271,14 @@ contrat salarié . convention collective . sport . primes . manifestation 5: applicable si: nombre de manifestations > 4 par défaut: 100 € -? contrat salarié . convention collective . sport . primes . manifestation 5 . franchise -: titre: franchise manifestation 5 +contrat salarié . convention collective . sport . primes . manifestation 5 . franchise: + titre: franchise manifestation 5 formule: valeur: manifestation 5 plafond: 70% * plafond journalier sécurité sociale -? contrat salarié . convention collective . sport . primes . autres manifestations -: question: Quelles primes pour les autres manifestations ? +contrat salarié . convention collective . sport . primes . autres manifestations: + question: Quelles primes pour les autres manifestations ? applicable si: nombre de manifestations > 5 par défaut: 100 € diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index adaded5c4..9477e1aeb 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -227,8 +227,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers: références: service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32847 -? dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Alsace -: remplace: +dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Alsace: + remplace: - règle: taux service par: 0.65% - règle: taux vente @@ -239,8 +239,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers: références: service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32847 -? dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Moselle -: remplace: +dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers . taux Moselle: + remplace: - règle: taux service par: 0.83% - règle: taux vente @@ -249,8 +249,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . TFC . métiers: références: service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32847 -? dirigeant . auto-entrepreneur . cotisations et contributions . contribution formation professionnelle -: titre: Contribution à la formation professionnelle +dirigeant . auto-entrepreneur . cotisations et contributions . contribution formation professionnelle: + titre: Contribution à la formation professionnelle description: | En plus des charges sociales, les auto-entrepreneurs sont redevables d’une contribution à la formation professionnelle leur permettant de bénéficier du @@ -310,8 +310,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations: economie.gouv.fr: https://www.economie.gouv.fr/entreprises/micro-entreprise-auto-entreprise-charges-sociales actualité urssaf.fr (2019): https://www.autoentrepreneur.urssaf.fr/portail/accueil/sinformer-sur-le-statut/toutes-les-actualites/nouveautes-2019--ce-qui-change-e.html -? dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE -: titre: taux ACRE auto-entrepreneur +dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE: + titre: taux ACRE auto-entrepreneur applicable si: entreprise . ACRE remplace: règle: taux vente restauration hébergement @@ -356,8 +356,8 @@ dirigeant . auto-entrepreneur . cotisations et contributions . cotisations: FAQ Urssaf avant 04/2020: https://www.autoentrepreneur.urssaf.fr/portail/accueil/une-question/questions-frequentes.html#quest-ce-qui-change-pour-moi-si service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32318 -? dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE . prestation de service -: remplace: taux prestation de service +dirigeant . auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE . prestation de service: + remplace: taux prestation de service titre: taux prestation de service avec ACRE variations: - si: @@ -553,8 +553,8 @@ dirigeant . indépendant . cotisations et contributions . PSS proratisé: plafond: 100% arrondi: oui -? dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . prorata sur l'année -: description: | +dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . prorata sur l'année: + description: | Comme le calcul des cotisations indépendants s'effectue sur l'année entière, l'exonération est proratisée en fonction de la durée effective de l'ACRE sur l'année courante. @@ -565,8 +565,8 @@ dirigeant . indépendant . cotisations et contributions . PSS proratisé: formule: (1 an - entreprise . durée d'activité . en début d'année) / 1 an -? dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . taux -: formule: +dirigeant . indépendant . cotisations et contributions . exonérations . ACRE . taux: + formule: taux progressif: assiette: assiette des cotisations multiplicateur: PSS proratisé @@ -601,8 +601,8 @@ dirigeant . indépendant . conjoint collaborateur . assiette . forfaitaire: une assiette équivalente à 40% du PASS. formule: assiette = 'forfaitaire' -? dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec partage -: description: | +dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec partage: + description: | Le conjoint collaborateur et le gérant paieront des cotisations sociales chacun sur une part du revenu professionnel. **Cette option baisse le montant des cotisations à payer pour le gérant, mais elle diminue également ses contreparties sociales (pension de retraite, indemnité décès, etc)** formule: assiette = 'revenu avec partage' @@ -613,8 +613,8 @@ dirigeant . indépendant . conjoint collaborateur . assiette . forfaitaire: - cotisations et contributions . retraite de base - cotisations et contributions . retraite complémentaire - cotisations et contributions . invalidité et décès -? dirigeant . indépendant . conjoint collaborateur . assiette . revenu sans partage -: description: Le conjoint collaborateur paiera des cotisations sociales calculées sur une base d'un pourcentage du assiette des cotisations du gérant de l'entreprise (un tiers ou la moitié). +dirigeant . indépendant . conjoint collaborateur . assiette . revenu sans partage: + description: Le conjoint collaborateur paiera des cotisations sociales calculées sur une base d'un pourcentage du assiette des cotisations du gérant de l'entreprise (un tiers ou la moitié). formule: assiette = 'revenu sans partage' dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: @@ -627,12 +627,12 @@ dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: - tiers - moitié -? dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . tiers -: formule: pourcentage = 'tiers' +dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . tiers: + formule: pourcentage = 'tiers' titre: '1/3' -? dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . moitié -: formule: pourcentage = 'moitié' +dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . moitié: + formule: pourcentage = 'moitié' titre: '1/2' dirigeant . indépendant . conjoint collaborateur . cotisations . assiette: @@ -660,16 +660,16 @@ dirigeant . indépendant . conjoint collaborateur . cotisations: - invalidité et décès - indemnités journalières maladie -? dirigeant . indépendant . conjoint collaborateur . cotisations . assiette retraite -: le maximum de: +dirigeant . indépendant . conjoint collaborateur . cotisations . assiette retraite: + le maximum de: - cotisations . assiette - 5.25% * plafond sécurité sociale temps plein - 200 heures/an * SMIC horaire unité: €/an arrondi: oui -? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite de base -: unité: €/an +dirigeant . indépendant . conjoint collaborateur . cotisations . retraite de base: + unité: €/an barème: assiette: assiette retraite multiplicateur: plafond sécurité sociale temps plein @@ -679,8 +679,8 @@ dirigeant . indépendant . conjoint collaborateur . cotisations: - taux: 0.6% arrondi: oui -? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire -: unité: €/an +dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire: + unité: €/an barème: assiette: retraite complémentaire . assiette tranches: @@ -690,8 +690,8 @@ dirigeant . indépendant . conjoint collaborateur . cotisations: plafond: 4 * plafond sécurité sociale temps plein arrondi: oui -? dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire . assiette -: titre: assiette retraite complémentaire +dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire . assiette: + titre: assiette retraite complémentaire unité: €/an valeur: assiette retraite plafond: @@ -700,22 +700,22 @@ dirigeant . indépendant . conjoint collaborateur . cotisations: alors: 4 * plafond sécurité sociale temps plein - sinon: 3 * plafond sécurité sociale temps plein -? dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès . assiette -: titre: assiette invalidité et décès +dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès . assiette: + titre: assiette invalidité et décès formule: le maximum de: - cotisations . assiette - 20% * plafond sécurité sociale temps plein -? dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès -: unité: €/an +dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès: + unité: €/an produit: assiette: assiette taux: 1.3% plafond: plafond sécurité sociale temps plein arrondi: oui -? dirigeant . indépendant . conjoint collaborateur . cotisations . indemnités journalières maladie -: produit: +dirigeant . indépendant . conjoint collaborateur . cotisations . indemnités journalières maladie: + produit: assiette: valeur: 40% * plafond sécurité sociale temps plein unité: €/an @@ -789,8 +789,8 @@ dirigeant . indépendant . assiette minimale . retraite: références: cotisations minimales: https://www.secu-independants.fr/cotisations/calcul-cotisations/cotisations-minimales/ -? dirigeant . indépendant . cotisations et contributions . contributions spéciales -: description: | +dirigeant . indépendant . cotisations et contributions . contributions spéciales: + description: | Certains régimes spéciaux peuvent ajouter des contributions additionnelles (par exemple, la CURPS pour les CPAM) formule: non @@ -816,8 +816,8 @@ dirigeant . indépendant . cotisations et contributions . déduction tabac: Si vous exercez une activité de débit de tabac simultanément à une activité commerciale, vous avez la possibilité d’opter pour le calcul de votre cotisation d’assurance vieillesse sur le seul revenu tiré de votre activité commerciale (en effet, les remises pour débit de tabac sont soumises par ailleurs à un prélèvement vieillesse particulier). Nous attirons cependant votre attention sur le fait qu’en cotisant sur une base moins importante, excluant les revenus de débit de tabac, vos droits à retraite pour l’assurance vieillesse des commerçants en seront diminués. par défaut: 0 €/an -? dirigeant . indépendant . cotisations et contributions . déduction tabac . revenus déduits -: titre: assiette des cotisations (avec déduction tabac) +dirigeant . indépendant . cotisations et contributions . déduction tabac . revenus déduits: + titre: assiette des cotisations (avec déduction tabac) applicable si: déduction tabac remplace: règle: assiette des cotisations @@ -879,8 +879,8 @@ dirigeant . indépendant . cotisations facultatives . contrats madelin: - prévoyance - retraite -? dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance -: titre: Souscription à un contrat de prévoyance complémentaire Madelin +dirigeant . indépendant . cotisations facultatives . contrats madelin . prévoyance: + titre: Souscription à un contrat de prévoyance complémentaire Madelin question: Quel est le montant que vous versez pour vos contrats Madelin de prévoyance complémentaire (santé, perte d'emploi subie) ? unité: €/an description: | @@ -912,8 +912,8 @@ dirigeant . indépendant . cotisations facultatives . plafond prévoyance: Réassurez-moi: https://reassurez-moi.fr/guide/pro/tns/plafond#le_plafond_de_deduction_madelin_pour_une_mutuelle_santenbsp note: | Normalement c'est le résultat fiscal qui devrait être utilisé pour l'assiette du plafond, mais on utilise le revenu professionnel pour éviter un cycle. -? dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite -: titre: Souscription à une retraite Madelin +dirigeant . indépendant . cotisations facultatives . contrats madelin . retraite: + titre: Souscription à une retraite Madelin question: Quel est le montant que vous versez pour votre contrat Madelin retraite complémentaire ? description: | Si vous cotisez au titre d'un contrat retraite de type loi Madelin, @@ -925,8 +925,8 @@ dirigeant . indépendant . cotisations facultatives . plafond prévoyance: Article de loi: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000029042287&cidTexte=LEGITEXT000006069577&dateTexte=20140530&fastReqId=1900907951&nbResultRech=1 par défaut: 0 €/an -? dirigeant . indépendant . cotisations facultatives . plafond retraite complémentaire -: unité: €/an +dirigeant . indépendant . cotisations facultatives . plafond retraite complémentaire: + unité: €/an formule: le maximum de: - barème: @@ -981,8 +981,8 @@ dirigeant . indépendant . cotisations et contributions . début activité: références: Fiche Urssaf: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/le-mode-de-calcul/lajustement-et-la-regularisation.html -? dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire -: produit: +dirigeant . indépendant . cotisations et contributions . début activité . assiette forfaitaire: + produit: assiette: PSS proratisé taux: 19% unité: €/an @@ -1016,8 +1016,8 @@ dirigeant . indépendant . cotisations et contributions . régularisation: Article L131-6-2 du Code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000037062224/ Article D131-3 du Code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000038786941/2021-03-01/?isSuggest=true -? dirigeant . indépendant . cotisations et contributions . indemnités journalières maladie -: synonyme: maladie 2 +dirigeant . indépendant . cotisations et contributions . indemnités journalières maladie: + synonyme: maladie 2 description: | Cotisations pour les indemnités journalières des indépendants. Si l'état de santé des artisans, commerçants, industriels et conjoints collaborateurs @@ -1061,8 +1061,8 @@ dirigeant . indépendant . cotisations et contributions . maladie: Le terme "lorsque" laisse entendre qu'en cas de dépassement du seuil 5xPSS, tout le revenu est soumis à 6.5%. Il semblerait qu'une interprétation inverse soit à privilégier : seule la part supérieure à ce seuil est soumise à ce taux, et c'est cette implémentation que nous avons retenue. -? dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire -: description: | +dirigeant . indépendant . cotisations et contributions . maladie . taux progressif . réduction supplémentaire: + description: | La réduction supplémentaire du taux maladie pour les revenu inférieurs à 40% du plafond de la sécurité sociale non applicable si: situation personnelle . RSA remplace: @@ -1080,8 +1080,8 @@ dirigeant . indépendant . cotisations et contributions . maladie: Taux de cotisations: https://www.secu-independants.fr/cotisations/calcul-cotisations/taux-de-cotisations/ décret formule de calcul: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000036342439&categorieLien=id -? dirigeant . indépendant . cotisations et contributions . maladie . taux progressif -: taux progressif: +dirigeant . indépendant . cotisations et contributions . maladie . taux progressif: + taux progressif: assiette: nom: assiette valeur: assiette des cotisations @@ -1109,8 +1109,8 @@ dirigeant . indépendant . cotisations et contributions . retraite de base: références: Cotisation minimale: https://www.secu-independants.fr/cotisations/calcul-des-cotisations/cotisations-minimales/ -? dirigeant . indépendant . cotisations et contributions . retraite complémentaire -: formule: +dirigeant . indépendant . cotisations et contributions . retraite complémentaire: + formule: barème: assiette: assiette des cotisations tranches: @@ -1199,8 +1199,8 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS . assiette - dirigeant . indépendant . IJSS . imposable plancher: 0 €/mois -? dirigeant . indépendant . cotisations et contributions . formation professionnelle -: acronyme: CFP +dirigeant . indépendant . cotisations et contributions . formation professionnelle: + acronyme: CFP produit: assiette: plafond sécurité sociale temps plein taux: @@ -1261,8 +1261,8 @@ dirigeant . indépendant . cotisations et contributions . exonérations . âge: applicable si: entreprise . date de création < 01/2016 rend non applicable: invalidité et décès -? dirigeant . indépendant . cotisations et contributions . exonérations . invalidité -: question: Êtes-vous titulaire d’une pension d’invalidité à titre de travailleur indépendant ? +dirigeant . indépendant . cotisations et contributions . exonérations . invalidité: + question: Êtes-vous titulaire d’une pension d’invalidité à titre de travailleur indépendant ? description: Les personnes titulaires d’une pension d’invalidité versée par un régime des travailleurs non-salariés non agricoles bénéficient d’une exonération totale des cotisations maladie et retraite complémentaire. par défaut: non rend non applicable: @@ -1271,8 +1271,8 @@ dirigeant . indépendant . cotisations et contributions . exonérations . âge: - indemnités journalières maladie - retraite complémentaire -? dirigeant . indépendant . cotisations et contributions . exonérations . ZFU . taux -: titre: taux exonération ZFU +dirigeant . indépendant . cotisations et contributions . exonérations . ZFU . taux: + titre: taux exonération ZFU formule: taux progressif: assiette: établissement . ZFU . durée d'implantation en fin d'année @@ -1310,8 +1310,8 @@ dirigeant . indépendant . cotisations et contributions . exonérations . âge: - plafond: 9 ans taux: 0% -? dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger -: applicable si: situation personnelle . domiciliation fiscale à l'étranger +dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger: + applicable si: situation personnelle . domiciliation fiscale à l'étranger titre: Maladie (domiciliation fiscale à l'étranger) description: En contrepartie de l'exonération de CSG, les cotisants ont un taux maladie plus elevé. Contrairement aux autres assurés commerçants/artisans ils ne bénéficient pas de la réduction du taux de la cotisation maladie en fonction du revenu déclaré. remplace: maladie diff --git a/modele-social/règles/déclaration-revenu-indépendant.yaml b/modele-social/règles/déclaration-revenu-indépendant.yaml index c0eb282e0..a6e956e7b 100644 --- a/modele-social/règles/déclaration-revenu-indépendant.yaml +++ b/modele-social/règles/déclaration-revenu-indépendant.yaml @@ -53,8 +53,8 @@ aide déclaration revenu indépendant 2020 . cotisations payées: non applicable si: résultat simple valeur: oui -? aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociales -: remplace: +aide déclaration revenu indépendant 2020 . cotisations payées . total charges sociales: + remplace: règle: dirigeant . indépendant . cotisations et contributions par: somme: @@ -83,8 +83,8 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CSG déductib 3. Puis, "attestation CSG/CRDS" 4. Reportez dans ce champs le total de la colonne "Montant déductible CSG" (dernière ligne) -? aide déclaration revenu indépendant 2020 . cotisations payées . CSG non déductible -: question: Quel est le montant total de CSG non déductible payé cette année ? +aide déclaration revenu indépendant 2020 . cotisations payées . CSG non déductible: + question: Quel est le montant total de CSG non déductible payé cette année ? unité: €/an description: | Vous pouvez retrouver ce montant dans votre espace personnel Urssaf. Voici la marche à suivre : @@ -107,8 +107,8 @@ aide déclaration revenu indépendant 2020 . cotisations payées . CRDS: 3. Puis, "attestation CSG/CRDS" 4. Reportez dans ce champs le total de la colonne "Montant non déductible : CRDS" (dernière ligne) -? aide déclaration revenu indépendant 2020 . cotisations payées . cotisations obligatoires déductibles -: remplace: cotisations obligatoires déductibles +aide déclaration revenu indépendant 2020 . cotisations payées . cotisations obligatoires déductibles: + remplace: cotisations obligatoires déductibles unité: €/an valeur: cotisations payées . total charges sociales abattement: @@ -133,20 +133,20 @@ aide déclaration revenu indépendant 2020 . cotisations payées version simple: - cotisations payées version simple . cotisations sociales - cotisations payées version simple . CSG déductible et CFP -? aide déclaration revenu indépendant 2020 . cotisations payées version simple . CSG déductible et CFP -: question: Quel est le montant total de CSG déductible et CFP payées cette année ? +aide déclaration revenu indépendant 2020 . cotisations payées version simple . CSG déductible et CFP: + question: Quel est le montant total de CSG déductible et CFP payées cette année ? unité: €/an description: | Indiquez le montant de la part de CSG déductible et de CFP que vous avez payé en 2020 (peu importe l’année à laquelle ces contributions se rapportent). -? aide déclaration revenu indépendant 2020 . cotisations payées version simple . cotisations sociales -: question: Quel est le montant de vos cotisations sociales payées cette année ? +aide déclaration revenu indépendant 2020 . cotisations payées version simple . cotisations sociales: + question: Quel est le montant de vos cotisations sociales payées cette année ? unité: €/an description: | Indiquez le montant des cotisations sociales aux régimes obligatoires (maladie-maternité, vieillesse, invalidité-décès, famille) que vous avez payées en 2020 (peu importe l’année à laquelle ces cotisations se rapportent). aide déclaration revenu indépendant 2020 . régime d'imposition: oui -? aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée -: titre: régime de la déclaration contrôlée +aide déclaration revenu indépendant 2020 . régime d'imposition . déclaration contrôlée: + titre: régime de la déclaration contrôlée applicable si: entreprise . activité . libérale non applicable si: une de ces conditions: @@ -178,8 +178,8 @@ aide déclaration revenu indépendant 2020 . régime d'imposition . réel: - simplifié - normal -? aide déclaration revenu indépendant 2020 . régime d'imposition . réel . simplifié -: description: | +aide déclaration revenu indépendant 2020 . régime d'imposition . réel . simplifié: + description: | Les entreprises soumises au régime d'imposition réel simplifié doivent tenir une comptabilité classique : un bilan, un compte de résultat et des annexes. Des dispositions particulières s’appliquent pour alléger vos obligations comptables : - le livre journal n’enregistre journellement que les recettes encaissées et les dépenses payées @@ -353,8 +353,8 @@ aide déclaration revenu indépendant 2020 . réduction covid . montant: somme: - printemps 2020 - automne 2020 -? aide déclaration revenu indépendant 2020 . réduction covid . conjoint collaborateur -: applicable si: dirigeant . indépendant . conjoint collaborateur +aide déclaration revenu indépendant 2020 . réduction covid . conjoint collaborateur: + applicable si: dirigeant . indépendant . conjoint collaborateur remplace: règle: dirigeant . indépendant . conjoint collaborateur . cotisations par: @@ -377,23 +377,23 @@ aide déclaration revenu indépendant 2020 . réduction covid . part cotisations assiette: montant taux: pourcentage cotisations -? aide déclaration revenu indépendant 2020 . réduction covid . pourcentage cotisations -: unité: '%' +aide déclaration revenu indépendant 2020 . réduction covid . pourcentage cotisations: + unité: '%' valeur: dirigeant . indépendant . cotisations et contributions . cotisations / (dirigeant . indépendant . cotisations et contributions . cotisations + dirigeant . indépendant . cotisations et contributions . CSG et CRDS) aide déclaration revenu indépendant 2020 . réduction covid . part CSG: titre: Part réduction Covid sur CSG valeur: montant - part cotisations -? aide déclaration revenu indépendant 2020 . réduction covid . part CSG . déductible -: titre: Part réduction Covid sur CSG/CRDS déductible +aide déclaration revenu indépendant 2020 . réduction covid . part CSG . déductible: + titre: Part réduction Covid sur CSG/CRDS déductible produit: assiette: part CSG taux: dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible . taux / taux CSG arrondi: oui -? aide déclaration revenu indépendant 2020 . réduction covid . part CSG . non déductible -: titre: Part réduction Covid sur CSG/CRDS non déductible +aide déclaration revenu indépendant 2020 . réduction covid . part CSG . non déductible: + titre: Part réduction Covid sur CSG/CRDS non déductible valeur: part CSG - part CSG . déductible aide déclaration revenu indépendant 2020 . réduction covid . taux CSG: @@ -403,16 +403,16 @@ aide déclaration revenu indépendant 2020 . réduction covid . taux CSG: - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible . taux - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible . taux -? aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020 -: applicable si: éligible aide printemps 2020 +aide déclaration revenu indépendant 2020 . réduction covid . montant . printemps 2020: + applicable si: éligible aide printemps 2020 formule: variations: - si: secteur d'activité = 'S2' alors: 1800 €/an - sinon: 2400 €/an -? aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020 -: applicable si: éligible aide automne 2020 +aide déclaration revenu indépendant 2020 . réduction covid . montant . automne 2020: + applicable si: éligible aide automne 2020 formule: nombre de mois éligibles * 600 €/an/mois éligibles aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité: @@ -449,22 +449,22 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi - S2 par défaut: non -? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1 -: titre: Secteur dit S1 +aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1: + titre: Secteur dit S1 description: | Secteurs du tourisme, de l’hôtellerie, de la restauration, du sport, de la culture, du transport aérien et de l’événementiel. -? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis -: titre: Secteur dit S1 bis +aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S1-bis: + titre: Secteur dit S1 bis description: | Secteurs dont l’activité dépend de celle des secteurs 1 et qui ont subi une très forte baisse de leur chiffre d’affaires. -? aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2 -: titre: Secteur dit S2 +aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activité . S2: + titre: Secteur dit S2 description: Autres secteurs d’activité qui ont fait l’objet d’une interdiction affectant de manière prépondérante la poursuite de leur activité. -? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020 -: applicable si: secteur d'activité +aide déclaration revenu indépendant 2020 . réduction covid . éligible aide printemps 2020: + applicable si: secteur d'activité question: Êtes-vous éligibles au dispositif de réduction prévu au titre de la première vague de la crise sanitaire du printemps 2020 ? par défaut: non description: | @@ -499,8 +499,8 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi Votre activité doit avoir débuté avant le 1er juin 2020. Si vous avez cessé votre activité, la cessation doit être postérieure ou égale au 15 mars 2020. -? aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020 -: applicable si: secteur d'activité +aide déclaration revenu indépendant 2020 . réduction covid . éligible aide automne 2020: + applicable si: secteur d'activité question: Êtes-vous éligibles au dispositif de réduction prévu au titre de la première vague de la crise sanitaire de l'automne 2020 ? par défaut: non description: | @@ -553,15 +553,15 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi Bon à savoir : Les activités de livraison, de retrait de commande ou de vente à emporter ne sont pas prises en compte pour apprécier le respect de la condition d’interdiction. -? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles -: formule: +aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles: + formule: somme: - S1 et S1bis - S2 arrondi: oui -? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 et S1bis -: applicable si: +aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S1 et S1bis: + applicable si: toutes ces conditions: - éligible aide automne 2020 - une de ces conditions: @@ -574,8 +574,8 @@ aide déclaration revenu indépendant 2020 . réduction covid . secteur d'activi unité: mois éligibles plafond: 6 mois éligibles -? aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2 -: applicable si: +aide déclaration revenu indépendant 2020 . réduction covid . nombre de mois éligibles . S2: + applicable si: toutes ces conditions: - éligible aide automne 2020 - secteur d'activité = 'S2' @@ -806,39 +806,39 @@ aide déclaration revenu indépendant 2020 . informations résultat par formulai applicable si: comptabilité . engagement non applicable si: entreprise . imposition . IR . micro-fiscal valeur: oui -? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . réduction Covid -: description: La réduction de cotisation applicable dans le cas du dispositif Covid +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . réduction Covid: + description: La réduction de cotisation applicable dans le cas du dispositif Covid valeur: réduction covid . total -? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération totale -: titre: Total rémunération dirigeant +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération totale: + titre: Total rémunération dirigeant résumé: '[A]' description: La rémunération "superbrute" du dirigeant, incluant toutes les cotisations et contributions sociales. valeur: dirigeant . rémunération . totale -? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations déductibles -: résumé: '[C1]' +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations déductibles: + résumé: '[C1]' description: "Cotisations et contributions sociales déductibles pour le calcul de l'assiette sociale" somme: - cotisations obligatoires déductibles - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . déductible - dirigeant . indépendant . cotisations et contributions . formation professionnelle -? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations non déductibles -: résumé: '[C2]' +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . cotisations non déductibles: + résumé: '[C2]' description: Cotisations et contributions sociales non déductibles pour le calcul de l'assiette sociale valeur: somme: - dirigeant . indépendant . cotisations et contributions . CSG et CRDS . non déductible - dirigeant . indépendant . cotisations facultatives . total -? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . assiette sociale -: résumé: '[A - C1]' +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . assiette sociale: + résumé: '[A - C1]' description: Assiette utilisée pour le calcul des cotisations sociales. valeur: dirigeant . indépendant . assiette des cotisations -? aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération nette -: résumé: '[A - C1 - C2]' +aide déclaration revenu indépendant 2020 . informations résultat par formulaire . rémunération nette: + résumé: '[A - C1 - C2]' description: Le revenu net du dirigeant avant impôt sur le revenu. C'est la rémunération effectivement versée. valeur: dirigeant . rémunération . nette @@ -850,8 +850,8 @@ aide déclaration revenu indépendant 2020 . résultat simple . revenu net fisca description: Résultat avant déduction des charges sociales et exonérations fiscales valeur: dirigeant . rémunération . totale -? aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires -: titre: Cotisations sociales obligatoires déductibles +aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires: + titre: Cotisations sociales obligatoires déductibles résumé: '[C]' description: | À reporter dans : @@ -881,8 +881,8 @@ aide déclaration revenu indépendant 2020 . résultat simple . CFP: description: Contribution à la formation professionnelle valeur: dirigeant . indépendant . cotisations et contributions . formation professionnelle -? aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible -: non applicable si: entreprise . imposition . IR . micro-fiscal +aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible: + non applicable si: entreprise . imposition . IR . micro-fiscal titre: charges sociales obligatoires déductibles fiscalement résumé: '[B + C + D]' somme: diff --git a/modele-social/règles/impôt.yaml b/modele-social/règles/impôt.yaml index f0011c1f0..bc41dc165 100644 --- a/modele-social/règles/impôt.yaml +++ b/modele-social/règles/impôt.yaml @@ -90,8 +90,8 @@ impôt . revenu imposable . abattement contrat court: références: Bofip - dispositions spécifiques aux contrats courts: https://bofip.impots.gouv.fr/bofip/11252-PGP.html?identifiant=BOI-IR-PAS-20-20-30-10-20180515 -? impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique -: icônes: 🇬🇵🇷🇪 🇲🇶 +impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique: + icônes: 🇬🇵🇷🇪 🇲🇶 formule: grille: assiette: revenu imposable @@ -426,8 +426,8 @@ impôt . foyer fiscal . impôt sur le revenu . quotient familial: unité: €/part/an formule: revenu imposable / nombre de parts -? impôt . foyer fiscal . impôt sur le revenu . quotient familial . plafond avantage -: formule: +impôt . foyer fiscal . impôt sur le revenu . quotient familial . plafond avantage: + formule: somme: - produit: assiette: diff --git a/modele-social/règles/profession-libérale.yaml b/modele-social/règles/profession-libérale.yaml index be6f5a293..0552986f9 100644 --- a/modele-social/règles/profession-libérale.yaml +++ b/modele-social/règles/profession-libérale.yaml @@ -143,8 +143,8 @@ dirigeant . indépendant . PL . régime général: - CIPAV = non - entreprise . activité . libérale réglementée = non -? dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire -: titre: taux spécifique profession libérale non reglementée +dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire: + titre: taux spécifique profession libérale non reglementée question: Avez-vous opté pour des taux spécifiques de cotisation retraite complémentaire ? par défaut: non description: | @@ -156,8 +156,8 @@ dirigeant . indépendant . PL . régime général: références: Guide PL urssaf: https://www.urssaf.fr/portail/files/live/sites/urssaf/files/documents/Diaporama_TI_statuts_hors_AE.pdf -? dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire . montant -: titre: retraite complémentaire (taux PLNR) +dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire . montant: + titre: retraite complémentaire (taux PLNR) remplace: cotisations et contributions . retraite complémentaire formule: barème: @@ -276,8 +276,8 @@ dirigeant . indépendant . PL . CIPAV . invalidité et décès: - si: classe de cotisation = 'C' alors: 380 €/an -? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation -: question: Dans quelle classe cotisez-vous pour le régime invalidité-décès de la CIPAV ? +dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation: + question: Dans quelle classe cotisez-vous pour le régime invalidité-décès de la CIPAV ? description: >- La Cipav gère un régime de prévoyance versant une pension en cas d'invalidité permanente et un capital décès ainsi qu’une rente pour les @@ -293,12 +293,12 @@ dirigeant . indépendant . PL . CIPAV . invalidité et décès: - C par défaut: "'A'" -? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . A -: titre: classe A -? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . B -: titre: classe B -? dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . C -: titre: classe C +dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . A: + titre: classe A +dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . B: + titre: classe B +dirigeant . indépendant . PL . CIPAV . invalidité et décès . classe de cotisation . C: + titre: classe C dirigeant . indépendant . PL . retraite CNAVPL: non applicable si: @@ -360,8 +360,8 @@ dirigeant . indépendant . PL . PAMC: - dirigeant . indépendant . cotisations et contributions . maladie domiciliation fiscale étranger formule: oui -? dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée -: question: | +dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée: + question: | Quel est la part de votre chiffre d'affaires liée à une activité non conventionnée (estimation) ? par défaut: 0% @@ -383,8 +383,8 @@ dirigeant . indépendant . PL . PAMC: (aide à la télétransmission, indemnisation, indemnisation de la formation continue, prime à l’installation, ...) -? dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée . notification -: type: notification +dirigeant . indépendant . PL . PAMC . proportion recette activité non conventionnée . notification: + type: notification sévérité: avertissement formule: proportion recette activité non conventionnée > 100% description: | @@ -529,8 +529,8 @@ dirigeant . indépendant . PL . PAMC . allocations familiales: références: Fiche Urssaf: https://www.urssaf.fr/portail/home/taux-et-baremes/taux-de-cotisations/les-praticiens-et-auxiliaires-me/taux-de-cotisations-medecin-sect.html -? dirigeant . indépendant . PL . PAMC . allocations familiales . participation CPAM -: titre: Participation CPAM aux allocations familiales +dirigeant . indépendant . PL . PAMC . allocations familiales . participation CPAM: + titre: Participation CPAM aux allocations familiales formule: produit: assiette: cotisations et contributions . allocations familiales @@ -546,8 +546,8 @@ dirigeant . indépendant . PL . PAMC . allocations familiales: - montant: 60% arrondi: oui -? dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste -: applicable si: métier = 'santé . chirurgien-dentiste' +dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste: + applicable si: métier = 'santé . chirurgien-dentiste' titre: assiette participation CPAM (chirurgien dentiste) remplace: assiette participation CPAM formule: @@ -558,8 +558,8 @@ dirigeant . indépendant . PL . PAMC . allocations familiales: Fiche Urssaf: https://www.urssaf.fr/portail/home/praticien-et-auxiliaire-medical/mes-cotisations/le-calcul-de-mes-cotisations/la-participation-de-la-cpam-a-me/je-suis-chirurgien-dentiste/assiette-de-participation-de-la.html Texte de loi: https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000020429271&categorieLien=id -? dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf -: description: | +dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf: + description: | Le « taux Urssaf » (taux UR) permet de calculer la part de votre cotisation d’assurance maladie-maternité prise en charge par la CPAM. @@ -578,8 +578,8 @@ dirigeant . indépendant . PL . PAMC . allocations familiales: unité: '' par défaut: 1 -? dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf . notification -: formule: taux Urssaf >= 100 +dirigeant . indépendant . PL . PAMC . assiette participation chirurgien-dentiste . taux Urssaf . notification: + formule: taux Urssaf >= 100 type: notification sévérité: avertissement description: Le taux Urssaf doit être inférieur à 100 @@ -848,8 +848,8 @@ dirigeant . indépendant . PL . CARCDSF . retraite complémentaire: références: Site CARCDSF: http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations -? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation proportionnelle -: formule: +dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation proportionnelle: + formule: barème: assiette: assiette des cotisations multiplicateur: plafond sécurité sociale temps plein @@ -860,8 +860,8 @@ dirigeant . indépendant . PL . CARCDSF . retraite complémentaire: plafond: 5 arrondi: oui -? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire -: formule: +dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire: + formule: produit: assiette: 2960.40 €/an facteur: @@ -871,16 +871,16 @@ dirigeant . indépendant . PL . CARCDSF . retraite complémentaire: - sinon: 100% arrondi: oui -? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable -: formule: assiette des cotisations < 85% * plafond sécurité sociale temps plein +dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable: + formule: assiette des cotisations < 85% * plafond sécurité sociale temps plein description: | Vous avez la possibilité de bénéficier d'une réduction de cotisation pour la retraite complémentaire si vous en faites la demande. [En savoir plus](/documentation/dirigeant/indépendant/PL/CARCDSF/retraite-complémentaire/cotisation-forfaitaire/taux-réduction) type: notification -? dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . taux réduction -: applicable si: réduction applicable +dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . taux réduction: + applicable si: réduction applicable description: | Les affiliés dont les revenus professionnels nets sur l'année N-1 sont inférieurs à 85 % du PASS en vigueur au 1er janvier de l’année considérée (34 966 € en 2020) @@ -927,18 +927,18 @@ dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV: - proportionnelle arrondi: oui -? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . forfaitaire -: formule: 1440.60 €/an -? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . proportionnelle -: formule: +dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . forfaitaire: + formule: 1440.60 €/an +dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . proportionnelle: + formule: produit: assiette: assiette des cotisations plafond: 5 * plafond sécurité sociale temps plein taux: 0.725 % références: Site CARCDSF: http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations -? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . participation CPAM -: titre: Participation CPAM à la prestation complémentaire vieillesse +dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . PCV . participation CPAM: + titre: Participation CPAM à la prestation complémentaire vieillesse formule: somme: - 2 * forfaitaire @@ -955,8 +955,8 @@ dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . exonération PCV faites la demande. [En savoir plus](http://www.carcdsf.fr/cotisations-du-praticien/montant-des-cotisations) -? dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . prix d'une consultation -: formule: 23 €/consultation +dirigeant . indépendant . PL . CARCDSF . chirurgien-dentiste . prix d'une consultation: + formule: 23 €/consultation dirigeant . indépendant . PL . CARCDSF . sage-femme: applicable si: métier = 'santé . sage-femme' @@ -1074,8 +1074,8 @@ dirigeant . indépendant . PL . CNBF . retraite de base . cotisation forfaitaire plafond: 5 ans - montant: 1586 €/an -? dirigeant . indépendant . PL . CNBF . retraite de base . cotisation proportionnelle -: formule: +dirigeant . indépendant . PL . CNBF . retraite de base . cotisation proportionnelle: + formule: produit: taux: 3.1% assiette: assiette des cotisations diff --git a/modele-social/règles/protection-sociale.yaml b/modele-social/règles/protection-sociale.yaml index f36daf4a3..9292c210e 100644 --- a/modele-social/règles/protection-sociale.yaml +++ b/modele-social/règles/protection-sociale.yaml @@ -102,8 +102,8 @@ protection sociale . retraite . trimestres validés . trimestres indépendant: valeur: barème trimestres générique plancher: 3 -? protection sociale . retraite . trimestres validés . barème trimestres générique -: unité: trimestres validés/an +protection sociale . retraite . trimestres validés . barème trimestres générique: + unité: trimestres validés/an formule: grille: unité: trimestres validés/an @@ -122,8 +122,8 @@ protection sociale . retraite . trimestres validés . trimestres indépendant: références: cnav.fr: https://www.legislation.cnav.fr/Pages/bareme.aspx?Nom=salaire_validant_un_trimestre_montant_bar Article R351-9 du code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000028751530/2014-03-21 -? protection sociale . retraite . trimestres validés . trimestres auto-entrepreneur -: applicable si: dirigeant . auto-entrepreneur +protection sociale . retraite . trimestres validés . trimestres auto-entrepreneur: + applicable si: dirigeant . auto-entrepreneur description: Les seuils de chiffre d'affaires minimum pour la validation des trimestres pour la retraite en auto-entrepreneur. En-dessous du montant minimum, vous n'aurez accès qu'à l'allocation de solidarité. unité: trimestres validés/an somme: @@ -218,15 +218,15 @@ protection sociale . retraite . complémentaire indépendants . valeur du point: références: secu-independants.fr: https://www.secu-independants.fr/baremes/prestations-vieillesse-et-invalidite-deces -? protection sociale . retraite . complémentaire indépendants . total points acquis -: formule: points acquis * mois cotisés +protection sociale . retraite . complémentaire indépendants . total points acquis: + formule: points acquis * mois cotisés protection sociale . retraite . complémentaire indépendants . points acquis: unité: points/an valeur: dirigeant . indépendant . cotisations et contributions . retraite complémentaire / prix d'achat du point -? protection sociale . retraite . complémentaire indépendants . prix d'achat du point -: formule: 17.765 €/point +protection sociale . retraite . complémentaire indépendants . prix d'achat du point: + formule: 17.765 €/point références: secu-independants.fr: https://www.secu-independants.fr/baremes/baremes-2018/baremesprestations-maladie-maternite/?reg=ile-de-france-centre&ae=oui diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index 797a65e76..7a8046b14 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -146,8 +146,8 @@ contrat salarié . frais professionnels . titres-restaurant . montant unitaire: moyenne: 8 €/titre-restaurant max exonéré: 11.10 €/titre-restaurant -? contrat salarié . frais professionnels . titres-restaurant . taux participation employeur -: description: >- +contrat salarié . frais professionnels . titres-restaurant . taux participation employeur: + description: >- Part du titre-restaurant payée par l'employeur. Doit être de 50% minimum et de 60% maximum. question: Quelle est la participation de l'employeur ? @@ -156,14 +156,14 @@ contrat salarié . frais professionnels . titres-restaurant . montant unitaire: 50%: 50 % 60%: 60 % -? contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur min -: type: notification +contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur min: + type: notification sévérité: avertissement formule: taux participation employeur < 50% description: La part employeur du titre-restaurant doit être de 50% au minimum -? contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur max -: type: notification +contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur max: + type: notification sévérité: avertissement formule: taux participation employeur > 60% description: La part employeur du titre-restaurant doit être de 60% au maximum @@ -172,8 +172,8 @@ contrat salarié . frais professionnels . abonnement transports publics: icônes: 🚍 valeur: oui -? contrat salarié . frais professionnels . abonnement transports publics . montant -: titre: Abonnement aux transports publics +contrat salarié . frais professionnels . abonnement transports publics . montant: + titre: Abonnement aux transports publics question: Quel montant le salarié dépense-t-il en abonnement aux transports publics chaque mois ? unité: €/mois par défaut: 0 €/mois @@ -193,11 +193,11 @@ contrat salarié . frais professionnels . abonnement transports publics: Tisséo: 42.50 €/mois TBM: 42.20 €/mois -? contrat salarié . frais professionnels . abonnement transports publics . taux de participation employeur -: valeur: 50% +contrat salarié . frais professionnels . abonnement transports publics . taux de participation employeur: + valeur: 50% -? contrat salarié . frais professionnels . abonnement transports publics . taux de prise en charge -: titre: Taux de prise en charge +contrat salarié . frais professionnels . abonnement transports publics . taux de prise en charge: + titre: Taux de prise en charge valeur: produit: assiette: @@ -206,8 +206,8 @@ contrat salarié . frais professionnels . abonnement transports publics: - 50% taux: 2 * taux de participation employeur -? contrat salarié . frais professionnels . abonnement transports publics . prise en charge -: titre: Abonnement transports publics, part prise en charge par l'employeur (déductible) +contrat salarié . frais professionnels . abonnement transports publics . prise en charge: + titre: Abonnement transports publics, part prise en charge par l'employeur (déductible) unité: €/mois valeur: taux de prise en charge * montant @@ -224,14 +224,14 @@ contrat salarié . frais professionnels . transports personnels . montant: - carburant faible émission . montant - forfait mobilités durables . montant -? contrat salarié . frais professionnels . transports personnels . part déductible -: valeur: +contrat salarié . frais professionnels . transports personnels . part déductible: + valeur: somme: - carburant faible émission . part déductible - forfait mobilités durables . part déductible -? contrat salarié . frais professionnels . transports personnels . proportion déduction -: titre: Facteur de proportion de la déductibilité +contrat salarié . frais professionnels . transports personnels . proportion déduction: + titre: Facteur de proportion de la déductibilité valeur: produit: assiette: @@ -242,11 +242,11 @@ contrat salarié . frais professionnels . transports personnels . montant: références: Article R3261-14 du code du travail, version 11/05/2020: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000041865023/2020-05-11/ -? contrat salarié . frais professionnels . transports personnels . carburant faible émission -: valeur: oui +contrat salarié . frais professionnels . transports personnels . carburant faible émission: + valeur: oui -? contrat salarié . frais professionnels . transports personnels . carburant faible émission . montant -: titre: Prise en charge du carburant pour véhicule électrique, hybride rechargeable ou hydrogène +contrat salarié . frais professionnels . transports personnels . carburant faible émission . montant: + titre: Prise en charge du carburant pour véhicule électrique, hybride rechargeable ou hydrogène question: Quel montant l'employeur prend-il en charge des dépenses en carburant pour véhicule électrique, hybride rechargeable ou hydrogènes? unité: €/an par défaut: 0 €/an @@ -266,8 +266,8 @@ contrat salarié . frais professionnels . transports personnels . montant: Articles R3261-11 à -13 du code du travail, version 11/05/2020: https://www.legifrance.gouv.fr/codes/section_lc/LEGITEXT000006072050/LEGISCTA000018487476/2020-05-11 Article 81 du code des impôts, version en vigueur au 31/12/2020: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000042910732/2020-12-31/ -? contrat salarié . frais professionnels . transports personnels . carburant faible émission . part déductible -: titre: Prise en charge du carburant pour véhicule électrique, hybride rechargeable ou hydrogène (part déductible) +contrat salarié . frais professionnels . transports personnels . carburant faible émission . part déductible: + titre: Prise en charge du carburant pour véhicule électrique, hybride rechargeable ou hydrogène (part déductible) unité: €/an valeur: montant plafond: @@ -276,11 +276,11 @@ contrat salarié . frais professionnels . transports personnels . montant: - valeur: proportion déduction * 500€/an abattement: abonnement transports publics . prise en charge -? contrat salarié . frais professionnels . transports personnels . forfait mobilités durables -: valeur: oui +contrat salarié . frais professionnels . transports personnels . forfait mobilités durables: + valeur: oui -? contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . montant -: titre: Prise en charge des frais de transports forfait mobilités durables +contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . montant: + titre: Prise en charge des frais de transports forfait mobilités durables question: Quel montant l'employeur prend-il en charge dans le cadre du forfait mobilités durables ? unité: €/an par défaut: 0 €/an @@ -312,8 +312,8 @@ contrat salarié . frais professionnels . transports personnels . montant: Articles R3261-13-1 à -13-2 du code du travail, version 11/05/2020: https://www.legifrance.gouv.fr/codes/section_lc/LEGITEXT000006072050/LEGISCTA000018487476/2020-05-11 Article 81 du code des impôts, version en vigueur au 31/12/2020: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000042910732/2020-12-31/ -? contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . part déductible -: titre: Prise en charge des frais de transports forfait mobilités durables (part déductible) +contrat salarié . frais professionnels . transports personnels . forfait mobilités durables . part déductible: + titre: Prise en charge des frais de transports forfait mobilités durables (part déductible) unité: €/an valeur: montant plafond: @@ -377,8 +377,8 @@ contrat salarié . activité partielle . heures travaillées: 20 h/semaine: 86.6666 heures/mois 10 h/semaine: 43.3333 heures/mois -? contrat salarié . activité partielle . heures travaillées . contrôle temps de travail -: type: notification +contrat salarié . activité partielle . heures travaillées . contrôle temps de travail: + type: notification sévérité: avertissement formule: heures travaillées > temps de travail . temps contractuel description: >- @@ -455,8 +455,8 @@ contrat salarié . activité partielle . indemnités . conventionnelle: Legifrance: https://www.legifrance.gouv.fr/affichIDCCArticle.do?idArticle=KALIARTI000028465400&cidTexte=KALITEXT000028465378&dateTexte=29990101&categorieLien=id Juritravail: https://www.juritravail.com/Actualite/Hygiene-securite-travail-employeur/Id/327284 -? contrat salarié . activité partielle . indemnités . conventionnelle . part soumise à cotisation -: applicable si: +contrat salarié . activité partielle . indemnités . conventionnelle . part soumise à cotisation: + applicable si: toutes ces conditions: - indemnités . conventionnelle > 0 - indemnités . conventionnelle + indemnités . base > 3.15 * SMIC @@ -496,8 +496,8 @@ contrat salarié . activité partielle . indemnisation entreprise: avec: rémunération . brut de base: 4.5 * SMIC -? contrat salarié . activité partielle . indemnisation entreprise . taux d'indemnisation -: description: >- +contrat salarié . activité partielle . indemnisation entreprise . taux d'indemnisation: + description: >- Depuis le 1er juin, le taux d'indemnisation de l'entreprise passe à 60%. L'indemnité versée à l'employé reste inchangée et c'est donc l'entreprise qui devra prendre en charge la différence. @@ -613,8 +613,8 @@ contrat salarié . déduction forfaitaire spécifique . profession . journaliste Concerne les journalistes, rédacteurs, photographes, directeurs de journaux Critiques dramatiques et musicaux. -? contrat salarié . déduction forfaitaire spécifique . profession . journaliste . réduction de taux -: applicable si: déduction forfaitaire spécifique . profession = 'journaliste' +contrat salarié . déduction forfaitaire spécifique . profession . journaliste . réduction de taux: + applicable si: déduction forfaitaire spécifique . profession = 'journaliste' remplace: - règle: vieillesse . employeur . plafonnée . taux par: vieillesse . employeur . plafonnée . taux * réduction de taux @@ -635,29 +635,29 @@ contrat salarié . déduction forfaitaire spécifique . profession . journaliste par: ATMP . taux minimum * réduction de taux formule: 80% -? contrat salarié . déduction forfaitaire spécifique . profession . journaliste . abattement fiscal -: applicable si: déduction forfaitaire spécifique . profession = 'journaliste' +contrat salarié . déduction forfaitaire spécifique . profession . journaliste . abattement fiscal: + applicable si: déduction forfaitaire spécifique . profession = 'journaliste' remplace: rémunération . net imposable titre: net imposable journaliste formule: valeur: rémunération . net imposable abattement: 7650€/an -? contrat salarié . déduction forfaitaire spécifique . profession . ouvrier du bâtiment -: icônes: 👷‍♂️ +contrat salarié . déduction forfaitaire spécifique . profession . ouvrier du bâtiment: + icônes: 👷‍♂️ description: >- Concerne les ouvriers du bâtiment visés aux paragraphes 1er et 2 de l’article 1er du décret du 17 novembre 1936, à l’exclusion de ceux qui travaillent en usine ou en atelier. -? contrat salarié . déduction forfaitaire spécifique . profession . artiste musicien -: icônes: 🎼 +contrat salarié . déduction forfaitaire spécifique . profession . artiste musicien: + icônes: 🎼 description: >- Concerne les artistes musiciens, choristes, chefs d’orchestre, régisseurs de théâtre -? contrat salarié . déduction forfaitaire spécifique . profession . pilote de ligne ou personnel navigant -: icônes: ✈ +contrat salarié . déduction forfaitaire spécifique . profession . pilote de ligne ou personnel navigant: + icônes: ✈ description: >- Concerne les pilotes, radios, mécaniciens navigants des compagnies de transports aériens ; pilotes et mécaniciens employés par les maisons de @@ -1482,8 +1482,8 @@ contrat salarié . rémunération . primes . fin d'année: assiette: assiette de vérification du SMIC * temps de travail . quotité de travail / 1 an facteur: prime de fin d'année en mois -? contrat salarié . rémunération . primes . fin d'année . prime de fin d'année en mois -: applicable si: treizième mois +contrat salarié . rémunération . primes . fin d'année . prime de fin d'année en mois: + applicable si: treizième mois formule: 13 mois - 1 an note: > Certaines entreprises proposent une prime de fin d'année sur une base de @@ -1674,8 +1674,8 @@ contrat salarié . rémunération . avantages en nature . nourriture . montant: références: urssaf.fr: https://www.urssaf.fr/portail/home/taux-et-baremes/avantages-en-nature/nourriture.html -? contrat salarié . rémunération . avantages en nature . nourriture . repas par mois -: question: > +contrat salarié . rémunération . avantages en nature . nourriture . repas par mois: + question: > Combien de repas par mois sont payés par l'entreprise ? par défaut: 21 repas/mois suggestions: @@ -1837,8 +1837,8 @@ contrat salarié . rémunération . net imposable: références: DSN: https://dsn-info.custhelp.com/app/answers/detail/a_id/2110 -? contrat salarié . rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées -: unité: €/mois +contrat salarié . rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées: + unité: €/mois formule: valeur: somme: @@ -1961,8 +1961,8 @@ contrat salarié . cotisations . patronales . réductions de cotisations: urssaf.fr (cumul réduction générale): https://www.urssaf.fr/portail/home/employeur/beneficier-dune-exoneration/exonerations-generales/la-reduction-generale/les-regles-relatives-au-cumul.html urssaf.fr (cumul JEI): https://www.urssaf.fr/portail/home/employeur/beneficier-dune-exoneration/exonerations-ou-aides-liees-au-s/jeunes-entreprises-innovantes/regles-de-cumul.html -? contrat salarié . cotisations . patronales . réductions de cotisations . déduction heures supplémentaires -: applicable si: entreprise . effectif < 20 +contrat salarié . cotisations . patronales . réductions de cotisations . déduction heures supplémentaires: + applicable si: entreprise . effectif < 20 titre: déduction forfaitaire pour heures supplémentaires formule: produit: @@ -1982,8 +1982,8 @@ contrat salarié . cotisations . salariales . réduction heures supplémentaires références: Code de la sécurité sociale - Article D241-21: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000038056813&cidTexte=LEGITEXT000006073189 -? contrat salarié . cotisations . salariales . réduction heures supplémentaires . taux des cotisations réduites -: unité: '%' +contrat salarié . cotisations . salariales . réduction heures supplémentaires . taux des cotisations réduites: + unité: '%' description: le taux effectif des cotisations d'assurance vieillesse à la charge du salarié formule: valeur: @@ -2072,8 +2072,8 @@ contrat salarié . aides employeur . aide à l'embauche d'apprentis: références: Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F23556 -? contrat salarié . aides employeur . aide exceptionnelle à l'embauche d'apprentis -: description: >- +contrat salarié . aides employeur . aide exceptionnelle à l'embauche d'apprentis: + description: >- Dans le cadre du plan de relance de l'économie de la rentrée 2020, le gouvernement met en place une aide exceptionnelle au recrutement des apprentis. @@ -2135,8 +2135,8 @@ contrat salarié . aides employeur . aide exceptionnelle à l'embauche des jeune références: Plan \#1jeune1solution: https://travail-emploi.gouv.fr/le-ministere-en-action/relance-activite/plan-1jeune-1solution/aide-embauche-jeunes -? contrat salarié . aides employeur . aide à l'embauche senior professionnalisation -: description: | +contrat salarié . aides employeur . aide à l'embauche senior professionnalisation: + description: | Les employeurs peuvent obtenir une aide de 2000 € pour l'embauche d'un demandeur d'emploi de plus de 45 ans en contrat de professionnalisation. applicable si: professionnalisation . salarié de 45 ans et plus @@ -2213,8 +2213,8 @@ contrat salarié . temps de travail: - heures complémentaires description: En France, la base légale du travail est de 35h/semaine. Mais un grand nombre de dispositions existantes permettent de faire varier ce nombre. Vous pouvez les retrouver sur la page [service-public.fr](https://www.service-public.fr/particuliers/vosdroits/N458) dédiée. -? contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés -: non applicable si: aides employeur . emploi franc +contrat salarié . aides employeur . aide à l'embauche des travailleurs handicapés: + non applicable si: aides employeur . emploi franc description: >- Dans le cadre du plan de relance, le gouvernement a décidé de créer une aide à l’embauche visant à favoriser l’emploi des personnes en situation de @@ -2360,8 +2360,8 @@ contrat salarié . temps de travail . heures complémentaires: question: Combien d'heures complémentaires (non récupérées en repos) sont effectuées par mois ? par défaut: 0 heure/mois -? contrat salarié . temps de travail . contrôle heures complémentaires 10 pourcents -: type: notification +contrat salarié . temps de travail . contrôle heures complémentaires 10 pourcents: + type: notification formule: heures complémentaires > heures complémentaires . seuil légal description: Sauf disposition conventionnelle, le nombre d'heures complémentaires ne peut être supérieur à un dixième de la durée contractuelle du temps partiel. @@ -2653,8 +2653,8 @@ contrat salarié . retraite supplémentaire . part déductible: valeur: retraite supplémentaire . employeur abattement: plafond d'exonération sociale employeur -? contrat salarié . retraite supplémentaire . plafond d'exonération sociale employeur -: formule: +contrat salarié . retraite supplémentaire . plafond d'exonération sociale employeur: + formule: valeur: 5% * rémunération . brut plafond: 5% * plafond sécurité sociale références: @@ -2929,8 +2929,8 @@ contrat salarié . CSG et CRDS . assiette revenu remplacements: taux: 98.25% assiette: rémunération . revenus de remplacement -? contrat salarié . CSG et CRDS . assiette heures supplémentaires et complémentaires défiscalisées -: formule: +contrat salarié . CSG et CRDS . assiette heures supplémentaires et complémentaires défiscalisées: + formule: produit: assiette: rémunération . net imposable . heures supplémentaires et complémentaires défiscalisées taux: 98.25% diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index 234c5326b..1fbc42a06 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -30,7 +30,7 @@ "@types/mocha": "^8.2.2", "@types/react": "^17.0.0", "@types/react-color": "^3.0.1", - "@types/react-dom": "^17.0.0", + "@types/react-dom": "^17.0.9", "@types/react-helmet": "^6.1.0", "@types/react-redux": "^7.1.11", "@types/react-router": "^5.1.2", @@ -67,7 +67,6 @@ "@rehooks/local-storage": "^2.1.1", "@sentry/react": "^6.3.5", "@sentry/tracing": "^6.3.5", - "@types/react-dom": "^17.0.0", "classnames": "^2.2.5", "color-convert": "^1.9.2", "core-js": "^3.2.1", diff --git a/mon-entreprise/source/ATInternetTracking/smarttag.js b/mon-entreprise/source/ATInternetTracking/smarttag.js index 74059e52f..25536cf27 100644 --- a/mon-entreprise/source/ATInternetTracking/smarttag.js +++ b/mon-entreprise/source/ATInternetTracking/smarttag.js @@ -82,7 +82,8 @@ : null } var c = this, - b = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g, + b = + /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g, d = RegExp( '^[\\x20\\t\\r\\n\\f]+|((?:^|[^\\\\])(?:\\\\.)*)[\\x20\\t\\r\\n\\f]+$', 'g' @@ -1506,12 +1507,13 @@ 'undefined' !== typeof window && 'undefined' !== typeof window.location ) { - h = (c.getConfig('urlPropertyQueryString') - ? window.location.href - : window.location.protocol + - '//' + - window.location.host + - window.location.pathname + h = ( + c.getConfig('urlPropertyQueryString') + ? window.location.href + : window.location.protocol + + '//' + + window.location.host + + window.location.pathname ) .replace(/[<>]/g, '') .substring(0, 1600) @@ -1521,9 +1523,10 @@ c.setContext('page', l) c.setParam('page_url', h, { permanent: !0, - hitType: 'page click publisher selfPromotion onSiteAdsClick onSiteAdsImpression InternalSearch mvtesting richmedia'.split( - ' ' - ), + hitType: + 'page click publisher selfPromotion onSiteAdsClick onSiteAdsImpression InternalSearch mvtesting richmedia'.split( + ' ' + ), }) } c.plugins.init() @@ -1641,8 +1644,13 @@ }, c = { search: 's', content: 'c' } this.atMedium = 'sl' - this.atTerm = this.atNetwork = this.atVariant = this.atCreation = this.atPlatform = this.atCampaign = - '' + this.atTerm = + this.atNetwork = + this.atVariant = + this.atCreation = + this.atPlatform = + this.atCampaign = + '' this.format = function () { var a = 'sec', h = b(this.atCampaign), @@ -1693,8 +1701,15 @@ this.Email = function () { var e = { acquisition: 'erec', retention: 'epr', promotion: 'es' } this.atMedium = 'email' - this.atSendTime = this.atRecipientList = this.atRecipientId = this.atLink = this.atSendDate = this.atCreation = this.atCampaign = this.atEmailtype = - '' + this.atSendTime = + this.atRecipientList = + this.atRecipientId = + this.atLink = + this.atSendDate = + this.atCreation = + this.atCampaign = + this.atEmailtype = + '' this.format = function () { var a = e[this.atEmailtype] || e.promotion, c = b(this.atCampaign), @@ -1762,8 +1777,13 @@ } this.Affiliate = function () { this.atMedium = 'affiliate' - this.atVariant = this.atCreation = this.atFormat = this.atIdentifier = this.atType = this.atCampaign = - '' + this.atVariant = + this.atCreation = + this.atFormat = + this.atIdentifier = + this.atType = + this.atCampaign = + '' this.format = function () { var a = 'al', f = b(this.atCampaign), @@ -1813,8 +1833,14 @@ } this.Display = function () { this.atMedium = 'display' - this.atDetailPlacement = this.atGeneralPlacement = this.atChannel = this.atFormat = this.atVariant = this.atCreation = this.atCampaign = - '' + this.atDetailPlacement = + this.atGeneralPlacement = + this.atChannel = + this.atFormat = + this.atVariant = + this.atCreation = + this.atCampaign = + '' this.format = function () { var a = 'ad', f = b(this.atCampaign), @@ -1885,8 +1911,13 @@ } } this.Custom = function () { - this.atCustom4 = this.atCustom3 = this.atCustom2 = this.atCustom1 = this.atCampaign = this.atMedium = - '' + this.atCustom4 = + this.atCustom3 = + this.atCustom2 = + this.atCustom1 = + this.atCampaign = + this.atMedium = + '' this.format = function () { var a = '' ;/\d+$/.test(this.atMedium) && (a = /\d+$/.exec(this.atMedium)[0]) diff --git a/mon-entreprise/source/components/CurrencyInput/CurrencyInput.tsx b/mon-entreprise/source/components/CurrencyInput/CurrencyInput.tsx index 96c02b853..e7159bd21 100644 --- a/mon-entreprise/source/components/CurrencyInput/CurrencyInput.tsx +++ b/mon-entreprise/source/components/CurrencyInput/CurrencyInput.tsx @@ -66,11 +66,8 @@ export default function CurrencyInput({ onChangeDebounced?.(event) } - const { - isCurrencyPrefixed, - thousandSeparator, - decimalSeparator, - } = currencyFormat(language) + const { isCurrencyPrefixed, thousandSeparator, decimalSeparator } = + currencyFormat(language) // Autogrow the input const valueLength = currentValue.toString().length const width = `${5 + (valueLength - 5) * 0.75}em` diff --git a/mon-entreprise/source/components/Distribution.tsx b/mon-entreprise/source/components/Distribution.tsx index 6336bb7a3..9e5de7d80 100644 --- a/mon-entreprise/source/components/Distribution.tsx +++ b/mon-entreprise/source/components/Distribution.tsx @@ -13,17 +13,19 @@ import RuleLink from './RuleLink' export default function Distribution() { const targetUnit = useSelector(targetUnitSelector) const engine = useContext(EngineContext) - const distribution = (getCotisationsBySection( - useEngine().getParsedRules() - ).map(([section, cotisations]) => [ - section, - cotisations - .map((c) => engine.evaluate({ valeur: c, unité: targetUnit })) - .reduce( - (acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0), - 0 - ), - ]) as Array<[DottedName, number]>) + const distribution = ( + getCotisationsBySection(useEngine().getParsedRules()).map( + ([section, cotisations]) => [ + section, + cotisations + .map((c) => engine.evaluate({ valeur: c, unité: targetUnit })) + .reduce( + (acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0), + 0 + ), + ] + ) as Array<[DottedName, number]> + ) .filter(([, value]) => value > 0) .sort(([, a], [, b]) => b - a) diff --git a/mon-entreprise/source/components/FindCompany.tsx b/mon-entreprise/source/components/FindCompany.tsx index 910d32dcc..234adbc2e 100644 --- a/mon-entreprise/source/components/FindCompany.tsx +++ b/mon-entreprise/source/components/FindCompany.tsx @@ -6,10 +6,8 @@ import { Etablissement, searchDenominationOrSiren } from '../api/sirene' import { debounce } from '../utils' export default function Search() { - const [ - searchResults, - setSearchResults, - ] = useState | null>() + const [searchResults, setSearchResults] = + useState | null>() const [isLoading, setLoadingState] = useState(false) const handleSearch = useCallback( @@ -21,9 +19,10 @@ export default function Search() { }, [setSearchResults, setLoadingState] ) - const debouncedHandleSearch = useMemo(() => debounce(300, handleSearch), [ - handleSearch, - ]) + const debouncedHandleSearch = useMemo( + () => debounce(300, handleSearch), + [handleSearch] + ) const setEntreprise = useSetEntreprise() return ( diff --git a/mon-entreprise/source/components/SchemeComparaison.tsx b/mon-entreprise/source/components/SchemeComparaison.tsx index f17d70ee5..b42fa2f27 100644 --- a/mon-entreprise/source/components/SchemeComparaison.tsx +++ b/mon-entreprise/source/components/SchemeComparaison.tsx @@ -39,9 +39,10 @@ export default function SchemeComparaison({ const [conversationStarted, setConversationStarted] = useState( !!Object.keys(useSelector(situationSelector)).length ) - const startConversation = useCallback(() => setConversationStarted(true), [ - setConversationStarted, - ]) + const startConversation = useCallback( + () => setConversationStarted(true), + [setConversationStarted] + ) const situation = useSelector(situationSelector) const displayResult = diff --git a/mon-entreprise/source/components/TargetSelection.tsx b/mon-entreprise/source/components/TargetSelection.tsx index b35fe696a..5beb4f61d 100644 --- a/mon-entreprise/source/components/TargetSelection.tsx +++ b/mon-entreprise/source/components/TargetSelection.tsx @@ -12,13 +12,7 @@ import { import { SitePathsContext } from 'Components/utils/SitePathsContext' import { DottedName } from 'modele-social' import { Names } from 'modele-social/dist/names' -import { - ASTNode, - EvaluatedNode, - formatValue, - reduceAST, - RuleNode, -} from 'publicodes' +import { EvaluatedNode, formatValue, reduceAST, RuleNode } from 'publicodes' import { Fragment, useCallback, useContext, useState } from 'react' import emoji from 'react-easy-emoji' import { Trans, useTranslation } from 'react-i18next' @@ -290,9 +284,8 @@ function AidesGlimpse() { const aidesNotNul = node.explanation .map((n) => engine.evaluate(n)) .filter(({ nodeValue }) => nodeValue !== false) - if (aidesNotNul.length === 1) { - return (aidesNotNul[0] as ASTNode & { nodeKind: 'reference' }) - .dottedName as DottedName + if (aidesNotNul.length === 1 && 'dottedName' in aidesNotNul[0]) { + return aidesNotNul[0].dottedName as DottedName } else { return acc } diff --git a/mon-entreprise/source/components/conversation/AnswerList.tsx b/mon-entreprise/source/components/conversation/AnswerList.tsx index c9385dad5..8674def27 100644 --- a/mon-entreprise/source/components/conversation/AnswerList.tsx +++ b/mon-entreprise/source/components/conversation/AnswerList.tsx @@ -17,11 +17,9 @@ type AnswerListProps = { export default function AnswerList({ onClose }: AnswerListProps) { const dispatch = useDispatch() const engine = useEngine() - const answeredQuestions = (Object.keys( - useSelector(situationSelector) - ) as Array).map((dottedName) => - engine.evaluate(engine.getRule(dottedName)) - ) + const answeredQuestions = ( + Object.keys(useSelector(situationSelector)) as Array + ).map((dottedName) => engine.evaluate(engine.getRule(dottedName))) const nextSteps = useNextQuestions().map((dottedName) => engine.evaluate(engine.getRule(dottedName)) diff --git a/mon-entreprise/source/components/conversation/Question.tsx b/mon-entreprise/source/components/conversation/Question.tsx index 70bedbfb3..78ca45dd6 100644 --- a/mon-entreprise/source/components/conversation/Question.tsx +++ b/mon-entreprise/source/components/conversation/Question.tsx @@ -175,7 +175,7 @@ export default function Question({ } const choiceElements = Array.isArray(choices) - ? renderBinaryQuestion((choices as unknown) as typeof binaryQuestion) + ? renderBinaryQuestion(choices as unknown as typeof binaryQuestion) : renderChildren(choices as Choice) return ( diff --git a/mon-entreprise/source/components/conversation/RuleInput.tsx b/mon-entreprise/source/components/conversation/RuleInput.tsx index a27e45923..539003793 100644 --- a/mon-entreprise/source/components/conversation/RuleInput.tsx +++ b/mon-entreprise/source/components/conversation/RuleInput.tsx @@ -225,9 +225,11 @@ export const buildVariantTree = ( variant ? { canGiveUp, - children: (variant.explanation as (ASTNode & { - nodeKind: 'reference' - })[]).map(({ dottedName }) => + children: ( + variant.explanation as (ASTNode & { + nodeKind: 'reference' + })[] + ).map(({ dottedName }) => buildVariantTree(engine, dottedName as Name) ), } diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 46ca70671..4327963e2 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -130,24 +130,20 @@ const CotisationsSection: Partial>> = { ], } -interface DistributionProps { - disableAnimation: boolean -} - -function Distribution({ disableAnimation }: DistributionProps) { +function Distribution() { const targetUnit = useSelector(targetUnitSelector) const engine = useEngine() - const distribution = (Object.entries( - CotisationsSection - ).map(([section, cotisations]) => [ - section, - cotisations - .map((c) => engine.evaluate({ valeur: c, unité: targetUnit })) - .reduce( - (acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0), - 0 - ), - ]) as Array<[DottedName, number]>) + const distribution = ( + Object.entries(CotisationsSection).map(([section, cotisations]) => [ + section, + cotisations + .map((c) => engine.evaluate({ valeur: c, unité: targetUnit })) + .reduce( + (acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0), + 0 + ), + ]) as Array<[DottedName, number]> + ) .filter(([, value]) => value > 0) .sort(([, a], [, b]) => b - a) @@ -162,7 +158,6 @@ function Distribution({ disableAnimation }: DistributionProps) { dottedName={sectionName} value={value} maximum={maximum} - disableAnimation={disableAnimation} /> ))}
    @@ -175,7 +170,6 @@ type DistributionBranchProps = { value: number maximum: number icon?: string - disableAnimation: boolean } function DistributionBranch({ @@ -183,7 +177,6 @@ function DistributionBranch({ value, icon, maximum, - disableAnimation, }: DistributionBranchProps) { const branche = useEngine().getRule(dottedName) @@ -195,7 +188,6 @@ function DistributionBranch({ icon={icon ?? branche.rawNode.icônes} description={branche.rawNode.résumé} unit="€" - disableAnimation={disableAnimation} /> ) } diff --git a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx index bdb77cff5..ba4465ae5 100644 --- a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx @@ -92,7 +92,8 @@ function CaisseRetraite() { return ( <> {caisses.map((caisse) => { - const dottedName = `dirigeant . indépendant . PL . ${caisse}` as DottedName + const dottedName = + `dirigeant . indépendant . PL . ${caisse}` as DottedName const { description, références } = engine.getRule(dottedName).rawNode return ( diff --git a/mon-entreprise/source/components/ui/SocialIcon.tsx b/mon-entreprise/source/components/ui/SocialIcon.tsx index fa5ae1918..9433843ac 100644 --- a/mon-entreprise/source/components/ui/SocialIcon.tsx +++ b/mon-entreprise/source/components/ui/SocialIcon.tsx @@ -3,34 +3,24 @@ import { useContext } from 'react' export const icons = { facebook: { - icon: - 'M34.1,47V33.3h4.6l0.7-5.3h-5.3v-3.4c0-1.5,0.4-2.6,2.6-2.6l2.8,0v-4.8c-0.5-0.1-2.2-0.2-4.1-0.2 c-4.1,0-6.9,2.5-6.9,7V28H24v5.3h4.6V47H34.1z', - mask: - 'M0,0v64h64V0H0z M39.6,22l-2.8,0c-2.2,0-2.6,1.1-2.6,2.6V28h5.3l-0.7,5.3h-4.6V47h-5.5V33.3H24V28h4.6V24 c0-4.6,2.8-7,6.9-7c2,0,3.6,0.1,4.1,0.2V22z', + icon: 'M34.1,47V33.3h4.6l0.7-5.3h-5.3v-3.4c0-1.5,0.4-2.6,2.6-2.6l2.8,0v-4.8c-0.5-0.1-2.2-0.2-4.1-0.2 c-4.1,0-6.9,2.5-6.9,7V28H24v5.3h4.6V47H34.1z', + mask: 'M0,0v64h64V0H0z M39.6,22l-2.8,0c-2.2,0-2.6,1.1-2.6,2.6V28h5.3l-0.7,5.3h-4.6V47h-5.5V33.3H24V28h4.6V24 c0-4.6,2.8-7,6.9-7c2,0,3.6,0.1,4.1,0.2V22z', }, twitter: { - icon: - 'M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z', - mask: - 'M0,0v64h64V0H0z M44.7,25.5c0,0.3,0,0.6,0,0.8C44.7,35,38.1,45,26.1,45c-3.7,0-7.2-1.1-10.1-2.9 c0.5,0.1,1,0.1,1.6,0.1c3.1,0,5.9-1,8.2-2.8c-2.9-0.1-5.3-2-6.1-4.6c0.4,0.1,0.8,0.1,1.2,0.1c0.6,0,1.2-0.1,1.7-0.2 c-3-0.6-5.3-3.3-5.3-6.4c0,0,0-0.1,0-0.1c0.9,0.5,1.9,0.8,3,0.8c-1.8-1.2-2.9-3.2-2.9-5.5c0-1.2,0.3-2.3,0.9-3.3 c3.2,4,8.1,6.6,13.5,6.9c-0.1-0.5-0.2-1-0.2-1.5c0-3.6,2.9-6.6,6.6-6.6c1.9,0,3.6,0.8,4.8,2.1c1.5-0.3,2.9-0.8,4.2-1.6 c-0.5,1.5-1.5,2.8-2.9,3.6c1.3-0.2,2.6-0.5,3.8-1C47.1,23.4,46,24.5,44.7,25.5z', + icon: 'M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z', + mask: 'M0,0v64h64V0H0z M44.7,25.5c0,0.3,0,0.6,0,0.8C44.7,35,38.1,45,26.1,45c-3.7,0-7.2-1.1-10.1-2.9 c0.5,0.1,1,0.1,1.6,0.1c3.1,0,5.9-1,8.2-2.8c-2.9-0.1-5.3-2-6.1-4.6c0.4,0.1,0.8,0.1,1.2,0.1c0.6,0,1.2-0.1,1.7-0.2 c-3-0.6-5.3-3.3-5.3-6.4c0,0,0-0.1,0-0.1c0.9,0.5,1.9,0.8,3,0.8c-1.8-1.2-2.9-3.2-2.9-5.5c0-1.2,0.3-2.3,0.9-3.3 c3.2,4,8.1,6.6,13.5,6.9c-0.1-0.5-0.2-1-0.2-1.5c0-3.6,2.9-6.6,6.6-6.6c1.9,0,3.6,0.8,4.8,2.1c1.5-0.3,2.9-0.8,4.2-1.6 c-0.5,1.5-1.5,2.8-2.9,3.6c1.3-0.2,2.6-0.5,3.8-1C47.1,23.4,46,24.5,44.7,25.5z', }, linkedin: { - icon: - 'M20.4,44h5.4V26.6h-5.4V44z M23.1,18c-1.7,0-3.1,1.4-3.1,3.1c0,1.7,1.4,3.1,3.1,3.1 c1.7,0,3.1-1.4,3.1-3.1C26.2,19.4,24.8,18,23.1,18z M39.5,26.2c-2.6,0-4.4,1.4-5.1,2.8h-0.1v-2.4h-5.2V44h5.4v-8.6 c0-2.3,0.4-4.5,3.2-4.5c2.8,0,2.8,2.6,2.8,4.6V44H46v-9.5C46,29.8,45,26.2,39.5,26.2z', - mask: - 'M0,0v64h64V0H0z M25.8,44h-5.4V26.6h5.4V44z M23.1,24.3c-1.7,0-3.1-1.4-3.1-3.1c0-1.7,1.4-3.1,3.1-3.1 c1.7,0,3.1,1.4,3.1,3.1C26.2,22.9,24.8,24.3,23.1,24.3z M46,44h-5.4v-8.4c0-2,0-4.6-2.8-4.6c-2.8,0-3.2,2.2-3.2,4.5V44h-5.4V26.6 h5.2V29h0.1c0.7-1.4,2.5-2.8,5.1-2.8c5.5,0,6.5,3.6,6.5,8.3V44z', + icon: 'M20.4,44h5.4V26.6h-5.4V44z M23.1,18c-1.7,0-3.1,1.4-3.1,3.1c0,1.7,1.4,3.1,3.1,3.1 c1.7,0,3.1-1.4,3.1-3.1C26.2,19.4,24.8,18,23.1,18z M39.5,26.2c-2.6,0-4.4,1.4-5.1,2.8h-0.1v-2.4h-5.2V44h5.4v-8.6 c0-2.3,0.4-4.5,3.2-4.5c2.8,0,2.8,2.6,2.8,4.6V44H46v-9.5C46,29.8,45,26.2,39.5,26.2z', + mask: 'M0,0v64h64V0H0z M25.8,44h-5.4V26.6h5.4V44z M23.1,24.3c-1.7,0-3.1-1.4-3.1-3.1c0-1.7,1.4-3.1,3.1-3.1 c1.7,0,3.1,1.4,3.1,3.1C26.2,22.9,24.8,24.3,23.1,24.3z M46,44h-5.4v-8.4c0-2,0-4.6-2.8-4.6c-2.8,0-3.2,2.2-3.2,4.5V44h-5.4V26.6 h5.2V29h0.1c0.7-1.4,2.5-2.8,5.1-2.8c5.5,0,6.5,3.6,6.5,8.3V44z', }, github: { - icon: - 'M32,16c-8.8,0-16,7.2-16,16c0,7.1,4.6,13.1,10.9,15.2 c0.8,0.1,1.1-0.3,1.1-0.8c0-0.4,0-1.4,0-2.7c-4.5,1-5.4-2.1-5.4-2.1c-0.7-1.8-1.8-2.3-1.8-2.3c-1.5-1,0.1-1,0.1-1 c1.6,0.1,2.5,1.6,2.5,1.6c1.4,2.4,3.7,1.7,4.7,1.3c0.1-1,0.6-1.7,1-2.1c-3.6-0.4-7.3-1.8-7.3-7.9c0-1.7,0.6-3.2,1.6-4.3 c-0.2-0.4-0.7-2,0.2-4.2c0,0,1.3-0.4,4.4,1.6c1.3-0.4,2.6-0.5,4-0.5c1.4,0,2.7,0.2,4,0.5c3.1-2.1,4.4-1.6,4.4-1.6 c0.9,2.2,0.3,3.8,0.2,4.2c1,1.1,1.6,2.5,1.6,4.3c0,6.1-3.7,7.5-7.3,7.9c0.6,0.5,1.1,1.5,1.1,3c0,2.1,0,3.9,0,4.4 c0,0.4,0.3,0.9,1.1,0.8C43.4,45.1,48,39.1,48,32C48,23.2,40.8,16,32,16z', - mask: - 'M0,0v64h64V0H0z M37.1,47.2c-0.8,0.2-1.1-0.3-1.1-0.8c0-0.5,0-2.3,0-4.4c0-1.5-0.5-2.5-1.1-3 c3.6-0.4,7.3-1.7,7.3-7.9c0-1.7-0.6-3.2-1.6-4.3c0.2-0.4,0.7-2-0.2-4.2c0,0-1.3-0.4-4.4,1.6c-1.3-0.4-2.6-0.5-4-0.5 c-1.4,0-2.7,0.2-4,0.5c-3.1-2.1-4.4-1.6-4.4-1.6c-0.9,2.2-0.3,3.8-0.2,4.2c-1,1.1-1.6,2.5-1.6,4.3c0,6.1,3.7,7.5,7.3,7.9 c-0.5,0.4-0.9,1.1-1,2.1c-0.9,0.4-3.2,1.1-4.7-1.3c0,0-0.8-1.5-2.5-1.6c0,0-1.6,0-0.1,1c0,0,1,0.5,1.8,2.3c0,0,0.9,3.1,5.4,2.1 c0,1.3,0,2.3,0,2.7c0,0.4-0.3,0.9-1.1,0.8C20.6,45.1,16,39.1,16,32c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16 C48,39.1,43.4,45.1,37.1,47.2z', + icon: 'M32,16c-8.8,0-16,7.2-16,16c0,7.1,4.6,13.1,10.9,15.2 c0.8,0.1,1.1-0.3,1.1-0.8c0-0.4,0-1.4,0-2.7c-4.5,1-5.4-2.1-5.4-2.1c-0.7-1.8-1.8-2.3-1.8-2.3c-1.5-1,0.1-1,0.1-1 c1.6,0.1,2.5,1.6,2.5,1.6c1.4,2.4,3.7,1.7,4.7,1.3c0.1-1,0.6-1.7,1-2.1c-3.6-0.4-7.3-1.8-7.3-7.9c0-1.7,0.6-3.2,1.6-4.3 c-0.2-0.4-0.7-2,0.2-4.2c0,0,1.3-0.4,4.4,1.6c1.3-0.4,2.6-0.5,4-0.5c1.4,0,2.7,0.2,4,0.5c3.1-2.1,4.4-1.6,4.4-1.6 c0.9,2.2,0.3,3.8,0.2,4.2c1,1.1,1.6,2.5,1.6,4.3c0,6.1-3.7,7.5-7.3,7.9c0.6,0.5,1.1,1.5,1.1,3c0,2.1,0,3.9,0,4.4 c0,0.4,0.3,0.9,1.1,0.8C43.4,45.1,48,39.1,48,32C48,23.2,40.8,16,32,16z', + mask: 'M0,0v64h64V0H0z M37.1,47.2c-0.8,0.2-1.1-0.3-1.1-0.8c0-0.5,0-2.3,0-4.4c0-1.5-0.5-2.5-1.1-3 c3.6-0.4,7.3-1.7,7.3-7.9c0-1.7-0.6-3.2-1.6-4.3c0.2-0.4,0.7-2-0.2-4.2c0,0-1.3-0.4-4.4,1.6c-1.3-0.4-2.6-0.5-4-0.5 c-1.4,0-2.7,0.2-4,0.5c-3.1-2.1-4.4-1.6-4.4-1.6c-0.9,2.2-0.3,3.8-0.2,4.2c-1,1.1-1.6,2.5-1.6,4.3c0,6.1,3.7,7.5,7.3,7.9 c-0.5,0.4-0.9,1.1-1,2.1c-0.9,0.4-3.2,1.1-4.7-1.3c0,0-0.8-1.5-2.5-1.6c0,0-1.6,0-0.1,1c0,0,1,0.5,1.8,2.3c0,0,0.9,3.1,5.4,2.1 c0,1.3,0,2.3,0,2.7c0,0.4-0.3,0.9-1.1,0.8C20.6,45.1,16,39.1,16,32c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16 C48,39.1,43.4,45.1,37.1,47.2z', }, email: { - icon: - 'M17,22v20h30V22H17z M41.1,25L32,32.1L22.9,25H41.1z M20,39V26.6l12,9.3l12-9.3V39H20z', - mask: - 'M41.1,25H22.9l9.1,7.1L41.1,25z M44,26.6l-12,9.3l-12-9.3V39h24V26.6z M0,0v64h64V0H0z M47,42H17V22h30V42z', + icon: 'M17,22v20h30V22H17z M41.1,25L32,32.1L22.9,25H41.1z M20,39V26.6l12,9.3l12-9.3V39H20z', + mask: 'M41.1,25H22.9l9.1,7.1L41.1,25z M44,26.6l-12,9.3l-12-9.3V39h24V26.6z M0,0v64h64V0H0z M47,42H17V22h30V42z', }, } diff --git a/mon-entreprise/source/components/utils/useSearchParamsSimulationSharing.ts b/mon-entreprise/source/components/utils/useSearchParamsSimulationSharing.ts index af49e96b6..f50d4c339 100644 --- a/mon-entreprise/source/components/utils/useSearchParamsSimulationSharing.ts +++ b/mon-entreprise/source/components/utils/useSearchParamsSimulationSharing.ts @@ -115,10 +115,12 @@ export const cleanSearchParams = ( export const getRulesParamNames = ( parsedRules: ParsedRules ): [DottedName, ParamName][] => - (Object.entries(parsedRules) as [ - DottedName, - { rawNode: { 'identifiant court'?: ShortName } } - ][]).map(([dottedName, ruleNode]) => [ + ( + Object.entries(parsedRules) as [ + DottedName, + { rawNode: { 'identifiant court'?: ShortName } } + ][] + ).map(([dottedName, ruleNode]) => [ dottedName, ruleNode.rawNode['identifiant court'] || dottedName, ]) diff --git a/mon-entreprise/source/locales/translateRules.ts b/mon-entreprise/source/locales/translateRules.ts index c4c5f9c46..2380a11ec 100644 --- a/mon-entreprise/source/locales/translateRules.ts +++ b/mon-entreprise/source/locales/translateRules.ts @@ -41,17 +41,15 @@ export const attributesToTranslate = [ 'identifiant court', ] -const translateProp = (lang: string, translation: Translation) => ( - rule: Rule, - prop: string -) => { - if (prop === 'suggestions' && rule?.suggestions) { - return translateSuggestion(prop, rule, translation, lang) +const translateProp = + (lang: string, translation: Translation) => (rule: Rule, prop: string) => { + if (prop === 'suggestions' && rule?.suggestions) { + return translateSuggestion(prop, rule, translation, lang) + } + let propTrans = translation[prop + '.' + lang] + propTrans = propTrans?.replace(/^\[automatic\] /, '') + return propTrans ? assoc(prop, propTrans, rule) : rule } - let propTrans = translation[prop + '.' + lang] - propTrans = propTrans?.replace(/^\[automatic\] /, '') - return propTrans ? assoc(prop, propTrans, rule) : rule -} function translateRule( lang: string, diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 10a3a1929..c0311a0b8 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -126,6 +126,9 @@ Plafonds des tranches: Wafer ceilings Plein écran: Fullscreen Plus d'informations: More information (fr) Plusieurs associés: Several partners +"Pour en savoir plus, rendez-vous sur le site <2>aquoiserventlescotisations": + urssaf: + fr: To find out more, visit <2>aquoiserventlescotisations.urssaf.fr Prise en charge du revenu net avec chômage partiel: Net income support with short-time working Prochaines questions: Next questions Professionnels de santé: Health Care Professionals @@ -1357,8 +1360,9 @@ pages: shortname: PAMC title: "PAMC: contribution and income simulators" print-info: - recover: Find it, as well as other tools to help create and manage a business on <2>mycompanyinfrance.fr date: This simulation was performed on + recover: You can find this simulation and other tools to help you create and + manage your business on <2>mon-entreprise.fr. title: Would you like to recover this simulation? profession-libérale: meta: diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index 44e263f12..b0995dd0d 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -52,6 +52,10 @@ Passer: Passer Personnalisez l'intégration: Personnalisez l'intégration Plus d'informations: Plus d'informations Plusieurs associés: Plusieurs associés +"Pour en savoir plus, rendez-vous sur le site <2>aquoiserventlescotisations": + urssaf: + fr: Pour en savoir plus, rendez-vous sur le site + <2>aquoiserventlescotisations.urssaf.fr Prochaines questions: Prochaines questions Professions libérales: Professions libérales Précédent: Précédent @@ -1009,8 +1013,9 @@ pages: shortname: PAMC title: "PAMC : simulateurs de cotisations et de revenu" print-info: - recover: Retrouvez la, ainsi que d'autres outils d'aide à la création et à la gestion d'entreprise, sur <2>mon-entreprise.fr - date: Cette simulation a été effectuée le + date: Cette simulation a été effectuée le + recover: Retrouvez cette simulation ainsi que d'autres outils d'aide à la + création et à la gestion d'entreprise, sur <2>mon-entreprise.fr. title: Vous souhaitez retrouver cette simulation ? profession-libérale: meta: diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx index 545b8232f..3193711f7 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatSimple.tsx @@ -45,10 +45,12 @@ export default function ResultatsSimples() { Vous pouvez reporter les montants suivants dans votre déclaration, calculés à partir des informations saisies.

    - {([ - 'aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires', - 'aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible', - ] as const).map((dottedName) => { + {( + [ + 'aide déclaration revenu indépendant 2020 . résultat simple . cotisations obligatoires', + 'aide déclaration revenu indépendant 2020 . résultat simple . total charges sociales déductible', + ] as const + ).map((dottedName) => { const r = engine.getRule(dottedName) if (engine.evaluate(dottedName).nodeValue === false) { return null @@ -114,13 +116,15 @@ export default function ResultatsSimples() { grid-template-columns: repeat(3, auto); `} > - {([ - 'aide déclaration revenu indépendant 2020 . réduction covid . total', - 'aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal', - 'aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible', - 'aide déclaration revenu indépendant 2020 . résultat simple . CFP', - 'aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale', - ] as const).map((dottedName) => { + {( + [ + 'aide déclaration revenu indépendant 2020 . réduction covid . total', + 'aide déclaration revenu indépendant 2020 . résultat simple . revenu net fiscal', + 'aide déclaration revenu indépendant 2020 . résultat simple . CSG déductible', + 'aide déclaration revenu indépendant 2020 . résultat simple . CFP', + 'aide déclaration revenu indépendant 2020 . résultat simple . assiette sociale', + ] as const + ).map((dottedName) => { const r = engine.getRule(dottedName) if (engine.evaluate(dottedName).nodeValue === false) { return null diff --git a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx index 7e8ddab73..7f380f944 100644 --- a/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx +++ b/mon-entreprise/source/pages/Gérer/AideDéclarationIndépendant/RésultatsParFormulaire.tsx @@ -46,13 +46,15 @@ export default function ResultatsParFormulaire() { déclaration correcte.{' '}

    En cas de doute, référez-vous à votre expert comptable.

    - {([ - 'aide déclaration revenu indépendant 2020 . formulaire 2035', - 'aide déclaration revenu indépendant 2020 . formulaire 2033', - 'aide déclaration revenu indépendant 2020 . formulaire 2050', - 'aide déclaration revenu indépendant 2020 . formulaire 2042', - 'aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C', - ] as const).map((dottedName) => ( + {( + [ + 'aide déclaration revenu indépendant 2020 . formulaire 2035', + 'aide déclaration revenu indépendant 2020 . formulaire 2033', + 'aide déclaration revenu indépendant 2020 . formulaire 2050', + 'aide déclaration revenu indépendant 2020 . formulaire 2042', + 'aide déclaration revenu indépendant 2020 . formulaire 2042 PRO C', + ] as const + ).map((dottedName) => ( ))} diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/FieldsPDF.tsx b/mon-entreprise/source/pages/Gérer/DemandeMobilite/FieldsPDF.tsx index 2337ded79..73b14b3e6 100644 --- a/mon-entreprise/source/pages/Gérer/DemandeMobilite/FieldsPDF.tsx +++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/FieldsPDF.tsx @@ -34,10 +34,12 @@ export default function FieldsPDF({ fields }: FieldsPDFProps) { {formatValue(engine.evaluate(dottedName)) + (API === 'commune' ? ` (${ - (engine.evaluate(dottedName).nodeValue as Record< - string, - unknown - >)?.codePostal as string + ( + engine.evaluate(dottedName).nodeValue as Record< + string, + unknown + > + )?.codePostal as string })` : '')}{' '} diff --git a/mon-entreprise/source/pages/Gérer/DemandeMobilite/demande-mobilité.yaml b/mon-entreprise/source/pages/Gérer/DemandeMobilite/demande-mobilité.yaml index ac44fb1e9..c096fab0f 100644 --- a/mon-entreprise/source/pages/Gérer/DemandeMobilite/demande-mobilité.yaml +++ b/mon-entreprise/source/pages/Gérer/DemandeMobilite/demande-mobilité.yaml @@ -222,15 +222,15 @@ activité transfrontalière simultanée . activité salariée . profession: activité transfrontalière simultanée . activité salariée . période: type: groupe formule: oui -? activité transfrontalière simultanée . activité salariée . période . date de début du contrat -: type: date -? activité transfrontalière simultanée . activité salariée . période . date de fin connue -: question: Votre contrat salarié a-t'il une date de fin ? -? activité transfrontalière simultanée . activité salariée . période . date de fin -: applicable si: date de fin connue +activité transfrontalière simultanée . activité salariée . période . date de début du contrat: type: date -? activité transfrontalière simultanée . activité salariée . période . vérification -: titre: Date d'activité salariée non valides +activité transfrontalière simultanée . activité salariée . période . date de fin connue: + question: Votre contrat salarié a-t'il une date de fin ? +activité transfrontalière simultanée . activité salariée . période . date de fin: + applicable si: date de fin connue + type: date +activité transfrontalière simultanée . activité salariée . période . vérification: + titre: Date d'activité salariée non valides formule: date de début du contrat > date de fin type: notification description: La date de fin du contrat ne peut être antérieure à la date de début @@ -246,32 +246,32 @@ activité transfrontalière simultanée . activité salariée . employeur . adre type: texte activité transfrontalière simultanée . activité salariée . employeur . ville: type: texte -? activité transfrontalière simultanée . activité salariée . employeur . code postal -: type: texte +activité transfrontalière simultanée . activité salariée . employeur . code postal: + type: texte activité transfrontalière simultanée . activité salariée . lieu d'exercice: titre: Lieu effectif d'activité type: groupe formule: oui -? activité transfrontalière simultanée . activité salariée . lieu d'exercice . employeur -: question: Exercerez-vous effectivement cette activité salariée dans le pays de votre employeur ? +activité transfrontalière simultanée . activité salariée . lieu d'exercice . employeur: + question: Exercerez-vous effectivement cette activité salariée dans le pays de votre employeur ? description: Votre activité salariée peut-être exercé depuis un autre pays que celui de l'employeur par exemple en cas de télétravail. -? activité transfrontalière simultanée . activité salariée . lieu d'exercice . lieu de résidence -: question: Exercerez-vous cette activité salariée dans votre pays de résidence ? +activité transfrontalière simultanée . activité salariée . lieu d'exercice . lieu de résidence: + question: Exercerez-vous cette activité salariée dans votre pays de résidence ? non applicable si: employeur -? activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays -: non applicable si: +activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays: + non applicable si: une de ces conditions: - lieu de résidence - employeur question: Quel sera le pays dans lequel vous exercerez cette activité salariée ? API: pays européen -? activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays . autre -: applicable si: pays = 'Autre' +activité transfrontalière simultanée . activité salariée . lieu d'exercice . pays . autre: + applicable si: pays = 'Autre' titre: Nom du pays type: texte @@ -280,12 +280,12 @@ activité transfrontalière simultanée . activité salariée . revenus: type: groupe formule: oui -? activité transfrontalière simultanée . activité salariée . revenus . taux horaire -: type: texte +activité transfrontalière simultanée . activité salariée . revenus . taux horaire: + type: texte question: Quel est le taux horaire brut (dans la monnaie du pays d'accueil) ? -? activité transfrontalière simultanée . activité salariée . revenus . nombre d'heures -: type: nombre +activité transfrontalière simultanée . activité salariée . revenus . nombre d'heures: + type: nombre unité: heures/semaine question: Quel est le temps de travail hebdomadaire inscrit au contrat de travail ? @@ -294,16 +294,16 @@ activité transfrontalière simultanée . activité salariée . revenus . revenu type: nombre unité: €/an -? activité transfrontalière simultanée . activité salariée . revenus . activité substantielle -: question: > +activité transfrontalière simultanée . activité salariée . revenus . activité substantielle: + question: > Considérez-vous que votre activité salariée représentera plus de 5% de votre activité professionnelle pour les 12 prochains mois ? -? activité transfrontalière simultanée . activité salariée . revenus . articulation activité indépendante -: question: Comment votre activité salariée s'articulera-t-elle avec votre activité indépendante au cours des 12 prochains mois (périodes, revenu, etc.) ? +activité transfrontalière simultanée . activité salariée . revenus . articulation activité indépendante: + question: Comment votre activité salariée s'articulera-t-elle avec votre activité indépendante au cours des 12 prochains mois (périodes, revenu, etc.) ? type: paragraphe -? activité transfrontalière simultanée . activité salariée . activité indépendante additionnelle -: question: > +activité transfrontalière simultanée . activité salariée . activité indépendante additionnelle: + question: > Exercez-vous également une activité non salariée à l'étranger ? activité transfrontalière simultanée . part substantielle France: @@ -336,21 +336,21 @@ activité transfrontalière simultanée . activité non salariée . n°1: formule: oui activité transfrontalière simultanée . activité non salariée . n°1 . pays: API: pays européen -? activité transfrontalière simultanée . activité non salariée . n°1 . pays . autre -: applicable si: pays = 'Autre' +activité transfrontalière simultanée . activité non salariée . n°1 . pays . autre: + applicable si: pays = 'Autre' titre: Nom du pays type: texte -? activité transfrontalière simultanée . activité non salariée . n°1 . nom de l'entreprise -: type: texte +activité transfrontalière simultanée . activité non salariée . n°1 . nom de l'entreprise: + type: texte activité transfrontalière simultanée . activité non salariée . n°1 . adresse: type: texte activité transfrontalière simultanée . activité non salariée . n°1 . ville: type: texte -? activité transfrontalière simultanée . activité non salariée . n°1 . code postal -: type: texte -? activité transfrontalière simultanée . activité non salariée . n°1 . date de début d'activité -: type: date +activité transfrontalière simultanée . activité non salariée . n°1 . code postal: + type: texte +activité transfrontalière simultanée . activité non salariée . n°1 . date de début d'activité: + type: date activité transfrontalière simultanée . activité non salariée . n°2: titre: activité non salarié n°2 @@ -359,20 +359,20 @@ activité transfrontalière simultanée . activité non salariée . n°2: formule: oui activité transfrontalière simultanée . activité non salariée . n°2 . pays: API: pays européen -? activité transfrontalière simultanée . activité non salariée . n°2 . pays . autre -: applicable si: pays = 'Autre' +activité transfrontalière simultanée . activité non salariée . n°2 . pays . autre: + applicable si: pays = 'Autre' titre: Nom du pays type: texte -? activité transfrontalière simultanée . activité non salariée . n°2 . nom de l'entreprise -: type: texte +activité transfrontalière simultanée . activité non salariée . n°2 . nom de l'entreprise: + type: texte activité transfrontalière simultanée . activité non salariée . n°2 . adresse: type: texte activité transfrontalière simultanée . activité non salariée . n°2 . ville: type: texte -? activité transfrontalière simultanée . activité non salariée . n°2 . code postal -: type: texte -? activité transfrontalière simultanée . activité non salariée . n°2 . date de début d'activité -: type: date +activité transfrontalière simultanée . activité non salariée . n°2 . code postal: + type: texte +activité transfrontalière simultanée . activité non salariée . n°2 . date de début d'activité: + type: date activité transfrontalière simultanée . activité non salariée . n°3: titre: activité non salarié n°3 @@ -381,23 +381,23 @@ activité transfrontalière simultanée . activité non salariée . n°3: formule: oui activité transfrontalière simultanée . activité non salariée . n°3 . pays: API: pays européen -? activité transfrontalière simultanée . activité non salariée . n°3 . pays . autre -: applicable si: pays = 'Autre' +activité transfrontalière simultanée . activité non salariée . n°3 . pays . autre: + applicable si: pays = 'Autre' titre: Nom du pays type: texte -? activité transfrontalière simultanée . activité non salariée . n°3 . nom de l'entreprise -: type: texte +activité transfrontalière simultanée . activité non salariée . n°3 . nom de l'entreprise: + type: texte activité transfrontalière simultanée . activité non salariée . n°3 . adresse: type: texte activité transfrontalière simultanée . activité non salariée . n°3 . ville: type: texte -? activité transfrontalière simultanée . activité non salariée . n°3 . code postal -: type: texte -? activité transfrontalière simultanée . activité non salariée . n°3 . date de début d'activité -: type: date +activité transfrontalière simultanée . activité non salariée . n°3 . code postal: + type: texte +activité transfrontalière simultanée . activité non salariée . n°3 . date de début d'activité: + type: date -? activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt -: type: groupe +activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt: + type: groupe formule: oui titre: Quel sera votre pays "centre d'intêret" pour les 12 prochains mois ? non applicable si: @@ -430,11 +430,11 @@ activité transfrontalière simultanée . activité non salariée . n°3 . ville circonstances (notamment ses projets), de faire des Pays-Bas le centre d’intérêt de son activité. -? activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt . pays -: API: pays européen +activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt . pays: + API: pays européen titre: Pays "centre d'intêret" -? activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt . pays . autre -: applicable si: pays = 'Autre' +activité transfrontalière simultanée . activité non salariée . pays centre d'intérêt . pays . autre: + applicable si: pays = 'Autre' titre: Nom du pays type: texte commentaires additionnels: diff --git a/mon-entreprise/source/pages/Gérer/Home.tsx b/mon-entreprise/source/pages/Gérer/Home.tsx index dac34dcc8..9c3b6a89a 100644 --- a/mon-entreprise/source/pages/Gérer/Home.tsx +++ b/mon-entreprise/source/pages/Gérer/Home.tsx @@ -290,9 +290,8 @@ type CompanySectionProps = { export const CompanySection = ({ company }: CompanySectionProps) => { const [searchModal, showSearchModal] = useState(false) const [autoEntrepreneurModal, showAutoEntrepreneurModal] = useState(false) - const [DirigeantMajoritaireModal, showDirigeantMajoritaireModal] = useState( - false - ) + const [DirigeantMajoritaireModal, showDirigeantMajoritaireModal] = + useState(false) const companyRef = useRef(null) useEffect(() => { diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx index 364071b90..c268e76d8 100644 --- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/VotreSituation.tsx @@ -41,9 +41,9 @@ export default function VotreSituation() { } const déclarations = déclarationsSelector(state) - const régimeGénéralDisponible = activitésEffectuéesSelector( - state - ).some((activité) => régimeGénéralDisponibleSelector(state, activité)) + const régimeGénéralDisponible = activitésEffectuéesSelector(state).some( + (activité) => régimeGénéralDisponibleSelector(state, activité) + ) return ( diff --git a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js index def769e08..f239f1baa 100644 --- a/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js +++ b/mon-entreprise/source/pages/Simulateurs/ÉconomieCollaborative/selectors.js @@ -1,12 +1,14 @@ import { hasConditions } from './activitésData' -const filterActivités = (filter = () => true) => (state) => - Object.entries(state) - .filter( - ([activitéTitle, activitéData]) => - activitéData.effectuée && filter(activitéData, activitéTitle) - ) - .map(([activité]) => activité) +const filterActivités = + (filter = () => true) => + (state) => + Object.entries(state) + .filter( + ([activitéTitle, activitéData]) => + activitéData.effectuée && filter(activitéData, activitéTitle) + ) + .map(([activité]) => activité) export const nextActivitéSelector = (state, currentActivité) => filterActivités( diff --git a/mon-entreprise/source/pages/Stats/Stats.tsx b/mon-entreprise/source/pages/Stats/Stats.tsx index 2018bc1bf..ace3158ad 100644 --- a/mon-entreprise/source/pages/Stats/Stats.tsx +++ b/mon-entreprise/source/pages/Stats/Stats.tsx @@ -22,7 +22,7 @@ import SatisfactionChart from './SatisfactionChart' import { Page, PageChapter2, PageSatisfaction, StatsStruct } from './types' import { formatDay, formatMonth, Indicator, Indicators } from './utils' -const stats = (statsJson as unknown) as StatsStruct +const stats = statsJson as unknown as StatsStruct type Period = 'mois' | 'jours' type Chapter2 = PageChapter2 | 'PAM' diff --git a/mon-entreprise/source/reducers/rootReducer.ts b/mon-entreprise/source/reducers/rootReducer.ts index d250d67f1..f493dab0e 100644 --- a/mon-entreprise/source/reducers/rootReducer.ts +++ b/mon-entreprise/source/reducers/rootReducer.ts @@ -103,9 +103,9 @@ function simulation( unfoldedStep: null, } case 'BATCH_UPDATE_SITUATION': { - return (Object.entries(action.situation as any) as Array< - [Names, unknown] - >).reduce( + return ( + Object.entries(action.situation as any) as Array<[Names, unknown]> + ).reduce( (newState, [fieldName, value]) => simulation(newState, { type: 'UPDATE_SITUATION', diff --git a/mon-entreprise/source/selectors/companyStatusSelectors.ts b/mon-entreprise/source/selectors/companyStatusSelectors.ts index 96007c7ef..e0c5f9368 100644 --- a/mon-entreprise/source/selectors/companyStatusSelectors.ts +++ b/mon-entreprise/source/selectors/companyStatusSelectors.ts @@ -97,21 +97,21 @@ const QUESTION_LIST: Array = keys( mergeAll(flatten(Object.values(LEGAL_STATUS_DETAILS))) ) -const isCompatibleStatusWith = (answers: any) => ( - statusRequirements: LegalStatusRequirements -): boolean => { - const stringify = map((x) => (!isNil(x) ? JSON.stringify(x) : x)) - const answerCompatibility = Object.values( - mergeWith( - (answer, statusValue) => - isNil(answer) || isNil(statusValue) || answer === statusValue, - stringify(statusRequirements as any), - stringify(answers) +const isCompatibleStatusWith = + (answers: any) => + (statusRequirements: LegalStatusRequirements): boolean => { + const stringify = map((x) => (!isNil(x) ? JSON.stringify(x) : x)) + const answerCompatibility = Object.values( + mergeWith( + (answer, statusValue) => + isNil(answer) || isNil(statusValue) || answer === statusValue, + stringify(statusRequirements as any), + stringify(answers) + ) ) - ) - const isCompatibleStatus = answerCompatibility.every((x) => x !== false) - return isCompatibleStatus -} + const isCompatibleStatus = answerCompatibility.every((x) => x !== false) + return isCompatibleStatus + } const possibleStatus = ( answers: Array | LegalStatusRequirements ): Record => @@ -140,24 +140,23 @@ export const nextQuestionSelector = (state: RootState): Question | null => { ).filter(isCompatibleStatusWith(legalStatusRequirements) as any) const unansweredQuestions = difference(QUESTION_LIST, questionAnswered) - const shannonEntropyByQuestion = unansweredQuestions.map((question): [ - typeof question, - number - ] => { - const answerPopulation = Object.values(possibleStatusList).map( - (status: any) => status[question] - ) - const frequencyOfAnswers = Object.values( - countBy( - (x) => x, - answerPopulation.filter((x) => x !== undefined) + const shannonEntropyByQuestion = unansweredQuestions.map( + (question): [typeof question, number] => { + const answerPopulation = Object.values(possibleStatusList).map( + (status: any) => status[question] ) - ).map((numOccurrence) => numOccurrence / answerPopulation.length) - const shannonEntropy = -frequencyOfAnswers - .map((p) => p * Math.log2(p)) - .reduce(add, 0) - return [question, shannonEntropy] - }) + const frequencyOfAnswers = Object.values( + countBy( + (x) => x, + answerPopulation.filter((x) => x !== undefined) + ) + ).map((numOccurrence) => numOccurrence / answerPopulation.length) + const shannonEntropy = -frequencyOfAnswers + .map((p) => p * Math.log2(p)) + .reduce(add, 0) + return [question, shannonEntropy] + } + ) const sortedPossibleNextQuestions = sortBy( ([, entropy]) => -entropy, diff --git a/mon-entreprise/source/sentry.ts b/mon-entreprise/source/sentry.ts index abf7d7ce8..839f21f54 100644 --- a/mon-entreprise/source/sentry.ts +++ b/mon-entreprise/source/sentry.ts @@ -1,9 +1,8 @@ import * as Sentry from '@sentry/react' import { Integrations } from '@sentry/tracing' -let branch: string | undefined = process.env.GITHUB_REF?.split('/')?.slice( - -1 -)?.[0] +let branch: string | undefined = + process.env.GITHUB_REF?.split('/')?.slice(-1)?.[0] if (branch === 'merge') { branch = process.env.GITHUB_HEAD_REF @@ -28,8 +27,7 @@ export const productionMode = ['master', 'next'].includes(branch ?? '') if (productionMode) { Sentry.init({ - dsn: - 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', + dsn: 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', integrations: [new Integrations.BrowserTracing()], release, // Set tracesSampleRate to 1.0 to capture 100% diff --git a/mon-entreprise/test/real-rules.test.js b/mon-entreprise/test/real-rules.test.js index 09ca149e1..dffdb19f3 100644 --- a/mon-entreprise/test/real-rules.test.js +++ b/mon-entreprise/test/real-rules.test.js @@ -13,11 +13,8 @@ let runExamples = (examples, rule) => const situation = Object.entries(ex.situation).reduce( (acc, [name, value]) => ({ ...acc, - [disambiguateRuleReference( - engine.parsedRules, - rule.dottedName, - name - )]: value, + [disambiguateRuleReference(engine.parsedRules, rule.dottedName, name)]: + value, }), {} ) diff --git a/publicodes/core/source/AST/index.ts b/publicodes/core/source/AST/index.ts index b07baa71d..4a1977cc9 100644 --- a/publicodes/core/source/AST/index.ts +++ b/publicodes/core/source/AST/index.ts @@ -295,16 +295,14 @@ const traversePlancherNode: TraverseFunction<'plancher'> = (fn, node) => ({ }, }) -const traverseRésoudreRéférenceCirculaireNode: TraverseFunction<'résoudre référence circulaire'> = ( - fn, - node -) => ({ - ...node, - explanation: { - ...node.explanation, - valeur: fn(node.explanation.valeur), - }, -}) +const traverseRésoudreRéférenceCirculaireNode: TraverseFunction<'résoudre référence circulaire'> = + (fn, node) => ({ + ...node, + explanation: { + ...node.explanation, + valeur: fn(node.explanation.valeur), + }, + }) const traversePlafondNode: TraverseFunction<'plafond'> = (fn, node) => ({ ...node, diff --git a/publicodes/core/source/format.ts b/publicodes/core/source/format.ts index d54970a27..8016f3c89 100644 --- a/publicodes/core/source/format.ts +++ b/publicodes/core/source/format.ts @@ -2,33 +2,35 @@ import { Evaluation, Unit } from './AST/types' import { simplifyNodeUnit } from './nodeUnits' import { formatUnit, serializeUnit } from './units' -export const numberFormatter = ({ - style, - maximumFractionDigits = 2, - minimumFractionDigits = 0, - language, -}: { - style?: string - maximumFractionDigits?: number - minimumFractionDigits?: number - language?: string -}) => (value: number) => { - // When we format currency we don't want to display a single decimal digit - // ie 8,1€ but we want to display 8,10€ - const adaptedMinimumFractionDigits = - style === 'currency' && - maximumFractionDigits >= 2 && - minimumFractionDigits === 0 && - !Number.isInteger(value) - ? 2 - : minimumFractionDigits - return Intl.NumberFormat(language, { +export const numberFormatter = + ({ style, - currency: 'EUR', - maximumFractionDigits, - minimumFractionDigits: adaptedMinimumFractionDigits, - }).format(value) -} + maximumFractionDigits = 2, + minimumFractionDigits = 0, + language, + }: { + style?: string + maximumFractionDigits?: number + minimumFractionDigits?: number + language?: string + }) => + (value: number) => { + // When we format currency we don't want to display a single decimal digit + // ie 8,1€ but we want to display 8,10€ + const adaptedMinimumFractionDigits = + style === 'currency' && + maximumFractionDigits >= 2 && + minimumFractionDigits === 0 && + !Number.isInteger(value) + ? 2 + : minimumFractionDigits + return Intl.NumberFormat(language, { + style, + currency: 'EUR', + maximumFractionDigits, + minimumFractionDigits: adaptedMinimumFractionDigits, + }).format(value) + } export const formatCurrency = ( nodeValue: number | undefined, @@ -168,9 +170,10 @@ export function serializeValue( { nodeValue, unit }: { nodeValue: Evaluation; unit?: Unit }, { format }: { format: formatUnit } ) { - const serializedUnit = (unit && typeof nodeValue === 'number' - ? serializeUnit(unit, nodeValue, format) - : '' + const serializedUnit = ( + unit && typeof nodeValue === 'number' + ? serializeUnit(unit, nodeValue, format) + : '' )?.replace(/\s*\/\s*/g, '/') return `${nodeValue} ${serializedUnit}`.trim() } diff --git a/publicodes/core/source/grammarFunctions.js b/publicodes/core/source/grammarFunctions.js index 043305909..0a812f9f6 100644 --- a/publicodes/core/source/grammarFunctions.js +++ b/publicodes/core/source/grammarFunctions.js @@ -2,19 +2,23 @@ The advantage of putting them here is to get prettier's JS formatting, since Nealrey doesn't support it https://github.com/kach/nearley/issues/310 */ import { normalizeDateString } from './date' -export let binaryOperation = (operationType) => ([A, , operator, , B]) => ({ - [operator]: { - operationType, - explanation: [A, B], - }, -}) +export let binaryOperation = + (operationType) => + ([A, , operator, , B]) => ({ + [operator]: { + operationType, + explanation: [A, B], + }, + }) -export let unaryOperation = (operationType) => ([operator, , A]) => ({ - [operator]: { - operationType, - explanation: [number([{ value: '0' }]), A], - }, -}) +export let unaryOperation = + (operationType) => + ([operator, , A]) => ({ + [operator]: { + operationType, + explanation: [number([{ value: '0' }]), A], + }, + }) export let variable = ([firstFragment, nextFragment], _, reject) => { const fragments = [firstFragment, ...nextFragment].map(({ value }) => value) diff --git a/publicodes/core/source/mecanisms/recalcul.ts b/publicodes/core/source/mecanisms/recalcul.ts index bfcecf8f1..1f7443b9b 100644 --- a/publicodes/core/source/mecanisms/recalcul.ts +++ b/publicodes/core/source/mecanisms/recalcul.ts @@ -18,7 +18,7 @@ export type RecalculNode = { const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) { if (this.cache._meta.inRecalcul) { - return (defaultNode(null) as any) as RecalculNode & EvaluatedNode + return defaultNode(null) as any as RecalculNode & EvaluatedNode } const amendedSituation = node.explanation.amendedSituation diff --git a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts index 240559222..acfb823cf 100644 --- a/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts +++ b/publicodes/core/source/mecanisms/résoudre-référence-circulaire.ts @@ -14,83 +14,82 @@ export type RésoudreRéférenceCirculaireNode = { nodeKind: 'résoudre référence circulaire' } -export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoudre référence circulaire'> = function ( - node -) { - const originalCache = this.cache - let inversionNumberOfIterations = 0 +export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoudre référence circulaire'> = + function (node) { + const originalCache = this.cache + let inversionNumberOfIterations = 0 - const evaluateWithValue = ( - n: number, - unit: Unit = { numerators: [], denominators: [] } - ) => { - inversionNumberOfIterations++ - this.resetCache() + const evaluateWithValue = ( + n: number, + unit: Unit = { numerators: [], denominators: [] } + ) => { + inversionNumberOfIterations++ + this.resetCache() - this.parsedSituation[node.explanation.ruleToSolve] = { - unit: unit, - nodeKind: 'unité', - explanation: { - nodeKind: 'constant', - nodeValue: n, - type: 'number', - } as ConstantNode, - } as UnitéNode - return this.evaluate(node.explanation.valeur) - } - - let nodeValue: number | null | undefined = null - - const x0 = 0 - let valeur = evaluateWithValue(x0) - - const y0 = valeur.nodeValue as number - const unit = valeur.unit - const missingVariables = valeur.missingVariables - let i = 0 - if (y0 !== null) { - // The `uniroot` function parameter. It will be called with its `min` and - // `max` arguments, so we can use our cached nodes if the function is called - // with the already computed x1 or x2. - const test = (x: number): number => { - if (x === x0) { - return y0 - x0 - } - valeur = evaluateWithValue(x, unit) - const y = valeur.nodeValue - i++ - return (y as number) - x + this.parsedSituation[node.explanation.ruleToSolve] = { + unit: unit, + nodeKind: 'unité', + explanation: { + nodeKind: 'constant', + nodeValue: n, + type: 'number', + } as ConstantNode, + } as UnitéNode + return this.evaluate(node.explanation.valeur) } - const defaultMin = -1_000_000 - const defaultMax = 100_000_000 + let nodeValue: number | null | undefined = null - nodeValue = uniroot(test, defaultMin, defaultMax, 0.5, 30, 2) - } + const x0 = 0 + let valeur = evaluateWithValue(x0) - this.cache = originalCache + const y0 = valeur.nodeValue as number + const unit = valeur.unit + const missingVariables = valeur.missingVariables + let i = 0 + if (y0 !== null) { + // The `uniroot` function parameter. It will be called with its `min` and + // `max` arguments, so we can use our cached nodes if the function is called + // with the already computed x1 or x2. + const test = (x: number): number => { + if (x === x0) { + return y0 - x0 + } + valeur = evaluateWithValue(x, unit) + const y = valeur.nodeValue + i++ + return (y as number) - x + } - if (nodeValue === undefined) { - nodeValue = null - this.cache._meta.inversionFail = true - } - if (nodeValue !== null) { - valeur = evaluateWithValue(nodeValue, unit) - } - delete this.parsedSituation[node.explanation.ruleToSolve] + const defaultMin = -1_000_000 + const defaultMax = 100_000_000 - return { - ...node, - unit, - nodeValue, - explanation: { - ...node.explanation, - valeur, - inversionNumberOfIterations, - }, - missingVariables, + nodeValue = uniroot(test, defaultMin, defaultMax, 0.5, 30, 2) + } + + this.cache = originalCache + + if (nodeValue === undefined) { + nodeValue = null + this.cache._meta.inversionFail = true + } + if (nodeValue !== null) { + valeur = evaluateWithValue(nodeValue, unit) + } + delete this.parsedSituation[node.explanation.ruleToSolve] + + return { + ...node, + unit, + nodeValue, + explanation: { + ...node.explanation, + valeur, + inversionNumberOfIterations, + }, + missingVariables, + } } -} export default function parseRésoudreRéférenceCirculaire(v, context: Context) { return { diff --git a/publicodes/core/source/units.ts b/publicodes/core/source/units.ts index 55e602370..1e486a277 100644 --- a/publicodes/core/source/units.ts +++ b/publicodes/core/source/units.ts @@ -101,13 +101,12 @@ const equals = (a: T, b: T) => { } } -export const removeOnce = ( - element: T, - eqFn: (a: T, b: T) => boolean = equals -) => (list: Array): Array => { - const index = list.findIndex((e) => eqFn(e, element)) - return list.filter((_, i) => i !== index) -} +export const removeOnce = + (element: T, eqFn: (a: T, b: T) => boolean = equals) => + (list: Array): Array => { + const index = list.findIndex((e) => eqFn(e, element)) + return list.filter((_, i) => i !== index) + } const simplify = ( unit: Unit, diff --git a/publicodes/site/entry.tsx b/publicodes/site/entry.tsx index 0fd9db88d..b14af37bd 100644 --- a/publicodes/site/entry.tsx +++ b/publicodes/site/entry.tsx @@ -8,8 +8,7 @@ import 'regenerator-runtime/runtime' import App from './components/App' Sentry.init({ - dsn: - 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', + dsn: 'https://92bbc21937b24136a2fe1b1d922b000f@o548798.ingest.sentry.io/5745615', integrations: [new Integrations.BrowserTracing()], // Set tracesSampleRate to 1.0 to capture 100% diff --git a/publicodes/ui-react/source/mecanisms/Replacement.tsx b/publicodes/ui-react/source/mecanisms/Replacement.tsx index dd0247410..5922f2410 100644 --- a/publicodes/ui-react/source/mecanisms/Replacement.tsx +++ b/publicodes/ui-react/source/mecanisms/Replacement.tsx @@ -2,8 +2,9 @@ import { VariationNode } from 'publicodes/source/mecanisms/variations' import Explanation from '../Explanation' export default function Replacement(node: VariationNode) { - const applicableReplacement = node.explanation.find((ex) => ex.satisfied) - ?.consequence + const applicableReplacement = node.explanation.find( + (ex) => ex.satisfied + )?.consequence const replacedNode = node.explanation.slice(-1)[0].consequence return } diff --git a/yarn.lock b/yarn.lock index e4521d928..136f1edb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3421,9 +3421,9 @@ integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== "@types/prop-types@*": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== "@types/ramda@^0.26.43": version "0.26.44" @@ -3449,9 +3449,9 @@ "@types/reactcss" "*" "@types/react-dom@^17.0.0": - version "17.0.9" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" - integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== + version "17.0.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.0.tgz#b3b691eb956c4b3401777ee67b900cb28415d95a" + integrity sha512-lUqY7OlkF/RbNtD5nIq7ot8NquXrdFrjSOR6+w9a9RFQevGi1oZO1dcJbXMeONAPKtZ2UrZOEJ5UOCVsxbLk/g== dependencies: "@types/react" "*" @@ -3535,16 +3535,7 @@ dependencies: "@types/react" "*" -"@types/react@*": - version "17.0.19" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.19.tgz#8f2a85e8180a43b57966b237d26a29481dacc991" - integrity sha512-sX1HisdB1/ZESixMTGnMxH9TDe8Sk709734fEQZzCV/4lSu9kJCPbo2PbTRoZM+53Pp0P10hYVyReUueGwUi4A== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^17.0.0": +"@types/react@*", "@types/react@^17.0.0": version "17.0.0" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.0.tgz#5af3eb7fad2807092f0046a1302b7823e27919b8" integrity sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw== @@ -3582,11 +3573,6 @@ dependencies: "@types/node" "*" -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - "@types/sinon-chai@^3.2.5": version "3.2.5" resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48" @@ -6494,9 +6480,9 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" - integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" + integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== csv-loader@^2.1.1: version "2.1.1" From 473b7c427a3ad23d9d23d161ba5e481eba7fb909 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 2 Sep 2021 18:16:50 +0200 Subject: [PATCH 276/319] =?UTF-8?q?Desactive=20les=20droits=20=C3=A0=20la?= =?UTF-8?q?=20retraite=20sur=20secu-independants.fr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IndépendantExplanation.tsx | 88 +++++++++++-------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 4327963e2..6d467cc46 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -58,44 +58,7 @@ export default function IndépendantExplanation() { />
    - -

    Retraite : droits acquis sur l'année 2021

    -
      -
    • - Retraite de base :{' '} - - - {' '} - trimestres acquis - - -
    • -
    • - Retraite complémentaire :{' '} - - - Ce simulateur ne gère pas les droits acquis de retraite - complémentaire pour les professions libérales - - - - - - {' '} - points acquis - - - -
    • -
    -
    - + @@ -191,3 +154,52 @@ function DistributionBranch({ /> ) } + +function DroitsRetraite() { + /** Le simulateur ne doit pas faire apparaître les droits à la retraite sur secu-independant.fr */ + if ( + document.referrer?.includes('secu-independants.fr') || + document.referrer?.includes('simulateur-rsi.urssaf.fr') + ) { + return null + } + return ( + +

    Retraite : droits acquis sur l'année 2021

    +
      +
    • + Retraite de base :{' '} + + + {' '} + trimestres acquis + + +
    • +
    • + Retraite complémentaire :{' '} + + + Ce simulateur ne gère pas les droits acquis de retraite + complémentaire pour les professions libérales + + + + + + {' '} + points acquis + + + +
    • +
    +
    + ) +} From 293eff4a1978d860847652cbbce738e9e80da222 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Mon, 6 Sep 2021 16:55:44 +0200 Subject: [PATCH 277/319] Update yarn.lock --- yarn.lock | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/yarn.lock b/yarn.lock index 136f1edb0..1cf5c1ef9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3455,6 +3455,13 @@ dependencies: "@types/react" "*" +"@types/react-dom@^17.0.9": + version "17.0.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" + integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== + dependencies: + "@types/react" "*" + "@types/react-helmet@^5.0.13": version "5.0.16" resolved "https://registry.yarnpkg.com/@types/react-helmet/-/react-helmet-5.0.16.tgz#dafac5f043665b880559285a27c71a69abd1f29e" From c6f6a558329a48d6de48bdfa461e3547e230d19b Mon Sep 17 00:00:00 2001 From: Alex S Date: Wed, 8 Sep 2021 16:35:29 +0200 Subject: [PATCH 278/319] =?UTF-8?q?=F0=9F=A4=96=20Remplace=20la=20CLI=20du?= =?UTF-8?q?=20build=20par=20un=20multiplexeur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Alexandre Valsamou-Stanislawski --- package.json | 3 +- yarn.lock | 495 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 440 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index 15809a7b7..2ccc27d04 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "serve": "^11.1.0", "sinon": "^9.2.2", "sinon-chai": "^3.0.0", + "stmux": "^1.8.1", "style-loader": "^0.23.1", "terser-webpack-plugin": "^3.0.2", "toml-loader": "^1.0.0", @@ -120,7 +121,7 @@ "test:type": "yarn workspaces run tsc", "test:regressions": "yarn workspace modele-social build && jest --silent", "clean": "yarn workspaces run clean && rimraf node_modules", - "start": "concurrently -k -n publicodes,publicodes-react,mon-entreprise \"yarn workspace publicodes build:watch\" \"yarn workspace publicodes-react build --watch\" \"yarn workspace mon-entreprise start\"", + "start": "stmux -e ERROR -t mon-entreprise-build -M -- [ [ 'yarn workspace publicodes build:watch' : 'yarn workspace publicodes-react build --watch' ] .. 'yarn workspace mon-entreprise start' ] ", "moso:up": "yarn workspace modele-social run up && yarn workspace mon-entreprise upgrade modele-social", "publicodes:up": "yarn workspace publicodes-react upgrade publicodes && yarn workspace mon-entreprise upgrade publicodes publicodes-react" }, diff --git a/yarn.lock b/yarn.lock index 1cf5c1ef9..c612fa625 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2375,6 +2375,13 @@ core-js "^2.6.5" regenerator-runtime "^0.13.4" +"@babel/runtime@7.12.5", "@babel/runtime@^7.11.2": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.6": version "7.11.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" @@ -2382,13 +2389,6 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.11.2": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/template@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" @@ -3411,9 +3411,9 @@ integrity sha512-sld7b/xmFum66AAKuz/rp/CUO8+98fMpyQ3SBfzzBNGMd/1iHBTAg9oyAvcYlAj46bpc74r91jSw2iFdnx29nw== "@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/prettier@^2.1.5": version "2.3.2" @@ -4219,12 +4219,21 @@ acorn-jsx@^5.2.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-node@^1.3.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== -acorn-walk@^7.1.1: +acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== @@ -4234,6 +4243,11 @@ acorn@^6.0.1, acorn@^6.0.2, acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + acorn@^7.1.1: version "7.4.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" @@ -4266,6 +4280,11 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +aggregation@1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/aggregation/-/aggregation-1.2.6.tgz#c8059158e775863035b8115945ca812174bb59c2" + integrity sha512-TdxNrY8hHSwcK2YNl2wbvC4ybki79cQUgPZWQyer3WVSUOGZp0MzuutWxx/T+WR+aPC/sZW34092NTc2r6mCoA== + airbnb-prop-types@^2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz#b96274cefa1abb14f623f804173ee97c13971dc2" @@ -4523,6 +4542,11 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + array-includes@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" @@ -4643,6 +4667,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +asty@1.8.14: + version "1.8.14" + resolved "https://registry.yarnpkg.com/asty/-/asty-1.8.14.tgz#dd5eb7e916b93ba3e85c135ffe56b8792b1b0689" + integrity sha512-mdXrb7dV/hhgiUXy4QT7/V7FEckB38KX2wOAGZjmU4ZKclQMKFul0W7uNzHLzRvtf7acCiilG4wjuvdtQ1kU3w== + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -4998,6 +5027,22 @@ bl@^4.0.1: inherits "^2.0.4" readable-stream "^3.4.0" +blessed-xterm@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/blessed-xterm/-/blessed-xterm-1.4.1.tgz#39765cd3d9ea371ec38d09ba978c25a2496a7273" + integrity sha512-izh6UOP2kT0zNc+jeak3lgB5YVroXFZjdkeCC8nNJoDFgft6C6spUOA7RIRLEYn99VLUE1RlJJ5KhgrAz351WA== + dependencies: + blessed "0.1.81" + clone "2.1.2" + jsdom "16.4.0" + node-pty "0.9.0" + xterm "2.8.1" + +blessed@0.1.81: + version "0.1.81" + resolved "https://registry.yarnpkg.com/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129" + integrity sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk= + blob-stream@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/blob-stream/-/blob-stream-0.1.3.tgz#98d668af6996e0f32ef666d06e215ccc7d77686c" @@ -5532,6 +5577,14 @@ chalk@2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -5847,16 +5900,16 @@ clone-stats@^1.0.0: resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= +clone@2.1.2, clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + clone@^1.0.0, clone@^1.0.1, clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clone@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - cloneable-readable@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" @@ -6080,9 +6133,9 @@ concat-stream@^1.5.0, concat-stream@^1.6.2, concat-stream@~1.6.0: typedarray "^0.0.6" concurrently@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.0.2.tgz#4ecdfc78a72a6f626a3a5d3c2a7a81962f3663e3" - integrity sha512-u+1Q0dJG5BidgUTpz9CU16yoHTt/oApFDQ3mbvHwSDgMjU7aGqy0q8ZQyaZyaNxdwRKTD872Ux3Twc6//sWA+Q== + version "6.2.1" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.2.1.tgz#d880fc1d77559084732fa514092a3d5109a0d5bf" + integrity sha512-emgwhH+ezkuYKSHZQ+AkgEpoUZZlbpPVYCVv7YZx0r+T7fny1H03r2nYRebpi2DudHR4n1Rgbo2YTxKOxVJ4+g== dependencies: chalk "^4.1.0" date-fns "^2.16.1" @@ -6138,7 +6191,7 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" -convert-source-map@^1.6.0: +convert-source-map@^1.5.1, convert-source-map@^1.6.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== @@ -6479,7 +6532,7 @@ cssstyle@^1.1.1: dependencies: cssom "0.3.x" -cssstyle@^2.3.0: +cssstyle@^2.2.0, cssstyle@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== @@ -6624,6 +6677,19 @@ d3-time@1: resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -6655,9 +6721,9 @@ date-fns@^1.27.2: integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== date-fns@^2.16.1: - version "2.21.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.21.1.tgz#679a4ccaa584c0706ea70b3fa92262ac3009d2b0" - integrity sha512-m1WR0xGiC6j6jNFAyW4Nvh4WxAi4JF4w9jRJwSI8nBmNcyZXPcP9VUQG+6gHQXAmqaGEKDKhOqAtENDC941UkA== + version "2.23.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9" + integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA== dayjs@^1.10.4: version "1.10.5" @@ -6740,7 +6806,7 @@ decimal.js-light@^2.4.1: resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.0.tgz#ca7faf504c799326df94b0ab920424fdfc125348" integrity sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg== -decimal.js@^10.2.1: +decimal.js@^10.2.0, decimal.js@^10.2.1: version "10.3.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== @@ -7067,6 +7133,13 @@ dotenv@=8.1.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.1.0.tgz#d811e178652bfb8a1e593c6dd704ec7e90d85ea2" integrity sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA== +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -7350,6 +7423,36 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -7362,6 +7465,33 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +es6-set@^0.1.5, es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-symbol@^3.1.1, es6-symbol@~3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + es6-templates@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" @@ -7400,7 +7530,7 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.11.0: +escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.14.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== @@ -7636,6 +7766,11 @@ estraverse@~1.5.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" integrity sha1-hno+jlip+EYYr7bC3bzZFrfLr3E= +estree-is-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/estree-is-function/-/estree-is-function-1.0.0.tgz#c0adc29806d7f18a74db7df0f3b2666702e37ad2" + integrity sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA== + estree-walker@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" @@ -7656,6 +7791,14 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + eventemitter2@^6.4.3: version "6.4.4" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.4.tgz#aa96e8275c4dbeb017a5d0e03780c65612a1202b" @@ -7843,6 +7986,13 @@ express@^4.16.2, express@^4.16.3: utils-merge "1.0.1" vary "~1.1.2" +ext@^1.1.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.5.0.tgz#e93b97ae0cb23f8370380f6107d2d2b7887687ad" + integrity sha512-+ONcYoWj/SoQwUofMr94aGu05Ou4FepKi7N7b+O8T4jVfyIsZQV1/xeS8jpaBzF0csAk0KLXoHCxU7cKYZjo1Q== + dependencies: + type "^2.5.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -8395,6 +8545,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-assigned-identifiers@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -8694,6 +8849,11 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + gulp-sort@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/gulp-sort/-/gulp-sort-2.0.0.tgz#c6762a2f1f0de0a3fc595a21599d3fac8dba1aca" @@ -8909,9 +9069,9 @@ hoopy@^0.1.4: integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== html-comment-regex@^1.1.0: version "1.1.2" @@ -9399,6 +9559,11 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -9556,6 +9721,11 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -9688,7 +9858,7 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-potential-custom-element-name@^1.0.1: +is-potential-custom-element-name@^1.0.0, is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== @@ -9803,6 +9973,13 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -10359,6 +10536,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@16.4.0: + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" + jsdom@^12.0.0: version "12.2.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-12.2.0.tgz#7cf3f5b5eafd47f8f09ca52315d367ff6e95de23" @@ -10813,7 +11022,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@~4.17.4: +lodash@4.17.20, lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@~4.17.4: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -10902,6 +11111,13 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= +magic-string@0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e" + integrity sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg== + dependencies: + sourcemap-codec "^1.4.1" + magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" @@ -11028,6 +11244,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-source-map@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" + integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= + dependencies: + source-map "^0.5.6" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -11527,6 +11750,11 @@ neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -11609,6 +11837,25 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= +node-notifier@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-9.0.0.tgz#46c5bbecbb796d4a803f646cea5bc91403f2ff38" + integrity sha512-SkwNwGnMMlSPrcoeH4CSo9XyWe72acAHEJGDdPdB+CyBVHsIYaTQ4U/1wk3URsyzC75xZLg2vzU2YaALlqDF1Q== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" + +node-pty@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.9.0.tgz#8f9bcc0d1c5b970a3184ffd533d862c7eb6590a6" + integrity sha512-MBnCQl83FTYOu7B4xWw10AW77AAh7ThCE1VXEv+JeWj8mSpGo+0bwgsV+b23ljBFwEM9OmsOv3kM27iUPPm84g== + dependencies: + nan "^2.14.0" + node-releases@^1.1.60: version "1.1.60" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" @@ -11743,6 +11990,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@^1.6.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + object-inspect@^1.7.0, object-inspect@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" @@ -12125,6 +12377,11 @@ parse5@5.1.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -12237,6 +12494,28 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pegjs-otf@1.2.18: + version "1.2.18" + resolved "https://registry.yarnpkg.com/pegjs-otf/-/pegjs-otf-1.2.18.tgz#2fcf7b805316a8244d922d53f153f541c1adf164" + integrity sha512-Rmy7OyTfJpXYV8RqlUgVKC7UZdaGeXtLH/pw5jtBAffWNFlYOZFIkzalAFLUeokUrbpbId8+KTMsxRYZ9+JPUg== + dependencies: + lodash "4.17.20" + pegjs "0.10.0" + static-module "3.0.4" + through "2.3.8" + +pegjs-util@1.4.21: + version "1.4.21" + resolved "https://registry.yarnpkg.com/pegjs-util/-/pegjs-util-1.4.21.tgz#de8d07cabcf037267ce57037f821a8b30af70e99" + integrity sha512-0z15BXCjxwgeD+pO5QImUgOFsJ86jFt6oDqatveLggeARSS5wmrt9SxCONkUvOeSsob2faVBC9H4wpl4zudg9A== + dependencies: + pegjs ">=0.10.0" + +pegjs@0.10.0, pegjs@>=0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" + integrity sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0= + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -13356,7 +13635,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -13693,7 +13972,7 @@ request-promise-core@1.1.4: dependencies: lodash "^4.17.19" -request-promise-native@^1.0.5: +request-promise-native@^1.0.5, request-promise-native@^1.0.8: version "1.0.9" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== @@ -13702,7 +13981,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.88.0: +request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -13817,14 +14096,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.10.0, resolve@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -13832,6 +14104,13 @@ resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + resolve@^1.3.2: version "1.18.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" @@ -14010,7 +14289,7 @@ saxes@^3.1.3: dependencies: xmlchars "^2.1.1" -saxes@^5.0.1: +saxes@^5.0.0, saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== @@ -14076,6 +14355,19 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" +scope-analyzer@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/scope-analyzer/-/scope-analyzer-2.1.1.tgz#5156c27de084d74bf75af9e9506aaf95c6e73dd6" + integrity sha512-azEAihtQ9mEyZGhfgTJy3IbOWEzeOrYbg7NcYEshPKnKd+LZmC3TNd5dmDxbLBsTG/JVWmCp+vDJ03vJjeXMHg== + dependencies: + array-from "^2.1.1" + dash-ast "^1.0.0" + es6-map "^0.1.5" + es6-set "^0.1.5" + es6-symbol "^3.1.1" + estree-is-function "^1.0.0" + get-assigned-identifiers "^1.1.0" + select@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" @@ -14218,6 +14510,11 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +shallow-copy@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -14247,6 +14544,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + side-channel@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" @@ -14414,7 +14716,7 @@ source-map@~0.1.30: dependencies: amdefine ">=0.0.4" -sourcemap-codec@^1.4.4: +sourcemap-codec@^1.4.1, sourcemap-codec@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== @@ -14451,9 +14753,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -14520,6 +14822,13 @@ state-toggle@^1.0.0: resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== +static-eval@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -14528,6 +14837,26 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +static-module@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-3.0.4.tgz#bfbd1d1c38dd1fbbf0bb4af0c1b3ae18a93a2b68" + integrity sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw== + dependencies: + acorn-node "^1.3.0" + concat-stream "~1.6.0" + convert-source-map "^1.5.1" + duplexer2 "~0.1.4" + escodegen "^1.11.1" + has "^1.0.1" + magic-string "0.25.1" + merge-source-map "1.0.4" + object-inspect "^1.6.0" + readable-stream "~2.3.3" + scope-analyzer "^2.0.1" + shallow-copy "~0.0.1" + static-eval "^2.0.5" + through2 "~2.0.3" + "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -14538,6 +14867,24 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +stmux@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/stmux/-/stmux-1.8.1.tgz#18fcab440296ec593d87af3394ceea15503515ed" + integrity sha512-3y9h3+AFMJxOFi7E/wt3H3A89w6G1wESCgPg69jrk5bfxttsMvnsjhxueJtlTAy9gv+XUtW8P7oDhxVnqtihbA== + dependencies: + "@babel/runtime" "7.12.5" + aggregation "1.2.6" + asty "1.8.14" + blessed "0.1.81" + blessed-xterm "1.4.1" + chalk "4.1.0" + node-notifier "9.0.0" + pegjs-otf "1.2.18" + pegjs-util "1.4.21" + strip-ansi "6.0.0" + which "2.0.2" + yargs "16.2.0" + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -14696,6 +15043,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -14717,13 +15071,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -15100,7 +15447,7 @@ through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0, through2@~2. readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6, through@~2.3.4, through@~2.3.6: +through@2.3.8, through@^2.3.6, through@~2.3.4, through@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -15253,6 +15600,15 @@ tough-cookie@^2.3.3, tough-cookie@^2.4.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -15380,6 +15736,16 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -15698,6 +16064,11 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" @@ -16133,7 +16504,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@2.0.2, which@^2.0.1: +which@2.0.2, which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -16426,6 +16797,11 @@ ws@^6.0.0, ws@^6.1.0: dependencies: async-limiter "~1.0.0" +ws@^7.2.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.4.tgz#56bfa20b167427e138a7795de68d134fe92e21f9" + integrity sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg== + ws@^7.4.5: version "7.5.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" @@ -16446,11 +16822,16 @@ xmlchars@^2.1.1, xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +xterm@2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-2.8.1.tgz#3f6b939bcb8d015a1f247d66257102cb16a0b2e1" + integrity sha512-AuqLOWpprmhSe4TcGE6Gh2uwkR0wUC95V0Q736OFUmG+84W+w+g6RzcgVhrbOTo/Fzcq9i0TRR5nYksRt2DSIQ== + y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" From 18cf0203dfc9cb703a4139a47ac66e04478790a6 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Fri, 2 Jul 2021 16:55:34 +0200 Subject: [PATCH 279/319] =?UTF-8?q?=F0=9F=92=9A=20React=20fix=20in=20Imp?= =?UTF-8?q?=C3=B4tSoci=C3=A9t=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx b/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx index 0bfe4580b..14731de9d 100644 --- a/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ImpôtSociété.tsx @@ -54,7 +54,7 @@ export default function ISSimulation() { function ExerciceDate() { const dispatch = useDispatch() return ( -

    -

    +
    ) } From c6236dcd02ceb67cda2e75cff17b9be45a4b14c4 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Tue, 6 Jul 2021 23:15:05 +0200 Subject: [PATCH 280/319] =?UTF-8?q?=F0=9F=8E=A8=20Improve=20StackedBarChar?= =?UTF-8?q?t=20component=20with=20percentage=20precision?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/components/StackedBarChart.test.js | 32 +++++-- .../source/components/StackedBarChart.tsx | 84 +++++++++++++------ 2 files changed, 85 insertions(+), 31 deletions(-) diff --git a/mon-entreprise/source/components/StackedBarChart.test.js b/mon-entreprise/source/components/StackedBarChart.test.js index 207dfc9bb..32a55ce42 100644 --- a/mon-entreprise/source/components/StackedBarChart.test.js +++ b/mon-entreprise/source/components/StackedBarChart.test.js @@ -2,11 +2,31 @@ import { expect } from 'chai' import { roundedPercentages } from './StackedBarChart' describe('roundedPercentages', () => { - it('rounds correctly', () => { - expect(roundedPercentages([500, 250, 250])).to.deep.equal([50, 25, 25]) - expect(roundedPercentages([501, 251, 248])).to.deep.equal([50, 25, 25]) - expect(roundedPercentages([506, 257, 237])).to.deep.equal([50, 26, 24]) - expect(roundedPercentages([509, 259, 232])).to.deep.equal([51, 26, 23]) - expect(roundedPercentages([503, 253, 244])).to.deep.equal([50, 25, 25]) + it('rounds percentages correctly', () => { + expect(roundedPercentages([500, 250, 250], 1)).to.deep.equal([50, 25, 25]) + expect(roundedPercentages([501, 251, 248], 1)).to.deep.equal([50, 25, 25]) + expect(roundedPercentages([506, 257, 237], 1)).to.deep.equal([50, 26, 24]) + expect(roundedPercentages([509, 259, 232], 1)).to.deep.equal([51, 26, 23]) + expect(roundedPercentages([503, 253, 244], 1)).to.deep.equal([50, 25, 25]) + }) + it('rounds permilles correctly', () => { + expect(roundedPercentages([5000, 2500, 2500], 0.1)).to.deep.equal([ + 50.0, 25.0, 25.0, + ]) + expect(roundedPercentages([5001, 2507, 2492], 0.1)).to.deep.equal([ + 50.0, 25.1, 24.9, + ]) + expect(roundedPercentages([5004, 2504, 2492], 0.1)).to.deep.equal([ + 50.0, 25.1, 24.9, + ]) + expect(roundedPercentages([5005, 2503, 2492], 0.1)).to.deep.equal([ + 50.1, 25.0, 24.9, + ]) + expect(roundedPercentages([5003, 2503, 2494], 0.1)).to.deep.equal([ + 50.0, 25.0, 25.0, + ]) + expect(roundedPercentages([5004, 2503, 2493], 0.1)).to.deep.equal([ + 50.1, 25.0, 24.9, + ]) }) }) diff --git a/mon-entreprise/source/components/StackedBarChart.tsx b/mon-entreprise/source/components/StackedBarChart.tsx index 3c5d0570f..701bf6fd3 100644 --- a/mon-entreprise/source/components/StackedBarChart.tsx +++ b/mon-entreprise/source/components/StackedBarChart.tsx @@ -3,6 +3,7 @@ import useDisplayOnIntersecting from 'Components/utils/useDisplayOnIntersecting' import { Names } from 'modele-social/dist/names' import { EvaluatedNode } from 'publicodes' import React, { useContext } from 'react' +import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { animated, useSpring } from 'react-spring' import { targetUnitSelector } from 'Selectors/simulationSelectors' @@ -55,47 +56,52 @@ const SmallCircle = styled.span` border-radius: 100%; ` +type Precision = 1 | 0.1 | 0.01 + function integerAndDecimalParts(value: number) { const integer = Math.floor(value) const decimal = value - integer return { integer, decimal } } -// This function calculates rounded percentages so that the sum of all -// returned values is always 100. For instance: [60, 30, 10]. -export function roundedPercentages(values: Array) { +/** + * Produces integers only. + */ +function simpleRoundedPer(values: Array, logScale: number) { + const scale = Math.pow(10, 2 - logScale) // 100, 1000, 10000 const sum = (a = 0, b: number) => a + b const total = values.reduce(sum, 0) - const percentages = values.map((value) => - integerAndDecimalParts((value / total) * 100) + // By default we are talking percentages, but this can be per-mille or more + const perscalages = values.map((value) => + integerAndDecimalParts((value / total) * scale) ) - const totalRoundedPercentage = percentages + const totalRoundedPerscalage = perscalages .map((v) => v.integer) .reduce(sum, 0) - const indexesToIncrement = percentages + const indexesToIncrement = perscalages .map((percentage, index) => ({ ...percentage, index })) .sort((a, b) => b.decimal - a.decimal) .map(({ index }) => index) - .splice(0, 100 - totalRoundedPercentage) + .splice(0, scale - totalRoundedPerscalage) - return percentages.map( + return perscalages.map( ({ integer }, index) => integer + (indexesToIncrement.includes(index) ? 1 : 0) ) } -export function StackedBarChart({ data }: InnerStackedBarChartProps) { - const [intersectionRef, displayChart] = useDisplayOnIntersecting({ - threshold: 0.5, - }) - - const styles = useSpring({ opacity: displayChart ? 1 : 0 }) - return !useContext(DisableAnimationContext) ? ( - - - - ) : ( - +/** + * Calculates rounded percentages so that the sum of all returned values is + * always 100. For instance: [60, 30, 10] or [60.1, 30, 9.9] depending on the + * precision. + */ +export function roundedPercentages( + values: Array, + precision: Precision +) { + const logScale = Math.log10(precision) + return simpleRoundedPer(values, logScale).map( + (int) => int / Math.pow(10, -logScale) ) } @@ -106,11 +112,32 @@ type InnerStackedBarChartProps = { legend: React.ReactNode key: string }> + precision: Precision } -function InnerStackedBarChart({ data }: InnerStackedBarChartProps) { +export function StackedBarChart({ + data, + precision, +}: InnerStackedBarChartProps) { + const [intersectionRef, displayChart] = useDisplayOnIntersecting({ + threshold: 0.5, + }) + + const styles = useSpring({ opacity: displayChart ? 1 : 0 }) + return !useContext(DisableAnimationContext) ? ( + + + + ) : ( + + ) +} + +function InnerStackedBarChart({ data, precision }: InnerStackedBarChartProps) { + const { i18n } = useTranslation() const percentages = roundedPercentages( - data.map((d) => (typeof d.value === 'number' && d.value) || 0) + data.map((d) => (typeof d.value === 'number' && d.value) || 0), + precision ) const dataWithPercentage = data.map((data, index) => ({ ...data, @@ -138,7 +165,9 @@ function InnerStackedBarChart({ data }: InnerStackedBarChartProps) { {legend} - {percentage} % + + {Intl.NumberFormat(i18n.language).format(percentage)} % + ))} @@ -148,13 +177,18 @@ function InnerStackedBarChart({ data }: InnerStackedBarChartProps) { type StackedRulesChartProps = { data: Array<{ color?: string; dottedName: Names; title?: string }> + precision: Precision } -export default function StackedRulesChart({ data }: StackedRulesChartProps) { +export default function StackedRulesChart({ + data, + precision = 1, +}: StackedRulesChartProps) { const engine = useEngine() const targetUnit = useSelector(targetUnitSelector) return ( ({ key: dottedName, value: engine.evaluate({ valeur: dottedName, unité: targetUnit }) From b412dbe45fb682dc52254a2293ee34b81c0834e1 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Wed, 30 Jun 2021 10:20:42 +0200 Subject: [PATCH 281/319] =?UTF-8?q?=F0=9F=94=A8=20Cr=C3=A9e=20simulateur?= =?UTF-8?q?=20**dividendes**=20(taux=20effectif,=20hors=20r=C3=A9gime=20in?= =?UTF-8?q?d=C3=A9pendant)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/bénéficiaire.yaml | 76 ++++++++ modele-social/règles/dirigeant.yaml | 1 + .../règles/entreprise-établissement.yaml | 3 + modele-social/règles/impôt.yaml | 73 ++++++-- modele-social/règles/salarié.yaml | 2 +- .../mon-entreprise/simulateur-dividendes.js | 16 ++ .../source/components/SimulateurWarning.tsx | 8 - .../source/components/StackedBarChart.tsx | 2 +- mon-entreprise/source/locales/rules-en.yaml | 142 +++++++++++++- mon-entreprise/source/locales/ui-en.yaml | 33 ++++ mon-entreprise/source/locales/ui-fr.yaml | 35 ++++ .../source/pages/Simulateurs/Dividendes.tsx | 177 ++++++++++++++++++ .../source/pages/Simulateurs/Home.tsx | 1 + .../configs/auto-entrepreneur.yaml | 2 +- .../Simulateurs/configs/dirigeant-sasu.yaml | 2 +- .../pages/Simulateurs/configs/dividendes.yaml | 18 ++ .../Simulateurs/configs/indépendant.yaml | 2 +- .../configs/profession-libérale.yaml | 4 +- .../source/pages/Simulateurs/metadata.tsx | 76 +++++++- mon-entreprise/source/sitePaths.ts | 2 + mon-entreprise/test/cycles.test.js | 8 +- .../__snapshots__/simulations.jest.ts.snap | 12 ++ .../regressions/simulations-dividendes.yaml | 23 +++ .../test/regressions/simulations.jest.ts | 19 +- 24 files changed, 702 insertions(+), 35 deletions(-) create mode 100644 modele-social/règles/bénéficiaire.yaml create mode 100644 mon-entreprise/cypress/integration/mon-entreprise/simulateur-dividendes.js create mode 100644 mon-entreprise/source/pages/Simulateurs/Dividendes.tsx create mode 100644 mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml create mode 100644 mon-entreprise/test/regressions/simulations-dividendes.yaml diff --git a/modele-social/règles/bénéficiaire.yaml b/modele-social/règles/bénéficiaire.yaml new file mode 100644 index 000000000..884d9033b --- /dev/null +++ b/modele-social/règles/bénéficiaire.yaml @@ -0,0 +1,76 @@ +bénéficiaire: + valeur: oui + description: | + Un bénéficiaire est un actionnaire dans une SAS ou un associé dans une SARL/EURL. + + Attention: nous ne prenons en compte ici que le cas de figure de l'associé unique (SASU et EURL). + +bénéficiaire . dividendes: + # Désactivé par défaut: + # [XXX] Ou sinon ne faudrait-il pas laisser soin aux simulateurs de faire liste-noire? + valeur: non + applicable si: entreprise . imposition = 'IS' + +bénéficiaire . dividendes . bruts: + unité: €/an + par défaut: 0 €/an + inversion numérique: + avec: + - nets d'impôt + titre: Dividendes bruts revenant au bénéficiaire + +bénéficiaire . dividendes . nets: + somme: + - bruts + - (- cotisations et contributions) + titre: Dividendes nets + +bénéficiaire . dividendes . nets d'impôt: + valeur: bruts - dividendes . cotisations et contributions - impôt . dividendes + titre: Dividendes nets de cotisations et d'impôts + +bénéficiaire . dividendes . cotisations et contributions: + produit: + assiette: bruts + composantes: + - attributs: + nom: CSG non déductible + taux: + variations: + - si: impôt . méthode de calcul . PFU + alors: 9.2% + - sinon: 2.4% + - attributs: + nom: CSG déductible + taux: + variations: + - si: impôt . méthode de calcul . PFU + alors: 0% + - sinon: 6.8% + - attributs: + nom: CRDS + taux: 0.5% + - attributs: + nom: prélèvement de solidarité + taux: 7.5% + titre: Cotisations et contributions sur dividendes + références: + Fiche impots.gouv.fr: https://www.impots.gouv.fr/portail/particulier/les-revenus-mobiliers + Fiche service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F2329 + Article L 136-6 du code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/id/LEGISCTA000006173130/ + Article L 136-7 du code de la sécurité sociale: https://www.legifrance.gouv.fr/codes/id/LEGISCTA000006173129/ + +bénéficiaire . dividendes . imposables: + somme: + - bruts + - (- cotisations et contributions . CSG déductible) + abattement: 40% + titre: Net imposable des dividendes auxquels s'applique le barème de l'impôt sur le revenu + description: | + Un abattement de 40% s'applique dans le cas où + + - la société distributrice des dividendes relève de l'IS + - la société distributrice est française ou a son siège en UE ou dans un état ayant conclu des accords en ce sens avec la France + - les dividendes sont décidés en assemblée générale. + références: + Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32963 diff --git a/modele-social/règles/dirigeant.yaml b/modele-social/règles/dirigeant.yaml index 9477e1aeb..7a4dc6437 100644 --- a/modele-social/règles/dirigeant.yaml +++ b/modele-social/règles/dirigeant.yaml @@ -1168,6 +1168,7 @@ dirigeant . indépendant . cotisations et contributions . CSG et CRDS: fiche Urssaf: https://www.urssaf.fr/portail/home/indépendant/mes-cotisations/quelles-cotisations/les-contributions-csg-crds/taux-de-la-csg-crds.html IJSS (amelie.fr): https://www.ameli.fr/assure/remboursements/indemnites-journalieres/arret-maladie IJSS (service-public.fr): https://www.service-public.fr/particuliers/vosdroits/F2971 + Article 154 quiquies du Code Général des Impôts: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000038836652/ dirigeant . indépendant . revenus étrangers: description: | diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index f34d10e1b..d1d23c5fc 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -539,6 +539,9 @@ entreprise . charges . dirigeant: valeur: dirigeant . indépendant . cotisations et contributions abattement: dirigeant . indépendant . cotisations et contributions . non déductibles +# on ne prend en compte pour l'instant que le cas entreprise unipersonnelle +entreprise . dividendes: bénéficiaire . dividendes . bruts + entreprise . ACRE: description: >- L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une diff --git a/modele-social/règles/impôt.yaml b/modele-social/règles/impôt.yaml index bc41dc165..111d13f1f 100644 --- a/modele-social/règles/impôt.yaml +++ b/modele-social/règles/impôt.yaml @@ -1,14 +1,19 @@ impôt: + valeur: oui icônes: 🏛️ description: Cet ensemble de formules est un modèle simplifié de l'impôt sur le revenu. titre: impôt sur le revenu + +impôt . montant: somme: - produit: assiette: revenu imposable taux: taux d'imposition - dirigeant . auto-entrepreneur . impôt . versement libératoire . montant + - impôt . dividendes . PFU arrondi: oui unité: €/an + titre: Montant de l'impôt sur le revenu impôt . taux d'imposition: formule: @@ -42,6 +47,7 @@ impôt . méthode de calcul: - taux neutre - taux personnalisé - barème standard + - PFU références: différence taux neutre / personnalisé: https://www.impots.gouv.fr/portail/particulier/questions/quelles-sont-les-differences-entre-les-taux-de-prelevement-la-source-proposes calcul du taux d'imposition: https://www.economie.gouv.fr/files/files/ESPACE-EVENEMENTIEL/PAS/Fiche_de_calcul_taux_simplifiee.pdf @@ -61,6 +67,11 @@ impôt . méthode de calcul . barème standard: description: Le calcul "officiel" de l'impôt, celui sur lequel l'administration fiscal se base pour calculer votre taux d'imposition. formule: impôt . méthode de calcul = 'barème standard' +impôt . méthode de calcul . PFU: + titre: avec prélèvement forfaitaire unique + description: Calcul de l'impôt des revenus de capitaux mobiliers avec le prélèvement forfaitaire unique (ou "flat tax") + formule: impôt . méthode de calcul = 'PFU' + impôt . méthode de calcul . prélèvement à la source: formule: une de ces conditions: @@ -70,12 +81,14 @@ impôt . méthode de calcul . prélèvement à la source: impôt . revenu imposable: description: | C'est le revenu à prendre en compte pour calculer l'impôt avec un taux moyen d'imposition (neutre ou personnalisé). - variations: - - si: dirigeant - alors: dirigeant . rémunération . imposable - - sinon: - valeur: contrat salarié . rémunération . net imposable - abattement: abattement contrat court + somme: + - variations: + - si: dirigeant + alors: dirigeant . rémunération . imposable + - sinon: + valeur: contrat salarié . rémunération . net imposable + abattement: abattement contrat court + - bénéficiaire . dividendes . imposables impôt . revenu imposable . abattement contrat court: description: Lorsque la durée d'un contrat de travail est inférieure à 2 mois, il est possible d'appliquer un abattement pour diminuer le montant du prélèvement à la source. @@ -352,6 +365,7 @@ impôt . foyer fiscal . revenu imposable: - dirigeant . rémunération . imposable - entreprise . imposition . IR valeur: dirigeant . rémunération . imposable + - bénéficiaire . dividendes . imposables - autres revenus imposables impôt . foyer fiscal . revenu imposable . revenu d'activité abattu: @@ -398,11 +412,14 @@ impôt . foyer fiscal . impôt à payer: - impôt sur le revenu - CEHR +# [TODO] Il semble y avoir un soucis: selon la doc impot.gouv, le "revenu brut" (sur lequel est basé l'impôt brut ci-dessous sans doute?) ne doit pas contenir les revenus de capitaux mobiliers. Donc les dividendes imposables au barème ne devraient dans ce cas pas se voir appliquer de décote pour les bas revenus. Il faudrait sans doute revoir l'ensemble des règles de calcul autour du barème pour bien séparer celles qui ne s'appliquent qu'aux revenus brut. impôt . foyer fiscal . impôt sur le revenu: unité: €/an formule: - valeur: impôt brut - abattement: décote + somme: + - valeur: impôt brut + abattement: décote + - impôt . dividendes . PFU exemples: - nom: Salaire d'un cadre situation: @@ -451,7 +468,7 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut par part: Voici le fameux barème de l'impôt sur le revenu. C'est un barème marginal à 5 tranches. Une contribution sur les hauts revenus ajoute deux tranches supplémentaires. - Attention : pour un revenu de 100 000€ annuels, le contribuable ne paiera 41 000€ d'impôt (le taux de la 4ème tranche est 41%) ! Ces 41% sont appliqués uniquement à la part de ses revenus supérieure à 72 617€. + Attention : pour un revenu de 100 000€ annuels, le contribuable ne paiera pas 41 000€ d'impôt (le taux de la 4ème tranche est 41%) ! Ces 41% sont appliqués uniquement à la part de ses revenus supérieure à 72 617€. formule: barème: assiette: quotient familial @@ -485,10 +502,9 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut: - (- quotient familial . plafond avantage) impôt . foyer fiscal . impôt sur le revenu . impôt brut . sans plafonnement: - formule: - produit: - assiette: impôt brut par part - facteur: nombre de parts + produit: + assiette: impôt brut par part + facteur: nombre de parts impôt . foyer fiscal . CEHR: unité: €/an @@ -524,3 +540,34 @@ impôt . domiciliation étranger non implémentée: niveau: avertissement description: | La retenue à la source pour les non-résident n'est pas encore implémentée. Pour en savoir plus, se référer à la [documentation fiscale](https://www.impots.gouv.fr/portail/international-particulier/je-suis-non-resident-dois-je-declarer-des-revenus-et-payer-des-impots-en) + +# [XXX] [taux effectif] En fait le calcul n'est pas top, ça sous-estime l'impact des dividendes sur l'impôt dans le cas barème car ça utilise le taux effectif +# [XXX] [taux effectif] Si on est ok avec la règle, à virer. Simplement utiliser `impôt` d'autant plus que pr l'instant on ne peut pas avoir de concept du genre "partie de l'impôt", on ne peut avoir qu'un revenu principal soumis à la simulation (le reste étant dans foyer fiscal) +impôt . dividendes: + applicable si: bénéficiaire . dividendes . bruts > 0 + variations: + - si: méthode de calcul . PFU + alors: PFU + - sinon: impôt . montant + titre: Impôt sur dividendes + +impôt . dividendes . PFU: + applicable si: impôt . méthode de calcul . PFU + produit: + assiette: bénéficiaire . dividendes . bruts + taux: 12.8% + titre: Montant de l'impôt sur dividendes au titre du Prélèvement Forfaitaire Unique (ou "flat tax") + description: | + Ce montant est à verser sous forme d'acompte au moment du versement des dividendes. + + L'acompte n'est pas obligatoire au cas où le revenu fiscal n-2 est inférieur à + + - 50 000 € pour une personne seule, + - 75 000 € pour un couple soumis à l'imposition commune (mariés ou pacsés). + + Dans ce cas, le bénéficiaire peut faire la demande de dispense au plus tard le 30 novembre + de l'année précédant celle du paiement + références: + Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32963 + Article 200 A du Code Général des Impôts: https://www.legifrance.gouv.fr/codes/id/LEGISCTA000006179579/ + Article 117 quater du Code Général des Impôts: https://www.legifrance.gouv.fr/codes/id/LEGIARTI000036428175/#LEGIARTI000036428175 diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index 7a8046b14..0b4ce633f 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -1902,7 +1902,7 @@ contrat salarié . rémunération . net après impôt: références: Explication de l'impôt à la source: https://www.economie.gouv.fr/prelevement-a-la-source - formule: net - impôt + formule: net - impôt . montant contrat salarié . prix du travail: titre: Coût total diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateur-dividendes.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateur-dividendes.js new file mode 100644 index 000000000..ddb1fe971 --- /dev/null +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateur-dividendes.js @@ -0,0 +1,16 @@ +const fr = Cypress.env('language') === 'fr' +const inputSelector = 'input.currencyInput__input:not([name$="charges"])' +const totalSelector = 'section:nth(2)' + +describe('Simulateur auto-entrepreneur', () => { + if (!fr) { + return + } + before(() => cy.visit('/simulateurs/dividendes')) + + it('should show by default the PFU calculation at 12.8 / 17.2', () => { + cy.get(inputSelector).first().type('{selectall}5000') + cy.get(totalSelector).contains(/[cC]otisations\s+17,2\s*%/) + cy.get(totalSelector).contains(/[Ii]mpôt\s+12,8\s*%/) + }) +}) diff --git a/mon-entreprise/source/components/SimulateurWarning.tsx b/mon-entreprise/source/components/SimulateurWarning.tsx index 35dcefbeb..20cb11495 100644 --- a/mon-entreprise/source/components/SimulateurWarning.tsx +++ b/mon-entreprise/source/components/SimulateurWarning.tsx @@ -59,14 +59,6 @@ export default function SimulateurWarning({ )} - {simulateur === 'sasu' && ( -
  • - - L'impôt sur les sociétés et la gestion des dividendes ne sont pas - encore implémentés. - -
  • - )} {simulateur === 'artiste-auteur' && ( <>
  • diff --git a/mon-entreprise/source/components/StackedBarChart.tsx b/mon-entreprise/source/components/StackedBarChart.tsx index 701bf6fd3..22a51c110 100644 --- a/mon-entreprise/source/components/StackedBarChart.tsx +++ b/mon-entreprise/source/components/StackedBarChart.tsx @@ -177,7 +177,7 @@ function InnerStackedBarChart({ data, precision }: InnerStackedBarChartProps) { type StackedRulesChartProps = { data: Array<{ color?: string; dottedName: Names; title?: string }> - precision: Precision + precision?: Precision } export default function StackedRulesChart({ diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 8a8a6fbd2..4a4592c78 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -1515,6 +1515,83 @@ artiste-auteur . revenus . traitements et salaires: résumé.fr: Le montant brut hors TVA de vos droits d'auteur (recettes précomptées) titre.en: Income in wages and salaries titre.fr: Revenu en traitements et salaires +bénéficiaire: + description.en: > + [automatic] A beneficiary is a shareholder in a SAS or a partner in a + SARL/EURL. + + + Attention: we only consider here the case of the sole shareholder (SASU and EURL). + description.fr: > + Un bénéficiaire est un actionnaire dans une SAS ou un associé dans une + SARL/EURL. + + + Attention: nous ne prenons en compte ici que le cas de figure de l'associé unique (SASU et EURL). + titre.en: '[automatic] recipient' + titre.fr: bénéficiaire +bénéficiaire . compte courant d'associé: + description.en: > + [automatic] This value is necessary to calculate the maximum amount taxable + under the PFU for a beneficiary under the self-employed workers' scheme. + + The amount taken into account is the average annual balance of the current account. It is determined by the sum of the average monthly balances of the account, divided by the number of months included in the financial year. + + The average monthly balance is equal to the sum of the daily balances, divided by the number of days in the month. The average monthly balance therefore differs from the monthly balance shown in the company's accounts. + + If the account is opened or closed during the fiscal year, the number of months in the fiscal year will be reduced to the number of months the account is in operation. An account is considered to be "operating" even if it is not moved during the fiscal year. The date on which the sums paid into the current account must be assessed is the last day of the financial year preceding the payment of interest. + description.fr: > + Cette valeur est nécessaire à calculer le montant maximal imposable au PFU + pour un bénéficiaire au régime des travailleurs indépendants. + + Le montant pris en compte est le solde moyen annuel du compte courant. Il est déterminé par la somme des soldes moyens mensuels du compte, divisée par le nombre de mois compris dans l’exercice. + + Le solde moyen mensuel est égal à l’addition des soldes journaliers, divisée par le nombre de jours dans le mois. Le solde moyen mensuel diffère donc du solde mensuel figurant dans les comptes de la société. + + En cas d’ouverture ou de clôture du compte en cours d’exercice, le nombre de mois au cours de l’exercice sera réduit au nombre de mois de fonctionnement du compte. Un compte est considéré comme « fonctionnant », même s’il n’est pas mouvementé au cours de l’exercice. La date à laquelle les sommes versées en compte courant doivent être appréciées est le dernier jour de l’exercice précédant le versement des intérêts. + question.en: '[automatic] What are the amounts paid in current account by the partner?' + question.fr: Quelles sont les sommes versées en compte courant par l'associé ? + titre.en: "[automatic] Amounts paid into a partner's current account" + titre.fr: Sommes versées en compte courant d'associé +bénéficiaire . dividendes: + titre.en: '[automatic] dividends' + titre.fr: dividendes +bénéficiaire . dividendes . bruts: + titre.en: "[automatic] Beneficiary's share of dividends" + titre.fr: Part des dividendes revenant au bénéficiaire +bénéficiaire . dividendes . cotisations et contributions: + titre.en: '[automatic] Contributions on dividends' + titre.fr: Cotisations et contributions sur dividendes +bénéficiaire . dividendes . imposables: + description.en: > + [automatic] A deduction of 40% applies in the case of + + + - the company distributing the dividends is subject to corporation tax + + - the company distributing the dividends is French or has its registered office in the EU or in a country that has concluded agreements in this regard with France + + - the dividends are decided in a general meeting. + description.fr: > + Un abattement de 40% s'applique dans le cas où + + + - la société distributrice des dividendes relève de l'IS + + - la société distributrice est française ou a son siège en UE ou dans un état ayant conclu des accords en ce sens avec la France + + - les dividendes sont décidés en assemblée générale. + titre.en: '[automatic] Net taxable amount of dividends to which the income tax + scale applies' + titre.fr: + Net imposable des dividendes auxquels s'applique le barème de l'impôt + sur le revenu +bénéficiaire . dividendes . nets: + titre.en: '[automatic] Net dividends' + titre.fr: Dividendes nets +bénéficiaire . dividendes . nets d'impôt: + titre.en: '[automatic] Dividends net of contributions and taxes' + titre.fr: Dividendes nets de cotisations et d'impôts chômage partiel: titre.en: '[automatic] short-time working' titre.fr: chômage partiel @@ -7516,6 +7593,15 @@ entreprise . association non lucrative: question.fr: S'agit-il d'une association à but non lucratif ? titre.en: non-profit organisation titre.fr: association non lucrative +entreprise . capital social: + description.en: | + [automatic] This value must include the value of the share premiums. + description.fr: | + Cette valeur doit inclure la valeur des primes d'émission. + question.en: '[automatic] What is the share capital of the company?' + question.fr: Quele est le capital social de la société ? + titre.en: '[automatic] Share capital' + titre.fr: Capital social entreprise . charges: description.en: > [automatic] @@ -7887,6 +7973,9 @@ entreprise . date de création . contrôle date passée: pas vous être trompé dans la saisie ? titre.en: '[automatic] past date check' titre.fr: contrôle date passée +entreprise . dividendes: + titre.en: '[automatic] dividends' + titre.fr: dividendes entreprise . durée d'activité: titre.en: length of service titre.fr: durée d'activité @@ -8184,6 +8273,41 @@ impôt: description.fr: Cet ensemble de formules est un modèle simplifié de l'impôt sur le revenu. titre.en: income tax titre.fr: impôt sur le revenu +impôt . dividendes: + titre.en: '[automatic] Tax on dividends' + titre.fr: Impôt sur dividendes +impôt . dividendes . PFU: + description.en: > + [automatic] This amount is to be paid in the form of a deposit at the time + of the dividend payment. + + + The advance payment is not compulsory if the tax income n-2 is less than + + - 50,000 € for a single person, + - 75,000 € for a couple subject to joint taxation (married or civil union). + + In this case, the beneficiary may apply for exemption no later than 30 November + + of the year preceding the year of payment + description.fr: > + Ce montant est à verser sous forme d'acompte au moment du versement des + dividendes. + + + L'acompte n'est pas obligatoire au cas où le revenu fiscal n-2 est inférieur à + + - 50 000 € pour une personne seule, + - 75 000 € pour un couple soumis à l'imposition commune (mariés ou pacsés). + + Dans ce cas, le bénéficiaire peut faire la demande de dispense au plus tard le 30 novembre + + de l'année précédant celle du paiement + titre.en: '[automatic] Amount of tax on dividends under the Prélèvement + Forfaitaire Unique (or "flat tax")' + titre.fr: + Montant de l'impôt sur dividendes au titre du Prélèvement Forfaitaire + Unique (ou "flat tax") impôt . domiciliation étranger non implémentée: description.en: > [automatic] Non-resident withholding tax is not yet implemented. For more @@ -8225,13 +8349,13 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut . sans plafonnement: titre.fr: sans plafonnement impôt . foyer fiscal . impôt sur le revenu . impôt brut par part: description.en: > - [automatic] This is the famous income tax schedule. It's a five-bracket - marginal scale. + [automatic] Here is the famous income tax scale. It is a marginal scale with + 5 brackets. A contribution on high incomes adds two more brackets. - Attention: for an annual income of 100 000€, the taxpayer will only pay 41 000€ tax (the rate of the 4th bracket is 41%)! This 41% is only applied to the part of his income above 72 617€. + Attention: for an income of 100 000€ per year, the taxpayer will not pay 41 000€ of tax (the rate of the 4th bracket is 41%)! This 41% is only applied to the part of his income above 72 617€. description.fr: > Voici le fameux barème de l'impôt sur le revenu. C'est un barème marginal à 5 tranches. @@ -8239,7 +8363,7 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut par part: Une contribution sur les hauts revenus ajoute deux tranches supplémentaires. - Attention : pour un revenu de 100 000€ annuels, le contribuable ne paiera 41 000€ d'impôt (le taux de la 4ème tranche est 41%) ! Ces 41% sont appliqués uniquement à la part de ses revenus supérieure à 72 617€. + Attention : pour un revenu de 100 000€ annuels, le contribuable ne paiera pas 41 000€ d'impôt (le taux de la 4ème tranche est 41%) ! Ces 41% sont appliqués uniquement à la part de ses revenus supérieure à 72 617€. titre.en: '[automatic] gross tax per unit' titre.fr: impôt brut par part impôt . foyer fiscal . impôt sur le revenu . quotient familial: @@ -8331,6 +8455,9 @@ impôt . foyer fiscal . situation de famille . veuf: impôt . foyer fiscal . taux effectif: titre.en: '[automatic] yield rate' titre.fr: taux effectif +impôt . montant: + titre.en: '[automatic] Amount of income tax' + titre.fr: Montant de l'impôt sur le revenu impôt . méthode de calcul: description.en: > We have implemented three ways to calculate income tax: @@ -8357,6 +8484,13 @@ impôt . méthode de calcul: question.fr: Comment souhaitez-vous calculer l'impôt sur le revenu ? titre.en: calculation method titre.fr: méthode de calcul +impôt . méthode de calcul . PFU: + description.en: '[automatic] Calculation of the tax on income from movable + assets with the single flat rate tax (or "flat tax")' + description.fr: Calcul de l'impôt des revenus de capitaux mobiliers avec le + prélèvement forfaitaire unique (ou "flat tax") + titre.en: '[automatic] with one-time deduction' + titre.fr: avec prélèvement forfaitaire unique impôt . méthode de calcul . barème standard: description.en: '[automatic] The "official" tax calculation, the one the tax authorities use to calculate your tax rate.' diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index c0311a0b8..b19824c4b 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -83,6 +83,7 @@ Gérant minoritaire: Managing director Gérant minoritaire ou égalitaire: Minority or equal manager Habituellement: Usually Imprimer: Print +Impôt au barème: Tax on the scale Impôts: Taxes "Indemnité chômage partiel prise en charge par l'état :": "State-paid short-time working allowance :" Indépendant: Indépendant @@ -111,6 +112,7 @@ Non: No Nous n'avons rien trouvé: We didn't find any matching registered company. Oui: Yes Outils pour les développeurs: Tools for developers +PFU (<1>"flat tax"): Flat tax Pages associées: Related pages Par statut: By status Part du salaire net maintenue: Share of net salary maintained @@ -455,6 +457,13 @@ créer: titre: Create a company warningPL: "Note: the case of regulated liberal professions is not covered" d'aides: of aid +dividendes: + warning: <0>This simulation is only given as an indication. It only concerns + French companies subject to corporation tax (IS), and does not concern + managers affiliated to the self-employed workers' regime.<1>Please also + note that this simulator makes an approximate calculation of the share of + income tax resulting from dividends, based on the effective income tax rate. + domiciliation inconnue: unknown address domiciliée à: domiciled in déductible: deductible @@ -1250,6 +1259,30 @@ pages: this, simply enter the announced compensation in the total loaded box. The simulation can then be refined by answering the various questions." + dividendes: + meta: + description: Calculate the amount of tax and contributions on dividends received. + title: Dividends + seo: <0>Dividends and distributions<1>At the end of a company's financial + year, the result of the previous year can be kept in reserve (for future + investments) or paid out as dividends. From the point of view of the + beneficiaries, this is income from movable capital, subject to specific + contributions and taxation.<2>This simulator only takes into account + the case of the natural person beneficiary and the dividends decided by + the company.<3>How are the levies on dividends + calculated?<4>Dividends may be subject to a single flat-rate + withholding tax of 30% including tax and social security contributions + (also known as<1> flat tax). Optionally, the tax scale can be + chosen. This simulator can be used to compare the two systems.<5>An + advance payment of the amount of tax (12.8%) is deducted at the time of + payment of the dividends, unless the beneficiary meets <2>certain + criteria.<6>Particular case of the manager under the + self-employed worker regime<7> Under the self-employed worker's + regime, the portion of dividends exceeding 10% of the share capital will + be subject to contributions and levies in the same way as the manager's + income.<8>This case is not yet taken into account by this + simulator. + title: Dividend Payment Simulator ei: meta: description: Calculation of income from turnover, after deduction of diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index b0995dd0d..3043a92c4 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -31,6 +31,7 @@ Gestion des données personnelles: Gestion des données personnelles Gérant majoritaire: Gérant majoritaire Gérant minoritaire: Gérant minoritaire Gérant minoritaire ou égalitaire: Gérant minoritaire ou égalitaire +Impôt au barème: Impôt au barème Indépendant: Indépendant Indépendants et dirigeants: Indépendants et dirigeants International: International @@ -45,6 +46,7 @@ Montant de l'impôt sur les sociétés: Montant de l'impôt sur les sociétés Non: Non Oui: Oui Outils pour les développeurs: Outils pour les développeurs +PFU (<1>"flat tax"): PFU (<1>"flat tax") Part employeur: Part employeur Part salarié: Part salarié Pas en auto-entrepreneur: Pas en auto-entrepreneur @@ -253,6 +255,13 @@ créer: titre: Créer une entreprise warningPL: Le cas des professions libérales réglementées n'est pas encore traité d'aides: d'aides +dividendes: + warning: <0>Cette simulation est uniquement donnée à titre indicatif. Elle ne + concerne que les sociétés françaises à l'impôt sur les sociétés (IS), et ne + concerne pas les dirigeants affiliés au régime des travailleurs + indépendants.<1>Veuillez noter également que ce simulateur fait un + calcul approximatif de la part de l'impôt sur le revenu issu des dividendes, + basé sur le taux effectif de l'impôt sur le revenu. domiciliation inconnue: domiciliation inconnue domiciliée à: domiciliée à embauche: @@ -894,6 +903,32 @@ pages: shortname: Comparaison des statuts title: "Indépendant, assimilé salarié ou auto-entrepreneur : quel régime choisir ?" + dividendes: + meta: + description: Calculez le montant de l'impôt et des cotisations sur les + dividendes perçus. + title: Dividendes + seo: <0>Les dividendes et distributions<1>A la fin de l'exercice d'une + société, le résultat de l'exercice précédent peut être conservé en + réserve (pour de futurs investissements) ou bien être versé en + dividendes. Du point de vue des bénéficiaires, ce sont des revenus de + capitaux mobiliers, soumis à des cotisations et une imposition + spécifiques.<2>Ne sont pris en compte dans ce simulateur que les cas + de figure du bénéficiaire personne physique et des dividendes décidés + par la société.<3>Comment sont calculés les prélèvements sur les + dividendes ?<4>Les dividendes peuvent être soumis au prélèvement + forfaitaire unique de 30% incluant imposition et contributions sociales + (aussi appelé<1> flat tax). Par option, le barème de l'impôt peut + être choisi. Ce simulateur peut être utilisé pour comparer les deux + régimes.<5>Un acompte du montant de l'impôt (12,8%) est prélevé au + moment du versement des dividendes, sauf si le bénéficiaire remplit + <2>certains critères.<6>Cas particulier du dirigeant au régime + du travailleur indépendant<7> Au régime du travailleur indépendant, + la part des dividendes dépassant 10% du capital social sera soumise au + cotisations et contributions au même titre que les revenus du + dirigeant.<8>Ce cas de figure n'est pas encore pris en compte par ce + simulateur. + title: Simulateur de versement de dividendes ei: meta: description: Calcul du revenu à partir du chiffre d'affaires, après déduction diff --git a/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx b/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx new file mode 100644 index 000000000..cfb3cab09 --- /dev/null +++ b/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx @@ -0,0 +1,177 @@ +import { useContext } from 'react' +import { Trans, useTranslation } from 'react-i18next' +import { DottedName } from 'modele-social' +import { Condition } from 'Components/EngineValue' +import { SimulationGoals, SimulationGoal } from 'Components/SimulationGoals' +import { ThemeColorsContext } from 'Components/utils/colors' +import Notifications from 'Components/Notifications' +import Simulation from 'Components/Simulation' +import StackedBarChart from 'Components/StackedBarChart' +import { useDispatch } from 'react-redux' +import { useEngine } from 'Components/utils/EngineContext' +import { updateSituation } from 'Actions/actions' +import { HiddenOptionContext } from 'Components/conversation/Question' +import Warning from 'Components/ui/WarningBlock' + +export default function DividendesSimulation() { + return ( + // [XXX] [taux effectif] Update warning + <> + + +

    + Cette simulation est uniquement donnée à titre indicatif. Elle ne + concerne que les sociétés françaises à l'impôt sur les sociétés + (IS), et ne concerne pas les dirigeants affiliés au régime des + travailleurs indépendants. +

    +

    + Veuillez noter également que ce simulateur fait un calcul + approximatif de la part de l'impôt sur le revenu issu des + dividendes, basé sur le taux effectif de l'impôt sur le revenu.{' '} +

    +
    +
    + + + }> +
    * { + margin-top: 0.6rem; + } + justify-content: center; + + @media (min-width: 590px) { + justify-content: space-between; + } + `} + > + +
    + +
    +
    + + ) +} + +function OptionBarèmeSwitch() { + const dispatch = useDispatch() + const engine = useEngine() + const dottedName = 'impôt . méthode de calcul' as DottedName + const currentOptionPFU = engine.evaluate(dottedName + ' . PFU').nodeValue + const currentOptionBarème = engine.evaluate(dottedName + ' . barème standard') + .nodeValue + + return ( + + + + + ) +} + +const DividendesSimulationGoals = () => ( + + + + + + + + + + + + +) + +const DividendesExplanation = () => { + const { t } = useTranslation() + const { palettes } = useContext(ThemeColorsContext) + + return ( + +
    +
    +

    + + Répartition du total chargé + +

    +
    + +
    +
    + ) +} diff --git a/mon-entreprise/source/pages/Simulateurs/Home.tsx b/mon-entreprise/source/pages/Simulateurs/Home.tsx index 359b0f349..b776cdb9b 100644 --- a/mon-entreprise/source/pages/Simulateurs/Home.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Home.tsx @@ -85,6 +85,7 @@ export default function Simulateurs() {
    + {language === 'fr' && ( )} diff --git a/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml b/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml index 2b8ae8cae..270a86b38 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/auto-entrepreneur.yaml @@ -14,7 +14,7 @@ questions: liste: - entreprise - dirigeant - - impôt + - impôt . montant - établissement - situation personnelle non prioritaires: diff --git a/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml b/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml index 6ded709f9..6c42247e2 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/dirigeant-sasu.yaml @@ -2,7 +2,7 @@ objectifs: - dirigeant . rémunération . totale - contrat salarié . cotisations - contrat salarié . rémunération . net - - impôt + - impôt . montant - contrat salarié . rémunération . net après impôt questions: diff --git a/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml b/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml new file mode 100644 index 000000000..fa6701da3 --- /dev/null +++ b/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml @@ -0,0 +1,18 @@ +objectifs: + - bénéficiaire . dividendes . bruts + - bénéficiaire . dividendes . nets d'impôt + +questions: + # [TODO] [dividendes-indep] + # à l'affiche: + # Régime social du dirigeant: dirigeant + liste noire: + - impôt . méthode de calcul + +unité par défaut: €/an +situation: + dirigeant: "'assimilé salarié'" # [XXX] [dividendes-indep] + bénéficiaire . dividendes: oui + entreprise . imposition: "'IS'" + impôt . méthode de calcul: "'PFU'" + dirigeant . rémunération . imposable: 0 €/an diff --git a/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml b/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml index f6d315bb4..0ae3db706 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/indépendant.yaml @@ -22,7 +22,7 @@ questions: - établissement - dirigeant . indépendant - situation personnelle - - impôt + - impôt . montant non prioritaires: - dirigeant . indépendant . IJSS - dirigeant . indépendant . cotisations et contributions . exonérations diff --git a/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml b/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml index 6eb78495a..b2549fc1c 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/profession-libérale.yaml @@ -3,7 +3,7 @@ objectifs: - entreprise . charges - dirigeant . indépendant . cotisations et contributions - dirigeant . rémunération . nette - - impôt + - impôt . montant - dirigeant . rémunération . nette après impôt questions: @@ -17,7 +17,7 @@ questions: - entreprise - établissement - situation personnelle - - impôt + - impôt . montant non prioritaires: - dirigeant . indépendant . cotisations facultatives - dirigeant . indépendant . IJSS diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 3063c2240..0906d27d8 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -29,6 +29,8 @@ import RémunérationSASUPreview from './images/RémunérationSASUPreview.png' import salaireBrutNetPreviewEN from './images/SalaireBrutNetPreviewEN.png' import salaireBrutNetPreviewFR from './images/SalaireBrutNetPreviewFR.png' import ISSimulation from './ImpôtSociété' +import dividendesConfig from './configs/dividendes.yaml' +import DividendesSimulation from './Dividendes' import IndépendantSimulation, { EntrepriseIndividuelle, IndépendantPLSimulation, @@ -62,6 +64,7 @@ const simulateurs = [ 'pamc', 'is', 'aides-embauche', + 'dividendes', ] as const export type SimulatorId = typeof simulateurs[number] @@ -1094,7 +1097,78 @@ export function getSimulatorsData({

    ), - nextSteps: ['salarié', 'comparaison-statuts'], + nextSteps: ['salarié', 'dividendes', 'comparaison-statuts'], + }, + dividendes: { + icône: '🎩', + tracking: 'dividendes', + path: sitePaths.simulateurs.dividendes, + iframePath: 'dividendes', + meta: { + title: t('pages.simulateurs.dividendes.meta.title', 'Dividendes'), + description: t( + 'pages.simulateurs.dividendes.meta.description', + "Calculez le montant de l'impôt et des cotisations sur les dividendes perçus." + ), + color: '#E71D66', + }, + shortName: t('pages.simulateurs.dividendes.meta.title', 'Dividendes'), + title: t( + 'pages.simulateurs.dividendes.title', + 'Simulateur de versement de dividendes' + ), + component: DividendesSimulation, + config: dividendesConfig, + seoExplanations: ( + +

    Les dividendes et distributions

    +

    + A la fin de l'exercice d'une société, le résultat de l'exercice + précédent peut être conservé en réserve (pour de futurs + investissements) ou bien être versé en dividendes. Du point de vue + des bénéficiaires, ce sont des revenus de capitaux mobiliers, soumis + à des cotisations et une imposition spécifiques. +

    +

    + Ne sont pris en compte dans ce simulateur que les cas de figure du + bénéficiaire personne physique et des dividendes décidés par la + société. +

    +

    Comment sont calculés les prélèvements sur les dividendes ?

    +

    + Les dividendes peuvent être soumis au prélèvement forfaitaire unique + de 30% incluant imposition et contributions sociales (aussi appelé + flat tax). Par option, le barème de l'impôt peut être + choisi. Ce simulateur peut être utilisé pour comparer les deux + régimes. +

    +

    + Un acompte du montant de l'impôt (12,8%) est prélevé au moment du + versement des dividendes, sauf si le bénéficiaire remplit{' '} + + certains critères + + . +

    +

    + Cas particulier du dirigeant au régime du travailleur indépendant +

    +

    + {' '} + Au régime du travailleur indépendant, la part des dividendes + dépassant 10% du capital social sera soumise au cotisations et + contributions au même titre que les revenus du dirigeant. +

    +

    + Ce cas de figure n'est pas encore pris en compte par ce simulateur. +

    +
    + ), + nextSteps: ['salarié', 'is', 'comparaison-statuts'], }, } } diff --git a/mon-entreprise/source/sitePaths.ts b/mon-entreprise/source/sitePaths.ts index 00d976280..74d736646 100644 --- a/mon-entreprise/source/sitePaths.ts +++ b/mon-entreprise/source/sitePaths.ts @@ -75,6 +75,7 @@ const sitePathsFr = { }, is: '/impot-societe', 'aides-embauche': '/aides-embauche', + dividendes: '/dividendes', }, nouveautés: '/nouveautés', stats: '/stats', @@ -141,6 +142,7 @@ const sitePathsEn = { }, is: '/corporate-tax', 'aides-embauche': '/hiring-incentives', + dividendes: '/dividends', }, nouveautés: '/news', accessibilité: '/accessibility', diff --git a/mon-entreprise/test/cycles.test.js b/mon-entreprise/test/cycles.test.js index 58d56781f..7a4018470 100644 --- a/mon-entreprise/test/cycles.test.js +++ b/mon-entreprise/test/cycles.test.js @@ -24,10 +24,16 @@ describe('DottedNames graph', () => { ).to.deep.equal([ [ "entreprise . chiffre d'affaires", + 'dirigeant . rémunération . nette après impôt', + 'dirigeant . rémunération . nette', + 'dirigeant . rémunération . totale', 'dirigeant . rémunération . impôt', + "impôt . taux d'imposition", + "impôt . taux neutre d'impôt sur le revenu", + "impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique", + 'impôt . revenu imposable', 'dirigeant . rémunération . imposable', 'dirigeant . auto-entrepreneur . impôt . revenu imposable', - "entreprise . chiffre d'affaires . vente restauration hébergement", ], ]) console.warn( diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap index 375d96ca5..e4b162aa0 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap @@ -164,6 +164,18 @@ exports[`calculate simulations-auto-entrepreneur: échelle de revenus 10`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement, entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés" `; +exports[`calculate simulations-dividendes: barème 1`] = `"[200,166,34,0,112,112,0]"`; + +exports[`calculate simulations-dividendes: barème 2`] = `"[20000000,11112746,3440000,5447254,11184000,11184000,49]"`; + +exports[`calculate simulations-dividendes: barème 3`] = `"[200,119,34,47,112,112,42]"`; + +exports[`calculate simulations-dividendes: barème 4`] = `"[20000,14300,3440,2260,11184,11184,20]"`; + +exports[`calculate simulations-dividendes: pfu 1`] = `"[200,140,34,26,120,120,0]"`; + +exports[`calculate simulations-dividendes: pfu 2`] = `"[20000000,14000000,3440000,2560000,12000000,12000000,0]"`; + exports[`calculate simulations-impot-société: bénéfices 1`] = ` "[0,0] Notifications affichées : entreprise . imposition . IS . information sur le report de déficit" diff --git a/mon-entreprise/test/regressions/simulations-dividendes.yaml b/mon-entreprise/test/regressions/simulations-dividendes.yaml new file mode 100644 index 000000000..15b6f5a4f --- /dev/null +++ b/mon-entreprise/test/regressions/simulations-dividendes.yaml @@ -0,0 +1,23 @@ +pfu: + - bénéficiaire . dividendes . bruts: 200 €/an + impôt . méthode de calcul: "'PFU'" + dirigeant: "'assimilé salarié'" + - bénéficiaire . dividendes . bruts: 20000000 €/an + impôt . méthode de calcul: "'PFU'" + dirigeant: "'assimilé salarié'" + +barème: + - bénéficiaire . dividendes . bruts: 200 €/an + impôt . méthode de calcul: "'barème standard'" + dirigeant: "'assimilé salarié'" + - bénéficiaire . dividendes . bruts: 20000000 €/an + impôt . méthode de calcul: "'barème standard'" + dirigeant: "'assimilé salarié'" + - bénéficiaire . dividendes . bruts: 200 €/an + impôt . méthode de calcul: "'barème standard'" + dirigeant: "'assimilé salarié'" + impôt . foyer fiscal . revenu imposable . autres revenus imposables: 500000 €/an + - bénéficiaire . dividendes . bruts: 20000 €/an + impôt . méthode de calcul: "'barème standard'" + dirigeant: "'assimilé salarié'" + impôt . foyer fiscal . revenu imposable . autres revenus imposables: 50000 €/an diff --git a/mon-entreprise/test/regressions/simulations.jest.ts b/mon-entreprise/test/regressions/simulations.jest.ts index 920ae550b..69c5e6424 100644 --- a/mon-entreprise/test/regressions/simulations.jest.ts +++ b/mon-entreprise/test/regressions/simulations.jest.ts @@ -26,6 +26,8 @@ import independentSituations from './simulations-indépendant.yaml' import professionsLibéralesSituations from './simulations-professions-libérales.yaml' import remunerationDirigeantSituations from './simulations-rémunération-dirigeant.yaml' import employeeSituations from './simulations-salarié.yaml' +import dividendesSituations from './simulations-dividendes.yaml' +import dividendesConfig from '../../source/pages/Simulateurs/configs/dividendes.yaml' type SituationsSpecs = Record const roundResult = (arr: number[]) => arr.map((x) => Math.round(x)) @@ -85,7 +87,7 @@ it('calculate simulations-indépendant', () => { 'dirigeant . rémunération . cotisations', 'dirigeant . rémunération . nette', 'dirigeant . indépendant . revenu professionnel', - 'impôt', + 'impôt . montant', 'dirigeant . rémunération . nette après impôt', 'entreprise . charges', "entreprise . chiffre d'affaires", @@ -183,3 +185,18 @@ it('calculate simulations-impot-société', () => { } ) }) + +it('calculate simulations-dividendes', () => { + runSimulations( + dividendesSituations, + [ + ...dividendesConfig.objectifs, + 'bénéficiaire . dividendes . cotisations et contributions', + 'impôt . montant', + 'impôt . revenu imposable', + 'bénéficiaire . dividendes . imposables', + "impôt . taux d'imposition", + ], + dividendesConfig.situation + ) +}) From 95983cce3b68dd3026449c459be775209408ae37 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Fri, 23 Jul 2021 20:21:26 +0200 Subject: [PATCH 282/319] =?UTF-8?q?=F0=9F=94=A8=20Ajoute=20todo=20pour=20d?= =?UTF-8?q?ividendes=20r=C3=A9gime=20ind=C3=A9pendant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/bénéficiaire.yaml | 63 +++++++++++++++++++ .../règles/entreprise-établissement.yaml | 8 +++ .../pages/Simulateurs/configs/dividendes.yaml | 2 +- 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/modele-social/règles/bénéficiaire.yaml b/modele-social/règles/bénéficiaire.yaml index 884d9033b..31c4b60af 100644 --- a/modele-social/règles/bénéficiaire.yaml +++ b/modele-social/règles/bénéficiaire.yaml @@ -5,6 +5,32 @@ bénéficiaire: Attention: nous ne prenons en compte ici que le cas de figure de l'associé unique (SASU et EURL). +# [TODO] [dividendes-indep] +bénéficiaire . compte courant d'associé: + par défaut: 0€ + titre: Sommes versées en compte courant d'associé + question: Quelles sont les sommes versées en compte courant par l'associé ? + description: > + Cette valeur est nécessaire à calculer le montant maximal imposable au PFU + pour un bénéficiaire au régime des travailleurs indépendants. + + Le montant pris en compte est le solde moyen annuel du compte courant. Il + est déterminé par la somme des soldes moyens mensuels du compte, divisée par + le nombre de mois compris dans l’exercice. + + Le solde moyen mensuel est égal à l’addition des soldes journaliers, divisée + par le nombre de jours dans le mois. Le solde moyen mensuel diffère donc du + solde mensuel figurant dans les comptes de la société. + + En cas d’ouverture ou de clôture du compte en cours d’exercice, le nombre de + mois au cours de l’exercice sera réduit au nombre de mois de fonctionnement + du compte. Un compte est considéré comme « fonctionnant », même s’il n’est + pas mouvementé au cours de l’exercice. La date à laquelle les sommes + versées en compte courant doivent être appréciées est le dernier jour de + l’exercice précédant le versement des intérêts. + références: + Circulaire RSI C2014-001: https://www.secu-independants.fr/uploads/tx_rsirss/C2014-001.pdf + bénéficiaire . dividendes: # Désactivé par défaut: # [XXX] Ou sinon ne faudrait-il pas laisser soin aux simulateurs de faire liste-noire? @@ -74,3 +100,40 @@ bénéficiaire . dividendes . imposables: - les dividendes sont décidés en assemblée générale. références: Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32963 + +# [TODO] [dividendes-indep] +bénéficiaire . dividendes . cotisations et contributions . assiette forfaitaire: + variations: + - si: dirigeant = 'indépendant' + alors: + valeur: bruts + plafond: assiette forfaitaire max indépendant + - sinon: bruts + unité: €/an + titre: Assiette des dividendes soumis aux cotisations et contributions au PFU (ou "flat tax") + description: | + Ce calcul extrait l'assiette des dividendes qui sont soumis au PFU en termes de cotisations + et contributions. + références: + Article L131-6 du Code de la Sécurité Sociale: https://www.legifrance.gouv.fr/codes/id/LEGISCTA000033714224/ + Fiche URSSAF: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/la-declaration-sociale-et-fiscal/les-revenus-pris-en-compte-pour.html + +bénéficiaire . dividendes . cotisations et contributions . assiette forfaitaire max indépendant: + produit: + assiette: + somme: + - entreprise . capital social + - compte courant d'associé + taux: 10% + unité: €/an + +bénéficiaire . dividendes . cotisations et contributions . assiette régime indépendant: + valeur: bruts - assiette forfaitaire + par défaut: 0 €/an + unité: €/an + titre: Assiette des dividendes soumis aux cotisations et contributions du régime indépendant + description: | + Cette assiette représente la partie des dividendes qui n'est pas soumise au PFU mais aux + cotisations et contributions du régime du travailleur indépendant. + références: + Fiche URSSAF: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/la-declaration-sociale-et-fiscal/les-revenus-pris-en-compte-pour.html diff --git a/modele-social/règles/entreprise-établissement.yaml b/modele-social/règles/entreprise-établissement.yaml index d1d23c5fc..80746f06f 100644 --- a/modele-social/règles/entreprise-établissement.yaml +++ b/modele-social/règles/entreprise-établissement.yaml @@ -542,6 +542,14 @@ entreprise . charges . dirigeant: # on ne prend en compte pour l'instant que le cas entreprise unipersonnelle entreprise . dividendes: bénéficiaire . dividendes . bruts +# [TODO] [dividendes-indep] +entreprise . capital social: + description: | + Cette valeur doit inclure la valeur des primes d'émission. + titre: Capital social + question: Quele est le capital social de la société ? + unité: € + entreprise . ACRE: description: >- L'aide à la création ou à la reprise d'une entreprise (Acre) consiste en une diff --git a/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml b/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml index fa6701da3..13838e600 100644 --- a/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml +++ b/mon-entreprise/source/pages/Simulateurs/configs/dividendes.yaml @@ -11,7 +11,7 @@ questions: unité par défaut: €/an situation: - dirigeant: "'assimilé salarié'" # [XXX] [dividendes-indep] + dirigeant: "'assimilé salarié'" # [TODO] [dividendes-indep] bénéficiaire . dividendes: oui entreprise . imposition: "'IS'" impôt . méthode de calcul: "'PFU'" From e575ae663a3f38453f28c50fb2edc51620560f35 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Wed, 28 Jul 2021 13:42:44 +0200 Subject: [PATCH 283/319] =?UTF-8?q?=F0=9F=94=A8=20Am=C3=A9lioration=20du?= =?UTF-8?q?=20calcul=20de=20l'imp=C3=B4t=20sur=20dividendes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le calcul de l'impôt sur dividendes est maintenant le delta supplémentaire d'impôt en plus de l'impôt qui serait payé si aucun dividende n'était versé. Nécessite une réécriture du calcul de l'impôt brut pour supprimer un recalcul, étant donné que les recalculs imbriqués ne fonctionnent pas. --- modele-social/règles/bénéficiaire.yaml | 40 ++++-- modele-social/règles/impôt.yaml | 79 +++++++++--- .../mon-entreprise/simulateur-dividendes.js | 8 +- mon-entreprise/source/locales/rules-en.yaml | 121 +++++++++++++----- mon-entreprise/source/locales/ui-en.yaml | 10 +- mon-entreprise/source/locales/ui-fr.yaml | 7 +- .../source/pages/Simulateurs/Dividendes.tsx | 16 +-- .../source/pages/Simulateurs/metadata.tsx | 2 +- mon-entreprise/test/cycles.test.js | 4 +- .../__snapshots__/simulations.jest.ts.snap | 16 ++- .../regressions/simulations-dividendes.yaml | 26 +++- 11 files changed, 242 insertions(+), 87 deletions(-) diff --git a/modele-social/règles/bénéficiaire.yaml b/modele-social/règles/bénéficiaire.yaml index 31c4b60af..8a343167b 100644 --- a/modele-social/règles/bénéficiaire.yaml +++ b/modele-social/règles/bénéficiaire.yaml @@ -1,9 +1,11 @@ bénéficiaire: valeur: oui description: | - Un bénéficiaire est un actionnaire dans une SAS ou un associé dans une SARL/EURL. + Un bénéficiaire est un actionnaire dans une SAS ou un associé dans une + SARL/EURL. - Attention: nous ne prenons en compte ici que le cas de figure de l'associé unique (SASU et EURL). + Attention: nous ne prenons en compte ici que le cas de figure de l'associé + unique (SASU et EURL). # [TODO] [dividendes-indep] bénéficiaire . compte courant d'associé: @@ -33,7 +35,6 @@ bénéficiaire . compte courant d'associé: bénéficiaire . dividendes: # Désactivé par défaut: - # [XXX] Ou sinon ne faudrait-il pas laisser soin aux simulateurs de faire liste-noire? valeur: non applicable si: entreprise . imposition = 'IS' @@ -43,7 +44,7 @@ bénéficiaire . dividendes . bruts: inversion numérique: avec: - nets d'impôt - titre: Dividendes bruts revenant au bénéficiaire + titre: Dividendes bruts versés bénéficiaire . dividendes . nets: somme: @@ -52,8 +53,13 @@ bénéficiaire . dividendes . nets: titre: Dividendes nets bénéficiaire . dividendes . nets d'impôt: - valeur: bruts - dividendes . cotisations et contributions - impôt . dividendes - titre: Dividendes nets de cotisations et d'impôts + valeur: + somme: + - bruts + - (- dividendes . cotisations et contributions) + - (- impôt . dividendes . montant en sus des autres revenus imposables) + titre: Dividendes nets + résumé: Après paiements des cotisations et impôts bénéficiaire . dividendes . cotisations et contributions: produit: @@ -80,6 +86,7 @@ bénéficiaire . dividendes . cotisations et contributions: nom: prélèvement de solidarité taux: 7.5% titre: Cotisations et contributions sur dividendes + note: La CSG sur les revenus soumis au PFU n'est jamais déductible références: Fiche impots.gouv.fr: https://www.impots.gouv.fr/portail/particulier/les-revenus-mobiliers Fiche service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F2329 @@ -91,12 +98,14 @@ bénéficiaire . dividendes . imposables: - bruts - (- cotisations et contributions . CSG déductible) abattement: 40% - titre: Net imposable des dividendes auxquels s'applique le barème de l'impôt sur le revenu + titre: Net imposable des dividendes auxquels s'applique le barème de l'impôt + sur le revenu description: | Un abattement de 40% s'applique dans le cas où - la société distributrice des dividendes relève de l'IS - - la société distributrice est française ou a son siège en UE ou dans un état ayant conclu des accords en ce sens avec la France + - la société distributrice est française ou a son siège en UE ou dans un + état ayant conclu des accords en ce sens avec la France - les dividendes sont décidés en assemblée générale. références: Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32963 @@ -110,10 +119,11 @@ bénéficiaire . dividendes . cotisations et contributions . assiette forfaitair plafond: assiette forfaitaire max indépendant - sinon: bruts unité: €/an - titre: Assiette des dividendes soumis aux cotisations et contributions au PFU (ou "flat tax") + titre: Assiette des dividendes soumis aux cotisations et contributions au PFU + (ou "flat tax") description: | - Ce calcul extrait l'assiette des dividendes qui sont soumis au PFU en termes de cotisations - et contributions. + Ce calcul extrait l'assiette des dividendes qui sont soumis au PFU en termes + de cotisations et contributions. références: Article L131-6 du Code de la Sécurité Sociale: https://www.legifrance.gouv.fr/codes/id/LEGISCTA000033714224/ Fiche URSSAF: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/la-declaration-sociale-et-fiscal/les-revenus-pris-en-compte-pour.html @@ -131,9 +141,11 @@ bénéficiaire . dividendes . cotisations et contributions . assiette régime in valeur: bruts - assiette forfaitaire par défaut: 0 €/an unité: €/an - titre: Assiette des dividendes soumis aux cotisations et contributions du régime indépendant + titre: Assiette des dividendes soumis aux cotisations et contributions du + régime indépendant description: | - Cette assiette représente la partie des dividendes qui n'est pas soumise au PFU mais aux - cotisations et contributions du régime du travailleur indépendant. + Cette assiette représente la partie des dividendes qui n'est pas soumise au + prélèvements sociaux forfaitaires mais aux cotisations et contributions du + régime du travailleur indépendant. références: Fiche URSSAF: https://www.urssaf.fr/portail/home/independant/mes-cotisations/les-etapes-de-calcul/la-declaration-sociale-et-fiscal/les-revenus-pris-en-compte-pour.html diff --git a/modele-social/règles/impôt.yaml b/modele-social/règles/impôt.yaml index 111d13f1f..37076e2bb 100644 --- a/modele-social/règles/impôt.yaml +++ b/modele-social/règles/impôt.yaml @@ -306,6 +306,8 @@ impôt . foyer fiscal . nombre de parts: - majoration personne seule avec enfant - majoration personne veuve avec enfant +impôt . foyer fiscal . nombre de parts . sans parts rattachées: nombre de parts - nombre de parts . rattachées + impôt . foyer fiscal . nombre de parts . principales: formule: variations: @@ -391,7 +393,9 @@ impôt . foyer fiscal . revenu imposable . revenu d'activité abattu: Frais professionnels - forfait ou frais réels: https://www.service-public.fr/particuliers/vosdroits/F1989 impôt . foyer fiscal . revenu imposable . autres revenus imposables: - question: Quel est le montant total des autres revenus imposables du foyer fiscal ? + titre: Autres revenus imposables du foyer fiscal + question: Quel est le montant total des autres revenus imposables du foyer + fiscal ? par défaut: 0 €/an impôt . foyer fiscal . revenu fiscal de référence: @@ -412,7 +416,12 @@ impôt . foyer fiscal . impôt à payer: - impôt sur le revenu - CEHR -# [TODO] Il semble y avoir un soucis: selon la doc impot.gouv, le "revenu brut" (sur lequel est basé l'impôt brut ci-dessous sans doute?) ne doit pas contenir les revenus de capitaux mobiliers. Donc les dividendes imposables au barème ne devraient dans ce cas pas se voir appliquer de décote pour les bas revenus. Il faudrait sans doute revoir l'ensemble des règles de calcul autour du barème pour bien séparer celles qui ne s'appliquent qu'aux revenus brut. +# [TODO] Il semble y avoir un soucis: selon la doc impot.gouv, le "revenu brut" +# (sur lequel est basé l'impôt brut ci-dessous sans doute?) ne doit pas contenir +# les revenus de capitaux mobiliers. Donc les dividendes imposables au barème ne +# devraient dans ce cas pas se voir appliquer de décote pour les bas revenus. Il +# faudrait sans doute revoir l'ensemble des règles de calcul autour du barème +# pour bien séparer celles qui ne s'appliquent qu'aux revenus brut. impôt . foyer fiscal . impôt sur le revenu: unité: €/an formule: @@ -443,6 +452,10 @@ impôt . foyer fiscal . impôt sur le revenu . quotient familial: unité: €/part/an formule: revenu imposable / nombre de parts +impôt . foyer fiscal . impôt sur le revenu . quotient familial . sans parts rattachées: + unité: €/part/an + formule: revenu imposable / nombre de parts . sans parts rattachées + impôt . foyer fiscal . impôt sur le revenu . quotient familial . plafond avantage: formule: somme: @@ -472,7 +485,7 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut par part: formule: barème: assiette: quotient familial - tranches: + tranches: # ⚠️ Les tranches sont en doublon dans la règle "sans parts rattachées" - taux: 0% plafond: 10084 €/part/an - taux: 11% @@ -490,15 +503,27 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut par part: références: Article 197 du Code général des impôts: https://www.legifrance.gouv.fr/affichCodeArticle.do?cidTexte=LEGITEXT000006069577&idArticle=LEGIARTI000006308322 +impôt . foyer fiscal . impôt sur le revenu . impôt brut par part . sans parts rattachées: + formule: + barème: + assiette: quotient familial . sans parts rattachées + tranches: + - taux: 0% + plafond: 10084 €/part/an + - taux: 11% + plafond: 25710 €/part/an + - taux: 30% + plafond: 73516 €/part/an + - taux: 41% + plafond: 158122 €/part/an + - taux: 45% + impôt . foyer fiscal . impôt sur le revenu . impôt brut: formule: le maximum de: - impôt brut . sans plafonnement - somme: - - recalcul: - règle: impôt brut . sans plafonnement - avec: - nombre de parts . rattachées: 0 part + - impôt brut . sans plafonnement . sans parts rattachées - (- quotient familial . plafond avantage) impôt . foyer fiscal . impôt sur le revenu . impôt brut . sans plafonnement: @@ -506,6 +531,11 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut . sans plafonnement: assiette: impôt brut par part facteur: nombre de parts +impôt . foyer fiscal . impôt sur le revenu . impôt brut . sans plafonnement . sans parts rattachées: + produit: + assiette: impôt brut par part . sans parts rattachées + facteur: nombre de parts . sans parts rattachées + impôt . foyer fiscal . CEHR: unité: €/an formule: @@ -541,32 +571,47 @@ impôt . domiciliation étranger non implémentée: description: | La retenue à la source pour les non-résident n'est pas encore implémentée. Pour en savoir plus, se référer à la [documentation fiscale](https://www.impots.gouv.fr/portail/international-particulier/je-suis-non-resident-dois-je-declarer-des-revenus-et-payer-des-impots-en) -# [XXX] [taux effectif] En fait le calcul n'est pas top, ça sous-estime l'impact des dividendes sur l'impôt dans le cas barème car ça utilise le taux effectif -# [XXX] [taux effectif] Si on est ok avec la règle, à virer. Simplement utiliser `impôt` d'autant plus que pr l'instant on ne peut pas avoir de concept du genre "partie de l'impôt", on ne peut avoir qu'un revenu principal soumis à la simulation (le reste étant dans foyer fiscal) impôt . dividendes: + valeur: oui applicable si: bénéficiaire . dividendes . bruts > 0 + titre: Impôsition des dividendes + +impôt . montant si autres revenus imposables uniquement: + recalcul: + règle: impôt . foyer fiscal . impôt à payer + avec: + bénéficiaire . dividendes . bruts: 0 €/an + impôt . foyer fiscal . revenu imposable: foyer fiscal . revenu imposable . autres revenus imposables + titre: Montant de l'impôt dans le cas où aucun dividende ne serait touché + +impôt . dividendes . montant en sus des autres revenus imposables: variations: - si: méthode de calcul . PFU alors: PFU - - sinon: impôt . montant - titre: Impôt sur dividendes + - sinon: impôt . foyer fiscal . impôt à payer - montant si autres revenus imposables uniquement + titre: Montant de l'impôt sur dividendes, en sus de l'impôt sur les autres + revenus imposables impôt . dividendes . PFU: applicable si: impôt . méthode de calcul . PFU produit: assiette: bénéficiaire . dividendes . bruts taux: 12.8% - titre: Montant de l'impôt sur dividendes au titre du Prélèvement Forfaitaire Unique (ou "flat tax") + titre: Montant de l'impôt sur dividendes au titre du Prélèvement Forfaitaire + Unique (ou "flat tax") description: | - Ce montant est à verser sous forme d'acompte au moment du versement des dividendes. + Ce montant est à verser sous forme d'acompte au moment du versement des + dividendes. - L'acompte n'est pas obligatoire au cas où le revenu fiscal n-2 est inférieur à + L'acompte n'est pas obligatoire au cas où le revenu fiscal n-2 est inférieur + à - 50 000 € pour une personne seule, - - 75 000 € pour un couple soumis à l'imposition commune (mariés ou pacsés). + - 75 000 € pour un couple soumis à l'imposition commune (mariés ou + pacsés). - Dans ce cas, le bénéficiaire peut faire la demande de dispense au plus tard le 30 novembre - de l'année précédant celle du paiement + Dans ce cas, le bénéficiaire peut faire la demande de dispense au plus tard + le 30 novembre de l'année précédant celle du paiement références: Fiche service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32963 Article 200 A du Code Général des Impôts: https://www.legifrance.gouv.fr/codes/id/LEGISCTA000006179579/ diff --git a/mon-entreprise/cypress/integration/mon-entreprise/simulateur-dividendes.js b/mon-entreprise/cypress/integration/mon-entreprise/simulateur-dividendes.js index ddb1fe971..cc3c5f246 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/simulateur-dividendes.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/simulateur-dividendes.js @@ -1,6 +1,6 @@ const fr = Cypress.env('language') === 'fr' const inputSelector = 'input.currencyInput__input:not([name$="charges"])' -const totalSelector = 'section:nth(2)' +const totalSelector = 'section#simulateur-dividendes-section-total' describe('Simulateur auto-entrepreneur', () => { if (!fr) { @@ -13,4 +13,10 @@ describe('Simulateur auto-entrepreneur', () => { cy.get(totalSelector).contains(/[cC]otisations\s+17,2\s*%/) cy.get(totalSelector).contains(/[Ii]mpôt\s+12,8\s*%/) }) + + it('should allow switching PFU with barème', () => { + cy.get('input[name="impôt . méthode de calcul"]') + .eq(1) + .should('not.be.checked') + }) }) diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 4a4592c78..a972cc10d 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -1518,16 +1518,18 @@ artiste-auteur . revenus . traitements et salaires: bénéficiaire: description.en: > [automatic] A beneficiary is a shareholder in a SAS or a partner in a + SARL/EURL. - Attention: we only consider here the case of the sole shareholder (SASU and EURL). - description.fr: > + Attention: we only take into account here the case of the sole shareholder (SASU and EURL). + (SASU and EURL). + description.fr: | Un bénéficiaire est un actionnaire dans une SAS ou un associé dans une SARL/EURL. - - Attention: nous ne prenons en compte ici que le cas de figure de l'associé unique (SASU et EURL). + Attention: nous ne prenons en compte ici que le cas de figure de l'associé + unique (SASU et EURL). titre.en: '[automatic] recipient' titre.fr: bénéficiaire bénéficiaire . compte courant d'associé: @@ -1557,11 +1559,45 @@ bénéficiaire . dividendes: titre.en: '[automatic] dividends' titre.fr: dividendes bénéficiaire . dividendes . bruts: - titre.en: "[automatic] Beneficiary's share of dividends" - titre.fr: Part des dividendes revenant au bénéficiaire + titre.en: '[automatic] Gross dividends paid' + titre.fr: Dividendes bruts versés bénéficiaire . dividendes . cotisations et contributions: + note.en: '[automatic] The CSG on income subject to the PFU is never deductible' + note.fr: La CSG sur les revenus soumis au PFU n'est jamais déductible titre.en: '[automatic] Contributions on dividends' titre.fr: Cotisations et contributions sur dividendes +bénéficiaire . dividendes . cotisations et contributions . assiette forfaitaire: + description.en: > + [automatic] This calculation extracts the basis for dividends that are + subject to the PFU in terms of + + contributions. + description.fr: | + Ce calcul extrait l'assiette des dividendes qui sont soumis au PFU en termes + de cotisations et contributions. + titre.en: '[automatic] Basis for dividends subject to the PFU (or "flat tax")' + titre.fr: + Assiette des dividendes soumis aux cotisations et contributions au PFU + (ou "flat tax") +bénéficiaire . dividendes . cotisations et contributions . assiette forfaitaire max indépendant: + titre.en: '[automatic] max self-employed flat rate' + titre.fr: assiette forfaitaire max indépendant +bénéficiaire . dividendes . cotisations et contributions . assiette régime indépendant: + description.en: > + [automatic] This base represents the part of the dividends that is not + subject to the + + social security contributions but to the contributions of the + + contributions of the self-employed person's scheme. + description.fr: | + Cette assiette représente la partie des dividendes qui n'est pas soumise au + prélèvements sociaux forfaitaires mais aux cotisations et contributions du + régime du travailleur indépendant. + titre.en: '[automatic] Basis for dividends subject to contributions under the + self-employed scheme' + titre.fr: Assiette des dividendes soumis aux cotisations et contributions du + régime indépendant bénéficiaire . dividendes . imposables: description.en: > [automatic] A deduction of 40% applies in the case of @@ -1569,17 +1605,15 @@ bénéficiaire . dividendes . imposables: - the company distributing the dividends is subject to corporation tax - - the company distributing the dividends is French or has its registered office in the EU or in a country that has concluded agreements in this regard with France - + - the company distributing the dividends is French or has its headquarters in the EU or in a + state having concluded agreements in this sense with France - the dividends are decided in a general meeting. - description.fr: > + description.fr: | Un abattement de 40% s'applique dans le cas où - - la société distributrice des dividendes relève de l'IS - - - la société distributrice est française ou a son siège en UE ou dans un état ayant conclu des accords en ce sens avec la France - + - la société distributrice est française ou a son siège en UE ou dans un + état ayant conclu des accords en ce sens avec la France - les dividendes sont décidés en assemblée générale. titre.en: '[automatic] Net taxable amount of dividends to which the income tax scale applies' @@ -1590,8 +1624,10 @@ bénéficiaire . dividendes . nets: titre.en: '[automatic] Net dividends' titre.fr: Dividendes nets bénéficiaire . dividendes . nets d'impôt: - titre.en: '[automatic] Dividends net of contributions and taxes' - titre.fr: Dividendes nets de cotisations et d'impôts + résumé.en: '[automatic] After payment of contributions and taxes' + résumé.fr: Après paiements des cotisations et impôts + titre.en: '[automatic] Net dividends' + titre.fr: Dividendes nets chômage partiel: titre.en: '[automatic] short-time working' titre.fr: chômage partiel @@ -8274,40 +8310,50 @@ impôt: titre.en: income tax titre.fr: impôt sur le revenu impôt . dividendes: - titre.en: '[automatic] Tax on dividends' - titre.fr: Impôt sur dividendes + titre.en: '[automatic] Taxation of dividends' + titre.fr: Impôsition des dividendes impôt . dividendes . PFU: description.en: > [automatic] This amount is to be paid in the form of a deposit at the time - of the dividend payment. + of payment of the + + dividends. The advance payment is not compulsory if the tax income n-2 is less than + à + - 50,000 € for a single person, - - 75,000 € for a couple subject to joint taxation (married or civil union). + - 75,000 for a couple subject to joint taxation (married or + married or in a civil union). - In this case, the beneficiary may apply for exemption no later than 30 November + In this case, the beneficiary may apply for exemption no later than - of the year preceding the year of payment - description.fr: > + 30 November of the year preceding the year of payment + description.fr: | Ce montant est à verser sous forme d'acompte au moment du versement des dividendes. - - L'acompte n'est pas obligatoire au cas où le revenu fiscal n-2 est inférieur à + L'acompte n'est pas obligatoire au cas où le revenu fiscal n-2 est inférieur + à - 50 000 € pour une personne seule, - - 75 000 € pour un couple soumis à l'imposition commune (mariés ou pacsés). + - 75 000 € pour un couple soumis à l'imposition commune (mariés ou + pacsés). - Dans ce cas, le bénéficiaire peut faire la demande de dispense au plus tard le 30 novembre - - de l'année précédant celle du paiement + Dans ce cas, le bénéficiaire peut faire la demande de dispense au plus tard + le 30 novembre de l'année précédant celle du paiement titre.en: '[automatic] Amount of tax on dividends under the Prélèvement Forfaitaire Unique (or "flat tax")' titre.fr: Montant de l'impôt sur dividendes au titre du Prélèvement Forfaitaire Unique (ou "flat tax") +impôt . dividendes . montant en sus des autres revenus imposables: + titre.en: '[automatic] Amount of tax on dividends, in addition to tax on other + taxable income' + titre.fr: Montant de l'impôt sur dividendes, en sus de l'impôt sur les autres + revenus imposables impôt . domiciliation étranger non implémentée: description.en: > [automatic] Non-resident withholding tax is not yet implemented. For more @@ -8347,6 +8393,9 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut: impôt . foyer fiscal . impôt sur le revenu . impôt brut . sans plafonnement: titre.en: '[automatic] uncapped' titre.fr: sans plafonnement +impôt . foyer fiscal . impôt sur le revenu . impôt brut . sans plafonnement . sans parts rattachées: + titre.en: '[automatic] without attached units' + titre.fr: sans parts rattachées impôt . foyer fiscal . impôt sur le revenu . impôt brut par part: description.en: > [automatic] Here is the famous income tax scale. It is a marginal scale with @@ -8366,12 +8415,18 @@ impôt . foyer fiscal . impôt sur le revenu . impôt brut par part: Attention : pour un revenu de 100 000€ annuels, le contribuable ne paiera pas 41 000€ d'impôt (le taux de la 4ème tranche est 41%) ! Ces 41% sont appliqués uniquement à la part de ses revenus supérieure à 72 617€. titre.en: '[automatic] gross tax per unit' titre.fr: impôt brut par part +impôt . foyer fiscal . impôt sur le revenu . impôt brut par part . sans parts rattachées: + titre.en: '[automatic] without attached units' + titre.fr: sans parts rattachées impôt . foyer fiscal . impôt sur le revenu . quotient familial: titre.en: '[automatic] family quotient' titre.fr: quotient familial impôt . foyer fiscal . impôt sur le revenu . quotient familial . plafond avantage: titre.en: '[automatic] advantage ceiling' titre.fr: plafond avantage +impôt . foyer fiscal . impôt sur le revenu . quotient familial . sans parts rattachées: + titre.en: '[automatic] without attached units' + titre.fr: sans parts rattachées impôt . foyer fiscal . impôt à payer: titre.en: '[automatic] tax payable' titre.fr: impôt à payer @@ -8409,6 +8464,9 @@ impôt . foyer fiscal . nombre de parts . principales: impôt . foyer fiscal . nombre de parts . rattachées: titre.en: '[automatic] related' titre.fr: rattachées +impôt . foyer fiscal . nombre de parts . sans parts rattachées: + titre.en: '[automatic] without attached units' + titre.fr: sans parts rattachées impôt . foyer fiscal . revenu fiscal de référence: description.en: "[automatic] The reference tax income corresponds to the household's slaughtered income adjusted with a quotient mechanism and @@ -8425,8 +8483,8 @@ impôt . foyer fiscal . revenu imposable: impôt . foyer fiscal . revenu imposable . autres revenus imposables: question.en: '[automatic] What is the total amount of other taxable household income?' question.fr: Quel est le montant total des autres revenus imposables du foyer fiscal ? - titre.en: '[automatic] other taxable income' - titre.fr: autres revenus imposables + titre.en: '[automatic] Other taxable income of the tax household' + titre.fr: Autres revenus imposables du foyer fiscal impôt . foyer fiscal . revenu imposable . revenu d'activité abattu: description.en: > [automatic] In the general case, the tax is calculated after the application @@ -8458,6 +8516,9 @@ impôt . foyer fiscal . taux effectif: impôt . montant: titre.en: '[automatic] Amount of income tax' titre.fr: Montant de l'impôt sur le revenu +impôt . montant si autres revenus imposables uniquement: + titre.en: '[automatic] Amount of tax if no dividend is received' + titre.fr: Montant de l'impôt dans le cas où aucun dividende ne serait touché impôt . méthode de calcul: description.en: > We have implemented three ways to calculate income tax: diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index b19824c4b..c493bb686 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -460,10 +460,9 @@ d'aides: of aid dividendes: warning: <0>This simulation is only given as an indication. It only concerns French companies subject to corporation tax (IS), and does not concern - managers affiliated to the self-employed workers' regime.<1>Please also - note that this simulator makes an approximate calculation of the share of - income tax resulting from dividends, based on the effective income tax rate. - + managers affiliated to the self-employed workers' regime.<1>The amount + of tax on dividends is calculated in addition to the tax on other taxable + income. domiciliation inconnue: unknown address domiciliée à: domiciled in déductible: deductible @@ -1261,7 +1260,8 @@ pages: questions." dividendes: meta: - description: Calculate the amount of tax and contributions on dividends received. + description: Calculate the amount of tax and contributions on dividends paid by + your company. title: Dividends seo: <0>Dividends and distributions<1>At the end of a company's financial year, the result of the previous year can be kept in reserve (for future diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index 3043a92c4..e46b1fd2a 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -259,9 +259,8 @@ dividendes: warning: <0>Cette simulation est uniquement donnée à titre indicatif. Elle ne concerne que les sociétés françaises à l'impôt sur les sociétés (IS), et ne concerne pas les dirigeants affiliés au régime des travailleurs - indépendants.<1>Veuillez noter également que ce simulateur fait un - calcul approximatif de la part de l'impôt sur le revenu issu des dividendes, - basé sur le taux effectif de l'impôt sur le revenu. + indépendants.<1>Le montant de l'impôt sur les dividendes est calculé en + sus de l'impôt sur les autres revenus imposables. domiciliation inconnue: domiciliation inconnue domiciliée à: domiciliée à embauche: @@ -906,7 +905,7 @@ pages: dividendes: meta: description: Calculez le montant de l'impôt et des cotisations sur les - dividendes perçus. + dividendes versés par votre entreprise. title: Dividendes seo: <0>Les dividendes et distributions<1>A la fin de l'exercice d'une société, le résultat de l'exercice précédent peut être conservé en diff --git a/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx b/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx index cfb3cab09..20d13e5c6 100644 --- a/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx +++ b/mon-entreprise/source/pages/Simulateurs/Dividendes.tsx @@ -15,7 +15,6 @@ import Warning from 'Components/ui/WarningBlock' export default function DividendesSimulation() { return ( - // [XXX] [taux effectif] Update warning <>

    - Veuillez noter également que ce simulateur fait un calcul - approximatif de la part de l'impôt sur le revenu issu des - dividendes, basé sur le taux effectif de l'impôt sur le revenu.{' '} + Le montant de l'impôt sur les dividendes est calculé en sus de + l'impôt sur les autres revenus imposables.{' '}

    @@ -65,8 +63,9 @@ function OptionBarèmeSwitch() { const engine = useEngine() const dottedName = 'impôt . méthode de calcul' as DottedName const currentOptionPFU = engine.evaluate(dottedName + ' . PFU').nodeValue - const currentOptionBarème = engine.evaluate(dottedName + ' . barème standard') - .nodeValue + const currentOptionBarème = engine.evaluate( + dottedName + ' . barème standard' + ).nodeValue return ( @@ -133,7 +132,7 @@ const DividendesExplanation = () => { return ( -
    +
    { color: palettes[0][0], }, { - dottedName: 'impôt . dividendes', + dottedName: + 'impôt . dividendes . montant en sus des autres revenus imposables', title: t('Impôt'), color: palettes[1][0], }, diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 0906d27d8..6e49bb703 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -1108,7 +1108,7 @@ export function getSimulatorsData({ title: t('pages.simulateurs.dividendes.meta.title', 'Dividendes'), description: t( 'pages.simulateurs.dividendes.meta.description', - "Calculez le montant de l'impôt et des cotisations sur les dividendes perçus." + "Calculez le montant de l'impôt et des cotisations sur les dividendes versés par votre entreprise." ), color: '#E71D66', }, diff --git a/mon-entreprise/test/cycles.test.js b/mon-entreprise/test/cycles.test.js index 7a4018470..51cb3fec4 100644 --- a/mon-entreprise/test/cycles.test.js +++ b/mon-entreprise/test/cycles.test.js @@ -23,6 +23,8 @@ describe('DottedNames graph', () => { .join('\n\t- ')}\n\n` ).to.deep.equal([ [ + 'dirigeant . rémunération . imposable', + 'dirigeant . auto-entrepreneur . impôt . revenu imposable', "entreprise . chiffre d'affaires", 'dirigeant . rémunération . nette après impôt', 'dirigeant . rémunération . nette', @@ -32,8 +34,6 @@ describe('DottedNames graph', () => { "impôt . taux neutre d'impôt sur le revenu", "impôt . taux neutre d'impôt sur le revenu . barème Guadeloupe Réunion Martinique", 'impôt . revenu imposable', - 'dirigeant . rémunération . imposable', - 'dirigeant . auto-entrepreneur . impôt . revenu imposable', ], ]) console.warn( diff --git a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap index e4b162aa0..3414f5549 100644 --- a/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap +++ b/mon-entreprise/test/regressions/__snapshots__/simulations.jest.ts.snap @@ -164,13 +164,21 @@ exports[`calculate simulations-auto-entrepreneur: échelle de revenus 10`] = ` Notifications affichées : entreprise . chiffre d'affaires . franchise de TVA . dépassement, entreprise . imposition . IR . micro-fiscal . alerte seuil dépassés" `; -exports[`calculate simulations-dividendes: barème 1`] = `"[200,166,34,0,112,112,0]"`; +exports[`calculate simulations-dividendes: barème couple 2 enfants 1`] = `"[200,166,34,0,112,112,0]"`; -exports[`calculate simulations-dividendes: barème 2`] = `"[20000000,11112746,3440000,5447254,11184000,11184000,49]"`; +exports[`calculate simulations-dividendes: barème couple 2 enfants 2`] = `"[20000000,11148792,3440000,5411208,11184000,11184000,48]"`; -exports[`calculate simulations-dividendes: barème 3`] = `"[200,119,34,47,112,112,42]"`; +exports[`calculate simulations-dividendes: barème couple 2 enfants 3`] = `"[200,112,34,40,112,112,36]"`; -exports[`calculate simulations-dividendes: barème 4`] = `"[20000,14300,3440,2260,11184,11184,20]"`; +exports[`calculate simulations-dividendes: barème couple 2 enfants 4`] = `"[20000,15024,3440,622,11184,11184,6]"`; + +exports[`calculate simulations-dividendes: barème défauts 1`] = `"[200,166,34,0,112,112,0]"`; + +exports[`calculate simulations-dividendes: barème défauts 2`] = `"[20000000,11112746,3440000,5447254,11184000,11184000,49]"`; + +exports[`calculate simulations-dividendes: barème défauts 3`] = `"[200,111,34,47,112,112,42]"`; + +exports[`calculate simulations-dividendes: barème défauts 4`] = `"[20000,13205,3440,2260,11184,11184,20]"`; exports[`calculate simulations-dividendes: pfu 1`] = `"[200,140,34,26,120,120,0]"`; diff --git a/mon-entreprise/test/regressions/simulations-dividendes.yaml b/mon-entreprise/test/regressions/simulations-dividendes.yaml index 15b6f5a4f..728d2c886 100644 --- a/mon-entreprise/test/regressions/simulations-dividendes.yaml +++ b/mon-entreprise/test/regressions/simulations-dividendes.yaml @@ -6,7 +6,7 @@ pfu: impôt . méthode de calcul: "'PFU'" dirigeant: "'assimilé salarié'" -barème: +barème défauts: - bénéficiaire . dividendes . bruts: 200 €/an impôt . méthode de calcul: "'barème standard'" dirigeant: "'assimilé salarié'" @@ -21,3 +21,27 @@ barème: impôt . méthode de calcul: "'barème standard'" dirigeant: "'assimilé salarié'" impôt . foyer fiscal . revenu imposable . autres revenus imposables: 50000 €/an + +barème couple 2 enfants: + - bénéficiaire . dividendes . bruts: 200 €/an + impôt . méthode de calcul: "'barème standard'" + dirigeant: "'assimilé salarié'" + impôt . foyer fiscal . enfants à charge: 2 + impôt . foyer fiscal . situation de famille: "'couple'" + - bénéficiaire . dividendes . bruts: 20000000 €/an + impôt . méthode de calcul: "'barème standard'" + dirigeant: "'assimilé salarié'" + impôt . foyer fiscal . enfants à charge: 2 + impôt . foyer fiscal . situation de famille: "'couple'" + - bénéficiaire . dividendes . bruts: 200 €/an + impôt . méthode de calcul: "'barème standard'" + dirigeant: "'assimilé salarié'" + impôt . foyer fiscal . revenu imposable . autres revenus imposables: 500000 €/an + impôt . foyer fiscal . enfants à charge: 2 + impôt . foyer fiscal . situation de famille: "'couple'" + - bénéficiaire . dividendes . bruts: 20000 €/an + impôt . méthode de calcul: "'barème standard'" + dirigeant: "'assimilé salarié'" + impôt . foyer fiscal . revenu imposable . autres revenus imposables: 50000 €/an + impôt . foyer fiscal . enfants à charge: 2 + impôt . foyer fiscal . situation de famille: "'couple'" From 9420a45f462c16a29d2062d5b46af65a3cf9638c Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Fri, 3 Sep 2021 13:15:42 +0200 Subject: [PATCH 284/319] =?UTF-8?q?=F0=9F=94=A8=20Remove=20option=20PFU=20?= =?UTF-8?q?from=20imp=C3=B4t=20.=20m=C3=A9thode=20de=20calcul?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modele-social/règles/impôt.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/modele-social/règles/impôt.yaml b/modele-social/règles/impôt.yaml index 37076e2bb..d07e8344f 100644 --- a/modele-social/règles/impôt.yaml +++ b/modele-social/règles/impôt.yaml @@ -47,7 +47,6 @@ impôt . méthode de calcul: - taux neutre - taux personnalisé - barème standard - - PFU références: différence taux neutre / personnalisé: https://www.impots.gouv.fr/portail/particulier/questions/quelles-sont-les-differences-entre-les-taux-de-prelevement-la-source-proposes calcul du taux d'imposition: https://www.economie.gouv.fr/files/files/ESPACE-EVENEMENTIEL/PAS/Fiche_de_calcul_taux_simplifiee.pdf From 2dd249b9b9cada1c6172fcd3c0b9723a70d5baa6 Mon Sep 17 00:00:00 2001 From: Alexandre Hajjar Date: Mon, 6 Sep 2021 19:23:43 +0200 Subject: [PATCH 285/319] =?UTF-8?q?=E2=9C=A8=20Improve=20stats=20typing=20?= =?UTF-8?q?and=20naming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Only make month available in satisfaction items in stats.json. * Clean up GlobalStats. --- mon-entreprise/scripts/fetch-stats.js | 9 ++- .../source/pages/Stats/GlobalStats.tsx | 58 +++++++++++-------- mon-entreprise/source/pages/Stats/types.ts | 12 ++-- 3 files changed, 49 insertions(+), 30 deletions(-) diff --git a/mon-entreprise/scripts/fetch-stats.js b/mon-entreprise/scripts/fetch-stats.js index 65b9fc61b..4aaac501f 100644 --- a/mon-entreprise/scripts/fetch-stats.js +++ b/mon-entreprise/scripts/fetch-stats.js @@ -247,7 +247,14 @@ async function main() { const visitesMois = await fetchMonthlyVisits() const satisfaction = uniformiseData( flattenPage(await fetchApi(buildSatisfactionQuery())) - ) + ).map((page) => { + // eslint-disable-next-line no-unused-vars + const { date, ...satisfactionPage } = { + month: new Date(new Date(page.date).setDate(1)), + ...page, + } + return satisfactionPage + }) const retoursUtilisateurs = await fetchUserFeedbackIssues() writeInDataDir('stats.json', { visitesJours, diff --git a/mon-entreprise/source/pages/Stats/GlobalStats.tsx b/mon-entreprise/source/pages/Stats/GlobalStats.tsx index 79e928370..d3570e071 100644 --- a/mon-entreprise/source/pages/Stats/GlobalStats.tsx +++ b/mon-entreprise/source/pages/Stats/GlobalStats.tsx @@ -104,29 +104,37 @@ export default function GlobalStats({ stats }: { stats: StatsStruct }) { const last30dCommence = formatNumber(last30dCommenceNum) const last30dConv = Math.round((100 * last30dCommenceNum) / last30dVisitsNum) - const last30dSatisfactions = stats.satisfaction - .filter(({ date }) => date.startsWith(new Date().toISOString().slice(0, 7))) - .reduce( - (acc, { click: satisfactionLevel, nombre }) => ({ - ...acc, - [satisfactionLevel]: acc[satisfactionLevel] + nombre, - }), - { - [SatisfactionLevel.Mauvais]: 0, - [SatisfactionLevel.Moyen]: 0, - [SatisfactionLevel.Bien]: 0, - [SatisfactionLevel.TrèsBien]: 0, - } + const currentMonthSatisfaction = (() => { + const currentMonthSatisfaction = stats.satisfaction + .filter(({ month }) => + month.startsWith(new Date().toISOString().slice(0, 7)) + ) + .reduce( + (acc, { click: satisfactionLevel, nombre }) => ({ + ...acc, + [satisfactionLevel]: acc[satisfactionLevel] + nombre, + }), + { + [SatisfactionLevel.Mauvais]: 0, + [SatisfactionLevel.Moyen]: 0, + [SatisfactionLevel.Bien]: 0, + [SatisfactionLevel.TrèsBien]: 0, + } + ) + + const total = Object.values(currentMonthSatisfaction).reduce( + (a, b) => a + b ) - const last30dSatisfactionTotal = Object.values(last30dSatisfactions).reduce( - (a, b) => a + b - ) - const last30dSatisfactionPercentages = Object.fromEntries( - Object.entries(last30dSatisfactions).map(([level, count]) => [ - level, - (100 * count) / last30dSatisfactionTotal, - ]) - ) as Record + return { + total, + percentages: Object.fromEntries( + Object.entries(currentMonthSatisfaction).map(([level, count]) => [ + level, + (100 * count) / total, + ]) + ) as Record, + } + })() return ( <> @@ -180,10 +188,12 @@ export default function GlobalStats({ stats }: { stats: StatsStruct }) { `} > {' '} - +
    } - footnote={`${last30dSatisfactionTotal} avis ce mois ci`} + footnote={`${currentMonthSatisfaction.total} avis ce mois ci`} width="75%" /> diff --git a/mon-entreprise/source/pages/Stats/types.ts b/mon-entreprise/source/pages/Stats/types.ts index bf418a24f..a7b747cc8 100644 --- a/mon-entreprise/source/pages/Stats/types.ts +++ b/mon-entreprise/source/pages/Stats/types.ts @@ -1,5 +1,3 @@ -import statsJson from '../../data/stats.json' - // Generated using app.quicktype.io export interface StatsStruct { @@ -22,14 +20,18 @@ export interface Closed { } export interface BasePage { - date: string + date?: string + month?: string nombre: number page_chapter1: string page_chapter2: PageChapter2 page_chapter3: string } -export type Page = BasePage & { page: string } -export type PageSatisfaction = BasePage & { click: SatisfactionLevel } +export type Page = BasePage & { page: string; date: string } +export type PageSatisfaction = BasePage & { + month: string + click: SatisfactionLevel +} export enum SatisfactionLevel { Bien = 'bien', From abacd733823b6c38bae11546e14aa84c4607d2b2 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 13 Sep 2021 13:25:39 +0200 Subject: [PATCH 286/319] :bug: Corrige les types de Satisfaction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Suite à quoi, il ne restait plus qu'à modifier le code des fonctions filter pour le rendre correct au niveau de la vérification de type. Et le bug disparait Fix #1705 --- mon-entreprise/source/pages/Stats/Stats.tsx | 12 ++++++------ mon-entreprise/source/pages/Stats/types.ts | 2 -- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/mon-entreprise/source/pages/Stats/Stats.tsx b/mon-entreprise/source/pages/Stats/Stats.tsx index ace3158ad..435dfc8dc 100644 --- a/mon-entreprise/source/pages/Stats/Stats.tsx +++ b/mon-entreprise/source/pages/Stats/Stats.tsx @@ -36,7 +36,7 @@ type Data = | Array<{ date: string; nombre: number }> | Array<{ date: string; nombre: Record }> -type Pageish = Page & PageSatisfaction +type Pageish = Page | PageSatisfaction const isPAM = (name: string | undefined) => name && @@ -53,11 +53,11 @@ const filterByChapter2 = ( ): Array<{ date: string; nombre: Record }> => { return toPairs( groupBy( - (p) => p.date, + (p) => ('date' in p ? p.date : p.month), pages.filter( (p) => !chapter2 || - (p.page !== 'accueil_pamc' && + ((!('page' in p) || p.page !== 'accueil_pamc') && (p.page_chapter2 === chapter2 || (chapter2 === 'PAM' && isPAM(p.page_chapter3)))) ) @@ -66,7 +66,7 @@ const filterByChapter2 = ( date, nombre: mapObjIndexed( (v: Array<{ nombre: number }>) => v.map((v) => v.nombre).reduce(add), - groupBy((x) => x.page ?? x.click ?? '', values) + groupBy((x) => ('page' in x ? x.page : x.click), values) ), })) } @@ -74,8 +74,8 @@ const filterByChapter2 = ( function groupByDate(data: Pageish[]) { return toPairs( groupBy( - (p) => p.date, - data.filter((d) => d.page === 'accueil') + (p) => ('date' in p ? p.date : p.month), + data.filter((d) => 'page' in d && d.page === 'accueil') ) ).map(([date, values]) => ({ date, diff --git a/mon-entreprise/source/pages/Stats/types.ts b/mon-entreprise/source/pages/Stats/types.ts index a7b747cc8..2c9d7b840 100644 --- a/mon-entreprise/source/pages/Stats/types.ts +++ b/mon-entreprise/source/pages/Stats/types.ts @@ -20,8 +20,6 @@ export interface Closed { } export interface BasePage { - date?: string - month?: string nombre: number page_chapter1: string page_chapter2: PageChapter2 From 2a3be412b8e6bdcf2a34672da6b12902187e8a2c Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 13 Sep 2021 13:36:16 +0200 Subject: [PATCH 287/319] =?UTF-8?q?:bug:=20R=C3=A9pare=20le=20montant=20de?= =?UTF-8?q?=20l'imp=C3=B4t=20=C3=A0=200=E2=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La règle a changé de nom. Par ailleurs, il a fallu ajouter la possibiliter de spécifier un nom différent que celui de la règle pour l'affichage d'une ligne dans la fiche de paie (sinon on aurait eu affiché "montant de l'impot sur le revenu") fix #1708 --- .../source/components/PaySlipSections.tsx | 18 ++++++++++--- .../IndépendantExplanation.tsx | 25 ++++++++++--------- .../SalaryExplanation.tsx | 2 +- .../pages/Simulateurs/AutoEntrepreneur.tsx | 2 +- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/mon-entreprise/source/components/PaySlipSections.tsx b/mon-entreprise/source/components/PaySlipSections.tsx index 0b15baccd..7f5870db7 100644 --- a/mon-entreprise/source/components/PaySlipSections.tsx +++ b/mon-entreprise/source/components/PaySlipSections.tsx @@ -2,7 +2,7 @@ import Value, { Condition, ValueProps } from 'Components/EngineValue' import RuleLink from 'Components/RuleLink' import { DottedName } from 'modele-social' import { isNotApplicable, isNotYetDefined } from 'publicodes' -import { Trans } from 'react-i18next' +import { Trans, useTranslation } from 'react-i18next' import { useEngine } from './utils/EngineContext' export const SalaireBrutSection = () => { @@ -28,6 +28,7 @@ export const SalaireBrutSection = () => { } export const SalaireNetSection = () => { + const { t } = useTranslation() return (

    @@ -56,8 +57,13 @@ export const SalaireNetSection = () => { rule="contrat salarié . rémunération . net" className="payslip__total" /> - - + + { type LineProps = { rule: DottedName + title?: string negative?: boolean } & Omit, 'expression'> @@ -76,6 +83,7 @@ export function Line({ rule, displayedUnit = '€', negative = false, + title, className, ...props }: LineProps) { @@ -92,7 +100,9 @@ export function Line({ return ( 0`}> - + + {title} + >> = { function Distribution() { const targetUnit = useSelector(targetUnitSelector) const engine = useEngine() - const distribution = ( - Object.entries(CotisationsSection).map(([section, cotisations]) => [ - section, - cotisations - .map((c) => engine.evaluate({ valeur: c, unité: targetUnit })) - .reduce( - (acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0), - 0 - ), - ]) as Array<[DottedName, number]> - ) + const distribution = (Object.entries( + CotisationsSection + ).map(([section, cotisations]) => [ + section, + cotisations + .map((c) => engine.evaluate({ valeur: c, unité: targetUnit })) + .reduce( + (acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0), + 0 + ), + ]) as Array<[DottedName, number]>) .filter(([, value]) => value > 0) .sort(([, a], [, b]) => b - a) diff --git a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx index 35e25399d..40c360bbf 100644 --- a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx @@ -96,7 +96,7 @@ function RevenueRepartitionSection(props: { onSeePayslip: () => void }) { color: palettes[0][0], }, { - dottedName: 'impôt', + dottedName: 'impôt . montant', title: t('impôt'), color: palettes[1][0], }, diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index 916969bf3..a9b810d76 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -52,7 +52,7 @@ function Explanation() { color: palettes[0][0], }, { - dottedName: 'impôt', + dottedName: 'impôt . montant', title: t('impôt'), color: palettes[1][0], }, From 7be8195a9e841019537a307fed86d9d746d0726e Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 13 Sep 2021 15:03:27 +0200 Subject: [PATCH 288/319] =?UTF-8?q?:art:=20Am=C3=A9liore=20l'explication?= =?UTF-8?q?=20des=20r=C3=A8gles=20avec=20remplacement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pour pouvoir comprendre quels sont les remplacements actifs en cours. Fix #1708 Fix betagouv/publicodes#52 --- .../IndépendantExplanation.tsx | 22 ++++---- .../ui-react/source/mecanisms/Replacement.tsx | 53 +++++++++++++++++-- .../{Variations.js => Variations.tsx} | 11 ++-- .../ui-react/source/mecanisms/common.tsx | 2 +- 4 files changed, 70 insertions(+), 18 deletions(-) rename publicodes/ui-react/source/mecanisms/{Variations.js => Variations.tsx} (90%) diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 61e34a924..ab7520df0 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -97,17 +97,17 @@ const CotisationsSection: Partial>> = { function Distribution() { const targetUnit = useSelector(targetUnitSelector) const engine = useEngine() - const distribution = (Object.entries( - CotisationsSection - ).map(([section, cotisations]) => [ - section, - cotisations - .map((c) => engine.evaluate({ valeur: c, unité: targetUnit })) - .reduce( - (acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0), - 0 - ), - ]) as Array<[DottedName, number]>) + const distribution = ( + Object.entries(CotisationsSection).map(([section, cotisations]) => [ + section, + cotisations + .map((c) => engine.evaluate({ valeur: c, unité: targetUnit })) + .reduce( + (acc, evaluation) => acc + ((evaluation?.nodeValue as number) || 0), + 0 + ), + ]) as Array<[DottedName, number]> + ) .filter(([, value]) => value > 0) .sort(([, a], [, b]) => b - a) diff --git a/publicodes/ui-react/source/mecanisms/Replacement.tsx b/publicodes/ui-react/source/mecanisms/Replacement.tsx index 5922f2410..4f5a1c371 100644 --- a/publicodes/ui-react/source/mecanisms/Replacement.tsx +++ b/publicodes/ui-react/source/mecanisms/Replacement.tsx @@ -1,10 +1,57 @@ import { VariationNode } from 'publicodes/source/mecanisms/variations' +import { useState } from 'react' +import emoji from 'react-easy-emoji' +import Variations from './Variations' import Explanation from '../Explanation' +import Overlay from '../Overlay' +import { RuleLinkWithContext } from '../RuleLink' +import { NodeValuePointer } from './common' +import { EvaluatedNode } from 'publicodes/source/AST/types' -export default function Replacement(node: VariationNode) { +export default function Replacement(node: VariationNode & EvaluatedNode) { const applicableReplacement = node.explanation.find( (ex) => ex.satisfied )?.consequence - const replacedNode = node.explanation.slice(-1)[0].consequence - return + const replacedNode = node.explanation.slice(-1)[0].consequence as { + dottedName: string + } + + const [displayReplacements, changeDisplayReplacement] = useState(false) + return ( + <> + +   + {applicableReplacement && ( + + )} +   + + {displayReplacements && ( + changeDisplayReplacement(false)}> +

    Remplacement existant

    +

    + Un ou plusieurs remplacements ciblent la règle{' '} + à cet + endroit. Sa valeur est calculée selon la formule suivante : +

    + + +
    +

    + + En savoir plus sur le remplacement dans publicodes + +

    + + )} + + ) } diff --git a/publicodes/ui-react/source/mecanisms/Variations.js b/publicodes/ui-react/source/mecanisms/Variations.tsx similarity index 90% rename from publicodes/ui-react/source/mecanisms/Variations.js rename to publicodes/ui-react/source/mecanisms/Variations.tsx index bbf393f44..e95b1cef9 100644 --- a/publicodes/ui-react/source/mecanisms/Variations.js +++ b/publicodes/ui-react/source/mecanisms/Variations.tsx @@ -2,13 +2,18 @@ import classnames from 'classnames' import { useState } from 'react' import emoji from 'react-easy-emoji' import styled from 'styled-components' +import { EvaluatedNode } from 'publicodes/source/AST/types' +import { VariationNode } from 'publicodes/dist/types/mecanisms/variations' import Explanation from '../Explanation' import writtenNumbers from '../writtenNumbers' import { CapitalizeFirstLetter, InlineMecanismName, Mecanism } from './common' -export default function Variations({ nodeValue, explanation, unit }) { - let [expandedVariation, toggleVariation] = useState(null) - +export default function Variations({ + nodeValue, + explanation, + unit, +}: VariationNode & EvaluatedNode) { + const [expandedVariation, toggleVariation] = useState(null) return ( ) } else { - return {nodeValue} + return {formatValue({ nodeValue, unit })} } } From 49c0e8262aeb11bb2c60ba1ab065640122044326 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 13 Sep 2021 17:15:56 +0200 Subject: [PATCH 289/319] =?UTF-8?q?:bug:=20Corrige=20l'ordre=20des=20quest?= =?UTF-8?q?ions=20AT/MP=20sur=20le=20simulateur=20salari=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix #1681 --- modele-social/règles/salarié.yaml | 8 +++++--- mon-entreprise/source/locales/rules-en.yaml | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/modele-social/règles/salarié.yaml b/modele-social/règles/salarié.yaml index 0b4ce633f..51513edb2 100644 --- a/modele-social/règles/salarié.yaml +++ b/modele-social/règles/salarié.yaml @@ -837,10 +837,10 @@ contrat salarié . ATMP: assiette: cotisations . assiette taux [ref]: variations: - - si: taux réduit - alors: 0.8% - si: taux connu alors: taux personnalisé + - si: taux réduit + alors: 0.8% - sinon: ATMP . taux collectif ATMP références: taux réduit 2020 (code 00.00B): https://www.legifrance.gouv.fr/loda/id/JORFTEXT000039684705 @@ -890,7 +890,9 @@ contrat salarié . ATMP . taux connu: contrat salarié . ATMP . taux personnalisé: question: Quel est le taux AT/MP de l'entreprise ? description: > - Les entreprises de plus de 20 salariés ont un taux individualisé. L'entreprise peut consulter le taux qui la + Les entreprises de plus de 20 salariés ont un taux individualisé. L'entreprise peut consulter son taux effectif directement sur espace net-entreprise. + références: + Accès compte ATMP (entreprise): https://www.net-entreprises.fr/declaration/compte-atmp/ par défaut: taux moyen contrat salarié . ATMP . taux collectif ATMP: diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index a972cc10d..2e06a4dd0 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -1741,11 +1741,13 @@ contrat salarié . ATMP . taux moyen: titre.fr: taux moyen contrat salarié . ATMP . taux personnalisé: description.en: > - [automatic] Companies with more than 20 employees have an individualized - rate. The company can consult the rate that the + [automatic] Companies with more than 20 employees have an individualised + rate. The company can consult its effective rate directly on the + net-entreprise space. description.fr: > Les entreprises de plus de 20 salariés ont un taux individualisé. - L'entreprise peut consulter le taux qui la + L'entreprise peut consulter son taux effectif directement sur espace + net-entreprise. question.en: "[automatic] What is the company's AT/MP rate?" question.fr: Quel est le taux AT/MP de l'entreprise ? titre.en: '[automatic] personalized rate' From 8453a9a37ab72c6e455a4cf657b909bfc0581295 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Mon, 13 Sep 2021 17:43:52 +0200 Subject: [PATCH 290/319] :art::bug: corrige le style du remplacement dans les sommes --- .../ui-react/source/mecanisms/Replacement.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/publicodes/ui-react/source/mecanisms/Replacement.tsx b/publicodes/ui-react/source/mecanisms/Replacement.tsx index 4f5a1c371..339640e33 100644 --- a/publicodes/ui-react/source/mecanisms/Replacement.tsx +++ b/publicodes/ui-react/source/mecanisms/Replacement.tsx @@ -2,10 +2,9 @@ import { VariationNode } from 'publicodes/source/mecanisms/variations' import { useState } from 'react' import emoji from 'react-easy-emoji' import Variations from './Variations' -import Explanation from '../Explanation' import Overlay from '../Overlay' import { RuleLinkWithContext } from '../RuleLink' -import { NodeValuePointer } from './common' +import { NodeValuePointer, UnfoldIsEnabledContext } from './common' import { EvaluatedNode } from 'publicodes/source/AST/types' export default function Replacement(node: VariationNode & EvaluatedNode) { @@ -18,14 +17,16 @@ export default function Replacement(node: VariationNode & EvaluatedNode) { const [displayReplacements, changeDisplayReplacement] = useState(false) return ( - <> - + +   {applicableReplacement && ( - + + + )}   + useEffect(() => { + if (pathname !== pathnameRef.current) { + pathnameRef.current = pathname + close() + } + }, [pathname]) + + return ( + <> + {visible && ( + +

    + Que cherchez-vous ? +

    + +
    + )} + + setVisible(true)} + id="search-display-button" + > + + + +
    + Rechercher +
    +
    + ) } diff --git a/mon-entreprise/source/components/Simulation.tsx b/mon-entreprise/source/components/Simulation.tsx index fc1f7e180..6141ceccc 100644 --- a/mon-entreprise/source/components/Simulation.tsx +++ b/mon-entreprise/source/components/Simulation.tsx @@ -3,7 +3,6 @@ import Conversation, { } from 'Components/conversation/Conversation' import ExportSimulationBanner from 'Components/ExportSimulationBanner' import PageFeedback from 'Components/Feedback' -import SearchButton from 'Components/SearchButton' import ShareSimulationBanner from 'Components/ShareSimulationBanner' import TargetSelection from 'Components/TargetSelection' import Progress from 'Components/ui/Progress' @@ -42,7 +41,6 @@ export default function Simulation({ {simulationBloc} - {!firstStepCompleted && } {firstStepCompleted && ( <> diff --git a/mon-entreprise/source/components/layout/Header.tsx b/mon-entreprise/source/components/layout/Header.tsx index d0add527c..c94883ccd 100644 --- a/mon-entreprise/source/components/layout/Header.tsx +++ b/mon-entreprise/source/components/layout/Header.tsx @@ -7,6 +7,7 @@ import { useContext } from 'react' import { useTranslation } from 'react-i18next' import { Link } from 'react-router-dom' import NewsBanner from './NewsBanner' +import SearchButton from 'Components/SearchButton' export default function Header() { const sitePaths = useContext(SitePathsContext) @@ -56,6 +57,7 @@ export default function Header() { > logo urssaf + {language === 'fr' && }
    diff --git a/mon-entreprise/source/components/search/RulesInfiniteHits.tsx b/mon-entreprise/source/components/search/RulesInfiniteHits.tsx new file mode 100644 index 000000000..aac7bb158 --- /dev/null +++ b/mon-entreprise/source/components/search/RulesInfiniteHits.tsx @@ -0,0 +1,70 @@ +import { Trans, useTranslation } from 'react-i18next' +import { + connectInfiniteHits, + connectStats, + Highlight, +} from 'react-instantsearch-dom' +import { Names } from '../../../../modele-social/dist/names' + +import RuleLink from '../RuleLink' +import { Hit as AlgoliaHit } from 'react-instantsearch-core' + +type Hit = AlgoliaHit<{ objectID: Names; namespace?: string }> + +const Hit = (hit: Hit) => { + return ( + + {hit.namespace && ( +
    + +
    + )} +
    + +
    +
    + ) +} + +const HideableTitle = connectStats(({ nbHits }) => { + return nbHits === 0 ? ( + <> + ) : ( +

    + Règles de calculs +

    + ) +}) + +const Hits = connectInfiniteHits(({ hits, hasMore, refineNext }) => { + const { t } = useTranslation() + return ( +
    +
    + <> +
      + {hits.map((hit) => ( +
    1. + +
    2. + ))} +
    + {hasMore && ( + + )} + +
    +
    + ) +}) + +export const RulesInfiniteHits = () => { + return ( + <> + + + + ) +} diff --git a/mon-entreprise/source/components/search/SearchRules.tsx b/mon-entreprise/source/components/search/SearchRules.tsx new file mode 100644 index 000000000..278d1b25a --- /dev/null +++ b/mon-entreprise/source/components/search/SearchRules.tsx @@ -0,0 +1,36 @@ +import '../ui/Card.css' +import './SearchRulesAndSimulators.css' +import 'instantsearch.css/themes/satellite.css' + +import algoliasearch from 'algoliasearch/lite' +import { Trans, useTranslation } from 'react-i18next' +import { InstantSearch, SearchBox } from 'react-instantsearch-dom' +import { RulesInfiniteHits } from './RulesInfiniteHits' + +const ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || '' +const ALGOLIA_SEARCH_KEY = process.env.ALGOLIA_SEARCH_KEY || '' +const ALGOLIA_INDEX_PREFIX = process.env.ALGOLIA_INDEX_PREFIX || '' + +const searchClient = algoliasearch(ALGOLIA_APP_ID, ALGOLIA_SEARCH_KEY) + +export default function SearchRules() { + const { t } = useTranslation() + return ( + + +

    + Règles de calculs +

    + +
    + ) +} diff --git a/mon-entreprise/source/components/search/SearchRulesAndSimulators.css b/mon-entreprise/source/components/search/SearchRulesAndSimulators.css new file mode 100644 index 000000000..c52461caa --- /dev/null +++ b/mon-entreprise/source/components/search/SearchRulesAndSimulators.css @@ -0,0 +1,57 @@ +.ais-InfiniteHits { +} + +.ais-InfiniteHits-list > .ais-InfiniteHits-item { + padding: 0; +} + +.ais-InfiniteHits-list > .ais-InfiniteHits-item > .hit-content { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + padding: 0.5rem; + text-decoration: none; +} + +.ais-InfiniteHits-list > .ais-InfiniteHits-item > .hit-content > .hit-ruleName { + text-decoration: underline; +} + +.ais-InfiniteHits-list + > .ais-InfiniteHits-item + > .hit-content + > .ais-Highlight { + display: block; + flex-grow: 1; +} + +.ais-Hits-list { + display: grid; + grid-column-gap: 0.5rem; + grid-row-gap: 0.7rem; + grid-template-columns: repeat(3, 1fr); + grid-auto-rows: 1fr; +} + +.ais-Hits-list > .box { + padding: 0.5em; +} + +.simulator-hit-content { + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin: 0 !important; +} + +.simulator-hit-content .ais-Highlight { + font-size: 0.9em; +} + +.simulator-icon { + height: 2em; +} diff --git a/mon-entreprise/source/components/search/SearchRulesAndSimulators.tsx b/mon-entreprise/source/components/search/SearchRulesAndSimulators.tsx new file mode 100644 index 000000000..0d1a228d8 --- /dev/null +++ b/mon-entreprise/source/components/search/SearchRulesAndSimulators.tsx @@ -0,0 +1,47 @@ +import '../ui/Card.css' +import './SearchRulesAndSimulators.css' +import 'instantsearch.css/themes/satellite.css' + +import algoliasearch from 'algoliasearch/lite' +import { useTranslation } from 'react-i18next' +import { + Configure, + Index, + InstantSearch, + SearchBox, +} from 'react-instantsearch-dom' +import { SimulatorHits } from './SimulatorHits' +import { RulesInfiniteHits } from './RulesInfiniteHits' + +const ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID || '' +const ALGOLIA_SEARCH_KEY = process.env.ALGOLIA_SEARCH_KEY || '' +const ALGOLIA_INDEX_PREFIX = process.env.ALGOLIA_INDEX_PREFIX || '' + +const searchClient = algoliasearch(ALGOLIA_APP_ID, ALGOLIA_SEARCH_KEY) + +export default function SearchRulesAndSimulators() { + const { t } = useTranslation() + return ( + + + + + + + + + + + + + ) +} diff --git a/mon-entreprise/source/components/search/SimulatorHits.tsx b/mon-entreprise/source/components/search/SimulatorHits.tsx new file mode 100644 index 000000000..08bb076f8 --- /dev/null +++ b/mon-entreprise/source/components/search/SimulatorHits.tsx @@ -0,0 +1,57 @@ +import Emoji from 'Components/utils/Emoji' +import { SitePathsContext } from 'Components/utils/SitePathsContext' +import { path } from 'ramda' +import { useContext } from 'react' +import { Trans } from 'react-i18next' +import { connectHits, Highlight } from 'react-instantsearch-dom' +import { Link } from 'react-router-dom' + +type AlgoliaSimulatorHit = { + objectID: string + icône: string + title: string + pathId: string +} + +type SimulatorHitProps = { + hit: AlgoliaSimulatorHit + path?: string +} + +const SimulatorHit = ({ hit, path = '' }: SimulatorHitProps) => ( + +
    + {hit.icône && }{' '} +
    + + +) + +type SimulatorHitsProps = { + hits: Array +} + +export const SimulatorHits = connectHits(({ hits }: SimulatorHitsProps) => { + const sitePaths = useContext(SitePathsContext) + return ( + <> + {hits.length > 0 && ( +

    + Simulateurs +

    + )} +
    + {hits.map((hit) => ( + + ))} +
    + + ) +}) diff --git a/mon-entreprise/source/components/ui/breakpoints.ts b/mon-entreprise/source/components/ui/breakpoints.ts new file mode 100644 index 000000000..17175b5bc --- /dev/null +++ b/mon-entreprise/source/components/ui/breakpoints.ts @@ -0,0 +1,7 @@ +type Screen = 'phone' | 'tablet' | 'desktop' + +export const breakpoints: Record = { + phone: '0px', + tablet: '850px', + desktop: '1200px', +} diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index c493bb686..5ccd196e0 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -139,6 +139,7 @@ Professions libérales: By job Protection sociale: Social security Précédent: Previous Prévisualisation: Preview +Que cherchez-vous ?: What are you looking for? Quel module ?: What module? Quelle couleur ?: What color? Quelques exemples de salaires: Some salary exemples @@ -161,6 +162,7 @@ Revenu du dirigeant par statut: Executive income by status "Revenu net avec chômage partiel :": "Net income with short-time work :" Revenu net mensuel: Monthly net income Revenus étranger: Foreign income +Règles de calculs: Rules Réductions: Discounts Rémunération du dirigeant: Director's remuneration Répartition du chiffre d'affaires: Breakdown of turnover @@ -176,6 +178,7 @@ Salariés et employeurs: Employees and employers Sans responsabilité limitée: Without limited liability Si: If Simulateur de salaire: Employee salary simulation +Simulateurs: Simulations Simulations personnalisées: Customized simulations Sinon: Else Situation personnelle: Personal situation diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index e46b1fd2a..97ce35777 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -62,6 +62,7 @@ Prochaines questions: Prochaines questions Professions libérales: Professions libérales Précédent: Précédent Prévisualisation: Prévisualisation +Que cherchez-vous ?: Que cherchez-vous ? Quelques intégrations: Quelques intégrations Rechercher: Rechercher Ressources utiles: Ressources utiles @@ -70,11 +71,13 @@ Retour à la création: Retour à la création Retour à mon activité: Retour à mon activité Revenu du dirigeant par statut: Revenu du dirigeant par statut Revenus étranger: Revenus étranger +Règles de calculs: Règles de calculs Répartition du chiffre d'affaires: Répartition du chiffre d'affaires S'inscrire: S'inscrire Salaire: Salaire Salaire net: Salaire net Salariés et employeurs: Salariés et employeurs +Simulateurs: Simulateurs Situation personnelle: Situation personnelle Suivant: Suivant Total des retenues: Total des retenues diff --git a/mon-entreprise/source/pages/Documentation.tsx b/mon-entreprise/source/pages/Documentation.tsx index 44117b18c..3b4e844e4 100644 --- a/mon-entreprise/source/pages/Documentation.tsx +++ b/mon-entreprise/source/pages/Documentation.tsx @@ -1,5 +1,4 @@ -import SearchBar from 'Components/SearchBar' -import SearchButton from 'Components/SearchButton' +import SearchRules from 'Components/search/SearchRules' import { FromBottom } from 'Components/ui/animate' import { ThemeColorsProvider } from 'Components/utils/colors' import { useEngine } from 'Components/utils/EngineContext' @@ -12,6 +11,8 @@ import { useSelector } from 'react-redux' import { Redirect, useHistory, useLocation } from 'react-router-dom' import { RootState } from 'Reducers/rootReducer' import { TrackPage } from '../ATInternetTracking' +import rules, { DottedName } from 'modele-social' +import RuleLink from '../components/RuleLink' export default function RulePage() { const currentSimulation = useSelector( @@ -32,9 +33,15 @@ export default function RulePage() { if (pathname === '/documentation') { return } + + if (pathname === '/documentation/dev') { + return + } + if (!documentationSitePaths[pathname]) { return } + return ( {currentSimulation ? : } -

    Documentation
  • Explorez toutes les règles de la documentation

    - + + + ) +} + +function DocumentationRulesList() { + const ruleEntries = Object.keys(rules) as DottedName[] + return ( + <> +

    Liste des règles

    + {ruleEntries.map((name) => ( + + {name} + + ))} ) } diff --git a/mon-entreprise/source/pages/Simulateurs/metadata-src.js b/mon-entreprise/source/pages/Simulateurs/metadata-src.js new file mode 100644 index 000000000..88df8c6c4 --- /dev/null +++ b/mon-entreprise/source/pages/Simulateurs/metadata-src.js @@ -0,0 +1,567 @@ +/** + * Contient l'intégralité des données concernant les différents simulateurs + * sans dépendance qui compliquerait leur import dans le script de mise à jour + * des données pour Algolia. + */ +module.exports = ({ t = (_, text) => text } = {}) => { + return { + salarié: { + tracking: 'salarie', + icône: '🤝', + title: t( + 'pages.simulateurs.salarié.title', + 'Simulateur de revenus pour salarié' + ), + iframePath: 'simulateur-embauche', + meta: { + description: t( + 'pages.simulateurs.salarié.meta.description', + "Calcul du salaire net, net après impôt et coût total employeur. Beaucoup d'options disponibles (cadre, stage, apprentissage, heures supplémentaires, etc.)" + ), + ogDescription: t( + 'pages.simulateurs.salarié.meta.ogDescription', + "En tant que salarié, calculez immédiatement votre revenu net après impôt à partir du brut mensuel ou annuel. En tant qu'employé, estimez le coût total d'une embauche à partir du brut. Ce simulateur est développé avec les experts de l'Urssaf, et il adapte les calculs à votre situation (statut cadre, stage, apprentissage, heures supplémentaire, titre-restaurants, mutuelle, temps partiel, convention collective, etc.)" + ), + ogTitle: t( + 'pages.simulateurs.salarié.meta.ogTitle', + 'Salaire brut, net, net après impôt, coût total : le simulateur ultime pour salariés et employeurs' + ), + title: t( + 'pages.simulateurs.salarié.meta.titre', + 'Salaire brut / net : le convertisseur Urssaf' + ), + }, + pathId: 'simulateurs.salarié', + shortName: t('pages.simulateurs.salarié.shortname', 'Salarié'), + nextSteps: ['chômage-partiel', 'aides-embauche'], + }, + 'entreprise-individuelle': { + tracking: { + chapter2: 'statut_entreprise', + chapter3: 'EI', + }, + iframePath: 'simulateur-EI', + icône: '🚶‍♀️', + meta: { + description: t( + 'pages.simulateurs.ei.meta.description', + "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts" + ), + ogDescription: t( + 'pages.simulateurs.ei.meta.ogDescription', + "Grâce au simulateur de revenu pour entreprise individuelle développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu." + ), + ogTitle: t( + 'pages.simulateurs.ei.meta.ogTitle', + 'Entreprise individuelle (EI) : calculez rapidement votre revenu net à partir du CA et vice-versa' + ), + title: t( + 'pages.simulateurs.ei.meta.titre', + 'Entreprise individuelle (EI) : simulateur de revenus' + ), + }, + pathId: 'simulateurs.entreprise-individuelle', + shortName: t('pages.simulateurs.ei.shortname', 'EI'), + title: t( + 'pages.simulateurs.ei.title', + 'Simulateur pour entreprise individuelle (EI)' + ), + + nextSteps: ['comparaison-statuts'], + }, + eirl: { + tracking: { + chapter2: 'statut_entreprise', + chapter3: 'EIRL', + }, + icône: '🚶', + iframePath: 'simulateur-EIRL', + meta: { + description: t( + 'pages.simulateurs.eirl.meta.description', + "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts" + ), + ogDescription: t( + 'pages.simulateurs.eirl.meta.ogDescription', + "Grâce au simulateur de revenu pour EIRL développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu." + ), + ogTitle: t( + 'pages.simulateurs.eirl.meta.ogTitle', + "Dirigeant d'EIRL : calculez rapidement votre revenu net à partir du CA et vice-versa" + ), + title: t( + 'pages.simulateurs.eirl.meta.titre', + 'EIRL : simulateur de revenus pour dirigeant' + ), + }, + pathId: 'simulateurs.eirl', + shortName: t('pages.simulateurs.eirl.shortname', 'EIRL'), + title: t('pages.simulateurs.eirl.title', "Simulateur d'EIRL"), + + nextSteps: ['comparaison-statuts'], + }, + sasu: { + tracking: { + chapter2: 'statut_entreprise', + chapter3: 'SASU', + }, + icône: '📘', + iframePath: 'simulateur-assimilesalarie', + meta: { + description: t( + 'pages.simulateurs.sasu.meta.description', + 'Calcul du salaire net à partir du total alloué à la rémunération et inversement' + ), + ogDescription: t( + 'pages.simulateurs.sasu.meta.ogDescription', + 'En tant que dirigeant assimilé-salarié, calculez immédiatement votre revenu net après impôt à partir du total alloué à votre rémunération.' + ), + ogTitle: t( + 'pages.simulateurs.sasu.meta.ogTitle', + 'Rémunération du dirigeant de SASU : un simulateur pour connaître votre salaire net' + ), + title: t( + 'pages.simulateurs.sasu.meta.titre', + 'SASU : simulateur de revenus pour dirigeant' + ), + }, + pathId: 'simulateurs.sasu', + shortName: t('pages.simulateurs.sasu.shortname', 'SASU'), + title: t('pages.simulateurs.sasu.title', 'Simulateur de SASU'), + nextSteps: ['is', 'comparaison-statuts'], + }, + eurl: { + tracking: { + chapter2: 'statut_entreprise', + chapter3: 'EURL', + }, + icône: '📕', + iframePath: 'simulateur-eurl', + meta: { + description: t( + 'pages.simulateurs.eurl.meta.description', + 'Calcul du salaire net à partir du total alloué à la rémunération et inversement' + ), + ogDescription: t( + 'pages.simulateurs.eurl.meta.ogDescription', + 'En tant que dirigeant assimilé-salarié, calculez immédiatement votre revenu net après impôt à partir du total alloué à votre rémunération.' + ), + ogTitle: t( + 'pages.simulateurs.eurl.meta.ogTitle', + "Rémunération du dirigeant d'EURL : un simulateur pour connaître votre salaire net" + ), + title: t( + 'pages.simulateurs.eurl.meta.titre', + 'EURL : simulateur de revenus pour dirigeant' + ), + }, + pathId: 'simulateurs.eurl', + shortName: t('pages.simulateurs.sasu.shortname', 'EURL'), + title: t('pages.simulateurs.sasu.title', "Simulateur d'EURL"), + nextSteps: ['is', 'comparaison-statuts'], + }, + 'auto-entrepreneur': { + tracking: 'auto_entrepreneur', + icône: '🚶‍♂️', + iframePath: 'simulateur-autoentrepreneur', + meta: { + description: t( + 'pages.simulateurs.auto-entrepreneur.meta.description', + "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts" + ), + ogDescription: t( + 'pages.simulateurs.auto-entrepreneur.meta.ogDescription', + "Grâce au simulateur de revenu auto-entrepreneur développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu." + ), + ogTitle: t( + 'pages.simulateurs.auto-entrepreneur.meta.ogTitle', + 'Auto-entrepreneur : calculez rapidement votre revenu net à partir du CA et vice-versa' + ), + title: t( + 'pages.simulateurs.auto-entrepreneur.meta.titre', + 'Auto-entrepreneurs : simulateur de revenus' + ), + }, + pathId: 'simulateurs.auto-entrepreneur', + shortName: t( + 'pages.simulateurs.auto-entrepreneur.shortname', + 'Auto-entrepreneur' + ), + title: t( + 'pages.simulateurs.auto-entrepreneur.title', + 'Simulateur de revenus auto-entrepreneur' + ), + nextSteps: ['indépendant', 'comparaison-statuts'], + }, + indépendant: { + tracking: 'independant', + icône: '🏃', + iframePath: 'simulateur-independant', + pathId: 'simulateurs.indépendant', + shortName: t('pages.simulateurs.indépendant.shortname', 'Indépendant'), + title: t( + 'pages.simulateurs.indépendant.title', + 'Simulateur de revenus pour indépendant' + ), + meta: { + title: t( + 'pages.simulateurs.indépendant.meta.title', + 'Indépendant : simulateur de revenus' + ), + description: t( + 'pages.simulateurs.indépendant.meta.description', + "Calcul du revenu net après impôt et des cotisations à partir du chiffre d'affaires et inversement" + ), + }, + nextSteps: ['comparaison-statuts', 'is'], + }, + + 'artiste-auteur': { + icône: '👩‍🎨', + tracking: 'artiste-auteur', + iframePath: 'simulateur-artiste-auteur', + meta: { + title: t( + 'pages.simulateurs.artiste-auteur.meta.title', + 'Artiste-auteur: calcul des cotisations Urssaf' + ), + description: t( + 'pages.simulateurs.artiste-auteur.meta.description', + "Estimez les cotisations sociales sur les droits d'auteur et sur le revenu BNC" + ), + ogTitle: 'Artiste-auteur : estimez vos cotisations Urssaf', + ogDescription: + "Renseignez vos revenus (droits d'auteur et bnc) et découvrez immédiatement le montant des cotisations que vous aurez à payer sur l'année.", + }, + pathId: 'simulateurs.artiste-auteur', + title: t( + 'pages.simulateurs.artiste-auteur.title', + 'Estimer mes cotisations d’artiste-auteur' + ), + shortName: t( + 'pages.simulateurs.artiste-auteur.shortname', + 'Artiste-auteur' + ), + }, + 'chômage-partiel': { + tracking: 'chomage_partiel', + pathId: 'simulateurs.chômage-partiel', + icône: '😷', + iframePath: 'simulateur-chomage-partiel', + meta: { + description: t( + 'pages.simulateurs.chômage-partiel.meta.description', + "Calcul du revenu net pour l'employé et du reste à charge pour l'employeur après remboursement de l'Etat, en prenant en compte toutes les cotisations sociales." + ), + ogDescription: t( + 'pages.simulateurs.chômage-partiel.meta.ogDescription', + "Accédez à une première estimation en saisissant à partir d'un salaire brut. Vous pourrez ensuite personaliser votre situation (temps partiel, convention, etc). Prends en compte la totalité des cotisations, y compris celles spécifiques à l'indemnité (CSG et CRDS)." + ), + ogTitle: t( + 'pages.simulateurs.chômage-partiel.meta.ogTitle', + "Simulateur chômage partiel : découvrez l'impact sur le revenu net salarié et le coût total employeur." + ), + title: t( + 'pages.simulateurs.chômage-partiel.meta.titre', + "Calcul de l'indemnité chômage partiel : le simulateur Urssaf" + ), + }, + shortName: t( + 'pages.simulateurs.chômage-partiel.shortname', + 'Chômage partiel' + ), + title: t( + 'pages.simulateurs.chômage-partiel.title', + 'Covid-19 : Simulateur de chômage partiel' + ), + + nextSteps: ['salarié', 'aides-embauche'], + }, + 'comparaison-statuts': { + tracking: 'comparaison_statut', + icône: '📊', + pathId: 'simulateurs.comparaison', + title: t( + 'pages.simulateurs.comparaison.title', + 'Indépendant, assimilé salarié ou auto-entrepreneur : quel régime choisir ?' + ), + meta: { + description: t( + 'pages.simulateurs.comparaison.meta.description', + 'Auto-entrepreneur, indépendant ou dirigeant de SASU ? Avec ce comparatif, trouvez le régime qui vous correspond le mieux' + ), + title: t( + 'pages.simulateurs.comparaison.meta.title', + "Création d'entreprise : le comparatif des régimes sociaux" + ), + }, + shortName: t( + 'pages.simulateurs.comparaison.shortname', + 'Comparaison des statuts' + ), + }, + 'économie-collaborative': { + tracking: 'economie_collaborative', + meta: { + title: t( + 'pages.économie-collaborative.meta.title', + 'Déclaration des revenus des plateforme en ligne : guide intéractif' + ), + description: t( + 'pages.économie-collaborative.meta.description', + 'Airbnb, Drivy, Blablacar, Leboncoin... Découvrez comment être en règle dans vos déclarations' + ), + }, + icône: '🙋', + pathId: 'simulateurs.économieCollaborative.index', + shortName: t( + 'pages.économie-collaborative.shortname', + 'Guide économie collaborative' + ), + }, + 'aide-déclaration-indépendant': { + tracking: { + chapter1: 'gerer', + chapter2: 'aide_declaration_independant', + }, + icône: '✍️', + meta: { + description: t( + 'pages.gérer.aide-déclaration-indépendant.meta.description', + 'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2020.' + ), + title: t( + 'pages.gérer.aide-déclaration-indépendant.meta.title', + 'Déclaration de revenus indépendant : calcul du montant des cotisations' + ), + }, + pathId: 'simulateurs.déclarationIndépendant', + shortName: t( + 'pages.gérer.aide-déclaration-indépendant.shortname', + 'Aide à la déclaration de revenu' + ), + title: t( + 'pages.gérer.aide-déclaration-indépendant.title', + "Aide à la déclaration de revenus au titre de l'année 2020" + ), + }, + 'demande-mobilité': { + tracking: { + chapter1: 'gerer', + chapter2: 'demande_mobilite', + }, + icône: '🧳', + meta: { + title: t( + 'pages.gérer.demande-mobilité.meta.title', + 'Travailleur indépendant : demande de mobilité en Europe' + ), + description: t( + 'pages.gérer.demande-mobilité.meta.description', + "Formulaire interactif à compléter pour les indépendants souhaitant exercer leur activité dans d'autres pays d'Europe" + ), + }, + pathId: 'gérer.formulaireMobilité', + shortName: t( + 'pages.gérer.demande-mobilité.shortname', + 'Demande de mobilité internationale' + ), + private: true, + iframePath: 'demande-mobilite', + }, + médecin: { + tracking: { + chapter2: 'profession_liberale', + chapter3: 'medecin', + }, + icône: '⚕️', + iframePath: 'médecin', + pathId: 'simulateurs.profession-libérale.médecin', + shortName: t('pages.simulateurs.médecin.shortname', 'Médecin'), + title: t( + 'pages.simulateurs.médecin.title', + 'Simulateur de revenus pour médecin en libéral' + ), + }, + 'chirurgien-dentiste': { + icône: '🦷', + tracking: { + chapter2: 'profession_liberale', + chapter3: 'chirurgien_dentiste', + }, + iframePath: 'chirurgien-dentiste', + pathId: 'simulateurs.profession-libérale.chirurgien-dentiste', + shortName: t( + 'pages.simulateurs.chirurgien-dentiste.shortname', + 'Chirurgien-dentiste' + ), + title: t( + 'pages.simulateurs.chirurgien-dentiste.title', + 'Simulateur de revenus pour chirurgien-dentiste en libéral' + ), + }, + 'sage-femme': { + icône: '👶', + tracking: { + chapter2: 'profession_liberale', + chapter3: 'sage_femme', + }, + iframePath: 'sage-femme', + pathId: 'simulateurs.profession-libérale.sage-femme', + shortName: t('pages.simulateurs.sage-femme.shortname', 'Sage-femme'), + title: t( + 'pages.simulateurs.sage-femme.title', + 'Simulateur de revenus pour sage-femme en libéral' + ), + }, + 'auxiliaire-médical': { + tracking: { + chapter2: 'profession_liberale', + chapter3: 'auxiliaire_medical', + }, + tooltip: t( + 'pages.simulateurs.auxiliaire.tooltip', + 'Infirmiers, masseurs-kinésithérapeutes, pédicures-podologues, orthophonistes et orthoptistes' + ), + icône: '🩹', + iframePath: 'auxiliaire-medical', + pathId: 'simulateurs.profession-libérale.auxiliaire', + shortName: t('pages.simulateurs.auxiliaire.shortname', 'Auxiliaire méd.'), + title: t( + 'pages.simulateurs.auxiliaire.title', + 'Simulateur de revenus pour auxiliaire médical en libéral' + ), + }, + avocat: { + tracking: { + chapter2: 'profession_liberale', + chapter3: 'avocat', + }, + icône: '⚖', // j'ai hesité avec 🥑 mais pas envie de me prendre un procès + iframePath: 'avocat', + pathId: 'simulateurs.profession-libérale.avocat', + shortName: t('pages.simulateurs.avocat.shortname', 'Avocat'), + title: t( + 'pages.simulateurs.avocat.title', + 'Simulateur de revenus pour avocat en libéral' + ), + }, + 'expert-comptable': { + tracking: { + chapter2: 'profession_liberale', + chapter3: 'expert_comptable', + }, + icône: '🧮', + iframePath: 'expert-comptable', + pathId: 'simulateurs.profession-libérale.expert-comptable', + shortName: t( + 'pages.simulateurs.expert-comptable.shortname', + 'Expert-Comptable' + ), + title: t( + 'pages.simulateurs.expert-comptable.title', + 'Simulateur de revenus pour expert comptable et commissaire aux comptes en libéral' + ), + }, + 'profession-libérale': { + tracking: { + chapter2: 'profession_liberale', + }, + icône: '💻', + meta: { + title: t( + 'pages.simulateurs.profession-libérale.meta.title', + 'Professions libérale : le simulateur Urssaf' + ), + description: t( + 'pages.simulateurs.profession-libérale.meta.description', + "Calcul du revenu net pour les indépendants en libéral à l'impôt sur le revenu (IR, BNC)" + ), + }, + iframePath: 'profession-liberale', + pathId: 'simulateurs.profession-libérale.index', + shortName: t( + 'pages.simulateurs.profession-libérale.shortname', + 'Profession libérale' + ), + title: t( + 'pages.simulateurs.profession-libérale.title', + 'Simulateur de revenus pour profession libérale' + ), + }, + pamc: { + private: true, + iframePath: 'pamc', + tracking: {}, + title: t( + 'pages.simulateurs.pamc.title', + + 'PAMC : simulateurs de cotisations et de revenu' + ), + pathId: 'simulateurs.pamc', + icône: '🏥', + meta: { + title: t( + 'pages.simulateurs.pamc.meta.title', + 'Simulateurs régime PAMC' + ), + description: t( + 'pages.simulateurs.pamc.meta.description', + 'Calcul du revenu net pour les professions libérales du régime PAMC (médecin, chirurgien-dentiste, sage-femme et auxiliaire médical)' + ), + }, + shortName: t('pages.simulateurs.pamc.shortname', 'PAMC'), + }, + 'aides-embauche': { + icône: '🎁', + tracking: 'aides_embauche', + meta: { + title: t( + 'pages.simulateurs.aides-embauche.meta.title', + 'Aides à l’embauche' + ), + description: t( + 'pages.simulateurs.aides-embauche.meta.description', + 'Découvrez les principales aides à l’embauche et estimez leur montant en répondant à quelques questions.' + ), + color: '#11965f', + }, + pathId: 'simulateurs.aide-embauche', + iframePath: 'aides-embauche', + shortName: t( + 'pages.simulateurs.aides-embauche.meta.title', + 'Aides à l’embauche' + ), + title: t( + 'pages.simulateurs.aides-embauche.meta.title', + 'Aides à l’embauche' + ), + description: t( + 'pages.simulateurs.aides-embauche.introduction', + "Les employeurs peuvent bénéficier d'une aide financière pour l'embauche de certains publics prioritaires. Découvrez les dispositifs existants et estimez le montant de l'aide en répondant aux questions." + ), + nextSteps: ['salarié'], + }, + is: { + icône: '🗓', + tracking: 'impot-societe', + pathId: 'simulateurs.is', + iframePath: 'impot-societe', + meta: { + title: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'), + description: t( + 'pages.simulateurs.is.meta.description', + 'Calculez votre impôt sur les sociétés' + ), + color: '#E71D66', + }, + shortName: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'), + title: t( + 'pages.simulateurs.is.title', + "Simulateur d'impôt sur les sociétés" + ), + + nextSteps: ['salarié', 'comparaison-statuts'], + }, + } +} diff --git a/mon-entreprise/source/pages/Simulateurs/metadata.tsx b/mon-entreprise/source/pages/Simulateurs/metadata.tsx index 6e49bb703..d6a67be2e 100644 --- a/mon-entreprise/source/pages/Simulateurs/metadata.tsx +++ b/mon-entreprise/source/pages/Simulateurs/metadata.tsx @@ -39,6 +39,7 @@ import PAMCHome from './PAMCHome' import SalariéSimulation from './Salarié' import SchemeComparaisonPage from './SchemeComparaison' import ÉconomieCollaborative from './ÉconomieCollaborative' +import getData from './metadata-src.js' const simulateurs = [ 'salarié', @@ -106,40 +107,19 @@ export function getSimulatorsData({ t = (_: unknown, text: string) => text, sitePaths = constructLocalizedSitePath('fr'), language = 'fr', -}): SimulatorData { +} = {}): SimulatorData { + const pureSimulatorsData = getData({ t }) return { salarié: { - tracking: 'salarie', + ...pureSimulatorsData['salarié'], config: salariéConfig, component: SalariéSimulation, - icône: '🤝', - title: t( - 'pages.simulateurs.salarié.title', - 'Simulateur de revenus pour salarié' - ), - iframePath: 'simulateur-embauche', meta: { - description: t( - 'pages.simulateurs.salarié.meta.description', - "Calcul du salaire net, net après impôt et coût total employeur. Beaucoup d'options disponibles (cadre, stage, apprentissage, heures supplémentaires, etc.)" - ), - ogDescription: t( - 'pages.simulateurs.salarié.meta.ogDescription', - "En tant que salarié, calculez immédiatement votre revenu net après impôt à partir du brut mensuel ou annuel. En tant qu'employé, estimez le coût total d'une embauche à partir du brut. Ce simulateur est développé avec les experts de l'Urssaf, et il adapte les calculs à votre situation (statut cadre, stage, apprentissage, heures supplémentaire, titre-restaurants, mutuelle, temps partiel, convention collective, etc.)" - ), + ...pureSimulatorsData['salarié'].meta, ogImage: language === 'fr' ? salaireBrutNetPreviewFR : salaireBrutNetPreviewEN, - ogTitle: t( - 'pages.simulateurs.salarié.meta.ogTitle', - 'Salaire brut, net, net après impôt, coût total : le simulateur ultime pour salariés et employeurs' - ), - title: t( - 'pages.simulateurs.salarié.meta.titre', - 'Salaire brut / net : le convertisseur Urssaf' - ), }, path: sitePaths.simulateurs.salarié, - shortName: t('pages.simulateurs.salarié.shortname', 'Salarié'), seoExplanations: (

    Comment calculer le salaire net ?

    @@ -215,10 +195,7 @@ export function getSimulatorsData({ nextSteps: ['chômage-partiel', 'aides-embauche'], }, 'entreprise-individuelle': { - tracking: { - chapter2: 'statut_entreprise', - chapter3: 'EI', - }, + ...pureSimulatorsData['entreprise-individuelle'], config: { ...indépendantConfig, situation: { @@ -226,34 +203,12 @@ export function getSimulatorsData({ 'entreprise . imposition': "'IR'", }, }, - iframePath: 'simulateur-EI', - icône: '🚶‍♀️', meta: { - description: t( - 'pages.simulateurs.ei.meta.description', - "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts" - ), - ogDescription: t( - 'pages.simulateurs.ei.meta.ogDescription', - "Grâce au simulateur de revenu pour entreprise individuelle développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu." - ), + ...pureSimulatorsData['entreprise-individuelle'].meta, ogImage: AutoEntrepreneurPreview, - ogTitle: t( - 'pages.simulateurs.ei.meta.ogTitle', - 'Entreprise individuelle (EI) : calculez rapidement votre revenu net à partir du CA et vice-versa' - ), - title: t( - 'pages.simulateurs.ei.meta.titre', - 'Entreprise individuelle (EI) : simulateur de revenus' - ), }, component: EntrepriseIndividuelle, path: sitePaths.simulateurs['entreprise-individuelle'], - shortName: t('pages.simulateurs.ei.shortname', 'EI'), - title: t( - 'pages.simulateurs.ei.title', - 'Simulateur pour entreprise individuelle (EI)' - ), seoExplanations: (

    @@ -322,69 +277,24 @@ export function getSimulatorsData({ nextSteps: ['comparaison-statuts'], }, eirl: { - tracking: { - chapter2: 'statut_entreprise', - chapter3: 'EIRL', - }, + ...pureSimulatorsData['eirl'], config: indépendantConfig, - icône: '🚶', - iframePath: 'simulateur-EIRL', meta: { - description: t( - 'pages.simulateurs.eirl.meta.description', - "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts" - ), - ogDescription: t( - 'pages.simulateurs.eirl.meta.ogDescription', - "Grâce au simulateur de revenu pour EIRL développé par l'Urssaf, vous pourrez estimer le montant de vos revenus en fonction de votre chiffre d'affaires mensuel ou annuel pour mieux gérer votre trésorerie. Ou dans le sens inverse : savoir quel montant facturer pour atteindre un certain revenu." - ), + ...pureSimulatorsData['eirl'].meta, ogImage: AutoEntrepreneurPreview, - ogTitle: t( - 'pages.simulateurs.eirl.meta.ogTitle', - "Dirigeant d'EIRL : calculez rapidement votre revenu net à partir du CA et vice-versa" - ), - title: t( - 'pages.simulateurs.eirl.meta.titre', - 'EIRL : simulateur de revenus pour dirigeant' - ), }, component: IndépendantSimulation, path: sitePaths.simulateurs.eirl, - shortName: t('pages.simulateurs.eirl.shortname', 'EIRL'), - title: t('pages.simulateurs.eirl.title', "Simulateur d'EIRL"), - nextSteps: ['comparaison-statuts'], }, sasu: { + ...pureSimulatorsData['sasu'], config: sasuConfig, - tracking: { - chapter2: 'statut_entreprise', - chapter3: 'SASU', - }, - icône: '📘', - iframePath: 'simulateur-assimilesalarie', meta: { - description: t( - 'pages.simulateurs.sasu.meta.description', - 'Calcul du salaire net à partir du total alloué à la rémunération et inversement' - ), - ogDescription: t( - 'pages.simulateurs.sasu.meta.ogDescription', - 'En tant que dirigeant assimilé-salarié, calculez immédiatement votre revenu net après impôt à partir du total alloué à votre rémunération.' - ), + ...pureSimulatorsData['sasu'].meta, ogImage: RémunérationSASUPreview, - ogTitle: t( - 'pages.simulateurs.sasu.meta.ogTitle', - 'Rémunération du dirigeant de SASU : un simulateur pour connaître votre salaire net' - ), - title: t( - 'pages.simulateurs.sasu.meta.titre', - 'SASU : simulateur de revenus pour dirigeant' - ), }, path: sitePaths.simulateurs.sasu, - shortName: t('pages.simulateurs.sasu.shortname', 'SASU'), - title: t('pages.simulateurs.sasu.title', 'Simulateur de SASU'), component: function SasuSimulation() { return ( <> @@ -437,6 +347,7 @@ export function getSimulatorsData({ nextSteps: ['is', 'comparaison-statuts'], }, eurl: { + ...pureSimulatorsData['eurl'], config: { ...indépendantConfig, situation: { @@ -444,43 +355,22 @@ export function getSimulatorsData({ 'entreprise . imposition': "'IS'", }, }, - tracking: { - chapter2: 'statut_entreprise', - chapter3: 'EURL', - }, - icône: '📕', - iframePath: 'simulateur-eurl', meta: { - description: t( - 'pages.simulateurs.eurl.meta.description', - 'Calcul du salaire net à partir du total alloué à la rémunération et inversement' - ), - ogDescription: t( - 'pages.simulateurs.eurl.meta.ogDescription', - 'En tant que dirigeant assimilé-salarié, calculez immédiatement votre revenu net après impôt à partir du total alloué à votre rémunération.' - ), + ...pureSimulatorsData['eurl'].meta, ogImage: RémunérationSASUPreview, - ogTitle: t( - 'pages.simulateurs.eurl.meta.ogTitle', - "Rémunération du dirigeant d'EURL : un simulateur pour connaître votre salaire net" - ), - title: t( - 'pages.simulateurs.eurl.meta.titre', - 'EURL : simulateur de revenus pour dirigeant' - ), }, path: sitePaths.simulateurs.eurl, - shortName: t('pages.simulateurs.sasu.shortname', 'EURL'), - title: t('pages.simulateurs.sasu.title', "Simulateur d'EURL"), component: IndépendantSimulation, nextSteps: ['is', 'comparaison-statuts'], }, 'auto-entrepreneur': { + ...pureSimulatorsData['auto-entrepreneur'], tracking: 'auto_entrepreneur', config: autoEntrepreneurConfig, icône: '🚶‍♂️', iframePath: 'simulateur-autoentrepreneur', meta: { + ...pureSimulatorsData['auto-entrepreneur'].meta, description: t( 'pages.simulateurs.auto-entrepreneur.meta.description', "Calcul du revenu à partir du chiffre d'affaires, après déduction des cotisations et des impôts" @@ -577,92 +467,32 @@ export function getSimulatorsData({ nextSteps: ['indépendant', 'comparaison-statuts'], }, indépendant: { + ...pureSimulatorsData['indépendant'], config: indépendantConfig, - tracking: 'independant', - icône: '🏃', - iframePath: 'simulateur-independant', path: sitePaths.simulateurs.indépendant, - shortName: t('pages.simulateurs.indépendant.shortname', 'Indépendant'), - title: t( - 'pages.simulateurs.indépendant.title', - 'Simulateur de revenus pour indépendant' - ), meta: { - title: t( - 'pages.simulateurs.indépendant.meta.title', - 'Indépendant : simulateur de revenus' - ), - description: t( - 'pages.simulateurs.indépendant.meta.description', - "Calcul du revenu net après impôt et des cotisations à partir du chiffre d'affaires et inversement" - ), + ...pureSimulatorsData['indépendant'].meta, }, component: IndépendantSimulation, nextSteps: ['comparaison-statuts', 'is'], }, - 'artiste-auteur': { - icône: '👩‍🎨', - tracking: 'artiste-auteur', - iframePath: 'simulateur-artiste-auteur', + ...pureSimulatorsData['artiste-auteur'], meta: { - title: t( - 'pages.simulateurs.artiste-auteur.meta.title', - 'Artiste-auteur: calcul des cotisations Urssaf' - ), - description: t( - 'pages.simulateurs.artiste-auteur.meta.description', - "Estimez les cotisations sociales sur les droits d'auteur et sur le revenu BNC" - ), - ogTitle: 'Artiste-auteur : estimez vos cotisations Urssaf', - ogDescription: - "Renseignez vos revenus (droits d'auteur et bnc) et découvrez immédiatement le montant des cotisations que vous aurez à payer sur l'année.", + ...pureSimulatorsData['artiste-auteur'].meta, }, path: sitePaths.simulateurs['artiste-auteur'], - title: t( - 'pages.simulateurs.artiste-auteur.title', - 'Estimer mes cotisations d’artiste-auteur' - ), - shortName: t( - 'pages.simulateurs.artiste-auteur.shortname', - 'Artiste-auteur' - ), component: ArtisteAuteur, }, 'chômage-partiel': { - tracking: 'chomage_partiel', + ...pureSimulatorsData['chômage-partiel'], component: ChômagePartielComponent, config: chômageParielConfig, path: sitePaths.simulateurs['chômage-partiel'], - icône: '😷', - iframePath: 'simulateur-chomage-partiel', meta: { - description: t( - 'pages.simulateurs.chômage-partiel.meta.description', - "Calcul du revenu net pour l'employé et du reste à charge pour l'employeur après remboursement de l'Etat, en prenant en compte toutes les cotisations sociales." - ), - ogDescription: t( - 'pages.simulateurs.chômage-partiel.meta.ogDescription', - "Accédez à une première estimation en saisissant à partir d'un salaire brut. Vous pourrez ensuite personaliser votre situation (temps partiel, convention, etc). Prends en compte la totalité des cotisations, y compris celles spécifiques à l'indemnité (CSG et CRDS)." - ), + ...pureSimulatorsData['chômage-partiel'].meta, ogImage: ChômagePartielPreview, - ogTitle: t( - 'pages.simulateurs.chômage-partiel.meta.ogTitle', - "Simulateur chômage partiel : découvrez l'impact sur le revenu net salarié et le coût total employeur." - ), - title: t( - 'pages.simulateurs.chômage-partiel.meta.titre', - "Calcul de l'indemnité chômage partiel : le simulateur Urssaf" - ), }, - shortName: t( - 'pages.simulateurs.chômage-partiel.shortname', - 'Chômage partiel' - ), - title: t( - 'pages.simulateurs.chômage-partiel.title', - 'Covid-19 : Simulateur de chômage partiel' - ), seoExplanations: (

    Comment calculer l'indemnité d'activité partielle ?

    @@ -738,284 +568,137 @@ export function getSimulatorsData({ nextSteps: ['salarié', 'aides-embauche'], }, 'comparaison-statuts': { + ...pureSimulatorsData['comparaison-statuts'], component: SchemeComparaisonPage, - tracking: 'comparaison_statut', - icône: '📊', path: sitePaths.simulateurs.comparaison, - title: t( - 'pages.simulateurs.comparaison.title', - 'Indépendant, assimilé salarié ou auto-entrepreneur : quel régime choisir ?' - ), meta: { - description: t( - 'pages.simulateurs.comparaison.meta.description', - 'Auto-entrepreneur, indépendant ou dirigeant de SASU ? Avec ce comparatif, trouvez le régime qui vous correspond le mieux' - ), - title: t( - 'pages.simulateurs.comparaison.meta.title', - "Création d'entreprise : le comparatif des régimes sociaux" - ), + ...pureSimulatorsData['comparaison-statuts'].meta, }, - shortName: t( - 'pages.simulateurs.comparaison.shortname', - 'Comparaison des statuts' - ), }, 'économie-collaborative': { - tracking: 'economie_collaborative', + ...pureSimulatorsData['économie-collaborative'], component: ÉconomieCollaborative, meta: { - title: t( - 'pages.économie-collaborative.meta.title', - 'Déclaration des revenus des plateforme en ligne : guide intéractif' - ), - description: t( - 'pages.économie-collaborative.meta.description', - 'Airbnb, Drivy, Blablacar, Leboncoin... Découvrez comment être en règle dans vos déclarations' - ), + ...pureSimulatorsData['économie-collaborative'].meta, }, - icône: '🙋', path: sitePaths.simulateurs.économieCollaborative.index, - shortName: t( - 'pages.économie-collaborative.shortname', - 'Guide économie collaborative' - ), }, 'aide-déclaration-indépendant': { + ...pureSimulatorsData['aide-déclaration-indépendant'], component: AideDéclarationIndépendant, tracking: { chapter1: 'gerer', chapter2: 'aide_declaration_independant', }, - icône: '✍️', meta: { - description: t( - 'pages.gérer.aide-déclaration-indépendant.meta.description', - 'Calculer facilement les montants des charges sociales à reporter dans votre déclaration de revenu 2020.' - ), - title: t( - 'pages.gérer.aide-déclaration-indépendant.meta.title', - 'Déclaration de revenus indépendant : calcul du montant des cotisations' - ), + ...pureSimulatorsData['aide-déclaration-indépendant'].meta, }, path: sitePaths.gérer.déclarationIndépendant, - shortName: t( - 'pages.gérer.aide-déclaration-indépendant.shortname', - 'Aide à la déclaration de revenu' - ), - title: t( - 'pages.gérer.aide-déclaration-indépendant.title', - "Aide à la déclaration de revenus au titre de l'année 2020" - ), }, 'demande-mobilité': { + ...pureSimulatorsData['demande-mobilité'], component: FormulaireMobilitéIndépendant, tracking: { chapter1: 'gerer', chapter2: 'demande_mobilite', }, - icône: '🧳', meta: { - title: t( - 'pages.gérer.demande-mobilité.meta.title', - 'Travailleur indépendant : demande de mobilité en Europe' - ), - description: t( - 'pages.gérer.demande-mobilité.meta.description', - "Formulaire interactif à compléter pour les indépendants souhaitant exercer leur activité dans d'autres pays d'Europe" - ), + ...pureSimulatorsData['demande-mobilité'].meta, }, path: sitePaths.gérer.formulaireMobilité, - shortName: t( - 'pages.gérer.demande-mobilité.shortname', - 'Demande de mobilité internationale' - ), private: true, - iframePath: 'demande-mobilite', }, médecin: { + ...pureSimulatorsData['médecin'], config: médecinConfig, tracking: { chapter2: 'profession_liberale', chapter3: 'medecin', }, - icône: '⚕️', - iframePath: 'médecin', path: sitePaths.simulateurs['profession-libérale'].médecin, - shortName: t('pages.simulateurs.médecin.shortname', 'Médecin'), - title: t( - 'pages.simulateurs.médecin.title', - 'Simulateur de revenus pour médecin en libéral' - ), component: IndépendantPLSimulation, }, 'chirurgien-dentiste': { + ...pureSimulatorsData['chirurgien-dentiste'], config: dentisteConfig, - icône: '🦷', tracking: { chapter2: 'profession_liberale', chapter3: 'chirurgien_dentiste', }, - iframePath: 'chirurgien-dentiste', path: sitePaths.simulateurs['profession-libérale']['chirurgien-dentiste'], - shortName: t( - 'pages.simulateurs.chirurgien-dentiste.shortname', - 'Chirurgien-dentiste' - ), - title: t( - 'pages.simulateurs.chirurgien-dentiste.title', - 'Simulateur de revenus pour chirurgien-dentiste en libéral' - ), component: IndépendantPLSimulation, }, 'sage-femme': { + ...pureSimulatorsData['sage-femme'], config: sageFemmeConfig, - icône: '👶', tracking: { chapter2: 'profession_liberale', chapter3: 'sage_femme', }, - iframePath: 'sage-femme', path: sitePaths.simulateurs['profession-libérale']['sage-femme'], - shortName: t('pages.simulateurs.sage-femme.shortname', 'Sage-femme'), - title: t( - 'pages.simulateurs.sage-femme.title', - 'Simulateur de revenus pour sage-femme en libéral' - ), component: IndépendantPLSimulation, }, 'auxiliaire-médical': { + ...pureSimulatorsData['auxiliaire-médical'], config: auxiliaireConfig, tracking: { chapter2: 'profession_liberale', chapter3: 'auxiliaire_medical', }, - tooltip: t( - 'pages.simulateurs.auxiliaire.tooltip', - 'Infirmiers, masseurs-kinésithérapeutes, pédicures-podologues, orthophonistes et orthoptistes' - ), - icône: '🩹', - iframePath: 'auxiliaire-medical', path: sitePaths.simulateurs['profession-libérale'].auxiliaire, - shortName: t('pages.simulateurs.auxiliaire.shortname', 'Auxiliaire méd.'), - title: t( - 'pages.simulateurs.auxiliaire.title', - 'Simulateur de revenus pour auxiliaire médical en libéral' - ), component: IndépendantPLSimulation, }, avocat: { + ...pureSimulatorsData['avocat'], config: avocatConfig, tracking: { chapter2: 'profession_liberale', chapter3: 'avocat', }, - icône: '⚖', // j'ai hesité avec 🥑 mais pas envie de me prendre un procès - iframePath: 'avocat', path: sitePaths.simulateurs['profession-libérale'].avocat, - shortName: t('pages.simulateurs.avocat.shortname', 'Avocat'), - title: t( - 'pages.simulateurs.avocat.title', - 'Simulateur de revenus pour avocat en libéral' - ), component: IndépendantPLSimulation, }, 'expert-comptable': { + ...pureSimulatorsData['expert-comptable'], config: expertComptableConfig, tracking: { chapter2: 'profession_liberale', chapter3: 'expert_comptable', }, - icône: '🧮', - iframePath: 'expert-comptable', path: sitePaths.simulateurs['profession-libérale']['expert-comptable'], - shortName: t( - 'pages.simulateurs.expert-comptable.shortname', - 'Expert-Comptable' - ), - title: t( - 'pages.simulateurs.expert-comptable.title', - 'Simulateur de revenus pour expert comptable et commissaire aux comptes en libéral' - ), component: IndépendantPLSimulation, }, 'profession-libérale': { + ...pureSimulatorsData['profession-libérale'], config: professionLibéraleConfig, tracking: { chapter2: 'profession_liberale', }, - icône: '💻', meta: { - title: t( - 'pages.simulateurs.profession-libérale.meta.title', - 'Professions libérale : le simulateur Urssaf' - ), - description: t( - 'pages.simulateurs.profession-libérale.meta.description', - "Calcul du revenu net pour les indépendants en libéral à l'impôt sur le revenu (IR, BNC)" - ), + ...pureSimulatorsData['profession-libérale'].meta, }, - iframePath: 'profession-liberale', path: sitePaths.simulateurs['profession-libérale'].index, - shortName: t( - 'pages.simulateurs.profession-libérale.shortname', - 'Profession libérale' - ), - title: t( - 'pages.simulateurs.profession-libérale.title', - 'Simulateur de revenus pour profession libérale' - ), component: IndépendantPLSimulation, }, pamc: { + ...pureSimulatorsData['pamc'], private: true, - iframePath: 'pamc', tracking: {}, - title: t( - 'pages.simulateurs.pamc.title', - - 'PAMC : simulateurs de cotisations et de revenu' - ), path: sitePaths.simulateurs.pamc, config: professionLibéraleConfig, - icône: '🏥', meta: { - title: t( - 'pages.simulateurs.pamc.meta.title', - 'Simulateurs régime PAMC' - ), - description: t( - 'pages.simulateurs.pamc.meta.description', - 'Calcul du revenu net pour les professions libérales du régime PAMC (médecin, chirurgien-dentiste, sage-femme et auxiliaire médical)' - ), + ...pureSimulatorsData['pamc'].meta, }, - shortName: t('pages.simulateurs.pamc.shortname', 'PAMC'), component: PAMCHome, }, 'aides-embauche': { - icône: '🎁', + ...pureSimulatorsData['aides-embauche'], tracking: 'aides_embauche', meta: { - title: t( - 'pages.simulateurs.aides-embauche.meta.title', - 'Aides à l’embauche' - ), - description: t( - 'pages.simulateurs.aides-embauche.meta.description', - 'Découvrez les principales aides à l’embauche et estimez leur montant en répondant à quelques questions.' - ), - color: '#11965f', + ...pureSimulatorsData['aides-embauche'].meta, }, path: sitePaths.simulateurs['aides-embauche'], - iframePath: 'aides-embauche', - shortName: t( - 'pages.simulateurs.aides-embauche.meta.title', - 'Aides à l’embauche' - ), - title: t( - 'pages.simulateurs.aides-embauche.meta.title', - 'Aides à l’embauche' - ), + // Cette description est surchargé car elle contient ici du JSX description: (

    @@ -1046,23 +729,12 @@ export function getSimulatorsData({ nextSteps: ['salarié'], }, is: { - icône: '🗓', + ...pureSimulatorsData['is'], tracking: 'impot-societe', path: sitePaths.simulateurs.is, - iframePath: 'impot-societe', meta: { - title: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'), - description: t( - 'pages.simulateurs.is.meta.description', - 'Calculez votre impôt sur les sociétés' - ), - color: '#E71D66', + ...pureSimulatorsData['is'].meta, }, - shortName: t('pages.simulateurs.is.meta.title', 'Impôt sur les sociétés'), - title: t( - 'pages.simulateurs.is.title', - "Simulateur d'impôt sur les sociétés" - ), component: ISSimulation, seoExplanations: ( diff --git a/mon-entreprise/webpack.common.js b/mon-entreprise/webpack.common.js index 0117c2e6f..648fb98d3 100644 --- a/mon-entreprise/webpack.common.js +++ b/mon-entreprise/webpack.common.js @@ -136,6 +136,11 @@ module.exports.default = { FR_BASE_URL: 'http://localhost:8080/mon-entreprise', AT_INTERNET_SITE_ID: '', }), + new EnvironmentPlugin({ + ALGOLIA_APP_ID: '', + ALGOLIA_SEARCH_KEY: '', + ALGOLIA_INDEX_PREFIX: '', + }), new EnvironmentPlugin({ GITHUB_REF: '', GITHUB_HEAD_REF: '', diff --git a/yarn.lock b/yarn.lock index c612fa625..6a4148743 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,110 @@ # yarn lockfile v1 +"@algolia/cache-browser-local-storage@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.2.tgz#9925c7c0ce94257564b8948b60fc427c4a98124c" + integrity sha512-B3NInwobEAim4J4Y0mgZermoi0DCXdTT/Q+4ehLamqUqxLw8To5zc9izjg7B8JaFSQsqflRdCeRmYEv2gYDY7g== + dependencies: + "@algolia/cache-common" "4.10.2" + +"@algolia/cache-common@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.10.2.tgz#0113419518419895118d132bed4115345a865ce3" + integrity sha512-xcGbV0+6gLu2C7XoJdD+Pp6wWjROle6PNDsa6O21vS7fw1a03xb2bEnFdl1U31bs69P1z8IRy3h+8RVBouvhhw== + +"@algolia/cache-in-memory@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.10.2.tgz#2d34d4155425b385d19ff197a8943a4b5084c790" + integrity sha512-zPIcxHQEJXy+M35A+v9Y5u5BAQOKR2aFK0kYpAdW/OrgxYcrFHtVCxwIWB/ZhGbkDtzCW8/8tJeddcD5YsHX9Q== + dependencies: + "@algolia/cache-common" "4.10.2" + +"@algolia/client-account@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.10.2.tgz#c53d18d4f57ab5343c21e0ed795421964ba0cbb9" + integrity sha512-iuIU+xUtjgR9p4Hpujlr8mePDPSrVIk3peg+RAUhxniLBDaI+OhgHyhP6Lmh9flWk+JfRg91Rhk46xuxMLqwfA== + dependencies: + "@algolia/client-common" "4.10.2" + "@algolia/client-search" "4.10.2" + "@algolia/transporter" "4.10.2" + +"@algolia/client-analytics@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.10.2.tgz#93c881cfb9e5df389725d821327fa801f1baa2c6" + integrity sha512-u47J65NHs0fMryDrMeuLMGjXDOKt/muF9WlfbMslT2Cvdd7PZwl9KYnT7xMhnmBB8TDiDMmEQkDykhnCOnwVNw== + dependencies: + "@algolia/client-common" "4.10.2" + "@algolia/client-search" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@algolia/transporter" "4.10.2" + +"@algolia/client-common@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.10.2.tgz#a715e8feb2a2b6ea38765f53e8ae6ffc4ed80aba" + integrity sha512-sfgZCv9ha9aHbe3ErAYb1blg2qx4XTLvQqP1jq8asU75rrH9XBTtSzQQO43GlArwhtwCHLgcWquN3WgPlLzkiQ== + dependencies: + "@algolia/requester-common" "4.10.2" + "@algolia/transporter" "4.10.2" + +"@algolia/client-personalization@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.10.2.tgz#89d761bcf60ce13b8565c2ae8ab644c3a3d114c8" + integrity sha512-2UhUNo/czfA/keOC3+vFyMnFGV/E1Zkm+ek9Fsk/9miS39UMhx2CmH5vKSIJ7jxLSin7zBaCwKt65phfYty1pg== + dependencies: + "@algolia/client-common" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@algolia/transporter" "4.10.2" + +"@algolia/client-search@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.10.2.tgz#ad281b04ec4e6eaff68fb5be330f0bdf965ce011" + integrity sha512-ZdOh6XS6Y9bcekfG4y0VhdoIYfsTounsgXX4Bt3X2RCcmY3uotgaq2EVY58E6q6nvfgBfPHW18+AZCHKTWHAAw== + dependencies: + "@algolia/client-common" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@algolia/transporter" "4.10.2" + +"@algolia/logger-common@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.10.2.tgz#f28e966a6b878af2917ed2e1518f46650a6fb8ad" + integrity sha512-UJaU6arzmW+FT5fCv5NIbxNMtEoGcf+UENmZxxu7k7UWPARR2XL4ljJ45Jv14Z5dlz32LXWtR1PRmNfkDMk22Q== + +"@algolia/logger-console@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.10.2.tgz#9d3dcbb077242db92f0f0a1795ec95c3bc839599" + integrity sha512-JrCrZ7CGs/TsyNR2AWe9Vdd6rsuxfvfcpqbu+CY7LBUYEnV8GERkf7FnDNaKVNsFJqClILCGh3U8CzQ1G5L+kA== + dependencies: + "@algolia/logger-common" "4.10.2" + +"@algolia/requester-browser-xhr@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.2.tgz#2286e2f10fff3651f719b8d7d3defc8c032fcce0" + integrity sha512-LveaAp7/oCBotv1aZ4VHz8fCcJA7v/28ayh+Ljlm+hYXsxgs6NAYKz7iBpxGN7q5MV8GM+MThRYNFoT0cHTMxQ== + dependencies: + "@algolia/requester-common" "4.10.2" + +"@algolia/requester-common@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.10.2.tgz#8b62f0848454ec5b07bd3599f5fb2b87ec7c4de8" + integrity sha512-3J2W0fAaURLGK0lEGeNb8eWJnQcsu+oIcfJTCIYkYT5T9w21M65kUUyD9QSf/K137qQts3tzGniUR3LxfovlXA== + +"@algolia/requester-node-http@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.10.2.tgz#edb691e34e18aacc15107193319e1a712e024649" + integrity sha512-IBqsalCGgn0CrOP1PKRB5rufEOvHlrSQUFEGXZ8mxmE/zU8CLX2LKqdHbEFeNDLFl+l+8HW5BGVDGD2rvG+hSg== + dependencies: + "@algolia/requester-common" "4.10.2" + +"@algolia/transporter@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.10.2.tgz#ae0fa7c99b9bf8efa5ac83843558be1074e7c045" + integrity sha512-I3QDRSookQtPSUEnxT2XCShhipCT4beJBpWhteNwMrWQF/SqTsveqSR6bX0G49lDh9MOmYrOlCegteuKuT/tEw== + dependencies: + "@algolia/cache-common" "4.10.2" + "@algolia/logger-common" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -3476,6 +3580,23 @@ dependencies: "@types/react" "*" +"@types/react-instantsearch-core@*": + version "6.10.2" + resolved "https://registry.yarnpkg.com/@types/react-instantsearch-core/-/react-instantsearch-core-6.10.2.tgz#634a887233ce76cc0f37a37f30909fe77a24d73b" + integrity sha512-dG/XHdrPWjVvQTTOg4Q5somVfE6xePOEFJXVeVsRNB+Pj8tzfFR6niFOStf791wGM9BKVBmmy2rCAMhcbfROnw== + dependencies: + "@types/react" "*" + algoliasearch ">=4" + algoliasearch-helper ">=3" + +"@types/react-instantsearch-dom@^6.10.1": + version "6.10.1" + resolved "https://registry.yarnpkg.com/@types/react-instantsearch-dom/-/react-instantsearch-dom-6.10.1.tgz#9a0aa032c18e38c429f0d2a7c432959beb45f5a7" + integrity sha512-LISZFa3NHTB8455e+5q/igQVt11ElnUQcYp1/O+ju46Suck83EjyS4YXacUx+zTJGlagIxJadGMV+V7amJAzTQ== + dependencies: + "@types/react" "*" + "@types/react-instantsearch-core" "*" + "@types/react-native@*": version "0.63.8" resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.63.8.tgz#73ec087122c64c309eeaf150b565b8d755f0fb1f" @@ -4340,6 +4461,33 @@ ajv@^6.12.3, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +algoliasearch-helper@>=3, algoliasearch-helper@^3.4.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.5.3.tgz#fbf8b328bc103efdefde59a7d25eaffe85b2490f" + integrity sha512-DtSlOKAJ6TGkQD6u58g6/ABdMmHf3pAj6xVL5hJF+D4z9ldDRf/f5v6puNIxGOlJRwGVvFGyz34beYNqhLDUbQ== + dependencies: + events "^1.1.1" + +"algoliasearch@>= 3.27.1 < 5", algoliasearch@>=4, algoliasearch@^4.10.2: + version "4.10.2" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.10.2.tgz#23e88c71cb381d5b59430baa5d417186cc8ff683" + integrity sha512-BAYCe97XRfO15irJKBRjBnrp9tSqN0jppklLIXKdtUcXlibcPQtuAeGUP2cPiz6bJd3ISuoYzLFNt4/fQYtLMw== + dependencies: + "@algolia/cache-browser-local-storage" "4.10.2" + "@algolia/cache-common" "4.10.2" + "@algolia/cache-in-memory" "4.10.2" + "@algolia/client-account" "4.10.2" + "@algolia/client-analytics" "4.10.2" + "@algolia/client-common" "4.10.2" + "@algolia/client-personalization" "4.10.2" + "@algolia/client-search" "4.10.2" + "@algolia/logger-common" "4.10.2" + "@algolia/logger-console" "4.10.2" + "@algolia/requester-browser-xhr" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@algolia/requester-node-http" "4.10.2" + "@algolia/transporter" "4.10.2" + ally.js@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/ally.js/-/ally.js-1.4.1.tgz#9fb7e6ba58efac4ee9131cb29aa9ee3b540bcf1e" @@ -7809,6 +7957,11 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.5.tgz#51d81e4f1ccc8311a04f0c20121ea824377ea6d9" integrity sha512-QR0rh0YiPuxuDQ6+T9GAO/xWTExXpxIes1Nl9RykNGTnE1HJmkuEfxJH9cubjIOQZ/GH4qNBR4u8VSHaKiWs4g== +events@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + events@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" @@ -9518,6 +9671,11 @@ inquirer@^7.0.0: strip-ansi "^6.0.0" through "^2.3.6" +instantsearch.css@^7.4.5: + version "7.4.5" + resolved "https://registry.yarnpkg.com/instantsearch.css/-/instantsearch.css-7.4.5.tgz#2a521aa634329bf1680f79adf87c79d67669ec8d" + integrity sha512-iIGBYjCokU93DDB8kbeztKtlu4qVEyTg1xvS6iSO1YvqRwkIZgf0tmsl/GytsLdZhuw8j4wEaeYsCzNbeJ/zEQ== + internal-slot@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" @@ -13345,7 +13503,7 @@ react-easy-emoji@^1.2.0, react-easy-emoji@^1.4.0: lodash.assign "^4.0.8" string-replace-to-array "^1.0.1" -react-fast-compare@^3.1.1: +react-fast-compare@^3.0.0, react-fast-compare@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== @@ -13382,6 +13540,47 @@ react-i18next@^11.0.0: "@babel/runtime" "^7.3.1" html-parse-stringify2 "2.0.1" +react-instantsearch-core@^6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/react-instantsearch-core/-/react-instantsearch-core-6.11.2.tgz#5d70b04b02a91f2729e664156e6cd5203fae2c26" + integrity sha512-DSvS8XRESmhuBp9q+lhhsGqEKupWJioe95CCelUH0RoB8RtdC2vXRvBMDBEqTf7vG5K7b/dbbObBj5PnMqv5Sw== + dependencies: + "@babel/runtime" "^7.1.2" + algoliasearch-helper "^3.4.3" + prop-types "^15.6.2" + react-fast-compare "^3.0.0" + +react-instantsearch-dom@^6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/react-instantsearch-dom/-/react-instantsearch-dom-6.11.2.tgz#048e8934dfac472eb59a16fa0125fda0669334c6" + integrity sha512-n6d0E9rreGHIo88OuWHagabAwS9/6NQ/vxRivi0n1Zfqhkaota6QTh83Ay2HIBnio1kRuJgqJhLpO+85R4vzvQ== + dependencies: + "@babel/runtime" "^7.1.2" + algoliasearch-helper "^3.4.3" + classnames "^2.2.5" + prop-types "^15.6.2" + react-fast-compare "^3.0.0" + react-instantsearch-core "^6.11.2" + +react-instantsearch-native@^6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/react-instantsearch-native/-/react-instantsearch-native-6.11.2.tgz#4493e05f7efbd1cb6bd394eac568075d86bb200c" + integrity sha512-T4fXONNRXx5HkUVN2qIcZifIivuIG7vMNDsgGtKL3OM5+eUvu+jZYRdBOX0c2WY3S036jTRoFiweVgxYI1xIig== + dependencies: + "@babel/runtime" "^7.1.2" + algoliasearch ">= 3.27.1 < 5" + react-instantsearch-core "^6.11.2" + +react-instantsearch@^6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/react-instantsearch/-/react-instantsearch-6.11.2.tgz#5df882a9bbfd65552c50ebc3f2874df21662e1b6" + integrity sha512-SlB4MdT4kJx9upGh6enf0XJJJ6byGLt/09rCbdJDRTapTqfn85PCZ7LXBFapLU0BEnJHtGOWfdZMHnRQ0FET9w== + dependencies: + "@babel/runtime" "^7.1.2" + react-instantsearch-core "^6.11.2" + react-instantsearch-dom "^6.11.2" + react-instantsearch-native "^6.11.2" + "react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1: version "17.0.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" From 37cc5e6794f2a3b1cad74e478e17cc8b0a5ebe72 Mon Sep 17 00:00:00 2001 From: Alexandre Valsamou-Stanislawski Date: Wed, 15 Sep 2021 16:05:15 +0200 Subject: [PATCH 301/319] Utilise l'admin key pour la mise a jour des index algolia --- .github/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 89c2a12ed..51482d93a 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -69,7 +69,7 @@ jobs: run: yarn workspace mon-entreprise algolia:update env: ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} - ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_APP_ID }} + ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} ALGOLIA_SEARCH_KEY: ${{secrets.ALGOLIA_SEARCH_KEY}} ALGOLIA_INDEX_PREFIX: monentreprise-${{needs.deploy-context.outputs.env-name}}- - uses: actions/upload-artifact@v2 From 4bbd1475980016bdc5f55040c51d7a2feeb0d560 Mon Sep 17 00:00:00 2001 From: Alexandre Valsamou-Stanislawski Date: Wed, 8 Sep 2021 13:45:49 +0200 Subject: [PATCH 302/319] =?UTF-8?q?=F0=9F=96=8B=20Informer=20sur=20l'exist?= =?UTF-8?q?ence=20de=20monidenum=20pour=20avoir=20gratuitement=20son=20Kbi?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/locales/ui-en.yaml | 6 ++++ mon-entreprise/source/locales/ui-fr.yaml | 8 +++++ mon-entreprise/source/pages/Gérer/Home.tsx | 40 ++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 5ccd196e0..b9504a817 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -777,6 +777,12 @@ gérer: <0>Discover the hiring process <1>The list of things to do to make sure you don't forget anything when hiring a new employee + kbis: <0>How do I get a Kbis?<1>The Kbis is a record that proves the existence + of a commercial company. You can get the Kbis for your company using + monidenum.fr + kbis-autoentrepreneur: <0>How do I get a Kbis?<1>Auto-entrepreneurs + do not have a Kbis. They can however retrieve and present a K extract. + See the service-public website for more information. sécuritéSociale: <0>Understanding social security <1>What are social security contributions used for? Update on the social protection system enjoyed by all workers in France diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index 97ce35777..47cd90684 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -521,6 +521,14 @@ gérer: embaucher: <0>Découvrir les démarches d’embauche <1>La liste des choses à faire pour être sûr de ne rien oublier lors de l’embauche d’un nouveau salarié + kbis: <0>Récupérer un extrait de Kbis<1>Le Kbis est un document permettant + de justifier de l'enregistrement de l'entreprise au <2>RCS et de + prouver son existence légale. Ce document peut être récupéré gratuitement + pour votre entreprise via le site MonIdeNum. + kbis-autoentrepreneur: <0>Récupérer un extrait de Kbis?<1>Les + auto-entrepreneurs n'ont pas de Kbis. Ils peuvent cependant récupérer et + présenter un extrait K. Voir le site du service-public pour plus + d'informations. sécuritéSociale: <0>Comprendre la sécurité sociale <1>A quoi servent les cotisations sociales ? Le point sur le système de protection sociale dont bénéficient tous les travailleurs en France diff --git a/mon-entreprise/source/pages/Gérer/Home.tsx b/mon-entreprise/source/pages/Gérer/Home.tsx index 9c3b6a89a..3d94dae6a 100644 --- a/mon-entreprise/source/pages/Gérer/Home.tsx +++ b/mon-entreprise/source/pages/Gérer/Home.tsx @@ -276,6 +276,46 @@ export default function Gérer() {

    + {dirigeant === 'auto-entrepreneur' ? ( + + +

    Récupérer un extrait de Kbis?

    +

    + Les auto-entrepreneurs n'ont pas de Kbis. Ils peuvent + cependant récupérer et présenter un extrait K. Voir le site + du service-public pour plus d'informations. +

    +
    +
    + ) : ( + + +

    Récupérer un extrait de Kbis

    +

    + Le Kbis est un document permettant de justifier de + l'enregistrement de l'entreprise au{' '} + + RCS + {' '} + et de prouver son existence légale. Ce document peut être + récupéré gratuitement pour votre entreprise via le site + MonIdeNum. +

    +
    +
    + )}

    From 038ae38a079dff0c63b17371189ecd8bff362d35 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 22 Jun 2021 16:09:11 +0200 Subject: [PATCH 303/319] Ajoute un bloc DGFiP --- .../IndépendantExplanation.tsx | 6 +- ...nation.tsx => InstitutionsPartenaires.tsx} | 103 ++++++++++++------ mon-entreprise/source/locales/ui-en.yaml | 15 +-- mon-entreprise/source/locales/ui-fr.yaml | 8 ++ .../pages/Simulateurs/ArtisteAuteur.tsx | 2 +- .../source/static/images/logo-dgfip.svg | 1 + 6 files changed, 89 insertions(+), 46 deletions(-) rename mon-entreprise/source/components/simulationExplanation/{PLExplanation.tsx => InstitutionsPartenaires.tsx} (54%) create mode 100644 mon-entreprise/source/static/images/logo-dgfip.svg diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index ab7520df0..131af5d7b 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -17,7 +17,7 @@ import { useSelector } from 'react-redux' import { targetUnitSelector } from 'Selectors/simulationSelectors' import CotisationsForfaitaires from './IndépendantCotisationsForfaitaires' import CotisationsRégularisation from './IndépendantCotisationsRégularisation' -import PLExplanation from './PLExplanation' +import InstitutionsPartenaires from './InstitutionsPartenaires' import { DistributionSection } from './SalaryExplanation' export default function IndépendantExplanation() { @@ -32,9 +32,7 @@ export default function IndépendantExplanation() { - - - +

    Répartition du revenu

    diff --git a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx similarity index 54% rename from mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx rename to mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx index ba4465ae5..d3813b0f2 100644 --- a/mon-entreprise/source/components/simulationExplanation/PLExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx @@ -1,8 +1,9 @@ -import Value, { Condition } from 'Components/EngineValue' +import Value, { Condition, WhenNotApplicable } from 'Components/EngineValue' import { FromBottom } from 'Components/ui/animate' import Emoji from 'Components/utils/Emoji' import { useEngine } from 'Components/utils/EngineContext' import assuranceMaladieSrc from 'Images/assurance-maladie.svg' +import dgfipSrc from 'Images/logo-dgfip.svg' import * as logosSrc from 'Images/logos-caisses-retraite' import urssafSrc from 'Images/Urssaf.svg' import { DottedName } from 'modele-social' @@ -11,49 +12,60 @@ import { useSelector } from 'react-redux' import { targetUnitSelector } from 'Selectors/simulationSelectors' import styled from 'styled-components' -export default function PLExplanation() { +export default function InstitutionsPartenaires() { const unit = useSelector(targetUnitSelector) return (
    - - -

    Vos institutions partenaires

    -
    + +

    + + Vos institutions partenaires + +

    +
    + - -
    - - - -

    + + + + + + +

    + + + +

    + En tant que professionnel de santé conventionné, vous bénéficiez d'une prise en charge d'une partie de vos cotisations par l'Assurance Maladie. -

    -

    - {' '} - -

    -
    - -
    - -

    - {' '} + +

    +

    + {' '} + +

    +
    + +
    + +

    + Les montants indiqués ci-dessus sont calculés sans prendre en compte l'exonération de début d'activité ACRE -

    -
    -
    -
    + +

    + +
    ) } @@ -77,6 +89,28 @@ export function CotisationsUrssaf({ rule }: { rule: DottedName }) { ) } +export function ImpôtsDGFIP() { + const unit = useSelector(targetUnitSelector) + return ( + +
    + + + +

    + + La direction générale des finances publiques (DGFiP) est l'organisme + qui collecte l'impôt sur le revenu. + +

    +

    + +

    +
    +
    + ) +} + function CaisseRetraite() { const engine = useEngine() const unit = useSelector(targetUnitSelector) @@ -130,4 +164,5 @@ function CaisseRetraite() { const LogoImg = styled.img` padding: 1rem; height: 5rem; + max-width: 100%; ` diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index b9504a817..d120b07f8 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1630,13 +1630,14 @@ simulateurs: soutien: <0>Listening and support<1>An <2>initial listening and psychological support unit has been set up for company directors weakened by the crisis.<2><0>{emoji('📞')} 08 05 65 50 50 - pamc: <0><0>Your partner institutions<1><0><0><0><1>Contributions - collected by Urssaf, which are used to finance social security (health - insurance, family allowances, dependency - care).<2><0><1><2><0><0><0><1>As a contracted - health professional, you benefit from having part of your contributions - covered by the Assurance Maladie.<2><0> - <2> + institutions: + cpam: As a health professional under agreement, you benefit from a part of your + contributions being covered by the Health Insurance. + dgfip: The Directorate General of Public Finances (DGFiP) is the body that + collects income tax. + notice acre: The amounts indicated above are calculated without taking into + account the ACRE start-up exemption + titre: Your partner institutions inversionFail: >- The amount entered results in an impossible result. This is due to a threshold effect in the calculation of contributions. diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index 47cd90684..4d359ae4a 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -1204,6 +1204,14 @@ simulateurs: explanation: CNAPL: Elle recouvre les cotisations liées à votre retraite et au régime d'invalidité-décès. + institutions: + cpam: En tant que professionnel de santé conventionné, vous bénéficiez d'une + prise en charge d'une partie de vos cotisations par l'Assurance Maladie. + dgfip: La direction générale des finances publiques (DGFiP) est l'organisme qui + collecte l'impôt sur le revenu. + notice acre: Les montants indiqués ci-dessus sont calculés sans prendre en + compte l'exonération de début d'activité ACRE + titre: Vos institutions partenaires pamc: <0><0>Vos institutions partenaires<1><0><1><2><0><0><0><1>En tant que professionnel de santé conventionné, vous bénéficiez d'une prise en charge diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx index 9ab4ce8d4..ec1cfd75d 100644 --- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx @@ -3,7 +3,7 @@ import Value, { Condition } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' import Simulation from 'Components/Simulation' -import { CotisationsUrssaf } from 'Components/simulationExplanation/PLExplanation' +import { CotisationsUrssaf } from 'Components/simulationExplanation/InstitutionsPartenaires' import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import 'Components/TargetSelection.css' import { EngineContext, useEngine } from 'Components/utils/EngineContext' diff --git a/mon-entreprise/source/static/images/logo-dgfip.svg b/mon-entreprise/source/static/images/logo-dgfip.svg new file mode 100644 index 000000000..b0a9a66c3 --- /dev/null +++ b/mon-entreprise/source/static/images/logo-dgfip.svg @@ -0,0 +1 @@ + From 1cb84476bf27a7e980bc258f872f90b5ec50d603 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 14 Sep 2021 18:30:59 +0200 Subject: [PATCH 304/319] =?UTF-8?q?=F0=9F=96=8A=20Informe=20sur=20la=20pri?= =?UTF-8?q?se=20en=20compte=20de=20l'abattement=20IR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../simulationExplanation/InstitutionsPartenaires.tsx | 10 +++++++++- mon-entreprise/source/locales/ui-en.yaml | 5 +++-- mon-entreprise/source/locales/ui-fr.yaml | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx index d3813b0f2..7e0ca4cc3 100644 --- a/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx +++ b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx @@ -1,4 +1,8 @@ -import Value, { Condition, WhenNotApplicable } from 'Components/EngineValue' +import Value, { + Condition, + WhenApplicable, + WhenNotApplicable, +} from 'Components/EngineValue' import { FromBottom } from 'Components/ui/animate' import Emoji from 'Components/utils/Emoji' import { useEngine } from 'Components/utils/EngineContext' @@ -101,6 +105,10 @@ export function ImpôtsDGFIP() { La direction générale des finances publiques (DGFiP) est l'organisme qui collecte l'impôt sur le revenu. + + Le montant calculé prend en compte l'abattement du régime + micro-fiscal. +

    diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index d120b07f8..8a5b8b238 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1633,8 +1633,9 @@ simulateurs: institutions: cpam: As a health professional under agreement, you benefit from a part of your contributions being covered by the Health Insurance. - dgfip: The Directorate General of Public Finances (DGFiP) is the body that - collects income tax. + dgfip: The Direction générale des finances publiques (DGFiP) is the body that + collects income tax.<1>The amount calculated takes into account the + abatement of the micro-tax system. notice acre: The amounts indicated above are calculated without taking into account the ACRE start-up exemption titre: Your partner institutions diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index 4d359ae4a..1d5bd9ba4 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -1208,7 +1208,8 @@ simulateurs: cpam: En tant que professionnel de santé conventionné, vous bénéficiez d'une prise en charge d'une partie de vos cotisations par l'Assurance Maladie. dgfip: La direction générale des finances publiques (DGFiP) est l'organisme qui - collecte l'impôt sur le revenu. + collecte l'impôt sur le revenu.<1>Le montant calculé prend en compte + l'abattement du régime micro-fiscal. notice acre: Les montants indiqués ci-dessus sont calculés sans prendre en compte l'exonération de début d'activité ACRE titre: Vos institutions partenaires From 62c65a34a8de714dcab8ebc14bc61c3bc1defc2a Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 15 Sep 2021 12:09:50 +0200 Subject: [PATCH 305/319] =?UTF-8?q?=F0=9F=8E=A8=20Pr=C3=A9sentation=20des?= =?UTF-8?q?=20institutions=20sous=20forme=20de=20tableau?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InstitutionsPartenaires.tsx | 109 +++++++++++++----- 1 file changed, 80 insertions(+), 29 deletions(-) diff --git a/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx index 7e0ca4cc3..1533e15fd 100644 --- a/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx +++ b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx @@ -26,7 +26,7 @@ export default function InstitutionsPartenaires() { Vos institutions partenaires -

    + @@ -36,13 +36,13 @@ export default function InstitutionsPartenaires() { -
    - + - - + +

    En tant que professionnel de santé conventionné, vous @@ -58,9 +58,9 @@ export default function InstitutionsPartenaires() { expression="dirigeant . indépendant . PL . PAMC . participation CPAM" />

    -
    +
    -
    +

    @@ -77,19 +77,24 @@ export default function InstitutionsPartenaires() { export function CotisationsUrssaf({ rule }: { rule: DottedName }) { const unit = useSelector(targetUnitSelector) return ( -

    - - - + + + +

    - Les cotisations recouvrées par l'Urssaf, qui servent au financement de - la sécurité sociale (assurance maladie, allocations familiales, - dépendance) + + Les cotisations recouvrées par l'Urssaf, qui servent au financement de + la sécurité sociale (assurance maladie, allocations familiales, + dépendance). +

    -
    + ) } @@ -97,10 +102,10 @@ export function ImpôtsDGFIP() { const unit = useSelector(targetUnitSelector) return ( -
    - - - + + + +

    La direction générale des finances publiques (DGFiP) est l'organisme @@ -114,7 +119,7 @@ export function ImpôtsDGFIP() {

    -
    +
    ) } @@ -139,13 +144,13 @@ function CaisseRetraite() { const { description, références } = engine.getRule(dottedName).rawNode return ( -
    - + - - + +

    {description}{' '} @@ -161,7 +166,7 @@ function CaisseRetraite() { expression="dirigeant . indépendant . PL . cotisations caisse de retraite" />

    -
    +
    ) })} @@ -169,8 +174,54 @@ function CaisseRetraite() { ) } -const LogoImg = styled.img` - padding: 1rem; - height: 5rem; - max-width: 100%; +const InstitutionsTable = styled.div` + padding-left: 0; + padding-right: 0; +` + +const InstitutionLogo = styled.a` + img { + max-width: 100%; + } +` + +const InstitutionLine = styled.div` + display: flex; + flex-direction: row; + align-items: center; + padding: 1rem; + flex-wrap: wrap; + + &:not(:first-child) { + border-top: 1px solid var(--lighterColor); + } + + > ${InstitutionLogo} { + display: block; + width: 13ch; + text-align: center; + } + + > .ui__.notice { + flex: 1; + padding: 0 4rem 0 2rem; + margin: 0; + } + + > .ui__.lead { + font-weight: bold; + text-align: right; + } + + @media (max-width: 680px) { + > .ui__.lead { + flex-grow: 9; + } + + > .ui__.notice { + order: 3; + padding: 0; + min-width: 80vw; + } + } ` From 24302cbf68d44e97c9b251118d7295a3c9b7b19a Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 15 Sep 2021 12:31:48 +0200 Subject: [PATCH 306/319] =?UTF-8?q?=F0=9F=8E=A8=20Remonte=20le=20bloc=20co?= =?UTF-8?q?tisations=20sur=20le=20simulateur=20artiste-auteur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1723 --- .../InstitutionsPartenaires.tsx | 32 ++++++++++++- .../pages/Simulateurs/ArtisteAuteur.tsx | 47 ++----------------- .../images/logos-caisses-retraite/index.tsx | 1 + 3 files changed, 37 insertions(+), 43 deletions(-) diff --git a/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx index 1533e15fd..e6931cc92 100644 --- a/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx +++ b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx @@ -101,7 +101,7 @@ export function CotisationsUrssaf({ rule }: { rule: DottedName }) { export function ImpôtsDGFIP() { const unit = useSelector(targetUnitSelector) return ( - + @@ -174,6 +174,36 @@ function CaisseRetraite() { ) } +export function InstitutionsPartenairesArtisteAuteur() { + const unit = useSelector(targetUnitSelector) + const { description: descriptionIRCEC } = useEngine().getRule( + 'artiste-auteur . cotisations . IRCEC' + ).rawNode + return ( +
    +

    Vos cotisations

    + + + + + + + +

    {descriptionIRCEC}

    +

    + +

    +
    +
    +
    +
    + ) +} + const InstitutionsTable = styled.div` padding-left: 0; padding-right: 0; diff --git a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx index ec1cfd75d..762fffdec 100644 --- a/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/ArtisteAuteur.tsx @@ -1,17 +1,15 @@ import { DistributionBranch } from 'Components/Distribution' -import Value, { Condition } from 'Components/EngineValue' +import { Condition } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' import Simulation from 'Components/Simulation' -import { CotisationsUrssaf } from 'Components/simulationExplanation/InstitutionsPartenaires' +import { InstitutionsPartenairesArtisteAuteur } from 'Components/simulationExplanation/InstitutionsPartenaires' import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import 'Components/TargetSelection.css' -import { EngineContext, useEngine } from 'Components/utils/EngineContext' +import { EngineContext } from 'Components/utils/EngineContext' import useSimulationConfig from 'Components/utils/useSimulationConfig' -import ircecSrc from 'Images/logos-caisses-retraite/ircec.jpg' import { useContext } from 'react' import { Trans } from 'react-i18next' -import styled from 'styled-components' import config from './configs/artiste-auteur.yaml' export default function ArtisteAuteur() { @@ -28,6 +26,8 @@ export default function ArtisteAuteur() { + + ) @@ -36,7 +36,6 @@ export default function ArtisteAuteur() { function CotisationsResult() { return ( <> - @@ -44,42 +43,6 @@ function CotisationsResult() { ) } -function CotisationsParOrganisme() { - const cotisIRCEC = useEngine().evaluate( - 'artiste-auteur . cotisations . IRCEC' - ) - const { description: descriptionIRCEC } = useEngine().getRule( - 'artiste-auteur . cotisations . IRCEC' - ).rawNode - return ( -
    -

    Vos institutions partenaires

    -
    - - {cotisIRCEC.nodeValue ? ( -
    - - - -

    {descriptionIRCEC}

    -

    - -

    -
    - ) : null} -
    -
    - ) -} - -const LogoImg = styled.img` - padding: 1rem; - height: 5rem; -` - const branches = [ { dottedName: 'artiste-auteur . cotisations . vieillesse', diff --git a/mon-entreprise/source/static/images/logos-caisses-retraite/index.tsx b/mon-entreprise/source/static/images/logos-caisses-retraite/index.tsx index 1edf72440..d7b06cbf4 100644 --- a/mon-entreprise/source/static/images/logos-caisses-retraite/index.tsx +++ b/mon-entreprise/source/static/images/logos-caisses-retraite/index.tsx @@ -4,3 +4,4 @@ export { default as CARMF } from './carmf.png' export { default as CARCDSF } from './carcdsf.jpg' export { default as CNBF } from './cnbf.png' export { default as CAVEC } from './cavec.jpg' +export { default as IRCEC } from './ircec.jpg' From 7b1ef6a4a4a409ba00c05ec051d71cf5c8eb94eb Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Wed, 15 Sep 2021 12:45:35 +0200 Subject: [PATCH 307/319] =?UTF-8?q?=F0=9F=96=8A=20Institutions=20partenair?= =?UTF-8?q?es=20sur=20le=20simulateur=20auto-entrepreneur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InstitutionsPartenaires.tsx | 37 +++++++++++++++---- mon-entreprise/source/locales/ui-en.yaml | 6 ++- mon-entreprise/source/locales/ui-fr.yaml | 7 +++- .../pages/Simulateurs/AutoEntrepreneur.tsx | 4 ++ 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx index e6931cc92..67e3d2bb3 100644 --- a/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx +++ b/mon-entreprise/source/components/simulationExplanation/InstitutionsPartenaires.tsx @@ -26,7 +26,7 @@ export default function InstitutionsPartenaires() { Vos institutions partenaires - + @@ -109,11 +109,14 @@ export function ImpôtsDGFIP() {

    La direction générale des finances publiques (DGFiP) est l'organisme - qui collecte l'impôt sur le revenu. - - Le montant calculé prend en compte l'abattement du régime - micro-fiscal. - + qui collecte l'impôt sur le revenu.{' '} + + Le montant calculé{' '} + + prend en compte l'abattement du régime micro-fiscal + + . +

    @@ -182,7 +185,7 @@ export function InstitutionsPartenairesArtisteAuteur() { return (

    Vos cotisations

    - + @@ -204,7 +207,25 @@ export function InstitutionsPartenairesArtisteAuteur() { ) } -const InstitutionsTable = styled.div` +export function InstitutionsPartenairesAutoEntrepreneur() { + return ( +
    + +

    + + Vos institutions partenaires + +

    + + + + +
    +
    + ) +} + +const InstitutionsTable = styled.div.attrs({ className: 'ui__ card' })` padding-left: 0; padding-right: 0; ` diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 8a5b8b238..9318db43d 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1634,11 +1634,13 @@ simulateurs: cpam: As a health professional under agreement, you benefit from a part of your contributions being covered by the Health Insurance. dgfip: The Direction générale des finances publiques (DGFiP) is the body that - collects income tax.<1>The amount calculated takes into account the - abatement of the micro-tax system. + collects income tax. <2>The amount calculated <2>takes into account the + abatement of the micro-tax system. notice acre: The amounts indicated above are calculated without taking into account the ACRE start-up exemption titre: Your partner institutions + urssaf: The contributions collected by the Urssaf, which are used to finance + social security (health insurance, family allowances, dependence). inversionFail: >- The amount entered results in an impossible result. This is due to a threshold effect in the calculation of contributions. diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index 1d5bd9ba4..bcabbd011 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -1208,11 +1208,14 @@ simulateurs: cpam: En tant que professionnel de santé conventionné, vous bénéficiez d'une prise en charge d'une partie de vos cotisations par l'Assurance Maladie. dgfip: La direction générale des finances publiques (DGFiP) est l'organisme qui - collecte l'impôt sur le revenu.<1>Le montant calculé prend en compte - l'abattement du régime micro-fiscal. + collecte l'impôt sur le revenu. <2>Le montant calculé <2>prend en compte + l'abattement du régime micro-fiscal. notice acre: Les montants indiqués ci-dessus sont calculés sans prendre en compte l'exonération de début d'activité ACRE titre: Vos institutions partenaires + urssaf: Les cotisations recouvrées par l'Urssaf, qui servent au financement de + la sécurité sociale (assurance maladie, allocations familiales, + dépendance). pamc: <0><0>Vos institutions partenaires<1><0><1><2><0><0><0><1>En tant que professionnel de santé conventionné, vous bénéficiez d'une prise en charge diff --git a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx index a9b810d76..22fb504c3 100644 --- a/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx +++ b/mon-entreprise/source/pages/Simulateurs/AutoEntrepreneur.tsx @@ -3,6 +3,9 @@ import { WhenAlreadyDefined } from 'Components/EngineValue' import PeriodSwitch from 'Components/PeriodSwitch' import SimulateurWarning from 'Components/SimulateurWarning' import Simulation from 'Components/Simulation' +import InstitutionsPartenaires, { + InstitutionsPartenairesAutoEntrepreneur, +} from 'Components/simulationExplanation/InstitutionsPartenaires' import { SimulationGoal, SimulationGoals } from 'Components/SimulationGoals' import StackedBarChart from 'Components/StackedBarChart' import { ThemeColorsContext } from 'Components/utils/colors' @@ -64,6 +67,7 @@ function Explanation() { }, ]} /> +
    ) } From a311e224b4b66f400fb716d0dc6c76377facbd19 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 15 Sep 2021 18:05:01 +0200 Subject: [PATCH 308/319] :green_heart: corrige le test cypress sur la recherche --- mon-entreprise/cypress/integration/mon-entreprise/recherche.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mon-entreprise/cypress/integration/mon-entreprise/recherche.js b/mon-entreprise/cypress/integration/mon-entreprise/recherche.js index 55734fcf6..7ba1a3357 100644 --- a/mon-entreprise/cypress/integration/mon-entreprise/recherche.js +++ b/mon-entreprise/cypress/integration/mon-entreprise/recherche.js @@ -24,6 +24,6 @@ describe('Recherche globales', () => { cy.wait(100) cy.get(simulateursPath).children().should('have.length', 1) - cy.get(reglesPath).children().should('have.length', 1) + cy.get(reglesPath).children().should('have.length', 2) }) }) From 4ee0d7852e91f05e2af62f7d86574ac87947c0d9 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 15 Sep 2021 17:24:54 +0200 Subject: [PATCH 309/319] =?UTF-8?q?:bug:=20R=C3=A9pare=20l'affichage=20des?= =?UTF-8?q?=20r=C3=A8gles=20remplac=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :art: Ajoute un espacement au dessus du bloc cotiz forfaitaire indépendant --- .../IndépendantExplanation.tsx | 14 ++++++++------ .../ui-react/source/mecanisms/Replacement.tsx | 13 ++----------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx index 131af5d7b..c015acd28 100644 --- a/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/IndépendantExplanation.tsx @@ -26,12 +26,14 @@ export default function IndépendantExplanation() { return ( <> - - - - - - +
    + + + + + + +
    diff --git a/publicodes/ui-react/source/mecanisms/Replacement.tsx b/publicodes/ui-react/source/mecanisms/Replacement.tsx index 339640e33..c1b88e7aa 100644 --- a/publicodes/ui-react/source/mecanisms/Replacement.tsx +++ b/publicodes/ui-react/source/mecanisms/Replacement.tsx @@ -3,8 +3,8 @@ import { useState } from 'react' import emoji from 'react-easy-emoji' import Variations from './Variations' import Overlay from '../Overlay' +import Explanation from '../Explanation' import { RuleLinkWithContext } from '../RuleLink' -import { NodeValuePointer, UnfoldIsEnabledContext } from './common' import { EvaluatedNode } from 'publicodes/source/AST/types' export default function Replacement(node: VariationNode & EvaluatedNode) { @@ -18,16 +18,7 @@ export default function Replacement(node: VariationNode & EvaluatedNode) { const [displayReplacements, changeDisplayReplacement] = useState(false) return ( - -   - {applicableReplacement && ( - - - - )} +   ) diff --git a/mon-entreprise/source/components/MoreInfosOnUs.tsx b/mon-entreprise/source/components/MoreInfosOnUs.tsx index 514063bdf..d9426d57c 100644 --- a/mon-entreprise/source/components/MoreInfosOnUs.tsx +++ b/mon-entreprise/source/components/MoreInfosOnUs.tsx @@ -1,8 +1,8 @@ import { useContext } from 'react' -import emoji from 'react-easy-emoji' import { useTranslation } from 'react-i18next' import { Link, useLocation } from 'react-router-dom' import { icons } from './ui/SocialIcon' +import Emoji from './utils/Emoji' import { SitePathsContext } from './utils/SitePathsContext' export default function MoreInfosOnUs() { @@ -27,7 +27,9 @@ export default function MoreInfosOnUs() {
    {!pathname.startsWith(sitePaths.nouveautés) && ( -
    {emoji('✨')}
    +
    + +

    Les nouveautés

    Qu'avons-nous mis en production ces derniers mois ? @@ -37,7 +39,9 @@ export default function MoreInfosOnUs() { )} {!pathname.startsWith(sitePaths.stats) && ( -

    {emoji('📊')}
    +
    + +

    Les statistiques

    Quel est notre impact ?

    Découvrir
    @@ -45,7 +49,9 @@ export default function MoreInfosOnUs() { )} {!pathname.startsWith(sitePaths.budget) && ( -
    {emoji('💶')}
    +
    + +

    Le budget

    Quelles sont nos ressources et comment sont-elles employées ? diff --git a/mon-entreprise/source/components/NewsletterRegister.tsx b/mon-entreprise/source/components/NewsletterRegister.tsx index 13dac054e..46d3ff5c9 100644 --- a/mon-entreprise/source/components/NewsletterRegister.tsx +++ b/mon-entreprise/source/components/NewsletterRegister.tsx @@ -1,8 +1,8 @@ import { usePersistingState } from 'Components/utils/persistState' import { useRef, useState } from 'react' -import emoji from 'react-easy-emoji' import { Trans, useTranslation } from 'react-i18next' import { FromBottom } from './ui/animate' +import Emoji from './utils/Emoji' // We don't want to load the full sendinblue iframe, so we reimplement a simple // logic to the a HTTP Post request to their URL with the email data. @@ -46,7 +46,7 @@ export default function NewsletterRegister() { `} >

    - {emoji('🎉')}{' '} + {' '} Votre inscription est confirmée ! diff --git a/mon-entreprise/source/components/Notifications.tsx b/mon-entreprise/source/components/Notifications.tsx index ca12570e8..4274156b0 100644 --- a/mon-entreprise/source/components/Notifications.tsx +++ b/mon-entreprise/source/components/Notifications.tsx @@ -2,13 +2,13 @@ import { hideNotification } from 'Actions/actions' import { useEngine, useInversionFail } from 'Components/utils/EngineContext' import { DottedName } from 'modele-social' import Engine, { RuleNode } from 'publicodes' -import emoji from 'react-easy-emoji' import { Trans, useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' import { RootState } from 'Reducers/rootReducer' import './Notifications.css' import RuleLink from './RuleLink' import { FromTop } from './ui/animate' +import Emoji from './utils/Emoji' import { Markdown } from './utils/markdown' import { ScrollToElement } from './utils/Scroll' @@ -68,7 +68,7 @@ export default function Notifications() {
  • - {emoji(sévérité == 'avertissement' ? '⚠️' : '💁🏻')} +
    {' '} {résumé && ( diff --git a/mon-entreprise/source/components/Route404.tsx b/mon-entreprise/source/components/Route404.tsx index 2e1f19596..14765afa7 100644 --- a/mon-entreprise/source/components/Route404.tsx +++ b/mon-entreprise/source/components/Route404.tsx @@ -1,7 +1,7 @@ import image from 'Images/map-directions.png' -import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { Link } from 'react-router-dom' +import Emoji from './utils/Emoji' export default () => (
    ( Cette page n'existe pas ou n'existe plus - {emoji(' 🙅')} +

    {/* TODO: credits for the image to add: https://thenounproject.com/term/treasure-map/96666/ */} diff --git a/mon-entreprise/source/components/SchemeComparaison.tsx b/mon-entreprise/source/components/SchemeComparaison.tsx index b42fa2f27..f1d3768ac 100644 --- a/mon-entreprise/source/components/SchemeComparaison.tsx +++ b/mon-entreprise/source/components/SchemeComparaison.tsx @@ -9,7 +9,6 @@ import Value from 'Components/EngineValue' import InfoBulle from 'Components/ui/InfoBulle' import revenusSVG from 'Images/revenus.svg' import { useCallback, useMemo, useState } from 'react' -import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { useSelector } from 'react-redux' import { situationSelector } from 'Selectors/simulationSelectors' @@ -19,6 +18,7 @@ import PeriodSwitch from './PeriodSwitch' import './SchemeComparaison.css' import { SimulationGoal, SimulationGoals } from './SimulationGoals' import { FromBottom } from './ui/animate' +import Emoji from './utils/Emoji' import { useEngine } from './utils/EngineContext' import useSimulationConfig from './utils/useSimulationConfig' @@ -86,7 +86,7 @@ export default function SchemeComparaison({ })} >

    - {emoji('☂')} Assimilé salarié + Assimilé salarié Le régime tout compris @@ -94,7 +94,7 @@ export default function SchemeComparaison({

    - {emoji('👩‍🔧')}{' '} + {' '} {hideAssimiléSalarié ? ( Entreprise Individuelle ) : ( @@ -107,7 +107,7 @@ export default function SchemeComparaison({

    - {emoji('🚶‍♂️')} Auto-entrepreneur + Auto-entrepreneur Pour commencer sans risques diff --git a/mon-entreprise/source/components/TargetSelection.tsx b/mon-entreprise/source/components/TargetSelection.tsx index 5beb4f61d..0e6e28622 100644 --- a/mon-entreprise/source/components/TargetSelection.tsx +++ b/mon-entreprise/source/components/TargetSelection.tsx @@ -14,7 +14,6 @@ import { DottedName } from 'modele-social' import { Names } from 'modele-social/dist/names' import { EvaluatedNode, formatValue, reduceAST, RuleNode } from 'publicodes' import { Fragment, useCallback, useContext, useState } from 'react' -import emoji from 'react-easy-emoji' import { Trans, useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' import { useLocation } from 'react-router-dom' @@ -27,6 +26,7 @@ import InputSuggestions from './conversation/InputSuggestions' import CurrencyInput from './CurrencyInput/CurrencyInput' import './TargetSelection.css' import { Appear, FromTop } from './ui/animate' +import Emoji from './utils/Emoji' export default function TargetSelection({ showPeriodSwitch = true }) { const objectifs = useSelector( @@ -48,7 +48,7 @@ export default function TargetSelection({ showPeriodSwitch = true }) {
    {nom && (

    - {!!icône && emoji(icône)} {nom} + {nom}

    )}
    @@ -263,7 +263,7 @@ function TitreRestaurant() { unit={targetUnit} /> {' '} - en titres-restaurant {emoji(' 🍽')} + en titres-restaurant

    @@ -307,7 +307,7 @@ function AidesGlimpse() { unit={targetUnit} />
    {' '} - d'aides {emoji(aides.rawNode.icônes ?? '')} + d'aides
    diff --git a/mon-entreprise/source/components/conversation/AnswerList.tsx b/mon-entreprise/source/components/conversation/AnswerList.tsx index 8674def27..5f1ab9d26 100644 --- a/mon-entreprise/source/components/conversation/AnswerList.tsx +++ b/mon-entreprise/source/components/conversation/AnswerList.tsx @@ -3,12 +3,12 @@ import Overlay from 'Components/Overlay' import { useEngine } from 'Components/utils/EngineContext' import { useNextQuestions } from 'Components/utils/useNextQuestion' import { EvaluatedNode, formatValue } from 'publicodes' -import emoji from 'react-easy-emoji' import { Trans, useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' import { DottedName } from 'modele-social' import { situationSelector } from 'Selectors/simulationSelectors' import './AnswerList.css' +import Emoji from 'Components/utils/Emoji' type AnswerListProps = { onClose: () => void @@ -30,10 +30,10 @@ export default function AnswerList({ onClose }: AnswerListProps) { {!!answeredQuestions.length && ( <>

    - {emoji('📋 ')} + Mes réponses - {emoji('🗑')}{' '} + {' '} ) } @@ -62,7 +62,7 @@ export function Explicable({ children }: { children: React.ReactNode }) { } `} > - {emoji('ℹ️')} + ) diff --git a/mon-entreprise/source/components/conversation/Question.tsx b/mon-entreprise/source/components/conversation/Question.tsx index 78ca45dd6..14363db2f 100644 --- a/mon-entreprise/source/components/conversation/Question.tsx +++ b/mon-entreprise/source/components/conversation/Question.tsx @@ -1,5 +1,6 @@ import classnames from 'classnames' import { useDebounce } from 'Components/utils' +import Emoji from 'Components/utils/Emoji' import { Markdown } from 'Components/utils/markdown' import { DottedName } from 'modele-social' import { EvaluatedNode, Rule, RuleNode, serializeEvaluation } from 'publicodes' @@ -11,7 +12,6 @@ import { useEffect, useState, } from 'react' -import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { Explicable } from './Explicable' import { binaryQuestion, InputProps } from './RuleInput' @@ -260,7 +260,12 @@ export function RadioLabelContent({ checked={selected} /> - {icônes && <>{emoji(icônes)} } + {icônes && ( + <> + +   + + )} {label} diff --git a/mon-entreprise/source/components/layout/Footer/Footer.tsx b/mon-entreprise/source/components/layout/Footer/Footer.tsx index f1d19df45..85fbaa534 100644 --- a/mon-entreprise/source/components/layout/Footer/Footer.tsx +++ b/mon-entreprise/source/components/layout/Footer/Footer.tsx @@ -5,7 +5,6 @@ import SocialIcon from 'Components/ui/SocialIcon' import Emoji from 'Components/utils/Emoji' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext } from 'react' -import emoji from 'react-easy-emoji' import { Helmet } from 'react-helmet' import { Trans, useTranslation } from 'react-i18next' import { Link, useLocation } from 'react-router-dom' @@ -118,9 +117,13 @@ export default function Footer() {
  • {hrefLang === 'fr' ? ( - <>Passer en français {emoji('🇫🇷')} + <> + Passer en français + ) : hrefLang === 'en' ? ( - <>Switch to English {emoji('🇬🇧')} + <> + Switch to English + ) : ( hrefLang )} diff --git a/mon-entreprise/source/components/layout/NewsBanner.tsx b/mon-entreprise/source/components/layout/NewsBanner.tsx index f5f9f5749..7d309da27 100644 --- a/mon-entreprise/source/components/layout/NewsBanner.tsx +++ b/mon-entreprise/source/components/layout/NewsBanner.tsx @@ -1,7 +1,7 @@ import { useLocalStorage, writeStorage } from '@rehooks/local-storage' +import Emoji from 'Components/utils/Emoji' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext } from 'react' -import emoji from 'react-easy-emoji' import { useTranslation } from 'react-i18next' import { Link } from 'react-router-dom' import lastRelease from '../../data/last-release.json' @@ -32,7 +32,8 @@ export default function NewsBanner() { return showBanner ? (
    - {emoji('✨')} Découvrez les nouveautés {determinant(lastRelease.name)} + Découvrez les nouveautés{' '} + {determinant(lastRelease.name)} {lastRelease.name.toLowerCase()} diff --git a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx index 40c360bbf..805ac039d 100644 --- a/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx +++ b/mon-entreprise/source/components/simulationExplanation/SalaryExplanation.tsx @@ -3,9 +3,9 @@ import PaySlip from 'Components/PaySlip' import StackedBarChart from 'Components/StackedBarChart' import { FromTop } from 'Components/ui/animate' import { ThemeColorsContext } from 'Components/utils/colors' +import Emoji from 'Components/utils/Emoji' import { useInversionFail } from 'Components/utils/EngineContext' import { useContext, useRef } from 'react' -import emoji from 'react-easy-emoji' import { Trans, useTranslation } from 'react-i18next' export default function SalaryExplanation() { @@ -85,7 +85,7 @@ function RevenueRepartitionSection(props: { onSeePayslip: () => void }) { className="ui__ small simple button print-display-none" onClick={props.onSeePayslip} > - {emoji('📊')} Voir la fiche de paie + Voir la fiche de paie

    - {emoji('🚩 ')} + Avant de commencer... diff --git a/mon-entreprise/source/components/utils/Emoji.tsx b/mon-entreprise/source/components/utils/Emoji.tsx index 73ec4d765..37358f454 100644 --- a/mon-entreprise/source/components/utils/Emoji.tsx +++ b/mon-entreprise/source/components/utils/Emoji.tsx @@ -1,8 +1,28 @@ import emojiFn from 'react-easy-emoji' +import { useTranslation } from 'react-i18next' type PropType = { - emoji: string + emoji: string | undefined } +// This custom component has several advantages over the direct use of the +// `emojiFn` provided by `react-easy-emoji` : +// - allow to configure the URL to self host twemoji images in production +// - using a real React component works better with the translation scripts export default function Emoji({ emoji }: PropType) { - return emojiFn(emoji) + const language = useTranslation().i18n.language + + const siteUrl = + language === 'fr' ? process.env.FR_BASE_URL : process.env.EN_BASE_URL + if (!emoji) { + return null + } + return emojiFn( + emoji, + process.env.NODE_ENV === 'production' + ? { + baseUrl: siteUrl + '/twemoji/2/', + ext: '.png', + } + : ({} as any) + ) } diff --git a/mon-entreprise/source/components/utils/markdown.tsx b/mon-entreprise/source/components/utils/markdown.tsx index e235b5883..a7bcd2ef3 100644 --- a/mon-entreprise/source/components/utils/markdown.tsx +++ b/mon-entreprise/source/components/utils/markdown.tsx @@ -1,9 +1,9 @@ -import React, { Suspense, useContext, useEffect } from 'react' -import emoji from 'react-easy-emoji' +import React, { useContext, useEffect } from 'react' import ReactMarkdown, { ReactMarkdownProps } from 'react-markdown' import { useLocation } from 'react-router-dom' import { HashLink as Link } from 'react-router-hash-link' import { SiteNameContext } from '../../Provider' +import Emoji from './Emoji' const internalURLs = { 'mon-entreprise.fr': 'mon-entreprise', @@ -57,7 +57,7 @@ export function LinkRenderer({ ) } const TextRenderer = ({ children }: { children: string }) => ( - <>{emoji(children)} + ) type MarkdownProps = ReactMarkdownProps & { @@ -86,7 +86,7 @@ const CodeBlock = ({ target="_blank" css="position: absolute; bottom: 5px; right: 10px; color: white !important;" > - {emoji('⚡')} Lancer le calcul + Lancer le calcul )}

  • diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index 9318db43d..c27b517a1 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -777,12 +777,12 @@ gérer: <0>Discover the hiring process <1>The list of things to do to make sure you don't forget anything when hiring a new employee - kbis: <0>How do I get a Kbis?<1>The Kbis is a record that proves the existence - of a commercial company. You can get the Kbis for your company using - monidenum.fr - kbis-autoentrepreneur: <0>How do I get a Kbis?<1>Auto-entrepreneurs - do not have a Kbis. They can however retrieve and present a K extract. - See the service-public website for more information. + kbis: <0>How do I get a Kbis?<1>The Kbis is a record that proves the + existence of a commercial company. You can get the Kbis for your company + using monidenum.fr + kbis-autoentrepreneur: <0>How do I get a Kbis?<1>Auto-entrepreneurs do not + have a Kbis. They can however retrieve and present a K extract. See the + service-public website for more information. sécuritéSociale: <0>Understanding social security <1>What are social security contributions used for? Update on the social protection system enjoyed by all workers in France @@ -923,53 +923,50 @@ pages: scheme (in french). dévelopeurs: bibliothèque: "<0>Integrate our calculation library<1>If you think that your - site or service would benefit from displaying salary calculations, for - example switching from gross salary to net salary, good news: all the - contribution and tax calculations behind my-company.fr are free and easily + website or service would benefit from displaying salary calculations, for + example to switch from gross salary to net salary, good news: all the tax + and contribution calculations behind mon-entreprise.fr are free and easily reusable thanks to the <2>NPM publicodes library.<2>How to use this library?<3>All our calculation rules are written in `publicodes`, - a declarative language developed by beta.gouv.fr and Urssaf to encode + a declarative language developed by beta.gouv.fr and the Urssaf to encode algorithms of public interest. <2>Learn more about publicodes<4>To - perform your own calculations, you need to install the publicodes + perform your own calculations, you must install the publicodes interpreter, download the rules used on my-company, call the evaluation function.<5>Installation<6><0>npm install --save publicodes - social-system<7><0> The following dependencies are also needed - for now, but will be made optional in a future version of the publicodes - package.<8><0>npm install --save react react-router-dom - react-router-hash-link<9>For more details on the installation, - please refer to the <2>dedicated documentation.<10>Start the - calculation<11>All you have to do is set up the engine with the rules - in the `social-system' package, and call the `evaluate' function on the - rule you want the value of. Here is an example for the gross / net - calculation<12><0><13>Setting up the calculation<14>As - you will have seen in the previous example, the recipe for a calculation - is simple: input variables (gross salary), one or more output variables - (net salary).<15>However, the calculation can be parameterized with - all the possibilities allowed in the legislation.<16>All these - variables are listed and explained in the <2>online documentation. - This documentation is auto-generated from the publicodes rule files, so it - is constantly updated.<17>Let's run a calculation closer to a - payslip: here is a description of the input situation annotated with links - to the corresponding pages of the documentation :<18><0> An - <3>executive earning <7>3,400€ gross, who benefits from - <11>restaurant vouchers and works in a company with <15>22 - employees.<19>Here is the calculation for this more complete - example:<20><0><21><0>Note that in the previous example - we have to specify the transport payment rate ourselves.<22>Whereas - in the <2>employee simulator, you only have to fill in the + modele-social<7>For more details on the installation, please refer + to the <2>dedicated documentation<8>Launch the + calculation<9>All you have to do is set up the engine with the rules + from the `social-modele` package and call the `evaluate` function on the + rule you want the value of. Here is an example for the gross/net + calculation<10><0><11>Setting up the calculation<12>As + you can see in the previous example, the recipe for a calculation is + simple: input variables (gross salary), one or more output variables (net + salary).<13>The calculation is however configurable with all the + possibilities allowed in the legislation.<14>All these variables are + listed and explained in the <2>online documentation. This + documentation is auto-generated from the publicode rules files, so it is + constantly updated.<15>Let's run a calculation closer to a pay slip: + here is a description of the input situation with links to the + corresponding pages in the documentation:<16><0> An <3>executive + earning <7>€3,400 gross, who receives <11>meal vouchers and works + in a company with <15>22 employees.<17>Here is what the + calculation looks like for this more complete + example:<18><0><19><0>Note that in the previous example + we have to specify the rate of transport payment ourselves.<20>In the + <2>employee simulator, however, you only have to enter the municipality and the corresponding rate is automatically determined. This - is intentional: to keep the library (and the site) light, we use two - online APIs. The<4>Geo - communes API to switch from the commune name - to the commune code. Then the<7>Transport Pay API, developed and + is deliberate: to keep the library (and the site) light, we use two online + APIs. The<4>Geo - communes API to go from the commune name to the + commune code. Then the<7>Transport Payment API, developed and maintained by us, which is not documented but its use is very simple and - understandable <10>in this React component that calls it, a component - that also uses the common API.<23>Making economic graphics{emoji(' - 📈')}<24>It is also possible to use the library for economic or - political analysis calculations. Here, labour prices and net wages are - plotted against gross wages.<25>One can see the progressiveness of - the total wage, which is in percent lower for a minimum wage than for a - high income. In other words, high earners pay part of the social security - contributions of low earners.<26><0>" + understandable <10>in this React component that calls it, component + that also calls the common API.<21>Making economic graphs + <1><22>It is also possible to use the library for economic or + political analysis calculations. Here, we plot the price of labor and the + net salary as a function of the gross.<23>We can see the + progressivity of the total wage, which is in percent lower for a minimum + wage than for a high income. In other words, high earners pay part of the + social contributions of low earners.<24><0>" développeurs: choice: github: <0>Contribute to GitHub<1>All our tools are open and publicly @@ -1733,12 +1730,12 @@ une de ces conditions: one of these applies à: to économieCollaborative: accueil: - contenu: <0> You have revenues from online platforms (Airbnb, Abritel, Drivy, - Blablacar, Leboncoin, etc.)? You must report them in most cases. However, - it can be difficult to find your way around. <1>Follow this guide to - find out in a few clicks how to be in good standing. <2>From 2020 - onwards, these revenues will be automatically reported by the platforms to - the tax authorities and Urssaf. + contenu: <0>Do you have income from <2>online platforms (Airbnb, Abritel, + Drivy, Blablacar, Leboncoin, etc.)? You must declare them in most cases. + However, it can be difficult to find your way around + <5><0>.<1>Follow this guide to find out in a few clicks how to + be in order.<2>From 2020, these revenues will be automatically + communicated by the platforms to the tax authorities and the Urssaf. question: What types of activity did you undertake? réassurance: "PS: this tool is only there to inform you, no data will be transmitted to the administrations" diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index bcabbd011..e349a6aa9 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -693,13 +693,13 @@ pages: par nos soins, qui n'est pas documenté mais son utilisation est très simple et compréhensible <10>dans ce composant React qui l'appelle, composant qui fait aussi appel à l'API commune.<21>Faire des - graphiques économiques{emoji(' 📈')}<22>Il est aussi possible - d'utiliser la bibliothèque pour des calculs d'analyse économique ou - politique. Ici, on trace le prix du travail et le salaire net en fonction - du brut.<23>On peut constater la progressivité du salaire total, qui - est en pourcent plus faible pour un SMIC que pour un haut revenu. - Autrement dit, les hauts salaires paient une partie des cotisations - sociales des bas salaires.<24><0>" + graphiques économiques <1><22>Il est aussi possible d'utiliser la + bibliothèque pour des calculs d'analyse économique ou politique. Ici, on + trace le prix du travail et le salaire net en fonction du brut.<23>On + peut constater la progressivité du salaire total, qui est en pourcent plus + faible pour un SMIC que pour un haut revenu. Autrement dit, les hauts + salaires paient une partie des cotisations sociales des bas + salaires.<24><0>" développeurs: choice: github: <0>Contribuer sur GitHub<1>Tous nos outils sont ouverts et @@ -1304,7 +1304,7 @@ trouver: contenu: <0>Vous avez des revenus issus des <2>plateformes en ligne (Airbnb, Abritel, Drivy, Blablacar, Leboncoin, etc.) ? Vous devez les déclarer dans la plupart des cas. Cependant, il peut être difficile de s'y retrouver - <4>{emoji('🤔')}.<1>Suivez ce guide pour savoir en quelques clics + <5><0>.<1>Suivez ce guide pour savoir en quelques clics comment être en règle.<2>À partir de 2020, ces revenus seront communiqués automatiquement par les plateformes à l’administration fiscale et à l’Urssaf. diff --git a/mon-entreprise/source/pages/Budget/Budget.tsx b/mon-entreprise/source/pages/Budget/Budget.tsx index e655be0e1..62add1c08 100644 --- a/mon-entreprise/source/pages/Budget/Budget.tsx +++ b/mon-entreprise/source/pages/Budget/Budget.tsx @@ -1,10 +1,10 @@ import MoreInfosOnUs from 'Components/MoreInfosOnUs' +import Emoji from 'Components/utils/Emoji' import { Markdown } from 'Components/utils/markdown' import { ScrollToTop } from 'Components/utils/Scroll' import { formatValue } from 'publicodes' import { sum, uniq } from 'ramda' import { useState } from 'react' -import emoji from 'react-easy-emoji' import { Helmet } from 'react-helmet' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -46,10 +46,12 @@ export default function Budget() { Le budget de mon-entreprise.fr -

    Budget {emoji('💶')}

    +

    + Budget +

  • Chargement...
    }> @@ -122,7 +122,7 @@ function IntegrationCustomizer() { Code d'intégration - {emoji('🛠')} +

    diff --git a/mon-entreprise/source/pages/integration/Library.tsx b/mon-entreprise/source/pages/integration/Library.tsx index 02b3d8223..29b07ce6c 100644 --- a/mon-entreprise/source/pages/integration/Library.tsx +++ b/mon-entreprise/source/pages/integration/Library.tsx @@ -1,6 +1,5 @@ import { ScrollToTop } from 'Components/utils/Scroll' import Emoji from 'Components/utils/Emoji' -import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' export default function Library() { @@ -142,7 +141,9 @@ export default function Library() { , composant qui fait aussi appel à l'API commune.

    -

    Faire des graphiques économiques{emoji(' 📈')}

    +

    + Faire des graphiques économiques +

    Il est aussi possible d'utiliser la bibliothèque pour des calculs d'analyse économique ou politique. Ici, on trace le prix du travail et diff --git a/mon-entreprise/source/pages/integration/Options.tsx b/mon-entreprise/source/pages/integration/Options.tsx index 0e5c8c927..ec10682be 100644 --- a/mon-entreprise/source/pages/integration/Options.tsx +++ b/mon-entreprise/source/pages/integration/Options.tsx @@ -1,7 +1,7 @@ import { icons } from 'Components/ui/SocialIcon' +import Emoji from 'Components/utils/Emoji' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext } from 'react' -import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { Link } from 'react-router-dom' import illustration from './illustration.png' @@ -11,7 +11,7 @@ export default function Options() { return ( <>

    - Outils pour les développeurs <>{emoji('👨‍💻')} + Outils pour les développeurs

    @@ -36,7 +36,9 @@ export default function Options() { className="ui__ interactive card box inverted-colors" to={sitePaths.integration.iframe} > -
    {emoji('📱')}
    +
    + +

    Intégrer un simulateur

    @@ -52,7 +54,9 @@ export default function Options() { className="ui__ interactive card box inverted-colors" to={sitePaths.integration.library} > -

    {emoji('🧰')}
    +
    + +

    Libraire de calcul

    @@ -100,7 +104,9 @@ export default function Options() { target="_blank" href="https://publi.codes" > -

    {emoji('📚')}
    +
    + +

    Publicodes

    diff --git a/mon-entreprise/source/pages/integration/index.tsx b/mon-entreprise/source/pages/integration/index.tsx index c81492aff..e9d5edde0 100644 --- a/mon-entreprise/source/pages/integration/index.tsx +++ b/mon-entreprise/source/pages/integration/index.tsx @@ -1,7 +1,7 @@ +import Emoji from 'Components/utils/Emoji' import { ScrollToTop } from 'Components/utils/Scroll' import { SitePathsContext } from 'Components/utils/SitePathsContext' import { useContext } from 'react' -import emoji from 'react-easy-emoji' import { Trans } from 'react-i18next' import { Link, Route, Switch, useLocation } from 'react-router-dom' import styled from 'styled-components' @@ -24,7 +24,7 @@ export default function Integration() { className="ui__ simple small push-left button" to={sitePaths.integration.index} > - ← Outils pour les développeurs {emoji('👨‍💻')} + ← Outils pour les développeurs )} diff --git a/netlify.toml b/netlify.toml index 038b6840e..839f2fac6 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,12 +1,15 @@ [[headers]] for = "/*" [headers.values] -# TODO : self-host emojies to remove twemoji.maxcdn.com -# https://github.com/betagouv/mon-entreprise/issues/1219 -# # TODO : report-only for now to see if there are any errors in Senty # https://github.com/betagouv/mon-entreprise/pull/1544#issuecomment-838511556 -Content-Security-Policy-Report-Only = "default-src 'self' mon-entreprise.fr; style-src 'self' 'unsafe-inline' mon-entreprise.zammad.com; connect-src 'self' *.sentry.io raw.githubusercontent.com *.xiti.com mon-entreprise.zammad.com entreprise.data.gouv.fr; form-action 'self' *.sibforms.com *.sentry.io mon-entreprise.zammad.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' entreprise.data.gouv.fr geo.api.gouv.fr *.xiti.com stonly.com code.jquery.com mon-entreprise.zammad.com; img-src 'self' data: https://twemoji.maxcdn.com *.xiti.com user-images.githubusercontent.com; frame-src 'self' https://www.youtube-nocookie.com https://codesandbox.io" +Content-Security-Policy-Report-Only = "default-src 'self' mon-entreprise.fr; style-src 'self' 'unsafe-inline' mon-entreprise.zammad.com; connect-src 'self' *.sentry.io raw.githubusercontent.com *.xiti.com mon-entreprise.zammad.com entreprise.data.gouv.fr; form-action 'self' *.sibforms.com *.sentry.io mon-entreprise.zammad.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' entreprise.data.gouv.fr geo.api.gouv.fr *.xiti.com stonly.com code.jquery.com mon-entreprise.zammad.com; img-src 'self' data: *.xiti.com user-images.githubusercontent.com; frame-src 'self' https://www.youtube-nocookie.com https://codesandbox.io" + +## Twemoji proxy for client privacy #1219 +[[redirects]] + from = "/twemoji/*" + to = "https://twemoji.maxcdn.com/:splat" + status = 200 ############ # Redirects following architectural changes From 6d05bb218c63615bb80f166f2fe4a8d7430ee8e7 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Tue, 21 Sep 2021 12:44:00 +0200 Subject: [PATCH 315/319] =?UTF-8?q?=F0=9F=94=A5=20Supprime=20la=20transfor?= =?UTF-8?q?mation=20d'emoji=20dans=20la=20doc=20publicodes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mon-entreprise/source/locales/ui-en.yaml | 12 ------ publicodes/site/components/Studio.tsx | 2 +- publicodes/site/components/markdown.tsx | 6 +-- publicodes/ui-react/package.json | 1 - publicodes/ui-react/source/Markdown.tsx | 4 +- .../ui-react/source/PublicodesBlock.tsx | 2 +- publicodes/ui-react/source/RuleLink.tsx | 4 +- .../ui-react/source/mecanisms/Replacement.tsx | 2 +- .../ui-react/source/mecanisms/Variations.tsx | 4 +- .../ui-react/source/rule/RuleSource.tsx | 2 +- publicodes/yarn.lock | 41 +------------------ 11 files changed, 11 insertions(+), 69 deletions(-) diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index c27b517a1..b4b2371d4 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -1615,18 +1615,6 @@ simulateurs: explanation: CNAPL: It recovers contributions related to your retirement and disability/death plan. - aides covid: - deduction: <0>Deduction of turnover<1>The terms and conditions of the - "covid" discount are presented on the Urssaf - website.<2><0>{emoji('▶')} More information - portail: <0>Government assistance<1>The Ministry of the Economy offers a - portal listing business support measures.<2><0>{emoji('▶')} - Support measures - reduction: <0>Contribution reduction<1>You can benefit from a reduction in - your final contributions for the year 2020.<2><0> - soutien: <0>Listening and support<1>An <2>initial listening and - psychological support unit has been set up for company directors - weakened by the crisis.<2><0>{emoji('📞')} 08 05 65 50 50 institutions: cpam: As a health professional under agreement, you benefit from a part of your contributions being covered by the Health Insurance. diff --git a/publicodes/site/components/Studio.tsx b/publicodes/site/components/Studio.tsx index 8a7dbcee5..9fb0a9c46 100644 --- a/publicodes/site/components/Studio.tsx +++ b/publicodes/site/components/Studio.tsx @@ -166,7 +166,7 @@ export const Results = ({ onClickShare, rules }: ResultsProps) => {

    diff --git a/publicodes/site/components/markdown.tsx b/publicodes/site/components/markdown.tsx index 28adc3078..3444f07f9 100644 --- a/publicodes/site/components/markdown.tsx +++ b/publicodes/site/components/markdown.tsx @@ -56,9 +56,7 @@ export function LinkRenderer({ ) } -const TextRenderer = ({ children }: { children: string }) => ( - <>{emoji(children)} -) +const TextRenderer = ({ children }: { children: string }) => <>{children} type MarkdownProps = ReactMarkdownProps & { source: string | undefined @@ -93,7 +91,7 @@ const CodeBlock = ({ target="_blank" css="position: absolute; bottom: 5px; right: 10px; color: white !important;" > - {emoji('⚡')} Lancer le calcul + ⚡ Lancer le calcul )}
    diff --git a/publicodes/ui-react/package.json b/publicodes/ui-react/package.json index cee3b19e1..83c8bfffc 100644 --- a/publicodes/ui-react/package.json +++ b/publicodes/ui-react/package.json @@ -19,7 +19,6 @@ "classnames": "^2.2.6", "focus-trap-react": "^3.1.2", "ramda": "^0.27.0", - "react-easy-emoji": "^1.4.0", "react-helmet": "^6.1.0", "react-markdown": "^4.3.1", "react-router-hash-link": "^2.4.3", diff --git a/publicodes/ui-react/source/Markdown.tsx b/publicodes/ui-react/source/Markdown.tsx index e7a016771..f3ace25b2 100644 --- a/publicodes/ui-react/source/Markdown.tsx +++ b/publicodes/ui-react/source/Markdown.tsx @@ -48,9 +48,7 @@ const CodeBlock = ({ value, language }: { value: string; language: string }) => ) -const TextRenderer = ({ children }: { children: string }) => ( - <>{emoji(children)} -) +const TextRenderer = ({ children }: { children: string }) => <>{children} type MarkdownProps = ReactMarkdownProps & { source: string | undefined diff --git a/publicodes/ui-react/source/PublicodesBlock.tsx b/publicodes/ui-react/source/PublicodesBlock.tsx index 95d37f36e..636e39242 100644 --- a/publicodes/ui-react/source/PublicodesBlock.tsx +++ b/publicodes/ui-react/source/PublicodesBlock.tsx @@ -17,7 +17,7 @@ export default function PublicodesBlock({ source }: { source: string }) { href={`${baseURL}/studio?code=${encodeURIComponent(source)}`} target="_blank" > - {emoji('⚡')} Lancer le calcul + ⚡ Lancer le calcul
    ) diff --git a/publicodes/ui-react/source/RuleLink.tsx b/publicodes/ui-react/source/RuleLink.tsx index 3e68a3f6b..841821b3c 100644 --- a/publicodes/ui-react/source/RuleLink.tsx +++ b/publicodes/ui-react/source/RuleLink.tsx @@ -63,9 +63,7 @@ export function RuleLink({ {...props} > {children || rule.title}{' '} - {displayIcon && rule.rawNode.icônes && ( - {emoji(rule.rawNode.icônes)} - )} + {displayIcon && rule.rawNode.icônes && {rule.rawNode.icônes}} ) } diff --git a/publicodes/ui-react/source/mecanisms/Replacement.tsx b/publicodes/ui-react/source/mecanisms/Replacement.tsx index c1b88e7aa..09b967b3c 100644 --- a/publicodes/ui-react/source/mecanisms/Replacement.tsx +++ b/publicodes/ui-react/source/mecanisms/Replacement.tsx @@ -24,7 +24,7 @@ export default function Replacement(node: VariationNode & EvaluatedNode) { onClick={() => changeDisplayReplacement(true)} className="ui__ simple small button" > - {emoji('🔄')} + 🔄 {displayReplacements && ( changeDisplayReplacement(false)}> diff --git a/publicodes/ui-react/source/mecanisms/Variations.tsx b/publicodes/ui-react/source/mecanisms/Variations.tsx index e95b1cef9..2b0eb5992 100644 --- a/publicodes/ui-react/source/mecanisms/Variations.tsx +++ b/publicodes/ui-react/source/mecanisms/Variations.tsx @@ -47,14 +47,14 @@ export default function Variations({ className="ui__ link-button" onClick={() => toggleVariation(i)} > - détails {emoji('▶️')} + détails ▶️ ) : ( )} diff --git a/publicodes/ui-react/source/rule/RuleSource.tsx b/publicodes/ui-react/source/rule/RuleSource.tsx index 88e3e52ac..db4263db5 100644 --- a/publicodes/ui-react/source/rule/RuleSource.tsx +++ b/publicodes/ui-react/source/rule/RuleSource.tsx @@ -87,7 +87,7 @@ export default function RuleSource({ engine, dottedName }: Props) { dottedName )}?code=${encodeURIComponent(source)}`} > - {emoji('✍️')} Voir la règle dans le bac à sable Publicodes + ✍️ Voir la règle dans le bac à sable Publicodes
    ) diff --git a/publicodes/yarn.lock b/publicodes/yarn.lock index 9787da045..fe03688cb 100644 --- a/publicodes/yarn.lock +++ b/publicodes/yarn.lock @@ -2168,13 +2168,6 @@ intl@^1.2.5: resolved "https://registry.yarnpkg.com/intl/-/intl-1.2.5.tgz#82244a2190c4e419f8371f5aa34daa3420e2abde" integrity sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94= -invariant@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" @@ -2397,11 +2390,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.assign@^4.0.8: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -2412,16 +2400,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - lodash@^4.17.11, lodash@^4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -2435,7 +2413,7 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -loose-envify@^1.0.0, loose-envify@^1.4.0: +loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -2834,14 +2812,6 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -react-easy-emoji@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/react-easy-emoji/-/react-easy-emoji-1.5.0.tgz#fe81e6c8b1df4e4305a47f3df1187b6db6663ae8" - integrity sha512-yBlctvcglxKpEYijPJ1YHAe26ce6wxfNxERF/X3RUy3EPM1RKW0+Kn7Nm2rccYg4ReE4htOAsJB8FhMwNk2sAw== - dependencies: - lodash.assign "^4.0.8" - string-replace-to-array "^1.0.1" - react-fast-compare@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" @@ -3172,15 +3142,6 @@ state-toggle@^1.0.0: resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -string-replace-to-array@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string-replace-to-array/-/string-replace-to-array-1.0.3.tgz#c93eba999a5ee24d731aebbaf5aba36b5f18f7bf" - integrity sha1-yT66mZpe4k1zGuu69auja18Y978= - dependencies: - invariant "^2.2.1" - lodash.flatten "^4.2.0" - lodash.isstring "^4.0.1" - "string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" From ba76056e373718f0553fa65945bb42dd1bbd2765 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Thu, 16 Sep 2021 14:22:08 +0200 Subject: [PATCH 316/319] :bug: Corrige un bug sur l'affichage des remplacements dans la doc publicodes --- publicodes/ui-react/source/mecanisms/Replacement.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/publicodes/ui-react/source/mecanisms/Replacement.tsx b/publicodes/ui-react/source/mecanisms/Replacement.tsx index 09b967b3c..e60830343 100644 --- a/publicodes/ui-react/source/mecanisms/Replacement.tsx +++ b/publicodes/ui-react/source/mecanisms/Replacement.tsx @@ -18,7 +18,7 @@ export default function Replacement(node: VariationNode & EvaluatedNode) { const [displayReplacements, changeDisplayReplacement] = useState(false) return ( - +   } diff --git a/mon-entreprise/source/components/ShareSimulationBanner.tsx b/mon-entreprise/source/components/ShareSimulationBanner.tsx index 71c0becc6..5bff2d5f9 100644 --- a/mon-entreprise/source/components/ShareSimulationBanner.tsx +++ b/mon-entreprise/source/components/ShareSimulationBanner.tsx @@ -3,8 +3,10 @@ import React, { useContext, useEffect, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { situationSelector } from 'Selectors/simulationSelectors' +import styled from 'styled-components' import { TrackingContext } from '../ATInternetTracking' import Banner from './Banner' +import ExportSimulationBanner from './ExportSimulationBanner' import { FromTop } from './ui/animate' import { useParamsFromSituation } from './utils/useSearchParamsSimulationSharing' @@ -20,7 +22,7 @@ export function useUrl() { ].join('') } -export default function ShareSimulationBanner() { +export default function ShareOrSaveSimulationBanner() { const [opened, setOpened] = useState(false) const { t } = useTranslation() const tracker = useContext(TrackingContext) @@ -45,38 +47,32 @@ export default function ShareSimulationBanner() { } } - return ( - - {opened ? ( - -
    - setOpened(false)} - > - × - -

    - {t('shareSimulation.modal.title', 'Votre lien de partage')}{' '} -

    -

    - - Voici le lien que vous pouvez envoyer pour accéder à votre - simulation. - -

    - -
    -
    - ) : ( + return opened ? ( + +
    + +

    {t('shareSimulation.modal.title', 'Votre lien de partage')}

    +

    + + Voici le lien que vous pouvez envoyer pour accéder à votre + simulation. + +

    + +
    +
    + ) : ( + + - Pour partager cette simulation :{' '} - { tracker.click.set({ chapter1: 'feature:partage', @@ -87,14 +83,22 @@ export default function ShareSimulationBanner() { startSharing() }} > - Générer un lien dédié - + Générer un lien de partage + - )} - +
    + + ) } +const SharingTools = styled.div` + display: flex; + justify-content: space-around; + flex-wrap: wrap; + margin: 0.5rem 0; +` + function ShareSimulationPopup({ url }: { url: string }) { const inputRef: React.RefObject = React.createRef() const { t } = useTranslation() diff --git a/mon-entreprise/source/components/Simulation.tsx b/mon-entreprise/source/components/Simulation.tsx index 6141ceccc..b14642f86 100644 --- a/mon-entreprise/source/components/Simulation.tsx +++ b/mon-entreprise/source/components/Simulation.tsx @@ -1,9 +1,8 @@ import Conversation, { ConversationProps, } from 'Components/conversation/Conversation' -import ExportSimulationBanner from 'Components/ExportSimulationBanner' import PageFeedback from 'Components/Feedback' -import ShareSimulationBanner from 'Components/ShareSimulationBanner' +import ShareOrSaveSimulationBanner from 'Components/ShareSimulationBanner' import TargetSelection from 'Components/TargetSelection' import Progress from 'Components/ui/Progress' import { useSimulationProgress } from 'Components/utils/useNextQuestion' @@ -46,8 +45,7 @@ export default function Simulation({ <> {results} - - +
    diff --git a/mon-entreprise/source/components/simulationExplanation/ExportRecover.tsx b/mon-entreprise/source/components/simulationExplanation/ExportRecover.tsx index 5b7a9ffb3..18604b27d 100644 --- a/mon-entreprise/source/components/simulationExplanation/ExportRecover.tsx +++ b/mon-entreprise/source/components/simulationExplanation/ExportRecover.tsx @@ -1,5 +1,4 @@ import { useUrl } from 'Components/ShareSimulationBanner' -import React from 'react' import { Trans } from 'react-i18next' export default function ExportRecover() { diff --git a/mon-entreprise/source/locales/ui-en.yaml b/mon-entreprise/source/locales/ui-en.yaml index b4b2371d4..41f86d53e 100644 --- a/mon-entreprise/source/locales/ui-en.yaml +++ b/mon-entreprise/source/locales/ui-en.yaml @@ -72,7 +72,7 @@ Exemples de simulation de salaire: Examples of salary simulations Exonérations: Exemptions Explorez notre documentation: Explore our documentation ExportSimulation: - Banner: "To save this simulation: <2>Print or export as PDF" + Banner: <0>Print or save as PDF Faire une simulation: Launch a simulation Fiche de paie: Payslip Gestion des données personnelles: Management of personal data @@ -1602,7 +1602,7 @@ selectionRégime: urssaf: The figures are indicative and do not replace the actual accounts of the Urssaf, impots.gouv.fr, etc shareSimulation: - banner: "To share this simulation: <2>Generate a dedicated link" + banner: <0>Generate a share link button: copied: Copied copy: Copy the link diff --git a/mon-entreprise/source/locales/ui-fr.yaml b/mon-entreprise/source/locales/ui-fr.yaml index e349a6aa9..5fdbef674 100644 --- a/mon-entreprise/source/locales/ui-fr.yaml +++ b/mon-entreprise/source/locales/ui-fr.yaml @@ -25,7 +25,7 @@ Entreprise Individuelle: Entreprise Individuelle Exonérations: Exonérations Explorez notre documentation: Explorez notre documentation ExportSimulation: - Banner: "Pour conserver cette simulation : <2>Imprimer ou sauvegarder en PDF" + Banner: <0>Imprimer ou sauvegarder en PDF Fiche de paie: Fiche de paie Gestion des données personnelles: Gestion des données personnelles Gérant majoritaire: Gérant majoritaire @@ -1191,7 +1191,7 @@ responsabilité: notamment la rédaction de statuts et le dépôt d'un capital." titre: Entreprise individuelle ou société ? shareSimulation: - banner: "Pour partager cette simulation : <2>Générer un lien dédié" + banner: <0>Générer un lien de partage button: copied: Copié copy: Copier le lien From a14f2bb75b42dcb3aac62f4f3e00c76fc86042cb Mon Sep 17 00:00:00 2001 From: Alex S Date: Wed, 22 Sep 2021 19:05:09 +0200 Subject: [PATCH 319/319] =?UTF-8?q?=F0=9F=A4=96=20Supprime=20les=20index?= =?UTF-8?q?=20Algolia=20temporaires=20lorsque=20les=20PR=20sont=20ferm?= =?UTF-8?q?=C3=A9es=20(#1742)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Alexandre Valsamou-Stanislawski --- .github/workflows/pr-cleanup.yaml | 24 ++++++++++++++++++++++++ mon-entreprise/package.json | 3 ++- mon-entreprise/scripts/search/clean.js | 17 +++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/pr-cleanup.yaml create mode 100644 mon-entreprise/scripts/search/clean.js diff --git a/.github/workflows/pr-cleanup.yaml b/.github/workflows/pr-cleanup.yaml new file mode 100644 index 000000000..10d342307 --- /dev/null +++ b/.github/workflows/pr-cleanup.yaml @@ -0,0 +1,24 @@ +name: PR clean up +on: + pull_request: + types: [closed] + +jobs: + deploy-context: + runs-on: ubuntu-18.04 + outputs: + env-name: ${{ steps.deploy-env.outputs.name }} + steps: + - id: deploy-env + run: echo "::set-output name=name::${{ github.event.number || '${GITHUB_REF#refs/*/}' }}" + + algolia-rm-temp-index: + needs: deploy-context + runs-on: ubuntu-18.04 + steps: + - name: Remove temporary algolia index + run: yarn workspace mon-entreprise algolia:clean + env: + ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} + ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} + ALGOLIA_INDEX_PREFIX: monentreprise-${{needs.deploy-context.outputs.env-name}}- diff --git a/mon-entreprise/package.json b/mon-entreprise/package.json index 4860cdbb5..d0fc5b3a7 100644 --- a/mon-entreprise/package.json +++ b/mon-entreprise/package.json @@ -134,6 +134,7 @@ "serve:dev:mon-entreprise": "PORT=5000 serve --config serve.mon-entreprise.json --no-clipboard", "serve:dev:publicodes": "PORT=5002 serve --config serve.publicodes.json --no-clipboard", "serve:dev:mycompanyinfrance": "PORT=5001 serve --config serve.infrance.json --no-clipboard", - "algolia:update": "node scripts/search/update-data.js" + "algolia:update": "node scripts/search/update-data.js", + "algolia:clean": "node scripts/search/clean.js" } } diff --git a/mon-entreprise/scripts/search/clean.js b/mon-entreprise/scripts/search/clean.js new file mode 100644 index 000000000..3ca853c04 --- /dev/null +++ b/mon-entreprise/scripts/search/clean.js @@ -0,0 +1,17 @@ +require('dotenv').config() + +const algoliasearch = require('algoliasearch') + +const { + ALGOLIA_APP_ID, + ALGOLIA_ADMIN_KEY, + ALGOLIA_INDEX_PREFIX = '', +} = process.env + +const client = algoliasearch(ALGOLIA_APP_ID, ALGOLIA_ADMIN_KEY) + +const rulesIndex = client.initIndex(`${ALGOLIA_INDEX_PREFIX}rules`) +const simulateursIndex = client.initIndex(`${ALGOLIA_INDEX_PREFIX}simulateurs`) + +rulesIndex.delete() +simulateursIndex.delete()