lohnsteuer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,589 @@
1
+ require 'date'
2
+
3
+ class Lst2016
4
+ def self.applies?(date)
5
+ (Date.new(2016, 1, 1) .. Date.new(2016, 12, 31)).include?(date)
6
+ end
7
+
8
+ def self.calculate(params)
9
+ instance = new(params)
10
+ instance.LST2016
11
+ instance.output
12
+ end
13
+
14
+ def initialize(params)
15
+ %i(AF AJAHR ALTER1 ENTSCH F JFREIB JHINZU JRE4 JRE4ENT JVBEZ
16
+ KRV KVZ LZZ LZZFREIB LZZHINZU PKPV PKV PVS PVZ R RE4 SONSTB SONSTENT STERBE STKL
17
+ VBEZ VBEZM VBEZS VBS VJAHR VKAPA VMT ZKF ZMVB).each do |key|
18
+ instance_variable_set(:"@#{key}", params[key] || 0)
19
+ end
20
+ end
21
+
22
+ def output
23
+ %i(BK BKS BKV LSTLZZ SOLZLZZ SOLZS SOLZV STS STV VKVLZZ VKVSONST).map do |var|
24
+ [var, instance_variable_get(:"@#{var}").to_i]
25
+ end.to_h
26
+ end
27
+
28
+ # ---------- BEGIN TAX ALGORITHM ----------
29
+ # Source: https://www.bmf-steuerrechner.de/pruefdaten/pap2016.pdf
30
+ def LST2016
31
+ self.MPARA
32
+ self.MRE4JL
33
+ @VBEZBSO = 0
34
+ @KENNVMT = 0
35
+ self.MRE4
36
+ self.MRE4ABZ
37
+ self.MBERECH
38
+ self.MSONST
39
+ self.MVMT
40
+ end
41
+
42
+ def MPARA
43
+ if @KRV < 2
44
+ if @KRV == 0
45
+ @BBGRV = 74_400.0
46
+ else
47
+ @BBGRV = 64_800.0
48
+ end
49
+ @RVSATZAN = 0.0935
50
+ @TBSVORV = 0.64
51
+ end
52
+
53
+ @BBGKVPV = 50_850.0
54
+ @KVSATZAN = @KVZ / 100.0 + 0.07
55
+ @KVSATZAG = 0.07
56
+
57
+ if @PVS == 1
58
+ @PVSATZAN = 0.01675
59
+ @PVSATZAG = 0.00675
60
+ else
61
+ @PVSATZAN = 0.01175
62
+ @PVSATZAG = 0.01175
63
+ end
64
+
65
+ if @PVZ == 1
66
+ @PVSATZAN = @PVSATZAN + 0.0025
67
+ end
68
+
69
+ @W1STKL5 = 10_070.0
70
+ @W2STKL5 = 26_832.0
71
+ @W3STKL5 = 203_557.0
72
+
73
+ @GFB = 8652.0
74
+ @SOLZFREI = 972.0
75
+ end
76
+
77
+ def MRE4JL
78
+ if @LZZ == 1
79
+ @ZRE4J = @RE4 / 100.0
80
+ @ZVBEZJ = @VBEZ / 100.0
81
+ @JLFREIB = @LZZFREIB / 100.0
82
+ @JLHINZU = @LZZHINZU / 100.0
83
+ elsif @LZZ == 2
84
+ @ZRE4J = @RE4 * 12 / 100.0
85
+ @ZVBEZJ = @VBEZ * 12 / 100.0
86
+ @JLFREIB = @LZZFREIB * 12 / 100.0
87
+ @JLHINZU = @LZZHINZU * 12 / 100.0
88
+ elsif @LZZ == 3
89
+ @ZRE4J = @RE4 * 360 / 7.0 / 100.0
90
+ @ZVBEZJ = @VBEZ * 360.0 / 7.0 / 100.0
91
+ @JLFREIB = @LZZFREIB * 360.0 / 7.0 / 100.0
92
+ @JLHINZU = @LZZHINZU * 360.0 / 7.0 / 100.0
93
+ else
94
+ @ZRE4J = @RE4 * 360 / 100.0
95
+ @ZVBEZJ = @VBEZ * 360.0 / 100.0
96
+ @JLFREIB = @LZZFREIB * 360.0 / 100.0
97
+ @JLHINZU = @LZZHINZU * 360.0 / 100.0
98
+ end
99
+
100
+ if @AF == 0
101
+ @F = 1
102
+ end
103
+ end
104
+
105
+ def MRE4
106
+ if @ZVBEZJ == 0
107
+ @FVBZ = 0
108
+ @FVB = 0
109
+ @FVBZSO = 0
110
+ @FVBSO = 0
111
+ else
112
+ if @VJAHR < 2006
113
+ @J = 1
114
+ elsif @VJAHR < 2040
115
+ @J = @VJAHR - 2004
116
+ else
117
+ @J = 36
118
+ end
119
+
120
+ if @LZZ == 1
121
+ @VBEZB = @VBEZM * @ZMVB + @VBEZS
122
+ @HFVB = @TAB2_J / 12.0 * @ZMVB
123
+ @FVBZ = (@TAB3_J / 12.0 * @ZMVB).ceil.to_f
124
+ else
125
+ @VBEZB = @VBEZM * 12 + @VBEZS
126
+ @HFVB = @TAB2_J
127
+ @FVBZ = @TAB3_J
128
+ end
129
+ @FVB = (@VBEZB * @TAB1_J).ceil / 100.0
130
+ if @FVB > @HFVB
131
+ @FVB = @HFVB
132
+ end
133
+ if @FVB > @ZVBEZJ
134
+ @FVB = @ZVBEZJ
135
+ end
136
+ @FVBSO = (@FVB + @VBEZBSO * @TAB1_J).ceil / 100.0
137
+ if @FVBSO > @TAB2_J
138
+ @FVBSO = @TAB2_J
139
+ end
140
+ @HFVBZSO = (@VBEZB + @VBEZBSO) / 100.0 - @FVBSO
141
+ @FVBZSO = (@FVBZ + @VBEZBSO / 100.0).ceil.to_f
142
+ if @FVBZSO > @HFVBZSO
143
+ @FBVZSO = @HFVBZSO.ceil.to_f
144
+ end
145
+ if @FVBZSO > @TAB3_J
146
+ @FVBZSO = @TAB3_J
147
+ end
148
+ @HFVBZ = @VBEZB / 100.0 - @FVB
149
+ if @FVBZ > @HFVBZ
150
+ @FVBZ = @HFVBZ.ceil.to_f
151
+ end
152
+ end
153
+ self.MRE4ALTE
154
+ end
155
+
156
+ def MRE4ALTE
157
+ if @ALTER1 == 0
158
+ @ALTE = 0
159
+ else
160
+ if @AJAHR < 2006
161
+ @K = 1
162
+ else
163
+ if @AJAHR < 2040
164
+ @K = @AJAHR - 2004
165
+ else
166
+ @K = 36
167
+ end
168
+ end
169
+ @BMG = @ZRE4J - @ZVBEZJ
170
+ @ALTE = (@BMG * @TAB4_K).ceil.to_f
171
+ @HBALTE = @TAB5_K
172
+ if @ALTE > @HBALTE
173
+ @ALTE = @HBALTE
174
+ end
175
+ end
176
+ end
177
+
178
+ def MRE4ABZ
179
+ @ZRE4 = @ZRE4J - @FVB - @ALTE - @JLFREIB + @JLHINZU
180
+ if @ZRE4 < 0
181
+ @ZRE4 = 0
182
+ end
183
+ @ZRE4VP = @ZRE4J
184
+ if @KENNVMT == 2
185
+ @ZRE4VP = @ZRE4VP - @ENTSCH / 100.0
186
+ end
187
+ @ZVBEZ = @ZVBEZJ - @FVB
188
+ if @ZVBEZ < 0
189
+ @ZVBEZ = 0
190
+ end
191
+ end
192
+
193
+ def MBERECH
194
+ self.MZTABFB
195
+ @VFRB = (@ANP + @FVB + @FVBZ) * 100.0
196
+ self.MLSTJAHR
197
+ @WVFRB = (@ZVE - @GFB) * 100.0
198
+ if @WVFRB < 0
199
+ @WVFRB = 0
200
+ end
201
+ @LSTJAHR = @ST * @F
202
+ self.UPLSTLZZ
203
+ self.UPVKVLZZ
204
+ if @ZKF > 0
205
+ @ZTABFB = @ZTABFB + @KFB
206
+ self.MRE4ABZ
207
+ self.MLSTJAHR
208
+ @JBMG = @ST * @F
209
+ else
210
+ @JBMG = @LSTJAHR
211
+ end
212
+ self.MSOLZ
213
+ end
214
+
215
+ def MZTABFB
216
+ @ANP = 0
217
+ if @ZVBEZ >= 0
218
+ if @ZVBEZ < @FVBZ
219
+ @FVBZ = @ZVBEZ
220
+ end
221
+ end
222
+ if @STKL < 6
223
+ if @ZVBEZ > 0
224
+ if @ZVBEZ - @FVBZ < 102
225
+ @ANP = (@ZVBEZ - @FVBZ).ceil.to_f
226
+ else
227
+ @ANP = 102
228
+ end
229
+ end
230
+ else
231
+ @FVBZ = 0
232
+ @FVBZSO = 0
233
+ end
234
+ if @STKL < 6
235
+ if @ZRE4 > @ZVBEZ
236
+ if @ZRE4 - @ZVBEZ < 1000
237
+ @ANP = (@ANP + @ZRE4 - @ZVBEZ).ceil.to_f
238
+ else
239
+ @ANP = @ANP + 1000
240
+ end
241
+ end
242
+ end
243
+ @KZTAB = 1
244
+ if @STKL == 1
245
+ @SAP = 36
246
+ @KFB = @ZKF * 7248.0
247
+ elsif @STKL == 2
248
+ @EFA = 1908
249
+ @SAP = 36
250
+ @KFB = @ZKF * 7248.0
251
+ elsif @STKL == 3
252
+ @KZTAB = 2
253
+ @SAP = 36
254
+ @KFB = @ZKF * 7248.0
255
+ elsif @STKL == 4
256
+ @SAP = 36
257
+ @KFB = @ZKF * 3624.0
258
+ elsif @STKL == 5
259
+ @SAP = 36
260
+ @KFB = 0
261
+ else
262
+ @KFB = 0
263
+ end
264
+ @ZTABFB = @EFA.to_f + @ANP.to_f + @SAP.to_f + @FVBZ.to_f
265
+ end
266
+
267
+ def MLSTJAHR
268
+ self.UPEVP
269
+ if @KENNVMT != 1
270
+ @ZVE = @ZRE4 - @ZTABFB - @VSP
271
+ self.UPMLST
272
+ else
273
+ @ZVE = @ZRE4 - @ZTABFB - @VSP - @VMT / 100.0 - @VKAPA / 100.0
274
+ if @ZVE < 0
275
+ @ZVE = (@ZVE + @VMT / 100.0 + @VKAPA / 100.0) / 5.0
276
+ self.UPMLST
277
+ @ST = @ST * 5
278
+ else
279
+ self.UPMLST
280
+ @STOVMT = @ST
281
+ @ZVE = @ZVE + (@VMT + @VKAPA) / 500
282
+ self.UPMLST
283
+ @ST = (@ST - @STOVMT) * 5 + @STOVMT
284
+ end
285
+ end
286
+ end
287
+
288
+ def UPVKVLZZ
289
+ self.UPVKV
290
+ @JW = @VKV
291
+ self.UPANTEIL
292
+ @VKLZZ = @ANTEIL1
293
+ end
294
+
295
+ def UPVKV
296
+ if @PKV > 0
297
+ if @VSP2 > @VSP3
298
+ @VKV = @VSP2 * 100.0
299
+ else
300
+ @VKV = @VSP3 * 100.0
301
+ end
302
+ else
303
+ @VKV = 0
304
+ end
305
+ end
306
+
307
+ def UPLSTLZZ
308
+ @JW = @LSTJAHR * 100.0
309
+ self.UPANTEIL
310
+ @LSTLZZ = @ANTEIL1
311
+ end
312
+
313
+ def UPMLST
314
+ if @ZVE < 1
315
+ @ZVE = 0
316
+ @X = 0
317
+ else
318
+ @X = (@ZVE.to_f / @KZTAB.to_f).floor.to_f
319
+ end
320
+ if @STKL < 5
321
+ self.UPTAB16
322
+ else
323
+ self.MST5_6
324
+ end
325
+ end
326
+
327
+ def UPEVP
328
+ if @KRV > 1
329
+ @VSP1 = 0
330
+ else
331
+ if @ZRE4VP > @BBGRV
332
+ @ZRE4VP = @BBGRV
333
+ end
334
+ @VSP1 = @TBSVORV * @ZRE4VP
335
+ @VSP1 = @VSP1 * @RVSATZAN
336
+ end
337
+ @VSP2 = 0.12 * @ZRE4VP
338
+ if @STKL == 3
339
+ @VHB = 3000.0
340
+ else
341
+ @VHB = 1900.0
342
+ end
343
+ if @VSP2 > @VHB
344
+ @VSP2 = @VHB
345
+ end
346
+ @VSPN = (@VSP1 + @VSP2).ceil.to_f
347
+ self.MVSP
348
+ if @VSPN > @VSP
349
+ @VSP = @VSPN
350
+ end
351
+ end
352
+
353
+ def MVSP
354
+ if @ZRE4VP > @BBGKVPV
355
+ @ZRE4VP = @BBGKVPV
356
+ end
357
+ if @PKV > 0
358
+ if @STKL == 6
359
+ @VSP3 = 0
360
+ else
361
+ @VSP3 = @PKPV * 12.0 / 100.0
362
+ end
363
+ if @PKV == 2
364
+ @VSP3 = @VSP3 - @ZRE4VP * (@KVSATZAG + @PVSATZAG)
365
+ end
366
+ else
367
+ @VSP3 = @ZRE4VP * (@KVSATZAN + @PVSATZAN)
368
+ end
369
+ @VSP = (@VSP3 + @VSP1).ceil.to_f
370
+ end
371
+
372
+ def MST5_6
373
+ @ZZX = @X
374
+ if @ZZX > @W2STKL5
375
+ @ZX = @W2STKL5
376
+ self.UP5_6
377
+ if @ZZX > @W3STKL5
378
+ @ST = (@ST + (@W3STKL5 - @W2STKL5) * 0.42).floor.to_f
379
+ @ST = (@ST + (@ZZX - @W3STKL5) * 0.45).floor.to_f
380
+ else
381
+ @ST = (@ST + (@ZZX - @W2STKL5) * 0.42).floor.to_f
382
+ end
383
+ else
384
+ @ZX = @ZZX
385
+ self.UP5_6
386
+ if @ZZX > @W1STKL5
387
+ @VERGL = @ST
388
+ @ZX = @W1STKL5
389
+ self.UP5_6
390
+ @HOCH = (@ST + (@ZZX - @W1STKL5) * 0.42).floor.to_f
391
+ if @HOCH < @VERGL
392
+ @ST = @HOCH
393
+ else
394
+ @ST = @VERGL
395
+ end
396
+ end
397
+ end
398
+ end
399
+
400
+ def UP5_6
401
+ @X = @ZX * 1.25
402
+ self.UPTAB16
403
+ @ST1 = @ST
404
+ @X = @ZX * 0.75
405
+ self.UPTAB16
406
+ @ST2 = @ST
407
+ @DIFF = (@ST1 - @ST2) * 2
408
+ @MIST = (@ZX * 0.14).floor.to_f
409
+ if @MIST > @DIFF
410
+ @ST = @MIST
411
+ else
412
+ @ST = @DIFF
413
+ end
414
+ end
415
+
416
+ def MSOLZ
417
+ @SOLZFREI = @SOLZFREI * @KZTAB
418
+ if @JBMG > @SOLZFREI
419
+ @SOLZJ = (@JBMG * 5.5).floor / 100.0
420
+ @SOLZMIN = (@JBMG - @SOLZFREI) * 20.0 / 100.0
421
+ if @SOLZMIN < @SOLZJ
422
+ @SOLZJ = @SOLZMIN
423
+ end
424
+ @JW = @SOLZJ * 100.0
425
+ self.UPANTEIL
426
+ @SOLZLZZ = @ANTEIL1
427
+ else
428
+ @SOLZLZZ = 0
429
+ end
430
+ if @R > 0
431
+ @JW = @JBMG * 100.0
432
+ self.UPANTEIL
433
+ @BK = @ANTEIL1
434
+ else
435
+ @BK = 0
436
+ end
437
+ end
438
+
439
+ def UPANTEIL
440
+ if @LZZ == 1
441
+ @ANTEIL1= @JW
442
+ elsif @LZZ == 2
443
+ @ANTEIL1 = (@JW / 12.0).floor.to_f
444
+ elsif @LZZ == 3
445
+ @ANTEIL1 = (@JW * 7.0 / 360).floor.to_f
446
+ else
447
+ @ANTEIL1 = (@JW / 360.0).floor.to_f
448
+ end
449
+ end
450
+
451
+ def MSONST
452
+ @LZZ = 1
453
+ if @ZMVB == 0
454
+ @ZMVB = 12
455
+ end
456
+ if @SONSTB == 0
457
+ @VKVSONST = 0
458
+ @LSTSO = 0
459
+ @STS = 0
460
+ @SOLZS = 0
461
+ @BKS = 0
462
+ else
463
+ self.MOSONST
464
+ self.UPVKV
465
+ @VKVSONST = @VKV
466
+ @ZRE4J = (@JRE4 + @SONSTB) / 100.0
467
+ @ZVBEZJ = (@JVBEZ + @VBS) / 100.0
468
+ @VBEZBSO = @STERBE
469
+ self.MRE4SONST
470
+ self.MLSTJAHR
471
+ @WVFRBM = (@ZVE - @GFB) * 100.0
472
+ if @WVFRBM < 0
473
+ @WVFRBM = 0
474
+ end
475
+ self.UPVKV
476
+ @VKVSONST = @VKV - @VKVSONST
477
+ @LSTSO = @ST * 100.0
478
+ @STS = ((@LSTSO - @LSTOSO) * @F).floor.to_f
479
+ if @STS < 0
480
+ @STS = 0
481
+ end
482
+ @SOLZS = (@STS * 5.5).floor / 100.0
483
+ if @R > 0
484
+ @BKS = @STS
485
+ else
486
+ @BKS = 0
487
+ end
488
+ end
489
+ end
490
+
491
+ def MVMT
492
+ if @VKAPA < 0
493
+ @VKAPA = 0
494
+ end
495
+ if @VMT + @VKAPA > 0
496
+ if @LSTSO == 0
497
+ self.MOSONST
498
+ @LST1 = @LSTOSO
499
+ else
500
+ @LST1 = @LSTSO
501
+ end
502
+ @VBEZBSO = @STERBE + @VKAPA
503
+ @ZRE4J = (@JRE4 + @SONSTB + @VMT + @VKAPA) / 100.0
504
+ @ZVBEZJ = (@JVBEZ + @VBS + @VKAPA) / 100.0
505
+ @KENNVMT = 2
506
+ self.MRE4SONST
507
+ self.MLSTJAHR
508
+ @LST3 = @ST * 100.0
509
+ self.MRE4ABZ
510
+ @ZRE4VP = @ZRE4VP - @JRE4ENT / 100.0 - @SONSTENT / 100.0
511
+ @KENNVMT = 1
512
+ self.MLSTJAHR
513
+ @LST2 = @ST * 100.0
514
+ @STV = @LST2 - @LST1
515
+ @LST3 = @LST3 - @LST1
516
+ if @LST3 < @STV
517
+ @STV = @LST3
518
+ end
519
+ if @STV < 0
520
+ @STV = 0
521
+ else
522
+ @STV = (@STV * @F).floor.to_f
523
+ end
524
+ @SOLZV = (@STV * 5.5).floor / 100.0
525
+ if @R > 0
526
+ @BKV = @STV
527
+ else
528
+ @BKV = 0
529
+ end
530
+ else
531
+ @STV = 0
532
+ @SOLZV = 0
533
+ @BKV = 0
534
+ end
535
+ end
536
+
537
+ def MOSONST
538
+ @ZRE4J = @JRE4 / 100.0
539
+ @ZVBEZJ = @JVBEZ / 100.0
540
+ @JLFREIB = @JFREIB / 100.0
541
+ @JLHINZU = @JHINZU / 100.0
542
+ self.MRE4
543
+ self.MRE4ABZ
544
+ @ZRE4VP = @ZRE4VP - @JRE4ENT / 100.0
545
+ self.MZTABFB
546
+ @VFRBS1 = (@ANP + @FVB + @FVBZ) * 100.0
547
+ self.MLSTJAHR
548
+ @WVFRBO = (@ZVE - @GFB) * 100.0
549
+ if @WVFRBO < 0
550
+ @WVFRBO = 0
551
+ end
552
+ @LSTOSO = @ST * 100
553
+ end
554
+
555
+ def MRE4SONST
556
+ self.MRE4
557
+ @FVB = @FVBSO
558
+ self.MRE4ABZ
559
+ @ZRE4VP = @ZRE4VP - @JRE4ENT / 100.0 - @SONSTENT / 100.0
560
+ @FVBZ = @FVBZSO
561
+ self.MZTABFB
562
+ @VFRBS2 = (@ANP + @FVB + @FVBZ) * 100.0 - @VFRBS1
563
+ end
564
+
565
+ def UPTAB16
566
+ if @X < @GFB + 1
567
+ @ST = 0
568
+ else
569
+ if @X < 13_670
570
+ @Y = (@X - @GFB) / 10_000
571
+ @RW = @Y * 993.62
572
+ @RW = @RW + 1_400.0
573
+ @ST = (@RW * @Y).floor
574
+ elsif @X < 53_666
575
+ @Y = (@X - 13_669.0) / 10_000
576
+ @RW = (@Y * 225.40)
577
+ @RW = @RW + 2_397.0
578
+ @RW = @RW * @Y
579
+ @ST = (@RW + 952.48).floor
580
+ elsif @X < 254_447
581
+ @ST = (@X * 0.42 - 8394.14).floor
582
+ else
583
+ @ST = (@X * 0.45 - 16_027.52).floor
584
+ end
585
+ @ST = @ST * @KZTAB
586
+ end
587
+ end
588
+ # ---------- END TAX ALGORITHM ----------
589
+ end