⚙️ améliore la résolution des noms dans les règles

Lorsque l'on cherche un nom de règle, on laisse la possibilité à
une règle de se référencer elle même, mais alors cette résolution
est la dernière à être envisagée.

Dans l'exemple :
```yaml
b: 5
a . b: b
```
`a . b` référence bien `b` qui vaut `5`

Et dans celui ci :
```
a: 0
a . b:
  remplace:a
  par: b * 5
  valeur: 2
```
`a . b` remplace `a` en la multipliant par sa propre valeur (ici 2)

fix #1081, fix #1083
pull/1300/head
Johan Girod 2020-12-10 13:47:24 +01:00 committed by Johan Girod
parent 2669b7783d
commit 08e5b734ba
5 changed files with 23 additions and 42 deletions

View File

@ -1595,13 +1595,12 @@ contrat salarié . plafond sécurité sociale . renonciation proratisation:
du plafond de la sécurité sociale (applicable pour les salariés à temps
partiel), notamment afin d'augmenter le montant des cotisations vieillesse.
par défaut: non
contrat salarié . plafond sécurité sociale . renonciation proratisation . plafond sécurité sociale:
applicable si: temps de travail . quotité de travail < 100%
remplace:
- règle: plafond sécurité sociale
par: plafond sécurité sociale temps plein
contrat salarié . SMIC contractuel:
description: >
Valeur du SMIC pro-ratisé pour prendre en compte le temps partiel et utilisé pour la détermination du salaire minimum

View File

@ -451,7 +451,7 @@ Notifications affichées : contrat salarié . convention collective . contrôle
`;
exports[`calculate simulations-salarié: CCN spectacle vivant 1`] = `
"[3834,0,2500,1938,1856]
"[3923,0,2500,1938,1856]
Notifications affichées : contrat salarié . CDD . information, contrat salarié . convention collective . contrôle décharge"
`;

View File

@ -30,11 +30,11 @@ export function disambiguateRuleReference<R extends Record<string, RuleNode>>(
contextName = '',
partialName: string
): keyof R {
const possibleDottedName = [
contextName,
...ruleParents(contextName),
'',
].map((x) => (x ? x + ' . ' + partialName : partialName))
const possibleDottedName = [contextName, ...ruleParents(contextName), '']
.map((x) => (x ? x + ' . ' + partialName : partialName))
// Rules can reference themselves, but it should be the last thing to check
.sort((a, b) => (a === contextName ? 1 : b === contextName ? -1 : 0))
const dottedName = possibleDottedName.find((name) => name in rules)
if (!dottedName) {
syntaxError(

View File

@ -305,13 +305,18 @@ chaine de charactère:
- situation:
chaine de charactère: "'je t'y vois'"
valeur attendue: je t'y vois
# TODO
# expression sur plusieurs lignes:
# formule: >
# salaire de base
# + 2000
# = 3000
# exemples:
# - situation:
# salaire de base: 1000
# - valeur attendue: true
a: oui
b: 5
a . b: b + 5
a . c: b + 5
désambiguation du nom de règle 1:
formule: a . b
exemples:
- valeur attendue: 10
désambiguation du nom de règle 2:
formule: a . c
exemples:
- valeur attendue: 15

View File

@ -204,30 +204,7 @@ convention hôtels cafés restaurants . frais de repas:
remplace: frais de repas
formule: 6 €/repas
frais de repas non remplacé:
remplacement d'un nom de variable identique:
formule: frais de repas
exemples:
- valeur attendue: 5
# Note: this would produce an infinite loop
# frais de repas remplacé:
# formule: convention hôtels cafés restaurants . frais de repas
# exemples:
# - nom: par défaut
# valeur attendue: 5
frais de repas2:
formule: 5 €/repas
convention hôtels cafés restaurants2:
formule: oui
convention hôtels cafés restaurants2 . remplaçeur:
remplace: frais de repas2
formule: 6 €/repas
frais de repas2 remplacé:
formule: frais de repas2
exemples:
- valeur attendue: 6