From 44f01bd82b00660cf003e19b324e38d9c44e3098 Mon Sep 17 00:00:00 2001 From: Mael Date: Sun, 30 Sep 2018 18:38:57 +0000 Subject: [PATCH] =?UTF-8?q?:gear:=20Impl=C3=A9mentation=20des=20p=C3=A9rio?= =?UTF-8?q?des?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/engine/treat.js | 4 +- source/engine/treatVariable.js | 48 ++++++++++++++++ test/mécanismes/période.yaml | 101 +++++++++++++++++++++++++-------- 3 files changed, 127 insertions(+), 26 deletions(-) diff --git a/source/engine/treat.js b/source/engine/treat.js index 065944b07..fe55305ea 100644 --- a/source/engine/treat.js +++ b/source/engine/treat.js @@ -241,7 +241,7 @@ export let treatOther = rawNode => { 'Cette donnée : ' + rawNode + ' doit être un Number, String ou Object' ) } -export let treatObject = (rules, rule) => rawNode => { +export let treatObject = (rules, rule, treatOptions) => rawNode => { let mecanisms = intersection(keys(rawNode), keys(knownMecanisms)) if (mecanisms.length != 1) { @@ -280,5 +280,5 @@ export let treatObject = (rules, rule) => rawNode => { }, action = propOr(mecanismError, k, dispatch) - return action(treat(rules, rule), k, v) + return action(treat(rules, rule, treatOptions), k, v) } diff --git a/source/engine/treatVariable.js b/source/engine/treatVariable.js index aca570d7d..1c019e92f 100644 --- a/source/engine/treatVariable.js +++ b/source/engine/treatVariable.js @@ -6,6 +6,54 @@ import { getSituationValue } from './variables' import { Trans } from 'react-i18next' export let treatVariable = (rules, rule, filter) => parseResult => { + let variable = treatVariableTimeless(rules, rule, filter)(parseResult) + let evaluate = (cache, situation, parsedRules, node) => { + let explanation = evaluateNode( + cache, + situation, + parsedRules, + node.explanation + ) + let nodeValue = explanation.nodeValue + if (nodeValue == null) + return rewriteNode( + node, + nodeValue, + explanation, + explanation.missingVariables + ) + + let ruleToTransform = findRuleByDottedName( + rules, + node.explanation.dottedName + ) + + let variablePeriod = ruleToTransform['période'] || situation('période') + + let newNodeValue = + rule['période'] === 'mois' && variablePeriod === 'année' + ? nodeValue / 12 + : rule['période'] === 'année' && variablePeriod === 'mois' + ? nodeValue * 12 + : nodeValue + + return rewriteNode( + node, + newNodeValue, + explanation, + explanation.missingVariables + ) + } + + return { + type: 'periodTransform', + jsx: () => null, + explanation: variable, + evaluate + } +} + +export let treatVariableTimeless = (rules, rule, filter) => parseResult => { let evaluate = (cache, situation, parsedRules, node) => { let dottedName = node.dottedName, // On va vérifier dans le cache courant, dict, si la variable n'a pas été déjà évaluée diff --git a/test/mécanismes/période.yaml b/test/mécanismes/période.yaml index ba43b51ff..9cb95dd6e 100644 --- a/test/mécanismes/période.yaml +++ b/test/mécanismes/période.yaml @@ -1,39 +1,21 @@ # This is not a mecanism test, but we make use of the simplicity of declaring tests in YAML, only available for mecanisms for now -- test: Barème mensuel - formule: - barème: - assiette: 3000 - tranches: - - en-dessous de: 5000 - taux: 4.65% - - de: 5000 - à: 15000 - taux: 3% - - au-dessus de: 15000 - taux: 1% - - exemples: - - nom: "petite assiette" - situation: - assiette: 3000 - base: 5000 - valeur attendue: 139.5 -- nom: assiette +- nom: assiette mensuelle + période: mois format: € -- test: Barème annuel +- test: Périodes, barème annuel assiette mensuelle période: année formule: barème: # cette formule appellant l'assiette est annuelle : # si l'assiette est aussi annuelle dans le contexte de la simulation actuelle, c'est bon # sinon une conversion est nécessaire et faite automatiquement par le moteur - assiette: assiette + assiette: assiette mensuelle tranches: # ce sont ces chiffres là qui imposent à la règle d'être annuelle # de plus, les règles annuelles de la loi sont rarement traduites officiellement en d'autres périodes @@ -46,9 +28,80 @@ taux: 1% exemples: - - nom: "petite assiette" - situation: + - situation: + assiette mensuelle: 3000 + valeur attendue: 1575 + + +- nom: assiette annuelle + période: année + format: € + +- test: Périodes, barème mensuel assiette annuelle + période: mois + formule: + barème: + # cette formule appellant l'assiette est annuelle : + # si l'assiette est aussi annuelle dans le contexte de la simulation actuelle, c'est bon + # sinon une conversion est nécessaire et faite automatiquement par le moteur + assiette: assiette annuelle + tranches: + # ce sont ces chiffres là qui imposent à la règle d'être annuelle + # de plus, les règles annuelles de la loi sont rarement traduites officiellement en d'autres périodes + - en-dessous de: 2500 + taux: 4.65% + - de: 2500 + à: 7500 + taux: 3% + - au-dessus de: 7500 + taux: 1% + + exemples: + - situation: + assiette annuelle: 36000 + valeur attendue: 131.25 + +- nom: assiette + format: € + +- test: Périodes, période dans la situation + période: année + formule: + barème: + assiette: assiette + tranches: + - en-dessous de: 30000 + taux: 4.65% + - de: 30000 + à: 90000 + taux: 3% + - au-dessus de: 90000 + taux: 1% + + exemples: + - situation: période: mois assiette: 3000 valeur attendue: 1575 + - situation: + période: année + assiette: 36000 + valeur attendue: 1575 + + +- nom: assiette deux + période: mois + format: € + +- test: Périodes, variable neutre appelant variable mensuelle + formule: + multiplication: + assiette: assiette deux + taux: 10% + + exemples: + - situation: + période: mois + assiette deux: 3000 + valeur attendue: 300