Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RFC : variables temporelles ⌛ #793

Closed

Conversation

johangirod
Copy link
Contributor

@johangirod johangirod commented Nov 19, 2019

Dans le cadre de l'implémentation des exonérations, nous arrivons à une limite du moteur : ces dernières sont définies à partir d'une date de début d'effet et eventuellement une date de fin d'effet. Elles ne doivent pas être pris en compte pour le calcul des cotisations en dehors de leur période d'effet.

Première idée

Cette introduction de la temporalité dans le moteur nous a apparu dans un premier temps trop hasardeuse, et nous étions partis avec @mquandalle sur une solution se basant sur une surcouche au moteur. Cette dernière ferait une simulation par combinaison de dispositifs actif sur l'année, qu'elle sommerait ensuite, pondéré par la période d'effet.

Néanmoins, cette solution souffre de deux inconvénients majeurs

  • L'introduction d'une nouvelle couche de calcul "hors moteur", et donc potentiellement "hors explications" et "hors règles" pour un mécanisme plutôt commun dans les dispositifs legislatifs
  • La complexité à gerer plusieurs dispositifs actifs sur plusieurs période différentes (avec une complexité en n² p/r au nombre de dispositifs)

Une extension de la définition de "période"

L'idée est d'étendre la notion de période de simulation : "année" / "mois", pour la rendre plus précise. Une période, c'est une date de début et une date de fin. Lorsque l'on clique sur "année" sur les simulateurs, on initialise la période à l'année courante :

- période . début: 01/01/2019
- période . fin: 31/12/2019

Si jamais l'entreprise a été crée en cours d'année, alors la période de calcul des cotisations est ajustée :

- période . début: entreprise . date de création
- période . fin: 31/12/2019

On peut donc imaginer simuler des cotisations (et salaire) sur des période diverses : quelques semaines, quelques jours, plusieurs mois, plusieurs années...

La clé période: flexible dans les variables ferait donc echo au fait que la valeur de cette variable est naturellement proratisée à la période de simulation. On peut d'ailleurs considérer que c'est le comportement par défaut, et supprimer le besoin d'expliciter à chaque fois la période d'une variable

La période de simulation, entrée du moteur

Période devient une entrée de premier niveau pour le moteur de calcul. On veut pouvoir remettre à zéro une situation sans forcément changer la période à calculer.

Les variables sont pro-ratisées par défaut :

On étend la gestion des périodes. Mois / année étaient proratisée dans une variable "flexible". Ce sera également le cas pour des périodes plus précises :

plafond de la sécurité sociale:
  période: mois
  formule: 2800 €
  test: 
    - période:
        début: 01/01/2020
        fin: 11/02/2020
      valeur attendue: 3900€
VOIR L'ANCIENNE PROPOSITION

Proposition d'un nouveau mécanisme : prorata temporis

Le mécanisme prorata temporis fonctionne en faisant calculant le prorata temporel entre la période de la variable et la période précisée en paramètre.

Syntaxe de base :

période: flexible
formule: 
  prorata temporis:
    assiette: réduction . montant
    début d'effet: réduction . début d'effet
    durée: 1 an

Exemple 1

situation:
  réduction . montant: 1000 €
  réduction . début d'effet: 02/02/2018
  période . début: 01/01/2019
  période . fin: 31/12/2019
valeur attendue: 90.41 € (1000 * 33 / 365)

Exemple 2

situation:
  réduction . montant: 100 €
  réduction . début d'effet: 02/02/2018
  période . début: 01/01/2020
  période . fin: 01/02/2020
valeur attendue: 0 € (1000 * 0 / 365)

Exemple 3

situation:
  réduction . montant: 500 €
  réduction . début d'effet: 10/01/2018
  période . début: 01/01/2018
  période . fin: 31/01/2018
valeur attendue: 338,71 € (500 * 21 / 31)

Syntaxe dévelopée

Dans le cas d'exonération degressive (ZFU, ACRE), on voudrait pouvoir spécifier d'un coup différent taux pour chaque année. Je propose la syntaxe suivante :

prorata temporis:
  assiette: cotisations . maladie
  début d'effet: entreprise . date de création
  tranches:
    - avant: 10 ans
      taux: 100%
    - entre: 10 ans
      et: 15 ans
      taux: 60%
    - entre: 15 ans
      et: 17 ans
      taux: 40%
    - entre: 18 ans
      et: 20 ans
      taux: 20%

Nouvelle proposition : mécanisme variable temporelle

Syntaxe par défaut

aide:
  période: mois
  formule:
    variable temporelle:
      début: date d'effet
      montant: 310 €
  • 0 pour la période de simulation avant date d'effet
  • 310 €/mois pour la période de simulation après date d'effet
