Vérifie l'unité des suggestions

Pour éviter les bugs comme celui corrigé dans caff99f qui était encore
présent dans la règle "contrat salarié . rémunération . brut de base .
équivalent temps plein"

La vérification de la cohérence d'unité n'est pas suffisamment stricte
pour détecter tous les problèmes, issue à venir.
pull/1135/head
Maxime Quandalle 2020-09-27 16:42:12 +01:00
parent 8d3119aa73
commit ce5013cdc3
2 changed files with 65 additions and 37 deletions

View File

@ -132,9 +132,9 @@ contrat salarié . frais professionnels . titres-restaurant . montant unitaire:
dépasser 11,10€ par titre en 2020.
par défaut: 8 €/titre-restaurant
suggestions:
faible: 6
moyenne: 8
max exonéré: 11.10
faible: 6 €/titre-restaurant
moyenne: 8 €/titre-restaurant
max exonéré: 11.10 €/titre-restaurant
contrat salarié . frais professionnels . titres-restaurant . taux participation employeur:
description: >-
@ -143,8 +143,8 @@ contrat salarié . frais professionnels . titres-restaurant . taux participation
question: Quelle est la participation de l'employeur ?
par défaut: 50 %
suggestions:
50%: 50
60%: 60
50%: 50 %
60%: 60 %
contrat salarié . frais professionnels . titres-restaurant . contrôle taux employeur min:
type: notification
@ -191,9 +191,9 @@ contrat salarié . frais professionnels . indemnité kilométrique vélo . dista
question: >-
Quelle est la distance parcourue en vélo chaque mois pour le trajet domicile / travail ?
suggestions:
2 km/jour: 40
5 km/jour: 100
10 km/jour: 200
2 km/jour: 40 km/mois
5 km/jour: 100 km/mois
10 km/jour: 200 km/mois
par défaut: 80 km/mois
contrat salarié . activité partielle:
@ -245,9 +245,9 @@ contrat salarié . activité partielle . heures travaillées:
inférieur au temps contractuel.
par défaut: 0 heures/mois
suggestions:
30 h/semaine: 130
20 h/semaine: 86.6666
10 h/semaine: 43.3333
30 h/semaine: 130 heures/mois
20 h/semaine: 86.6666 heures/mois
10 h/semaine: 43.3333 heures/mois
contrat salarié . activité partielle . heures travaillées . contrôle temps de travail:
type: notification
@ -889,10 +889,10 @@ contrat salarié . CDD . durée contrat:
références:
Durée maximale d'un CDD (service-public.fr): https://www.service-public.fr/professionnels-entreprises/vosdroits/F31211
suggestions:
18 mois: 18
1 an: 12
6 mois: 6
3 mois: 3
18 mois: 18 mois
1 an: 12 mois
6 mois: 6 mois
3 mois: 3 mois
# 70% des contrats signés ont concerné, en 2015, des durées inférieures à un mois
par défaut: 1 mois
@ -902,8 +902,8 @@ contrat salarié . CDD . congés non pris:
Le contrat étant à durée déterminée, le salarié n'a pas forcément le temps de prendre tous les jours de congés qu'il a acquis comme tout salarié au cours du contrat.
Par exemple, pour un contrat de 3 mois, le salarié acquiert 2,08 jours de congés par mois (25 jours / 12 mois = 2,08), donc 6,25 sur la durée du contrat. Or il se peut que l'entreprise le contraigne à n'en prendre que 4, donc 2,25 jours ne seront pas pris. Ils seront payés par l'employeur à la fin du contrat.
suggestions:
3 jours: 3
10 jours: 10
3 jours: 3 jour ouvré
10 jours: 10 jour ouvré
par défaut: 0 jour ouvré
contrat salarié . CDD . contrôle congés non pris max:
@ -1391,7 +1391,7 @@ contrat salarié . rémunération . avantages en nature . autres . montant:
Quel est le montant de ces autres avantages ?
par défaut: 0 €/mois
suggestions:
🚗 véhicule: 260
🚗 véhicule: 260 €/mois
contrat salarié . rémunération . avantages en nature . ntic . montant:
titre: outils NTIC
@ -1419,18 +1419,18 @@ contrat salarié . rémunération . avantages en nature . ntic . coût appareils
par défaut: 800
# TODO : vérifier et documenter les chiffres
suggestions:
📱: 400
📱✨ (haut de gamme): 850
💻: 1200
💻 + 📱✨: 2050
📱: 400
📱✨ (haut de gamme): 850
💻: 1200
💻 + 📱✨: 2050
contrat salarié . rémunération . avantages en nature . ntic . abonnements:
question: Quel est le coût de l'abonnement (forfait mobile, etc.) pris en charge par l'employeur ?
par défaut: 20 €/mois
suggestions:
aucun: 0
standard: 20
international: 40
aucun: 0 €/mois
standard: 20 €/mois
international: 40 €/mois
contrat salarié . rémunération . avantages en nature . nourriture:
icônes: 🍝
@ -1455,8 +1455,8 @@ contrat salarié . rémunération . avantages en nature . nourriture . repas par
Combien de repas par mois sont payés par l'employeur ?
par défaut: 21 repas/mois
suggestions:
1 par jour: 21
2 par jour: 42
1 par jour: 21 repas/mois
2 par jour: 42 repas/mois
contrat salarié . statut cadre:
question: Le salarié a-t-il le statut cadre ?
@ -2008,9 +2008,9 @@ contrat salarié . temps de travail . heures supplémentaires:
question: Combien d'heures supplémentaires (non récupérées en repos) sont effectuées par mois ?
par défaut: 0 heure/mois
suggestions:
aucune: 0
39h / semaine: 17.33
42h / semaine: 30.33
aucune: 0 heure/mois
39h / semaine: 17.33 heures/mois
42h / semaine: 30.33 heures/mois
références:
service-public.fr: https://www.service-public.fr/particuliers/vosdroits/F2391
@ -2504,8 +2504,8 @@ contrat salarié . complémentaire santé . part employeur:
description: Part de la complémentaire santé payée par l'employeur. Doit être de 50% minimum
question: Quelle est la part de la complémentaire santé payée par l'employeur ?
suggestions:
50%: 50
100%: 100
50%: 50%
100%: 100%
par défaut: 50%
contrat salarié . complémentaire santé . part employeur min:
@ -2541,9 +2541,9 @@ contrat salarié . complémentaire santé . forfait:
question: Quel est le montant mensuel total (salarié et employeur) de la complémentaire santé entreprise ?
par défaut: 40 €/mois
suggestions:
basique: 40
élevé: 100
alsace moselle basique: 30
basique: 40 €/mois
élevé: 100 €/mois
alsace moselle basique: 30 €/mois
contrat salarié . complémentaire santé . contrôle min:
type: notification

