Skip to content
Snippets Groups Projects
Commit e3aa14b9 authored by Emmanuel Raviart's avatar Emmanuel Raviart
Browse files

Update AAH reform to new version of AAH in OpenFisca 76. Add parameters to AAH reform.

parent 87dfe668
Branches
Tags
No related merge requests found
from openfisca_core import reforms
from openfisca_france.model.base import *
from openfisca_france.model.base import (
ADD,
Famille,
Individu,
max_,
min_,
set_input_divide_by_period,
MONTH,
Variable,
where,
)
# Cette partie décrit les changements
class aah_base_ressources(Variable):
value_type = float
label = "Base ressources de l'allocation adulte handicapé"
entity = Famille
entity = Individu
definition_period = MONTH
set_input = set_input_divide_by_period
def formula_2022(famille, period, parameters):
def formula_2022(individu, period, parameters):
law = parameters(period)
aah_parameters = parameters(period).prestations.minima_sociaux.aah
demandeur_en_activite = famille.demandeur("salaire_imposable", period) > 0
en_activite = individu("salaire_imposable", period) > 0
def assiette_conjoint(revenus_conjoint):
# base ressources conjoint : https://www.banquedesterritoires.fr/aah-le-plf-2022-tranche-pour-un-abattement-forfaitaire
# suppression abattement forfaitaire de 20%
return 0.9 * revenus_conjoint
return (
0.9
* (1 - aah_parameters.abattement_conjoint_salarie_taux)
* revenus_conjoint
)
def assiette_revenu_activite_demandeur(revenus_demandeur):
smic_brut_annuel = (
......@@ -31,71 +42,101 @@ class aah_base_ressources(Variable):
return (1 - 0.8) * tranche1 + (1 - 0.4) * tranche2
def base_ressource_eval_trim():
# n'inclut pas le PLF 2022
three_previous_months = period.first_month.start.period("month", 3).offset(
-3
)
base_ressource_activite_demandeur = famille.demandeur(
base_ressource_activite = individu(
"aah_base_ressources_activite_eval_trimestrielle", period
) - famille.demandeur(
) - individu(
"aah_base_ressources_activite_milieu_protege",
three_previous_months,
options=[ADD],
)
base_ressource_hors_activite_demandeur = famille.demandeur(
base_ressource_hors_activite = individu(
"aah_base_ressources_hors_activite_eval_trimestrielle", period
) + famille.demandeur(
) + individu(
"aah_base_ressources_activite_milieu_protege",
three_previous_months,
options=[ADD],
)
base_ressource_demandeur = (
assiette_revenu_activite_demandeur(base_ressource_activite_demandeur)
+ base_ressource_hors_activite_demandeur
assiette_revenu_activite_demandeur(base_ressource_activite)
+ base_ressource_hors_activite
)
base_ressource_conjoint = famille.conjoint(
base_ressource_demandeur_conjoint = individu.famille.demandeur(
"aah_base_ressources_activite_eval_trimestrielle", period
) + famille.conjoint(
) + individu.famille.demandeur(
"aah_base_ressources_hors_activite_eval_trimestrielle", period
)
base_ressource_conjoint_conjoint = individu.famille.conjoint(
"aah_base_ressources_activite_eval_trimestrielle", period
) + individu.famille.conjoint(
"aah_base_ressources_hors_activite_eval_trimestrielle", period
)
base_ressource_conjoint = (
base_ressource_conjoint_conjoint * individu.has_role(Famille.DEMANDEUR)
+ base_ressource_demandeur_conjoint
* individu.has_role(Famille.CONJOINT)
)
# Enlève les abattement forfaitaires aux revenus du conjoint.
# https://www.banquedesterritoires.fr/aah-le-plf-2022-tranche-pour-un-abattement-forfaitaire
af_nbenf = individu.famille("af_nbenf", period)
base_ressource_conjoint_abattue = max_(
0,
base_ressource_conjoint
- (
aah_parameters.abattement_conjoint_salarie_forfait
+ af_nbenf
* aah_parameters.abattement_conjoint_salarie_forfait_enfant
)
/ 4.0,
)
# ré-application de l'abattement 0.2 pour l'évaluation trimestrielle hors périmètre leximpact
abattement_conjoint_pre_2022 = 0.2
return base_ressource_demandeur + (
1 - abattement_conjoint_pre_2022
) * assiette_conjoint(base_ressource_conjoint)
return base_ressource_demandeur + assiette_conjoint(
base_ressource_conjoint_abattue
)
def base_ressource_eval_annuelle():
# inclut le PLF 2022
base_ressource_demandeur = assiette_revenu_activite_demandeur(
famille.demandeur("salaire_imposable", period.n_2, options=[ADD])
+ famille.demandeur("rpns_imposables", period.n_2)
) + famille.demandeur("revenu_assimile_pension", period.n_2)
base_ressource_conjoint = famille.conjoint(
base_ressource = individu("aah_base_ressources_eval_annuelle", period)
base_ressource_demandeur_conjoint = individu.famille.demandeur(
"aah_base_ressources_eval_annuelle", period
)
# ajout abattement conjoint + enfants à charge :
base_ressource_conjoint_conjoint = individu.famille.conjoint(
"aah_base_ressources_eval_annuelle", period
)
base_ressource_conjoint = (
base_ressource_conjoint_conjoint * individu.has_role(Famille.DEMANDEUR)
+ base_ressource_demandeur_conjoint
* individu.has_role(Famille.CONJOINT)
)
# Enlève les abattement forfaitaires aux revenus du conjoint.
# https://www.banquedesterritoires.fr/aah-le-plf-2022-tranche-pour-un-abattement-forfaitaire
af_nbenf = famille("af_nbenf", period)
af_nbenf = individu.famille("af_nbenf", period)
base_ressource_conjoint_abattue = max_(
0, base_ressource_conjoint - (5000 + 1100 * af_nbenf)
)
return base_ressource_demandeur + assiette_conjoint(
base_ressource_conjoint_abattue
0,
base_ressource_conjoint
- (
aah_parameters.abattement_conjoint_salarie_forfait
+ af_nbenf
* aah_parameters.abattement_conjoint_salarie_forfait_enfant
),
)
return assiette_revenu_activite_demandeur(
base_ressource
) + assiette_conjoint(base_ressource_conjoint_abattue)
return where(
demandeur_en_activite,
base_ressource_eval_trim(),
base_ressource_eval_annuelle(),
en_activite, base_ressource_eval_trim(), base_ressource_eval_annuelle()
)
def formula(famille, period, parameters):
def formula(individu, period, parameters):
law = parameters(period)
demandeur_en_activite = famille.demandeur("salaire_imposable", period) > 0
en_activite = individu("salaire_imposable", period) > 0
def assiette_conjoint(revenus_conjoint):
return 0.9 * (1 - 0.2) * revenus_conjoint
......@@ -114,45 +155,63 @@ class aah_base_ressources(Variable):
three_previous_months = period.first_month.start.period("month", 3).offset(
-3
)
base_ressource_activite_demandeur = famille.demandeur(
base_ressource_activite = individu(
"aah_base_ressources_activite_eval_trimestrielle", period
) - famille.demandeur(
) - individu(
"aah_base_ressources_activite_milieu_protege",
three_previous_months,
options=[ADD],
)
base_ressource_hors_activite_demandeur = famille.demandeur(
base_ressource_hors_activite = individu(
"aah_base_ressources_hors_activite_eval_trimestrielle", period
) + famille.demandeur(
) + individu(
"aah_base_ressources_activite_milieu_protege",
three_previous_months,
options=[ADD],
)
base_ressource_demandeur = (
assiette_revenu_activite_demandeur(base_ressource_activite_demandeur)
+ base_ressource_hors_activite_demandeur
assiette_revenu_activite_demandeur(base_ressource_activite)
+ base_ressource_hors_activite
)
base_ressource_conjoint = famille.conjoint(
base_ressource_demandeur_conjoint = individu.famille.demandeur(
"aah_base_ressources_activite_eval_trimestrielle", period
) + famille.conjoint(
) + individu.famille.demandeur(
"aah_base_ressources_hors_activite_eval_trimestrielle", period
)
base_ressource_conjoint_conjoint = individu.famille.conjoint(
"aah_base_ressources_activite_eval_trimestrielle", period
) + individu.famille.conjoint(
"aah_base_ressources_hors_activite_eval_trimestrielle", period
)
base_ressource_conjoint = (
base_ressource_conjoint_conjoint * individu.has_role(Famille.DEMANDEUR)
+ base_ressource_demandeur_conjoint
* individu.has_role(Famille.CONJOINT)
)
return base_ressource_demandeur + assiette_conjoint(base_ressource_conjoint)
def base_ressource_eval_annuelle():
base_ressource_demandeur = assiette_revenu_activite_demandeur(
famille.demandeur("salaire_imposable", period.n_2, options=[ADD])
+ famille.demandeur("rpns_imposables", period.n_2)
) + famille.demandeur("revenu_assimile_pension", period.n_2)
base_ressource_conjoint = famille.conjoint(
base_ressource = individu("aah_base_ressources_eval_annuelle", period)
base_ressource_demandeur_conjoint = individu.famille.demandeur(
"aah_base_ressources_eval_annuelle", period
)
base_ressource_conjoint_conjoint = individu.famille.conjoint(
"aah_base_ressources_eval_annuelle", period
)
base_ressource_conjoint = (
base_ressource_conjoint_conjoint * individu.has_role(Famille.DEMANDEUR)
+ base_ressource_demandeur_conjoint
* individu.has_role(Famille.CONJOINT)
)
return base_ressource_demandeur + assiette_conjoint(base_ressource_conjoint)
return assiette_revenu_activite_demandeur(
base_ressource
) + assiette_conjoint(base_ressource_conjoint)
return where(
demandeur_en_activite,
base_ressource_eval_trim(),
base_ressource_eval_annuelle(),
en_activite, base_ressource_eval_trim(), base_ressource_eval_annuelle()
)
- name: test 1
- name: Couple avec demandeur de l'AAH, conjoint au SMIC et 1 enfant
# keywords:
# description:
period: month:2022-01
......@@ -50,3 +50,55 @@
- 863
- 0
- 0
- name: Couple avec 1 salarié au SMIC, conjoint demandeur de l'AAH, et 1 enfant
# keywords:
# description:
period: month:2022-01
absolute_error_margin: 1
input:
individus:
Alex:
salaire_de_base:
2019: 18654.96
2020: 18654.96
2021: 18654.96
2022: 18654.96
Sam:
taux_incapacite:
2019: 0.8
2020: 0.8
2021: 0.8
2022: 0.8
age:
2019: 30
2020: 31
2021: 32
2022: 33
autonomie_financiere:
2019: true
2020: true
2021: true
2022: true
Janet: {}
famille:
enfants:
- Janet
parents:
- Alex
- Sam
foyer_fiscal:
declarants:
- Alex
- Sam
personnes_a_charge:
- Janet
menage:
conjoint: Sam
enfants:
- Janet
personne_de_reference: Alex
output:
aah:
- 0
- 863
- 0
- name: test 1
- name: Couple avec demandeur de l'AAH, conjoint au SMIC et 1 enfant
# keywords:
# description:
period: month:2022-01
......@@ -50,3 +50,55 @@
- 718
- 0
- 0
- name: Couple avec 1 salarié au SMIC, conjoint demandeur de l'AAH, et 1 enfant
# keywords:
# description:
period: month:2022-01
absolute_error_margin: 1
input:
individus:
Alex:
salaire_de_base:
2019: 18654.96
2020: 18654.96
2021: 18654.96
2022: 18654.96
Sam:
taux_incapacite:
2019: 0.8
2020: 0.8
2021: 0.8
2022: 0.8
age:
2019: 30
2020: 31
2021: 32
2022: 33
autonomie_financiere:
2019: true
2020: true
2021: true
2022: true
Janet: {}
famille:
enfants:
- Janet
parents:
- Alex
- Sam
foyer_fiscal:
declarants:
- Alex
- Sam
personnes_a_charge:
- Janet
menage:
conjoint: Sam
enfants:
- Janet
personne_de_reference: Alex
output:
aah:
- 0
- 718
- 0
......@@ -187,7 +187,7 @@ web-api = ["werkzeug (>=1.0.0,<2.0.0)", "flask (==1.1.2)", "flask-cors (==3.0.10
[[package]]
name = "openfisca-france"
version = "75.1.0"
version = "76.1.0"
description = "French tax and benefit system for OpenFisca"
category = "main"
optional = false
......@@ -380,7 +380,7 @@ python-versions = "*"
[[package]]
name = "zipp"
version = "3.5.0"
version = "3.6.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
category = "main"
optional = false
......@@ -393,7 +393,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes
[metadata]
lock-version = "1.1"
python-versions = "^3.7"
content-hash = "b7a00e68fbce24f35a630a788c1fd825e211e225a2effdba9063b977f5cd432d"
content-hash = "3ac5201b3c7f8e7d32206598fa795a6ddae216e05ebf59c21cd54e9e94a77aef"
[metadata.files]
atomicwrites = [
......@@ -513,7 +513,7 @@ openfisca-core = [
{file = "OpenFisca_Core-35.5.0-py3-none-any.whl", hash = "sha256:a8ba55c7a9ffac7172bad15b72639359a314d9812aa84df8b7bc7aa868a96b0a"},
]
openfisca-france = [
{file = "OpenFisca_France-75.1.0-py3-none-any.whl", hash = "sha256:6484fcb6a8091302fcfc51928aa1417ad457e54d707c9a12cb34d26137d72ed7"},
{file = "OpenFisca_France-76.1.0-py3-none-any.whl", hash = "sha256:e33ef9756483655339d38b4201e33e79525cb3b93ee1291bf74e3c788693f099"},
]
packaging = [
{file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"},
......@@ -709,6 +709,6 @@ wcwidth = [
{file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
]
zipp = [
{file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"},
{file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"},
{file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"},
{file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"},
]
......@@ -9,8 +9,7 @@ repository = "https://git.leximpact.dev/openfisca/openfisca-france-reforms"
[tool.poetry.dependencies]
python = "^3.7"
OpenFisca-France = "^75.1.0"
OpenFisca-Core = "^35.5.0"
OpenFisca-France = "^76.1.0"
[tool.poetry.dev-dependencies]
black = { version = "*", allow-prereleases = true }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment