lohnsteuer 0.1.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.
@@ -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