Skip to content

Commit 0473bcf

Browse files
committed
Merge branch 'reforme_allegement_general' into wip-leximpact
2 parents 177d385 + 910d2c7 commit 0473bcf

File tree

19 files changed

+382
-59
lines changed

19 files changed

+382
-59
lines changed

CHANGELOG.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,32 @@
11
# Changelog
22

3+
## 174.3.0 [#2578](https://github.com/openfisca/openfisca-france/pull/2578)
4+
5+
* Évolution du système socio-fiscal.
6+
* Périodes concernées : à partir du 01/01/2026.
7+
* Zones impactées :
8+
* `openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py`
9+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/alleg_gen/mmid/plafond_smic_2025_01_01.yaml`
10+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/alleg_gen/mmid/taux.yaml`
11+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_cotisation_allocations_familiales/plafond_smic_2025_01_01.yaml`
12+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_cotisation_allocations_familiales/reduction.yaml`
13+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_general/ensemble_des_entreprises/entreprises_de_50_salaries_et_plus.yaml`
14+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_general/ensemble_des_entreprises/entreprises_de_moins_de_50_salaries.yaml`
15+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_general/ensemble_des_entreprises/plafond.yaml`
16+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_general/ensemble_des_entreprises/puissance.yaml`
17+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_general/ensemble_des_entreprises/seuil_taille_entreprise.yaml`
18+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_general/ensemble_des_entreprises/t_delta_grandes_entreprises.yaml`
19+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_general/ensemble_des_entreprises/t_delta_petites_entreprises.yaml`
20+
* `openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/allegement_general/ensemble_des_entreprises/t_min.yaml`
21+
* `tests/formulas/allegement_cotisation_allocations_familiales.yaml`
22+
* `tests/formulas/allegement_cotisation_maladie.yaml`
23+
* `tests/formulas/allegement_general.yaml`
24+
* Détails :
25+
- Ajoute une variable : taux de l'allègement général
26+
- Modifie la formule de l'allègement général avec la refonte en réduction générale dégressive unique
27+
- Met à jour et crée les paramètres de la formule de la réduction générale dégressive unique
28+
- Met fin aux bandeaux de réduction maladie et famille à partir de 2026
29+
330
### 174.2.5 [#2585](https://github.com/openfisca/openfisca-france/pull/2585)
431

532
* Évolution du système socio-fiscal.

openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py

Lines changed: 93 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -407,56 +407,99 @@ def compute_allegement_general(individu, period, parameters):
407407
'''
408408

409409
assiette = individu('assiette_allegement', period)
410-
smic_proratise = individu('smic_proratise', period)
411-
effectif_entreprise = individu('effectif_entreprise', period)
412-
413-
# Calcul du taux
414-
# Le montant maximum de l’allègement dépend de l’effectif de l’entreprise.
415-
# Le montant est calculé chaque année civile, pour chaque salarié ;
416-
# il est égal au produit de la totalité de la rémunération annuelle telle
417-
# que visée à l’article L. 242-1 du code de la Sécurité sociale par un
418-
# coefficient.
419-
# Ce montant est majoré de 10 % pour les entreprises de travail temporaire
420-
# au titre des salariés temporaires pour lesquels elle est tenue à
421-
# l’obligation d’indemnisation compensatrice de congés payés.
422-
423-
allegement_general = parameters(period).prelevements_sociaux.reductions_cotisations_sociales.allegement_general
424-
425-
# Du 2003-07-01 au 2005-06-30
426-
if date(2003, 7, 1) <= period.start.date <= date(2005, 6, 30):
427-
seuil = allegement_general.entreprises_ayant_signe_un_accord_de_rtt_avant_le_30_06_2003.plafond
428-
tx_max = allegement_general.entreprises_ayant_signe_un_accord_de_rtt_avant_le_30_06_2003.reduction_maximale
429-
# Du 2005-07-01 au 2019-12-31
430-
elif date(2005, 7, 1) <= period.start.date <= date(2019, 12, 31):
431-
seuil = allegement_general.ensemble_des_entreprises.plafond
432-
petite_entreprise = (effectif_entreprise < 20)
433-
tx_max = (
434-
allegement_general.ensemble_des_entreprises.entreprises_de_20_salaries_et_plus
435-
* not_(petite_entreprise)
436-
+ allegement_general.ensemble_des_entreprises.entreprises_de_moins_de_20_salaries
437-
* petite_entreprise
438-
)
439-
# Après le 2019-12-31
440-
else:
441-
seuil = allegement_general.ensemble_des_entreprises.plafond
442-
petite_entreprise = (effectif_entreprise < 50)
443-
tx_max = (
444-
allegement_general.ensemble_des_entreprises.entreprises_de_50_salaries_et_plus
445-
* not_(petite_entreprise)
446-
+ allegement_general.ensemble_des_entreprises.entreprises_de_moins_de_50_salaries
447-
* petite_entreprise
448-
)
410+
taux_allegement_general = individu('taux_allegement_general', period)
449411

450-
if seuil <= 1:
451-
return 0
412+
# Montant de l'allegment
413+
return taux_allegement_general * assiette
452414

453-
ratio_smic_salaire = smic_proratise / (assiette + 1e-16)
454415

455-
# règle d'arrondi: 4 décimales au dix-millième le plus proche
456-
taux_allegement_general = round_(tx_max * min_(1, max_(seuil * ratio_smic_salaire - 1, 0) / (seuil - 1)), 4)
416+
class taux_allegement_general(Variable):
417+
value_type = float
418+
entity = Individu
419+
label = 'Taux de réduction générale des cotisations employeur'
420+
definition_period = MONTH
421+
is_period_size_independent = True
422+
set_input = set_input_dispatch_by_period
457423

458-
# Montant de l'allegment
459-
return taux_allegement_general * assiette
424+
def formula_2026_01_01(individu, period, parameters):
425+
426+
# cf. Décret n° 2025-887 du 4 septembre 2025
427+
# https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000052194026
428+
# https://boss.gouv.fr/portail/accueil/actualites-boss-et-rescrits/actualites-boss/2025/septembre/reforme-des-allegements-generaux.html
429+
430+
assiette = individu('assiette_allegement', period)
431+
smic_proratise = individu('smic_proratise', period)
432+
effectif_entreprise = individu('effectif_entreprise', period)
433+
434+
allegement_general = parameters(period).prelevements_sociaux.reductions_cotisations_sociales.allegement_general
435+
436+
seuil_taille_entreprise = allegement_general.ensemble_des_entreprises.seuil_taille_entreprise
437+
t_delta = where(effectif_entreprise < seuil_taille_entreprise, allegement_general.ensemble_des_entreprises.t_delta_petites_entreprises, allegement_general.ensemble_des_entreprises.t_delta_grandes_entreprises)
438+
t_min = allegement_general.ensemble_des_entreprises.t_min
439+
seuil_sortie = allegement_general.ensemble_des_entreprises.plafond
440+
puissance = allegement_general.ensemble_des_entreprises.puissance
441+
remuneration = (assiette + 1e-16)
442+
ratio_salaire_smic = remuneration / smic_proratise
443+
condition_sortie_seuil = ratio_salaire_smic < seuil_sortie
444+
445+
taux_allegement_general = t_min + round_(
446+
t_delta * (max_(((1 / 2) * (3 * (smic_proratise / remuneration) - 1)), 0) ** puissance), 4)
447+
448+
taux_allegement_general = condition_sortie_seuil * taux_allegement_general
449+
taux_allegement_general = min_(t_min + t_delta, taux_allegement_general)
450+
451+
return taux_allegement_general
452+
453+
def formula(individu, period, parameters):
454+
# Calcul du taux
455+
# Le montant maximum de l’allègement dépend de l’effectif de l’entreprise.
456+
# Le montant est calculé chaque année civile, pour chaque salarié ;
457+
# il est égal au produit de la totalité de la rémunération annuelle telle
458+
# que visée à l’article L. 242-1 du code de la Sécurité sociale par un
459+
# coefficient.
460+
# Ce montant est majoré de 10 % pour les entreprises de travail temporaire
461+
# au titre des salariés temporaires pour lesquels elle est tenue à
462+
# l’obligation d’indemnisation compensatrice de congés payés.
463+
464+
assiette = individu('assiette_allegement', period)
465+
smic_proratise = individu('smic_proratise', period)
466+
effectif_entreprise = individu('effectif_entreprise', period)
467+
468+
allegement_general = parameters(period).prelevements_sociaux.reductions_cotisations_sociales.allegement_general
469+
470+
# Du 2003-07-01 au 2005-06-30
471+
if date(2003, 7, 1) <= period.start.date <= date(2005, 6, 30):
472+
seuil = allegement_general.entreprises_ayant_signe_un_accord_de_rtt_avant_le_30_06_2003.plafond
473+
tx_max = allegement_general.entreprises_ayant_signe_un_accord_de_rtt_avant_le_30_06_2003.reduction_maximale
474+
# Du 2005-07-01 au 2019-12-31
475+
elif date(2005, 7, 1) <= period.start.date <= date(2019, 12, 31):
476+
seuil = allegement_general.ensemble_des_entreprises.plafond
477+
petite_entreprise = (effectif_entreprise < 20)
478+
tx_max = (
479+
allegement_general.ensemble_des_entreprises.entreprises_de_20_salaries_et_plus
480+
* not_(petite_entreprise)
481+
+ allegement_general.ensemble_des_entreprises.entreprises_de_moins_de_20_salaries
482+
* petite_entreprise
483+
)
484+
# Après le 2019-12-31
485+
elif date(2019, 12, 31) <= period.start.date <= date(2025, 12, 31):
486+
seuil = allegement_general.ensemble_des_entreprises.plafond
487+
petite_entreprise = (effectif_entreprise < 50)
488+
tx_max = (
489+
allegement_general.ensemble_des_entreprises.entreprises_de_50_salaries_et_plus
490+
* not_(petite_entreprise)
491+
+ allegement_general.ensemble_des_entreprises.entreprises_de_moins_de_50_salaries
492+
* petite_entreprise
493+
)
494+
495+
if seuil <= 1:
496+
return 0
497+
498+
ratio_smic_salaire = smic_proratise / (assiette + 1e-16)
499+
# règle d'arrondi: 4 décimales au dix-millième le plus proche
500+
taux_allegement_general = round_(tx_max * min_(1, max_(seuil * ratio_smic_salaire - 1, 0) / (seuil - 1)), 4)
501+
502+
return taux_allegement_general
460503

461504

462505
class allegement_cotisation_allocations_familiales(Variable):
@@ -466,6 +509,7 @@ class allegement_cotisation_allocations_familiales(Variable):
466509
reference = 'https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/les-taux-de-cotisations/la-cotisation-dallocations-famil/la-reduction-du-taux-de-la-cotis.html'
467510
definition_period = MONTH
468511
set_input = set_input_divide_by_period
512+
end = '2025-12-31'
469513

470514
def formula_2015_01_01(individu, period, parameters):
471515
allegement_cotisation_allocations_familiales_base = individu('allegement_cotisation_allocations_familiales_base', period)
@@ -481,6 +525,7 @@ class allegement_cotisation_allocations_familiales_base(Variable):
481525
reference = 'https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/les-taux-de-cotisations/la-cotisation-dallocations-famil/la-reduction-du-taux-de-la-cotis.html'
482526
definition_period = MONTH
483527
set_input = set_input_divide_by_period
528+
end = '2025-12-31'
484529

485530
def formula_2015_01_01(individu, period, parameters):
486531
stagiaire = individu('stagiaire', period)
@@ -536,6 +581,7 @@ class allegement_cotisation_maladie(Variable):
536581
set_input = set_input_divide_by_period
537582
label = 'Allègement des cotisations employeur d’assurance maladie sur les bas et moyens salaires (Ex-CICE)'
538583
reference = 'https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000037947559'
584+
end = '2025-12-31'
539585

540586
def formula_2019_01_01(individu, period, parameters):
541587
allegement_cotisation_maladie_base = individu('allegement_cotisation_maladie_base', period)
@@ -551,6 +597,7 @@ class allegement_cotisation_maladie_base(Variable):
551597
set_input = set_input_divide_by_period
552598
label = 'Allègement des cotisations employeur d’assurance maladie sur les bas et moyens salaires (Ex-CICE)'
553599
reference = 'https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000037947559'
600+
end = '2025-12-31'
554601

555602
def formula_2019_01_01(individu, period, parameters):
556603
# propose 3 modes de paiement possibles

openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/exonerations.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -459,9 +459,20 @@ def formula_2009_01_01(individu, period, parameters):
459459
eligible = zone_restructuration_defense
460460

461461
# Paramètre T mis en dur initialement dans la formule et laissé tel quel car le paramètre reductions_cotisations_sociales.alleg_gen.mmid.taux existe uniquement depuis 2019.
462-
463-
taux_max = .281 if period.start.year < 2019 else (t_max_parameters.cotisations_securite_sociale_regime_general.mmid.employeur.maladie.rates[0] - t_max_parameters.reductions_cotisations_sociales.alleg_gen.mmid.taux + t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_plafonnee.rates[0] + t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_deplafonnee.rates[0] + t_max_parameters.cotisations_securite_sociale_regime_general.famille.employeur.famille.rates[0] - t_max_parameters.reductions_cotisations_sociales.allegement_cotisation_allocations_familiales.reduction)
464-
462+
if period.start.year < 2019:
463+
taux_max = .281
464+
elif period.start.year >= 2019 and period.start.year < 2026:
465+
taux_max = (t_max_parameters.cotisations_securite_sociale_regime_general.mmid.employeur.maladie.rates[0]
466+
- t_max_parameters.reductions_cotisations_sociales.alleg_gen.mmid.taux
467+
+ t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_plafonnee.rates[0]
468+
+ t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_deplafonnee.rates[0]
469+
+ t_max_parameters.cotisations_securite_sociale_regime_general.famille.employeur.famille.rates[0]
470+
- t_max_parameters.reductions_cotisations_sociales.allegement_cotisation_allocations_familiales.reduction)
471+
else:
472+
taux_max = (t_max_parameters.cotisations_securite_sociale_regime_general.mmid.employeur.maladie.rates[0]
473+
+ t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_plafonnee.rates[0]
474+
+ t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_deplafonnee.rates[0]
475+
+ t_max_parameters.cotisations_securite_sociale_regime_general.famille.employeur.famille.rates[0] )
465476
seuil_max = seuils.plafond_part_remuneration
466477
seuil_min = seuils.plafond_exoneration_integrale_part_remuneration
467478

@@ -576,8 +587,18 @@ def formula_2008_03_01(individu, period, parameters):
576587
taux_max = 0.281
577588
elif period.start.year < 2019:
578589
taux_max = 0.2655
590+
elif period.start.year >= 2019 and period.start.year < 2026:
591+
taux_max = (t_max_parameters.cotisations_securite_sociale_regime_general.mmid.employeur.maladie.rates[0]
592+
- t_max_parameters.reductions_cotisations_sociales.alleg_gen.mmid.taux
593+
+ t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_plafonnee.rates[0]
594+
+ t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_deplafonnee.rates[0]
595+
+ t_max_parameters.cotisations_securite_sociale_regime_general.famille.employeur.famille.rates[0]
596+
- t_max_parameters.reductions_cotisations_sociales.allegement_cotisation_allocations_familiales.reduction)
579597
else:
580-
taux_max = (t_max_parameters.cotisations_securite_sociale_regime_general.mmid.employeur.maladie.rates[0] - t_max_parameters.reductions_cotisations_sociales.alleg_gen.mmid.taux + t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_plafonnee.rates[0] + t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_deplafonnee.rates[0] + t_max_parameters.cotisations_securite_sociale_regime_general.famille.employeur.famille.rates[0] - t_max_parameters.reductions_cotisations_sociales.allegement_cotisation_allocations_familiales.reduction)
598+
taux_max = (t_max_parameters.cotisations_securite_sociale_regime_general.mmid.employeur.maladie.rates[0]
599+
+ t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_plafonnee.rates[0]
600+
+ t_max_parameters.cotisations_securite_sociale_regime_general.cnav.employeur.vieillesse_deplafonnee.rates[0]
601+
+ t_max_parameters.cotisations_securite_sociale_regime_general.famille.employeur.famille.rates[0])
581602

582603
seuil_max = seuils.plafond_part_remuneration
583604
seuil_min = seuils.plafond_exoneration_integrale_part_remuneration

openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/alleg_gen/mmid/plafond_smic_2025_01_01.yaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@ description: Plafond de rémunération (en nombre de Smic du 01/01/2025) des sal
22
values:
33
2025-01-01:
44
value: 2.25
5+
2026-01-01:
6+
value: null
57
metadata:
68
short_label: Plafond de rémunération des salariés (Nombre de Smic 01/01/2025)
7-
last_value_still_valid_on: "2025-07-11"
9+
last_value_still_valid_on: "2025-09-10"
810
unit: smic_2025_01_01
911
reference:
1012
2025-01-01:
1113
- title: Article D241-3-2 du Code de la sécurité sociale
1214
href: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000048852528
1315
- title: Décret n°2025-318 du 04/04/2025, Art. 1
1416
href: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000051430146
17+
2026-01-01:
18+
- title: Décret n° 2025-887 du 04/09/2025
19+
href: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000052194026
1520
official_journal_date:
1621
2025-01-01: "2025-04-06"
22+
notes:
23+
2026-01-01:
24+
- title: Fusion du bandeau d'allègement maladie avec la réduction générale dégressive unique

openfisca_france/parameters/prelevements_sociaux/reductions_cotisations_sociales/alleg_gen/mmid/taux.yaml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ description: Taux d'allègement des cotisations du régime d'assurance maladie s
22
values:
33
2019-01-01:
44
value: 0.06
5+
2026-01-01:
6+
value: null
57
metadata:
68
short_label: Taux d'allègement des cotisations d'assurance maladie
7-
last_value_still_valid_on: "2025-02-21"
9+
last_value_still_valid_on: "2025-09-10"
810
label_en: SSCs for sickness, maternity, disability and death benefits
911
unit: /1
1012
reference:
@@ -13,9 +15,14 @@ metadata:
1315
href: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000037069704/2019-01-01/
1416
- title: Loi 2017-1836 du 30/12/2017 (LFSS pour 2018), art. 9
1517
href: https://www.legifrance.gouv.fr/affichTexteArticle.do?idArticle=LEGIARTI000036358458&cidTexte=JORFTEXT000036339090
18+
2026-01-01:
19+
- title: Décret n° 2025-887 du 04/09/2025
20+
href: https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000052194026
1621
official_journal_date:
1722
2019-01-01: "2017-12-31"
1823
notes:
1924
2019-01-01:
2025
- title: Taux d'allègement pour salaire inférieur à 2,5 Smic constitue la transformation du CICE et CITS en baisse pérenne de cotisations employeur.
26+
2026-01-01:
27+
- title: Fusion du bandeau d'allègement maladie avec la réduction générale dégressive unique
2128
documentation: A partir de 2019, un allègement sur le taux normal est appliqué contrairement à précédemment où des taux d'imposition par tranche étaient en vigueur.

0 commit comments

Comments
 (0)