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"