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

Corrige les erreurs de calcul sur les allègements #862

Merged
merged 16 commits into from
Feb 21, 2018
Merged

Corrige les erreurs de calcul sur les allègements #862

merged 16 commits into from
Feb 21, 2018

Conversation

Morendil
Copy link
Contributor

@Morendil Morendil commented Dec 14, 2017


Ces changements (effacez les lignes ne correspondant pas à votre cas) :

  • Corrigent ou améliorent un calcul déjà existant.

@Morendil
Copy link
Contributor Author

J'ai ajouté un test pour mettre en évidence le bug et le comportement attendu (tel que je le comprends) sur coefficient_proratisation, et implémenté le comportement attendu.

Cela ne corrige pas encore le test fonctionnel tel qu'il était initialement rédigé à cause d'un écart de 7 centimes, qu'il faudrait peut-être essayer d'expliquer.

En augmentant la marge d'erreur à 10 centimes les tests de décembre deviennent passants, mais il reste encore 3 échecs sur les tests de novembre. Il est possible qu'il reste d'autres bugs dans le calcul.

@Morendil
Copy link
Contributor Author

Après quelques tâtonnements j'arrive à un état stable, au prix d'une modification du test pour le cas d'un salarié embauché pour le seul mois de novembre dans le cas d'un recouvrement anticipé avec régularisation en fin de période.

Mon interprétation de "anticipé" m'amène à affecter l'allègement à novembre et pas décembre, et la régularisation est alors de 0. Mais je me suis peut-être trompé. Il serait utile de documenter par des références précises le fonctionnement des modes de recouvrement, je n'ai trouvé des informations en ligne que sur le mode progressif.

Le noeud du problème était bien la variable coefficient_proratisation et son interaction avec les dates de début et de fin de contrat. Dans la formulation initiale des tests on ne spécifiait pas la date de fin de contrat, ce qui conduisait à supposer que sur la période de la simulation (2017) le salarié avait été employé pendant 2 mois… mais payé sur 1 seul. Fort logiquement cela revenait à le payer moitié moins et faussait donc la comparaison entre le smic et le salaire.

Autre problème, coefficient_proratisation ne voyait pas d'inconvénient à renvoyer des valeurs négatives si la date de fin était antérieure à la date de début, ce qui arrivait comme conséquence de l'évaluation de contrat_de_travail_debut (ou fin) à une période antérieure à la période (le mois) de versement du salaire. J'ai donc ajouté un plancher à 0.

Je suis perplexe quant au fait qu'une variable comme contrat_de_travail_debut soit sensible à la période pour laquelle elle est évaluée. Dans mon esprit on devrait avoir pour certaines variables quelque chose comme
definition_period = ALWAYS
indiquant que sa valeur est invariante dans le temps. Je n'irai pas jusque là dans l'implémentation, je passe le relais à l'équipe Core.

@Anna-Livia
Copy link
Contributor

@Morendil
Copy link
Contributor Author

@Anna-Livia Oh yeah! Bon ça c'est la bonne nouvelle :) Du coup je reformule ce qui me rend perplexe, pourquoi contrat_de_travail_debut n'est pas en definition_period = ETERNITY - peut-être que la réponse est "on n'y a pas encore pensé" et ça serait OK (je ne juge pas), mais peut-être aussi y a-t-il une raison que je ne connais pas encore…

@benjello
Copy link
Member

benjello commented Dec 15, 2017

Je ne suis pas sûr que l'on veuille mettre definition_period = ETERNITY pour contrat_de_travail_debut. En effet imaginons que quelqu'un enchaîne plusieurs emplois, contrat_de_travail_debut un mois donné est la valeur du début de son contrat du travail pour le mois en question.

@Anna-Livia
Copy link
Contributor

Anna-Livia commented Jan 4, 2018

@benjello Le seul contrat_de_travail_debut qui est intéressant dans OpenFisca est celui du contrat de travail en cours, non ? ( Il me semble qu'un scenario décrit une situation à un instant T).
ETERNITY n'est pas un soucis pour moi vu que contrat_de_travail_debut sera pour toujours la date de début de ce contrat de travail d'un instant T.

@benjello
Copy link
Member

benjello commented Jan 4, 2018

@Anna-Livia : openfisca a été étendu spécifiquement pour gérer plusieurs périodes (retraite, recouvrement des allègements de charge etc) sinon toutes les variables seraient à ETERNITY.

@benjello
Copy link
Member

benjello commented Jan 4, 2018

Je pense que l'on peut se corriger pour l'usage de @Morendil avec un set_input_variable bien senti.

@Morendil
Copy link
Contributor Author

Morendil commented Jan 4, 2018

Il me semble que dans une situation où se succèdent (ou se chevauchent) deux contrats de travail, la valeur de la variable "date de début du contrat" sera fonction non pas de la période à laquelle on évalue cette variable, mais de la finalité pour laquelle on l'évalue.

Pour le dire autrement, la formule de la variable coefficient_proratisation a besoin de connaitre le contrat auquel on l'applique. Un cas de test tout simple: un·e salarié·e qui cumule deux temps partiels sur le même mois, l'un de 1/3 temps et l'autre de 2/3 temps. Je ne saurais pas comment effectuer un calcul correct pour les deux contrats en l'état actuel de l'API des formules. D'un autre côté je ne sais pas non plus exprimer ce cas de test pour l'instant…

Que fait set_input_variable ?

@benjello
Copy link
Member

benjello commented Jan 4, 2018

@Morendil : on ne gère pas plusieurs contrats de travail en même temps mais on peut gérer une situation ou un individu à plusieurs contrats de travail qui se succèdent.

@Anna-Livia
Copy link
Contributor

@benjello on a un test avec un exemple de plusieurs contrats de travails les uns après les autres ? J'ai du mal à voir comment ça se goupille.
Je rejoins aussi @Morendil sur la question du set_input. Comment est-ce que ça pourrait être utilisé ?

@benjello
Copy link
Member

benjello commented Jan 4, 2018

@Anna-Livia @Morendil : pour l'usage considéré modifier le set_input pour qu'il mette la même date de début du contrat de travail pour tous les mois de l'année. Ou une extension qui converti en period en ETERNITY

Pour plusieurs contrat de travail successifs: spécifier chaque moi la date de début et la date de fin du contrat de travail

@Anna-Livia
Copy link
Contributor

Merci @benjello pour ces explications 🙌

@benjello
Copy link
Member

benjello commented Jan 4, 2018

@Anna-Livia : à tester though, j'expose comment je vois les choses, je ne garantis pas que c'est bien codé ;-)

