From ab197a4a39afdebcea545348257f5b0e7811efa1 Mon Sep 17 00:00:00 2001 From: Laurent Bossavit Date: Wed, 28 Jun 2017 07:57:47 +0200 Subject: [PATCH] =?UTF-8?q?:white=5Fcheck=5Fmark:=20Tester=20le=20m=C3=A9c?= =?UTF-8?q?anisme=20de=20multiplication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/traverse.test.js | 7 +++ source/engine/traverse.js | 118 ++++++++++++++++++------------------- 2 files changed, 66 insertions(+), 59 deletions(-) diff --git a/__tests__/traverse.test.js b/__tests__/traverse.test.js index 527323d8c..bcb8ce57b 100644 --- a/__tests__/traverse.test.js +++ b/__tests__/traverse.test.js @@ -111,4 +111,11 @@ describe('analyseSituation with mecanisms', function() { expect(analyseSituation(rules,"startHere")(stateSelector)).to.have.property('nodeValue',3269) }); + it('should handle multiplications', function() { + let rawRules = [ + {nom: "startHere", formule: {"multiplication": {assiette:3259, plafond:3200, facteur:1, taux:1.5}}}], + rules = rawRules.map(enrichRule) + expect(analyseSituation(rules,"startHere")(stateSelector)).to.have.property('nodeValue',4800) + }); + }); diff --git a/source/engine/traverse.js b/source/engine/traverse.js index 90f6449ae..eb7c1d1b0 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -448,6 +448,64 @@ let treat = (situationGate, rules, rule) => rawNode => { /> } }, + mecanismProduct = (k,v) => { + let + mult = (base, rate, facteur, plafond) => + Math.min(base, plafond) * rate * facteur, + constantNode = constant => ({nodeValue: constant}), + assiette = reTreat(v['assiette']), + //TODO parser le taux dans le parser ? + taux = v['taux'] ? reTreat({taux: v['taux']}) : constantNode(1), + facteur = v['facteur'] ? reTreat(v['facteur']) : constantNode(1), + plafond = v['plafond'] ? reTreat(v['plafond']) : constantNode(Infinity), + //TODO rate == false should be more explicit + nodeValue = (val(taux) === 0 || val(taux) === false || val(assiette) === 0 || val(facteur) === 0) ? + 0 + : anyNull([taux, assiette, facteur, plafond]) ? + null + : mult(val(assiette), val(taux), val(facteur), val(plafond)) + return { + nodeValue, + category: 'mecanism', + name: 'multiplication', + type: 'numeric', + explanation: { + assiette, + taux, + facteur, + plafond + //TODO introduire 'prorata' ou 'multiplicateur', pour sémantiser les opérandes ? + }, + jsx: +
  • + assiette: + {assiette.jsx} +
  • + {taux.nodeValue != 1 && +
  • + taux: + {taux.jsx} +
  • } + {facteur.nodeValue != 1 && +
  • + facteur: + {facteur.jsx} +
  • } + {plafond.nodeValue != Infinity && +
  • + plafond: + {plafond.jsx} +
  • } + + } + /> + } + }, treatObject = rawNode => { let mecanisms = R.intersection(R.keys(rawNode), R.keys(knownMecanisms)) @@ -464,65 +522,7 @@ let treat = (situationGate, rules, rule) => rawNode => { if (k === 'logique numérique') return mecanismNumericalLogic(k,v) if (k === 'taux') return mecanismPercentage(k,v) if (k === 'somme') return mecanismSum(k,v) - - if (k === 'multiplication') { - let - mult = (base, rate, facteur, plafond) => - Math.min(base, plafond) * rate * facteur, - constantNode = constant => ({nodeValue: constant}), - assiette = reTreat(v['assiette']), - //TODO parser le taux dans le parser ? - taux = v['taux'] ? reTreat({taux: v['taux']}) : constantNode(1), - facteur = v['facteur'] ? reTreat(v['facteur']) : constantNode(1), - plafond = v['plafond'] ? reTreat(v['plafond']) : constantNode(Infinity), - //TODO rate == false should be more explicit - nodeValue = (val(taux) === 0 || val(taux) === false || val(assiette) === 0 || val(facteur) === 0) ? - 0 - : anyNull([taux, assiette, facteur, plafond]) ? - null - : mult(val(assiette), val(taux), val(facteur), val(plafond)) - return { - nodeValue, - category: 'mecanism', - name: 'multiplication', - type: 'numeric', - explanation: { - assiette, - taux, - facteur, - plafond - //TODO introduire 'prorata' ou 'multiplicateur', pour sémantiser les opérandes ? - }, - jsx: -
  • - assiette: - {assiette.jsx} -
  • - {taux.nodeValue != 1 && -
  • - taux: - {taux.jsx} -
  • } - {facteur.nodeValue != 1 && -
  • - facteur: - {facteur.jsx} -
  • } - {plafond.nodeValue != Infinity && -
  • - plafond: - {plafond.jsx} -
  • } - - } - /> - } - } + if (k === 'multiplication') return mecanismProduct(k,v) if (k === 'barème') { // Sous entendu : barème en taux marginaux.