situation: 
  date d'effet: 20/01/2020
période: 
  début: 01/01/2020
  fin: 31/01/2020
valeur attendue: 110 €

Avec durée

aide:
  période: année
  formule:
    variable temporelle:
      début: date d'effet
      durée: 1 an
      montant: 3650 €
  • 0 pour la période de simulation avant date d'effet
  • 310 €/mois pour la période de simulation entre date d'effet et date d'effet + 1 an
  • 0 après
situation: 
  date d'effet: 02/01/2019
période:
  début: 01/01/2020
  fin: 31/12/2020
valeur attendue: 330 €

Avec périodes

taux exonération:
  période: aucune
  formule:
    variable temporelle:
      début: date d'effet
      périodes: 
        - pendant: 1 an
          montant: 100%
        - entre: 1 an
          et: 2 ans
          montant: 50%
  • 0 pour la période de simulation avant date d'effet
  • 100% pour la période de simulation entre date d'effet et date d'effet + 1 an
  • 50% pour la période de simulation entre date d'effet + 1 an et date d'effet + 2 an
  • 0 après
situation: 
  date d'effet: 11/02/2018
période:
  début: 01/02/2019
  fin: 31/12/2019
valeur attendue: 67.86% 

67.86% = 100% * (10 / 28) + 50% * (18 / 28)

Implications et questionnement

  • Ajout du type 'date' au moteur
  • Ajout des calculs sur les dates
  • Ajout d'une période de simulation
  • Peut-on se servir des variables temporelles pour modeliser les changements legislatifs au cours du temps ?
  • Le mot clé "période" sur les variables est ambigu. Il correspond d'avantage au concept d'unité. Il faudrait reflechir si il est possible de l'eliminer complètement (cf Intégration période dans les unités #734)

@laem
Copy link
Contributor

laem commented Nov 20, 2019

Merci @johangirod pour la présentation super détaillée ! Ça me semble très intéressant, utile et de toute façon inévitable.

Par contre je ne comprends pas l'exemple 1 (pourquoi 33 jours et pas 31 ?) et l'exemple 2 (pourquoi 0 jours alors que la réduction est "active" ?).

@johangirod
Copy link
Contributor Author

johangirod commented Nov 21, 2019

Oups effectivement, ce sont des coquilles, je corrige ça.

De manière générale, je suis de plus en plus persuadé qu'avoir une gestion des période plus subtile va s'imposer. Notamment pour le mécanisme de régularisation progressive sur plusieurs mois (par exemple : la réduction générale).

On profite de la réduction jusqu'à un certain plafond (1,6 SMIC par an).
En gros, il nous faut gérer les valeurs "cumulée"

C'est un sujet parallèle, mais c'est un gros chantier, et important si on veut être un moteur de calcul de cotisations.

Copy link
Contributor

@mquandalle mquandalle left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je suis d'accord avec toi : la gestion des pro-ratisations est fonctionnalité centrale du domaine que l'on traite et il faut une intégration directement au niveau du moteur.

Ce qui me gêne un peu avec ce mécanisme prorata temporis c'est qu'il complique la lecture de certaines règles avec une notion de pro-ratisation qui ne semble pas strictement nécessaire pour le calcul. J'ai annoté dans le code les endroits où ce mécanisme me paraît superflu dans la définition des règles.

Je trouve très intéressante l'idée de remplacer les enums de type "moins d'un an" / "moins de deux ans" / "moins de 3 ans" par un type date et un système de tranches sur les périodes. C'est sémantiquement plus proche du fonctionnement de ces mécanismes, et cela permettra de gérer à la fois les simulateurs et des formulaires de déclaration où l'on précise les dates exactes (là ou les enums sont de simples chaînes de caractères que l'on ne peut pas exploiter aussi finement).

En particulier dans le cadre du simulateur on peut continuer à proposer un choix de type "première année" / "deuxième année" sans demander la date d'effet précise et donc d'une certaine manière ignorer la date d'effet pour rester dans une logique de simulation où l'on privilégie une réponse rapide à une réponse exacte au jour près (réponse que l'utilisateur n'a pas forcément sous la main). Et même dans ce cadre simplifié de simulation, avoir une compréhension des dates d'effet au niveau du moteur permet d'éviter de poser plusieurs fois les mêmes questions, par exemple si deux dispositifs sont comptés à partir de la date de création de l'entreprise (mettons ACRE et ZFU) et que l'on dit que l'on est dans la première année pour l'ACRE, on en déduit que l'on est aussi dans la première année pour ZFU et on peut ne pas reposer une question pour ce dispositif. Par ailleurs, si l'entreprise est renseignée et que l'on connaît la date de création, on peut pré-remplir automatiquement les réponses à ces questions. Je ne sais pas si je suis très clair, mais l'idée c'est simplement que spécifier les dispositifs d'exonérations avec une date de début/d'effet et une durée permet une exploitation bien plus fine qu'avec de simples enums.

