From 0aea506f5317f79d63dc424117766ade8851ad8d Mon Sep 17 00:00:00 2001
From: clallemand <=>
Date: Mon, 27 Jan 2025 11:34:26 +0100
Subject: [PATCH] Ajout variables baremnisation

---
 .../leximpact_france/__init__.py              |  34 +-
 .../leximpact_france/baremisation_csg_crds.py | 541 +++++++++++++++++-
 2 files changed, 572 insertions(+), 3 deletions(-)

diff --git a/openfisca_france_reforms/leximpact_france/__init__.py b/openfisca_france_reforms/leximpact_france/__init__.py
index 1ecaa826..40e844cf 100644
--- a/openfisca_france_reforms/leximpact_france/__init__.py
+++ b/openfisca_france_reforms/leximpact_france/__init__.py
@@ -7,7 +7,23 @@ from openfisca_france_reforms.leximpact_france.baremisation_csg_crds import (
     crds_salaire,
     csg_imposable_non_salarie,
     csg_deductible_non_salarie,
-    crds_non_salarie
+    crds_non_salarie,
+    csg_deductible_chomage,
+    csg_imposable_chomage,
+    crds_chomage,
+    csg_deductible_retraite,
+    csg_imposable_retraite,
+    crds_retraite,
+    csg_glo_assimile_salaire_ir_et_ps,
+    crds_glo_assimile_salaire_ir_et_ps,
+    crds_revenus_capital,
+    crds_ppa,
+    crds_af,
+    crds_ars,
+    crds_asf,
+    crds_cf,
+    crds_paje,
+    crds_logement,
     )
 from openfisca_france_reforms.leximpact_france.refacto_super_brut_to_disponible import (
     autres_impositions_forfaitaires,
@@ -58,6 +74,22 @@ class LexImpactTaxBenefitSystem(Reform):
             csg_imposable_non_salarie,
             csg_deductible_non_salarie,
             crds_non_salarie,
+            csg_deductible_chomage,
+            csg_imposable_chomage,
+            crds_chomage,
+            csg_deductible_retraite,
+            csg_imposable_retraite,
+            crds_retraite,
+            csg_glo_assimile_salaire_ir_et_ps,
+            crds_glo_assimile_salaire_ir_et_ps,
+            crds_revenus_capital,
+            crds_ppa,
+            crds_af,
+            crds_ars,
+            crds_asf,
+            crds_cf,
+            crds_paje,
+            crds_logement,
             autres_impositions_forfaitaires,
             cotisations_allegement_general,
             cotisations_employeur_assurance_chomage,
diff --git a/openfisca_france_reforms/leximpact_france/baremisation_csg_crds.py b/openfisca_france_reforms/leximpact_france/baremisation_csg_crds.py
index cdb89e4d..8b9592ed 100644
--- a/openfisca_france_reforms/leximpact_france/baremisation_csg_crds.py
+++ b/openfisca_france_reforms/leximpact_france/baremisation_csg_crds.py
@@ -1,8 +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
-
+from openfisca_france.model.prelevements_obligatoires.prelevements_sociaux.contributions_sociales.remplacement import TypesTauxCSGRetraite, TypesTauxCSGRemplacement
 
 log = logging.getLogger(__name__)
 
@@ -14,6 +13,55 @@ log = logging.getLogger(__name__)
 ## csg_imposable_non_salarie
 ## csg_deductible_non_salarie
 ## crds_non_salarie
+## csg_deductible_chomage
+## csg_imposable_chomage
+## crds_chomage
+## csg_deductible_retraite
+## csg_imposable_retraite
+## crds_retraite
+## csg_glo_assimile_salaire_ir_et_ps
+## crds_glo_assimile_salaire_ir_et_ps
+## crds_revenus_capital
+## crds_ppa
+## crds_af
+## crds_ars
+## crds_asf
+## crds_cf
+## crds_paje
+## crds_logement
+
+
+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
+            )
 
 
 class csg_deductible_salaire(Variable):
@@ -145,3 +193,492 @@ class crds_non_salarie(Variable):
             )
 
         return montant_crds
