From 15776d21cb49534ce75787f2b9f70518761913e5 Mon Sep 17 00:00:00 2001 From: mama Date: Tue, 9 May 2017 15:39:42 +0200 Subject: [PATCH] =?UTF-8?q?:gear:=20Ajout=20du=20m=C3=A9canisme=20de=20n?= =?UTF-8?q?=C3=A9gation=20de=20variables=20bool=C3=A9ennes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Utilisation du symbole ¬ pour l'instant. Sûrement sujet à évolutions --- .../cotisations/ok/agirc.yaml | 3 +- .../cotisations/ok/apec.yaml | 3 +- source/engine/grammar.ne | 17 +++++++---- source/engine/traverse.js | 30 +++++++++++++++++-- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/règles/rémunération-travail/cotisations/ok/agirc.yaml b/règles/rémunération-travail/cotisations/ok/agirc.yaml index 0a5b70810..aadc73c7f 100644 --- a/règles/rémunération-travail/cotisations/ok/agirc.yaml +++ b/règles/rémunération-travail/cotisations/ok/agirc.yaml @@ -6,8 +6,9 @@ destinataire: AGIRC description: | Cotisation de retraite complémentaire cadre. Complète le régime ARRCO, gérée par l'AGIRC (Association Générale des Institutions de Retraite des Cadres) - non applicable si: statut cadre # TODO l'inverse ! Vérifier le fonctionnnement de la négation !statut cadre OU statut cadre = non OU applicable si: statut cadre + #TODO double négation en attendant d'ajouter 'applicable si' + non applicable si: ≠ statut cadre formule: barème: assiette: salaire de base #TODO devrait être assiette cotisations sociales. Mais elle contient les primes CDD diff --git a/règles/rémunération-travail/cotisations/ok/apec.yaml b/règles/rémunération-travail/cotisations/ok/apec.yaml index 4da9cdf1a..1ea689c21 100644 --- a/règles/rémunération-travail/cotisations/ok/apec.yaml +++ b/règles/rémunération-travail/cotisations/ok/apec.yaml @@ -12,7 +12,8 @@ notes: | Avant 2011, il y avait une cotisation forfaitaire au lieu de la tranche A - non applicable si: statut cadre # TODO l'inverse ! Vérifier le fonctionnnement de la négation !statut cadre OU statut cadre = non OU applicable si: statut cadre + #TODO double négation en attendant d'ajouter 'applicable si' + non applicable si: ≠ statut cadre formule: barème: diff --git a/source/engine/grammar.ne b/source/engine/grammar.ne index ed2fd498c..c2ad31e9e 100644 --- a/source/engine/grammar.ne +++ b/source/engine/grammar.ne @@ -1,10 +1,12 @@ # Pour éditer ou comprendre ce fichier, utilisez l'éditeur web Nearley : https://omrelli.ug/nearley-playground/ + main -> - CalcExpression {% id %} - | Variable {% id %} - | ModifiedVariable {% id %} - | Comparison {% id %} + CalcExpression {% id %} + | Variable {% id %} + | NegatedVariable {% id %} + | ModifiedVariable {% id %} + | Comparison {% id %} Comparison -> Comparable _ ComparisonOperator _ Comparable {% d => ({ category: 'comparison', @@ -17,11 +19,16 @@ Comparable -> (int | CalcExpression | Variable) {% d => d[0][0] %} ComparisonOperator -> ">" | "<" | ">=" | "<=" | "=" +NegatedVariable -> "≠" _ Variable {% d => ({category: 'negatedVariable', variable: d[2] }) %} + +# Modificateurs temporels pas utilisés aujourd'hui ModifiedVariable -> Variable _ Modifier {% d => ({category: 'modifiedVariable', modifier: d[2], variable: d[0] }) %} Modifier -> "[" TemporalModifier "]" {% d =>d[1][0] %} TemporalModifier -> "annuel" | "mensuel" | "jour ouvré" {% id %} +#----- + CalcExpression -> Term _ ArithmeticOperator _ Term {% d => ({ category: 'calcExpression', @@ -31,7 +38,7 @@ CalcExpression -> Term _ ArithmeticOperator _ Term {% d => ({ }) %} Term -> Variable {% id %} - | int {% id %} + | int {% id %} ArithmeticOperator -> "+" {% id %} | "-" {% id %} diff --git a/source/engine/traverse.js b/source/engine/traverse.js index 7108139c9..5873ed8c1 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -90,6 +90,28 @@ let fillVariableNode = (rule, situationGate) => (parseResult) => { } } + +let buildNegatedVariable = variable => { + let nodeValue = variable.nodeValue == null ? null : !variable.nodeValue + return { + nodeValue, + category: 'mecanism', + name: 'négation', + type: 'boolean', + explanation: variable, + jsx: + ¬ + {variable.jsx} + + } + /> + } +} + let treat = (situationGate, rule) => rawNode => { let reTreat = treat(situationGate, rule) @@ -104,11 +126,15 @@ let treat = (situationGate, rule) => rawNode => { if (additionnalResults && additionnalResults.length > 0) throw "Attention ! L'expression <" + rawNode + '> ne peut être traitée de façon univoque' - if (!R.contains(parseResult.category)(['variable', 'calcExpression', 'modifiedVariable', 'comparison'])) + if (!R.contains(parseResult.category)(['variable', 'calcExpression', 'modifiedVariable', 'comparison', 'negatedVariable'])) throw "Attention ! Erreur de traitement de l'expression : " + rawNode if (parseResult.category == 'variable') - return fillVariableNode(rule, situationGate)(parseResult, rawNode) + return fillVariableNode(rule, situationGate)(parseResult) + if (parseResult.category == 'negatedVariable') + return buildNegatedVariable( + fillVariableNode(rule, situationGate)(parseResult.variable) + ) if (parseResult.category == 'calcExpression') { let