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

Unifie les formules datées des réductions d'impôt #1195

Merged
merged 4 commits into from
Nov 8, 2018

Conversation

Morendil
Copy link
Contributor

  • Amélioration technique.
  • Périodes concernées : toutes.
  • Zones impactées : prelevements_obligatoires/impot_revenu/reductions_impot.py.
  • Détails :
    • Unifie en une seule les formules datées de la variable reductions.

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

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

Quelques conseils à prendre en compte :

Et surtout, n'hésitez pas à demander de l'aide ! :)

@Morendil
Copy link
Contributor Author

Morendil commented Oct 26, 2018

On a vu (#1024, #1193) que les cas de divergences entre OpenFisca et les calculateurs de la DGFIP se concentraient notamment dans les réductions d'impôt.

J'explique cela notamment par le fait que ce seul fichier reductions_impots.py, à lui tout seul plus de 6000 lignes, concentre une partie substantielle de la dette technique présente dans OpenFisca. Le code y est extrêmement répétitif, ce qui le rend vulnérable à certains bugs difficiles à repérer, par exemple:

fhal = foyer_fiscal('fhal', period)
fham = foyer_fiscal('fhal', period)

Certaines de ces formules sont de simples sommes (par exemple doment), une technique similaire à celle appliquée ici permettra de les unifier, on peut attendre un gain très rapide de plusieurs centaines de lignes.

Pour d'autres cela semble un peu plus compliqué et il serait nécessaire de faire émerger des structures latentes (pour reprendre les termes d'une discussion récente). Ce serait aussi la bonne occasion de traiter la problématique des nomenclatures des CERFA de l'impôt sur le revenu comme le souhaitait @claireleroy.

Les solutions actuelles recèlent des bizarreries, par exemple:

def formula_2005_01_01(foyer_fiscal, period, parameters):
'''
Investissements dans les DOM-TOM dans le cadre d'une entrepise.
'''
f7ur = foyer_fiscal('f7ur', period)
f7oz = foyer_fiscal('f7oz', period)
f7pz = foyer_fiscal('f7pz', period)
f7qz = foyer_fiscal('f7qz_2012', period)

…on a du mal à comprendre l'intrusion d'une nomenclature "2012" dans une formule qui couvre en principe l'année 2005.

J'ai l'impression que ces sujets mériteraient du temps présentiel avec au minimum l'IPP et une partie de l'équipe DINSIC, pour mettre en commun nos forces respectives: je peux apporter de l'expertise sur les techniques de refactoring (et pourquoi il est important de les renforcer au sein d'OpenFisca), mais pas sur la fiscalité par exemple.

@claireleroy
Copy link
Contributor

@Morendil Juste une petite précision pour que j'y vois plus clair : comment sont gérés les changements de périmètre de la variable reductions dans le temps (ajout d'une nouvelle réduction, suppression d'une réduction qui n'existe plus) suite à cette simplification du code ?

Si je comprends bien :

  • Côté "start" : les formules de chaque réduction sont des dated_formulas donc elles ont une date de début implicite ?
    Ex : la réduction duflot commence en 2013 car avant cela elle n'a pas de formules. Si on essaye de la calculer pour une période avant 2013 elle renvoie 0 ?
  • Côté "end" : les formules ont un attribut end_date qui empêche de les calculer au-delà de cette date ?
    Ex : la réduction sofipe s'arrête au 1er janvier 2011. Si on essaye de la calculer après cette date, elle renvoie 0 ?

Est-ce que c'est bien ça ?

@benjello
Copy link
Member

Je laisse @Morendil confirmer mais je crois que tu vois juste @claireleroy.

@Morendil
Copy link
Contributor Author

Morendil commented Oct 29, 2018

@claireleroy Oui c'est bien ça.

On prend un léger risque par rapport à la situation antérieure, qui était "ceinture et bretelles" par rapport à la fin d'une formule - comme on avait de facto une formule de reductions par année fiscale, si on oubliait de noter le end_date d'une réduction individuelle mais qu'on ne l'appelait plus dans reductions ça donnait le bon résultat. Avec cette nouvelle version tout repose sur les dates de démarrage des formules datées et les end_date des variables concernées. J'ai corrigé un oubli de ce type. Je trouve que le gain de 500 lignes vaut bien ce petit risque. :)

Copy link
Member

@fpagnoux fpagnoux left a comment

Choose a reason for hiding this comment

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

Pfiew, merci pour ce travail sans doute fastidieux... Le nombre de points qui semblaient incohérent dans l'implem précédente démontre assez clairement l'intérêt de la factorisation 🙂.

'reduction_impot_exceptionnelle',
# Introduites en 2014
'rpinel',
# Introduites en 2014
Copy link
Member

Choose a reason for hiding this comment

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

rehab est introduit en 2017

# Introduites en 2004
'intagr', 'intcon', 'invlst',
# Introduites en 2005
'sofica',
Copy link
Member

Choose a reason for hiding this comment

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

sofica est introduit en 2006

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Oui ! Le commentaire est mensonger…

# Introduites en 2005
'sofica',
# Introduites en 2006
'creaen',
Copy link
Member

Choose a reason for hiding this comment

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

Il manque deffor pour 2006

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Bien vu ! C'est plus problématique que le commentaire faux.

dfppce = foyer_fiscal('dfppce', period)
doment = foyer_fiscal('doment', period)
domlog = foyer_fiscal('domlog', period)
domsoc = foyer_fiscal('domsoc', period)
Copy link
Member

@fpagnoux fpagnoux Nov 2, 2018

Choose a reason for hiding this comment

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

Autre incohérence: domsoc apparaît dès 2009 ici, mais n'est introduit qu'en 2010 sans sa formule. @claireleroy tu confirmes ça date de 2010?

@fpagnoux
Copy link
Member

fpagnoux commented Nov 2, 2018

Pour info, ma méthode de review:

  • Compiler les variables appelées chaque année dans un fichier excel
  • Identifier les années où des variables apparaissent/disparaissent
  • Vérifier la cohérence avec la liste dans la nouvelle formule de reductions
  • Vérifier la cohérence avec les dates de fin et de début des variables appelées.

@Morendil
Copy link
Contributor Author

Morendil commented Nov 2, 2018

Compiler les variables appelées chaque année dans un fichier excel

Merci @fpagnoux ! J'aurais peut-être dû commencer par ça avant de me lancer là-dedans, pour être sûr de ne rien louper.

@claireleroy
Copy link
Contributor

@fpagnoux @Morendil Est-ce qu'il y a toujours besoin que je regarde les dates de débuts et fins des réductions et crédits d'impôt ou c'est bon du coup ?

@Morendil
Copy link
Contributor Author

Morendil commented Nov 5, 2018

@claireleroy Tes lumières seront encore utiles sur domsoc (début et fin), intcon et invlst (début), sur le reste on est bons je crois. Pour les crédits j'ai ouvert une issue.

@claireleroy
Copy link
Contributor

@Morendil Le résultat de mes recherches :

  • La réduction domsoc existe techniquement depuis l'impôt 2010 sur revenus 2009, mais seulement depuis l'impôt 2011 sur revenus 2010 dans OpenFisca. En effet pour les revenus 2009, la réduction est enfait calculée dans le périmètre de la réduction domlog (on pourrait faire du zèle et corriger ça mais ce n'est pas une vraie erreur non plus). Donc je dirais qu'on peut garder une start_date en 2010 dans OpenFisca.
  • La réduction domsoc n'a pas de fin, elle existe encore aujourd'hui
  • La réduction intcon a bien été mise en place dès l'impôt 2005 sur revenus 2004, mais je n'arrive pas à trouver de formulaires pour verrifier sa date exacte de fin
  • La réduction invlst a également été mise en place dès l'impôt 2005 sur revenus 2004

NB : les formules OpenFisca utilise les années revenus

@Morendil
Copy link
Contributor Author

Morendil commented Nov 7, 2018

@fpagnoux Pour moi c'est GTM.

Copy link
Member

@fpagnoux fpagnoux left a comment

Choose a reason for hiding this comment

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

C'est bon pour moi

@Morendil Morendil force-pushed the refactor-reductions branch from 9923c48 to 596ff60 Compare November 8, 2018 19:00
@Morendil Morendil merged commit 902813c into master Nov 8, 2018
@Morendil Morendil deleted the refactor-reductions branch November 8, 2018 19:50
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.

5 participants