View File

@ -3,7 +3,7 @@ import React from 'react'
import { Trans } from 'react-i18next'
import { Mecanism } from './components/mecanisms/common'
import { RuleLinkWithContext } from './components/RuleLink'
import { warning } from './error'
import { compilationError, warning } from './error'
import evaluate from './evaluateRule'
import { evaluateNode, makeJsx, mergeAllMissing } from './evaluation'
import { parse } from './parse'
@ -13,7 +13,12 @@ import {
nameLeaf
} from './ruleUtils'
import { ParsedRule, Rule, Rules } from './types'
import { parseUnit, simplifyUnit } from './units'
import {
areUnitConvertible,
parseUnit,
serializeUnit,
simplifyUnit
} from './units'
import { capitalise0, coerceArray } from './utils'
export default function<Names extends string>(
@ -216,6 +221,29 @@ export default function<Names extends string>(
type: 'boolean',
explanation: parsedRules[dottedName]
}
if (process.env.NODE_ENV === 'development') {
Object.values(parsedRules[dottedName]['suggestions'] ?? {}).forEach(
suggestion => {
const parsedSuggestion = parse(rules, rule, parsedRules)(suggestion)
if (
!areUnitConvertible(
parsedRules[dottedName].unit,
parsedSuggestion.unit
) &&
parsedSuggestion.category !== 'reference'
) {
compilationError(
dottedName,
`La suggestion "${suggestion}" n'a pas une unité compatible avec la règle :
"${serializeUnit(parsedRules[dottedName].unit)}" et "${serializeUnit(
parsedSuggestion.unit
)}"`
)
}
}
)
}
return parsedRules[dottedName]
}