diff --git a/.github/test-api.sh b/.github/test-api.sh index c8d8f9df46..a408e042e4 100755 --- a/.github/test-api.sh +++ b/.github/test-api.sh @@ -3,7 +3,7 @@ PORT=5000 ENDPOINT=spec -openfisca serve --country-package openfisca_france --port $PORT & +openfisca serve --country-package openfisca_france --port $PORT --workers 1 & server_pid=$! curl --retry-connrefused --retry 10 --retry-delay 5 --fail http://127.0.0.1:$PORT/$ENDPOINT | python -m json.tool > /dev/null diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 25569d1d4e..66d9392d96 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -12,7 +12,7 @@ jobs: fail-fast: true matrix: os: ["ubuntu-20.04"] # On peut ajouter "macos-latest" si besoin - python-version: ["3.7.9", "3.8.9", "3.9.9"] + python-version: ["3.9.9", "3.10.6"] steps: - name: Checkout uses: actions/checkout@v2 @@ -48,7 +48,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.7.9 + python-version: 3.9.9 - name: Cache build id: restore-build uses: actions/cache@v2 @@ -68,7 +68,7 @@ jobs: fail-fast: true matrix: os: [ "ubuntu-20.04" ] # On peut ajouter "macos-latest" si besoin - python-version: ["3.7.9", "3.8.9", "3.9.9"] + python-version: ["3.9.9", "3.10.6"] steps: - uses: actions/checkout@v2 - name: Set up Python @@ -92,7 +92,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: 3.7.9 + python-version: 3.9.9 - name: Test max path length run: make check-path-length @@ -112,7 +112,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.7.9 + python-version: 3.9.9 - name: Cache build id: restore-build uses: actions/cache@v2 @@ -138,7 +138,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.7.9 + python-version: 3.9.9 - name: Cache build id: restore-build uses: actions/cache@v2 @@ -158,7 +158,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.7.9 + python-version: 3.9.9 - name: Check version number has been properly updated run: "${GITHUB_WORKSPACE}/.github/is-version-number-acceptable.sh" @@ -178,7 +178,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.7.9 + python-version: 3.9.9 - id: stop-early run: if "${GITHUB_WORKSPACE}/.github/has-functional-changes.sh" ; then echo "::set-output name=status::success" ; fi @@ -196,7 +196,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.7.9 + python-version: 3.9.9 - name: Cache build id: restore-build uses: actions/cache@v2 @@ -223,7 +223,7 @@ jobs: - uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true - python-version: "3.7.9" + python-version: "3.9.9" # Add conda-forge for OpenFisca-Core channels: conda-forge activate-environment: true @@ -284,7 +284,7 @@ jobs: - uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true - python-version: "3.7.9" + python-version: "3.9.9" # Add conda-forge for OpenFisca-Core channels: conda-forge activate-environment: true diff --git a/openfisca_france/model/base.py b/openfisca_france/model/base.py index 56eabfc101..146824bdf5 100644 --- a/openfisca_france/model/base.py +++ b/openfisca_france/model/base.py @@ -1,6 +1,10 @@ from openfisca_core.model_api import * from openfisca_france.entities import Famille, FoyerFiscal, Individu, Menage # noqa F401 + +AGE_INT_MINIMUM = -9999 + + # Enums commonly used through the legislation diff --git a/openfisca_france/model/prelevements_obligatoires/impot_revenu/ir.py b/openfisca_france/model/prelevements_obligatoires/impot_revenu/ir.py index cf40fb99cd..daf1b8ca54 100644 --- a/openfisca_france/model/prelevements_obligatoires/impot_revenu/ir.py +++ b/openfisca_france/model/prelevements_obligatoires/impot_revenu/ir.py @@ -42,7 +42,7 @@ class jour_xyz(Variable): class age(Variable): unit = 'years' value_type = int - default_value = -9999 + default_value = AGE_INT_MINIMUM entity = Individu label = 'Âge (en années) au premier jour du mois' definition_period = MONTH @@ -81,7 +81,7 @@ def formula(individu, period, parameters): class age_en_mois(Variable): value_type = int - default_value = -9999 + default_value = AGE_INT_MINIMUM unit = 'months' entity = Individu label = 'Âge (en mois)' @@ -2544,7 +2544,7 @@ def abat_rpns(rev, P): return min_( f5ht + f5it + f5jt + f5kt + f5lt + f5mt, abat_rpns(mncn_impo, specialbnc.services) + mncn_pvct + cncn_aimp + (1 + cga) * cncn_bene - ) #  TODO check ! + ) # TODO check ! class defmeu(Variable): diff --git a/openfisca_france/model/prelevements_obligatoires/impot_revenu/prelevements_forfaitaires/prelevement_forfaitaire_liberatoire.py b/openfisca_france/model/prelevements_obligatoires/impot_revenu/prelevements_forfaitaires/prelevement_forfaitaire_liberatoire.py index 0fe1ac0a0f..74ee2729b2 100644 --- a/openfisca_france/model/prelevements_obligatoires/impot_revenu/prelevements_forfaitaires/prelevement_forfaitaire_liberatoire.py +++ b/openfisca_france/model/prelevements_obligatoires/impot_revenu/prelevements_forfaitaires/prelevement_forfaitaire_liberatoire.py @@ -121,3 +121,37 @@ def formula_2013_01_01(foyer_fiscal, period, parameters): ) return pfl + + def formula_2018_01_01(foyer_fiscal, period, parameters): + ''' + Prelèvement forfaitaire libératoire (PFL) sur les revenus du capital + Notes : + (1) Le paramètre "avec_anonymat" est abrogé en 2018. + ''' + + assurance_vie_pl_non_anonyme_plus8ans_depuis1990 = foyer_fiscal('assurance_vie_pl_non_anonyme_plus8ans_depuis1990', period) + assurance_vie_pl_non_anonyme_plus6ans_avant1990 = foyer_fiscal('assurance_vie_pl_non_anonyme_plus6ans_avant1990', period) + assurance_vie_pl_non_anonyme_moins4ans_depuis1990 = foyer_fiscal('assurance_vie_pl_non_anonyme_moins4ans_depuis1990', period) + assurance_vie_pl_non_anonyme_4_8_ans_depuis1990 = foyer_fiscal('assurance_vie_pl_non_anonyme_4_8_ans_depuis1990', period) + produit_epargne_solidaire = foyer_fiscal('produit_epargne_solidaire', period) + produit_etats_non_cooperatif = foyer_fiscal('produit_etats_non_cooperatif', period) + + param_pfl_av = parameters(period).taxation_capital.prelevement_forfaitaire.liberatoire_assurance_vie.bons_contrats_placements + param_pfl = parameters(period).taxation_capital.prelevement_forfaitaire.liberatoire_taux_fixe + + pfl = -( + (param_pfl_av.apres_le_1_1_90.duree_8_ans_et_produits_apres_1998 + * assurance_vie_pl_non_anonyme_plus8ans_depuis1990) + + (param_pfl_av.entre_1_1_83_et_31_12_89.six_ans_produits_apres_98 + * assurance_vie_pl_non_anonyme_plus6ans_avant1990) + + (param_pfl_av.apres_le_1_1_90.duree_moins_de_4_ans + * assurance_vie_pl_non_anonyme_moins4ans_depuis1990) + + (param_pfl_av.apres_le_1_1_90.duree_4_a_8_ans + * assurance_vie_pl_non_anonyme_4_8_ans_depuis1990) + + (param_pfl.produits_epargne_solidaire_partage + * produit_epargne_solidaire) + + (param_pfl_av.produits_vers_etats_non_cooperatifs + * produit_etats_non_cooperatif) + ) + + return pfl diff --git a/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py b/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py index 78b1006f09..cde0441bcf 100644 --- a/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py +++ b/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py @@ -2,6 +2,8 @@ from numpy import busday_count, datetime64, logical_or as or_, logical_and as and_, timedelta64 +from openfisca_core.periods import Period + from openfisca_france.model.base import * log = logging.getLogger(__name__) @@ -535,7 +537,7 @@ def compute_allegement_anticipe(individu, period, parameters, variable_name, com if period.start.month == 12: cumul = individu( variable_name, - period.start.offset('first-of', 'year').period('month', 11), options = [ADD]) + Period(('month', period.start.offset('first-of', 'year'), 11)), options = [ADD]) return compute_function( individu, period.this_year, parameters ) - cumul @@ -546,8 +548,8 @@ def compute_allegement_progressif(individu, period, parameters, variable_name, c return compute_function(individu, period.first_month, parameters) if period.start.month > 1: - up_to_this_month = period.start.offset('first-of', 'year').period('month', period.start.month) - up_to_previous_month = period.start.offset('first-of', 'year').period('month', period.start.month - 1) + up_to_this_month = Period(('month', period.start.offset('first-of', 'year'), period.start.month)) + up_to_previous_month = Period(('month', period.start.offset('first-of', 'year'), period.start.month - 1)) cumul = individu(variable_name, up_to_previous_month, options = [ADD]) return compute_function(individu, up_to_this_month, parameters) - cumul diff --git a/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/base.py b/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/base.py index fbb9be833f..174c8045d3 100644 --- a/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/base.py +++ b/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/base.py @@ -1,3 +1,5 @@ +from openfisca_core.periods import Period + from openfisca_france.model.base import * @@ -271,7 +273,7 @@ def iter_cotisations(): # FIXME: dirty fix since public_titulaire_militaire does not exist if categorie_salarie_type.name == 'public_titulaire_militaire': continue - raise(e) + raise e if bareme_name in cotisations_by_categorie_salarie[categorie_salarie_type.name]: bareme = categorie_salarie_baremes[bareme_name] @@ -371,8 +373,10 @@ def compute_cotisation_anticipee(individu, period, parameters, cotisation_type = bareme_name = bareme_name, ) if period.start.month == 12: - cumul = individu(variable_name, period.start.offset('first-of', 'month').offset( - -11, 'month').period('month', 11), options = [ADD]) + cumul = individu( + variable_name, + Period(('month', period.start.offset('first-of', 'month').offset(-11, 'month'), 11)), + options = [ADD]) # December variable_name depends on variable_name in the past 11 months. # We need to explicitely allow this recursion. diff --git a/openfisca_france/model/prelevements_obligatoires/taxe_habitation/taxe_habitation.py b/openfisca_france/model/prelevements_obligatoires/taxe_habitation/taxe_habitation.py index bf0cadcde8..2f6e32c41d 100644 --- a/openfisca_france/model/prelevements_obligatoires/taxe_habitation/taxe_habitation.py +++ b/openfisca_france/model/prelevements_obligatoires/taxe_habitation/taxe_habitation.py @@ -1,3 +1,5 @@ +from openfisca_core.periods import Period + from openfisca_france.model.base import * @@ -333,7 +335,7 @@ def formula_2017_01_01(menage, period, parameters): taux_th_commune = menage('taux_th_commune', period) taux_th_epci = menage('taux_th_epci', period) ecart_avec_2000 = period.start.offset('first-of', 'year').year - 2000 - annee_2000 = period.start.offset('first-of', 'year').period('year').offset(-ecart_avec_2000) + annee_2000 = Period(('year', period.start.offset('first-of', 'year'), 1)).offset(-ecart_avec_2000) taux_th_commune_2000 = menage('taux_th_commune', annee_2000) taux_th_epci_2000 = menage('taux_th_epci', annee_2000) diff --git a/openfisca_france/model/prestations/agepi.py b/openfisca_france/model/prestations/agepi.py index aea93b0287..ef3a1ac84b 100644 --- a/openfisca_france/model/prestations/agepi.py +++ b/openfisca_france/model/prestations/agepi.py @@ -1,5 +1,7 @@ from numpy import fabs, timedelta64 +from openfisca_core.periods import Period + from openfisca_france.model.base import Famille, Individu, Variable, Enum, MONTH, ADD,\ set_input_dispatch_by_period, set_input_divide_by_period, date, min_, not_ from openfisca_france.model.revenus.activite.salarie import TypesContrat, TypesLieuEmploiFormation,\ @@ -83,7 +85,7 @@ def formula_2014_01_20(individu, period, parameters): condition_nb_enfants = individu.famille('agepi_nbenf', period) > 0 # L'individu n'a pas touché l'AGEPI dans les 12 derniers mois (condition de durée entre faits générateurs) - annee_glissante = period.start.period('year').offset(-1).offset(-1, 'month') + annee_glissante = Period(('year', period.start, 1)).offset(-1).offset(-1, 'month') agepi_non_percues = not_(individu('agepi', annee_glissante, options=[ADD])) # L'individu est inscrit en catégorie 1, 2, 3, 4 "stagiaire de la formation professionnelle" ou 5 "contrat aidé" diff --git a/openfisca_france/model/prestations/aide_mobilite.py b/openfisca_france/model/prestations/aide_mobilite.py index a7772c2ffe..63f0e6f671 100644 --- a/openfisca_france/model/prestations/aide_mobilite.py +++ b/openfisca_france/model/prestations/aide_mobilite.py @@ -1,4 +1,7 @@ from numpy import fabs, timedelta64 + +from openfisca_core.periods import Period + from openfisca_france.model.base import Individu, Variable, MONTH, Enum, not_, ADD,\ set_input_dispatch_by_period, set_input_divide_by_period, min_, date from openfisca_france.model.caracteristiques_socio_demographiques.logement import TypesLieuResidence @@ -326,7 +329,7 @@ def formula_2021_06_09(individu, period, parameters): eligibilite_amob = individu('aide_mobilite_eligible', period) parametres_amob = parameters(period).prestations_sociales.aide_mobilite - annee_glissante = period.start.period('year').offset(-1) + annee_glissante = Period(('year', period.start, 1)).offset(-1) aide_mobilite_12_derniers_mois = individu('aide_mobilite', annee_glissante, options=[ADD]) diff --git a/openfisca_france/model/prestations/aides_exceptionnelles/indemnite_inflation.py b/openfisca_france/model/prestations/aides_exceptionnelles/indemnite_inflation.py index 064536d4ef..b8894b994f 100644 --- a/openfisca_france/model/prestations/aides_exceptionnelles/indemnite_inflation.py +++ b/openfisca_france/model/prestations/aides_exceptionnelles/indemnite_inflation.py @@ -1,5 +1,7 @@ -from openfisca_france.model.base import * from openfisca_core import periods + +from openfisca_france.model.base import * + from numpy import logical_or as or_, logical_and as and_ # Les éligibilités séparées de l'indemnité inflation diff --git a/openfisca_france/model/prestations/aides_logement.py b/openfisca_france/model/prestations/aides_logement.py index 8154196b8e..a357421a11 100644 --- a/openfisca_france/model/prestations/aides_logement.py +++ b/openfisca_france/model/prestations/aides_logement.py @@ -7,9 +7,9 @@ from numpy import ceil, datetime64, fromiter, int16, logical_or as or_, logical_and as and_, logical_not as not_ -import openfisca_france -from openfisca_core.periods import Instant +from openfisca_core.periods import Instant, Period +import openfisca_france from openfisca_france.model.base import * from openfisca_france.model.revenus.activite.salarie import TypesConges from openfisca_france.model.prestations.prestations_familiales.base_ressource import nb_enf @@ -566,7 +566,7 @@ class aide_logement_base_ressources_individu(Variable): def formula_2021_01_01(individu, period, parameters): period_frais = period.last_year - annee_glissante = period.start.period('year').offset(-1).offset(-1, 'month') + annee_glissante = Period(('year', period.start, 1)).offset(-1).offset(-1, 'month') salaire_imposable = individu('salaire_imposable', annee_glissante, options=[ADD]) chomage_imposable = individu('chomage_imposable', annee_glissante, options=[ADD]) diff --git a/openfisca_france/model/prestations/autonomie.py b/openfisca_france/model/prestations/autonomie.py index 50e7ac90f8..c5833d397b 100644 --- a/openfisca_france/model/prestations/autonomie.py +++ b/openfisca_france/model/prestations/autonomie.py @@ -1,3 +1,5 @@ +from openfisca_core.periods import Period + from openfisca_france.model.base import * @@ -133,7 +135,7 @@ class apa_eligibilite(Variable): set_input = set_input_dispatch_by_period def formula_2002(individu, period, parameters): - period = period.start.offset('first-of', 'month').period('month') + period = Period(('month', period.start.offset('first-of', 'month'), 1)) parameters = parameters(period).prestations_sociales.prestations_etat_de_sante.perte_autonomie_personnes_agees age = individu('age', period) apa_age_min = parameters.apa_domicile.condition_age @@ -172,7 +174,7 @@ class apa_domicile(Variable): set_input = set_input_divide_by_period def formula_2002(individu, period, parameters): - period = period.start.offset('first-of', 'month').period('month') + period = Period(('month', period.start.offset('first-of', 'month'), 1)) apa_domicile = parameters(period).prestations_sociales.prestations_etat_de_sante.perte_autonomie_personnes_agees.apa_domicile apa_eligibilite = individu('apa_eligibilite', period) smic_brut_horaire = parameters(period).marche_travail.salaire_minimum.smic.smic_b_horaire @@ -193,7 +195,7 @@ class apa_etablissement(Variable): set_input = set_input_divide_by_period def formula_2002(individu, period, parameters): - period = period.start.offset('first-of', 'month').period('month') + period = Period(('month', period.start.offset('first-of', 'month'), 1)) perte_autonomie_personnes_agees = parameters(period).prestations_sociales.prestations_etat_de_sante.perte_autonomie_personnes_agees smic_brut_horaire = parameters(period).marche_travail.salaire_minimum.smic.smic_b_horaire seuil_non_versement = perte_autonomie_personnes_agees.apa_institution.seuil_versement_en_part_smic_brut_horaire * smic_brut_horaire @@ -350,7 +352,7 @@ class apa_urgence_institution(Variable): set_input = set_input_divide_by_period def formula_2002(individu, period, parameters): - period = period.start.offset('first-of', 'month').period('month') + period = Period(('month', period.start.offset('first-of', 'month'), 1)) dependance_tarif_etablissement_gir_1_2 = individu('dependance_tarif_etablissement_gir_1_2', period) part_urgence_institution = parameters(period).prestations_sociales.prestations_etat_de_sante.perte_autonomie_personnes_agees.apa_institution.part_tarif_dependance apa_urgence_institution = part_urgence_institution * dependance_tarif_etablissement_gir_1_2 diff --git a/openfisca_france/model/prestations/jeunes/contrat_engagement_jeune.py b/openfisca_france/model/prestations/jeunes/contrat_engagement_jeune.py index d9f49c563f..73e31c8a69 100644 --- a/openfisca_france/model/prestations/jeunes/contrat_engagement_jeune.py +++ b/openfisca_france/model/prestations/jeunes/contrat_engagement_jeune.py @@ -1,3 +1,5 @@ +from openfisca_core.periods import Period + from openfisca_france.model.base import * # noqa analysis:ignore @@ -17,7 +19,7 @@ def formula_2022_03_01(individu, period, parameters): montant_degressivite = parameters(period).prestations_sociales.aides_jeunes.contrat_engagement_jeune.degressivite.montant age = individu('age', period) majeur = individu('majeur', period) - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) tranche = individu.foyer_fiscal('ir_tranche', previous_year) degressivite = majeur * (tranche > 0) * montant_degressivite @@ -91,7 +93,7 @@ def formula_2022_03_01(individu, period, parameters): niveau_ressources = (niveau_ressources_individuelles_3_mois) / 3 - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) tranche = individu.foyer_fiscal('ir_tranche', previous_year) <= 1 return (niveau_ressources <= plafond) * sans_rsa * sans_ppa * tranche diff --git a/openfisca_france/model/prestations/logement_social.py b/openfisca_france/model/prestations/logement_social.py index 84fa73fd9e..6b04c9293a 100644 --- a/openfisca_france/model/prestations/logement_social.py +++ b/openfisca_france/model/prestations/logement_social.py @@ -1,7 +1,7 @@ from numpy import isin, logical_not as not_, select from openfisca_core.indexed_enums import Enum -from openfisca_core.periods import MONTH +from openfisca_core.periods import MONTH, Period from openfisca_core.variables import Variable from openfisca_france.entities import Famille, Menage @@ -172,7 +172,7 @@ class logement_social_eligible(Variable): def formula_2017(famille, period, parameters): parent_majeur = famille.any(famille.members('majeur', period), role = Famille.PARENT) logement_social_plafond_ressources = famille('logement_social_plafond_ressources', period) - rfr_n0 = famille.demandeur.foyer_fiscal('rfr', period.start.offset('first-of', 'year').period('year')) + rfr_n0 = famille.demandeur.foyer_fiscal('rfr', Period(('year', period.start.offset('first-of', 'year'), 1))) rfr_n1 = famille.demandeur.foyer_fiscal('rfr', period.last_year) rfr_n2 = famille.demandeur.foyer_fiscal('rfr', period.n_2) diff --git a/openfisca_france/model/prestations/minima_sociaux/aah.py b/openfisca_france/model/prestations/minima_sociaux/aah.py index f4c02d6e32..3c3ec5376c 100644 --- a/openfisca_france/model/prestations/minima_sociaux/aah.py +++ b/openfisca_france/model/prestations/minima_sociaux/aah.py @@ -1,3 +1,5 @@ +from openfisca_core.periods import Period + from openfisca_france.model.base import * from numpy import datetime64 @@ -105,7 +107,7 @@ def assiette_revenu_activite_demandeur(revenus_demandeur): return (1 - aah.travail_ordinaire.abattement_30) * total_tranche1 + (1 - aah.travail_ordinaire.abattement_sup) * total_tranche2 def base_ressource_eval_trim(): - three_previous_months = period.first_month.start.period('month', 3).offset(-3) + three_previous_months = Period(('month', period.first_month.start, 3)).offset(-3) base_ressource_activite = individu('aah_base_ressources_activite_eval_trimestrielle', period) - individu('aah_base_ressources_activite_milieu_protege', three_previous_months, options = [ADD]) base_ressource_hors_activite = individu('aah_base_ressources_hors_activite_eval_trimestrielle', period) + individu('aah_base_ressources_activite_milieu_protege', three_previous_months, options = [ADD]) @@ -151,7 +153,7 @@ def assiette_revenu_activite_demandeur(revenus_demandeur): return (1 - aah.travail_ordinaire.abattement_30) * total_tranche1 + (1 - aah.travail_ordinaire.abattement_sup) * total_tranche2 def base_ressource_eval_trim(): - three_previous_months = period.first_month.start.period('month', 3).offset(-3) + three_previous_months = Period(('month', period.first_month.start, 3)).offset(-3) base_ressource_activite = individu('aah_base_ressources_activite_eval_trimestrielle', period) - individu('aah_base_ressources_activite_milieu_protege', three_previous_months, options = [ADD]) base_ressource_hors_activite = individu('aah_base_ressources_hors_activite_eval_trimestrielle', period) + individu('aah_base_ressources_activite_milieu_protege', three_previous_months, options = [ADD]) @@ -192,7 +194,7 @@ def assiette_revenu_activite_demandeur(revenus_demandeur): return (1 - aah.travail_ordinaire.abattement_30) * total_tranche1 + (1 - aah.travail_ordinaire.abattement_sup) * total_tranche2 def base_ressource_eval_trim(): - three_previous_months = period.first_month.start.period('month', 3).offset(-3) + three_previous_months = Period(('month', period.first_month.start, 3)).offset(-3) base_ressource_activite = individu('aah_base_ressources_activite_eval_trimestrielle', period) - individu('aah_base_ressources_activite_milieu_protege', three_previous_months, options = [ADD]) base_ressource_hors_activite = individu('aah_base_ressources_hors_activite_eval_trimestrielle', period) + individu('aah_base_ressources_activite_milieu_protege', three_previous_months, options = [ADD]) @@ -239,7 +241,7 @@ class aah_base_ressources_activite_eval_trimestrielle(Variable): def formula(individu, period): period = period.first_month - three_previous_months = period.start.period('month', 3).offset(-3) + three_previous_months = Period(('month', period.start, 3)).offset(-3) last_year = period.last_year ressources_a_inclure = [ @@ -299,7 +301,7 @@ class aah_base_ressources_hors_activite_eval_trimestrielle(Variable): def formula(individu, period): period = period.first_month - three_previous_months = period.start.period('month', 3).offset(-3) + three_previous_months = Period(('month', period.start, 3)).offset(-3) ressources_a_inclure = [ 'asi', @@ -564,7 +566,7 @@ class eligibilite_caah(Variable): set_input = set_input_dispatch_by_period def formula_2015_07_01(individu, period, parameters): - annee_precedente = period.start.period('year').offset(-1) + annee_precedente = Period(('year', period.start, 1)).offset(-1) prestations = parameters(period).prestations_sociales taux_incapacite_min = prestations.prestations_etat_de_sante.invalidite.aah.taux_capacite.taux_incapacite aah = individu('aah', period) @@ -606,7 +608,7 @@ def formula_2015_07_01(individu, period, parameters): def formula_2005_07_01(individu, period, parameters): invalidite = parameters(period).prestations_sociales.prestations_etat_de_sante.invalidite - annee_precedente = period.start.period('year').offset(-1) + annee_precedente = Period(('year', period.start, 1)).offset(-1) activite_12_mois = individu('salaire_imposable', annee_precedente, options = [ADD]) + individu('rpns_imposables', annee_precedente) garantie_ressources = invalidite.caah.garantie_ressources diff --git a/openfisca_france/model/prestations/minima_sociaux/asi_aspa.py b/openfisca_france/model/prestations/minima_sociaux/asi_aspa.py index 5a691c3ca5..44f675b56e 100644 --- a/openfisca_france/model/prestations/minima_sociaux/asi_aspa.py +++ b/openfisca_france/model/prestations/minima_sociaux/asi_aspa.py @@ -1,5 +1,7 @@ from numpy import abs as abs_, logical_or as or_ +from openfisca_core.periods import Period + from openfisca_france.model.base import * @@ -147,7 +149,7 @@ class asi_eligibilite(Variable): set_input = set_input_dispatch_by_period def formula(individu, period): - last_month = period.start.period('month').offset(-1) + last_month = Period(('month', period.start, 1)).offset(-1) non_eligible_aspa = not_(individu('aspa_eligibilite', period)) touche_pension_invalidite = individu('pensions_invalidite', period) > 0 diff --git a/openfisca_france/model/prestations/minima_sociaux/ass.py b/openfisca_france/model/prestations/minima_sociaux/ass.py index 78201cc4b5..faa8b74ae1 100644 --- a/openfisca_france/model/prestations/minima_sociaux/ass.py +++ b/openfisca_france/model/prestations/minima_sociaux/ass.py @@ -1,5 +1,7 @@ from numpy import absolute as abs_, logical_and as and_ +from openfisca_core.periods import Period + from openfisca_france.model.base import * @@ -79,7 +81,7 @@ class ass_base_ressources_individu(Variable): def formula(individu, period, parameters): # Rolling year - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) # N-1 last_year = period.last_year @@ -130,9 +132,9 @@ class ass_base_ressources_conjoint(Variable): def formula(individu, period, parameters): # Rolling year - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) - last_month = period.start.period('month').offset(-1) + last_month = Period(('month', period.start, 1)).offset(-1) ass_base_ressources_individu = individu('ass_base_ressources_individu', period) chomage_net_interrompue = individu('chomage_net', last_month) == 0 @@ -147,14 +149,14 @@ def formula(individu, period, parameters): def calculateWithAbatement(individu, parameters, period, ressourceName): - last_month = period.start.period('month').offset(-1) + last_month = Period(('month', period.start, 1)).offset(-1) has_ressources_substitution = ( individu('chomage_net', last_month) + individu('indemnites_journalieres', last_month) + individu('retraite_nette', last_month) ) > 0 # Rolling year - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) ressource_year = individu(ressourceName, previous_year, options=[ADD]) ressource_last_month = individu(ressourceName, last_month) diff --git a/openfisca_france/model/prestations/minima_sociaux/cs/eligibilite.py b/openfisca_france/model/prestations/minima_sociaux/cs/eligibilite.py index 4875139548..6903afb120 100644 --- a/openfisca_france/model/prestations/minima_sociaux/cs/eligibilite.py +++ b/openfisca_france/model/prestations/minima_sociaux/cs/eligibilite.py @@ -1,4 +1,7 @@ from numpy import logical_not as not_ + +from openfisca_core.periods import Period + from openfisca_france.model.base import Variable, Famille, MONTH, ADD, set_input_dispatch_by_period @@ -10,7 +13,7 @@ class css_cmu_acs_eligibilite(Variable): set_input = set_input_dispatch_by_period def formula(famille, period, parameters): - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) this_year = period.this_year age_min = parameters(period).prestations_sociales.solidarite_insertion.minima_sociaux.cs.cmu.age_limite_pac nb_enfants = famille('cmu_nb_pac', period) diff --git a/openfisca_france/model/prestations/minima_sociaux/cs/ressources.py b/openfisca_france/model/prestations/minima_sociaux/cs/ressources.py index cb50472c65..6699e6ead0 100644 --- a/openfisca_france/model/prestations/minima_sociaux/cs/ressources.py +++ b/openfisca_france/model/prestations/minima_sociaux/cs/ressources.py @@ -1,5 +1,7 @@ from numpy import absolute as abs_, logical_or as or_, logical_not as not_ +from openfisca_core.periods import Period + from openfisca_france.model.base import ( Variable, Individu, @@ -29,7 +31,7 @@ class css_cmu_base_ressources_individu(Variable): def formula(individu, period, parameters): # Rolling year - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) # N-1 last_year = period.last_year last_month = period.last_month @@ -93,7 +95,7 @@ class css_cmu_base_ressources(Variable): set_input = set_input_divide_by_period def formula(famille, period, parameters): - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) ressources_famille_a_inclure = [ 'af', diff --git a/openfisca_france/model/prestations/minima_sociaux/rsa.py b/openfisca_france/model/prestations/minima_sociaux/rsa.py index b7d6dce308..ca961476db 100644 --- a/openfisca_france/model/prestations/minima_sociaux/rsa.py +++ b/openfisca_france/model/prestations/minima_sociaux/rsa.py @@ -1,6 +1,8 @@ from numpy import datetime64, logical_and as and_, logical_or as or_ from openfisca_core import periods +from openfisca_core.periods import Period + from openfisca_france.model.base import * from openfisca_france.model.prestations.prestations_familiales.base_ressource import nb_enf @@ -939,7 +941,7 @@ class rsa_non_calculable_tns_individu(Variable): # En fait l'évaluation par le PCD est plutôt l'exception que la règle. En général on retient plutôt le bénéfice déclaré au FISC (après abattement forfaitaire ou réel). def formula(individu, period): - this_year_and_last_year = period.start.offset('first-of', 'year').period('year', 2).offset(-1) + this_year_and_last_year = Period(('year', period.start.offset('first-of', 'year'), 2)).offset(-1) rpns_benefice_exploitant_agricole = individu('rpns_benefice_exploitant_agricole', this_year_and_last_year, options = [ADD]) rpns_micro_entreprise_chiffre_affaires = individu('rpns_micro_entreprise_chiffre_affaires', this_year_and_last_year, options = [ADD]) rpns_autres_revenus = individu('rpns_autres_revenus', this_year_and_last_year, options = [ADD]) diff --git a/openfisca_france/model/prestations/prestations_familiales/af.py b/openfisca_france/model/prestations/prestations_familiales/af.py index b469c9ae95..9f969c2e76 100644 --- a/openfisca_france/model/prestations/prestations_familiales/af.py +++ b/openfisca_france/model/prestations/prestations_familiales/af.py @@ -152,7 +152,7 @@ def formula_2015_07_01(famille, period, parameters): class af_age_aine(Variable): value_type = int - default_value = -9999 + default_value = AGE_INT_MINIMUM entity = Famille label = "Allocations familiales - Âge de l'aîné des enfants éligibles" definition_period = MONTH @@ -161,14 +161,11 @@ class af_age_aine(Variable): def formula(famille, period, parameters): af = parameters(period).prestations_sociales.prestations_familiales.prestations_generales.af - age = famille.members('age', period) pfam_enfant_a_charge = famille.members('prestations_familiales_enfant_a_charge', period) - condition_eligibilite = pfam_enfant_a_charge * (age <= af.af_cm.age2) age_enfants_eligiles = age * condition_eligibilite - - return famille.max(age_enfants_eligiles, role = Famille.ENFANT) + return max_(famille.max(age_enfants_eligiles, role = Famille.ENFANT), AGE_INT_MINIMUM) # max_ may return -inf, so negative caping by AGE_INT_MINIMUM is needed class af_majoration_enfant(Variable): diff --git a/openfisca_france/model/prestations/prestations_familiales/ars.py b/openfisca_france/model/prestations/prestations_familiales/ars.py index 27552b7a6a..4cd2943b70 100644 --- a/openfisca_france/model/prestations/prestations_familiales/ars.py +++ b/openfisca_france/model/prestations/prestations_familiales/ars.py @@ -1,4 +1,7 @@ from numpy import logical_not as not_ + +from openfisca_core.periods import Period + from openfisca_france.model.base import * from openfisca_france.model.prestations.prestations_familiales.base_ressource import nb_enf @@ -15,8 +18,8 @@ def formula(famille, period, parameters): Allocation de rentrée scolaire brute de CRDS ''' janvier = period.first_month - octobre = period.start.offset('first-of', 'year').offset(9, 'month').period('month') - decembre = period.start.offset('first-of', 'year').offset(11, 'month').period('month') + octobre = Period(('month', period.start.offset('first-of', 'year').offset(9, 'month'), 1)) + decembre = Period(('month', period.start.offset('first-of', 'year').offset(11, 'month'), 1)) af_nbenf = famille('af_nbenf', octobre) base_ressources = famille('prestations_familiales_base_ressources', janvier) ars = parameters(octobre).prestations_sociales.prestations_familiales.education_presence_parentale.ars diff --git a/openfisca_france/model/prestations/prestations_familiales/base_ressource.py b/openfisca_france/model/prestations/prestations_familiales/base_ressource.py index 63527b5871..3722dcea4b 100644 --- a/openfisca_france/model/prestations/prestations_familiales/base_ressource.py +++ b/openfisca_france/model/prestations/prestations_familiales/base_ressource.py @@ -1,8 +1,8 @@ -from numpy import logical_or as or_ +from numpy import datetime64, logical_or as or_ -from openfisca_france.model.base import * +from openfisca_core.periods import Period -from numpy import datetime64 +from openfisca_france.model.base import * class autonomie_financiere(Variable): @@ -18,7 +18,7 @@ class autonomie_financiere(Variable): def formula(individu, period, parameters): # D'après service-public.fr, la condition de dépassement du salaire plafonds n'est pas évalué de la même manière suivant si l'enfant est étudiant ou salarié/apprenti/stagiaire. - salaire_net_mensualise = individu('salaire_net', period.start.period('month', 6).offset(-6), options = [ADD]) / 6 + salaire_net_mensualise = individu('salaire_net', Period(('month', period.start, 6)).offset(-6), options = [ADD]) / 6 _P = parameters(period) diff --git a/openfisca_france/model/revenus/activite/non_salarie.py b/openfisca_france/model/revenus/activite/non_salarie.py index 9814f81123..f1d6696863 100644 --- a/openfisca_france/model/revenus/activite/non_salarie.py +++ b/openfisca_france/model/revenus/activite/non_salarie.py @@ -1,3 +1,5 @@ +from openfisca_core.periods import Period + from openfisca_france.model.base import * @@ -2085,7 +2087,7 @@ class travailleur_non_salarie(Variable): set_input = set_input_dispatch_by_period def formula(individu, period, parameters): - this_year_and_last_year = period.start.offset('first-of', 'year').period('year', 2).offset(-1) + this_year_and_last_year = Period(('year', period.start.offset('first-of', 'year'), 2)).offset(-1) rpns_auto_entrepreneur_chiffre_affaires = individu('rpns_auto_entrepreneur_chiffre_affaires', period) != 0 rpns_micro_entreprise_chiffre_affaires = individu('rpns_micro_entreprise_chiffre_affaires', this_year_and_last_year, options = [ADD]) != 0 rpns_autres_revenus = individu('rpns_autres_revenus', this_year_and_last_year, options = [ADD]) != 0 diff --git a/openfisca_france/model/revenus/activite/salarie.py b/openfisca_france/model/revenus/activite/salarie.py index f7ad8ea6d7..3a7d5f8cf0 100644 --- a/openfisca_france/model/revenus/activite/salarie.py +++ b/openfisca_france/model/revenus/activite/salarie.py @@ -1,5 +1,8 @@ from functools import partial from numpy import busday_count as original_busday_count, datetime64, timedelta64, where + +from openfisca_core.periods import Period + from openfisca_france.model.base import * @@ -717,7 +720,7 @@ class ppv_eligibilite_exceptionnelle(Variable): ''' def formula_2022_07_01(individu, period, parameters): - annee_glissante = period.start.period('year').offset(-1) + annee_glissante = Period(('year', period.start, 1)).offset(-1) salaire_de_base_annuel = individu('salaire_de_base', annee_glissante, options=[ADD]) smic_b_annuel = parameters(period).marche_travail.salaire_minimum.smic.smic_b_mensuel * 12 quotite_de_travail = individu('quotite_de_travail', period, options=[ADD]) / 12 @@ -814,7 +817,7 @@ def formula_2019_01_01(individu, period, parameters): sinon Pas d'exonération ''' - annee_glissante = period.start.period('year').offset(-1) + annee_glissante = Period(('year', period.start, 1)).offset(-1) salaire_de_base_annuel = individu('salaire_de_base', annee_glissante, options=[ADD]) smic_b_annuel = parameters(period).marche_travail.salaire_minimum.smic.smic_b_mensuel * 12 quotite_de_travail = individu('quotite_de_travail', period, options=[ADD]) / 12 @@ -1246,7 +1249,7 @@ class indice_majore(Variable): set_input = set_input_dispatch_by_period def formula(individu, period, parameters): - period = period.start.period('month').offset('first-of') + period = Period(('month', period.start, 1)).offset('first-of') categorie_salarie = individu('categorie_salarie', period) traitement_indiciaire_brut = individu('traitement_indiciaire_brut', period) traitement_annuel_brut = parameters(period).prestations_sociales.fonc.IM_100 @@ -1297,7 +1300,7 @@ def formula(famille, period, parameters): D'où l'introduction de cette variable alternative. ''' - salaire_de_base_mensualise = famille.members('salaire_de_base', period.start.period('month', 6).offset(-6), options = [ADD]) + salaire_de_base_mensualise = famille.members('salaire_de_base', Period(('month', period.start, 6)).offset(-6), options = [ADD]) law = parameters(period) nbh_travaillees = 169 smic_mensuel_brut = law.marche_travail.salaire_minimum.smic.smic_b_horaire * nbh_travaillees diff --git a/openfisca_france/model/revenus/remplacement/rente_accident_travail.py b/openfisca_france/model/revenus/remplacement/rente_accident_travail.py index 580d9163d3..8768295662 100644 --- a/openfisca_france/model/revenus/remplacement/rente_accident_travail.py +++ b/openfisca_france/model/revenus/remplacement/rente_accident_travail.py @@ -1,3 +1,5 @@ +from openfisca_core.periods import Period + from openfisca_france.model.base import * @@ -10,7 +12,7 @@ class rente_accident_travail(Variable): set_input = set_input_divide_by_period def formula(individu, period): - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) non_salarie_agricole = individu('rpns_benefice_exploitant_agricole', previous_year, options=[ADD]) != 0 rente_accident_travail_salarie = individu('rente_accident_travail_salarie', period) rente_accident_travail_exploitant_agricole = individu('rente_accident_travail_exploitant_agricole', period) @@ -27,7 +29,7 @@ class rente_accident_travail_salarie(Variable): set_input = set_input_divide_by_period def formula(individu, period): - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) salarie = individu('salaire_net', previous_year, options=[ADD]) != 0 rente_accident_travail_rachat = individu('rente_accident_travail_rachat', period) taux_incapacite = individu('taux_accident_travail', period) @@ -52,7 +54,7 @@ class rente_accident_travail_exploitant_agricole(Variable): set_input = set_input_divide_by_period def formula(individu, period): - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) non_salarie_agricole = individu('rpns_benefice_exploitant_agricole', previous_year, options=[ADD]) != 0 rente_accident_travail_rachat = individu('rente_accident_travail_rachat', period) taux_incapacite = individu('taux_accident_travail', period) @@ -180,7 +182,7 @@ class rente_accident_travail_salaire_utile(Variable): set_input = set_input_divide_by_period def formula(individu, period, parameters): - previous_year = period.start.period('year').offset(-1) + previous_year = Period(('year', period.start, 1)).offset(-1) rente_at = parameters(period).prestations_sociales.solidarite_insertion.minima_sociaux.accident_travail.rente salaire_net = individu('salaire_net', previous_year, options=[ADD]) diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/index.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/index.yaml index 777365ba1c..aa63268544 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/index.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/index.yaml @@ -1,4 +1,4 @@ -description: Prélèvement forfaitaire sur les revenus du capital +description: Prélèvement forfaitaire libératoire sur les revenus du capital metadata: order: - liberatoire_taux_fixe diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_4_a_8_ans.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_4_a_8_ans.yaml index c7eb0be133..f55d270def 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_4_a_8_ans.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_4_a_8_ans.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), Souscrits après le 01/01/90, Durée de 4 à 8 ans, lors du dénouement du contrat (1983-2017) +description: Prélèvement libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie) souscrits après le 01/01/90 et avant le 29/07/2017 pour une durée de 4 à 8 ans (1983-2017) values: 1990-01-01: value: 0.15 diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_8_ans_et_primes_avant_1998.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_8_ans_et_primes_avant_1998.yaml index 31cab510ef..86d3ec62a4 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_8_ans_et_primes_avant_1998.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_8_ans_et_primes_avant_1998.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), Souscrits après le 01/01/90, Durée de 8 ans et plus, primes versées avant 01/01/1998, produits afférents acquis après cette date, lors du dénouement du contrat (1983-2017) +description: Prélèvement libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie) souscrits après le 01/01/90 et avant le 29/07/2017 d'une durée de 8 ans et plus, primes versées avant 01/01/1998, produits afférents acquis après cette date, lors du dénouement du contrat (1983-2017) values: 1990-01-01: value: 0 diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_8_ans_et_produits_apres_1998.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_8_ans_et_produits_apres_1998.yaml index 428b1ba954..af83bf8fd1 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_8_ans_et_produits_apres_1998.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_8_ans_et_produits_apres_1998.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), Souscrits après le 01/01/90, Durée de 8 ans et plus, produits acquis après le 01/01/1998 avec abattement IR, lors du dénouement du contrat (1983-2017) +description: Prélèvement libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits après le 01/01/90 et avant le 29/07/2017 pour une durée de 8 ans et plus, produits acquis après le 01/01/1998 avec abattement IR, lors du dénouement du contrat (1983-2017) values: 1998-01-01: value: 0.075 diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_moins_de_4_ans.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_moins_de_4_ans.yaml index 3b7158d875..b3c2d309d9 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_moins_de_4_ans.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/duree_moins_de_4_ans.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), Souscrits après le 01/01/90, Durée de moins de 4 ans, lors du dénouement du contrat (1983-2017) +description: Prélèvement libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits après le 01/01/90 et avant le 29/07/2017 pour une durée de moins de 4 ans, lors du dénouement du contrat (1983-2017) values: 1990-01-01: value: 0.35 diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/index.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/index.yaml index 77345b8437..c1387b9868 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/index.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/apres_le_1_1_90/index.yaml @@ -1,6 +1,6 @@ description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), Souscrits après le 01/01/90, lors du dénouement du contrat (1983-2017) metadata: - short_label: Souscrits après le 01/01/90 + short_label: Souscrits après le 01/01/90 et avant le 27/29/2017 label_en: Levy in discharge on life insurance (1983 - 2017) order: - duree_moins_de_4_ans diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/avec_anonymat.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/avec_anonymat.yaml index 6652a368c1..e41ad78197 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/avec_anonymat.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/avec_anonymat.yaml @@ -1,11 +1,14 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements avec anonymat (type assurance-vie) lors du dénouement du contrat (1983 - 2017) +description: Taux de prélèvement libératoire sur les bons ou contrats de capitalisation et placements avec anonymat (type assurance-vie) lors du dénouement du contrat (1983 - 2017) values: 1983-01-01: value: 0.5 1999-04-01: value: 0.6 + 2018-01-12: + value: null metadata: - short_label: Avec anonymat + last_value_still_valid_on: "2023-04-13" + short_label: Taux pour les contrats et placements sous anonymat label_en: Levy in discharge on life insurance (1983 - 2017) ipp_csv_id: tx_pl_av_anonym unit: /1 @@ -17,15 +20,20 @@ metadata: title: Loi 98-1266 du 30/12/1998, art. 6 (LF pour 1999) href: https://www.legifrance.gouv.fr/affichTexteArticle.do?idArticle=LEGIARTI000006320267&cidTexte=JORFTEXT000000209044 2010-03-01: - title: Loi 2009-1674 du 30/12/2009, art. 22 + - title: Loi 2009-1674 du 30/12/2009, art. 22 href: https://www.legifrance.gouv.fr/eli/loi/2009/12/30/2009-1674/jo/article_22 + 2018-01-01: + - title: Loi 2017-1837 du 30/12/2017, art. 28, 9°a) (LF pour 2018) + href: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000036339197 official_journal_date: 1983-01-01: "1997-12-30" 1999-04-01: "1998-12-31" 2010-03-01: "2009-12-31" + 2018-01-01: "2017-12-21" notes: 1983-01-01: - title: Création de l'art. 125-0 A du CGI documentation: |- Référence : Article 125-0 A du CGI régit le prélèvement sur les produits des bons ou contrats de capitalisation. + A partir de la loi de finances pour 2018, diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_2_a_4_ans.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_2_a_4_ans.yaml index 258aeb86e9..acf4c38432 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_2_a_4_ans.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_2_a_4_ans.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de 2 à 4 ans, lors du dénouement du contrat (1983-2017) +description: Prélèvement libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de 2 à 4 ans, lors du dénouement du contrat (1983-2017) values: 1983-01-01: value: 0.25 diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_4_a_6_ans.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_4_a_6_ans.yaml index 539847c0cd..df0b2d181d 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_4_a_6_ans.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_4_a_6_ans.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de 4 à 6 ans, lors du dénouement du contrat (1983-2017) +description: Prélèvement libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de 4 à 6 ans, lors du dénouement du contrat (1983-2017) values: 1983-01-01: value: 0.15 diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_moins_de_2_ans.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_moins_de_2_ans.yaml index b9369ce339..fd779b0736 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_moins_de_2_ans.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/duree_moins_de_2_ans.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de moins de 2 ans, lors du dénouement du contrat (1983-2017) +description: Prélèvement libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de moins de 2 ans, lors du dénouement du contrat (1983-2017) values: 1983-01-01: value: 0.45 diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/six_ans_primes_avant_98.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/six_ans_primes_avant_98.yaml index a8cb3ba538..911142a73d 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/six_ans_primes_avant_98.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/six_ans_primes_avant_98.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de 6 ans et plus, primes versées avant le 01/01/1998 et produits afférents acquis après cette date, lors du dénouement du contrat (1983-2017) +description: Prélèvement libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de 6 ans et plus, primes versées avant le 01/01/1998 et produits afférents acquis après cette date, lors du dénouement du contrat (1983-2017) values: 1983-01-01: value: 0 diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/six_ans_produits_apres_98.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/six_ans_produits_apres_98.yaml index 80791b979e..e09e21fb5d 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/six_ans_produits_apres_98.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/entre_1_1_83_et_31_12_89/six_ans_produits_apres_98.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de 6 ans et plus, produits acquis après le 01/01/1998 avec abattement IR, lors du dénouement du contrat (1983-2017) +description: Prélèvement libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie), souscrits entre le 1/1/83 et le 31/12/89, durée de 6 ans et plus, produits acquis après le 01/01/1998 avec abattement IR, lors du dénouement du contrat (1983-2017) values: 1998-01-01: value: 0.075 diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/index.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/index.yaml index e9df7345d2..b9d58f7eba 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/index.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/index.yaml @@ -1,4 +1,4 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie) lors du dénouement du contrat (1983 - 2017) +description: Prélèvement forfaitaire libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie) lors du dénouement du contrat (1983 - 2017) metadata: short_label: Bons ou contrats de capitalisation et placements label_en: Levy in discharge on life insurance (1983 - 2017) diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/produits_vers_etats_non_cooperatifs.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/produits_vers_etats_non_cooperatifs.yaml index 57ee6b1328..cf8f42de0c 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/produits_vers_etats_non_cooperatifs.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/bons_contrats_placements/produits_vers_etats_non_cooperatifs.yaml @@ -1,11 +1,11 @@ -description: Prélèvement libératoire sur les Bons ou contrats de capitalisation et placements de même nature (assurance-vie), Produits bénéficiant des personnes établies dans des Etats "non-coopératifs", lors du dénouement du contrat (1983 - 2017) +description: Taux de prélèvement forfaitaire libératoire sur les bons ou contrats de capitalisation et placements de même nature (assurance-vie), Produits bénéficiant des personnes établies dans des Etats "non-coopératifs", lors du dénouement du contrat (1983 - 2017) values: 2010-01-01: value: 0.5 2013-01-01: value: 0.75 metadata: - short_label: Produits bénéficiant des personnes établies dans des Etats "non-coopératifs" + short_label: Taux pour les produits bénéficiant à des personnes établies dans des États "non-coopératifs" label_en: Levy in discharge on life insurance (1983 - 2017) unit: /1 reference: @@ -13,11 +13,16 @@ metadata: title: Loi 2009-1674 du 30/12/2009, art. 22 href: https://www.legifrance.gouv.fr/eli/loi/2009/12/30/2009-1674/jo/article_22 2013-01-01: - title: Loi 2012-1509 du 29/12/2012, art. 9 + - title: Article 125-0 A, II bis. du Code général des impôts + href: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000044989424 + - title: "Définition d'un État « non-coopératif » : Article 238-0 A du Code général des impôts" + href: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000037526841 + - title: Loi 2012-1509 du 29/12/2012, art. 9 href: https://www.legifrance.gouv.fr/eli/loi/2012/12/29/2012-1509/jo/article_9 official_journal_date: 2010-03-01: "2009-12-31" 2013-01-01: "2012-12-30" + last_value_still_valid_on: "2023-04-12" documentation: |- Notes : Etats "non-coopératifs" définis à l'article 238-0 A du CGI. diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/index.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/index.yaml index 75f080f3d3..82176bfc33 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/index.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_assurance_vie/index.yaml @@ -1,6 +1,6 @@ -description: Prélèvement libératoire sur les revenus d'assurance vie (1983 - 2017) +description: Prélèvement forfaitaire libératoire sur les revenus d'assurance vie (1983 - 2017) metadata: - short_label: Prélèvement libératoire sur les revenus d'assurance vie + short_label: Prélèvements sur les revenus d'assurance vie label_en: Levy in discharge on life insurance (1983 - 2017) order: - bons_contrats_placements diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_taux_fixe/index.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_taux_fixe/index.yaml index ed48ea1c7b..8781e8e0e0 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_taux_fixe/index.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_taux_fixe/index.yaml @@ -1,6 +1,6 @@ -description: Prélèvements libératoires sur les revenus des valeurs mobilières (1965-2017) +description: Prélèvements forfaitaires libératoires sur les revenus des valeurs mobilières (1965-2017) metadata: - short_label: Prélèvements libératoires taux fixe + short_label: Prélèvements sur les revenus des valeurs mobilières label_en: Levy in discharge on capital income (1965 - 2012) order: - obligations_titres_participatifs_fonds_salariaux diff --git a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_taux_fixe/produits_epargne_solidaire_partage.yaml b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_taux_fixe/produits_epargne_solidaire_partage.yaml index 8d6f395194..905dc72308 100644 --- a/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_taux_fixe/produits_epargne_solidaire_partage.yaml +++ b/openfisca_france/parameters/taxation_capital/prelevement_forfaitaire/liberatoire_taux_fixe/produits_epargne_solidaire_partage.yaml @@ -1,16 +1,19 @@ -description: Prélèvements libératoires sur les revenus des valeurs mobilières, Produits d'épargne solidaire de partage (1965-2017) +description: Taux de prélèvement forfaitaire libératoire sur les produits d'épargne solidaire de partage values: 2008-01-01: value: 0.05 metadata: - short_label: Produits d'épargne solidaire de partage + short_label: Taux fixe de prélèvement pour les produits d'épargne solidaire de partage label_en: Levy in discharge on capital income (1965 - 2012) unit: /1 reference: 2008-01-01: - title: Loi 2007-1822 du 24/12/2007, art. 10 et 12 (LF pour 2008) + - title: Article 125 A, III bis.1° du Code général des impôts + href: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000037526745 + - title: Loi 2007-1822 du 24/12/2007, art. 10 et 12 (LF pour 2008) + href: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000017853368 2010-03-01: - title: Loi 2009-1674 du 30/12/2009, art. 22 + - title: Loi 2009-1674 du 30/12/2009, art. 22 href: https://www.legifrance.gouv.fr/eli/loi/2009/12/30/2009-1674/jo/article_22 official_journal_date: 2008-01-01: "2007-12-27" @@ -18,6 +21,7 @@ metadata: notes: 2008-01-01: - title: Création du prélèvement libératoire sur les placements à revenus variables, notamment sur les dividendes (crée art. 117 quater du CGI) + last_value_still_valid_on: "2023-04-12" documentation: |- Notes : Références du Code général des impôts : l'article 125 A du CGI régit le prélèvement sur les produits de placements à revenu fixe tandis que l'article 117 quater régit le prélèvement sur les dividendes. diff --git a/setup.py b/setup.py index f2cf076510..a2f0fe249f 100644 --- a/setup.py +++ b/setup.py @@ -17,10 +17,9 @@ 'License :: OSI Approved :: GNU Affero General Public License v3', 'Operating System :: POSIX', 'Programming Language :: Python', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', 'Topic :: Scientific/Engineering :: Information Analysis', ], description = 'French tax and benefit system for OpenFisca', @@ -39,35 +38,36 @@ ], extras_require = { 'inversion_revenus': [ - 'scipy >= 0.17', + 'scipy >= 1.10.1, < 2.0', ], 'de_net_a_brut': [ - 'scipy >= 0.17', + 'scipy >= 1.10.1, < 2.0', ], 'taxipp': [ - 'pandas >= 0.13', + 'pandas >= 1.5.3, < 2.0', ], 'dev': [ - 'autopep8 ==1.5.7', - 'flake8 >= 4.0.0, < 5.0.0', + 'autopep8 >= 2.0.2, < 3.0', + 'flake8 >= 6.0.0, < 7.0.0', 'flake8-print >= 5.0.0, < 6.0.0', - 'flake8-quotes >= 3.3.1, < 6.0.0', - 'pytest >= 5.0.0, < 7.0.0', - 'scipy >= 0.17', # Only used to test de_net_a_brut reform - 'requests >= 2.8', - 'yamllint >=1.11.1,<1.27' + 'flake8-quotes >= 3.3.2', + 'pytest >= 7.2.2, < 8.0', + 'scipy >= 1.10.1, < 2.0', # Only used to test de_net_a_brut reform + 'requests >= 2.28.2, < 3.0', + 'yamllint >= 1.30.0, < 2.0' ], 'casd-dev': [ # Same as dev with packages not available at CASD removed - 'autopep8 >=1.3.2', - 'pytest >= 5.0.0, < 7.0.0', - 'requests >= 2.8', - 'scipy >= 0.17', # Only used to test de_net_a_brut reform + 'autopep8 >= 2.0.2, < 3.0', + 'pytest >= 7.2.2, < 8.0', + 'requests >= 2.28.2, < 3.0', + 'scipy >= 1.10.1, < 2.0', # Only used to test de_net_a_brut reform ] }, include_package_data = True, # Will read MANIFEST.in install_requires = [ - 'OpenFisca-Core >=35.8.0,<36.0', + # 'OpenFisca-Core >=35.8.0,<36.0', + 'OpenFisca-Core @ git+https://github.com/openfisca/openfisca-core.git@version_leap', ], packages = find_packages(exclude = [ 'openfisca_france.tests*', diff --git a/tests/formulas/age.yaml b/tests/formulas/age.yaml index 2afb21337f..336934d64d 100644 --- a/tests/formulas/age.yaml +++ b/tests/formulas/age.yaml @@ -116,3 +116,24 @@ - 40 - 9 - 9 +- name: Age des enfants dans les familles sans enfants (pour éviter les -inf) + period: 2015-01 + absolute_error_margin: 0.005 + input: + famille: + parents: [parent1, parent2] + foyer_fiscal: + declarants: [parent1, parent2] + menage: + personne_de_reference: parent1 + conjoint: parent2 + individus: + parent1: + age_en_mois: + 2015-01: 40 * 12 + parent2: + age_en_mois: + 2015-01: 40 * 12 + output: + af_age_aine: + 2015-01: -9999 diff --git a/tests/test_entities.py b/tests/test_entities.py index 8cedba7b84..adb6e6a0db 100644 --- a/tests/test_entities.py +++ b/tests/test_entities.py @@ -112,7 +112,7 @@ def test_transpose_string(): depcom_famille = famille.first_person.menage('depcom', period = reference_period) - assert((depcom_famille == [b'93400', b'89300']).all()) + assert (depcom_famille == [b'93400', b'89300']).all() def test_value_from_person():