taxger 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/CODE_OF_CONDUCT.md +13 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +8 -0
  8. data/README.md +89 -0
  9. data/Rakefile +22 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +7 -0
  12. data/lib/taxger/einkommensteuer.rb +104 -0
  13. data/lib/taxger/lohnsteuer/bigdecimal.rb +70 -0
  14. data/lib/taxger/lohnsteuer/lohnsteuer2006.rb +891 -0
  15. data/lib/taxger/lohnsteuer/lohnsteuer2007.rb +917 -0
  16. data/lib/taxger/lohnsteuer/lohnsteuer2008.rb +983 -0
  17. data/lib/taxger/lohnsteuer/lohnsteuer2009.rb +975 -0
  18. data/lib/taxger/lohnsteuer/lohnsteuer2010.rb +1026 -0
  19. data/lib/taxger/lohnsteuer/lohnsteuer2011.rb +1070 -0
  20. data/lib/taxger/lohnsteuer/lohnsteuer2011dezember.rb +1082 -0
  21. data/lib/taxger/lohnsteuer/lohnsteuer2012.rb +1118 -0
  22. data/lib/taxger/lohnsteuer/lohnsteuer2013.rb +1120 -0
  23. data/lib/taxger/lohnsteuer/lohnsteuer2014.rb +1123 -0
  24. data/lib/taxger/lohnsteuer/lohnsteuer2015.rb +1144 -0
  25. data/lib/taxger/lohnsteuer/lohnsteuer2015dezember.rb +1339 -0
  26. data/lib/taxger/lohnsteuer/lohnsteuer2016.rb +1144 -0
  27. data/lib/taxger/lohnsteuer.rb +28 -0
  28. data/lib/taxger/version.rb +3 -0
  29. data/lib/taxger.rb +9 -0
  30. data/src/README.md +141 -0
  31. data/src/code_tree.rb +122 -0
  32. data/src/converter.rb +61 -0
  33. data/src/generated/.keep +0 -0
  34. data/src/node/class_node.rb +30 -0
  35. data/src/node/comment_node.rb +19 -0
  36. data/src/node/conditional_node.rb +32 -0
  37. data/src/node/expr_node.rb +13 -0
  38. data/src/node/initializer_node.rb +37 -0
  39. data/src/node/method_call_node.rb +12 -0
  40. data/src/node/method_node.rb +21 -0
  41. data/src/node/node.rb +47 -0
  42. data/src/node/pseudo_code_parser.rb +88 -0
  43. data/src/node/source_node.rb +43 -0
  44. data/src/node/var_block_node.rb +39 -0
  45. data/taxger.gemspec +34 -0
  46. metadata +146 -0
@@ -0,0 +1,891 @@
1
+ module Taxger
2
+ module Lohnsteuer
3
+ class Lohnsteuer2006
4
+ # CONSTANTS
5
+
6
+ # Tabelle fuer die Vomhundertsaetze des Versorgungsfreibetrags
7
+ TAB1 = [0.0, 0.400, 0.384, 0.368,
8
+ 0.352, 0.336, 0.320, 0.304,
9
+ 0.288, 0.272, 0.256, 0.240,
10
+ 0.224, 0.208, 0.192, 0.176,
11
+ 0.160, 0.152, 0.144, 0.136,
12
+ 0.128, 0.120, 0.112, 0.104,
13
+ 0.096, 0.088, 0.080, 0.072,
14
+ 0.064, 0.056, 0.048, 0.040,
15
+ 0.032, 0.024, 0.016, 0.008,
16
+ 0.000]
17
+
18
+ # Tabelle fuer die Hoechstbetrage des Versorgungsfreibetrags
19
+ TAB2 = [0, 3000, 2880, 2760,
20
+ 2640, 2520, 2400, 2280,
21
+ 2160, 2040, 1920, 1800,
22
+ 1680, 1560, 1440, 1320,
23
+ 1200, 1140, 1080, 1020,
24
+ 960, 900, 840, 780,
25
+ 720, 660, 600, 540,
26
+ 480, 420, 360, 300,
27
+ 240, 180, 120, 60,
28
+ 0]
29
+
30
+ # Tabelle fuer die Zuschlaege zum Versorgungsfreibetrag
31
+ TAB3 = [0, 900, 864, 828,
32
+ 792, 756, 720, 684,
33
+ 648, 612, 576, 540,
34
+ 504, 468, 432, 396,
35
+ 360, 342, 324, 306,
36
+ 288, 270, 252, 234,
37
+ 216, 198, 180, 162,
38
+ 144, 126, 108, 90,
39
+ 72, 54, 36, 18,
40
+ 0]
41
+
42
+ # Tabelle fuer die Vomhundertsaetze des Altersentlastungsbetrags
43
+ TAB4 = [0.0, 0.400, 0.384, 0.368,
44
+ 0.352, 0.336, 0.320, 0.304,
45
+ 0.288, 0.272, 0.256, 0.240,
46
+ 0.224, 0.208, 0.192, 0.176,
47
+ 0.160, 0.152, 0.144, 0.136,
48
+ 0.128, 0.120, 0.112, 0.104,
49
+ 0.096, 0.088, 0.080, 0.072,
50
+ 0.064, 0.056, 0.048, 0.040,
51
+ 0.032, 0.024, 0.016, 0.008,
52
+ 0.000]
53
+
54
+ # Tabelle fuer die Hoechstbetraege des Altersentlastungsbetrags
55
+ TAB5 = [0, 1900, 1824, 1748,
56
+ 1672, 1596, 1520, 1444,
57
+ 1368, 1292, 1216, 1140,
58
+ 1064, 988, 912, 836,
59
+ 760, 722, 684, 646,
60
+ 608, 570, 532, 494,
61
+ 456, 418, 380, 342,
62
+ 304, 266, 228, 190,
63
+ 152, 114, 76, 38,
64
+ 0]
65
+
66
+ # Zahlenkonstanten fuer im Plan oft genutzte BigDecimal Werte
67
+ ZAHL0 = BigDecimal.new(0)
68
+ ZAHL1 = BigDecimal.new(1)
69
+ ZAHL2 = BigDecimal.new(2)
70
+ ZAHL3 = BigDecimal.new(3)
71
+ ZAHL4 = BigDecimal.new(4)
72
+ ZAHL5 = BigDecimal.new(5)
73
+ ZAHL6 = BigDecimal.new(6)
74
+ ZAHL7 = BigDecimal.new(7)
75
+ ZAHL8 = BigDecimal.new(8)
76
+ ZAHL9 = BigDecimal.new(9)
77
+ ZAHL10 = BigDecimal.new(10)
78
+ ZAHL11 = BigDecimal.new(11)
79
+ ZAHL12 = BigDecimal.new(12)
80
+ ZAHL100 = BigDecimal.new(100)
81
+ ZAHL360 = BigDecimal.new(360)
82
+
83
+ attr_accessor :bk
84
+ attr_accessor :bks
85
+ attr_accessor :bkv
86
+ attr_accessor :lstlzz
87
+ attr_accessor :solzlzz
88
+ attr_accessor :solzs
89
+ attr_accessor :solzv
90
+ attr_accessor :sts
91
+ attr_accessor :stv
92
+
93
+ INPUT_VARS = [:ajahr, :alter1, :hinzur, :jfreib, :jhinzu, :jre4, :jvbez, :krv, :lzz, :r, :re4, :sonstb, :sterbe, :stkl, :vbez, :vbezm, :vbezs, :vbs, :vjahr, :vkapa, :vmt, :wfundf, :zkf, :zmvb]
94
+ OUTPUT_VARS = [:bk, :bks, :bkv, :lstlzz, :solzlzz, :solzs, :solzv, :sts, :stv]
95
+ def initialize(params)
96
+ raise "Unknown parameters: #{params.keys - INPUT_VARS}" if params.keys - INPUT_VARS != []
97
+ # INPUTS
98
+
99
+ # Auf die Vollendung des 64. Lebensjahres folgende
100
+ # Kalenderjahr (erforderlich, wenn ALTER1=1)
101
+ @ajahr = 0 # int
102
+
103
+ # 1, wenn das 64. Lebensjahr zu Beginn des Kalenderjahres vollendet wurde, in dem
104
+ # der Lohnzahlungszeitraum endet (§ 24 a EStG), sonst = 0
105
+ @alter1 = 0 # int
106
+
107
+ # In der Lohnsteuerkarte des Arbeitnehmers eingetragener Hinzurechnungsbetrag
108
+ # fuer den Lohnzahlungszeitraum in Cents
109
+ @hinzur = BigDecimal.new(0) # BigDecimal
110
+
111
+ # Jahresfreibetrag nach Maßgabe der Eintragungen auf der
112
+ # Lohnsteuerkarte in Cents (ggf. 0)
113
+ @jfreib = BigDecimal.new(0) # BigDecimal
114
+
115
+ # Jahreshinzurechnungsbetrag in Cents (ggf. 0)
116
+ @jhinzu = BigDecimal.new(0) # BigDecimal
117
+
118
+ # Voraussichtlicher Jahresarbeitslohn ohne sonstige Bezuege und
119
+ # ohne Verguetung fuer mehrjaehrige Taetigkeit in Cents (ggf. 0)
120
+ # Anmerkung: Die Eingabe dieses Feldes ist erforderlich bei Eingabe
121
+ # „sonstiger Bezuege“ (Feld SONSTB) oder bei Eingabe der „Verguetung
122
+ # fuer mehrjaehrige Taetigkeit“ (Feld VMT).
123
+ @jre4 = BigDecimal.new(0) # BigDecimal
124
+
125
+ # In JRE4 enthaltene Versorgungsbezuege in Cents (ggf. 0)
126
+ @jvbez = BigDecimal.new(0) # BigDecimal
127
+
128
+ # 1 = der Arbeitnehmer ist im Lohnzahlungszeitraum in der gesetzlichen
129
+ # Rentenversicherung versicherungsfrei und gehoert zu den in
130
+ # § 10 c Abs. 3 EStG genannten Personen.
131
+ # Bei anderen Arbeitnehmern ist „0“ einzusetzen.
132
+ # Fuer die Zuordnung sind allein die dem Arbeitgeber ohnehin bekannten
133
+ # Tatsachen maßgebend; zusaetzliche Ermittlungen braucht
134
+ # der Arbeitgeber nicht anzustellen.
135
+ @krv = 0 # int
136
+
137
+ # Lohnzahlungszeitraum:
138
+ # 1 = Jahr
139
+ # 2 = Monat
140
+ # 3 = Woche
141
+ # 4 = Tag
142
+ @lzz = 0 # int
143
+
144
+ # Religionsgemeinschaft des Arbeitnehmers lt. Lohnsteuerkarte (bei
145
+ # keiner Religionszugehoerigkeit = 0)
146
+ @r = 0 # int
147
+
148
+ # Steuerpflichtiger Arbeitslohn vor Beruecksichtigung der Freibetraege
149
+ # fuer Versorgungsbezuege, des Altersentlastungsbetrags und des auf
150
+ # der Lohnsteuerkarte fuer den Lohnzahlungszeitraum eingetragenen
151
+ # Freibetrags in Cents.
152
+ @re4 = BigDecimal.new(0) # BigDecimal
153
+
154
+ # Sonstige Bezuege (ohne Verguetung aus mehrjaehriger Taetigkeit) einschliesslich
155
+ # Sterbegeld bei Versorgungsbezuegen sowie Kapitalauszahlungen/Abfindungen,
156
+ # soweit es sich nicht um Bezuege fuer mehrere Jahre handelt in Cents (ggf. 0)
157
+ @sonstb = BigDecimal.new(0) # BigDecimal
158
+
159
+ # Sterbegeld bei Versorgungsbezuegen sowie Kapitalauszahlungen/Abfindungen,
160
+ # soweit es sich nicht um Bezuege fuer mehrere Jahre handelt
161
+ # (in SONSTB enthalten) in Cents
162
+ @sterbe = BigDecimal.new(0) # BigDecimal
163
+
164
+ # Steuerklasse:
165
+ # 1 = I
166
+ # 2 = II
167
+ # 3 = III
168
+ # 4 = IV
169
+ # 5 = V
170
+ # 6 = VI
171
+ @stkl = 0 # int
172
+
173
+ # In RE4 enthaltene Versorgungsbezuege in Cents (ggf. 0)
174
+ @vbez = BigDecimal.new(0) # BigDecimal
175
+
176
+ # Vorsorgungsbezug im Januar 2005 bzw. fuer den ersten vollen Monat
177
+ # in Cents
178
+ @vbezm = BigDecimal.new(0) # BigDecimal
179
+
180
+ # Voraussichtliche Sonderzahlungen im Kalenderjahr des Versorgungsbeginns
181
+ # bei Versorgungsempfaengern ohne Sterbegeld, Kapitalauszahlungen/Abfindungen
182
+ # bei Versorgungsbezuegen in Cents
183
+ @vbezs = BigDecimal.new(0) # BigDecimal
184
+
185
+ # In SONSTB enthaltene Versorgungsbezuege einschliesslich Sterbegeld
186
+ # in Cents (ggf. 0)
187
+ @vbs = BigDecimal.new(0) # BigDecimal
188
+
189
+ # Jahr, in dem der Versorgungsbezug erstmalig gewaehrt wurde; werden
190
+ # mehrere Versorgungsbezuege gezahlt, so gilt der aelteste erstmalige Bezug
191
+ @vjahr = 0 # int
192
+
193
+ # Kapitalauszahlungen/Abfindungen bei Versorgungsbezuegen fuer mehrere Jahre in Cents (ggf. 0)
194
+ @vkapa = BigDecimal.new(0) # BigDecimal
195
+
196
+ # Verguetung fuer mehrjaehrige Taetigkeit ohne Kapitalauszahlungen/Abfindungen bei
197
+ # Versorgungsbezuegen in Cents (ggf. 0)
198
+ @vmt = BigDecimal.new(0) # BigDecimal
199
+
200
+ # In der Lohnsteuerkarte des Arbeitnehmers eingetragener Freibetrag
201
+ # fuer den Lohnzahlungszeitraum in Cents
202
+ @wfundf = BigDecimal.new(0) # BigDecimal
203
+
204
+ # Zahl der Freibetraege fuer Kinder (eine Dezimalstelle, nur bei Steuerklassen
205
+ # I, II, III und IV)
206
+ @zkf = BigDecimal.new(0) # BigDecimal
207
+
208
+ # Zahl der Monate, fuer die Versorgungsbezuege gezahlt werden (nur
209
+ # erforderlich bei Jahresberechnung (LZZ = 1)
210
+ @zmvb = 0 # int
211
+
212
+ # OUTPUTS
213
+
214
+ # Bemessungsgrundlage fuer die Kirchenlohnsteuer in Cents
215
+ @bk = BigDecimal.new(0) # BigDecimal
216
+
217
+ # Bemessungsgrundlage der sonstigen Einkuenfte (ohne Verguetung
218
+ # fuer mehrjaehrige Taetigkeit) fuer die Kirchenlohnsteuer in Cents
219
+ @bks = BigDecimal.new(0) # BigDecimal
220
+ @bkv = BigDecimal.new(0) # BigDecimal
221
+
222
+ # Fuer den Lohnzahlungszeitraum einzubehaltende Lohnsteuer in Cents
223
+ @lstlzz = BigDecimal.new(0) # BigDecimal
224
+
225
+ # Fuer den Lohnzahlungszeitraum einzubehaltender Solidaritaetszuschlag
226
+ # in Cents
227
+ @solzlzz = BigDecimal.new(0) # BigDecimal
228
+
229
+ # Solidaritaetszuschlag fuer sonstige Bezuege (ohne Verguetung fuer mehrjaehrige
230
+ # Taetigkeit) in Cents
231
+ @solzs = BigDecimal.new(0) # BigDecimal
232
+
233
+ # Solidaritaetszuschlag fuer die Verguetung fuer mehrjaehrige Taetigkeit in
234
+ # Cents
235
+ @solzv = BigDecimal.new(0) # BigDecimal
236
+
237
+ # Lohnsteuer fuer sonstige Einkuenfte (ohne Verguetung fuer mehrjaehrige
238
+ # Taetigkeit) in Cents
239
+ @sts = BigDecimal.new(0) # BigDecimal
240
+
241
+ # Lohnsteuer fuer Verguetung fuer mehrjaehrige Taetigkeit in Cents
242
+ @stv = BigDecimal.new(0) # BigDecimal
243
+
244
+ # INTERNALS
245
+
246
+ # Altersentlastungsbetrag nach Alterseinkuenftegesetz in Cents
247
+ @alte = BigDecimal.new(0)
248
+
249
+ # Arbeitnehmer-Pauschbetrag in EURO
250
+ @anp = BigDecimal.new(0)
251
+
252
+ # Auf den Lohnzahlungszeitraum entfallender Anteil von Jahreswerten
253
+ # auf ganze Cents abgerundet
254
+ @anteil1 = BigDecimal.new(0)
255
+
256
+ # Auf den Lohnzahlungszeitraum entfallender Anteil von Jahreswerten
257
+ # auf ganze Cents aufgerundet
258
+ @anteil2 = BigDecimal.new(0)
259
+
260
+ # Bemessungsgrundlage fuer Altersentlastungsbetrag in Cents
261
+ @bmg = BigDecimal.new(0)
262
+
263
+ # Differenz zwischen ST1 und ST2 in EURO
264
+ @diff = BigDecimal.new(0)
265
+
266
+ # Entlastungsbetrag fuer Alleinerziehende in EURO
267
+ @efa = BigDecimal.new(0)
268
+
269
+ # Versorgungsfreibetrag in Cents
270
+ @fvb = BigDecimal.new(0)
271
+
272
+ # Zuschlag zum Versorgungsfreibetrag in EURO
273
+ @fvbz = BigDecimal.new(0)
274
+
275
+ # Massgeblich maximaler Versorgungsfreibetrag in Cents
276
+ @hfvb = BigDecimal.new(0)
277
+
278
+ # Nummer der Tabellenwerte fuer Versorgungsparameter
279
+ @j = 0
280
+
281
+ # Jahressteuer nach § 51a EStG, aus der Solidaritaetszuschlag und
282
+ # Bemessungsgrundlage fuer die Kirchenlohnsteuer ermittelt werden in EURO
283
+ @jbmg = BigDecimal.new(0)
284
+
285
+ # Jahreswert, dessen Anteil fuer einen Lohnzahlungszeitraum in
286
+ # UPANTEIL errechnet werden soll in Cents
287
+ @jw = BigDecimal.new(0)
288
+
289
+ # Nummer der Tabellenwerte fuer Parameter bei Altersentlastungsbetrag
290
+ @k = 0
291
+
292
+ # Kennzeichen bei Verguetung fuer mehrjaehrige Taetigkeit
293
+ # 0 = beim Vorwegabzug ist ZRE4VP zu beruecksichtigen
294
+ # 1 = beim Vorwegabzug ist ZRE4VP1 zu beruecksichtigen
295
+ @kennz = 0
296
+
297
+ # Summe der Freibetraege fuer Kinder in EURO
298
+ @kfb = BigDecimal.new(0)
299
+
300
+ # Kennzahl fuer die Einkommensteuer-Tabellenart:
301
+ # 1 = Grundtabelle
302
+ # 2 = Splittingtabelle
303
+ @kztab = 0
304
+
305
+ # Jahreslohnsteuer in EURO
306
+ @lstjahr = BigDecimal.new(0)
307
+
308
+ # Zwischenfelder der Jahreslohnsteuer in Cents
309
+ @lst1 = BigDecimal.new(0)
310
+ @lst2 = BigDecimal.new(0)
311
+ @lst3 = BigDecimal.new(0)
312
+
313
+ # Mindeststeuer fuer die Steuerklassen V und VI in EURO
314
+ @mist = BigDecimal.new(0)
315
+
316
+ # Arbeitslohn des Lohnzahlungszeitraums nach Abzug der Freibetraege
317
+ # fuer Versorgungsbezuege, des Altersentlastungsbetrags und des
318
+ # in der Lohnsteuerkarte eingetragenen Freibetrags und Hinzurechnung
319
+ # eines Hinzurechnungsbetrags in Cents. Entspricht dem Arbeitslohn,
320
+ # fuer den die Lohnsteuer im personellen Verfahren aus der
321
+ # zum Lohnzahlungszeitraum gehoerenden Tabelle abgelesen wuerde
322
+ @re4lzz = BigDecimal.new(0)
323
+
324
+ # Arbeitslohn des Lohnzahlungszeitraums nach Abzug der Freibetraege
325
+ # fuer Versorgungsbezuege und des Altersentlastungsbetrags in
326
+ # Cents zur Berechnung der Vorsorgepauschale
327
+ @re4lzzv = BigDecimal.new(0)
328
+
329
+ # Rechenwert in Gleitkommadarstellung
330
+ @rw = BigDecimal.new(0)
331
+
332
+ # Sonderausgaben-Pauschbetrag in EURO
333
+ @sap = BigDecimal.new(0)
334
+
335
+ # Freigrenze fuer den Solidaritaetszuschlag in EURO
336
+ @solzfrei = BigDecimal.new(0)
337
+
338
+ # Solidaritaetszuschlag auf die Jahreslohnsteuer in EURO, C (2 Dezimalstellen)
339
+ @solzj = BigDecimal.new(0)
340
+
341
+ # Zwischenwert fuer den Solidaritaetszuschlag auf die Jahreslohnsteuer
342
+ # in EURO, C (2 Dezimalstellen)
343
+ @solzmin = BigDecimal.new(0)
344
+
345
+ # Tarifliche Einkommensteuer in EURO
346
+ @st = BigDecimal.new(0)
347
+
348
+ # Tarifliche Einkommensteuer auf das 1,25-fache ZX in EURO
349
+ @st1 = BigDecimal.new(0)
350
+
351
+ # Tarifliche Einkommensteuer auf das 0,75-fache ZX in EURO
352
+ @st2 = BigDecimal.new(0)
353
+
354
+ # Bemessungsgrundlage fuer den Versorgungsfreibetrag in Cents
355
+ @vbezb = BigDecimal.new(0)
356
+
357
+ # Hoechstbetrag der Vorsorgepauschale nach Alterseinkuenftegesetz in EURO, C
358
+ @vhb = BigDecimal.new(0)
359
+
360
+ # Vorsorgepauschale in EURO, C (2 Dezimalstellen)
361
+ @vsp = BigDecimal.new(0)
362
+
363
+ # Vorsorgepauschale nach Alterseinkuenftegesetz in EURO, C
364
+ @vspn = BigDecimal.new(0)
365
+
366
+ # Zwischenwert 1 bei der Berechnung der Vorsorgepauschale nach
367
+ # dem Alterseinkuenftegesetz in EURO, C (2 Dezimalstellen)
368
+ @vsp1 = BigDecimal.new(0)
369
+
370
+ # Zwischenwert 2 bei der Berechnung der Vorsorgepauschale nach
371
+ # dem Alterseinkuenftegesetz in EURO, C (2 Dezimalstellen)
372
+ @vsp2 = BigDecimal.new(0)
373
+
374
+ # Hoechstbetrag der Vorsorgepauschale nach § 10c Abs. 3 EStG in EURO
375
+ @vspkurz = BigDecimal.new(0)
376
+
377
+ # Hoechstbetrag der Vorsorgepauschale nach § 10c Abs. 2 Nr. 2 EStG in EURO
378
+ @vspmax1 = BigDecimal.new(0)
379
+
380
+ # Hoechstbetrag der Vorsorgepauschale nach § 10c Abs. 2 Nr. 3 EStG in EURO
381
+ @vspmax2 = BigDecimal.new(0)
382
+
383
+ # Vorsorgepauschale nach § 10c Abs. 2 Satz 2 EStG vor der Hoechstbetragsberechnung
384
+ # in EURO, C (2 Dezimalstellen)
385
+ @vspo = BigDecimal.new(0)
386
+
387
+ # Fuer den Abzug nach § 10c Abs. 2 Nrn. 2 und 3 EStG verbleibender
388
+ # Rest von VSPO in EURO, C (2 Dezimalstellen)
389
+ @vsprest = BigDecimal.new(0)
390
+
391
+ # Hoechstbetrag der Vorsorgepauschale nach § 10c Abs. 2 Nr. 1 EStG
392
+ # in EURO, C (2 Dezimalstellen)
393
+ @vspvor = BigDecimal.new(0)
394
+
395
+ # Zu versteuerndes Einkommen gem. § 32a Abs. 1 und 2 EStG
396
+ # (2 Dezimalstellen)
397
+ @x = BigDecimal.new(0)
398
+
399
+ # gem. § 32a Abs. 1 EStG (6 Dezimalstellen)
400
+ @y = BigDecimal.new(0)
401
+
402
+ # Auf einen Jahreslohn hochgerechnetes RE4LZZ in EURO, C (2 Dezimalstellen)
403
+ @zre4 = BigDecimal.new(0)
404
+
405
+ # Auf einen Jahreslohn hochgerechnetes RE4LZZV zur Berechnung
406
+ # der Vorsorgepauschale in EURO, C (2 Dezimalstellen)
407
+ @zre4vp = BigDecimal.new(0)
408
+
409
+ # Sicherungsfeld von ZRE4VP in EURO,C bei der Berechnung des Vorwegabzugs
410
+ # fuer die Verguetung fuer mehrjaehrige Taetigkeit
411
+ @zre4vp1 = BigDecimal.new(0)
412
+
413
+ # Feste Tabellenfreibetraege (ohne Vorsorgepauschale) in EURO
414
+ @ztabfb = BigDecimal.new(0)
415
+
416
+ # Auf einen Jahreslohn hochgerechnetes (VBEZ abzueglich FVB) in
417
+ # EURO, C (2 Dezimalstellen)
418
+ @zvbez = BigDecimal.new(0)
419
+
420
+ # Zu versteuerndes Einkommen in EURO
421
+ @zve = BigDecimal.new(0)
422
+
423
+ # Zwischenfelder zu X fuer die Berechnung der Steuer nach § 39b
424
+ # Abs. 2 Satz 8 EStG in EURO.
425
+ @zx = BigDecimal.new(0)
426
+ @zzx = BigDecimal.new(0)
427
+ @hoch = BigDecimal.new(0)
428
+ @vergl = BigDecimal.new(0)
429
+
430
+ params.each do |key, value|
431
+ instance_variable_set("@#{key}", value)
432
+ end
433
+
434
+ mre4lzz
435
+ @kennz = 0
436
+ @re4lzz = @re4.subtract(@fvb).subtract(@alte).subtract(@wfundf).add(@hinzur)
437
+ @re4lzzv = @re4.subtract(@fvb).subtract(@alte)
438
+ mre4
439
+ mztabfb
440
+ mlstjahr
441
+ @lstjahr = @st
442
+ @jw = @lstjahr.multiply(ZAHL100)
443
+ upanteil
444
+ @lstlzz = @anteil1
445
+ if @zkf.compare_to(ZAHL0) == 1
446
+ @ztabfb = @ztabfb.add(@kfb)
447
+ mlstjahr
448
+ @jbmg = @st
449
+ else
450
+ @jbmg = @lstjahr
451
+ end
452
+ msolz
453
+ msonst
454
+ mvmt
455
+ end
456
+
457
+ private
458
+
459
+ def mre4lzz
460
+ if @vbez.compare_to(ZAHL0) == 0
461
+ @fvbz = ZAHL0
462
+ @fvb = ZAHL0
463
+ else
464
+ if @vjahr < 2006
465
+ @j = 1
466
+ else
467
+ if @vjahr < 2040
468
+ @j = @vjahr - 2004
469
+ else
470
+ @j = 36
471
+ end
472
+ end
473
+ if @lzz == 1
474
+ if ((@sterbe.add(@vkapa)).compare_to(ZAHL0)) == 1
475
+ @vbezb = (@vbezm.multiply(BigDecimal.value_of(@zmvb))).add(@vbezs)
476
+ @hfvb = BigDecimal.value_of(TAB2[@j] * 100)
477
+ @fvbz = BigDecimal.value_of(TAB3[@j])
478
+ else
479
+ @vbezb = (@vbezm.multiply(BigDecimal.value_of(@zmvb))).add(@vbezs)
480
+ @hfvb = BigDecimal.value_of(TAB2[@j] / 12 * @zmvb * 100)
481
+ @fvbz = (BigDecimal.value_of(TAB3[@j] / 12 * @zmvb)).set_scale(0, BigDecimal.ROUND_UP)
482
+ end
483
+ else
484
+ @vbezb = ((@vbezm.multiply(ZAHL12)).add(@vbezs)).set_scale(2, BigDecimal.ROUND_DOWN)
485
+ @hfvb = BigDecimal.value_of(TAB2[@j] * 100)
486
+ @fvbz = BigDecimal.value_of(TAB3[@j])
487
+ end
488
+ @fvb = (@vbezb.multiply(BigDecimal.value_of(TAB1[@j]))).set_scale(0, BigDecimal.ROUND_UP)
489
+ if @fvb.compare_to(@hfvb) == 1
490
+ @fvb = @hfvb
491
+ end
492
+ @jw = @fvb
493
+ upanteil
494
+ @fvb = @anteil2
495
+ end
496
+ if @alter1 == 0
497
+ @alte = ZAHL0
498
+ else
499
+ if @ajahr < 2006
500
+ @k = 1
501
+ else
502
+ if @ajahr < 2040
503
+ @k = @ajahr - 2004
504
+ else
505
+ @k = 36
506
+ end
507
+ end
508
+ @bmg = @re4.subtract(@vbez)
509
+ @alte = (@bmg.multiply(BigDecimal.value_of(TAB4[@k]))).set_scale(0, BigDecimal.ROUND_UP)
510
+ @jw = BigDecimal.value_of(TAB5[@k] * 100)
511
+ upanteil
512
+ if @alte.compare_to(@anteil2) == 1
513
+ @alte = @anteil2
514
+ end
515
+ end
516
+ end
517
+
518
+ def mre4
519
+ if @lzz == 1
520
+ @zre4 = @re4lzz.divide(ZAHL100, 2, BigDecimal.ROUND_DOWN)
521
+ @zre4vp = @re4lzzv.divide(ZAHL100, 2, BigDecimal.ROUND_DOWN)
522
+ @zvbez = (@vbez.subtract(@fvb)).divide(ZAHL100, 2, BigDecimal.ROUND_DOWN)
523
+ else
524
+ if @lzz == 2
525
+ @zre4 = ((@re4lzz.add(BigDecimal.value_of(0.67))).multiply(BigDecimal.value_of(0.12))).set_scale(2, BigDecimal.ROUND_DOWN)
526
+ @zre4vp = ((@re4lzzv.add(BigDecimal.value_of(0.67))).multiply(BigDecimal.value_of(0.12))).set_scale(2, BigDecimal.ROUND_DOWN)
527
+ @zvbez = ((@vbez.subtract(@fvb).add(BigDecimal.value_of(0.67))).multiply(BigDecimal.value_of(0.12))).set_scale(2, BigDecimal.ROUND_DOWN)
528
+ else
529
+ if @lzz == 3
530
+ @zre4 = ((@re4lzz.add(BigDecimal.value_of(0.89))).multiply(BigDecimal.value_of(3.6 / 7.0))).set_scale(2, BigDecimal.ROUND_DOWN)
531
+ @zre4vp = ((@re4lzzv.add(BigDecimal.value_of(0.89))).multiply(BigDecimal.value_of(3.6 / 7.0))).set_scale(2, BigDecimal.ROUND_DOWN)
532
+ @zvbez = ((@vbez.subtract(@fvb).add(BigDecimal.value_of(0.89))).multiply(BigDecimal.value_of(3.6 / 7.0))).set_scale(2, BigDecimal.ROUND_DOWN)
533
+ else
534
+ @zre4 = ((@re4lzz.add(BigDecimal.value_of(0.56))).multiply(BigDecimal.value_of(3.6))).set_scale(2, BigDecimal.ROUND_DOWN)
535
+ @zre4vp = ((@re4lzzv.add(BigDecimal.value_of(0.56))).multiply(BigDecimal.value_of(3.6))).set_scale(2, BigDecimal.ROUND_DOWN)
536
+ @zvbez = ((@vbez.subtract(@fvb).add(BigDecimal.value_of(0.56))).multiply(BigDecimal.value_of(3.6))).set_scale(2, BigDecimal.ROUND_DOWN)
537
+ end
538
+ end
539
+ end
540
+ if @zre4.compare_to(ZAHL0) == -1
541
+ @zre4 = ZAHL0
542
+ end
543
+ if @zvbez.compare_to(ZAHL0) == -1
544
+ @zvbez = ZAHL0
545
+ end
546
+ end
547
+
548
+ def mztabfb
549
+ @anp = ZAHL0
550
+ if @zvbez.compare_to(ZAHL0) == 1
551
+ if @zvbez.compare_to(@fvbz) == -1
552
+ @fvbz = @zvbez.set_scale(0, BigDecimal.ROUND_DOWN)
553
+ end
554
+ end
555
+ if @stkl < 6
556
+ if @zvbez.compare_to(ZAHL0) == 1
557
+ if (@zvbez.subtract(@fvbz)).compare_to(BigDecimal.value_of(102)) == -1
558
+ @anp = (@zvbez.subtract(@fvbz)).set_scale(0, BigDecimal.ROUND_DOWN)
559
+ else
560
+ @anp = BigDecimal.value_of(102)
561
+ end
562
+ end
563
+ end
564
+ if @stkl < 6
565
+ if @zre4.compare_to(@zvbez) == 1
566
+ if (@zre4.subtract(@zvbez)).compare_to(BigDecimal.value_of(920)) == -1
567
+ @anp = (@anp.add(@zre4).subtract(@zvbez)).set_scale(0, BigDecimal.ROUND_DOWN)
568
+ else
569
+ @anp = @anp.add(BigDecimal.value_of(920))
570
+ end
571
+ end
572
+ end
573
+ @kztab = 1
574
+ if @stkl == 1
575
+ @sap = BigDecimal.value_of(36)
576
+ @kfb = (@zkf.multiply(BigDecimal.value_of(5808))).set_scale(0, BigDecimal.ROUND_DOWN)
577
+ else
578
+ if @stkl == 2
579
+ @efa = BigDecimal.value_of(1308)
580
+ @sap = BigDecimal.value_of(36)
581
+ @kfb = (@zkf.multiply(BigDecimal.value_of(5808))).set_scale(0, BigDecimal.ROUND_DOWN)
582
+ else
583
+ if @stkl == 3
584
+ @kztab = 2
585
+ @sap = BigDecimal.value_of(72)
586
+ @kfb = (@zkf.multiply(BigDecimal.value_of(5808))).set_scale(0, BigDecimal.ROUND_DOWN)
587
+ else
588
+ if @stkl == 4
589
+ @sap = BigDecimal.value_of(36)
590
+ @kfb = (@zkf.multiply(BigDecimal.value_of(2904))).set_scale(0, BigDecimal.ROUND_DOWN)
591
+ else
592
+ @kfb = ZAHL0
593
+ end
594
+ end
595
+ end
596
+ end
597
+ @ztabfb = @efa.add(@anp).add(@sap).add(@fvbz)
598
+ end
599
+
600
+ def mlstjahr
601
+ if @stkl < 5
602
+ upevp
603
+ else
604
+ @vsp = ZAHL0
605
+ end
606
+ @zve = (@zre4.subtract(@ztabfb).subtract(@vsp)).set_scale(0, BigDecimal.ROUND_DOWN)
607
+ if @zve.compare_to(ZAHL1) == -1
608
+ @zve = ZAHL0
609
+ @x = ZAHL0
610
+ else
611
+ @x = @zve.divide(BigDecimal.value_of(@kztab), 0, BigDecimal.ROUND_DOWN)
612
+ end
613
+ if @stkl < 5
614
+ uptab05
615
+ else
616
+ mst5_6
617
+ end
618
+ end
619
+
620
+ def upevp
621
+ if @krv == 1
622
+ @vsp1 = ZAHL0
623
+ else
624
+ if @zre4vp.compare_to(BigDecimal.value_of(63000)) == 1
625
+ @zre4vp = BigDecimal.value_of(63000)
626
+ end
627
+ @vsp1 = (@zre4vp.multiply(BigDecimal.value_of(0.24))).set_scale(2, BigDecimal.ROUND_DOWN)
628
+ @vsp1 = (@vsp1.multiply(BigDecimal.value_of(0.0975))).set_scale(2, BigDecimal.ROUND_DOWN)
629
+ end
630
+ @vsp2 = @zre4vp.multiply(BigDecimal.value_of(0.11))
631
+ @vhb = BigDecimal.value_of(1500 * @kztab)
632
+ if @vsp2.compare_to(@vhb) == 1
633
+ @vsp2 = @vhb
634
+ end
635
+ @vspn = (@vsp1.add(@vsp2)).set_scale(0, BigDecimal.ROUND_UP)
636
+ mvsp
637
+ if @vspn.compare_to(@vsp) == 1
638
+ @vsp = @vspn.set_scale(2, BigDecimal.ROUND_DOWN)
639
+ end
640
+ end
641
+
642
+ def mvsp
643
+ if @kennz == 1
644
+ @vspo = @zre4vp1.multiply(BigDecimal.value_of(0.2))
645
+ else
646
+ @vspo = @zre4vp.multiply(BigDecimal.value_of(0.2))
647
+ end
648
+ @vspvor = BigDecimal.value_of(@kztab * 3068)
649
+ @vspmax1 = BigDecimal.value_of(@kztab * 1334)
650
+ @vspmax2 = BigDecimal.value_of(@kztab * 667)
651
+ @vspkurz = BigDecimal.value_of(@kztab * 1134)
652
+ if @krv == 1
653
+ if @vspo.compare_to(@vspkurz) == 1
654
+ @vsp = @vspkurz
655
+ else
656
+ @vsp = @vspo.set_scale(2, BigDecimal.ROUND_UP)
657
+ end
658
+ else
659
+ umvsp
660
+ end
661
+ end
662
+
663
+ def umvsp
664
+ if @kennz == 1
665
+ @vspvor = @vspvor.subtract(@zre4vp1.multiply(BigDecimal.value_of(0.16)))
666
+ else
667
+ @vspvor = @vspvor.subtract(@zre4vp.multiply(BigDecimal.value_of(0.16)))
668
+ end
669
+ if @vspvor.compare_to(ZAHL0) == -1
670
+ @vspvor = ZAHL0
671
+ end
672
+ if @vspo.compare_to(@vspvor) == 1
673
+ @vsp = @vspvor
674
+ @vsprest = @vspo.subtract(@vspvor)
675
+ if @vsprest.compare_to(@vspmax1) == 1
676
+ @vsp = @vsp.add(@vspmax1)
677
+ @vsprest = (@vsprest.subtract(@vspmax1)).divide(ZAHL2, 2, BigDecimal.ROUND_UP)
678
+ if @vsprest.compare_to(@vspmax2) == 1
679
+ @vsp = (@vsp.add(@vspmax2)).set_scale(0, BigDecimal.ROUND_UP)
680
+ else
681
+ @vsp = (@vsp.add(@vsprest)).set_scale(0, BigDecimal.ROUND_UP)
682
+ end
683
+ else
684
+ @vsp = (@vsp.add(@vsprest)).set_scale(0, BigDecimal.ROUND_UP)
685
+ end
686
+ else
687
+ @vsp = @vspo.set_scale(0, BigDecimal.ROUND_UP)
688
+ end
689
+ end
690
+
691
+ def mst5_6
692
+ @zzx = @x
693
+ if @zzx.compare_to(BigDecimal.value_of(25812)) == 1
694
+ @zx = BigDecimal.value_of(25812)
695
+ up5_6
696
+ @st = (@st.add((@zzx.subtract(BigDecimal.value_of(25812))).multiply(BigDecimal.value_of(0.42)))).set_scale(0, BigDecimal.ROUND_DOWN)
697
+ else
698
+ @zx = @zzx
699
+ up5_6
700
+ if @zzx.compare_to(BigDecimal.value_of(9144)) == 1
701
+ @vergl = @st
702
+ @zx = BigDecimal.value_of(9144)
703
+ up5_6
704
+ @hoch = (@st.add((@zzx.subtract(BigDecimal.value_of(9144))).multiply(BigDecimal.value_of(0.42)))).set_scale(0, BigDecimal.ROUND_DOWN)
705
+ if @hoch.compare_to(@vergl) == -1
706
+ @st = @hoch
707
+ else
708
+ @st = @vergl
709
+ end
710
+ end
711
+ end
712
+ end
713
+
714
+ def up5_6
715
+ @x = @zx.multiply(BigDecimal.value_of(1.25))
716
+ uptab05
717
+ @st1 = @st
718
+ @x = @zx.multiply(BigDecimal.value_of(0.75))
719
+ uptab05
720
+ @st2 = @st
721
+ @diff = (@st1.subtract(@st2)).multiply(ZAHL2)
722
+ @mist = (@zx.multiply(BigDecimal.value_of(0.15))).set_scale(0, BigDecimal.ROUND_DOWN)
723
+ if @mist.compare_to(@diff) == 1
724
+ @st = @mist
725
+ else
726
+ @st = @diff
727
+ end
728
+ end
729
+
730
+ def msolz
731
+ @solzfrei = BigDecimal.value_of(972 * @kztab)
732
+ if @jbmg.compare_to(@solzfrei) == 1
733
+ @solzj = (@jbmg.multiply(BigDecimal.value_of(5.5 / 100))).set_scale(2, BigDecimal.ROUND_DOWN)
734
+ @solzmin = (@jbmg.subtract(@solzfrei)).multiply(BigDecimal.value_of(20.0 / 100.0))
735
+ if @solzmin.compare_to(@solzj) == -1
736
+ @solzj = @solzmin
737
+ end
738
+ @jw = @solzj.multiply(ZAHL100).set_scale(0, BigDecimal.ROUND_DOWN)
739
+ upanteil
740
+ @solzlzz = @anteil1
741
+ else
742
+ @solzlzz = ZAHL0
743
+ end
744
+ if @r > 0
745
+ @jw = @jbmg.multiply(ZAHL100)
746
+ upanteil
747
+ @bk = @anteil1
748
+ else
749
+ @bk = ZAHL0
750
+ end
751
+ end
752
+
753
+ def upanteil
754
+ if @lzz == 1
755
+ @anteil1 = @jw
756
+ @anteil2 = @jw
757
+ else
758
+ if @lzz == 2
759
+ @anteil1 = @jw.divide(ZAHL12, 0, BigDecimal.ROUND_DOWN)
760
+ @anteil2 = @jw.divide(ZAHL12, 0, BigDecimal.ROUND_UP)
761
+ else
762
+ if @lzz == 3
763
+ @anteil1 = (@jw.multiply(ZAHL7)).divide(ZAHL360, 0, BigDecimal.ROUND_DOWN)
764
+ @anteil2 = (@jw.multiply(ZAHL7)).divide(ZAHL360, 0, BigDecimal.ROUND_UP)
765
+ else
766
+ @anteil1 = @jw.divide(ZAHL360, 0, BigDecimal.ROUND_DOWN)
767
+ @anteil2 = @jw.divide(ZAHL360, 0, BigDecimal.ROUND_UP)
768
+ end
769
+ end
770
+ end
771
+ end
772
+
773
+ def msonst
774
+ if @sonstb.compare_to(ZAHL0) == 1
775
+ @lzz = 1
776
+ @vbez = @jvbez
777
+ @re4 = @jre4
778
+ mre4lzz
779
+ mre4lzz2
780
+ mlstjahr
781
+ @lst1 = @st.multiply(ZAHL100)
782
+ @vbez = @jvbez.add(@vbs)
783
+ @re4 = @jre4.add(@sonstb)
784
+ @vbezs = @vbezs.add(@sterbe)
785
+ mre4lzz
786
+ mre4lzz2
787
+ mlstjahr
788
+ @lst2 = @st.multiply(ZAHL100)
789
+ @sts = @lst2.subtract(@lst1)
790
+ @solzs = @sts.multiply(BigDecimal.value_of(5.5)).divide(ZAHL100, 0, BigDecimal.ROUND_DOWN)
791
+ if @r > 0
792
+ @bks = @sts
793
+ else
794
+ @bks = ZAHL0
795
+ end
796
+ else
797
+ @sts = ZAHL0
798
+ @solzs = ZAHL0
799
+ @bks = ZAHL0
800
+ end
801
+ end
802
+
803
+ def mre4lzz2
804
+ @re4lzz = @re4.subtract(@fvb).subtract(@alte).subtract(@jfreib).add(@jhinzu)
805
+ @re4lzzv = @re4.subtract(@fvb).subtract(@alte)
806
+ mre4
807
+ mztabfb
808
+ end
809
+
810
+ def mvmt
811
+ if (@vmt.add(@vkapa)).compare_to(ZAHL0) == 1
812
+ @lzz = 1
813
+ @vbez = @jvbez.add(@vbs)
814
+ @re4 = @jre4.add(@sonstb)
815
+ mre4lzz
816
+ mre4lzz2
817
+ mlstjahr
818
+ @lst1 = @st.multiply(ZAHL100)
819
+ @vmt = @vmt.add(@vkapa)
820
+ @vbezs = @vbezs.add(@vkapa)
821
+ @vbez = @vbez.add(@vkapa)
822
+ @re4 = @jre4.add(@sonstb).add(@vmt)
823
+ mre4lzz
824
+ mre4lzz2
825
+ @kennz = 1
826
+ @zre4vp1 = @zre4vp
827
+ mlstjahr
828
+ @lst3 = @st.multiply(ZAHL100)
829
+ @vbez = @vbez.subtract(@vkapa)
830
+ @re4 = @jre4.add(@sonstb)
831
+ mre4lzz
832
+ if (@re4.subtract(@jfreib).add(@jhinzu)).compare_to(ZAHL0) == -1
833
+ @re4 = @re4.subtract(@jfreib).add(@jhinzu)
834
+ @jfreib = ZAHL0
835
+ @jhinzu = ZAHL0
836
+ @re4 = (@re4.add(@vmt)).divide(ZAHL5, 0, BigDecimal.ROUND_DOWN)
837
+ mre4lzz2
838
+ mlstjahr
839
+ @lst2 = @st.multiply(ZAHL100)
840
+ @stv = @lst2.multiply(ZAHL5)
841
+ else
842
+ @re4 = @re4.add(@vmt.divide(ZAHL5, 0, BigDecimal.ROUND_DOWN))
843
+ mre4lzz2
844
+ mlstjahr
845
+ @lst2 = @st.multiply(ZAHL100)
846
+ @stv = (@lst2.subtract(@lst1)).multiply(ZAHL5)
847
+ end
848
+ @lst3 = @lst3.subtract(@lst1)
849
+ if @lst3.compare_to(@stv) == -1
850
+ @stv = @lst3
851
+ end
852
+ @solzv = (@stv.multiply(BigDecimal.value_of(5.5))).divide(ZAHL100, 0, BigDecimal.ROUND_DOWN)
853
+ if @r > 0
854
+ @bkv = @stv
855
+ else
856
+ @bkv = ZAHL0
857
+ end
858
+ else
859
+ @stv = ZAHL0
860
+ @solzv = ZAHL0
861
+ @bkv = ZAHL0
862
+ end
863
+ end
864
+
865
+ def uptab05
866
+ if @x.compare_to(BigDecimal.value_of(7665)) == -1
867
+ @st = ZAHL0
868
+ else
869
+ if @x.compare_to(BigDecimal.value_of(12740)) == -1
870
+ @y = (@x.subtract(BigDecimal.value_of(7664))).divide(BigDecimal.value_of(10000), 6, BigDecimal.ROUND_DOWN)
871
+ @rw = @y.multiply(BigDecimal.value_of(883.74))
872
+ @rw = @rw.add(BigDecimal.value_of(1500))
873
+ @st = (@rw.multiply(@y)).set_scale(0, BigDecimal.ROUND_DOWN)
874
+ else
875
+ if @x.compare_to(BigDecimal.value_of(52152)) == -1
876
+ @y = (@x.subtract(BigDecimal.value_of(12739))).divide(BigDecimal.value_of(10000), 6, BigDecimal.ROUND_DOWN)
877
+ @rw = @y.multiply(BigDecimal.value_of(228.74))
878
+ @rw = @rw.add(BigDecimal.value_of(2397))
879
+ @rw = @rw.multiply(@y)
880
+ @st = (@rw.add(BigDecimal.value_of(989))).set_scale(0, BigDecimal.ROUND_DOWN)
881
+ else
882
+ @st = ((@x.multiply(BigDecimal.value_of(0.42))).subtract(BigDecimal.value_of(7914))).set_scale(0, BigDecimal.ROUND_DOWN)
883
+ end
884
+ end
885
+ end
886
+ @st = @st.multiply(BigDecimal.value_of(@kztab))
887
+ end
888
+
889
+ end
890
+ end
891
+ end