Je n'ai pas encore assez réfléchi pour faire une contre-proposition, mais il me semble que si l'on annote uniquement les dispositifs d'exonérations avec date d'effet + durée, il n'est pas nécessaire de modifier les autres règles pour préciser que leur mode de calcul est pro-ratisé.

Juste un mot sur la solution "hors moteur". L'idée était plutôt d'avoir une couche au dessus du moteur qui permette de prendre en compte des changements de situation au cours du temps, en faisant une combinaison linéaire de chaque situation avec un coefficient correspondant à la durée du cette situation. Par exemple [6 mois] × [salaire : 3000€/mois, acre: oui] + [6 mois] × [salaire : 3000€/mois, acre: non]. Je ne crois pas que cette solution pose un problème de complexité de calcul, même avec plusieurs dispositifs se chevauchant, et surtout il me semble que l'on est de toute façon obligés de décomposer par sous-période et de recombiner ensuite, et ce quelle que soit la méthode de calcul employée. Il me semble aussi que cette logique pourrait être utile dans le cadre de l'API paie pour les salariés (changement du nombre d'heures travaillés d'une semaine sur l'autre, changement de statut, etc.). Il ne me semble pas possible d'intégrer tous les changements de situations envisageables au niveau de la définition des règles, et qu'une couche au dessus de ces définitions pour combiner une situation évoluant au cours du temps est une abstraction utile. De plus il est possible d'afficher cette abstraction dans les pages de documentations via une barre en-tête (un peu comme « assimilé salarié | indépendant | auto-entrepreneur » dans le comparatif de régimes) qui permet de sélectionner la période / situation que l'on visualise.

Mon intuition serait donc d'ajouter un type date et un type durée au moteur comme tu le proposes, et de spécifier les dispositifs d'exonération avec une date d'effet et une durée. Je pense qu'il ne faut pas modifier la définition des autres règles, et que le calcul en lui même devrait se faire par décomposition en sous-périodes. Bien évidemment je suis totalement ouvert à d'autres solutions.

source/règles/base.yaml Outdated Show resolved Hide resolved
prorata temporis:
assiette: plafond sécurité sociale temps plein / impôt . abattement . taux inversé
début d'effet: entreprise . date de création
durée: 3 ans
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je ne comprends pas l'utilisation de prorata temporis ici. Est-il nécessaire de re-spécifier la durée de 3 ans au niveau du plafonnement (elle est déjà indiquée au niveau de l'aide / du taux de réduction). Par ailleurs intuitivement, la proratisation devrait plutôt se faire sur le plafond sécurité sociale temps plein que sur cette formule non ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est la toute la subtilité. Dans certains cas, on voudra la valeur proratisée du PSS par rapport à l'année en cours, d'en d'autres cas, on voudra sa valeur complète.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je pense que c'est probablement le cas, ceci dit tu as un exemple en tête où le PSS n'est pas proratisé à la durée de la période considérée ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je me posais la question tout à l'heure. Et je n'ai pas la réponse. Si le PSS est le plus souvent proratisé à la période de simulation, ça simplifie la définition des règles.

@johangirod
Copy link
Contributor Author

johangirod commented Nov 26, 2019

En particulier dans le cadre du simulateur on peut continuer à proposer un choix de type "première année" / "deuxième année" sans demander la date d'effet précise et donc d'une certaine manière ignorer la date d'effet pour rester dans une logique de simulation où l'on privilégie une réponse rapide à une réponse exacte au jour près

Si on pousse l'utilisation du module de recherche d'entreprise existante, la date de création sera pré-remplie. Pour le reste, on peut imaginer se servir des suggestions au dessus du champs date pour aller plus vite "il y a un an", "il y a deux ans", etc.

Mon intuition serait donc d'ajouter un type date et un type durée au moteur comme tu le proposes, et de spécifier les dispositifs d'exonération avec une date d'effet et une durée. Je pense qu'il ne faut pas modifier la définition des autres règles, et que le calcul en lui même devrait se faire par décomposition en sous-périodes. Bien évidemment je suis totalement ouvert à d'autres solutions.

Effectivement, après reflexions, je partage cette intuition. Il ne devrait pas y avoir besoin du mécanisme de prorata temporis, juste ajouter un début d'effet et une durée pour certaine variable. Je vais tenter une contre-proposition en me basant sur ces remarques.

