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

Add a formula for taux_csg_remplacement #1101

Merged
merged 25 commits into from
Aug 29, 2018
Merged

Conversation

benjello
Copy link
Member

@benjello benjello commented Aug 27, 2018

  • Évolution du système socio-fiscal.
  • Périodes concernées : toutes.
  • Zones impactées : prelevements_obligatoires/prelevements_sociaux/contributions_sociales/remplacement.
  • Détails :
    • Ajout d'une formule pour calculer les taux de CSG sur les revenus de remplacement

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 ! :)

@benjello benjello force-pushed the fix-taux-csg-remplacement branch from ad9fd7c to cbdd69c Compare August 27, 2018 16:36
@@ -3775,6 +3775,35 @@ def formula_2017_01_01(foyer_fiscal, period, parameters):
# TODO : verrifier la formule de cette réduction pour les années 2004-2013, les cases changent de signification d'une année à l'autre, cela ne semble pas pris en compte dans le calcul (ex: f7xd)


class invrev(Variable):
Copy link
Contributor

Choose a reason for hiding this comment

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

J'ai du mal à voir le rapport entre ça et le sujet CSG ?…

Copy link
Member Author

Choose a reason for hiding this comment

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

Une erreur a été créer par l'absence de cette variable qui avait été virée par inadvertance dans une PR passée.

@@ -3,7 +3,11 @@ reference: Décret n° 2016-1818 du 22 décembre 2016 portant relèvement du sal
de croissance - Article 1
unit: currency
values:
2001-08-01:
1999-07-01:
Copy link
Contributor

Choose a reason for hiding this comment

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

Pareil que pour invrev je ne vois pas le rapport avec le sujet de la PR…

Copy link
Member Author

Choose a reason for hiding this comment

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

Idem

Copy link
Contributor

Choose a reason for hiding this comment

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

Je n'ai pas l'impression que par "idem" tu veux dire "on a précédemment supprimé par erreur des valeurs de paramètre de valeur du SMIC et on les ajoute à la marge dans cette PR" - ça me semble improbable.

Si tu veux dire "on ajoute une correction à la marge dans cette PR" sans que ce soit pour autant corriger une régression, pour moi c'est un peu différent - il vaut mieux faire des PR pour un seul objectif ou plus largement un seul thème. Sinon c'est plus compliqué à review et il me semble que c'est un facteur aggravant des PR qui trainent longtemps en review.

A tout le moins mentionne l'intention de la modif dans le Changelog.

Copy link
Member Author

Choose a reason for hiding this comment

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

Je voulais dire c'est dans les barèmes IPP.
Ce sont des paramètres que j'ai ajouté pour permettre de remonter dans le passé sans que cela casse. Je les vire.

@@ -44,7 +71,7 @@ class csg_deductible_chomage(Variable):
def formula(individu, period, parameters):
chomage_brut = individu('chomage_brut', period)
csg_imposable_chomage = individu('csg_imposable_chomage', period)
taux_csg_remplacement = individu('taux_csg_remplacement', period)
taux_csg_remplacement = individu('taux_csg_remplacement', period, max_nb_cycles = 1)
Copy link
Contributor

Choose a reason for hiding this comment

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

Je trouve ça bizarre que ta restriction sur le nombre de cyles soit dans l’appelant - je m’attendrais à ce que ça soit le job d’une fonction récursive de déterminer ses propres conditions d’arrêt de récursion

Copy link
Contributor

@Morendil Morendil Aug 28, 2018

Choose a reason for hiding this comment

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

