TODO

Ce notebook permet de faire des tests sur les cas types de l’interface en allant chercher les json correspondants dans le dépôt openfisca-socio-fisca-openfisca-json

import glob
import os
import json
import pandas as pd

from openfisca_core.simulation_builder import SimulationBuilder
from leximpact_survey_scenario.leximpact_tax_and_benefit_system import leximpact_tbs
iaidrdi has been updated in leximpact-survey-scenario
plus_values_prelevement_forfaitaire_unique_ir has been updated in leximpact-survey-scenario
rfr_plus_values_hors_rni has been updated in leximpact-survey-scenario
rpns_imposables has been updated in leximpact-survey-scenario
rpns_autres_revenus has been updated in leximpact-survey-scenario
prelevement_forfaitaire_non_liberatoire has been updated in leximpact-survey-scenario
paje_naissance has been updated in leximpact-survey-scenario
cas_type_path = (
    "/home/cgl/leximpact/leximpact-socio-fiscal-openfisca-json/custom/test_cases/"
)
# todo : automatiser le chemin
cas_types = glob.glob(os.path.join(cas_type_path, "*.json"))
list_cas_types = list()
for cas_type in cas_types:
    with open(cas_type) as f:
        temp = json.load(f)
        if temp.get("sliders"):
            del temp["sliders"]
        del temp["description"], temp["linked_variables"]
        if (
            temp["title"]
            != "Salarié du privé à 1 SMIC, célibataire avec 1 enfant, voiture essence"
        ):
            list_cas_types.append(temp)
data_frame = pd.DataFrame(list_cas_types)
# cas_types = ["/home/cgl/leximpact/leximpact-socio-fiscal-openfisca-json/custom/test_cases/ass_01_personne_seule.json"]
cas_types = [
    "/home/cgl/leximpact/leximpact-socio-fiscal-openfisca-json/custom/test_cases/ass_02_couple_marie_salarie_secteur_prive_1_smic_conjoint_ass_1_enfant.json"
]
list_cas_types = list()
for cas_type in cas_types:
    with open(cas_type) as f:
        temp = json.load(f)
        if temp.get("sliders"):
            del temp["sliders"]
        del temp["description"], temp["linked_variables"]
        if (
            temp["title"]
            != "Salarié du privé à 1 SMIC, célibataire avec 1 enfant, voiture essence"
        ):
            list_cas_types.append(temp)
data_frame = pd.DataFrame(list_cas_types)
cas_type = dict(
    data_frame.iloc[0][["familles", "foyers_fiscaux", "individus", "menages"]]
)
simulation = SimulationBuilder()
simulation = simulation.build_from_entities(leximpact_tbs, cas_type)

for month in range(1, 13):
    if month < 10:
        period = f"2025-0{month}"
    else:
        period = f"2025-{month}"
    print(f" mois {month} : rsa = {simulation.calculate('rsa', period)[0]}")
    print(f" mois {month} : ass = {simulation.calculate('ass', period)[0]}")
    print(f" mois {month} : ppa = {simulation.calculate('ppa', period)[0]}")
print(
    f" mois {month} : revenu disponible = {simulation.calculate('revenu_disponible', 2025)[0]}"
)
/home/cgl/openfisca/openfisca-france/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_non_salarie.py:199: RuntimeWarning: divide by zero encountered in divide
  - (0.007 * (assiette_pss > 5) * ((assiette_pss - 5) / assiette_pss))
/home/cgl/openfisca/openfisca-france/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_non_salarie.py:199: RuntimeWarning: invalid value encountered in multiply
  - (0.007 * (assiette_pss > 5) * ((assiette_pss - 5) / assiette_pss))
 mois 1 : rsa = 0.0
 mois 1 : ass = 0.0
 mois 1 : ppa = 571.5196533203125
 mois 2 : rsa = 0.0
 mois 2 : ass = 0.0
 mois 2 : ppa = 571.5196533203125
 mois 3 : rsa = 0.0
 mois 3 : ass = 0.0
 mois 3 : ppa = 571.5196533203125
 mois 4 : rsa = 0.0
 mois 4 : ass = 0.0
 mois 4 : ppa = 571.5196533203125
 mois 5 : rsa = 0.0
 mois 5 : ass = 0.0
 mois 5 : ppa = 571.5196533203125
 mois 6 : rsa = 0.0
 mois 6 : ass = 0.0
 mois 6 : ppa = 571.5196533203125
 mois 7 : rsa = 0.0
 mois 7 : ass = 0.0
 mois 7 : ppa = 571.5196533203125
 mois 8 : rsa = 0.0
 mois 8 : ass = 0.0
 mois 8 : ppa = 571.5196533203125
 mois 9 : rsa = 0.0
 mois 9 : ass = 0.0
 mois 9 : ppa = 571.5196533203125
 mois 10 : rsa = 0.0
 mois 10 : ass = 0.0
 mois 10 : ppa = 571.5196533203125
 mois 11 : rsa = 0.0
 mois 11 : ass = 0.0
 mois 11 : ppa = 571.5196533203125
 mois 12 : rsa = 0.0
 mois 12 : ass = 0.0
 mois 12 : ppa = 571.5196533203125
 mois 12 : revenu disponible = 26515.19921875
