publicodes icon indicating copy to clipboard operation
publicodes copied to clipboard

Un parent non applicable ne devrait pas désactiver les enfants lorsqu'il les évalue dans son contexte

Open johangirod opened this issue 2 years ago • 4 comments

Un problème est apparu sur mon-entreprise suite à la réécriture des règles pour la dernière version de publicodes qui change la désactivation de branche https://github.com/betagouv/mon-entreprise/issues/2084

contrat salarié . frais professionnels . titres-restaurant:
  applicable si:
    nom: éligible
    question: Le salarié reçoit-il des titres-restaurant ?
    par défaut: non

La question de l'égibilité ne sera jamais posée car par défaut valant "non"... ce qui la rend non applicable.

Voir le studio

On avait évoqué l'idée que la non applicabilité des parents soit l'équivalent d'un rend non applicable de toutes les références vers les enfants depuis l'extérieur de l'espace de nom. En revanche, lorsque ces références sont utilisées depuis l'espace de nom non applicable elles resteraient applicables.

Ce n'est pas bloquant : il suffit de déplacer la règle de l'applicabilité dans un espace de nom frère :

contrat salarié . frais professionnels . titres-restaurant:
    question: Le salarié reçoit-il des titres-restaurant ?
    par défaut: non

contrat salarié . frais professionnels . titres-restaurant . montant:
  ..

Par contre, cela peut poser un problème dans le cas où la condition d'applicabilité fait appel à des règles enfants :

ma règle: 
  applicable si: montant < plafond
  valeur: 
    nom: montant
    ...

Ou encore pour l'évaluation de texte dans le contexte de la règle :

ma règle:
   description: 
     texte: |
       Le plafond maximum est de {{ plafond }} ce qui donne le droit à une aide d'un montant de {{ montant }}

ma règle . plafond:
ma règle . montant:

Lorsque la ma règle est non applicable, la description sera :

      Le plafond maximum est de Non applicable ce qui donne le droit à une aide d'un montant de Non applicable

johangirod avatar Apr 05 '22 12:04 johangirod

Merci pour les exemples, j'ai essayé d'intégrer un correctif dans #203 qui concerne aussi la désactivation de branche et l'applicabilité parent-enfant, mais je suis un peu embrouillé.

Si je comprends bien il faudrait qu'on ait simultanément les 2 comportements suivants :

espace 1: non             # nodeValue = false
espace 1 . enfant: non    # nodeValue = null (désactivé par le parent)

espace 2: enfant          # nodeValue = false
espace 2 . enfant: non    # nodeValue = false
espace 2 . enfant 2: non  # nodeValue = null (désactivé par le parent)

Edit: L'exemple fonctionne maintenant dans #203 (studio)

mquandalle avatar Apr 06 '22 10:04 mquandalle

Oups, je viens de voir ton message. C'est encore autre chose que je proposais : faire que la valeur de l'enfant dépende du contexte d'évaluation.

Si on est à l'intérieur d'un espace non applicable, l'ensemble des enfants est non applicable (null) sauf dans les évaluations à l'intérieur de l'espace de nom.

espace 1:                     # nodeValue = null
  non applicable si: enfant   # nodeValue = true

espace 1 . enfant: oui

espace 2: 
  valeur: espace 1 . enfant # nodeValue = null

On pourrait utiliser la même implémentation que le mécanisme : rend non applicable sauf dans.

johangirod avatar Apr 06 '22 16:04 johangirod

Ah mais oui tu as tellement raison, dire que je me suis tordu l'esprit parce que mon exemple avec les enfants qui sont applicables ou non selon qu'ils soient référencés dans la formule de calcul de leur parent me paraissait indésirable.

En fait il faut rendre non applicable les références, pas les règles. Ça montre quand même qu'on a vraiment pas l'habitude de ce paradigme de programmation par substitution — et que ça vaudrait le coup de faire un petit paragraphe sur le sujet dans la documentation, même pour moi !

mquandalle avatar Apr 07 '22 09:04 mquandalle

Exemple qui m'a piégé


aide . condition: revenu = 'supérieur'
aide . condition 2: revenu = 'supérieur'
test condition: aide . condition = oui
test condition 2: aide . condition 2 = oui

aide . montant: 
  non applicable si: aide . condition
  valeur: 12
aide: 
  valeur: montant

revenu: "'supérieur'"

laem avatar Apr 17 '24 12:04 laem