Skip to content

Commit

Permalink
Merge branch 'baremisation_csg_crds' into wip-leximpact
Browse files Browse the repository at this point in the history
  • Loading branch information
b-michaud committed Nov 25, 2024
2 parents 394564d + 08d47dc commit de19fb1
Show file tree
Hide file tree
Showing 34 changed files with 382 additions and 220 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging

from openfisca_france.model.base import *
from openfisca_france.model.prelevements_obligatoires.prelevements_sociaux.contributions_sociales.base import montant_csg_crds
from openfisca_france.model.prelevements_obligatoires.prelevements_sociaux.contributions_sociales.base import montant_csg_crds_bareme


log = logging.getLogger(__name__)
Expand Down Expand Up @@ -111,7 +111,7 @@ def formula(individu, period, parameters):
plafond_securite_sociale = individu('plafond_securite_sociale', period)

csg = parameters(period).prelevements_sociaux.contributions_sociales.csg
montant_csg = montant_csg_crds(
montant_csg = montant_csg_crds_bareme(
base_avec_abattement = assiette_csg_abattue,
base_sans_abattement = assiette_csg_non_abattue,
abattement_parameter = csg.activite.abattement,
Expand All @@ -135,7 +135,7 @@ def formula(individu, period, parameters):
plafond_securite_sociale = individu('plafond_securite_sociale', period)
csg_parameters = parameters(period).prelevements_sociaux.contributions_sociales.csg

montant_csg = montant_csg_crds(
montant_csg = montant_csg_crds_bareme(
base_avec_abattement = assiette_csg_abattue,
base_sans_abattement = assiette_csg_non_abattue,
abattement_parameter = csg_parameters.activite.abattement,
Expand All @@ -161,7 +161,7 @@ def formula(individu, period, parameters):

parameters = parameters(period).prelevements_sociaux.contributions_sociales

montant_crds = montant_csg_crds(
montant_crds = montant_csg_crds_bareme(
law_node = parameters.crds,
base_avec_abattement = assiette_csg_abattue,
base_sans_abattement = assiette_csg_non_abattue,
Expand Down Expand Up @@ -418,39 +418,56 @@ def formula(individu, period):
class csg_imposable_non_salarie(Variable):
value_type = float
entity = Individu
label = 'Assiette CSG des personnes non salariées'
label = 'CSG des personnes non salariées'
definition_period = YEAR

def formula(individu, period, parameters):
assiette_csg_crds_non_salarie = individu('assiette_csg_crds_non_salarie', period)
csg = parameters(period).prelevements_sociaux.contributions_sociales.csg.activite
taux = csg.imposable.taux
return - taux * assiette_csg_crds_non_salarie

montant_csg = montant_csg_crds_bareme(
base_sans_abattement = assiette_csg_crds_non_salarie,
law_node = csg.imposable,
)

return montant_csg


class csg_deductible_non_salarie(Variable):
value_type = float
entity = Individu
label = 'Assiette CSG des personnes non salariées'
label = 'CSG des personnes non salariées'
definition_period = YEAR

def formula(individu, period, parameters):
assiette_csg_crds_non_salarie = individu('assiette_csg_crds_non_salarie', period)
csg = parameters(period).prelevements_sociaux.contributions_sociales.csg.activite
taux = csg.deductible.taux
return - taux * assiette_csg_crds_non_salarie

montant_csg = montant_csg_crds_bareme(
base_sans_abattement = assiette_csg_crds_non_salarie,
law_node = csg.deductible,
)

return montant_csg


class crds_non_salarie(Variable):
value_type = float
entity = Individu
label = 'Assiette CSG des personnes non salariées'
label = 'CRDS des personnes non salariées'
definition_period = YEAR

def formula(individu, period, parameters):
assiette_csg_crds_non_salarie = individu('assiette_csg_crds_non_salarie', period)
taux = parameters(period).prelevements_sociaux.contributions_sociales.crds.taux
return - taux * assiette_csg_crds_non_salarie

law = parameters(period)

montant_crds = montant_csg_crds_bareme(
base_sans_abattement = assiette_csg_crds_non_salarie,
law_node = law.prelevements_sociaux.contributions_sociales.crds,
)

return montant_crds


class revenus_non_salarie_nets(Variable):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,36 @@ def montant_csg_crds(base_avec_abattement = None, base_sans_abattement = None, i
+ law_node.taux_reduit * indicatrice_taux_reduit
+ law_node.taux_median * indicatrice_taux_intermediaire
) * base


def montant_csg_crds_bareme(base_avec_abattement = None, base_sans_abattement = None, indicatrice_taux_plein = None,
indicatrice_taux_intermediaire = None, indicatrice_taux_reduit = None, abattement_parameter = None, law_node = None, plafond_securite_sociale = None):
assert law_node is not None
if base_sans_abattement is None:
base_sans_abattement = 0
if base_avec_abattement is None:
base = base_sans_abattement
else:
assert plafond_securite_sociale is not None
assert abattement_parameter is not None
base = base_avec_abattement - abattement_parameter.calc(
base_avec_abattement,
factor = plafond_securite_sociale,
round_base_decimals = 2,
) + base_sans_abattement
if indicatrice_taux_plein is None and indicatrice_taux_reduit is None:
return -law_node.taux.calc(base)
elif indicatrice_taux_plein is not None and indicatrice_taux_reduit is not None and indicatrice_taux_intermediaire is None:
return -(
law_node.taux_plein.calc(base) * indicatrice_taux_plein
+ law_node.taux_reduit.calc(base) * indicatrice_taux_reduit
)
else:
assert indicatrice_taux_plein is not None
assert indicatrice_taux_reduit is not None
assert indicatrice_taux_intermediaire is not None
return -(
law_node.taux_plein.calc(base) * indicatrice_taux_plein
+ law_node.taux_reduit.calc(base) * indicatrice_taux_reduit
+ law_node.taux_median.calc(base) * indicatrice_taux_intermediaire
)
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import logging

from openfisca_france.model.base import *
from openfisca_france.model.prelevements_obligatoires.prelevements_sociaux.contributions_sociales.base import montant_csg_crds_bareme

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -318,7 +320,7 @@ class csg_glo_assimile_salaire_ir_et_ps(Variable):
def formula(individu, period, parameters):
f1tt = individu('f1tt', period)
csg_activite = parameters(period).prelevements_sociaux.contributions_sociales.csg.activite
taux = csg_activite.imposable.taux + csg_activite.deductible.taux
taux = csg_activite.imposable.taux.rates[0] + csg_activite.deductible.taux.rates[0]
return - f1tt * taux


Expand All @@ -332,10 +334,16 @@ class crds_glo_assimile_salaire_ir_et_ps(Variable):

def formula(individu, period, parameters):
f1tt = individu('f1tt', period)
return - f1tt * (
parameters(period).prelevements_sociaux.contributions_sociales.crds.taux

law = parameters(period)

montant_crds = montant_csg_crds_bareme(
base_sans_abattement = f1tt,
law_node = law.prelevements_sociaux.contributions_sociales.crds,
)

return montant_crds


class contribution_salariale_glo_assimile_salaire(Variable):
calculate_output = calculate_output_add
Expand Down Expand Up @@ -390,16 +398,18 @@ class crds_revenus_capital(Variable):

def formula(foyer_fiscal, period, parameters):
assiette_csg_revenus_capital = foyer_fiscal('assiette_csg_revenus_capital', period)
prelevements_sociaux = parameters(period).taxation_capital.prelevements_sociaux

crds_glo_assimile_salaire_ir_et_ps_i = foyer_fiscal.members('crds_glo_assimile_salaire_ir_et_ps', period)
crds_glo_assimile_salaire_ir_et_ps = foyer_fiscal.sum(crds_glo_assimile_salaire_ir_et_ps_i)

return (
- assiette_csg_revenus_capital * prelevements_sociaux.crds.produits_de_placement
+ crds_glo_assimile_salaire_ir_et_ps
law = parameters(period)

montant_crds = montant_csg_crds_bareme(
base_sans_abattement = assiette_csg_revenus_capital,
law_node = law.prelevements_sociaux.contributions_sociales.crds,
)

return (montant_crds + crds_glo_assimile_salaire_ir_et_ps)


class prelevements_sociaux_revenus_capital_hors_csg_crds(Variable):
value_type = float
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import logging

from openfisca_france.model.base import *
from openfisca_france.model.prelevements_obligatoires.prelevements_sociaux.contributions_sociales.base import (
montant_csg_crds
)
from openfisca_france.model.prelevements_obligatoires.prelevements_sociaux.contributions_sociales.base import montant_csg_crds_bareme

log = logging.getLogger(__name__)


Expand Down Expand Up @@ -74,7 +73,7 @@ def formula_2015(individu, period, parameters):
chomage_cotisation_retraite_complementaire = individu('chomage_cotisation_retraite_complementaire', period)
assiette_csg_chomage = chomage_brut - chomage_cotisation_retraite_complementaire

montant_csg = montant_csg_crds(
montant_csg = montant_csg_crds_bareme(
base_avec_abattement = assiette_csg_chomage,
indicatrice_taux_plein = (taux_csg_remplacement == TypesTauxCSGRemplacement.taux_plein),
indicatrice_taux_reduit = (taux_csg_remplacement == TypesTauxCSGRemplacement.taux_reduit),
Expand Down Expand Up @@ -140,7 +139,7 @@ def formula_2015(individu, period, parameters):
chomage_cotisation_retraite_complementaire = individu('chomage_cotisation_retraite_complementaire', period)
assiette_csg_chomage = chomage_brut - chomage_cotisation_retraite_complementaire

montant_csg = montant_csg_crds(
montant_csg = montant_csg_crds_bareme(
base_avec_abattement = assiette_csg_chomage,
indicatrice_taux_plein = (taux_csg_remplacement == TypesTauxCSGRemplacement.taux_plein),
indicatrice_taux_reduit = (taux_csg_remplacement == TypesTauxCSGRemplacement.taux_reduit),
Expand Down Expand Up @@ -209,7 +208,7 @@ def formula_2015(individu, period, parameters):
(taux_csg_remplacement == TypesTauxCSGRemplacement.taux_reduit)
+ (taux_csg_remplacement == TypesTauxCSGRemplacement.taux_plein)
)
montant_crds = montant_csg_crds(
montant_crds = montant_csg_crds_bareme(
base_avec_abattement = assiette_crds_chomage,
abattement_parameter = parameters.prelevements_sociaux.contributions_sociales.csg.activite.abattement,
law_node = parameters.prelevements_sociaux.contributions_sociales.crds,
Expand Down Expand Up @@ -297,7 +296,7 @@ def formula_2019(individu, period, parameters):
[TypesTauxCSGRetraite.exonere, TypesTauxCSGRetraite.taux_reduit, TypesTauxCSGRetraite.taux_intermediaire, TypesTauxCSGRetraite.taux_plein]
)

montant_csg = montant_csg_crds(
montant_csg = montant_csg_crds_bareme(
base_sans_abattement = retraite_brute,
indicatrice_taux_plein = (taux_csg_retraite == TypesTauxCSGRetraite.taux_plein),
indicatrice_taux_reduit = (taux_csg_retraite == TypesTauxCSGRetraite.taux_reduit),
Expand All @@ -321,7 +320,7 @@ def formula_2015(individu, period, parameters):
[TypesTauxCSGRetraite.exonere, TypesTauxCSGRetraite.taux_reduit, TypesTauxCSGRetraite.taux_plein]
)

montant_csg = montant_csg_crds(
montant_csg = montant_csg_crds_bareme(
base_sans_abattement = retraite_brute,
indicatrice_taux_plein = (taux_csg_retraite == TypesTauxCSGRetraite.taux_plein),
indicatrice_taux_reduit = (taux_csg_retraite == TypesTauxCSGRetraite.taux_reduit),
Expand All @@ -334,7 +333,7 @@ def formula(individu, period, parameters): # formula_1997_2014 à corriger (cf.
retraite_brute = individu('retraite_brute', period)
parameters = parameters(period)

montant_csg = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.pensions_retraite_invalidite.deductible.taux_plein * retraite_brute
montant_csg = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.pensions_retraite_invalidite.deductible.taux_plein.rates[0] * retraite_brute
return - montant_csg


Expand Down Expand Up @@ -363,7 +362,7 @@ def formula_2019(individu, period, parameters):
[TypesTauxCSGRetraite.exonere, TypesTauxCSGRetraite.taux_reduit, TypesTauxCSGRetraite.taux_intermediaire, TypesTauxCSGRetraite.taux_plein]
)

montant_csg = montant_csg_crds(
montant_csg = montant_csg_crds_bareme(
base_sans_abattement = retraite_brute,
indicatrice_taux_plein = (taux_csg_retraite == TypesTauxCSGRetraite.taux_plein),
indicatrice_taux_reduit = (taux_csg_retraite == TypesTauxCSGRetraite.taux_reduit),
Expand All @@ -387,7 +386,7 @@ def formula_2015(individu, period, parameters):
[TypesTauxCSGRetraite.exonere, TypesTauxCSGRetraite.taux_reduit, TypesTauxCSGRetraite.taux_plein]
)

montant_csg = montant_csg_crds(
montant_csg = montant_csg_crds_bareme(
base_sans_abattement = retraite_brute,
indicatrice_taux_plein = (taux_csg_retraite == TypesTauxCSGRetraite.taux_plein),
indicatrice_taux_reduit = (taux_csg_retraite == TypesTauxCSGRetraite.taux_reduit),
Expand All @@ -400,7 +399,7 @@ def formula(individu, period, parameters): # formula_1997_2014 à corriger (cf.
retraite_brute = individu('retraite_brute', period)
parameters = parameters(period)

montant_csg = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.pensions_retraite_invalidite.imposable.taux_plein * retraite_brute
montant_csg = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.pensions_retraite_invalidite.imposable.taux_plein.rates[0] * retraite_brute
return - montant_csg


Expand Down Expand Up @@ -429,7 +428,7 @@ def formula_2019(individu, period, parameters):
[TypesTauxCSGRetraite.exonere, TypesTauxCSGRetraite.taux_reduit, TypesTauxCSGRetraite.taux_intermediaire, TypesTauxCSGRetraite.taux_plein]
)

montant_crds = montant_csg_crds(
montant_crds = montant_csg_crds_bareme(
base_sans_abattement = retraite_brute,
law_node = parameters.prelevements_sociaux.contributions_sociales.crds,
plafond_securite_sociale = parameters.prelevements_sociaux.pss.plafond_securite_sociale_mensuel,
Expand All @@ -451,7 +450,7 @@ def formula_2015(individu, period, parameters):
[TypesTauxCSGRetraite.exonere, TypesTauxCSGRetraite.taux_reduit, TypesTauxCSGRetraite.taux_plein]
)

montant_crds = montant_csg_crds(
montant_crds = montant_csg_crds_bareme(
base_sans_abattement = retraite_brute,
law_node = parameters.prelevements_sociaux.contributions_sociales.crds,
plafond_securite_sociale = parameters.prelevements_sociaux.pss.plafond_securite_sociale_mensuel,
Expand All @@ -461,7 +460,7 @@ def formula_2015(individu, period, parameters):
def formula(individu, period, parameters): # formula_1997_2014 à corriger (cf. commentaire au niveau de la variable)
retraite_brute = individu('retraite_brute', period)
parameters = parameters(period)
taux = parameters.prelevements_sociaux.contributions_sociales.crds.taux
taux = parameters.prelevements_sociaux.contributions_sociales.crds.taux.rates[0]

return - taux * retraite_brute

Expand Down
13 changes: 10 additions & 3 deletions openfisca_france/model/prestations/aides_logement.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
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

from openfisca_france.model.prelevements_obligatoires.prelevements_sociaux.contributions_sociales.base import montant_csg_crds_bareme

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -1410,8 +1410,15 @@ class crds_logement(Variable):

def formula(famille, period, parameters):
aide_logement_montant_brut = famille('aide_logement_montant_brut_crds', period)
crds = parameters(period).prelevements_sociaux.contributions_sociales.crds.taux
return -aide_logement_montant_brut * crds

law = parameters(period)

montant_crds = montant_csg_crds_bareme(
base_sans_abattement = aide_logement_montant_brut,
law_node = law.prelevements_sociaux.contributions_sociales.crds,
)

return montant_crds


class TypesZoneApl(Enum):
Expand Down
2 changes: 1 addition & 1 deletion openfisca_france/model/prestations/complement_are.py
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ def formula(individu, period, parameters):

# taux global par défaut : au demandeur d'emploi de suivre une démarche
# pour la prise en compte du RFR (exonération potentielle de CRDS)
taux_global_crds_chomage = parametres_prelevements_sociaux.contributions_sociales.crds.taux
taux_global_crds_chomage = parametres_prelevements_sociaux.contributions_sociales.crds.taux.rates[0]
crds_theorique = assiette_journaliere_crds * taux_global_crds_chomage

# après la CSG, la CRDS ne doit pas faire baisser le montant net de l'allocation en-dessous du smic brut
Expand Down
11 changes: 9 additions & 2 deletions openfisca_france/model/prestations/minima_sociaux/anciens_ms.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from openfisca_france.model.base import *
from openfisca_france.model.prestations.prestations_familiales.base_ressource import nb_enf
from openfisca_france.model.prelevements_obligatoires.prelevements_sociaux.contributions_sociales.base import montant_csg_crds_bareme


class api(Variable):
Expand Down Expand Up @@ -183,9 +184,15 @@ class crds_rsa_activite(Variable):

def formula_2009_06_01(famille, period, parameters):
rsa_activite = famille('rsa_activite', period)
taux_crds = parameters(period).prelevements_sociaux.contributions_sociales.crds.taux

return - taux_crds * rsa_activite
law = parameters(period)

montant_crds = montant_csg_crds_bareme(
base_sans_abattement = rsa_activite,
law_node = law.prelevements_sociaux.contributions_sociales.crds,
)

return montant_crds


class rsa_activite_net_crds(Variable):
Expand Down
Loading

0 comments on commit de19fb1

Please sign in to comment.