@Morendil
Copy link
Contributor Author

Morendil commented Jan 4, 2018

On a me semble-t-il le même problème dans le cas d'un salarié qui ferait une semaine d'un même mois chez un employeur X et les trois semaines restantes chez un employeur Y: ces deux contrats consécutifs sont "simultanés" du point de vue d'une variable déclarant definition_period = MONTH, comme coefficient_proratisation.

@benjello
Copy link
Member

benjello commented Jan 4, 2018

@Morendil : oui on ne peut pas descendre plus fin que le mois.

@@ -52,8 +52,8 @@ def formula(self, simulation, period):
# forfait_heures_annee
# forfait_jours_annee ]

contrat_de_travail_debut = simulation.calculate('contrat_de_travail_debut', period)
contrat_de_travail_fin = simulation.calculate('contrat_de_travail_fin', period)
contrat_de_travail_debut = simulation.calculate('contrat_de_travail_debut', '2099-01')
Copy link
Contributor

Choose a reason for hiding this comment

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

Il semblerait que les tests passent sans cette modification. Est-ce que tu reproduit @Morendil ?

contrat_de_travail_debut = simulation.calculate('contrat_de_travail_debut', period)
contrat_de_travail_fin = simulation.calculate('contrat_de_travail_fin', period)
contrat_de_travail_debut = simulation.calculate('contrat_de_travail_debut', '2099-01')
contrat_de_travail_fin = simulation.calculate('contrat_de_travail_fin', '2099-01')
Copy link
Contributor

Choose a reason for hiding this comment

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

Il semblerait que les tests passent sans cette modification. Est-ce que tu reproduit @Morendil ?


# Montant de l'allegment
return (ratio_smic_salaire < law.plafond_en_nombre_de_smic) * law.reduction * assiette
return (assiette < law.plafond_en_nombre_de_smic * smic_proratise) * law.reduction * assiette
Copy link
Member

Choose a reason for hiding this comment

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

Bien vu !

def test_coefficient_proratisation_only_contract_periods_wide():
tax_benefit_system = FranceTaxBenefitSystem()
scenario = tax_benefit_system.new_scenario()
scenario.init_single_entity(period='2017', # wide: we simulate for the year
Copy link
Member

Choose a reason for hiding this comment

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

indentation: 4 espaces ;-)

@Morendil
Copy link
Contributor Author

@benjello Merci et done !

Une remarque meta: je vais me permettre de passer outre ton "request changes" pour cette PR à ce stade là, en usant du "Dismiss review", pour les raisons suivantes:

  • @Anna-Livia est en "Approve" après de multiples relectures
  • l'erreur de whitespace (sauf erreur de ma part, je suis novice en Python) est totalement transparente sur le plan fonctionnel et donc le problème n'est pas bloquant
  • d'autres fichiers Python de la codebase souffrent d'erreurs de whitespace (un très petit nombre, j'en conviens) on peut donc s'attendre à une PR corrective pour traiter ce sujet en un seul tir groupé
  • une fois que la mise à jour du Changelog + setup.py est faite, c'est pénible de devoir re-résoudre les conflits si une PR a été passée entre-temps, et pour moi c'est un frein considérable à pousser moi-même mes PR au bout (au lieu de me défausser sur l'équipe Core)
  • @Anna-Livia m'a signalé que les PR de l'IPP sont assez urgentes et risquent de passer devant si je tarde, et j'ai zéro bande passante avant lundi, ce qui fait que j'ai promis de merger celle-ci ce soir sur mon temps libre; or je ne peux pas le faire sans "dismiss" ta review.

A titre personnel j'use du "request changes" avec la plus grande parcimonie pour beta.gouv.fr et seulement quand j'ai l'impression que la PR concernée dégraderait le code. Je préfère encourager chaque contributeur à faire preuve de responsabilité quant à la prise en charge de la qualité du code poussé. Le plus souvent je donne un "Approve" et des suggestions d'amélioration, plutôt que risquer de devenir le bottleneck pour la publication d'une PR.

Je cite cet usage personnel à titre informatif et on peut bien entendu choisir d'adopter une norme différente pour OF-Fr.

@Morendil Morendil dismissed benjello’s stale review February 21, 2018 20:17

See comments on PR.

@benjello
Copy link
Member

@Morendil: tu as bien fait. Généralement, on me reproche d'être trop laxiste ... J'ai peut-être surréagi

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

Successfully merging this pull request may close these issues.

6 participants