Il ne me semble pas possible d'intégrer tous les changements de situations envisageables au niveau de la définition des règles, et qu'une couche au dessus de ces définitions pour combiner une situation évoluant au cours du temps est une abstraction utile.

Le problème, c'est que certaines règles legislatives ont pour objet une situation qui évolue. En séparant le coté "dynamique" dans une surcouche, on se prive de la possibilité de les exprimer dans un langage clair. D'où ma volonté qu'elle soient intégrées d'une manière ou d'une autre dans la définition des règles. On commence avec les proratisations temporelle, mais on peut imaginer qu'il en ira de même avec d'autres lois qui se basent sur une évolution.

La difficulté, je te rejoins là dessus, c'est de ne pas surcharger la définition des règles.

@mquandalle
Copy link
Contributor

Oui, effectivement le problème avec une API de type [6 mois] × [salaire : 3000€/mois, acre: oui] + [6 mois] × [salaire : 3000€/mois, acre: non] c'est que la fonction qui effectue cet appel doit déjà connaître les "frontières" c'est à dire les dates de changement de situation, et qu'il faut donc une première interaction avec le moteur pour obtenir ces données (dates et changements correspondants).

En fait ma réserve concernait le fait de surcharger inutilement la définition de certaines règles. Sur l'API du moteur je pense qu'il faut effectivement donner une situation et une période en entrée, et que le moteur puisse gérer le calcul et l’explication des aides temporaires sans données/interactions supplémentaires.

@johangirod
Copy link
Contributor Author

johangirod commented Nov 26, 2019

J'ai revu la proposition en prenant en compte les retours. Je pense que c'est beaucoup plus clair ainsi.

Reste le vocabulaire : cela me gêne d'introduire la notion de variable, un peu trop orienté programmation, dans un langage qui était plus proche du domaine juridique / social.

J'ai pensé à :

  • variable temporelle
  • évolution temporelle
  • élément temporel
  • règle temporelle

Mais rien ne me convient à 100%

@johangirod johangirod changed the title RFC : mécanisme prorata RFC : variables temporelles ⌛ Nov 26, 2019
@mquandalle
Copy link
Contributor

mquandalle commented Nov 26, 2019

  • C'est un détail mais j'aurais tendance à séparer les données sur la période des données de la situation dans les entrées du moteur, c'est à dire passer de

    situation: 
      date d'effet: 20/01/2020
      période . début: 01/01/2020
      période . fin: 31/01/2020
    valeur attendue: 110 €

    à

    situation: 
      date d'effet: 20/01/2020
    période:
      début: 01/01/2020
      fin: 31/01/2020
    valeur attendue: 110 €

    Je pense que c'est plus aligné avec la manière dont on gère ces données dans le code, les données de la période sont gérées à part (par exemple une réinitialisation de la situation ne doit pas toucher la période, etc.)

  • Pour le nom peut-être calendrier ?

    aide:
      période: année
      formule:
        calendrier:
          début: date d'effet
          durée: 1 an
          montant: 3650 €
  • Peut-on se servir des variables temporelles pour modeliser les changements legislatifs au cours du temps ?

    Effectivement remplace et le type date devraient permettre de gérer les évolutions législatives. Peut-être faut-il utiliser le mécanisme variable temporelle/calendrier uniquement pour les aides/exonérations avec une date d'effet et une durée, et utiliser d'autre fonctions type jusqu'au et à partir du à l'intérieur de applicable si afin de pouvoir faire des remplacements ?

     nouveau barème:
       applicable si:
         à partir du: 01/2020
       remplace:
         ir . barème
       formule: [...]

    (d'ailleurs le si de applicable si est un peu de trop ici)

@johangirod
Copy link
Contributor Author

johangirod commented Nov 27, 2019

J'aime bien "calendrier", c'est court, simple, et ça implique directement l'idée d'une variable temporelle.

Effectivement, pour les changements legislatifs, on peut imaginer via un mécanisme de remplacement, ou pour certains cas, via le mécanisme de calendrier :

PSS: 
  période: année
  formule:
    calendrier:
      périodes:
        - en: 2018
          montant: 42 932 €
        - en: 2019
          montant: 43 918 €
        - en: 2020
          montant: 44 121 €

C'est un détail mais j'aurais tendance à séparer les données sur la période des données de la situation dans les entrées du moteur

Ca me va ! Je modifie la proposition dans ce sens.

@johangirod johangirod force-pushed the couverture-legislative-independants branch 2 times, most recently from 36c6caa to 3225955 Compare December 18, 2019 09:42
@johangirod johangirod force-pushed the couverture-legislative-independants branch 11 times, most recently from fc4955e to e5d84c4 Compare January 8, 2020 12:58
@johangirod
Copy link
Contributor Author

Voir #866

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants