From b4a025cad1c2f27c57141184a01b7a4a9f9c24d1 Mon Sep 17 00:00:00 2001 From: Mael Thomas Date: Wed, 1 Mar 2017 11:21:53 +0100 Subject: [PATCH] [moteur] traitement de la formule & affichage --- règles/rémunération-travail/cdd/CIF.yaml | 2 +- source/components/Rule.css | 23 ++++++- source/components/Rule.js | 75 +++++++++++++++++----- source/engine/traverse.js | 81 ++++++++++++++++++------ 4 files changed, 143 insertions(+), 38 deletions(-) diff --git a/règles/rémunération-travail/cdd/CIF.yaml b/règles/rémunération-travail/cdd/CIF.yaml index d744494f2..5b33130a0 100644 --- a/règles/rémunération-travail/cdd/CIF.yaml +++ b/règles/rémunération-travail/cdd/CIF.yaml @@ -23,5 +23,5 @@ formule: multiplication: - assiette: salaire de base + assiette: E taux: 1% diff --git a/source/components/Rule.css b/source/components/Rule.css index 362d85f68..041ee4064 100644 --- a/source/components/Rule.css +++ b/source/components/Rule.css @@ -70,13 +70,13 @@ margin: 1em 3em } .node { - margin-top: .5em; + margin-top: 1em; padding-left: 1em; } .ruleProp > div > .name { padding: 0 1em; border: 1px solid black; - background: #00ad9c + background: #df5320 } .mecanism { } @@ -104,3 +104,22 @@ #rule-rules .value.non { color: #f22c40; } + +.variable .name { + padding: 0 1em; + border: 1px solid black; + background: #6666ea; +} + +.rate .name { + padding: 0 1em; + border: 1px solid black; + background: #407ee7; +} + +.multiplicationSign { + margin: .1em .6em; + font-size: 150%; + vertical-align: sub; + display: block; +} diff --git a/source/components/Rule.js b/source/components/Rule.js index 9ac086472..41b786621 100644 --- a/source/components/Rule.js +++ b/source/components/Rule.js @@ -12,7 +12,14 @@ export default class Rule extends Component { name } = this.props.params, rule = analyseSituation( - v => ({'A': 'non', 'B': 'oui', 'C': 'oui', 'Z': 'non', 'X': 'non'}[v]) + v => ( + { 'A': 'non', + 'B': 'oui', + 'C': 'oui', + 'Z': 'non', + 'X': 'non', + 'E': 5789 + }[v]) )[0] return ( @@ -49,8 +56,8 @@ export default class Rule extends Component { }}
-

Formule

- {this.renderObject(rule['formule'])} +

Calcul

+
@@ -65,7 +72,7 @@ export default class Rule extends Component { return ''} theme={theme} - hideRoot="true" + hideRoot={true} shouldExpandNode={() => true} data={rootKey ? {[rootKey]: o} : o} /> } @@ -111,15 +118,41 @@ let Mecanism = ({nodeValue, name, explanation}) => {name} -
    - {explanation.map(item =>
  • - {item.category == 'expression' ? - : - } -
  • )} -
+ {R.contains(name)(["l'une de ces conditions", 'toutes ces conditions']) && +
    + {explanation.map(item =>
  • + {item.category == 'expression' ? + : + } +
  • )} +
+ } + {name == 'multiplication' && + + } +let Multiplication = ({base, rate}) => +
+ + × + +
+ + +let Variable = ({nodeValue, variableName}) => + + {variableName} + + + + +let Percentage = ({percentage}) => + + {percentage} + + + let Expression = ({nodeValue, expression}) =>
@@ -128,15 +161,27 @@ let Expression = ({nodeValue, expression}) =>
-let NodeValue = ({data}) => do { - let valeur = data == null ? '?' : ( - data ? 'oui' : 'non' - ); +let NodeValue = ({boolean, data}) => do { + let valeur = data == null ? + '?' + : ( R.is(Number)(data) ? + data + : ( data ? 'oui' : 'non') + ); + ←  {valeur} } +let Formula = ({explanation, nodeValue}) => do { +
+
+ {expression} + +
+
+} diff --git a/source/engine/traverse.js b/source/engine/traverse.js index 06bbb4a1b..552b7ecd1 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -19,9 +19,9 @@ let knownVariable = (situation, variableName) => R.or( ) != null let transformPercentage = s => - s.indexOf('%') > -1 ? - +s.replace('%', '') / 100 : - +s + R.contains('%')(s) ? + +s.replace('%', '') / 100 + : +s /* @@ -120,6 +120,40 @@ let treat = (situationGate, rule) => rawNode => { )(v) } + if (k === 'multiplication') { + let base = v['assiette'], + [baseVariableName] = recognizeExpression(rule, base), + baseValue = situationGate(baseVariableName) + let rawRate = v['taux'], //TODO gérer les taux historisés + rate = transformPercentage(rawRate) + + return { + nodeValue: baseValue && baseValue * rate, // null * 6 = 0 :-o + category: 'mecanism', + name: 'multiplication', + type: 'numeric', + explanation: { + base: { + type: 'numeric', + category: 'variable', + // name: 'base', déduit de la propriété de l'objet + nodeValue: baseValue, + explanation: null, + variableName: baseVariableName + }, + rate: { + type: 'numeric', + category: 'percentage', + percentage: rawRate, + nodeValue: rate, + explanation: null + }, + //TODO limit: 'plafond' + //TODO multiplier: 'multiplicateur' + } + } + } + throw 'Mécanisme inconnu !' + JSON.stringify(rawNode) } @@ -129,28 +163,35 @@ let treatRuleRoot = (situationGate, rule) => R.evolve({ // -> Voilà les attribu // 'meta': pas de traitement pour l'instant // 'cond' : Conditions d'applicabilité de la règle - 'non applicable si': value => - ({ - category: 'ruleProp', - rulePropType: 'cond', - name: 'non applicable si', - type: 'boolean', - ... do { - let child = treat(situationGate, rule)(value); - ({ - nodeValue: child.nodeValue, - explanation: child - }) - } - }) + 'non applicable si': value => { + let child = treat(situationGate, rule)(value) + return { + category: 'ruleProp', + rulePropType: 'cond', + name: 'non applicable si', + type: 'boolean', + nodeValue: child.nodeValue, + explanation: child + } + } , // [n'importe quel mécanisme booléen] : expression booléenne (simple variable, négation, égalité, comparaison numérique, test d'inclusion court / long) || l'une de ces conditions || toutes ces conditions // 'applicable si': // pareil mais inversé ! - // pour certaines variables booléennes, ex. appartenance à régime Alsace-Moselle, la formule et le non applicable si se rejoignent - 'formule': null, + // note: pour certaines variables booléennes, ex. appartenance à régime Alsace-Moselle, la formule et le non applicable si se rejoignent // [n'importe quel mécanisme numérique] : multiplication || barème en taux marginaux || le maximum de || le minimum de || ... - + 'formule': value => { + let child = treat(situationGate, rule)(value) + return { + category: 'ruleProp', + rulePropType: 'formula', + name: 'formule', + type: 'numeric', + nodeValue: child.nodeValue, + explanation: child + } + } + , // TODO les mécanismes de composantes et de variations utilisables un peu partout ! // TODO 'temporal': information concernant les périodes : à définir !