96 lines
3.1 KiB
JavaScript
96 lines
3.1 KiB
JavaScript
import { expect } from 'chai'
|
|
import dedent from 'dedent-js'
|
|
import { enrichRule } from 'Engine/rules'
|
|
import { safeLoad } from 'js-yaml'
|
|
import { rules as realRules } from '../source/engine/rules'
|
|
import { analyse, analyseMany, parseAll } from '../source/engine/traverse'
|
|
|
|
describe('bug-analyse-many', function() {
|
|
it('complex inversion with composantes', () => {
|
|
let rawRules = dedent`
|
|
- nom: net
|
|
formule: brut - cotisations
|
|
- nom: cotisations
|
|
formule:
|
|
somme:
|
|
- cotisation a .salarié
|
|
- cotisation b
|
|
|
|
- nom: cotisation a
|
|
formule:
|
|
multiplication:
|
|
assiette: brut
|
|
composantes:
|
|
- attributs:
|
|
dû par: employeur
|
|
taux: 10%
|
|
- attributs:
|
|
dû par: salarié
|
|
taux: 10%
|
|
|
|
- nom: cotisation b
|
|
formule:
|
|
multiplication:
|
|
assiette: brut
|
|
composantes:
|
|
- attributs:
|
|
impôt sur le revenu: x
|
|
taux: 10%
|
|
- attributs:
|
|
impôt sur le revenu: y
|
|
taux: 10%
|
|
|
|
|
|
- nom: brut
|
|
unité: €
|
|
formule:
|
|
inversion numérique:
|
|
avec:
|
|
- net
|
|
`,
|
|
rules = parseAll(safeLoad(rawRules).map(enrichRule)),
|
|
stateSelector = name => ({ net: 700 }[name])
|
|
const targets = ['brut', 'cotisations']
|
|
const many = analyseMany(rules, targets)(stateSelector).targets
|
|
|
|
const one = analyse(rules, 'cotisations')(stateSelector).targets[0]
|
|
|
|
//console.log(many[0].nodeValue, many[1].nodeValue, one.nodeValue)
|
|
expect(many[1].nodeValue).to.be.closeTo(one.nodeValue, 0.1)
|
|
})
|
|
it('should compute the same contributions if asked with analyseMany or analyse', function() {
|
|
const situationSelector = dottedName =>
|
|
({
|
|
'contrat salarié . rémunération . net de cotisations': 3500,
|
|
'auto-entrepreneur': 'non',
|
|
'contrat salarié': 'oui',
|
|
dirigeant: 'assimilé salarié',
|
|
'contrat salarié . ATMP . taux réduit': 'oui',
|
|
'contrat salarié . CDD': 'non',
|
|
'contrat salarié . indemnité kilométrique vélo . indemnité vélo active':
|
|
'non',
|
|
'contrat salarié . rémunération . avantages en nature . montant': 0,
|
|
'contrat salarié . temps partiel': 'non',
|
|
'établissement . localisation': {},
|
|
'contrat salarié . complémentaire santé . part employeur': 50,
|
|
'contrat salarié . complémentaire santé . forfait . en france': 50,
|
|
'entreprise . effectif': 1,
|
|
'entreprise . association non lucrative': 'non'
|
|
}[dottedName])
|
|
const rules = parseAll(realRules.map(enrichRule))
|
|
const targets = [
|
|
'contrat salarié . rémunération . brut de base',
|
|
'contrat salarié . cotisations . salariales'
|
|
]
|
|
const analyseManyValue = analyseMany(rules, targets)(situationSelector)
|
|
.targets[1]
|
|
const analyseValue = analyse(
|
|
rules,
|
|
'contrat salarié . cotisations . salariales'
|
|
)(situationSelector).targets[0]
|
|
|
|
console.log(analyseManyValue.nodeValue, analyseValue.nodeValue)
|
|
expect(analyseManyValue.nodeValue).to.equal(analyseValue.nodeValue)
|
|
})
|
|
})
|