Skip to content

Commit 3c6be16

Browse files
authored
CDHR 2026 (#2696)
2 parents 644536f + a99c8b5 commit 3c6be16

18 files changed

+616
-19
lines changed

CHANGELOG.md

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

3+
### 175.0.17 [#2696](https://github.com/openfisca/openfisca-france/pull/2696)
4+
5+
* Évolution du système socio-fiscal.
6+
* Périodes concernées : à partir du 01/01/2025.
7+
* Zones impactées : `parameters/impot_revenu/contributions_exceptionnelles/contribution_differentielle_hauts_revenus/*`.
8+
* Détails :
9+
- Modification mineure de la CDHR.
10+
- Ajout du mécanisme d'acompte et de pénalité.
11+
- Ajout de tests.
12+
313
### 175.0.16 [#2695](https://github.com/openfisca/openfisca-france/pull/2695)
414

515
* Évolution du système socio-fiscal. Changement mineur.

CONTRIBUTING.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ uv sync --upgrade
108108

109109
Si vous souhaitez utiliser le debugger de VS Code avec les tests YAML, par exemple pour investiguer la commande suivante :
110110

111-
`openfisca test --country-package openfisca_france tests/impot_revenu/cdhr.yaml`
111+
`openfisca test --country-package openfisca_france --verbose tests/impot_revenu/contribution_differentielle_hauts_revenus_2026.yaml`
112112

113113
Il faut créer un fichier de configuration `.vscode/launch.json` avec le contenu suivant :
114114

@@ -120,14 +120,17 @@ Il faut créer un fichier de configuration `.vscode/launch.json` avec le contenu
120120
"name": "Python: Debug current YAML test file",
121121
"type": "debugpy",
122122
"request": "launch",
123-
"program": "${workspaceFolder}/.venv/bin/openfisca",
123+
"module": "openfisca_core.scripts.openfisca_command",
124124
"args": [
125125
"test",
126126
"--country-package",
127127
"openfisca_france",
128+
"--verbose",
128129
"${file}"
129130
],
130131
"console": "integratedTerminal",
132+
"cwd": "${workspaceFolder}",
133+
"python": "${workspaceFolder}/.venv/bin/python",
131134
"justMyCode": false,
132135
}
133136
]

openfisca_france/model/prelevements_obligatoires/impot_revenu/contribution_differentielle_hauts_revenus.py

