diff --git a/_redirects b/_redirects index fe02c7484..215fea123 100644 --- a/_redirects +++ b/_redirects @@ -1,6 +1,10 @@ -https://embauche.beta.gouv.fr/règle/contrat-salarié--salaire--net-après-impôt https://embauche.beta.gouv.fr/documentation/contrat-salarié/salaire/net-après-impôt 302 -https://embauche.beta.gouv.fr/règle/prime-de-fin-de-contrat https://embauche.beta.gouv.fr/documentation/contrat-salarié/CDD/prime-de-fin-de-contrat 302 -https://embauche.beta.gouv.fr/règle/contrat-salarié--salaire--brut-de-base https://embauche.beta.gouv.fr/documentation/contrat-salarié/salaire/brut-de-base 302 -https://embauche.beta.gouv.fr/règle/contrat-salarié--rémunération-total https://embauche.beta.gouv.fr/documentation/contrat-salarié/rémunération/total 302 -https://embauche.beta.gouv.fr/règle/contribution-au-dialogue-social https://embauche.beta.gouv.fr/documentation/contrat-salarié/contribution-au-dialogue-social 302 -https://embauche.beta.gouv.fr/règle/contrat-salarié--CDD--motif--complément-formation https://embauche.beta.gouv.fr/documentation/contrat-salarié/CDD/motif/complément-formation 302 \ No newline at end of file +https://embauche.beta.gouv.fr/règle/contrat-salarié--salaire--net-après-impôt https://mon-entreprise.fr/contrat-salarié/salaire/net-après-impôt 301 +https://embauche.beta.gouv.fr/règle/prime-de-fin-de-contrat https://mon-entreprise.fr/contrat-salarié/CDD/prime-de-fin-de-contrat 301 +https://embauche.beta.gouv.fr/règle/contrat-salarié--salaire--brut-de-base https://mon-entreprise.fr/contrat-salarié/salaire/brut-de-base 301 +https://embauche.beta.gouv.fr/règle/contrat-salarié--rémunération-total https://mon-entreprise.fr/contrat-salarié/rémunération/total 301 +https://embauche.beta.gouv.fr/règle/contribution-au-dialogue-social https://mon-entreprise.fr/contrat-salarié/contribution-au-dialogue-social 301 +https://embauche.beta.gouv.fr/règle/contrat-salarié--CDD--motif--complément-formation https://mon-entreprise.fr/contrat-salarié/CDD/motif/complément-formation 301 +https://embauche.beta.gouv.fr/règle/* https://mon-entreprise.fr/documentation/:splat 301 + + +/documentation/contrat-salarié/salaire/* /documentation/contrat-salarié/rémunération/:splat 301 diff --git a/netlify.toml b/netlify.toml index 48c8f8237..90f952e75 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,11 +1,6 @@ -# Redirect for google SEO. See also _redirects file -[[redirects]] -from = "/documentation/salaire/*" -to = "/documentation/rémunération/:splat" -status = 302 # InFrance PRODUCTION settings [[redirects]] diff --git a/package.json b/package.json index 4b699d360..54d0aaad3 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "i18next": "^14.1.1", "iframe-resizer": "^4.1.1", "js-yaml": "^3.13.1", - "nearley": "^2.16.0", + "moo": "^0.5.0", + "nearley": "^2.19.0", "ramda": "^0.25.0", "raven-for-redux": "^1.3.1", "raven-js": "^3.26.4", diff --git a/source/components/SchemeComparaison.js b/source/components/SchemeComparaison.js index 47662af91..7d1ef90b8 100644 --- a/source/components/SchemeComparaison.js +++ b/source/components/SchemeComparaison.js @@ -43,7 +43,7 @@ type Props = OwnProps & { } let getBranchIndex = branch => - ({ assimilé: 0, indépendant: 1, 'auto entrepreneur': 2 }[branch]) + ({ assimilé: 0, indépendant: 1, 'auto-entrepreneur': 2 }[branch]) let getRuleFrom = analyses => (branch, dottedName) => { let i = getBranchIndex(branch) return getRuleFromAnalysis(analyses[i])(dottedName) @@ -360,7 +360,7 @@ const SchemeComparaison = ({ 'Plafond de CA dépassé' ) : ( )} @@ -388,8 +388,8 @@ const SchemeComparaison = ({ '—' ) : ( )} @@ -438,12 +438,12 @@ const SchemeComparaison = ({ {plafondAutoEntrepreneurDépassé ? ( '—' ) : getRule( - 'auto entrepreneur', + 'auto-entrepreneur', 'protection sociale . retraite' ).applicable !== false ? ( {' '} @@ -485,7 +485,7 @@ const SchemeComparaison = ({ '—' ) : ( trimestres} unit={null} @@ -538,7 +538,7 @@ const SchemeComparaison = ({ ) : ( diff --git a/source/components/rule/Rule.js b/source/components/rule/Rule.js index 6c9c366b5..90b522da4 100644 --- a/source/components/rule/Rule.js +++ b/source/components/rule/Rule.js @@ -170,7 +170,7 @@ export default compose( to={ dottedName.includes('contrat salarié') ? sitePaths.sécuritéSociale.salarié - : dottedName.includes('auto entrepreneur') + : dottedName.includes('auto-entrepreneur') ? sitePaths.sécuritéSociale['auto-entrepreneur'] : dottedName.includes('indépendant') ? sitePaths.sécuritéSociale.indépendant diff --git a/source/components/simulationConfigs/assimilé.yaml b/source/components/simulationConfigs/assimilé.yaml index 2703d3e26..ca789bca7 100644 --- a/source/components/simulationConfigs/assimilé.yaml +++ b/source/components/simulationConfigs/assimilé.yaml @@ -39,7 +39,7 @@ questions: - contrat salarié . régime des impatriés situation: - auto entrepreneur: non + auto-entrepreneur: non indépendant: non contrat salarié . assimilé salarié: oui contrat salarié . temps partiel: non diff --git a/source/components/simulationConfigs/auto-entrepreneur.yaml b/source/components/simulationConfigs/auto-entrepreneur.yaml index 202ae159a..1f2a4710d 100644 --- a/source/components/simulationConfigs/auto-entrepreneur.yaml +++ b/source/components/simulationConfigs/auto-entrepreneur.yaml @@ -1,21 +1,21 @@ objectifs: - entreprise . chiffre d'affaires - - auto entrepreneur . cotisations et contributions - - auto entrepreneur . revenu net de cotisations + - auto-entrepreneur . cotisations et contributions + - auto-entrepreneur . revenu net de cotisations - impôt - revenu net après impôt questions: à l'affiche: Type d'activité: entreprise . catégorie d'activité - Versement libératoire: auto entrepreneur . impôt . versement libératoire + Versement libératoire: auto-entrepreneur . impôt . versement libératoire Impôt sur le revenu: impôt . méthode de calcul ACRE: entreprise . ACRE liste noire: - entreprise . charges situation: - auto entrepreneur: oui + auto-entrepreneur: oui indépendant: non contrat salarié: non période: année diff --git a/source/components/simulationConfigs/indépendant.yaml b/source/components/simulationConfigs/indépendant.yaml index 324ea4e52..cdd24a109 100644 --- a/source/components/simulationConfigs/indépendant.yaml +++ b/source/components/simulationConfigs/indépendant.yaml @@ -24,6 +24,6 @@ questions: situation: indépendant: oui - auto entrepreneur: non + auto-entrepreneur: non contrat salarié: non période: année diff --git a/source/components/simulationConfigs/rémunération-dirigeant.yaml b/source/components/simulationConfigs/rémunération-dirigeant.yaml index 8204971cc..0c9490c11 100644 --- a/source/components/simulationConfigs/rémunération-dirigeant.yaml +++ b/source/components/simulationConfigs/rémunération-dirigeant.yaml @@ -24,7 +24,7 @@ situation: branches: - nom: Assimilé salarié situation: - auto entrepreneur: non + auto-entrepreneur: non indépendant: non contrat salarié: oui contrat salarié . assimilé salarié: oui @@ -32,10 +32,10 @@ branches: - nom: Indépendant situation: indépendant: oui - auto entrepreneur: non + auto-entrepreneur: non contrat salarié: non - nom: Auto-entrepreneur situation: - auto entrepreneur: oui + auto-entrepreneur: oui indépendant: non contrat salarié: non diff --git a/source/components/simulationConfigs/salarié.yaml b/source/components/simulationConfigs/salarié.yaml index a98ac216f..01eebd50b 100644 --- a/source/components/simulationConfigs/salarié.yaml +++ b/source/components/simulationConfigs/salarié.yaml @@ -31,5 +31,5 @@ questions: situation: contrat salarié . assimilé salarié: non indépendant: non - auto entrepreneur: non + auto-entrepreneur: non période: mois diff --git a/source/components/ui/Button/button.css b/source/components/ui/Button/button.css index f9a7c40f2..d0d3d8fd7 100644 --- a/source/components/ui/Button/button.css +++ b/source/components/ui/Button/button.css @@ -212,7 +212,6 @@ display: flex; user-select: text; align-items: baseline; - flex-wrap: wrap; padding: 1rem; background: white; color: var(--darkColour); diff --git a/source/components/utils/withSitePaths.js b/source/components/utils/withSitePaths.js index d60a1bd90..4d28a5907 100644 --- a/source/components/utils/withSitePaths.js +++ b/source/components/utils/withSitePaths.js @@ -15,7 +15,6 @@ export default function withSitePaths( constructor(props) { super(props) i18n.on('languageChanged', () => { - console.log('zop') this.forceUpdate() }) } diff --git a/source/engine/evaluation.js b/source/engine/evaluation.js index ca59b46d3..c64c69669 100644 --- a/source/engine/evaluation.js +++ b/source/engine/evaluation.js @@ -31,20 +31,6 @@ export let mergeMissing = (left, right) => export let evaluateNode = (cache, situationGate, parsedRules, node) => node.evaluate ? node.evaluate(cache, situationGate, parsedRules, node) : node -export let rewriteNode = ( - node, - nodeValue, - explanation, - missingVariables, - lazyEval -) => ({ - ...node, - nodeValue, - explanation, - missingVariables, - lazyEval -}) - export let evaluateArray = (reducer, start) => ( cache, situationGate, @@ -60,8 +46,7 @@ export let evaluateArray = (reducer, start) => ( : reduce(reducer, start, values), missingVariables = node.nodeValue == null ? mergeAllMissing(explanation) : {} - // console.log("".padStart(cache.parseLevel), missingVariables) - return rewriteNode(node, nodeValue, explanation, missingVariables) + return { ...node, nodeValue, explanation, missingVariables } } export let evaluateArrayWithFilter = (evaluationFilter, reducer, start) => ( @@ -83,7 +68,7 @@ export let evaluateArrayWithFilter = (evaluationFilter, reducer, start) => ( missingVariables = node.nodeValue == null ? mergeAllMissing(explanation) : {} - return rewriteNode(node, nodeValue, explanation, missingVariables) + return { ...node, nodeValue, explanation, missingVariables } } export let defaultNode = nodeValue => ({ @@ -123,8 +108,7 @@ export let evaluateObject = (objectShape, effect) => ( : automaticExplanation, nodeValue = is(Object, evaluated) ? evaluated.nodeValue : evaluated, missingVariables = mergeAllMissing(values(explanation)) - // console.log("".padStart(cache.parseLevel),map(node => length(flatten(collectNodeMissing(node))) ,explanation)) - return rewriteNode(node, nodeValue, explanation, missingVariables) + return { ...node, nodeValue, explanation, missingVariables } } export let E = (cache, situationGate, parsedRules) => { diff --git a/source/engine/grammar.ne b/source/engine/grammar.ne index e9a43a120..dd2a90171 100644 --- a/source/engine/grammar.ne +++ b/source/engine/grammar.ne @@ -6,80 +6,89 @@ @{% import {string, filteredVariable, variable, temporalVariable, operation, boolean, number, percentage } from './grammarFunctions' + +const moo = require("moo"); + +const letter = '[a-zA-Z\u00C0-\u017F]'; +const letterOrNumber = '[a-zA-Z\u00C0-\u017F0-9\']'; +const word = `${letter}(?:[\-']?${letterOrNumber}+)*`; +const words = `${word}(?: ${word}|${letterOrNumber}*)*` +const numberRegExp = '-?(?:[1-9][0-9]+|[0-9])(?:\.[0-9]+)?'; +const percentageRegExp = numberRegExp + '\\%' + +const lexer = moo.compile({ + percentage: new RegExp(percentageRegExp), + number: new RegExp(numberRegExp), + '(': '(', + ')': ')', + '[': '[', + ']': ']', + comparisonOperator: ['>','<','>=','<=','=','!='], + additionSubstractionOperator: /[\+-]/, + multiplicationDivisionOperator: ['*','/'], + temporality: ['annuel' , 'mensuel'], + words: new RegExp(words), + string: /'[ \t\.'a-zA-Z\-\u00C0-\u017F0-9 ]+'/, + dot: ' . ', + _: { match: /[\s]/, lineBreaks: true } +}); %} +@lexer lexer + main -> - AdditionSubstraction {% id %} - | Comparison {% id %} - | NonNumericTerminal {% id %} + AdditionSubstraction {% id %} + | Comparison {% id %} + | NonNumericTerminal {% id %} NumericTerminal -> - Variable {% id %} - | TemporalVariable {% id %} - | FilteredVariable {% id %} - | percentage {% id %} - | number {% id %} + Variable {% id %} + | TemporalVariable {% id %} + | FilteredVariable {% id %} + | number {% id %} -Parentheses -> "(" AdditionSubstraction ")" {% ([,e]) => e %} - | NumericTerminal {% id %} +Parentheses -> + "(" AdditionSubstraction ")" {% ([,e]) => e %} + | NumericTerminal {% id %} -ComparisonOperator -> ">" | "<" | ">=" | "<=" | "=" | "!=" - -Comparison -> Comparable _ ComparisonOperator _ Comparable {% operation('comparison')%} +Comparison -> Comparable %_ %comparisonOperator %_ Comparable {% operation('comparison')%} Comparable -> ( AdditionSubstraction | NonNumericTerminal) {% ([[e]]) => e %} NonNumericTerminal -> - Boolean {% id %} - | String {% id %} + boolean {% id %} + | string {% id %} -FilteredVariable -> Variable _ Filter {% filteredVariable %} -Filter -> "[" VariableFragment "]" {% ([,filter]) => filter %} +Variable -> %words (%dot %words {% ([,words]) => words %}):* {% variable %} -TemporalVariable -> Variable _ TemporalTransform {% temporalVariable %} -TemporalTransform -> "[" Temporality "]" {% d =>d[1] %} +Filter -> "[" %words "]" {% ([,filter]) => filter %} +FilteredVariable -> Variable %_ Filter {% filteredVariable %} + +TemporalTransform -> "[" %temporality "]" {% ([,temporality]) => temporality %} +TemporalVariable -> Variable %_ TemporalTransform {% temporalVariable %} -Temporality -> "annuel" | "mensuel" {% id %} #----- - # Addition and subtraction -AdditionSubstraction -> AdditionSubstraction _ AdditionSubstractionOperator _ MultiplicationDivision {% operation('calculation') %} - | MultiplicationDivision {% id %} +AdditionSubstraction -> + AdditionSubstraction %_ %additionSubstractionOperator %_ MultiplicationDivision {% operation('calculation') %} + | MultiplicationDivision {% id %} -AdditionSubstractionOperator -> "+" {% id %} - | "-" {% id %} - -MultiplicationDivisionOperator -> "*" {% id %} - | "/" {% id %} - # Multiplication and division -MultiplicationDivision -> MultiplicationDivision _ MultiplicationDivisionOperator _ Parentheses {% operation('calculation') %} - | Parentheses {% id %} - -Variable -> VariableFragment (_ Dot _ VariableFragment {% ([,,,fragment]) => fragment %}):* -{% variable %} - -String -> "'" [ .'a-zA-Z\-\u00C0-\u017F0-9 ]:+ "'" {% string %} - -VariableFragment -> VariableWordWithoutNumber (_ VariableWord {% d=> ' ' + d[1] %}):* {% d => d[0] + d[1].join('') %} - -VariableWordWithoutNumber -> [a-zA-Z\u00C0-\u017F] [\-'a-zA-Z\u00C0-\u017F]:* {% d => d[0] + d[1].join('') %} -VariableWord -> [a-zA-Z\u00C0-\u017F0-9] [\-'a-zA-Z\u00C0-\u017F0-9]:* {% d => d[0] + d[1].join('') %} - -Dot -> [\.] {% d => null %} - -_ -> [\s] {% d => null %} +MultiplicationDivision -> + MultiplicationDivision %_ %multiplicationDivisionOperator %_ Parentheses {% operation('calculation') %} + | Parentheses {% id %} -number -> [0-9]:+ ([\.] [0-9]:+):? {% number %} +boolean -> + "oui" {% boolean(true) %} + | "non" {% boolean(false) %} -percentage -> [0-9]:+ ([\.] [0-9]:+):? [\%] {% percentage %} - -Boolean -> ( - "oui" - | "non" ) {% boolean %} +number -> + %number {% number %} + | %percentage {% percentage %} +string -> %string {% string %} \ No newline at end of file diff --git a/source/engine/grammarFunctions.js b/source/engine/grammarFunctions.js index 5f1c44e58..6195c8a86 100644 --- a/source/engine/grammarFunctions.js +++ b/source/engine/grammarFunctions.js @@ -1,4 +1,4 @@ -/* Those are postprocessor functions for the Nearley grammar.ne. +/* 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 { parseUnit } from 'Engine/units' @@ -9,7 +9,11 @@ export let operation = operationType => ([A, , operator, , B]) => ({ } }) -export let filteredVariable = ([{ variable }, , filter], l, reject) => +export let filteredVariable = ( + [{ variable }, , { value: filter }], + l, + reject +) => ['mensuel', 'annuel'].includes(filter) ? reject : { filter: { filter, explanation: variable } } @@ -18,10 +22,11 @@ export let temporalVariable = ([{ variable }, , temporalTransform]) => ({ temporalTransform: { explanation: variable, temporalTransform } }) -export let variable = ([firstFragment, nextFragments], l, reject) => { - let fragments = [firstFragment, ...nextFragments] - if (fragments.length === 1 && ['oui', 'non'].includes(fragments[0])) +export let variable = ([firstFragment, nextFragment], _, reject) => { + const fragments = [firstFragment, ...nextFragment].map(({ value }) => value) + if (!nextFragment.length && ['oui', 'non'].includes(firstFragment)) { return reject + } return { variable: { fragments @@ -29,37 +34,30 @@ export let variable = ([firstFragment, nextFragments], l, reject) => { } } -export let number = d => ({ +export let number = ([{ value }]) => ({ constant: { - rawNode: d, - nodeValue: parseFloat( - d[0].join('') + (d[1] ? d[1][0] + d[1][1].join('') : '') - ) + nodeValue: parseFloat(value) } }) -export let percentage = d => ({ +export let percentage = ([{ value }]) => ({ constant: { - rawNode: d, type: 'percentage', unit: parseUnit('%'), - nodeValue: - parseFloat(d[0].join('') + (d[1] ? d[1][0] + d[1][1].join('') : '')) / 100 + nodeValue: parseFloat(value.slice(0, -1)) / 100 } }) -export let boolean = ([val]) => ({ +export let boolean = nodeValue => () => ({ constant: { - rawNode: val, type: 'boolean', - nodeValue: { oui: true, non: false }[val] + nodeValue } }) -export let string = d => ({ +export let string = ([{ value }]) => ({ constant: { type: 'string', - nodeValue: d[1].join(''), - rawNode: d[1].join('') + nodeValue: value.slice(1, -1) } }) diff --git a/source/engine/mecanisms.js b/source/engine/mecanisms.js index a805a9ae0..b29d5fa29 100644 --- a/source/engine/mecanisms.js +++ b/source/engine/mecanisms.js @@ -38,8 +38,7 @@ import { makeJsx, mergeAllMissing, mergeMissing, - parseObject, - rewriteNode + parseObject } from './evaluation' import Allègement from './mecanismViews/Allègement' import { Node, SimpleRuleLink } from './mecanismViews/common' @@ -88,7 +87,7 @@ export let mecanismOneOf = (recurse, k, v) => { ? reduce(mergeWith(max), {}, map(collectNodeMissing, explanation)) : {} - return rewriteNode(node, nodeValue, explanation, missingVariables) + return { ...node, nodeValue, explanation, missingVariables } } return { @@ -133,7 +132,7 @@ export let mecanismAllOf = (recurse, k, v) => { : true, missingVariables = nodeValue == null ? mergeAllMissing(explanation) : {} - return rewriteNode(node, nodeValue, explanation, missingVariables) + return { ...node, nodeValue, explanation, missingVariables } } return { @@ -231,7 +230,7 @@ export let mecanismNumericalSwitch = (recurse, k, v) => { ? choice.missingVariables : mergeAllMissing(explanation) - return rewriteNode(node, nodeValue, explanation, missingVariables) + return { ...node, nodeValue, explanation, missingVariables } } let explanation = map(parseCondition, terms) @@ -374,12 +373,15 @@ export let mecanismInversion = dottedName => (recurse, k, v) => { given: inversion.inversedWith.rule.dottedName, estimated: dottedName } - let evaluatedNode = rewriteNode( - node, + let evaluatedNode = { + ...node, nodeValue, - { ...node.explanation, inversedWith: inversion?.inversedWith }, + explanation: { + ...node.explanation, + inversedWith: inversion?.inversedWith + }, missingVariables - ) + } // TODO - we need this so that ResultsGrid will work, but it's // just not right toPairs(inversion.inversionCache).map(([k, v]) => (cache[k] = v)) @@ -665,7 +667,7 @@ export let mecanismSynchronisation = (recurse, k, v) => { let missingVariables = val(APIExplanation) === null ? { [APIExplanation.dottedName]: 1 } : {} let explanation = { ...v, API: APIExplanation } - return rewriteNode(node, safeNodeValue, explanation, missingVariables) + return { ...node, nodeValue: safeNodeValue, explanation, missingVariables } } return { diff --git a/source/engine/mecanisms/barème.js b/source/engine/mecanisms/barème.js index 4176232e0..226e6faad 100644 --- a/source/engine/mecanisms/barème.js +++ b/source/engine/mecanisms/barème.js @@ -1,10 +1,10 @@ -import { defaultNode, E, rewriteNode } from 'Engine/evaluation' -import variations from 'Engine/mecanisms/variations' +import { defaultNode, E } from 'Engine/evaluation' import { decompose } from 'Engine/mecanisms/utils' +import variations from 'Engine/mecanisms/variations' import Barème from 'Engine/mecanismViews/Barème' import { val } from 'Engine/traverse-common-functions' -import { evolve, has, pluck, sum } from 'ramda' import { inferUnit, parseUnit } from 'Engine/units' +import { evolve, has, pluck, sum } from 'ramda' export let desugarScale = recurse => tranches => tranches @@ -68,16 +68,16 @@ export default (recurse, k, v) => { }), nodeValue = sum(pluck('value', tranches)) - return rewriteNode( - node, + return { + ...node, nodeValue, - { + explanation: { ...explanation, tranches }, - e.missingVariables(), - e.valNode - ) + missingVariables: e.missingVariables(), + lazyEval: e.valNode + } } return { diff --git a/source/engine/mecanisms/operation.js b/source/engine/mecanisms/operation.js index 3ccb083b2..29a49dad1 100644 --- a/source/engine/mecanisms/operation.js +++ b/source/engine/mecanisms/operation.js @@ -1,13 +1,8 @@ -import React from 'react' -import { curry, map } from 'ramda' -import { inferUnit } from 'Engine/units' -import { - evaluateNode, - makeJsx, - mergeMissing, - rewriteNode -} from 'Engine/evaluation' +import { evaluateNode, makeJsx, mergeMissing } from 'Engine/evaluation' import { Node } from 'Engine/mecanismViews/common' +import { inferUnit } from 'Engine/units' +import { curry, map } from 'ramda' +import React from 'react' export default (k, operatorFunction, symbol) => (recurse, k, v) => { let evaluate = (cache, situation, parsedRules, node) => { @@ -26,7 +21,7 @@ export default (k, operatorFunction, symbol) => (recurse, k, v) => { explanation[1].missingVariables ) - return rewriteNode(node, nodeValue, explanation, missingVariables) + return { ...node, nodeValue, explanation, missingVariables } } let explanation = v.explanation.map(recurse) @@ -43,7 +38,6 @@ export default (k, operatorFunction, symbol) => (recurse, k, v) => { {makeJsx(explanation[0])} {symbol || k} - {makeJsx(explanation[1])} } @@ -55,7 +49,6 @@ export default (k, operatorFunction, symbol) => (recurse, k, v) => { evaluate, jsx, operator: symbol || k, - // is this useful ? text: rawNode, explanation, unit } diff --git a/source/engine/mecanisms/variations.js b/source/engine/mecanisms/variations.js index e8c321fa3..d14302579 100644 --- a/source/engine/mecanisms/variations.js +++ b/source/engine/mecanisms/variations.js @@ -1,14 +1,13 @@ -import { inferUnit } from 'Engine/units' import { bonus, collectNodeMissing, evaluateNode, mergeAllMissing, - mergeMissing, - rewriteNode + mergeMissing } from 'Engine/evaluation' -import { reject, pluck, isNil, filter, dissoc, reduce } from 'ramda' import Variations from 'Engine/mecanismViews/Variations' +import { inferUnit } from 'Engine/units' +import { dissoc, filter, isNil, pluck, reduce, reject } from 'ramda' /* @devariate = true => This function will produce variations of a same mecanism (e.g. product) that share some common properties */ export default (recurse, k, v, devariate) => { @@ -78,11 +77,15 @@ export default (recurse, k, v, devariate) => { ? collectNodeMissing(satisfiedVariation.consequence) : mergeMissing(bonus(leftMissing), rightMissing) - return rewriteNode(node, nodeValue, resolvedExplanation, missingVariables) + return { + ...node, + nodeValue, + explanation: resolvedExplanation, + missingVariables + } } // TODO - find an appropriate representation - return { explanation, evaluate, diff --git a/source/engine/parse.js b/source/engine/parse.js index a492fd82e..2688895b2 100644 --- a/source/engine/parse.js +++ b/source/engine/parse.js @@ -5,30 +5,29 @@ import barème from 'Engine/mecanisms/barème' import barèmeContinu from 'Engine/mecanisms/barème-continu' import barèmeLinéaire from 'Engine/mecanisms/barème-linéaire' -import variations from 'Engine/mecanisms/variations' import operation from 'Engine/mecanisms/operation' -import { Parser } from 'nearley' - +import variations from 'Engine/mecanisms/variations' +import { Grammar, Parser } from 'nearley' import { add, + cond, divide, equals, + fromPairs, gt, gte, + is, keys, - without, lt, lte, multiply, propOr, subtract, - fromPairs, - is, - cond, - T + T, + without } from 'ramda' import React from 'react' -import Grammar from './grammar.ne' +import grammar from './grammar.ne' import { mecanismAllOf, mecanismComplement, @@ -38,11 +37,11 @@ import { mecanismMin, mecanismNumericalSwitch, mecanismOneOf, + mecanismOnePossibility, mecanismProduct, mecanismReduction, mecanismSum, - mecanismSynchronisation, - mecanismOnePossibility + mecanismSynchronisation } from './mecanisms' import { parseReferenceTransforms } from './parseReference' @@ -62,15 +61,13 @@ export let parse = (rules, rule, parsedRules) => rawNode => { : { ...parsedNode, evaluate: defaultEvaluate } } -export let nearley = () => new Parser(Grammar.ParserRules, Grammar.ParserStart) +const compiledGrammar = Grammar.fromCompiled(grammar) export let parseString = (rules, rule, parsedRules) => rawNode => { /* Strings correspond to infix expressions. * Indeed, a subset of expressions like simple arithmetic operations `3 + (quantity * 2)` or like `salary [month]` are more explicit that their prefixed counterparts. * This function makes them prefixed operations. */ - - let [parseResult] = nearley().feed(rawNode).results - + let [parseResult] = new Parser(compiledGrammar).feed(rawNode).results return parseObject(rules, rule, parsedRules)(parseResult) } @@ -93,7 +90,7 @@ export let parseObject = (rules, rule, parsedRules) => rawNode => { let mecanisms = intersection(keys(rawNode), keys(knownMecanisms)) if (mecanisms.length != 1) { - } + } */ let attributes = keys(rawNode), @@ -162,7 +159,7 @@ export let parseObject = (rules, rule, parsedRules) => rawNode => { nodeValue: v.nodeValue, unit: v.unit, // eslint-disable-next-line - jsx: () => {v.rawNode} + jsx: () => {v.nodeValue} }) }, action = propOr(mecanismError, k, dispatch) diff --git a/source/engine/parseReference.js b/source/engine/parseReference.js index 9e7d64428..9ad5db56e 100644 --- a/source/engine/parseReference.js +++ b/source/engine/parseReference.js @@ -1,7 +1,7 @@ // Reference to a variable import parseRule from 'Engine/parseRule' import React from 'react' -import { evaluateNode, rewriteNode } from './evaluation' +import { evaluateNode } from './evaluation' import { getSituationValue } from './getSituationValue' import { Leaf } from './mecanismViews/common' import { @@ -50,12 +50,12 @@ export let parseReference = (rules, rule, parsedRules, filter) => ({ : variable let cacheAndNode = (nodeValue, missingVariables, customExplanation) => { - cache[cacheName] = rewriteNode( - node, + cache[cacheName] = { + ...node, nodeValue, - customExplanation || explanation, + explanation: customExplanation || explanation, missingVariables - ) + } return cache[cacheName] } const variableScore = variable.defaultValue ? 1 : 2 @@ -187,16 +187,14 @@ export let parseReferenceTransforms = ( : nodeValue, periodTransform = nodeValue !== transformedNodeValue - let result = rewriteNode( - { - ...filteredNode, - periodTransform: periodTransform, - ...(periodTransform ? { originPeriodValue: nodeValue } : {}) - }, - transformedNodeValue, - filteredNode.explanation, - filteredNode.missingVariables - ) + let result = { + ...filteredNode, + periodTransform, + ...(periodTransform ? { originPeriodValue: nodeValue } : {}), + nodeValue: transformedNodeValue, + explanation: filteredNode.explanation, + missingVariables: filteredNode.missingVariables + } return result } diff --git a/source/engine/parseRule.js b/source/engine/parseRule.js index 9fb7fec9c..dfc4bf77b 100644 --- a/source/engine/parseRule.js +++ b/source/engine/parseRule.js @@ -5,7 +5,7 @@ import evaluate from 'Engine/evaluateRule' import { parse } from 'Engine/parse' import { evolve, map } from 'ramda' import React from 'react' -import { evaluateNode, makeJsx, rewriteNode } from './evaluation' +import { evaluateNode, makeJsx } from './evaluation' import { Node } from './mecanismViews/common' import { disambiguateRuleReference, findParentDependency } from './rules' @@ -82,7 +82,7 @@ export default (rules, rule, parsedRules) => { nodeValue = explanation.nodeValue, missingVariables = explanation.missingVariables - return rewriteNode(node, nodeValue, explanation, missingVariables) + return { ...node, nodeValue, explanation, missingVariables } } let child = parse(rules, rule, parsedRules)(value) @@ -177,7 +177,7 @@ let evolveCond = (name, rule, rules, parsedRules) => value => { nodeValue = explanation.nodeValue, missingVariables = explanation.missingVariables - return rewriteNode(node, nodeValue, explanation, missingVariables) + return { ...node, nodeValue, explanation, missingVariables } } let child = parse(rules, rule, parsedRules)(value) diff --git a/source/engine/rules.js b/source/engine/rules.js index 32db27a62..193590e1d 100644 --- a/source/engine/rules.js +++ b/source/engine/rules.js @@ -84,9 +84,19 @@ export let nameLeaf = pipe( ) export let encodeRuleName = name => - encodeURI(name.replace(/\s\.\s/g, '/').replace(/\s/g, '-')) + encodeURI( + name + .replace(/\s\.\s/g, '/') + .replace(/-/g, '\u2011') // replace with a insecable tiret to differenciate from space + .replace(/\s/g, '-') + ) export let decodeRuleName = name => - decodeURI(name.replace(/\//g, ' . ').replace(/-/g, ' ')) + decodeURI( + name + .replace(/\//g, ' . ') + .replace(/-/g, ' ') + .replace(/\u2011/g, '-') + ) export let ruleParents = dottedName => { let fragments = splitName(dottedName) // dottedName ex. [CDD . événements . rupture] @@ -232,7 +242,7 @@ export let findParentDependency = (rules, rule) => { reject(isNil), find( //Find the first "calculable" parent - ({ question, unit, formule, name }) => + ({ question, unit, formule }) => (question && !unit && !formule) || (question && formule?.['une possibilité'] !== undefined) || (typeof formule === 'string' && formule.includes(' = ')) //implicitly, the format is boolean diff --git a/source/engine/traverse.js b/source/engine/traverse.js index 7bd57447f..f1ef0cdca 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -1,9 +1,13 @@ -import { evaluateControls } from 'Engine/controls'; -import parseRule from 'Engine/parseRule'; -import { chain, path } from 'ramda'; -import { evaluateNode } from './evaluation'; -import { parseReference } from './parseReference'; -import { findRule, findRuleByDottedName, disambiguateRuleReference } from './rules'; +import { evaluateControls } from 'Engine/controls' +import parseRule from 'Engine/parseRule' +import { chain, path } from 'ramda' +import { evaluateNode } from './evaluation' +import { parseReference } from './parseReference' +import { + disambiguateRuleReference, + findRule, + findRuleByDottedName +} from './rules' /* Dans ce fichier, les règles YAML sont parsées. @@ -65,7 +69,7 @@ export let parseAll = flatRules => { ) }) }) - /* Then we need to infer units. Since only references to variables have been created, we need to wait for the latter map to complete before starting this job. Consider this example : + /* Then we need to infer units. Since only references to variables have been created, we need to wait for the latter map to complete before starting this job. Consider this example : A = B * C B = D / E diff --git a/source/locales/en.yaml b/source/locales/en.yaml index c54b745d3..8f135991d 100644 --- a/source/locales/en.yaml +++ b/source/locales/en.yaml @@ -557,7 +557,7 @@ Plusieurs associés: Several partners Un seul associé: Only one partner Responsabilité limitée: Limited liability Sans responsabilité limitée: Without limited liability -Pas en auto entrepreneur: Not in auto-entrepreneur +Pas en auto-entrepreneur: Not in auto-entrepreneur Précédent: Previous Choisir plus tard: Choose later diff --git a/source/règles/base.yaml b/source/règles/base.yaml index a696ad74e..87ee264be 100644 --- a/source/règles/base.yaml +++ b/source/règles/base.yaml @@ -1310,7 +1310,7 @@ type: rémunération unité: € période: flexible - formule: rémunération . brut - cotisations . salariales + formule: brut - cotisations . salariales - espace: contrat salarié . rémunération nom: net imposable @@ -3267,7 +3267,7 @@ assiette: revenu imposable taux: taux personnalisé - CEHR - - auto entrepreneur . impôt . versement libératoire . montant + - auto-entrepreneur . impôt . versement libératoire . montant - espace: impôt nom: méthode de calcul @@ -3281,7 +3281,7 @@ question: Comment souhaitez-vous calculer l'impôt sur le revenu ? # 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: auto entrepreneur . impôt . versement libératoire + non applicable si: auto-entrepreneur . impôt . versement libératoire période: aucune par défaut: barème standard formule: @@ -3322,7 +3322,7 @@ somme: - contrat salarié . rémunération . net imposable - indépendant . revenu professionnel - - auto entrepreneur . impôt . revenu imposable + - auto-entrepreneur . impôt . revenu imposable - espace: impôt nom: revenu abattu @@ -3333,7 +3333,7 @@ formule: somme: - revenu abattu par défaut - - auto entrepreneur . impôt . revenu imposable + - auto-entrepreneur . impôt . revenu imposable - espace: impôt nom: revenu abattu par défaut @@ -3407,7 +3407,7 @@ formule: somme: - revenu abattu par défaut - - auto entrepreneur . impôt . revenu abattu + - auto-entrepreneur . impôt . revenu abattu - contrat salarié . prime d'impatriation références: Article 1417 du Code général des impôts: https://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000034596743&cidTexte=LEGITEXT000006069577&categorieLien=id&dateTexte=20170505 @@ -3442,7 +3442,7 @@ somme: - contrat salarié . rémunération . net - indépendant . revenu net de cotisations - - auto entrepreneur . revenu net de cotisations + - auto-entrepreneur . revenu net de cotisations - nom: revenu net après impôt unité: € @@ -3559,11 +3559,11 @@ variations: - si: indépendant alors: revenu net de cotisations + indépendant . cotisations et contributions - - si: auto entrepreneur + - si: auto-entrepreneur alors: inversion numérique: avec: - - auto entrepreneur . revenu net de cotisations + - auto-entrepreneur . revenu net de cotisations - revenu net après impôt - entreprise . chiffre d'affaires - entreprise . chiffre d'affaires minimum @@ -3577,7 +3577,7 @@ question: Quelles sont les charges de l'entreprise ? description: | - 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'affaire encaissé. + 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'affaire encaissé. Nous ne traitons pas encore la TVA : les charges sont à renseigner hors taxe (excepté pour les auto-entrepreneurs en franchise de TVA) @@ -3894,7 +3894,7 @@ - entreprise . date de création = 'avant 2019' - entreprise . catégorie d'activité = 'libérale' - toutes ces conditions: - - auto entrepreneur + - auto-entrepreneur - entreprise . date de création = 'avant 2018' - entreprise . catégorie d'activité = 'libérale' @@ -4196,7 +4196,7 @@ 1.1: 0% 1.4: 3.1% -- nom: auto entrepreneur +- nom: auto-entrepreneur icônes: 🚶 par défaut: non question: L'activité est-elle exercée en auto-entreprise ? @@ -4205,7 +4205,7 @@ rend non applicable: - contrat salarié -- espace: auto entrepreneur +- espace: auto-entrepreneur nom: base des cotisations formule: entreprise . chiffre d'affaires période: flexible @@ -4214,7 +4214,7 @@ message: Seuil de chiffre d'affaires dépassé. [En savoir plus](/documentation/auto-entrepreneur/plafond) niveau: avertissement -- espace: auto entrepreneur +- espace: auto-entrepreneur nom: plafond 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 un certain seuil, qui dépend de sa catégorie d'activité. @@ -4237,7 +4237,7 @@ alors: 170000 - sinon: 70000 -- espace: auto entrepreneur +- espace: auto-entrepreneur nom: revenu net de cotisations résumé: Avant impôt question: Quel revenu avant impôt voulez-vous toucher ? @@ -4246,7 +4246,7 @@ période: flexible unité: € -- espace: auto entrepreneur +- espace: auto-entrepreneur nom: cotisations et contributions unité: € formule: @@ -4259,7 +4259,7 @@ Imposition du micro-entrepreneur: https://www.service-public.fr/professionnels-entreprises/vosdroits/F23267 période: flexible -- espace: auto entrepreneur . cotisations et contributions +- espace: auto-entrepreneur . cotisations et contributions nom: TFC titre: Taxes pour frais de chambre unité: € @@ -4276,7 +4276,7 @@ - commerce - métiers -- espace: auto entrepreneur . cotisations et contributions . TFC +- espace: auto-entrepreneur . cotisations et contributions . TFC nom: commerce titre: taxe pour frais de chambre de commerce période: flexible @@ -4294,7 +4294,7 @@ alors: 0.015% - sinon: 0.044% -- espace: auto entrepreneur . cotisations et contributions . TFC +- espace: auto-entrepreneur . cotisations et contributions . TFC nom: métiers période: flexible unité: € @@ -4309,7 +4309,7 @@ alors: 0.22% - sinon: 0.48% -- espace: auto entrepreneur . cotisations et contributions +- espace: auto-entrepreneur . cotisations et contributions nom: contribution formation professionnelle titre: Contribution à la formation professionnelle unité: € @@ -4332,7 +4332,7 @@ alors: 0.1% - sinon: 0 -- espace: auto entrepreneur . cotisations et contributions +- espace: auto-entrepreneur . cotisations et contributions nom: cotisations description: | Les cotisations sociales donnent à l'auto-entrepreneur accès à une protection sociale minimale : une retraite, des soins de santé, des allocations familiales, etc. @@ -4354,7 +4354,7 @@ références: La protection sociale du micro-entrepreneur: https://bpifrance-creation.fr/encyclopedie/micro-entreprise-regime-auto-entrepreneur/fiscal-social-comptable/protection-sociale -- espace: auto entrepreneur . cotisations et contributions . cotisations +- espace: auto-entrepreneur . cotisations et contributions . cotisations nom: retraite complémentaire description: Le montant total qui est alloué à la retraite complémentaire, utile pour estimer le montant total de la pension de retraite des auto-entrepreneurs unité: € @@ -4377,7 +4377,7 @@ - entreprise . catégorie d'activité = 'artisanale' alors: 3.50% -- espace: auto entrepreneur . cotisations et contributions . cotisations +- espace: auto-entrepreneur . cotisations et contributions . cotisations nom: taux de cotisation description: | Les cotisations sociales de l'auto-entreprise sont simplifiées : il n'y a qu'une ligne unique dont le taux dépend de la catégorie d'activité. @@ -4407,7 +4407,7 @@ - espace: entreprise . ACRE nom: année - applicable si: auto entrepreneur + applicable si: auto-entrepreneur question: Quel est l'âge de l'entreprise ? formule: une possibilité: @@ -4427,12 +4427,12 @@ - espace: entreprise . ACRE . année nom: moins de trois ans -- espace: auto entrepreneur . cotisations et contributions . cotisations +- espace: auto-entrepreneur . cotisations et contributions . cotisations nom: taux ACRE période: flexible formule: 100% - réduction ACRE -- espace: auto entrepreneur . cotisations et contributions . cotisations +- espace: auto-entrepreneur . cotisations et contributions . cotisations nom: réduction ACRE titre: réduction ACRE applicable si: entreprise . ACRE @@ -4449,16 +4449,16 @@ références: Fiche URSSAF: https://www.urssaf.fr/portail/home/independant/je-beneficie-dexonerations/accre.html service-public.fr: https://www.service-public.fr/professionnels-entreprises/vosdroits/F32318 -- espace: auto entrepreneur . cotisations et contributions . cotisations +- espace: auto-entrepreneur . cotisations et contributions . cotisations nom: plafond ACRE formule: plafond sécurité sociale temps plein / impôt . abattement . taux inversé période: flexible -- espace: auto entrepreneur +- espace: auto-entrepreneur nom: impôt -- espace: auto entrepreneur . impôt +- espace: auto-entrepreneur . impôt nom: abattement période: flexible unité: '€' @@ -4469,12 +4469,12 @@ taux: taux - 305 -- espace: auto entrepreneur . impôt . abattement +- espace: auto-entrepreneur . impôt . abattement nom: taux inversé description: C'est le taux à appliquer pour savoir ce qu'il reste après application de l'abattement formule: 1 - taux -- espace: auto entrepreneur . impôt . abattement +- espace: auto-entrepreneur . impôt . abattement nom: taux titre: taux d'abattement de l'impôt formule: @@ -4488,7 +4488,7 @@ alors: 71% - sinon: 50% -- espace: auto entrepreneur . impôt +- espace: auto-entrepreneur . impôt nom: versement libératoire description: > Avec l'option pour le versement libératoire, l’impôt sur le revenu est payé en même temps que vos cotisations (par mois ou par trimestre) avec application d’un taux spécifique en fonction de votre activité. @@ -4504,9 +4504,9 @@ niveau: info période: aucune -- espace: auto entrepreneur . impôt . versement libératoire +- espace: auto-entrepreneur . impôt . versement libératoire nom: montant - titre: versement libératoire auto entrepreneur + titre: versement libératoire auto-entrepreneur description: | Si vous avez opté pour le versement libératoire, l’impôt sur le revenu est payé en même temps que vos cotisations (par mois ou par trimestre) avec application d’un taux spécifique en fonction de votre activité : @@ -4531,13 +4531,13 @@ - si: entreprise . catégorie d'activité = 'libérale' alors: 2.2% -- espace: auto entrepreneur . impôt +- espace: auto-entrepreneur . impôt nom: revenu imposable non applicable si: versement libératoire période: flexible formule: revenu abattu -- espace: auto entrepreneur . impôt +- espace: auto-entrepreneur . impôt nom: revenu abattu titre: revenu abattu auto-entrepreneur période: flexible @@ -4632,7 +4632,7 @@ - somme: - trimestres salarié - trimestres indépendant - - trimestres auto entrepreneur + - trimestres auto-entrepreneur - 4 - nom: trimestres salarié @@ -4681,11 +4681,11 @@ références: cnav.fr: https://www.legislation.cnav.fr/Pages/bareme.aspx?Nom=salaire_validant_un_trimestre_montant_bar -- nom: trimestres auto entrepreneur - applicable si: auto entrepreneur +- nom: trimestres auto-entrepreneur + applicable si: auto-entrepreneur espace: protection sociale . retraite . trimestres validés par an période: aucune - 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é. + 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é. formule: variations: - si: entreprise . catégorie d'activité = 'libérale' @@ -4759,7 +4759,7 @@ formule: le maximum de: - indépendant . revenu professionnel - - auto entrepreneur . impôt . revenu imposable + - auto-entrepreneur . impôt . revenu imposable - contrat salarié . rémunération . brut - espace: protection sociale . retraite @@ -4834,7 +4834,7 @@ assiette: somme: - indépendant . cotisations et contributions . cotisations . retraite complémentaire - - auto entrepreneur . cotisations et contributions . cotisations . retraite complémentaire + - auto-entrepreneur . cotisations et contributions . cotisations . retraite complémentaire facteur: 1 / prix d'achat du point - espace: protection sociale . retraite . complémentaire sécurité des indépendants @@ -4879,13 +4879,13 @@ unité: € formule: somme: - - indemnités journalières . auto entrepreneur + - indemnités journalières . auto-entrepreneur - indemnités journalières . indépendant - indemnités journalières . salarié - espace: protection sociale . santé . indemnités journalières - nom: auto entrepreneur - applicable si: auto entrepreneur + nom: auto-entrepreneur + applicable si: auto-entrepreneur période: aucune unité: € formule: diff --git a/source/règles/externalized.yaml b/source/règles/externalized.yaml index 0c51159aa..20f1d4524 100644 --- a/source/règles/externalized.yaml +++ b/source/règles/externalized.yaml @@ -2369,7 +2369,7 @@ 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: + 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. @@ -2402,7 +2402,7 @@ entreprise . charges: 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, + ne paiera pas de cotisations ou impôt dessus. Pour l'auto-entrepreneur, elles ne sont pas déductibles du chiffre d'affaire encaissé. @@ -2823,7 +2823,7 @@ indépendant . cotisations et contributions . formation professionnelle: indépendant . cotisations et contributions . cotisations . allocations familiales: titre.en: family allowances titre.fr: allocations familiales -auto entrepreneur: +auto-entrepreneur: question.en: Is the activity carried out in a auto-enterprise? question.fr: L'activité est-elle exercée en auto-entreprise ? description.en: | @@ -2837,9 +2837,9 @@ auto entrepreneur: 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. - titre.en: auto entrepreneur - titre.fr: auto entrepreneur -auto entrepreneur . base des cotisations: + titre.en: auto-entrepreneur + titre.fr: auto-entrepreneur +auto-entrepreneur . base des cotisations: contrôles.en: - si: base des cotisations > plafond message: >- @@ -2854,7 +2854,7 @@ auto entrepreneur . base des cotisations: niveau: avertissement titre.en: contribution basis titre.fr: base des cotisations -auto entrepreneur . plafond: +auto-entrepreneur . plafond: description.en: > The status of microentrepreneur applies as long as the annual turnover (actually collected during the calendar year) does not exceed a certain @@ -2874,7 +2874,7 @@ auto entrepreneur . plafond: individuelle](/sécurité-sociale/indépendant). titre.en: upper limit titre.fr: plafond -auto entrepreneur . revenu net de cotisations: +auto-entrepreneur . revenu net de cotisations: résumé.en: Before taxes résumé.fr: Avant impôt question.en: What pre-tax income do you want to receive? @@ -2887,22 +2887,22 @@ auto entrepreneur . revenu net de cotisations: l'impôt sur le revenu. titre.en: Net contribution income titre.fr: revenu net de cotisations -auto entrepreneur . cotisations et contributions: +auto-entrepreneur . cotisations et contributions: titre.en: Contributions titre.fr: cotisations et contributions -auto entrepreneur . cotisations et contributions . TFC: +auto-entrepreneur . cotisations et contributions . TFC: titre.en: Chamber taxes titre.fr: Taxes pour frais de chambre -auto entrepreneur . cotisations et contributions . TFC . commerce: +auto-entrepreneur . cotisations et contributions . TFC . commerce: titre.en: Chamber of Trades taxes titre.fr: taxe pour frais de chambre de commerce -auto entrepreneur . cotisations et contributions . TFC . métiers: +auto-entrepreneur . cotisations et contributions . TFC . métiers: titre.en: Chamber of Crafts taxes titre.fr: taxe pour frais de chambre des métiers -? auto entrepreneur . cotisations et contributions . contribution formation professionnelle +? auto-entrepreneur . cotisations et contributions . contribution formation professionnelle : titre.en: Contribution to vocational training titre.fr: Contribution à la formation professionnelle -auto entrepreneur . cotisations et contributions . cotisations: +auto-entrepreneur . cotisations et contributions . cotisations: description.en: > Social security contributions give the self-employed entrepreneur access to a minimum social protection: a pension, health care, social security, social @@ -2931,7 +2931,7 @@ auto entrepreneur . cotisations et contributions . cotisations: l'ACRE, une réduction de cotisations, dégressive sur 3 ans. titre.en: contributions titre.fr: cotisations -auto entrepreneur . cotisations et contributions . cotisations . retraite complémentaire: +auto-entrepreneur . cotisations et contributions . cotisations . retraite complémentaire: description.en: >- The total amount that is allocated to the supplementary pension, useful to estimate the total amount of the retirement pension for auto-entrepreneurs @@ -2940,7 +2940,7 @@ auto entrepreneur . cotisations et contributions . cotisations . retraite compl estimer le montant total de la pension de retraite des auto-entrepreneurs titre.en: supplementary pension titre.fr: retraite complémentaire -auto entrepreneur . cotisations et contributions . cotisations . taux de cotisation: +auto-entrepreneur . cotisations et contributions . cotisations . taux de cotisation: description.en: > The social contributions of the self-employed are simplified: there is no than a single line whose rate depends on the category of activity. @@ -3002,11 +3002,11 @@ entreprise . ACRE . année . moins de deux ans: entreprise . ACRE . année . moins de trois ans: titre.en: less than three years titre.fr: moins de trois ans -auto entrepreneur . cotisations et contributions . cotisations . taux ACRE: +auto-entrepreneur . cotisations et contributions . cotisations . taux ACRE: titre.en: | "ACRE" rate titre.fr: taux ACRE -auto entrepreneur . cotisations et contributions . cotisations . réduction ACRE: +auto-entrepreneur . cotisations et contributions . cotisations . réduction ACRE: titre.en: | "ACRE" reduction titre.fr: réduction ACRE @@ -3017,16 +3017,16 @@ auto entrepreneur . cotisations et contributions . cotisations . réduction ACRE description.fr: >- Ce taux peut dans certains cas réduire le montant des cotisations sociales de l'auto-entrepreneur pour l'aider dans ses premières année d'activité. -auto entrepreneur . cotisations et contributions . cotisations . plafond ACRE: +auto-entrepreneur . cotisations et contributions . cotisations . plafond ACRE: titre.en: ACRE upper limit titre.fr: plafond ACRE -auto entrepreneur . impôt: +auto-entrepreneur . impôt: titre.en: tax titre.fr: impôt -auto entrepreneur . impôt . abattement: +auto-entrepreneur . impôt . abattement: titre.en: allowance titre.fr: abattement -auto entrepreneur . impôt . abattement . taux inversé: +auto-entrepreneur . impôt . abattement . taux inversé: description.en: >- This is the rate to be applied to determine what remains after the application of @@ -3036,10 +3036,10 @@ auto entrepreneur . impôt . abattement . taux inversé: l'abattement titre.en: inverted rate titre.fr: taux inversé -auto entrepreneur . impôt . abattement . taux: +auto-entrepreneur . impôt . abattement . taux: titre.en: tax allowance rate titre.fr: taux d'abattement de l'impôt -auto entrepreneur . impôt . versement libératoire: +auto-entrepreneur . impôt . versement libératoire: description.en: > With the option for the discharge payment, the income tax is paid at the same time as your contributions (per month or per quarter) with the application of a specific rate according to your activity. To benefit from it, your reference tax income must not exceed €27,086 in 2018 description.fr: > @@ -3069,9 +3069,9 @@ auto entrepreneur . impôt . versement libératoire: niveau: info titre.en: discharge payment titre.fr: versement libératoire -auto entrepreneur . impôt . versement libératoire . montant: - titre.en: discharge payment for auto entrepreneur - titre.fr: versement libératoire auto entrepreneur +auto-entrepreneur . impôt . versement libératoire . montant: + titre.en: discharge payment for auto-entrepreneur + titre.fr: versement libératoire auto-entrepreneur description.en: | If you have opted for the discharge payment, the income tax is paid at the same time as your contributions (per month or per quarter) with application of a specific rate according to your activity: @@ -3094,10 +3094,10 @@ auto entrepreneur . impôt . versement libératoire . montant: - 2,2% pour les autres prestations de services relevants des bénéfices non commerciaux (BNC) -auto entrepreneur . impôt . revenu imposable: +auto-entrepreneur . impôt . revenu imposable: titre.en: taxable income titre.fr: revenu imposable -auto entrepreneur . impôt . revenu abattu: +auto-entrepreneur . impôt . revenu abattu: titre.en: reduced income titre.fr: revenu abattu auto-entrepreneur protection sociale: @@ -3146,17 +3146,17 @@ protection sociale . retraite . trimestres validés par an . trimestres indépen protection sociale . retraite . trimestres validés par an . barème trimestres générique: titre.en: generic quarters scale titre.fr: barème trimestres générique -protection sociale . retraite . trimestres validés par an . trimestres auto entrepreneur: +protection sociale . retraite . trimestres validés par an . trimestres auto-entrepreneur: description.en: >- Minimum turnover thresholds for the validation of quarters for retirement as a self-employed entrepreneur. Below the minimum amount, you will only have access to the solidarity allowance. description.fr: >- Les seuils de chiffre d'affaires minimum pour la validation des trimestres - pour la retraite en auto entrepreneur. En-dessous du montant minimum, vous + pour la retraite en auto-entrepreneur. En-dessous du montant minimum, vous n'aurez accès qu'à l'allocation de solidarité. titre.en: auto-entrepreneur quarters - titre.fr: trimestres auto entrepreneur + titre.fr: trimestres auto-entrepreneur protection sociale . revenu moyen: description.en: >- The income used to calculate the amount of retirement pensions and daily @@ -3221,9 +3221,9 @@ protection sociale . santé . indemnités journalières: partir de votre revenu brut et versées tous les 14 jours en moyenne. titre.en: Daily allowances titre.fr: indemnités journalières -protection sociale . santé . indemnités journalières . auto entrepreneur: - titre.en: auto entrepreneur - titre.fr: auto entrepreneur +protection sociale . santé . indemnités journalières . auto-entrepreneur: + titre.en: auto-entrepreneur + titre.fr: auto-entrepreneur protection sociale . santé . indemnités journalières . indépendant: titre.en: self employed titre.fr: indépendant diff --git a/source/sites/mon-entreprise.fr/App.css b/source/sites/mon-entreprise.fr/App.css index 7b5b75b2f..7ba421664 100644 --- a/source/sites/mon-entreprise.fr/App.css +++ b/source/sites/mon-entreprise.fr/App.css @@ -1,12 +1,14 @@ html, body, #js { - min-height: 100%; + height: 100%; + overflow: hidden; } .app-container { position: relative; width: 100%; + overflow: auto; height: 100vh; } .app-content { @@ -22,8 +24,6 @@ body, flex: 1; } .app-container { - overflow: auto; min-height: 100vh; - height: auto; } } diff --git a/source/sites/mon-entreprise.fr/App.js b/source/sites/mon-entreprise.fr/App.js index cbaab6788..291db9a3f 100644 --- a/source/sites/mon-entreprise.fr/App.js +++ b/source/sites/mon-entreprise.fr/App.js @@ -75,9 +75,7 @@ function InFranceRoute({ basename, language }) { ...retrievePersistedState(), previousSimulation: retrievePersistedSimulation() }}> -
- -
+ ) } diff --git a/source/sites/mon-entreprise.fr/layout/Navigation/SideBar.css b/source/sites/mon-entreprise.fr/layout/Navigation/SideBar.css index fb6d892dd..35969ee3d 100644 --- a/source/sites/mon-entreprise.fr/layout/Navigation/SideBar.css +++ b/source/sites/mon-entreprise.fr/layout/Navigation/SideBar.css @@ -20,6 +20,7 @@ } .sidebar__container.opened + * { transform: translateX(100%); + overflow: hidden; } .menu__button { position: absolute; diff --git a/source/sites/mon-entreprise.fr/pages/ÉconomieCollaborative/activités.yaml b/source/sites/mon-entreprise.fr/pages/ÉconomieCollaborative/activités.yaml index 887112bd5..7c53c0fad 100644 --- a/source/sites/mon-entreprise.fr/pages/ÉconomieCollaborative/activités.yaml +++ b/source/sites/mon-entreprise.fr/pages/ÉconomieCollaborative/activités.yaml @@ -54,7 +54,7 @@ plateformes: - Deliveroo - Uber - - Academia + - Malt - plateformes de jobbing (Youpijob, Frizbiz) seuil pro: 0 explication: | diff --git a/test/bug-cotisations.test.js b/test/bug-cotisations.test.js index 4d0dd1483..401f3799b 100644 --- a/test/bug-cotisations.test.js +++ b/test/bug-cotisations.test.js @@ -62,7 +62,7 @@ describe('bug-analyse-many', function() { const situationSelector = dottedName => ({ 'contrat salarié . rémunération . net de cotisations': 3500, - 'auto entrepreneur': 'non', + 'auto-entrepreneur': 'non', 'contrat salarié': 'oui', 'contrat salarié . assimilé salarié': 'oui', 'contrat salarié . ATMP . taux réduit': 'oui', diff --git a/test/mécanismes/expressions.yaml b/test/mécanismes/expressions.yaml index 626794b83..fbdf41127 100644 --- a/test/mécanismes/expressions.yaml +++ b/test/mécanismes/expressions.yaml @@ -104,7 +104,6 @@ nombre de personnes: 10 valeur attendue: 300 - - test: comparaison stricte formule: salaire de base < 3001 exemples: @@ -215,16 +214,23 @@ - situation: revenu: 1000 valeur attendue: 12000 -############## -# Hors limite aujourd'hui -#- test: opérations multiples -# formule: 4 * plafond sécurité sociale * 12 -# -#- test: comparaison et opération -# formule: salaire de base < 4 * plafond sécurité sociale -# exemples: -# - situation: -# salaire de base: 1000 -# plafond sécurité sociale: 3500 -# valeur attendue: true +- test: opérations multiples + formule: 4 * plafond sécurité sociale * 10% + exemples: + - situation: + plafond sécurité sociale: 1000 + valeur attendue: 400 + +- test: comparaison et opération + formule: salaire de base < 4 * plafond sécurité sociale + exemples: + - situation: + salaire de base: 1000 + plafond sécurité sociale: 3500 + valeur attendue: true + +- test: nombres négatifs + formule: -5 * -10 + exemples: + - valeur attendue: 50 diff --git a/yarn.lock b/yarn.lock index af121c466..459b0b342 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5889,12 +5889,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.17.15, lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4: +lodash@4.17.15, lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -6359,6 +6354,11 @@ moo@^0.4.3: resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" integrity sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw== +moo@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.0.tgz#72f949e6735aeb27d07eb7c087ea5a70143c56e5" + integrity sha512-AMv6iqhTEd5vT/cQlH6cammKS5ekyHhyqTRKi5zKMWl1RTyFnQ3ohPSBNSm8ySe2wlxSKwDonr9D5ZT44mdO3g== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -6423,10 +6423,10 @@ nearley-loader@^2.0.0: resolved "https://registry.yarnpkg.com/nearley-loader/-/nearley-loader-2.0.0.tgz#8d75fd2ab3ca9f6153ae099b2bf18f8d5605d203" integrity sha512-kkUlMrkLWMoQPlOVmv7a8aHFEiTOShPb1H+CkvJrDMYpMCqnQUpfJgViGFlh0wufMQlGcawPzebcng6KnDJEdg== -nearley@^2.16.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.18.0.tgz#a9193612dd6d528a2e47e743b1dc694cfe105223" - integrity sha512-/zQOMCeJcioI0xJtd5RpBiWw2WP7wLe6vq8/3Yu0rEwgus/G/+pViX80oA87JdVgjRt2895mZSv2VfZmy4W1uw== +nearley@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.0.tgz#37717781d0fd0f2bfc95e233ebd75678ca4bda46" + integrity sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA== dependencies: commander "^2.19.0" moo "^0.4.3"