1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-09 01:45:03 +00:00
mon-entreprise/test/bug-cotisations.test.js
Johan Girod 00b122fa97 ⚙️ ajoute la conversion d'unité
Gros changements en perspective :
- Supprime la notion de période, au bénéfice de celle d'unité
  (`période : mensuelle` devient `unité: €/mois`)
- Améliore les rapports d'erreur avec des messages plus clair
- Ajoute un avertissement lorsque des types ne sont pas compatible
- Ajoute la conversion automatique d'unité dans le moteur
- Ajoute une notion d'unité par défaut de la simulation,
  c'est l'unité vers laquelle les règles qui ne spécifient pas
  d'unité seront converties
- Ajoute une notion d'unité par défaut des règles, qui spécifie
  l'unité de la règle qui prévaut lorsque qu'il n'y a pas
  d'unité par défaut de la simulation (utile pour les question ou
  pour s'assurer du bon type d'une règle)
2019-12-16 11:34:04 +01:00

95 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)
})
})