Et en fait je me rends compte que je ne vois pas immédiatement où est la dépendance récursive… Quelle partie de la formule taux_csg_remplacement fait appel à un autre calcul de taux_csg_remplacement ? (ETA: en fait tu m'as déjà donné une réponse via Slack; "le taux de CSG de l'année n dépend du RFR de l'année n-2 qui dépend des revenus de n-2 qui dépendent du taux de csg de n-2 etc", ignore ce commentaire)

Copy link
Contributor

@Morendil Morendil Aug 28, 2018

Choose a reason for hiding this comment

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

Pourquoi tu ne peux pas spécifier max_nb_cycles dans taux_csg_remplacement directement ? (ETA: on en a discuté avec @sandcha IRL, et j'ai analysé le code de Core qui gère max_nb_cycles, je penche très fortement vers l'idée que c'est ici qu'il faut ajouter max_nb_cycles:

Copy link
Member Author

Choose a reason for hiding this comment

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

OK

@@ -27,11 +27,38 @@ class taux_csg_remplacement(Variable):
label = u"Taux retenu sur la CSG des revenus de remplacment"
definition_period = MONTH

def formula_2015(individu, period, parameters):
Copy link
Contributor

Choose a reason for hiding this comment

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

Tu as une référence législative pour ce calcul du taux sur le RFR n-2 ? J'ai http://www.cdg29.bzh/sites/default/files/fond_documentaire/fi_remun_201801_12_crds_revenus_remplacement.pdf

Copy link
Member Author

Choose a reason for hiding this comment

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

Pareil que précédemment: ca va venir avec les barèmes IPP

@@ -3775,6 +3775,35 @@ def formula_2017_01_01(foyer_fiscal, period, parameters):
# TODO : verrifier la formule de cette réduction pour les années 2004-2013, les cases changent de signification d'une année à l'autre, cela ne semble pas pris en compte dans le calcul (ex: f7xd)


class invrev(Variable):
Copy link
Contributor

Choose a reason for hiding this comment

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

Remplacer l'acronyme par un nom explicite ?

return (P.taux_gs * min_(f7gs, P.seuil_gs * (1 + maries_ou_pacses)) / 4 +
P.taux_gu * min_(f7gu, P.seuil_gu * (1 + maries_ou_pacses)) / 4 +
P.taux_xg * min_(f7xg, P.seuil_xg * (1 + maries_ou_pacses)) / 4 +
P.taux_gt * f7gt + P.taux_gt * f7gv)
Copy link
Contributor

Choose a reason for hiding this comment

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

Indenter ?

Copy link
Member Author

Choose a reason for hiding this comment

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

OK

CHANGELOG.md Outdated
* Périodes concernées : toutes.
* Zones impactées : `prelevements_obligatoires/prelevements_sociaux/contributions_sociales/remplacement`.
* Détails :
- Ajout d'une formule pour calculer les taux de CSG sur les revenus de remplacement
Copy link
Contributor

Choose a reason for hiding this comment

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

Compléter par les autres ajouts de la PR (invrev...) ?

@benjello
Copy link
Member Author

@Morendil @sandcha : j'ai dû me résoudre à battre partiellement en retraite car j'allais trop loin dans le passé avec la formule antérieure à 2015 et cela déclenchait plein d'erreur dues à des paramètres manquants ou des variables dont je ne sais pas quelle est leur véritable date d'effet.

CHANGELOG.md Outdated
* Zones impactées : `prelevements_obligatoires/prelevements_sociaux/contributions_sociales/remplacement`.
* Détails :
- Ajoute une formule pour calculer les taux de CSG sur les revenus de remplacement
- Ré-ajoute `invret` qui avait été malencontreusement retirée dans le passé
Copy link
Contributor

Choose a reason for hiding this comment

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

invret -> invrev

@@ -27,12 +27,38 @@ class taux_csg_remplacement(Variable):
label = u"Taux retenu sur la CSG des revenus de remplacment"
definition_period = MONTH

def formula_2015(individu, period, parameters):
rfr = individu.foyer_fiscal('rfr', period = period.n_2, max_nb_cycles = 1)
nbptr = individu.foyer_fiscal('nbptr', period = period.n_2, max_nb_cycles = 1)
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 pas que le nombre de parts n-2 dépende du taux de CSG…

@@ -255,7 +255,7 @@ def solve_function(retraite_brute):
'retraite_imposable_pour_inversion', period, options = [DIVIDE])

# Calcule les pensions de retraite brutes à partir des pensions imposables.
taux_csg_remplacement = individu('taux_csg_remplacement', period)
taux_csg_remplacement = individu('taux_csg_remplacement', period, max_nb_cycles = 1)
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 le max_nb_cycles est à supprimer ici. Mon raisonnement est que cette décision incombe à la fonction qui décide de faire un appel créant une dépendance circulaire (en l'occurrence taux_csg_remplacement demande le RFR n-2 en sachant que cela peut déclencher un calcul de revenu qui dépend à son tour de ce même taux). Sinon on dit implicitement que tout appel à une fonction de calcul doit se préoccuper d'une dépendance circulaire potentielle.

@benjello
Copy link
Member Author

Merci @Morendil pour ta patience sur cette PR qui a eu très vite raison de la mienne !
J'ai laissé les extensions du champ de validité de certains paramètres même si ce n'est pas très propre.

@benjello
Copy link
Member Author

benjello commented Aug 29, 2018

@Morendil : je vois que ma formulation est maladroite: ce n'est bien entendu pas ta patience qui a eu raison de la mienne mais bien la PR ;-)
Encore une fois merci !

@benjello benjello merged commit a77698e into master Aug 29, 2018
@benjello benjello deleted the fix-taux-csg-remplacement branch August 29, 2018 11:59
@guillett
Copy link
Member

J'ai l'impression que cette PR crée des cycles, je tente de créer un cas de test minimal mais l'investigation des cycles est très compliqué (openfisca/openfisca-core#658)

@Morendil
Copy link
Contributor

@guillett Qu'est-ce que tu observes qui te donne cette impression ?

@guillett
Copy link
Member

guillett commented Oct 18, 2018

Je crois que j'ai une situation d'exemple

{
    "individus": {
        "demandeur": {
            "date_naissance": {
                "2018-10": "1952-01-05",
                "2018-09": "1952-01-05",
                "2018-08": "1952-01-05",
                "2018-07": "1952-01-05"
            },
            "retraite_imposable": {
                "2018-09": null
            },
            "salaire_imposable": {
                "2018": 1000,
                "2017": 1000,
                "2016": 1000
            }
        }
    },
    "familles": {
        "_": {
            "parents": [
                "demandeur"
            ],
            "enfants": [],
            "logement_social_eligible": {
                "2018-10": null
            }
        }
    },
    "foyers_fiscaux": {
        "_": {
            "declarants": [
                "demandeur"
            ],
            "personnes_a_charge": []
        }
    },
    "menages": {
        "_": {
            "personne_de_reference": [
                "demandeur"
            ],
            "enfants": []
        }
    }
}

@guillett
Copy link
Member

guillett commented Oct 18, 2018

C'est testable sur https://betagouv.github.io/openfisca-tracer/ :) avec https://fr.openfisca.org/api/v24

La demande de calcul de retraite_imposable génère le cycle.

logement_social_eligible est calculé pour mettre en évidence le fait que rfr est à zéro alors qu'il devrait être environ à 1000

Vous pouvez comparer les résultats avec https://openfisca.mes-aides.gouv.fr (seule version accessible en ligne que j'ai trouvé ; cette version est environ à 22.3.0)

@Morendil
Copy link
Contributor

Wow je ne savais pas qu'on pouvait faire ça! Merci pour le tuyau.

Je n'arrive pas à reproduire un problème de boucle mais peut-être est-ce que je m'y prends mal ou bien je ne sais pas quoi observer…

@bonjourmauko
Copy link
Member

bonjourmauko commented Oct 18, 2018

C'est testable sur https://betagouv.github.io/openfisca-tracer/

Noise Noice !

@Morendil
Copy link
Contributor

Morendil commented Oct 18, 2018

Noise

? (ETA oh, I got it, that would be Mauko's Cockney accent then)

@bonjourmauko
Copy link
Member

@Morendil Merci, typo 😄

C'est en effet noice (super nice), pas noise.

@guillett
Copy link
Member

Pour info, voilà quelques faux cycles détectés. (faux car les périodes sont différentes). To be continued...

Circular definition detected on formula aah@2016-12. Formulas and periods involved: revenu_disponible<2017>
- impots_directs<2017>
- taxe_habitation<2017>
- exonere_taxe_habitation<2017>
- aah<2017-02>
- aah_base<2017-02>
- aah_base_ressources<2017-02>
- aah_base_ressources_hors_activite_eval_trimestrielle<2017-02>
- asi<2017-01>
- asi_aspa_base_ressources<2017-01>
- asi_aspa_base_ressources_individu<2017-01>
- aah<2016-12>.
Circular definition detected on formula aah_base@2015-07. Formulas and periods involved: revenu_disponible<2017>
- impots_directs<2017>
- taxe_habitation<2017>
- exonere_taxe_habitation<2017>
- aah<2017-01>
- aah_base<2017-01>
- aah_base_ressources<2017-01>
- aah_base_ressources_hors_activite_eval_trimestrielle<2017-01>
- asi<2016-11>
- asi_aspa_base_ressources<2016-11>
- ass<2016-11>
- ass_base_ressources<2016-11>
- ass_base_ressources_individu<2016-11>
- aah<2015-11>
- aah_base<2015-11>
- aah_base_ressources<2015-11>
- aah_base_ressources_hors_activite_eval_trimestrielle<2015-11>
- asi<2015-09>
- asi_aspa_base_ressources<2015-09>
- asi_aspa_base_ressources_individu<2015-09>
- aah<2015-07>
- aah_base<2015-07>.
Circular definition detected on formula aide_logement_montant_brut_crds@2016-12. Formulas and periods involved: revenu_disponible<2017>
- impots_directs<2017>
- taxe_habitation<2017>
- exonere_taxe_habitation<2017>
- isf_tot<2017>
- isf_apres_plaf<2017>
- tot_impot<2017>
- crds<2017>
- crds_logement<2017-04>
- aide_logement_montant_brut_crds<2017-04>
- aide_logement_montant_brut<2017-04>
- aide_logement_montant_brut_avant_degressivite<2017-04>
- aide_logement_participation_personnelle<2017-04>
- aide_logement_base_ressources<2017-04>
- aide_logement_base_ressources_defaut<2017-04>
- aide_logement_neutralisation_rsa<2017-04>
- rsa<2017-03>
- rsa_montant<2017-03>
- rsa_fictif<2016-12><2017-03>
- rsa_forfait_logement<2016-12>
- aide_logement<2016-12>
- apl<2016-12>
- aide_logement_montant<2016-12>
- aide_logement_montant_brut_crds<2016-12>.
Circular definition detected on formula asi_aspa_base_ressources@2015-08. Formulas and periods involved: revenu_disponible<2017>
- impots_directs<2017>
- taxe_habitation<2017>
- exonere_taxe_habitation<2017>
- aah<2017-01>
- aah_base<2017-01>
- aah_base_ressources<2017-01>
- aah_base_ressources_hors_activite_eval_trimestrielle<2017-01>
- asi<2016-11>
- asi_aspa_base_ressources<2016-11>
- ass<2016-11>
- ass_base_ressources<2016-11>
- ass_base_ressources_individu<2016-11>
- aah<2015-11>
- aah_base<2015-11>
- aah_base_ressources<2015-11>
- aah_base_ressources_hors_activite_eval_trimestrielle<2015-11>
- asi<2015-08>
- asi_aspa_base_ressources<2015-08>.
Circular definition detected on formula ass@2015-09. Formulas and periods involved: revenu_disponible<2017>
- impots_directs<2017>
- taxe_habitation<2017>
- exonere_taxe_habitation<2017>
- aah<2017-01>
- aah_base<2017-01>
- aah_base_ressources<2017-01>
- aah_base_ressources_hors_activite_eval_trimestrielle<2017-01>
- asi<2016-11>
- asi_aspa_base_ressources<2016-11>
- ass<2016-11>
- ass_base_ressources<2016-11>
- ass_base_ressources_individu<2016-11>
- aah<2015-11>
- aah_base<2015-11>
- aah_base_ressources<2015-11>
- aah_base_ressources_hors_activite_eval_trimestrielle<2015-11>
- asi<2015-09>
- asi_aspa_base_ressources<2015-09>
- ass<2015-09>.
Circular definition detected on formula ass_base_ressources@2015-10. Formulas and periods involved: revenu_disponible<2017>
- impots_directs<2017>
- taxe_habitation<2017>
- exonere_taxe_habitation<2017>
- aah<2017-01>
- aah_base<2017-01>
- aah_base_ressources<2017-01>
- aah_base_ressources_hors_activite_eval_trimestrielle<2017-01>
- asi<2016-11>
- asi_aspa_base_ressources<2016-11>
- ass<2016-11>
- ass_base_ressources<2016-11>
- ass_base_ressources_individu<2016-11>
- aah<2015-11>
- aah_base<2015-11>
- aah_base_ressources<2015-11>
- aah_base_ressources_hors_activite_eval_trimestrielle<2015-11>
- asi<2015-10>
- asi_aspa_base_ressources<2015-10>
- ass<2015-10>
- ass_base_ressources<2015-10>.
Circular definition detected on formula ass_base_ressources_individu@2015-11. Formulas and periods involved: revenu_disponible<2017>
- impots_directs<2017>
- taxe_habitation<2017>
- exonere_taxe_habitation<2017>
- aah<2017-01>
- aah_base<2017-01>
- aah_base_ressources<2017-01>
- aah_base_ressources_hors_activite_eval_trimestrielle<2017-01>
- asi<2016-11>
- asi_aspa_base_ressources<2016-11>
- ass<2016-11>
- ass_base_ressources<2016-11>
- ass_base_ressources_individu<2016-11>
- aah<2015-12>
- aah_base<2015-12>
- aah_base_ressources<2015-12>
- aah_base_ressources_hors_activite_eval_trimestrielle<2015-12>
- asi<2015-11>
- asi_aspa_base_ressources<2015-11>
- ass<2015-11>
- ass_base_ressources<2015-11>
- ass_base_ressources_individu<2015-11>.
Circular definition detected on formula chomage_imposable@2013-01. Formulas and periods involved: revenu_disponible<2017>
- pensions_nettes<2017>
- chomage_net<2017-01>
- chomage_imposable<2017-01>
- csg_deductible_chomage<2017-01>
- taux_csg_remplacement<2017-01>
- rfr<2015>
- rni<2015>
- rng<2015>
- rbg<2015>
- rev_cat<2015>
- rev_cat_tspr<2015>
- traitements_salaires_pensions_rentes<2015>
- revenu_assimile_salaire_apres_abattements<2015>
- revenu_assimile_salaire<2015>
- chomage_imposable<2015-01>
- csg_deductible_chomage<2015-01>
- taux_csg_remplacement<2015-01>
- rfr<2013>
- rni<2013>
- rng<2013>
- rbg<2013>
- rev_cat<2013>
- rev_cat_tspr<2013>
- traitements_salaires_pensions_rentes<2013>
- revenu_assimile_salaire_apres_abattements<2013>
- revenu_assimile_salaire<2013>
- chomage_imposable<2013-01>.
Circular definition detected on formula csg_deductible_chomage@2015-02. Formulas and periods involved: revenu_disponible<2017>
- pensions_nettes<2017>
- chomage_net<2017-01>
- chomage_imposable<2017-01>
- csg_deductible_chomage<2017-01>
- taux_csg_remplacement<2017-01>
- rfr<2015>
- rni<2015>
- rng<2015>
- rbg<2015>
- rev_cat<2015>
- rev_cat_tspr<2015>
- traitements_salaires_pensions_rentes<2015>
- revenu_assimile_salaire_apres_abattements<2015>
- revenu_assimile_salaire<2015>
- chomage_imposable<2015-02>
- csg_deductible_chomage<2015-02>.
Circular definition detected on formula retraite_imposable@2016-01. Formulas and periods involved: retraite_imposable<2018-09>
- csg_deductible_retraite<2018-09>
- taux_csg_remplacement<2018-09>
- rfr<2016>
- rni<2016>
- rng<2016>
- rbg<2016>
- rev_cat<2016>
- rev_cat_tspr<2016>
- traitements_salaires_pensions_rentes<2016>
- revenu_assimile_pension_apres_abattements<2016>
- revenu_assimile_pension<2016>
- retraite_imposable<2016-01>.

@benjello
Copy link
Member Author

@guillett : il me semble que ces faux cycles sont inévitables si on part de revenu de remplacement bruts et que l'on veut calculer des prestations. En effet, le taux de csg à appliqué aux revenus de remplacement dépends du revenu fiscal de référence qui dépend des revenus de remplacement imposables antérieurs qui dépendent du taux de CSG antérieur etc. Donc on remonte indéfiniment dans le passé.

@guillett
Copy link
Member

Je suis d'accord avec toi, je suis en train d'essayer de les mettre en évidence. Je crois que la façon dont ces faux cycles sont actuellement gérés n'est pas la meilleure (presque tout devrait tolérer de tels cycles).

@benjello
Copy link
Member Author

On peut penser à une backstop date pour laquelle soit on garde la dernière valeur (hypothèse de permanence dans le passé= soit on prend la valeur par défaut.

@fpagnoux
Copy link
Member

fpagnoux commented Oct 19, 2018

Je suis d'accord avec toi, je suis en train d'essayer de les mettre en évidence. Je crois que la façon dont ces faux cycles sont actuellement gérés n'est pas la meilleure (presque tout devrait tolérer de tels cycles).

En tout cas elle est mal documentée, et assez complexe, donc si on peut trouver mieux, c'est bien!
Par contre, "tolèrer" tous les cycles ne fonctionne pas non plus, car on se retrouve avec des "maximum recursion error" puisqu'on remonte infiniment dans le passé.

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.

6 participants