simulation = SimulationBuilder()
simulation = simulation.build_from_entities(leximpact_tbs, cas_type)

for month in range(1, 13):
    if month < 10:
        period = f"2025-0{month}"
    else:
        period = f"2025-{month}"
    print(f" mois {month} : rsa = {simulation.calculate('rsa', period)[0]}")
    print(f" mois {month} : ass = {simulation.calculate('ass', period)[0]}")
    print(f" mois {month} : ppa = {simulation.calculate('ppa', period)[0]}")
print(
    f" mois {month} : revenu disponible = {simulation.calculate('revenu_disponible', 2025)[0]}"
)
 mois 1 : rsa = 0.0
 mois 1 : ass = 570.0
 mois 1 : ppa = 0.0
 mois 2 : rsa = 0.0
 mois 2 : ass = 570.0
 mois 2 : ppa = 0.0
 mois 3 : rsa = 0.0
 mois 3 : ass = 570.0
 mois 3 : ppa = 0.0
 mois 4 : rsa = 0.0
 mois 4 : ass = 570.0
 mois 4 : ppa = 0.0
 mois 5 : rsa = 0.0
 mois 5 : ass = 570.0
 mois 5 : ppa = 0.0
 mois 6 : rsa = 0.0
 mois 6 : ass = 570.0
 mois 6 : ppa = 0.0
 mois 7 : rsa = 0.0
 mois 7 : ass = 570.0
 mois 7 : ppa = 0.0
 mois 8 : rsa = 0.0
 mois 8 : ass = 570.0
 mois 8 : ppa = 0.0
 mois 9 : rsa = 0.0
 mois 9 : ass = 570.0
 mois 9 : ppa = 0.0
 mois 10 : rsa = 0.0
 mois 10 : ass = 570.0
 mois 10 : ppa = 0.0
 mois 11 : rsa = 0.0
 mois 11 : ass = 570.0
 mois 11 : ppa = 0.0
 mois 12 : rsa = 0.0
 mois 12 : ass = 570.0
 mois 12 : ppa = 0.0
 mois 12 : revenu disponible = 26683.703125

old

mois 1 : rsa = 0.0 mois 1 : ass = 545.0999755859375 mois 2 : rsa = 0.0 mois 2 : ass = 545.0999755859375 mois 3 : rsa = 0.0 mois 3 : ass = 545.0999755859375 mois 4 : rsa = 14.3248291015625 mois 4 : ass = 545.0999755859375 mois 5 : rsa = 14.3248291015625 mois 5 : ass = 545.0999755859375 mois 6 : rsa = 14.3248291015625 mois 6 : ass = 545.0999755859375 mois 7 : rsa = 14.3248291015625 mois 7 : ass = 545.0999755859375 mois 8 : rsa = 14.3248291015625 mois 8 : ass = 545.0999755859375 mois 9 : rsa = 14.3248291015625 mois 9 : ass = 545.0999755859375 mois 10 : rsa = 14.3248291015625 mois 10 : ass = 545.0999755859375 mois 11 : rsa = 14.3248291015625 mois 11 : ass = 545.0999755859375 mois 12 : rsa = 14.3248291015625 mois 12 : ass = 545.0999755859375

545.0999755859375 * 12
6541.19970703125
534.8200073242188 * 12
6417.840087890625
570 * 12
6840
smic_brut_2024 = 1766.92 * 12
23230 / smic_brut_2024
1.095597612417842
smic_net_2024 = 1398.69 * 12
1.1 * smic_net_2024
18462.708

Remarques / commentaires sur les cas types :