+
+
+class csg_deductible_chomage(Variable):
+    calculate_output = calculate_output_add
+    value_type = float
+    entity = Individu
+    label = 'CSG déductible sur les allocations chômage'
+    reference = 'http://vosdroits.service-public.fr/particuliers/F2329.xhtml'
+    definition_period = MONTH
+    set_input = set_input_divide_by_period
+    # TODO : formule à partir de 2015 seulement. Pour les années d'avant, certaines seuils de RFR sont manquants, ainsi que des informations relatives à des exonérations passées.
+
+    def formula_2015(individu, period, parameters):
+        csg_imposable_chomage = individu('csg_imposable_chomage', period)
+        parameters = parameters(period)
+        rfr = individu.foyer_fiscal('rfr', period = period.n_2)
+        nbptr = individu.foyer_fiscal('nbptr', period = period.n_2)
+        seuils = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.seuils
+        seuil_exoneration = seuils.seuil_rfr1.seuil_rfr1 + (nbptr - 1) * 2 * seuils.seuil_rfr1.demi_part_suppl_rfr1
+        seuil_reduction = seuils.seuil_rfr2.seuil_rfr2 + (nbptr - 1) * 2 * seuils.seuil_rfr2.demi_part_suppl_rfr2
+
+        taux_csg_remplacement = where(
+            rfr <= seuil_exoneration,
+            TypesTauxCSGRemplacement.exonere,
+            where(
+                rfr <= seuil_reduction,
+                TypesTauxCSGRemplacement.taux_reduit,
+                TypesTauxCSGRemplacement.taux_plein,
+                )
+            )
+
+        chomage_brut = individu('chomage_brut', period)
+        chomage_cotisation_retraite_complementaire = individu('chomage_cotisation_retraite_complementaire', period)
+        assiette_csg_chomage = chomage_brut - chomage_cotisation_retraite_complementaire
+
+        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),
+            abattement_parameter = parameters.prelevements_sociaux.contributions_sociales.csg.activite.abattement,
+            law_node = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.allocations_chomage.deductible,
+            plafond_securite_sociale = parameters.prelevements_sociaux.pss.plafond_securite_sociale_mensuel,
+            )
+        nbh_travail = parameters.marche_travail.salaire_minimum.smic.nb_heures_travail_mensuel
+
+        cho_seuil_exo = (
+            parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.allocations_chomage.min_exo
+            * nbh_travail
+            * parameters.marche_travail.salaire_minimum.smic.smic_b_horaire
+            )
+
+        # Approximation annuelle
+        salaire_net = individu('salaire_net', period)
+        rpns_imposables = individu('rpns_imposables', period, options = [DIVIDE])
+        csg_imposable_non_salarie = individu('csg_imposable_non_salarie', period, options = [DIVIDE])
+        crds_non_salarie = individu('crds_non_salarie', period, options = [DIVIDE])
+        remuneration_activite_nette = salaire_net + rpns_imposables + csg_imposable_non_salarie + crds_non_salarie
+
+        csg_deductible_chomage = max_(
+            - montant_csg
+            - max_(
+                cho_seuil_exo - (remuneration_activite_nette + assiette_csg_chomage + csg_imposable_chomage + montant_csg), 0
+                ), 0
+            )
+
+        return - csg_deductible_chomage
+
+
+class csg_imposable_chomage(Variable):
+    calculate_output = calculate_output_add
+    value_type = float
+    entity = Individu
+    label = 'CSG imposable sur les allocations chômage'
+    reference = 'http://vosdroits.service-public.fr/particuliers/F2329.xhtml'
+    definition_period = MONTH
+    set_input = set_input_divide_by_period
+    # TODO : formule à partir de 2015 seulement. Pour les années d'avant, certaines seuils de RFR sont manquants, ainsi que des informations relatives à des exonérations passées.
+
+    def formula_2015(individu, period, parameters):
+        parameters = parameters(period)
+
+        rfr = individu.foyer_fiscal('rfr', period = period.n_2)
+        nbptr = individu.foyer_fiscal('nbptr', period = period.n_2)
+        seuils = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.seuils
+        seuil_exoneration = seuils.seuil_rfr1.seuil_rfr1 + (nbptr - 1) * 2 * seuils.seuil_rfr1.demi_part_suppl_rfr1
+        seuil_reduction = seuils.seuil_rfr2.seuil_rfr2 + (nbptr - 1) * 2 * seuils.seuil_rfr2.demi_part_suppl_rfr2
+
+        taux_csg_remplacement = where(
+            rfr <= seuil_exoneration,
+            TypesTauxCSGRemplacement.exonere,
+            where(
+                rfr <= seuil_reduction,
+                TypesTauxCSGRemplacement.taux_reduit,
+                TypesTauxCSGRemplacement.taux_plein,
+                )
+            )
+
+        chomage_brut = individu('chomage_brut', period)
+        chomage_cotisation_retraite_complementaire = individu('chomage_cotisation_retraite_complementaire', period)
+        assiette_csg_chomage = chomage_brut - chomage_cotisation_retraite_complementaire
+
+        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),
+            abattement_parameter = parameters.prelevements_sociaux.contributions_sociales.csg.activite.abattement,
+            law_node = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.allocations_chomage.imposable,
+            plafond_securite_sociale = parameters.prelevements_sociaux.pss.plafond_securite_sociale_mensuel,
+            )
+        nbh_travail = parameters.marche_travail.salaire_minimum.smic.nb_heures_travail_mensuel
+        cho_seuil_exo = (
+            parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.allocations_chomage.min_exo
+            * nbh_travail
+            * parameters.marche_travail.salaire_minimum.smic.smic_b_horaire
+            )
+
+        salaire_net = individu('salaire_net', period)
+        # Approximation annuelle
+        rpns_imposables = individu('rpns_imposables', period, options = [DIVIDE])
+        csg_imposable_non_salarie = individu('csg_imposable_non_salarie', period, options = [DIVIDE])
+        crds_non_salarie = individu('crds_non_salarie', period, options = [DIVIDE])
+        remuneration_activite_nette = salaire_net + rpns_imposables + csg_imposable_non_salarie + crds_non_salarie
+
+        csg_imposable_chomage = max_(- montant_csg - max_(cho_seuil_exo - (remuneration_activite_nette + assiette_csg_chomage + montant_csg), 0), 0)
+        return - csg_imposable_chomage
+
+
+class crds_chomage(Variable):
+    calculate_output = calculate_output_add
+    value_type = float
+    entity = Individu
+    label = 'CRDS sur les allocations chômage'
+    reference = 'http://www.insee.fr/fr/methodes/default.asp?page=definitions/contrib-remb-dette-sociale.htm'
+    definition_period = MONTH
+    set_input = set_input_divide_by_period
+    # TODO : formule à partir de 2015 seulement. Pour les années d'avant, certaines seuils de RFR sont manquants, ainsi que des informations relatives à des exonérations passées.
+
+    def formula_2015(individu, period, parameters):
+        csg_deductible_chomage = individu('csg_deductible_chomage', period)
+        csg_imposable_chomage = individu('csg_imposable_chomage', period)
+        parameters = parameters(period)
+        rfr = individu.foyer_fiscal('rfr', period = period.n_2)
+        nbptr = individu.foyer_fiscal('nbptr', period = period.n_2)
+        seuils = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.seuils
+        seuil_exoneration = seuils.seuil_rfr1.seuil_rfr1 + (nbptr - 1) * 2 * seuils.seuil_rfr1.demi_part_suppl_rfr1
+        seuil_reduction = seuils.seuil_rfr2.seuil_rfr2 + (nbptr - 1) * 2 * seuils.seuil_rfr2.demi_part_suppl_rfr2
+
+        taux_csg_remplacement = where(
+            rfr <= seuil_exoneration,
+            TypesTauxCSGRemplacement.exonere,
+            where(
+                rfr <= seuil_reduction,
+                TypesTauxCSGRemplacement.taux_reduit,
+                TypesTauxCSGRemplacement.taux_plein,
+                )
+            )
+        smic_h_b = parameters.marche_travail.salaire_minimum.smic.smic_b_horaire
+        # salaire_mensuel_reference = chomage_brut / .7
+        # heures_mensuelles = min_(salaire_mensuel_reference / smic_h_b, 35 * 52 / 12)
+        heures_mensuelles = parameters.marche_travail.salaire_minimum.smic.nb_heures_travail_mensuel
+
+        chomage_brut = individu('chomage_brut', period)
+        chomage_cotisation_retraite_complementaire = individu('chomage_cotisation_retraite_complementaire', period)
+        assiette_crds_chomage = chomage_brut - chomage_cotisation_retraite_complementaire
+
+        cho_seuil_exo = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.allocations_chomage.min_exo * heures_mensuelles * smic_h_b
+        eligible = (
+            (taux_csg_remplacement == TypesTauxCSGRemplacement.taux_reduit)
+            + (taux_csg_remplacement == TypesTauxCSGRemplacement.taux_plein)
+            )
+        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,
+            plafond_securite_sociale = parameters.prelevements_sociaux.pss.plafond_securite_sociale_mensuel,
+            ) * eligible
+
+        salaire_net = individu('salaire_net', period)
+        # Approximation annuelle
+        rpns_imposables = individu('rpns_imposables', period, options = [DIVIDE])
+        csg_imposable_non_salarie = individu('csg_imposable_non_salarie', period, options = [DIVIDE])
+        crds_non_salarie = individu('crds_non_salarie', period, options = [DIVIDE])
+        remuneration_activite_nette = salaire_net + rpns_imposables + csg_imposable_non_salarie + crds_non_salarie
+
+        crds_chomage = max_(
+            - montant_crds - max_(
+                cho_seuil_exo - (remuneration_activite_nette + assiette_crds_chomage + csg_imposable_chomage + csg_deductible_chomage + montant_crds), 0
+                ), 0
+            )
+        return - crds_chomage
+
+
+class csg_deductible_retraite(Variable):
+    calculate_output = calculate_output_add
+    value_type = float
+    entity = Individu
+    label = 'CSG déductible sur les pensions de retraite'
+    reference = 'https://www.lassuranceretraite.fr/cs/Satellite/PUBPrincipale/Retraites/Paiement-Votre-Retraite/Prelevements-Sociaux?packedargs=null'
+    definition_period = MONTH
+    set_input = set_input_divide_by_period
+    # TODO : formule à partir de 2015 seulement. Pour les années d'avant, certaines seuils de RFR sont manquants, ainsi que des informations relatives à des exonérations passées.
+
+    def formula_2019(individu, period, parameters):
+        retraite_brute = individu('retraite_brute', period)
+        rfr = individu.foyer_fiscal('rfr', period = period.n_2)
+        nbptr = individu.foyer_fiscal('nbptr', period = period.n_2)
+        parameters = parameters(period)
+        seuils = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.seuils
+        seuil_exoneration = seuils.seuil_rfr1.seuil_rfr1 + (nbptr - 1) * 2 * seuils.seuil_rfr1.demi_part_suppl_rfr1
+        seuil_reduction = seuils.seuil_rfr2.seuil_rfr2 + (nbptr - 1) * 2 * seuils.seuil_rfr2.demi_part_suppl_rfr2
+        seuil_taux_intermediaire = seuils.seuil_rfr3.seuil_rfr3 + (nbptr - 1) * 2 * seuils.seuil_rfr3.demi_part_suppl_rfr3
+
+        taux_csg_retraite = select(
+            [rfr <= seuil_exoneration, rfr <= seuil_reduction, rfr <= seuil_taux_intermediaire, rfr > seuil_taux_intermediaire],
+            [TypesTauxCSGRetraite.exonere, TypesTauxCSGRetraite.taux_reduit, TypesTauxCSGRetraite.taux_intermediaire, TypesTauxCSGRetraite.taux_plein]
+            )
+
+        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),
+            indicatrice_taux_intermediaire = (taux_csg_retraite == TypesTauxCSGRetraite.taux_intermediaire),
+            law_node = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.pensions_retraite_invalidite.deductible,
+            plafond_securite_sociale = parameters.prelevements_sociaux.pss.plafond_securite_sociale_mensuel,
+            )
+        return montant_csg
+
+
+class csg_imposable_retraite(Variable):
+    calculate_output = calculate_output_add
+    value_type = float
+    entity = Individu
+    label = 'CSG imposable sur les pensions de retraite'
+    reference = 'https://www.lassuranceretraite.fr/cs/Satellite/PUBPrincipale/Retraites/Paiement-Votre-Retraite/Prelevements-Sociaux?packedargs=null'
+    definition_period = MONTH
+    set_input = set_input_divide_by_period
+    # TODO : formule à partir de 2015 seulement. Pour les années d'avant, certaines seuils de RFR sont manquants, ainsi que des informations relatives à des exonérations passées.
+
+    def formula_2019(individu, period, parameters):
+        retraite_brute = individu('retraite_brute', period)
+        rfr = individu.foyer_fiscal('rfr', period = period.n_2)
+        nbptr = individu.foyer_fiscal('nbptr', period = period.n_2)
+        parameters = parameters(period)
+        seuils = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.seuils
+        seuil_exoneration = seuils.seuil_rfr1.seuil_rfr1 + (nbptr - 1) * 2 * seuils.seuil_rfr1.demi_part_suppl_rfr1
+        seuil_reduction = seuils.seuil_rfr2.seuil_rfr2 + (nbptr - 1) * 2 * seuils.seuil_rfr2.demi_part_suppl_rfr2
+        seuil_taux_intermediaire = seuils.seuil_rfr3.seuil_rfr3 + (nbptr - 1) * 2 * seuils.seuil_rfr3.demi_part_suppl_rfr3
+
+        taux_csg_retraite = select(
+            [rfr <= seuil_exoneration, rfr <= seuil_reduction, rfr <= seuil_taux_intermediaire, rfr > seuil_taux_intermediaire],
+            [TypesTauxCSGRetraite.exonere, TypesTauxCSGRetraite.taux_reduit, TypesTauxCSGRetraite.taux_intermediaire, TypesTauxCSGRetraite.taux_plein]
+            )
+
+        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),
+            indicatrice_taux_intermediaire = (taux_csg_retraite == TypesTauxCSGRetraite.taux_intermediaire),
+            law_node = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.pensions_retraite_invalidite.imposable,
+            )
+        return montant_csg
+
+
+class crds_retraite(Variable):
+    calculate_output = calculate_output_add
+    value_type = float
+    entity = Individu
+    label = 'CRDS sur les pensions de retraite'
+    reference = 'http://www.pensions.bercy.gouv.fr/vous-%C3%AAtes-retrait%C3%A9-ou-pensionn%C3%A9/le-calcul-de-ma-pension/les-pr%C3%A9l%C3%A8vements-effectu%C3%A9s-sur-ma-pension'
+    definition_period = MONTH
+    set_input = set_input_divide_by_period
+    # TODO : formule à partir de 2015 seulement. Pour les années d'avant, certaines seuils de RFR sont manquants, ainsi que des informations relatives à des exonérations passées.
+
+    def formula_2019(individu, period, parameters):
+        retraite_brute = individu('retraite_brute', period)
+        rfr = individu.foyer_fiscal('rfr', period = period.n_2)
+        nbptr = individu.foyer_fiscal('nbptr', period = period.n_2)
+        parameters = parameters(period)
+        seuils = parameters.prelevements_sociaux.contributions_sociales.csg.remplacement.seuils
+        seuil_exoneration = seuils.seuil_rfr1.seuil_rfr1 + (nbptr - 1) * 2 * seuils.seuil_rfr1.demi_part_suppl_rfr1
+        seuil_reduction = seuils.seuil_rfr2.seuil_rfr2 + (nbptr - 1) * 2 * seuils.seuil_rfr2.demi_part_suppl_rfr2
+        seuil_taux_intermediaire = seuils.seuil_rfr3.seuil_rfr3 + (nbptr - 1) * 2 * seuils.seuil_rfr3.demi_part_suppl_rfr3
+
+        taux_csg_retraite = select(
+            [rfr <= seuil_exoneration, rfr <= seuil_reduction, rfr <= seuil_taux_intermediaire, rfr > seuil_taux_intermediaire],
+            [TypesTauxCSGRetraite.exonere, TypesTauxCSGRetraite.taux_reduit, TypesTauxCSGRetraite.taux_intermediaire, TypesTauxCSGRetraite.taux_plein]
+            )
+
+        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,
+            ) * (taux_csg_retraite != TypesTauxCSGRetraite.exonere)
+
+        return montant_crds
+
+
+class csg_glo_assimile_salaire_ir_et_ps(Variable):
+    calculate_output = calculate_output_add
+    value_type = float
+    label = "CSG sur GLO assimilés salaires pour les prélèvements sociaux, en plus de l'être pour l'IR (cases 1TT et similaires)"
+    entity = Individu
+    definition_period = YEAR
+    set_input = set_input_divide_by_period
+
+    def formula(individu, period, parameters):
+        f1tt = individu('f1tt', period)
+        csg_activite = parameters(period).prelevements_sociaux.contributions_sociales.csg.activite
+        taux = csg_activite.imposable.taux.rates[0] + csg_activite.deductible.taux.rates[0]
+        return - f1tt * taux
+
+
+class crds_glo_assimile_salaire_ir_et_ps(Variable):
+    calculate_output = calculate_output_add
+    value_type = float
+    label = "CRDS sur GLO assimilés salaires pour les prélèvements sociaux, en plus de l'être pour l'IR (cases 1TT et similaires)"
+    entity = Individu
+    definition_period = YEAR
+    set_input = set_input_divide_by_period
+
+    def formula(individu, period, parameters):
+        f1tt = individu('f1tt', period)
+
+        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 crds_revenus_capital(Variable):
+    value_type = float
+    entity = FoyerFiscal
+    label = 'CRDS sur les revenus du capital'
+    definition_period = YEAR
+
+    def formula(foyer_fiscal, period, parameters):
+        assiette_csg_revenus_capital = foyer_fiscal('assiette_csg_revenus_capital', period)
+        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)
+
+        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 crds_ppa(Variable):
+    value_type = float
+    entity = Famille
+    label = "CRDS sur la prime pour l'activité"
+    definition_period = MONTH
+    set_input = set_input_divide_by_period
+
+    def formula_2016_01_01(famille, period, parameters):
+        ppa = famille('ppa', period)
+
+        law = parameters(period)
+
+        montant_crds = montant_csg_crds_bareme(
+            base_sans_abattement = ppa,
+            law_node = law.prelevements_sociaux.contributions_sociales.crds,
+            )
+
+        return montant_crds
+
+
+class crds_af(Variable):
+    value_type = float
+    entity = Famille
+    label = 'CRDS sur les allocations familiales'
+    definition_period = MONTH
+
+    def formula(famille, period, parameters):
+        af = famille('af', period)
+
+        law = parameters(period)
+
+        montant_crds = montant_csg_crds_bareme(
+            base_sans_abattement = af,
+            law_node = law.prelevements_sociaux.contributions_sociales.crds,
+            )
+
+        return montant_crds
+
+
+class crds_ars(Variable):
+    value_type = float
+    entity = Famille
+    label = "CRDS sur l'allocation de rentrée scolaire"
+    reference = 'http://www.cleiss.fr/docs/regimes/regime_francea1.html'
+    definition_period = YEAR
+
+    def formula(famille, period, parameters):
+        ars = famille('ars', period)
+
+        law = parameters(period)
+
+        montant_crds = montant_csg_crds_bareme(
+            base_sans_abattement = ars,
+            law_node = law.prelevements_sociaux.contributions_sociales.crds,
+            )
+
+        return montant_crds
+
+
+class crds_asf(Variable):
+    value_type = float
+    entity = Famille
+    label = "CRDS sur l'allocation de soutien familial'"
+    definition_period = MONTH
+
+    def formula(famille, period, parameters):
+        asf = famille('asf', period)
+
+        law = parameters(period)
+
+        montant_crds = montant_csg_crds_bareme(
+            base_sans_abattement = asf,
+            law_node = law.prelevements_sociaux.contributions_sociales.crds,
+            )
+
+        return montant_crds
+
+
+class crds_cf(Variable):
+    value_type = float
+    entity = Famille
+    label = 'CRDS sur le complément familial'
+    definition_period = MONTH
+
+    def formula(famille, period, parameters):
+        cf = famille('cf', period)
+
+        law = parameters(period)
+
+        montant_crds = montant_csg_crds_bareme(
+            base_sans_abattement = cf,
+            law_node = law.prelevements_sociaux.contributions_sociales.crds,
+            )
+
+        return montant_crds
+
+
+class crds_paje(Variable):
+    value_type = float
+    entity = Famille
+    label = 'CRDS sur la PAJE - Ensemble des prestations'
+    definition_period = MONTH
+
+    def formula(famille, period, parameters):
+        paje = famille('paje', period)
+
+        law = parameters(period)
+
+        montant_crds = montant_csg_crds_bareme(
+            base_sans_abattement = paje,
+            law_node = law.prelevements_sociaux.contributions_sociales.crds,
+            )
+
+        return montant_crds
+
+
+class crds_logement(Variable):
+    calculate_output = calculate_output_add
+    value_type = float
+    entity = Famille
+    label = 'CRDS des allocations logement'
+    reference = 'http://vosdroits.service-public.fr/particuliers/F17585.xhtml'
+    definition_period = MONTH
+    set_input = set_input_divide_by_period
+
+    def formula(famille, period, parameters):
+        aide_logement_montant_brut = famille('aide_logement_montant_brut_crds', period)
+
+        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
\ No newline at end of file
-- 
GitLab