diff --git a/règles/rémunération-travail/cotisations/ok/versement-transport.yaml b/règles/rémunération-travail/cotisations/ok/versement-transport.yaml index eb79b3e55..166b73db7 100644 --- a/règles/rémunération-travail/cotisations/ok/versement-transport.yaml +++ b/règles/rémunération-travail/cotisations/ok/versement-transport.yaml @@ -20,10 +20,10 @@ formule: sélection: données: taux versement transport - clé: code postal - cherche: codePostal + cherche: code postal + dans: codePostal composantes: - nom: aot - cible: aot + renvoie: aot - nom: smt - cible: smt + renvoie: smt diff --git a/règles/rémunération-travail/entités/ok/etablissement.yaml b/règles/rémunération-travail/entités/ok/etablissement.yaml index 4219487b1..7ae48aae2 100644 --- a/règles/rémunération-travail/entités/ok/etablissement.yaml +++ b/règles/rémunération-travail/entités/ok/etablissement.yaml @@ -5,3 +5,4 @@ description: | Lorsqu'une entreprise dispose de plusieurs établissements, certaines cotisations sont calculées à l'échelle de l'établissement et sont fonction de règlementations locales. + format: nombre diff --git a/source/engine/traverse.js b/source/engine/traverse.js index 35affcc70..047b45b58 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -331,12 +331,22 @@ let treat = (rules, rule) => rawNode => { } let mecanismSelection = (recurse,k,v) => { - let data = v['données'] - let explanation = recurse(v['clé']) + let dataSourceName = v['données'] + let dataSearchField = v['dans'] + let dataTargetName = v['renvoie'] + let explanation = recurse(v['cherche']) let evaluate = (situationGate, parsedRules, node) => { let collectMissing = node => node.explanation.nodeValue ? [] : collectNodeMissing(node.explanation), - nodeValue = null + dataSource = findRuleByName(parsedRules, dataSourceName), + dataKey = evaluateNode(situationGate, parsedRules, explanation).nodeValue, + data = dataSource ? dataSource['data'] : null, + dataItems = (data && dataKey && dataSearchField) ? R.filter(item => item[dataSearchField] == dataKey, data) : null, + dataItemValues = dataItems ? R.values(dataItems) : null, + // TODO - over-specific! transform the JSON instead + dataItemSubValues = dataItemValues ? dataItemValues[0][dataTargetName]["taux"] : null, + sortedSubValues = dataItemSubValues ? R.sortBy(pair => pair[0], R.toPairs(dataItemSubValues)) : null, + nodeValue = sortedSubValues ? Number.parseFloat(R.last(sortedSubValues)[1]) : null return rewriteNode(node,nodeValue,explanation,collectMissing) } diff --git a/test/traverse.test.js b/test/traverse.test.js index 4cd4c8dda..c44b94cb7 100644 --- a/test/traverse.test.js +++ b/test/traverse.test.js @@ -248,13 +248,13 @@ describe('analyseSituation with mecanisms', function() { nom: "startHere", formule: {"sélection": { données: "startHere", - clé: "code postal", - cherche: "codePostal", - cible: "smt" + cherche: "code postal", + dans: "codePostal", + renvoie: "smt" }}, données: 'taux_versement_transport'}, - {espace: "top", nom: "code postal"}], - rules = rawRules.map(enrichRule) + {espace: "top", nom: "code postal", format: "nombre"}], + rules = rawRules.map(rule => enrichRule(rule,data)) expect(analyseSituation(rules,"startHere")(stateSelector)).to.have.property('nodeValue',2.0) });