dans l’ordre du niveau de vie croissant

  • PB rsa_04_rsa_jeune.json : une fois qu’on est sur le cas type on ne voit pas du tout que c’est un jeune avec condition + qu’il est logé gratuitement + pas très réaliste qu’il fasse 2 ans à temps plein et puis un an total sans rien

  • PB rsa_06_femme_enceinte_isolee : on ne voit pas qu’elle est enceinte + qu’elle a moins de 25 ans (mais on s’en fiche non ?)

  • aspa_01_retraite_pension_sous_plafond : dans D1 ou D2 checker niveau de vie

  • PB Z_chomeur_allocation_minimum : pas très réaliste car en fait il n’y a pas de montant minimum d’ARE, si 0.75 du revenus de référence est inférieur on prend cela. Plus peu propable qu’il n’est que ça toute l’année… –> Proposition de mettre Z_chomeur_célibataire

  • csg_retraite_01_retraite_taux_reduit : nickel D2

  • PB rsa_03_forfait_logement_chomeur : les primo accédants ont également un forfait logement, là il n’apparaissait pas car le primo accédant avait du loyer donc mal calculé. Le forfait logement ne peut être que en faveur des locataires. J’enlèverais la comparaison avec l’autre cas type car ne me semble pas pertinente

  • csg_salaire_01_salarie_prive_1_SMIC : ok D3, mais changement pour locataire

  • PB aspa_02_couple_retraites_1_pension_moyenne_1_sans_pension : ok, pour montrer ASPA mais certainement dans D1, pas cas type majoritaire

  • csg_retraite_02_retraite_taux_médian Ok D3

  • PB prime_partage_valeur_01_salarie_secteur_prive_1_smic_prime_partage_valeur –> à supprimer ? Ou mettre que dans un cas très particulier ,?

  • rsa_01_seuil_rsa_inactif : OK, D1, enlève 1 enfant + logement hlm

  • PB rsa_02_seuil_rsa_chomeur : ok D1 en soi mais un peu doublon avec précédant

  • PB prime_partage_valeur_03_salarie_secteur_prive_1_smic_prime_classique : à ne pas mettre tout le temps ?

  • PB prime_partage_valeur_01_salarie_secteur_prive_1_smic_prime_partage_valeur : comme au dessus ?

  • Les trois cas types TODE à retirer ??

  • irpp_economique_02_salarie_seuil_minimal_entree_impot_non_impose et irpp_economique_01_salarie_seuil_minimal_entree_impot_contribuable ok mais D3 et on a déjà

  • rsa_05_rsa_majore_parent_isole remplacé par famille_monoparentale_un_enfant_smic car sinon doublon

  • paje_cmg_02_salarie_secteur_prive_1_smic_enfant_mode_de_garde je l’enlèverais car spécifique PLF 2022

  • irpp_economique_08_salarie_fiscalite_outremer_metropole : Ok D3

  • PB irpp_economique_07_salarie_fiscalite_outremer_guadeloupe : on ne peut pas vraiment mettre dans les dixième qui sont construits sans les outres mer –> Les outres mer ne sont plus affichés dans l’interface ?

  • csg_retraite_03_taux_plein : ok passage de 2 à 1,8 SMIC pour le mettre en D7

  • PB Z_couple_1.6_smic_1_aah_1_enfant -> Je n’ai pas regardé l’aah encore

  • 01_couple_marie_salaries_secteur_prive_1_smic_chacun_2_enfants_d3 ok D3 j’ai rajouté un enfant

  • PB isf_ifi_01_salarie_3.5_SMIC_immobilier_1.5M : je n’ai pas regardé l’ifi

  • allegement_fillon_01_salaries_secteur_prive_inf1.6_SMIC_couple_pacse : D8, changement pour proprio

  • PB allegement_fillon_02_salaries_secteur_prive_sup1.6_SMIC_couple_pacse : doublon avec précédent : je me demande si ces cas types de comparaison de seuils d’entrée / sorties sont encore avantageux avec les courbes ??

  • irpp_economique_03_couple_pacse_salaries_effet_quotient_conjugal : OK D9 mais changement pour propriétaire

  • PB : irpp_economique_04_couple_concubin_salaries_effet_quotient_conjugal : serait en D8 mais checker part des concubinage

  • paje_cmg_01_salaries_secteur_prive_2.5_smic_1_enfant_mode_de_garde : nickel D8

  • irpp_economique_06_couple_maries_salaries_2enfants_effet_quotient_familial : nickel D7

  • PB irpp_economique_05_couple_maries_salaries_1enfant_effet_quotient_familial : D8 mais doublon

  • PB allegement_cotisation_maladie_01_salaries_secteur_prive_2.4_smic_x2_tempspartiel_x1_couple_3_enfants et allegement_cotisation_maladie_02_salaries_secteur_prive_2.6_smic_x2_tempspartiel_x1_couple_3_enfants: pas très réaliste + pour illustrer les cotisations je mettrais des cas types de célibataires

  • csg_salaire_02_salarie_prive_sup4_PSS_supp_abattement ok D10

Bibliographie

  • Non recours à l’ASPA des personnes seules, DREES : https://drees.solidarites-sante.gouv.fr/sites/default/files/2022-05/Dossier%20de%20la%20DREES%20-%20Non%20recours%20au%20MV.pdf