From 7837a37c6a882564f7bc7c37c56847a4f87838f8 Mon Sep 17 00:00:00 2001 From: Shamzic Date: Mon, 13 Jan 2025 14:23:41 +0100 Subject: [PATCH] =?UTF-8?q?refactor:=20extraction=20code=20principal=20en?= =?UTF-8?q?=20m=C3=A9thodes=20(BRS)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/prestations/bail_reel_solidaire.py | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/openfisca_france/model/prestations/bail_reel_solidaire.py b/openfisca_france/model/prestations/bail_reel_solidaire.py index 137f7552c2..7bf62d79c9 100644 --- a/openfisca_france/model/prestations/bail_reel_solidaire.py +++ b/openfisca_france/model/prestations/bail_reel_solidaire.py @@ -4,9 +4,10 @@ import numpy as np -def preload_zone_abc(period, parameters): +def load_zonage_file(period, parameters): chemin_fichier_zonage_abc = os.path.join(parameters(period).prestations_sociales.bail_reel_solidaire.parametres_generaux.fichier_zonage[0]) + if not os.path.exists(chemin_fichier_zonage_abc): return None @@ -15,6 +16,31 @@ def preload_zone_abc(period, parameters): return {row['CODGEO']: row['Zone en vigueur depuis le 5 juillet 2024'] for row in csv_reader} +def plafond_par_zone_et_composition(nb_personnes, plafonds_par_zones, zone): + plafond_zone = plafonds_par_zones[f'zone_{zone}'] + + tranches_composition = range(1, 7) + conditions_nb_personnes = [ + nb_personnes == i if i < 6 else nb_personnes >= i + for i in tranches_composition + ] + + plafonds_revenus = [ + plafond_zone[f'nb_personnes_{i}'] + for i in tranches_composition + ] + + return select(conditions_nb_personnes, plafonds_revenus) + + +def plafond_supplementaire_par_zone(nb_personnes, plafonds_par_zones, zone, nb_personnes_max): + return where( + nb_personnes > nb_personnes_max, + (nb_personnes - nb_personnes_max) * plafonds_par_zones[f'zone_{zone}']['nb_personnes_supplementaires'], + 0 + ) + + class bail_reel_solidaire(Variable): entity = Menage value_type = bool @@ -27,53 +53,27 @@ def formula(menage, period, parameters): zones_abc_eligibles = parametres.zones_abc_eligibles nb_personnes_max = parametres.nombre_personnes_maximum - def plafond_par_zone_et_composition(nb_personnes, plafonds_par_zones, zone): - plafond_zone = plafonds_par_zones[f'zone_{zone}'] - conditions_nb_personnes = [ - nb_personnes == 1, - nb_personnes == 2, - nb_personnes == 3, - nb_personnes == 4, - nb_personnes == 5, - nb_personnes >= 6 - ] - plafonds_revenus = [ - plafond_zone['nb_personnes_1'], - plafond_zone['nb_personnes_2'], - plafond_zone['nb_personnes_3'], - plafond_zone['nb_personnes_4'], - plafond_zone['nb_personnes_5'], - plafond_zone['nb_personnes_6'] - ] - return select(conditions_nb_personnes, plafonds_revenus) - - def plafond_supplementaire_par_zone(nb_personnes, plafonds_par_zones, zone): - return where(nb_personnes > nb_personnes_max, - (nb_personnes - nb_personnes_max) * plafonds_par_zones[f'zone_{zone}']['nb_personnes_supplementaires'], 0) - - zones_par_depcom = preload_zone_abc(period, parameters) + zones_par_depcom = load_zonage_file(period, parameters) if not zones_par_depcom: return False nb_personnes = menage.nb_persons() depcom = menage('depcom', period.first_month) - zones_menage = np.array([zones_par_depcom.get( - d.decode('utf-8'), None) for d in depcom]) + zones_menage = np.array([zones_par_depcom.get(d.decode('utf-8'), None) for d in depcom]) - plafonds_par_zones = parameters( - period).prestations_sociales.bail_reel_solidaire.plafonds_par_zones + plafonds_par_zones = parameters(period).prestations_sociales.bail_reel_solidaire.plafonds_par_zones plafond_revenu_base = select( [zones_menage == zone for zone in zones_abc_eligibles], [plafond_par_zone_et_composition( nb_personnes, plafonds_par_zones, zone) for zone in zones_abc_eligibles] - ) + ) plafond_revenu_supplementaire = select( [zones_menage == zone for zone in zones_abc_eligibles], [plafond_supplementaire_par_zone( - nb_personnes, plafonds_par_zones, zone) for zone in zones_abc_eligibles] - ) + nb_personnes, plafonds_par_zones, zone, nb_personnes_max) for zone in zones_abc_eligibles] + ) rfr = menage.sum(menage.members.foyer_fiscal( 'rfr', period.n_2), role=FoyerFiscal.DECLARANT_PRINCIPAL)