Lines changed: 221 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from openfisca_core.model_api import min_
2+
13
from openfisca_france.model.base import (
24
calculate_output_divide,
35
FoyerFiscal,
@@ -44,6 +46,43 @@ def formula_2025_01_01(foyer_fiscal, period, parameters):
4446

4547
return rfr
4648

49+
def formula_2026_01_01(foyer_fiscal, period, parameters):
50+
# LF 2026 : Modifications de l'article 224 CGI
51+
# II. – Le revenu mentionné au I s'entend du revenu fiscal de référence défini au 1° du IV de l'article 1417,
52+
# sans qu'il soit fait application des règles de quotient définies au I de
53+
# l'[article 163-0 A](https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000044978385/2022-01-01).
54+
rfr = foyer_fiscal('rfr', period)
55+
56+
# [leximpact : TODO: - exclure le système du quotient (art. 163-0 A) du RFR]
57+
# Le RFR doit être calculé sans application des règles de quotient pour revenus exceptionnels
58+
# Ce quotient n'existe pas dans OpenFisca.
59+
60+
# diminué du montant :
61+
# 1° Des abattements mentionnés au a bis du même 1° autres que ceux mentionnés aux 1 ter ou 1 quater de l'article 150-0 D ;
62+
# 2° Des bénéfices exonérés mentionnés au b du 1° du IV de l'article 1417 ;
63+
# 3° Des produits et revenus exonérés en application de l'article 155 B ;
64+
# 4° Du résultat net bénéficiaire déterminé en application de l'article 238 effectivement imposé au taux de 10 % ;
65+
# 5° Des produits imposés au taux de 10 % mentionnés au second alinéa du I de l'article 93 quater ;
66+
# 6° Des plus-values mentionnées au I de l'article 150-0 B ter pour lesquelles le report d'imposition expire ;
67+
# 7° Des produits et revenus exonérés en application d'une convention internationale relative aux doubles impositions.
68+
69+
# [leximpact : condition revenus exceptionnels - inchangée]
70+
# Pour la détermination du revenu mentionné au présent II,
71+
# les revenus qui, par leur nature, ne sont pas susceptibles d'être recueillis annuellement
72+
# et dont le montant dépasse la moyenne des revenus nets d'après lesquels le contribuable
73+
# a été soumis à l'impôt sur le revenu au titre des trois dernières années,
74+
# sont retenus pour le quart de leur montant.
75+
76+
# [leximpact : nouvelles règles de changement de situation familiale (LF 2026)]
77+
# En cas de modification de la situation de famille du contribuable au cours de l'année d'imposition
78+
# ou des trois années précédentes (et non plus deux), les revenus nets sont ceux :
79+
# a) Du couple passible de la contribution et des foyers fiscaux auxquels les conjoints ou les partenaires
80+
# de ce couple ont appartenu au cours de l'année d'imposition, ou des trois années précédentes en cas d'union.
81+
# b) Du contribuable passible de la contribution et des foyers fiscaux auxquels il a appartenu au cours
82+
# de l'année d'imposition, ou des trois années précédentes en cas de divorce, de séparation ou de décès.
83+
84+
return rfr
85+
4786

4887
class contribution_differentielle_hauts_revenus_eligible(Variable):
4988
value_type = float
@@ -140,6 +179,40 @@ def formula_2025_01_01(foyer_fiscal, period, parameters):
140179
+ f7ik + f7il + f7gq + f7gr + f7fq + f7ft + f7fm + f7fl + f7fy)
141180
return reduction_d_impot_majorantes
142181

182+
def formula_2026_01_01(foyer_fiscal, period, parameters):
183+
# LF 2026 : IV.A.2° - Ajout de l'article 200 (dons aux oeuvres) aux réductions majorantes
184+
# « à l'article 200 » est inséré après « I, »
185+
f8wt = foyer_fiscal('f8wt', period)
186+
f8tb = foyer_fiscal('f8tb', period)
187+
f8tl = foyer_fiscal('f8tl', period)
188+
f8tp = foyer_fiscal('f8tp', period)
189+
f8uz = foyer_fiscal('f8uz', period)
190+
f8wa = foyer_fiscal('f8wa', period)
191+
f8wd = foyer_fiscal('f8wd', period)
192+
f8wr = foyer_fiscal('f8wr', period)
193+
f8wc = foyer_fiscal('f8wc', period)
194+
f8te = foyer_fiscal('f8te', period)
195+
interets_emprunt_reprise_societe = foyer_fiscal('interets_emprunt_reprise_societe', period)
196+
f7ik = foyer_fiscal('f7ik', period)
197+
f7il = foyer_fiscal('f7il', period)
198+
f7gq = foyer_fiscal('f7gq', period)
199+
f7gr = foyer_fiscal('f7gr', period)
200+
f7fq = foyer_fiscal('f7fq', period)
201+
f7ft = foyer_fiscal('f7ft', period)
202+
f7fm = foyer_fiscal('f7fm', period)
203+
f7fl = foyer_fiscal('f7fl', period)
204+
f7fy = foyer_fiscal('f7fy', period)
205+
206+
# LF 2026 : Ajout de l'article 200 (réduction d'impôt pour dons)
207+
# Les dons aux oeuvres (art. 200) sont maintenant inclus dans les réductions majorantes
208+
reductions_dons = foyer_fiscal('dfppce', period)
209+
210+
reduction_d_impot_majorantes = (f8wt + f8tb + f8tl + f8tp + f8uz
211+
+ f8wa + f8wd + f8wr + f8wc + f8te + interets_emprunt_reprise_societe
212+
+ f7ik + f7il + f7gq + f7gr + f7fq + f7ft + f7fm + f7fl + f7fy
213+
+ reductions_dons)
214+
return reduction_d_impot_majorantes
215+
143216

