/
plf2016.py
255 lines (214 loc) · 13.2 KB
/
plf2016.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
import os
from ..model.base import *
dir_path = os.path.join(os.path.dirname(__file__), 'parameters')
# What if the reform was applied the year before it should
def reform_modify_parameters(parameters):
file_path = os.path.join(dir_path, 'plf2016.yaml')
reform_parameters_subtree = load_parameter_file(name='plf2016', file_path=file_path)
parameters.add_child('plf2016', reform_parameters_subtree)
return parameters
class plf2016(Reform):
name = 'Projet de Loi de Finances 2016 appliquée aux revenus 2014'
# key = 'plf2016'
class decote(Variable):
label = "Décote IR 2016 appliquée en 2015 sur revenus 2014"
definition_period = YEAR
# This formula is copy-pasted from the reference decote formula, so that we only change the decote formula for 2014
def formula_2015_01_01(foyer_fiscal, period, parameters):
ir_plaf_qf = foyer_fiscal('ir_plaf_qf', period)
nb_adult = foyer_fiscal('nb_adult', period)
decote_seuil_celib = parameters(period).impot_revenu.decote.seuil_celib
decote_seuil_couple = parameters(period).impot_revenu.decote.seuil_couple
decote_celib = (ir_plaf_qf < 4 / 3 * decote_seuil_celib) * (decote_seuil_celib - 3 / 4 * ir_plaf_qf)
decote_couple = (ir_plaf_qf < 4 / 3 * decote_seuil_couple) * (decote_seuil_couple - 3 / 4 * ir_plaf_qf)
return (nb_adult == 1) * decote_celib + (nb_adult == 2) * decote_couple
def formula_2014_01_01(foyer_fiscal, period, parameters):
ir_plaf_qf = foyer_fiscal('ir_plaf_qf', period)
nb_adult = foyer_fiscal('nb_adult', period)
plf = parameters(period).plf2016
decote_celib = (ir_plaf_qf < plf.decote_seuil_celib) * (plf.decote_seuil_celib - .75 * ir_plaf_qf)
decote_couple = (ir_plaf_qf < plf.decote_seuil_couple) * (plf.decote_seuil_couple - .75 * ir_plaf_qf)
return (nb_adult == 1) * decote_celib + (nb_adult == 2) * decote_couple
def apply(self):
self.update_variable(self.decote)
self.modify_parameters(modifier_function = reform_modify_parameters)
# Counterfactual ie business as usual
def counterfactual_modify_parameters(parameters):
# TODO: inflater les paramètres de la décote le barème de l'IR
inflation = .001
reform_parameters_subtree = ParameterNode('plf2016_conterfactual', data = {
'decote_seuil_celib': {'values': {"2015-01-01": {'value': round(1135 * (1 + inflation))}, "2016-01-01": {'value': None}}},
'decote_seuil_couple': {'values': {"2015-01-01": {'value': round(1870 * (1 + inflation))}, "2065-01-01": {'value': None}}},
})
parameters.add_child('plf2016_conterfactual', reform_parameters_subtree)
return parameters
# WIP : Nouveaux parametres à actualiser :
# 1° Le 1 est remplacé par les dispositions suivantes :
# (3) « 1. L'impôt est calculé en appliquant à la fraction de chaque part de revenu qui excède 9 700 € le taux de :
# (4) « 14 % pour la fraction supérieure à 9 700 € et inférieure ou égale à 26 791 € ;
# (5) « 30 % pour la fraction supérieure à 26 791 € et inférieure ou égale à 71 826 € ;
# (6) « 41 % pour la fraction supérieure à 71 826 € et inférieure ou égale à 152 108 € ;
# (7) « 45 % pour la fraction supérieure à 152 108 €. » ;
# (8) 2° Au 2 :
# (9) a) Au premier alinéa, le montant : « 1 508 € » est remplacé par le montant : « 1 510 € » ;
# (10) b) Au deuxième alinéa, le montant : « 3 558 € » est remplacé par le montant : « 3 562 € » ;
# (11) c) Au troisième alinéa, le montant : « 901 € » est remplacé par le montant : « 902 € » ;
# (12) d) Au quatrième alinéa, le montant : « 1 504 € » est remplacé par le montant : « 1 506 € » ;
# (13) e) Au dernier alinéa, le montant : « 1 680 € » est remplacé par le montant : « 1 682 € » ;
# (14) 3° Au 4, les mots : « 1 135 € et » sont remplacés par les mots : « 1 165 € et les trois quarts de » et
# les mots : « 1 870 €
# et » sont remplacés par les mots : « 1 920 € et les trois quarts de ».
# (15) II. – Au second alinéa de l'article 196 B du même code, le montant : « 5 726 € » est remplacé par le
# montant : « 5 732 € ».
class plf2016_counterfactual(Reform):
name = 'Contrefactuel du PLF 2016 sur les revenus 2015'
# key = 'plf2016_counterfactual'
class decote(Variable):
label = "Décote IR 2015 appliquée sur revenus 2015 (contrefactuel)"
definition_period = YEAR
def formula_2015_01_01(foyer_fiscal, period, parameters):
ir_plaf_qf = foyer_fiscal('ir_plaf_qf', period)
inflator = 1 + .001 + .005
decote = parameters(period).impot_revenu.decote
assert decote.seuil == 1016
return (ir_plaf_qf < decote.seuil * inflator) * (decote.seuil * inflator - ir_plaf_qf) * 0.5
class reduction_impot_exceptionnelle(Variable):
end = ''
def formula_2015_01_01(foyer_fiscal, period, parameters):
nb_adult = foyer_fiscal('nb_adult', period)
nb_parents = foyer_fiscal.declarant_principal.famille('nb_parents', period.first_month)
rfr = foyer_fiscal('rfr', period)
inflator = 1 + .001 + .005
# params = parameters(period).impot_revenu.reductions_impots.reduction_impot_exceptionnelle
seuil = 13795 * inflator
majoration_seuil = 3536 * inflator
montant_plafond = 350 * inflator
plafond = seuil * nb_adult + (nb_parents - nb_adult) * 2 * majoration_seuil
montant = montant_plafond * nb_adult
return min_(max_(plafond + montant - rfr, 0), montant)
class reductions(Variable):
label = "Somme des réductions d'impôt"
definition_period = YEAR
def formula_2013_01_01(foyer_fiscal, period, parameters):
accult = foyer_fiscal('accult', period)
adhcga = foyer_fiscal('adhcga', period)
cappme = foyer_fiscal('cappme', period)
creaen = foyer_fiscal('creaen', period)
daepad = foyer_fiscal('daepad', period)
deffor = foyer_fiscal('deffor', period)
dfppce = foyer_fiscal('dfppce', period)
doment = foyer_fiscal('doment', period)
domlog = foyer_fiscal('domlog', period)
donapd = foyer_fiscal('donapd', period)
duflot = foyer_fiscal('duflot', period)
ecpess = foyer_fiscal('ecpess', period)
garext = foyer_fiscal('garext', period)
intagr = foyer_fiscal('intagr', period)
invfor = foyer_fiscal('invfor', period)
invlst = foyer_fiscal('invlst', period)
ip_net = foyer_fiscal('ip_net', period)
locmeu = foyer_fiscal('locmeu', period)
mecena = foyer_fiscal('mecena', period)
mohist = foyer_fiscal('mohist', period)
patnat = foyer_fiscal('patnat', period)
prcomp = foyer_fiscal('prcomp', period)
reduction_impot_exceptionnelle = foyer_fiscal('reduction_impot_exceptionnelle', period)
repsoc = foyer_fiscal('repsoc', period)
resimm = foyer_fiscal('resimm', period)
rsceha = foyer_fiscal('rsceha', period)
saldom = foyer_fiscal('saldom', period)
scelli = foyer_fiscal('scelli', period)
sofica = foyer_fiscal('sofica', period)
spfcpi = foyer_fiscal('spfcpi', period)
total_reductions = accult + adhcga + cappme + creaen + daepad + deffor + dfppce + doment + domlog + \
donapd + duflot + ecpess + garext + intagr + invfor + invlst + locmeu + mecena + mohist + patnat + \
prcomp + repsoc + resimm + rsceha + saldom + scelli + sofica + spfcpi + reduction_impot_exceptionnelle
return min_(ip_net, total_reductions)
def apply(self):
for variable in [self.decote, self.reductions, self.reduction_impot_exceptionnelle]:
self.update_variable(variable)
self.modify_parameters(modifier_function = counterfactual_modify_parameters)
def counterfactual_2014_modify_parameters(parameters):
# TODO: inflater les paramètres de la décote le barème de l'IR
inflator = 1 + .001 + .005
reform_year = 2015
reform_period = period(reform_year)
# parameters.ir.reductions_impots.reduction_impot_exceptionnelle.montant_plafond.update(period=reform_period, value=350*inflator)
# parameters.ir.reductions_impots.reduction_impot_exceptionnelle.seuil.update(period=reform_period, value=13795*inflator)
# parameters.ir.reductions_impots.reduction_impot_exceptionnelle.majoration_seuil.update(period=reform_period, value=3536*inflator)
parameters.impot_revenu.bareme[1].threshold.update(period = reform_period, value = 6011 * inflator)
parameters.impot_revenu.bareme[1].rate.update(period = reform_period, value = .055 * inflator)
parameters.impot_revenu.bareme[2].threshold.update(period = reform_period, value = 11991 * inflator)
parameters.impot_revenu.bareme[2].rate.update(period = reform_period, value = .14 * inflator)
parameters.impot_revenu.bareme[3].threshold.update(period = reform_period, value = 26631 * inflator)
parameters.impot_revenu.bareme[3].rate.update(period = reform_period, value = .30 * inflator)
parameters.impot_revenu.bareme[4].threshold.update(period = reform_period, value = 71397 * inflator)
parameters.impot_revenu.bareme[4].rate.update(period = reform_period, value = .40 * inflator)
return parameters
class plf2016_counterfactual_2014(Reform):
name = 'Contrefactuel 2014 du PLF 2016 sur les revenus 2015'
key = 'plf2016_counterfactual_2014'
class decote(Variable):
definition_period = YEAR
def formula_2015_01_01(foyer_fiscal, period, parameters):
ir_plaf_qf = foyer_fiscal('ir_plaf_qf', period)
inflator = 1 + .001 + .005
decote = parameters(period).impot_revenu.decote
assert decote.seuil == 1016
return (ir_plaf_qf < decote.seuil * inflator) * (decote.seuil * inflator - ir_plaf_qf) * 0.5
class reduction_impot_exceptionnelle(Variable):
end = ''
def formula_2015_01_01(foyer_fiscal, period, parameters):
nb_adult = foyer_fiscal('nb_adult', period)
nb_parents = foyer_fiscal.declarant_principal.famille('nb_parents', period.first_month)
rfr = foyer_fiscal('rfr', period)
inflator = 1 + .001 + .005
# params = parameters(period).impot_revenu.reductions_impots.reduction_impot_exceptionnelle
seuil = 13795 * inflator
majoration_seuil = 3536 * inflator
montant_plafond = 350 * inflator
plafond = seuil * nb_adult + (nb_parents - nb_adult) * 2 * majoration_seuil
montant = montant_plafond * nb_adult
return min_(max_(plafond + montant - rfr, 0), montant)
class reductions(Variable):
label = "Somme des réductions d'impôt"
definition_period = YEAR
def formula_2013_01_01(foyer_fiscal, period, parameters):
accult = foyer_fiscal('accult', period)
adhcga = foyer_fiscal('adhcga', period)
cappme = foyer_fiscal('cappme', period)
creaen = foyer_fiscal('creaen', period)
daepad = foyer_fiscal('daepad', period)
deffor = foyer_fiscal('deffor', period)
dfppce = foyer_fiscal('dfppce', period)
doment = foyer_fiscal('doment', period)
domlog = foyer_fiscal('domlog', period)
donapd = foyer_fiscal('donapd', period)
duflot = foyer_fiscal('duflot', period)
ecpess = foyer_fiscal('ecpess', period)
garext = foyer_fiscal('garext', period)
intagr = foyer_fiscal('intagr', period)
invfor = foyer_fiscal('invfor', period)
invlst = foyer_fiscal('invlst', period)
ip_net = foyer_fiscal('ip_net', period)
locmeu = foyer_fiscal('locmeu', period)
mecena = foyer_fiscal('mecena', period)
mohist = foyer_fiscal('mohist', period)
patnat = foyer_fiscal('patnat', period)
prcomp = foyer_fiscal('prcomp', period)
reduction_impot_exceptionnelle = foyer_fiscal('reduction_impot_exceptionnelle', period)
repsoc = foyer_fiscal('repsoc', period)
resimm = foyer_fiscal('resimm', period)
rsceha = foyer_fiscal('rsceha', period)
saldom = foyer_fiscal('saldom', period)
scelli = foyer_fiscal('scelli', period)
sofica = foyer_fiscal('sofica', period)
spfcpi = foyer_fiscal('spfcpi', period)
total_reductions = accult + adhcga + cappme + creaen + daepad + deffor + dfppce + doment + domlog + \
donapd + duflot + ecpess + garext + intagr + invfor + invlst + locmeu + mecena + mohist + patnat + \
prcomp + repsoc + resimm + rsceha + saldom + scelli + sofica + spfcpi + reduction_impot_exceptionnelle
return min_(ip_net, total_reductions)
def apply(self):
for variable in [self.decote, self.reduction_impot_exceptionnelle, self.reductions]:
self.update_variable(variable)
self.modify_parameters(modifier_function = counterfactual_2014_modify_parameters)