-
Notifications
You must be signed in to change notification settings - Fork 101
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
Revalorisation des barèmes spécifiques à certains publics "logements foyers" - Aides au logement (FAM_Reforme_Logements Foyers) #1199
Conversation
|
||
class etat_logement_foyer(Variable): | ||
value_type = Enum | ||
possible_values = TypeEtatLogementFoyer # defined in model/base.py |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Le commentaire n'est pas pertinent :)
@mtifarine Je vais essayer de faire une review en profondeur dans la semaine, au pire début de semaine prochaine. |
@@ -24,6 +24,29 @@ | |||
zone_apl_by_depcom = None | |||
|
|||
|
|||
class TypeEtatLogementFoyer(Enum): | |||
non_renseigne = u"non renseigne" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
non_renseigne = u"non renseigne" | |
non_renseigne = u"Non renseigné" |
@@ -24,6 +24,29 @@ | |||
zone_apl_by_depcom = None | |||
|
|||
|
|||
class TypeEtatLogementFoyer(Enum): | |||
non_renseigne = u"non renseigne" | |||
logement_rehabilitee = u"Logement rehabilitee" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
logement_rehabilitee = u"Logement rehabilitee" | |
logement_rehabilite = u"Logement rehabilité" |
(Et propager le nom de la variable logement_rehabilite
avec un seul e
ailleurs dans la PR)
class logement_conventionne(Variable): | ||
value_type = bool | ||
entity = Menage | ||
label = u"logement conventionne" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
label = u"logement conventionne" | |
label = u"Logement conventionné" |
@@ -0,0 +1,6 @@ | |||
reference: ipp |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ce paramètre est en doublon avec openfisca_france/parameters/prestations/al_param_accapl/multiplicateur_de_n/dans_la_formule_de_kl.yaml
il me semble. Il vaut mieux utiliser l'existant.
@@ -0,0 +1,6 @@ | |||
reference: ipp |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ce paramètre est en doublon avec openfisca_france/parameters/prestations/al_param_accapl/multiplicateur_de_n/dans_la_formule_de_kl_numerateur.yaml
.
) | ||
|
||
|
||
class aides_logement_foyer_nb_part(Variable): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je ne comprends pas la rédaction de cette formule, qui est textuellement très proche de celle de aides_logement_primo_accedant_nb_part
(et qui devrait être rapprochée d'elle dans le fichier afin de favoriser une éventuelle factorisation).
Les lignes 1363-1366 sont difficiles à suivre.
Je crois que la référence législative n'est pas la bonne (elle est identique à celle de l'autre formule), est-ce qu'il s'agirait plutôt de https://www.legifrance.gouv.fr/affichCodeArticle.do?cidTexte=LEGITEXT000006074096&idArticle=LEGIARTI000006899011 ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AL foyer et AL accession sont calculés de la même manière, la différence est dans les conditions et les barèmes, c'est pour ça j'ai suivi la même structure que l'AL accession.
) | ||
|
||
|
||
class aides_logement_foyer_k(Variable): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Même remarque que ci-dessus, c'est une formule très proche de aides_logement_primo_accedant_k
textuellement, c'est dommage de les éloigner l'une de l'autre.
@@ -0,0 +1,40 @@ | |||
description: Loyer minimun lo |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
minimun -> minimum
(dans le nom du fichier aussi)
@@ -0,0 +1,6 @@ | |||
reference: ipp |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
En fait il vaudrait mieux réunir ces paramètres "avec N enfants" qui sont apparentés (et ont à vrai dire la forme d'un barème) dans un seul fichier, cela facilitera une simplification future.
@mtifarine Un certain nombre d'éléments de cette PR m'inquiètent quant à la dette technique d'OpenFisca France, beaucoup sont en partie imputables à l'état antérieur du code mais je crains de dégrader la situation. On va se débrouiller pour la livrer sans trop tarder, et j'aimerais proposer un guide pour les suivantes: au-delà d'une cinquantaine de lignes de code ajoutées/modifiées (tests YAML non compris) essayons d'avoir une conversation MSA-DINSIC avant de lancer les travaux, pour anticiper s'il y a des incidences sur la dette technique. |
@Morendil j'ai fait quelques modifications su cette PR selon tes remarques. |
] | ||
definition_period = MONTH | ||
|
||
def formula_2017_10(famille, period, parameters): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pourquoi ne définir qu'à partir de 2017-10 ? Il me semble que les aides au logement en logement-foyer / résidence autonomie remontent à bien plus longtemps…
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dans la fiche de besoin, ils ont mentionné qu'au 1er octobre 2017 certains paramètres de dépense du logement sont revalorisés que ce soit en APL, en ALF ou en ALS.
donc je sais pas exactement si les aides au logement-foyer se calculent de la même façon avant cette date.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je crois qu'il faut qu'on soit attentifs à la différence entre une simple revalorisation, au sens strict, qui va se traduire dans OpenFisca par la mise à jour de fichiers de paramètres uniquement; et toute intervention dans les formules (fichiers Python) qui signale:
- soit qu'on est en train de modéliser du droit qui ne l'était pas précédemment
- soit qu'on enregistre une évolution structurelle de la loi
- soit qu'on est confronté à une limitation technique de ce qui est possible avec les paramètres
Il me semble que dans chacun de ces trois cas (et en particulier pour les distinguer les uns des autres) c'est utile qu'on discute avant de lancer les PR.
Ici on est dans le premier cas, dans la mesure où ces aides logement sont ouvertes "pour les accédants à la propriété ainsi que pour les étudiants logés en résidence universitaire" au moins depuis l'année 2000.
On peut bien sûr restreindre la formule à une année ultérieure pour des raisons techniques (par exemple je vois en supprimant la date que les tests sont KO parce que les paramètres ne sont pas tous définis pour des périodes plus anciennes). Ici je fais l'effort d'introduire les anciens paramètres pour voir dans quelle mesure on peut unifier les formules.
@mtifarine Je reprends la main ajd pour essayer quelques factorisations ou reformulations, on s'appelle éventuellement après pour faire le point |
Pour commencer on factorise Pour ce faire on s'appuie sur l'évolution des paramètres, il faut distinguer l'APL des autres AL mais une fois que c'est fait on peut appeler un paramètre unique en utilisant le "fancy indexing". Il suffit donc d'abaisser à zéro le seuil de versement pour l'APL uniquement. C'est un peu dommage de devoir répéter les valeurs pour les deux paramètres (non APL et APL) mais c'est une limitation sur le format de saisie des paramètres sur laquelle on peut éventuellement travailler dans Core. |
Dans une deuxième étape j'ai renommé Cette formule est issue d'un même texte, dont l'article II commence par: "pour les accédants à la propriété ainsi que pour les étudiants logés en résidence universitaire, le montant de l'allocation de logement est obtenu par l'application de la formule…". Le texte de loi est unique, il n'y a aucune raison d'avoir deux formules différentes ! Il faut au contraire les rapprocher mais descendre les critères de décision (sur les plafonds, les coefficients etc.) plus bas dans le calcul. |
((aides_logement_foyer_crous_eligibilite + aides_logement_foyer_personne_agee_eligibilite) * plafond_mensualite) + | ||
(not_(aides_logement_foyer_crous_eligibilite + aides_logement_foyer_personne_agee_eligibilite) * min_(plafond_mensualite, loyer)) | ||
) | ||
C = not_(logement_conventionne) * famille('aide_logement_charges', period) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Quel est le texte de loi qui fait qu'on n'applique pas le C de la formule dans le cas d'un logement foyer conventionné (donc ouvrant droit à l'APL) ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
D’après la fiche de besoin:
APL = K(E - Eo) avec
APL = K(L+C - (Lo+C))
L est le loyer réel pris en compte dans la limite d’un plafond variable en fonction de trois zones géographiques et du nombre de personnes à charge.
E représente l’équivalence de loyer et de charges locatives prise en compte dans la limite d’un plafond variable dans les mêmes conditions que L.
E0 représente l’équivalence de loyer et les charges locatives minimales, fonction du revenu et du nombre de personnes à charge.
C est le forfait de charges ; un forfait de charges spécifique est appliqué en cas de cohabitation de plusieurs foyers distincts lorsque l’allocataire est une personne isolée, avec ou sans personne à charge.
L0 est le loyer minimal que le ménage doit consacrer à son logement. Il est fonction du revenu et du nombre de personnes à charge.
Je vais voir si je trouve le teste de loi.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
61678f7
to
6a542bc
Compare
N = famille('aides_logement_foyer_nb_part', period) | ||
|
||
return ( | ||
(coef_k - (R / (multi_n * N))) * not_(logement_conventionne) + |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ici également, en vertu de quel texte est-ce qu'on applique une formule différenciée ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
d’après l'expert:
Il existe deux barèmes applicables en secteur foyer :
-
l’APL 1 (cas général), qui concerne la plupart des logements-foyers, en particulier les résidences sociales neuves.
Les logements foyers éligibles à l'APL 1 foyer sont tous les logements foyers conventionnés neufs ou après travaux à compter du 1er avril 1979.
Les résidences sociales éligibles à l'APL 1 foyer sont :
• toute résidence sociale, conventionnée à ce titre pour la première fois, neuve ou après travaux (à compter du 1er janvier 1995),
• tout foyer jeunes travailleurs ou travailleurs migrants déjà éligible à l'APL 1 foyer faisant l'objet d'un nouveau conventionnement (à compter du 1er janvier 1995). -
l’APL 2 concerne les résidences sociales existantes conventionnées sans travaux depuis le 1er janvier 2005, et les foyers de jeunes travailleurs conventionnés sans travaux depuis le 1er octobre 1990.
Et dans la liste des tests j'ai remarqué que:
- L'APL1 concerne les logements conventionnés.
- L'APL2 concerne les logements non conventionnés.
N = famille('aides_logement_foyer_nb_part', period) | ||
majoration_loyer_apl1 = prestations.al_param_accal.majoration_du_loyer_minimum_lo_apl1 * N | ||
|
||
L_plafond1 = ((bareme_apl1.calc(baseRessource / N) * N + majoration_loyer_apl1) / 12) * logement_conventionne |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Même question que précédemment, d'où vient ce switch sur logement_conventionne
?
|
||
L_plafond1 = ((bareme_apl1.calc(baseRessource / N) * N + majoration_loyer_apl1) / 12) * logement_conventionne | ||
L_plafond2 = ((bareme.calc(baseRessource / N) * N + majoration_loyer) / 12) * not_(logement_conventionne) | ||
return max(L_plafond1, L_plafond2) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Accessoirement pourquoi prend-on le max des deux plafonds ici ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oui c'est toujours l'un des 2 plafonds est à 0.
Sinon on fais un "OU logique" entre les 2 plafonds.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oui ça serait plus cohérent avec les autres endroits où on fait ça dans le code. Mais j'ai une remarque plus générale que je vais mettre dans le fil principal.
@Morendil @mtifarine : Vous pouvez utiliser https://github.com/openfisca/openfisca-france/blob/master/openfisca_france/conf/cache_blacklist.py pour éviter que des variables intermédiaires utilisées qu'une fois ou peu de fois avec un calcul pas cher ne soit stockées ad vitam eternam. C'est important de ne pas surcharger la mémoire pour les runs avec de grosse bases de données surtout si les variables en questions sont mensuelles et calculées sur plusieurs années. |
Je pense que ça a été une erreur de généraliser ce motif dans ce fichier resultat = (logement_conventionne * tel_calcul) + (not_(logement_conventionne) * autre_calcul) Cela rend les formules difficiles à lire et à factoriser, et je pense qu'en l'occurrence on a de meilleures façons de s'en tirer; les formules sont généralement les mêmes, ce sont les barèmes qui changent. J'essaie de remettre tout ça à plat mais on a accumulé pas mal de passif, des copier-coller de formules avec ensuite de petites modifications du genre ci-dessus pour distinguer les secteurs APL et AL. Il faut revenir en arrière et mettre en évidence les similitudes entre les formules, avant de pouvoir les factoriser proprement. Ca risque de prendre du temps. J'ai trouvé pas mal d'infos dans cette brochure qui est citée dans un ou deux tests de Mes Aides et qui reprend certaines des explications déjà mentionnées dans ce fil de discussion. |
@benjello Oui j'ai repéré ça, il y a effectivement pas mal de variables des aides au logement dans cette liste. On va d'abord se préoccuper de la structure de code, en limitant la duplication, avant de se préoccuper de l'optimiser. Je crois qu'il faudrait aussi optimiser cette optimisation, elle me paraît implémentée de façon un peu ad-hoc. La modulation du comportement du cache devrait être un champ associé à la variable elle-même; si tu modifies le nom d'une variable tu vas changer ce comportement et ne pas t'en rendre compte parce que c'est planqué dans cache_blacklist. |
@Morendil : côté IPP on préfère de la duplication à du code qui ne peut plus tourner ;-) |
Illustration: Dans d06b43d on peut voir que les formules sont devenues très proches: openfisca-france/openfisca_france/model/prestations/aides_logement.py Lines 1341 to 1406 in d06b43d
Au prix d'une réorganisation des paramètres et d'une variable intermédiaire, b5f48b6 les rend rigoureusement identiques: On va donc pouvoir se débarrasser de deux copies redondantes sur les trois ! |
1f51d4a
to
b5f48b6
Compare
53cbfc9
to
ff722f4
Compare
K = famille('aides_logement_primo_accedant_k', period) | ||
Lo = famille('aides_logement_primo_accedant_loyer_minimal', period) | ||
plafond_mensualite = famille('aides_logement_plafond_mensualite', period) | ||
L = where(logement_conventionne, min_(plafond_mensualite, loyer), plafond_mensualite) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note : cette ligne semble générer une régression dans un de nos tests fonctionnels sur Mes Aides.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je suspecterais une inadéquation Ménage vs Famille mais je ne 'ai pas vérifié les entités des différentes variables
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@guillett Parce que vous n'avez pas logement_conventionne qui était précédemment le statut locataire_hlm ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Désolé, j'ai mis cette note hier soir juste avant de fermer mon ordinateur pour plus facilement la retrouver ce matin (enfin maintenant quoi :).
@Morendil, non je ne pense pas qu'il s’agisse de ça.
Le test en question est le suivant, un foyer primo accédant ayant remboursé son prêt (donc avec un loyer à 0).
Quelque soit le status conventionné ou non. L
devrait être égal à 0 ie. le min_(plafond_mensualite, loyer)
sinon la famille se voit attribuer des aides au logement (dans ce cas précis) 268€.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je vais faire une proposition de fix avec
L = where(logement_conventionne + accedant, min_(plafond_mensualite, loyer), plafond_mensualite)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je suis surpris que plafond_mensualite
puisse ne pas être un plafond (et je n'arrive pas à trouver une base légale pour le moment).
Évolution du système socio-fiscal.
Périodes concernées : toutes.
Zones impactées :
model/caracteristiques_socio_demographiques/logement
.conf/cache_blacklist
model/prestations/aides_logement
.parameters/prestations/aides_logement
.parameters/prestations/al_param
.parameters/prestations/al_param_accal
.parameters/prestations/al_plafonds_logement_foyer/conventionne
.parameters/prestations/al_plafonds_logement_foyer/personne_agee
.parameters/prestations/al_plafonds_logement_foyer_crous/non_rehabiliteel
.parameters/prestations/al_plafonds_logement_foyer_crous/rehabilitee
.Détails :
aides_logement_foyer
aides_logement_foyer_k
aides_logement_foyer_k_al
aides_logement_foyer_k_apl
aides_logement_categorie
aides_logement_foyer_loyer_minimal
aides_logement_foyer_loyer_minimal_al
aides_logement_foyer_loyer_minimal_apl
aides_logement_foyer_plafond_mensualite
aides_logement_foyer_crous_plafond
aides_logement_foyer_plafond
aides_logement_foyer_personne_agee_plafond
etat_logement_foyer
logement_conventionne
logement_crous
aides_logement_foyer_chambre_non_rehabilite_eligibilite
aides_logement_foyer_personne_agee_eligibilite
Fixes #930