144217
class contribution_differentielle_hauts_revenus_decote(Variable):
145218
value_type = float
@@ -324,7 +397,154 @@ def formula_2025_01_01(foyer_fiscal, period, parameters): # Sur revenus 2025
324397
# du revenu défini au II de l’article 224 du même code et ces prélèvements libératoires ne sont pas retenus
325398
# pour déterminer le montant défini au 2° du III de l’article 224 du même code.
326399

327-
return (
400+
return -(
401+
contribution_differentielle_hauts_revenus_eligible
402+
* contribution_differentielle_hauts_revenus_montant
403+
)
404+
405+
def formula_2026_01_01(foyer_fiscal, period, parameters):
406+
# LF 2026 : Modifications de l'article 224 CGI
407+
contribution_differentielle_hauts_revenus_eligible = foyer_fiscal(
408+
'contribution_differentielle_hauts_revenus_eligible', period
409+
)
410+
411+
# III. – La contribution mentionnée au I est égale à la différence, lorsqu'elle est positive, entre :
412+
# 1° Le montant résultant de l'application d'un taux de 20 % au revenu défini au II ;
413+
taux = parameters(
414+
period
415+
).impot_revenu.contributions_exceptionnelles.contribution_differentielle_hauts_revenus.taux_cdhr
416+
contribution_differentielle_hauts_revenus_ressources = foyer_fiscal(
417+
'contribution_differentielle_hauts_revenus_ressources', period
418+
)
419+
420+
# [on soustrait la décote définie en V]
421+
contribution_differentielle_hauts_revenus_decote = foyer_fiscal(
422+
'contribution_differentielle_hauts_revenus_decote', period
423+
)
424+
impot_cible_apres_decote = (
425+
contribution_differentielle_hauts_revenus_ressources * taux
426+
) - contribution_differentielle_hauts_revenus_decote
427+
428+
# 2° Et le montant résultant de la somme de l'impôt sur le revenu et de la contribution prévue à l'article
429+
# 223 sexies définis au IV ainsi que des prélèvements libératoires de l'impôt sur le revenu
430+
# mentionnés au c du 1° du IV de l'article 1417,
431+
contribution_exceptionnelle_hauts_revenus = foyer_fiscal(
432+
'contribution_exceptionnelle_hauts_revenus', period
433+
)
434+
pfu = foyer_fiscal('prelevement_forfaitaire_unique_ir', period)
435+
prelevement_forfaitaire_liberatoire = -1 * foyer_fiscal(
436+
'prelevement_forfaitaire_liberatoire', period
437+
)
438+
ip_net = foyer_fiscal('ip_net', period)
439+
440+
# LF 2026 IV.A dernier alinéa : L'impôt sur le revenu est minoré du montant de l'imposition
441+
# se rapportant aux plus-values mentionnées au I de l'article 150-0 B ter pour lesquelles le report d'imposition expire.
442+
# [leximpact : TODO - implémenter la minoration pour PV en report 150-0 B ter]
443+
minoration_pv_report = 0 # À implémenter si variable disponible
444+
445+
impot_avant_creation_cdhr = (
446+
ip_net
447+
+ pfu
448+
+ prelevement_forfaitaire_liberatoire
449+
+ contribution_exceptionnelle_hauts_revenus
450+
+ foyer_fiscal(
451+
'contribution_differentielle_hauts_revenus_majoration', period
452+
)
453+
+ foyer_fiscal(
454+
'contribution_differentielle_hauts_revenus_majoration_impot', period
455+
)
456+
- minoration_pv_report
457+
)
458+
contribution_differentielle_hauts_revenus_montant = max_(
459+
impot_cible_apres_decote - impot_avant_creation_cdhr, 0
460+
)
461+
462+
# LF 2026 : IV.B - Nouvelles règles pour la CEHR
463+
# B. – Pour la détermination de la contribution mentionnée au 2° du III du présent article :
464+
# 1° Il n'est pas fait application du 1 du II de l'article 223 sexies ; (inchangé)
465+
# 2° La contribution est minorée de la part de son montant se rapportant aux éléments mentionnés aux 1° à 7° du II ;
466+
# 3° La contribution se rapportant aux revenus remplissant les conditions prévues au neuvième alinéa du même II
467+
# est retenue pour le quart de son montant.
468+
# [leximpact : TODO - implémenter les minorations de la CEHR pour éléments du II et revenus exceptionnels]
469+
470+
return -(
328471
contribution_differentielle_hauts_revenus_eligible
329472
* contribution_differentielle_hauts_revenus_montant
330473
)
474+
475+
476+
class contribution_differentielle_hauts_revenus_acompte(Variable):
477+
value_type = float
478+
entity = FoyerFiscal
479+
label = 'Acompte de la contribution différentielle sur les hauts revenus (CDHR)'
480+
reference = 'https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000051200465'
481+
definition_period = YEAR
482+
calculate_output = calculate_output_divide
483+
documentation = '''
484+
LF 2026 : III bis. – A. – 1. La contribution mentionnée au I de l'article 224 du code
485+
général des impôts donne lieu au versement d'un acompte entre le 1er et le 15 décembre
486+
de l'année d'imposition.
487+
Cet acompte est égal à 95 % du montant de la contribution estimé par le contribuable.
488+
'''
489+
490+
def formula(foyer_fiscal, period, parameters):
491+
# L'acompte est égal à 95 % du montant de la contribution estimée par le contribuable
492+
cdhr_parameters = parameters(
493+
period
494+
).impot_revenu.contributions_exceptionnelles.contribution_differentielle_hauts_revenus
495+
taux_acompte = cdhr_parameters.taux_acompte
496+
497+
cdhr = foyer_fiscal('contribution_differentielle_hauts_revenus', period)
498+
return cdhr * taux_acompte
499+
500+
501+
class contribution_differentielle_hauts_revenus_penalite_acompte(Variable):
502+
value_type = float
503+
entity = FoyerFiscal
504+
label = "Pénalité sur l'acompte de la CDHR en cas de défaut, retard ou sous-estimation"
505+
reference = 'https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000051200465'
506+
definition_period = YEAR
507+
calculate_output = calculate_output_divide
508+
documentation = '''
509+
LF 2026 : III bis. – C. – 1. Par dérogation au chapitre II du livre II du code général des impôts,
510+
une pénalité prenant la forme d'une majoration de 20 % s'applique :
511+
a) En cas de défaut ou de retard de paiement de l'acompte ;
512+
b) Lorsque le montant de l'acompte versé s'avère inférieur, de plus de 20 %,
513+
à 95 % du montant de la contribution prévue à l'article 224 du code général des impôts.
514+
515+
Cette variable calcule le montant de la pénalité potentielle.
516+
'''
517+
518+
def formula(foyer_fiscal, period, parameters):
519+
# Pénalité de 20% si acompte versé < 95% * CDHR - 20% (soit < 76% de la CDHR)
520+
cdhr_parameters = parameters(
521+
period
522+
).impot_revenu.contributions_exceptionnelles.contribution_differentielle_hauts_revenus
523+
taux_penalite = cdhr_parameters.taux_penalite_acompte # 0.20
524+
taux_acompte = cdhr_parameters.taux_acompte # 0.95
525+
526+
cdhr = foyer_fiscal('contribution_differentielle_hauts_revenus', period)
527+
acompte_verse = foyer_fiscal('contribution_differentielle_hauts_revenus_acompte_verse', period)
528+
529+
# Seuil de sous-estimation toléré = 20% de marge
530+
seuil_acompte_minimum = cdhr * taux_acompte * (1 - cdhr_parameters.taux_seuil_sous_estimation)
531+
532+
# Pénalité si acompte insuffisant
533+
assiette_penalite = min_(cdhr * taux_acompte + acompte_verse, 0)
534+
eligible_a_penalite = (-acompte_verse > seuil_acompte_minimum)
535+
penalite = eligible_a_penalite * assiette_penalite * taux_penalite
536+
537+
return penalite
538+
539+
540+
class contribution_differentielle_hauts_revenus_acompte_verse(Variable):
541+
value_type = float
542+
entity = FoyerFiscal
543+
label = 'Acompte versé pour la contribution différentielle sur les hauts revenus (CDHR)'
544+
reference = 'https://www.legifrance.gouv.fr/loda/article_lc/LEGIARTI000051200465'
545+
definition_period = YEAR
546+
default_value = 0
547+
documentation = '''
548+
Montant positif de l'acompte effectivement versé par le contribuable entre le 1er et le 15 décembre.
549+
Variable d'entrée à renseigner par l'utilisateur.
550+
'''

openfisca_france/parameters/impot_revenu/contributions_exceptionnelles/contribution_differentielle_hauts_revenus/index.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ metadata:
99
- taux_decote
1010
- plafond_revenus_decote_celibataire
1111
- plafond_revenus_decote_couple
12+
- taux_acompte
13+
- taux_penalite_acompte
1214
notes:
1315
2025-01-01:
1416
- title: Dispositif applicable à partir de l'imposition des revenus de l'année 2025.
17+
2026-01-01:
18+
- title: LF 2026 - Modifications et ajout du mécanisme d'acompte (III bis).

openfisca_france/parameters/impot_revenu/contributions_exceptionnelles/contribution_differentielle_hauts_revenus/majoration_impot_couple.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ values:
33
2025-01-01:
44
value: 12_500
55
metadata:
6-
last_value_still_valid_on: "2025-03-04"
6+
last_value_still_valid_on: "2026-02-23"
77
short_label: Majoration pour un couple marié/pacsé de l'impôt pris en compte avant calcul du différentiel
88
reference:
99
2025-01-01:

openfisca_france/parameters/impot_revenu/contributions_exceptionnelles/contribution_differentielle_hauts_revenus/majoration_impot_pac.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ values:
33
2025-01-01:
44
value: 1_500
55
metadata:
6-
last_value_still_valid_on: "2025-03-04"
6+
last_value_still_valid_on: "2026-02-23"
77
short_label: Majoration par personne à charge de l'impôt pris en compte avant calcul du différentiel
88
reference:
99
2025-01-01:

openfisca_france/parameters/impot_revenu/contributions_exceptionnelles/contribution_differentielle_hauts_revenus/plafond_revenus_decote_celibataire.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ values:
33
2025-01-01:
44
value: 330_000
55
metadata:
6-
last_value_still_valid_on: "2025-03-04"
6+
last_value_still_valid_on: "2026-02-23"
77
short_label: Plafond d'éligibilité décote pour un célibataire (revenus/an)
88
reference:
99
2025-01-01:

openfisca_france/parameters/impot_revenu/contributions_exceptionnelles/contribution_differentielle_hauts_revenus/plafond_revenus_decote_couple.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ values:
33
2025-01-01:
44
value: 660_000
55
metadata:
6-
last_value_still_valid_on: "2025-03-04"
6+
last_value_still_valid_on: "2026-02-23"
77
short_label: Plafond d'éligibilité décote pour un couple (revenus/an)
88
reference:
99
2025-01-01:

openfisca_france/parameters/impot_revenu/contributions_exceptionnelles/contribution_differentielle_hauts_revenus/seuil_celibataire.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ values:
33
2025-01-01:
44
value: 250_000
55
metadata:
6-
last_value_still_valid_on: "2025-03-04"
6+
last_value_still_valid_on: "2026-02-23"
77
short_label: Seuil d'éligibilité à la CDHR pour un célibataire (revenus/an)
88
reference:
99
2025-01-01:

openfisca_france/parameters/impot_revenu/contributions_exceptionnelles/contribution_differentielle_hauts_revenus/seuil_couple.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ values:
33
2025-01-01:
44
value: 500_000
55
metadata:
6-
last_value_still_valid_on: "2025-03-04"
6+
last_value_still_valid_on: "2026-02-23"
77
short_label: Seuil d'éligibilité à la CDHR pour un couple (revenus/an)
88
reference:
99
2025-01-01:

0 commit comments

Comments
 (0)