diff --git a/source/engine/grammar.ne b/source/engine/grammar.ne index 04cf210c1..ed9adfa80 100644 --- a/source/engine/grammar.ne +++ b/source/engine/grammar.ne @@ -6,7 +6,7 @@ main -> | Boolean {% id %} | Variable {% id %} | NegatedVariable {% id %} - | ModifiedVariable {% id %} + | TemporalVariable {% id %} | FilteredVariable {% id %} | percentage {% id %} | Comparison {% id %} @@ -18,7 +18,7 @@ Comparison -> Comparable _ ComparisonOperator _ Comparable {% d => ({ explanation: [d[0], d[4]] }) %} -Comparable -> (number | percentage | CalcExpression | Variable | Constant) {% d => d[0][0] %} +Comparable -> (number | percentage | CalcExpression | Variable | TemporalVariable | Constant) {% d => d[0][0] %} ComparisonOperator -> ">" | "<" | ">=" | "<=" | "=" | "!=" @@ -28,12 +28,11 @@ FilteredVariable -> Variable _ Filter {% d => ({category: 'variable', filter: d[ Filter -> "(" VariableFragment ")" {% d =>d[1] %} -# Modificateurs temporels pas utilisés aujourd'hui -ModifiedVariable -> Variable _ Modifier {% d => ({category: 'modifiedVariable', modifier: d[2], variable: d[0] }) %} +TemporalVariable -> Variable _ TemporalTransform {% d => ({...d[0], temporalTransform: d[2] }) %} -Modifier -> "[" TemporalModifier "]" {% d =>d[1][0] %} +TemporalTransform -> "[" Temporalities "]" {% d =>d[1] %} -TemporalModifier -> "annuel" | "mensuel" | "jour ouvré" {% id %} +Temporalities -> "annuel" | "mensuel" {% id %} #----- diff --git a/source/engine/treat.js b/source/engine/treat.js index e32d79839..699c9e4e2 100644 --- a/source/engine/treat.js +++ b/source/engine/treat.js @@ -55,7 +55,7 @@ let nearley = () => new Parser(Grammar.ParserRules, Grammar.ParserStart) export let treatString = (rules, rule) => rawNode => { /* On a affaire à un string, donc à une expression infixe. Elle sera traité avec le parser obtenu grâce à NearleyJs et notre grammaire `grammar.ne`. - On obtient un objet de type Variable (avec potentiellement un 'modifier', par exemple temporel (TODO)), CalcExpression ou Comparison. + On obtient un objet de type Variable (avec potentiellement un 'modifier', par exemple temporel), CalcExpression ou Comparison. Cet objet est alors rebalancé à 'treat'. */ diff --git a/source/engine/treatVariable.js b/source/engine/treatVariable.js index 9cbd43cd7..d5dbbd257 100644 --- a/source/engine/treatVariable.js +++ b/source/engine/treatVariable.js @@ -123,7 +123,12 @@ export let treatVariableTransforms = (rules, rule) => parseResult => { rules, filteredNode.explanation.dottedName ) - if (!rule.période) { + + let inlinePeriodTransform = { mensuel: 'mois', annuel: 'année' }[ + parseResult.temporalTransform + ] + + if (!rule.période && !inlinePeriodTransform) { if (ruleToTransform.période == 'flexible') throw new Error( `Attention, une variable sans période, ${ @@ -140,7 +145,8 @@ export let treatVariableTransforms = (rules, rule) => parseResult => { let environmentPeriod = situation('période') || 'mois' let callingPeriod = - rule.période == 'flexible' ? environmentPeriod : rule.période + inlinePeriodTransform || + (rule.période == 'flexible' ? environmentPeriod : rule.période) let calledPeriod = ruleToTransform.période == 'flexible' ? environmentPeriod @@ -150,9 +156,11 @@ export let treatVariableTransforms = (rules, rule) => parseResult => { callingPeriod === 'mois' && calledPeriod === 'année' ? nodeValue / 12 : callingPeriod === 'année' && calledPeriod === 'mois' - ? nodeValue * 12 - : nodeValue, + ? nodeValue * 12 + : nodeValue, periodTransform = nodeValue !== transformedNodeValue + if (inlinePeriodTransform) + console.log(situation('période'), transformedNodeValue) let result = rewriteNode( { diff --git a/source/règles/base.yaml b/source/règles/base.yaml index d36fde7ce..1fffadba1 100644 --- a/source/règles/base.yaml +++ b/source/règles/base.yaml @@ -741,18 +741,18 @@ salaire médian: 2300 SMIC: 1500 contrôles: - - si: brut de base < 300 + - si: brut de base [mensuel] < 300 message: Entrez un salaire raisonnable niveau: bloquant - - si: brut de base < SMIC + - si: brut de base [mensuel] < SMIC [mensuel] niveau: avertissement solution: cible: contrat salarié . temps partiel texte: Est-ce un temps partiel ? - - si: brut de base > 10000 + - si: brut de base [mensuel] > 10000 niveau: information message: | - Le salaire saisi est élevé. Pour rappel, le simulateur ne fonctionne qu'avec des salaires mensuels. + Le salaire saisi est élevé. Ne vous êtes-vous pas trompé de période de calcul ? formule: inversion: question: Quel est le salaire ? @@ -963,7 +963,7 @@ période: flexible formule: rémunération . net de cotisations - avantages en nature . montant contrôles: - - si: net < 200 + - si: net [mensuel] < 200 période: mois message: Entrez un salaire raisonnable niveau: bloquant @@ -989,7 +989,7 @@ formule: net - impôt . neutre contrôles: - - si: net après impôt < 200 + - si: net après impôt [mensuel] < 200 message: Entrez un salaire raisonnable niveau: bloquant @@ -1330,7 +1330,7 @@ formule: rémunération . total sans réduction - réductions de cotisations contrôles: - - si: total < 400 + - si: total [mensuel] < 400 message: Entrez un salaire raisonnable niveau: bloquant @@ -1366,7 +1366,7 @@ type: salaire formule: rémunération . total - aides employeur contrôles: - - si: coût d'embauche < 400 + - si: coût d'embauche [mensuel] < 400 message: Entrez un salaire raisonnable niveau: bloquant @@ -2118,7 +2118,7 @@ basique: 40 élevé: 100 contrôles: - - si: forfait complémentaire santé < 15 + - si: forfait complémentaire santé [mensuel] < 15 niveau: avertissement message: Vérifiez bien qu'une complémentaire santé si peu chère couvre le panier de soin minimal défini dans la loi. diff --git a/test/mécanismes/période.yaml b/test/mécanismes/période.yaml index 91adf4622..5f82973be 100644 --- a/test/mécanismes/période.yaml +++ b/test/mécanismes/période.yaml @@ -148,3 +148,10 @@ assiette trois: 36000 valeur attendue: 300 + +- test: Périodes, préfixe de modification temporelle + formule: assiette trois [mensuel] + exemples: + - situation: + assiette trois: 12000 + valeur attendue: 1000