lohnsteuer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 321bf44d23f2ad5949894db1d064e40e16c00621
4
+ data.tar.gz: 413231ddc70154bb1fc5f1ece5548baa4105f367
5
+ SHA512:
6
+ metadata.gz: e9f35abf1698bd2553319ef64d8e0a6d322100b1eada5e516bcaa60edc00804eeb5f33c14d5603b13746307639d2169cb824dc4d3106853d3dbb892dff9ef11a
7
+ data.tar.gz: 9c9269d60a18e96386add45b4b728ce08f9a5ef1a39b72a7fdf93cd70e297553277b55317d2daa19ddbccdd45a67bcd7f9efad4d3df361aa7d3aa203be099e48
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
@@ -0,0 +1 @@
1
+ 2.1.5
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in lohnsteuer.gemspec
4
+ gemspec
@@ -0,0 +1,32 @@
1
+ # Lohnsteuer
2
+
3
+ This is a Ruby implementation of the german income tax calculation
4
+ algorithm.
5
+
6
+ The algorithm gets updated by the "Bundesministerium der Finanzen" yearly (sometimes multiple times a year).
7
+ Currently following implementations are supported:
8
+
9
+ * [LST1215](lib/lohnsteuer/lst1215.rb) (for December 2015)
10
+ * [LST2016](lib/lohnsteuer/lst2016.rb) (for 2016)
11
+
12
+ ## Usage
13
+
14
+ ```ruby
15
+ require 'lohnsteuer'
16
+
17
+ Lohnsteuer.calculate(2016, 40000, tax_class: 1)
18
+ ```
19
+
20
+ ## Contributing
21
+
22
+ The algorithms where implemented by translating the program flowcharts
23
+ published by the [Bundesministerium der Finanzen](https://www.bmf-steuerrechner.de/)
24
+ into Ruby code.
25
+ The algorithms weren't modified on purpose to enable updates and verification.
26
+
27
+ **State of the project**: Experimental. The interface needs to stabilize.
28
+
29
+ ## Related projects
30
+
31
+ * [vschoettke/node-lohnsteuer](https://github.com/vschoettke/lohnsteuer): Node.js implementation
32
+ * [MarcelLehmann/Lohnsteuer](https://github.com/MarcelLehmann/Lohnsteuer): Java implementation
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.test_files = FileList['test/*test.rb']
6
+ end
@@ -0,0 +1,62 @@
1
+ # coding: utf-8
2
+ require 'date'
3
+ require 'lohnsteuer/version'
4
+ require 'lohnsteuer/lst1215'
5
+ require 'lohnsteuer/lst2016'
6
+
7
+ module Lohnsteuer
8
+ def self.tax_algorithms
9
+ [Lst2016, Lst1215]
10
+ end
11
+
12
+ def self.calculate_month(year, month, monthly_salary, options = {})
13
+ params = {
14
+ # The tax class must be 1, 2, 3, 4, 5 or 6.
15
+ STKL: options[:tax_class] || 1,
16
+
17
+ # Monthly salary in Euro cent.
18
+ RE4: monthly_salary * 100.0,
19
+
20
+ # Configure the algorithm to calculate monthly taxes.
21
+ LZZ: 2,
22
+
23
+ # Health insurance state.
24
+ # 0 = general health insurance.
25
+ # 1 = private health insurance without employer supplement.
26
+ # 2 = private health insurance with employer supplement.
27
+ PKV: options[:health_insurance_state] || 0,
28
+
29
+ # Additional contribution rate to the general health insurance.
30
+ KVZ: options[:additional_contribution_rate] || 1.10,
31
+
32
+ # Allow to deselect the calculation of the nursing care insurance.
33
+ PVZ: options[:no_nursing_care_insurance] ? 0 : 1,
34
+
35
+ # Number of children eligible for the children allowance.
36
+ ZKF: options[:children] || 0
37
+ }
38
+
39
+ algorithm = tax_algorithms.find { |c| c.applies?(Date.new(year, month, 1)) }
40
+ fail "No tax algorithm found for #{month}/#{year}" unless algorithm
41
+
42
+ res = algorithm.calculate(params)
43
+
44
+ total_income_tax = (res[:LSTLZZ] || 0) + (res[:STS] || 0) + (res[:STV] || 0)
45
+ total_solidarity_tax = (res[:SOLZLZZ] || 0) + (res[:SOLZS] || 0) + (res[:SOLZV] || 0)
46
+
47
+ {
48
+ income_tax: total_income_tax / 100.0,
49
+ solidarity_tax: total_solidarity_tax / 100.0
50
+ }
51
+ end
52
+
53
+ def self.calculate(year, annual_salary, options = {})
54
+ (1..12).map do |month|
55
+ calculate_month(year, month, annual_salary / 12.0, options)
56
+ end.inject(income_tax: 0, solidarity_tax: 0) do |res, item|
57
+ res[:income_tax] = res[:income_tax] + item[:income_tax]
58
+ res[:solidarity_tax] = res[:solidarity_tax] + item[:solidarity_tax]
59
+ res
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,710 @@
1
+ require 'date'
2
+
3
+ class Lst1215
4
+ def self.applies?(date)
5
+ (Date.new(2015, 12, 1) .. Date.new(2015, 12, 31)).include?(date)
6
+ end
7
+
8
+ def self.calculate(params)
9
+ instance = new(params)
10
+ instance.LST1215
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/pap2015Dezember.pdf
30
+ def LST1215
31
+ self.MPARA
32
+ self.MRE4JL
33
+ @VBEZBSO = 0
34
+ @KENNVMT = 0
35
+ self.MRE4
36
+ self.MRE4ABZ
37
+ @ZRE4VPM = @ZRE4VP
38
+ @SCHLEIFZ = 1
39
+ self.MBERECH
40
+ @SCHLEIFZ = 2
41
+ @W1STKL5 = 9_873
42
+ @ZRE4VP = @ZRE4VPM
43
+ self.MBERECH
44
+ self.MLST1215
45
+ self.MSONST
46
+ self.MVMT
47
+ end
48
+
49
+ def MPARA
50
+ if @KRV < 2
51
+ if @KRV == 0
52
+ @BBGRV = 72_600.0
53
+ else
54
+ @BBGRV = 62_400.0
55
+ end
56
+ @RVSATZAN = 0.0935
57
+ @TBSVORV = 0.60
58
+ end
59
+
60
+ @BBGKVPV = 49_500.0
61
+ @KVSATZAN = @KVZ / 100.0 + 0.07
62
+ @KVSATZAG = 0.07
63
+
64
+ if @PVS == 1
65
+ @PVSATZAN = 0.01675
66
+ @PVSATZAG = 0.00675
67
+ else
68
+ @PVSATZAN = 0.01175
69
+ @PVSATZAG = 0.01175
70
+ end
71
+
72
+ if @PVZ == 1
73
+ @PVSATZAN = @PVSATZAN + 0.0025
74
+ end
75
+
76
+ @W1STKL5 = 9_763
77
+ @W2STKL5 = 26_441
78
+ @W3STKL5 = 200_584
79
+ end
80
+
81
+ def MRE4JL
82
+ if @LZZ == 1
83
+ @ZRE4J = @RE4 / 100.0
84
+ @ZVBEZJ = @VBEZ / 100.0
85
+ @JLFREIB = @LZZFREIB / 100.0
86
+ @JLHINZU = @LZZHINZU / 100.0
87
+ elsif @LZZ == 2
88
+ @ZRE4J = @RE4 * 12 / 100.0
89
+ @ZVBEZJ = @VBEZ * 12 / 100.0
90
+ @JLFREIB = @LZZFREIB * 12 / 100.0
91
+ @JLHINZU = @LZZHINZU * 12 / 100.0
92
+ elsif @LZZ == 3
93
+ @ZRE4J = @RE4 * 360 / 7.0 / 100.0
94
+ @ZVBEZJ = @VBEZ * 360.0 / 7.0 / 100.0
95
+ @JLFREIB = @LZZFREIB * 360.0 / 7.0 / 100.0
96
+ @JLHINZU = @LZZHINZU * 360.0 / 7.0 / 100.0
97
+ else
98
+ @ZRE4J = @RE4 * 360 / 100.0
99
+ @ZVBEZJ = @VBEZ * 360.0 / 100.0
100
+ @JLFREIB = @LZZFREIB * 360.0 / 100.0
101
+ @JLHINZU = @LZZHINZU * 360.0 / 100.0
102
+ end
103
+
104
+ if @AF == 0
105
+ @F = 1
106
+ end
107
+ end
108
+
109
+ def MRE4
110
+ if @ZVBEZJ == 0
111
+ @FVBZ = 0
112
+ @FVB = 0
113
+ @FVBZSO = 0
114
+ @FVBSO = 0
115
+ else
116
+ if @VJAHR < 2006
117
+ @J = 1
118
+ elsif @VJAHR < 2040
119
+ @J = @VJAHR - 2004
120
+ else
121
+ @J = 36
122
+ end
123
+
124
+ if @LZZ == 1
125
+ @VBEZB = @VBEZM * @ZMVB + @VBEZS
126
+ @HFVB = @TAB2_J / 12.0 * @ZMVB
127
+ @FVBZ = (@TAB3_J / 12.0 * @ZMVB).ceil.to_f
128
+ else
129
+ @VBEZB = @VBEZM * 12 + @VBEZS
130
+ @HFVB = @TAB2_J
131
+ @FVBZ = @TAB3_J
132
+ end
133
+ @FVB = (@VBEZB * @TAB1_J).ceil / 100.0
134
+ if @FVB > @HFVB
135
+ @FVB = @HFVB
136
+ end
137
+ @FVBSO = (@FVB + @VBEZBSO * @TAB1_J).ceil / 100.0
138
+ if @FVBSO > @TAB2_J
139
+ @FVBSO = @TAB2_J
140
+ end
141
+ @HFVBZSO = (@VBEZB + @VBEZBSO) / 100.0 - @FVBSO
142
+ @FVBZSO = (@FVBZ + @VBEZBSO / 100.0).ceil.to_f
143
+ if @FVBZSO > @HFVBZSO
144
+ @FBVZSO = @HFVBZSO.ceil.to_f
145
+ end
146
+ if @FVBZSO > @TAB3_J
147
+ @FVBZSO = @TAB3_J
148
+ end
149
+ @HFVBZ = @VBEZB / 100.0 - @FVB
150
+ if @FVBZ > @HFVBZ
151
+ @FVBZ = @HFVBZ.ceil.to_f
152
+ end
153
+ end
154
+ self.MRE4ALTE
155
+ end
156
+
157
+ def MRE4ALTE
158
+ if @ALTER1 == 0
159
+ @ALTE = 0
160
+ else
161
+ if @AJAHR < 2006
162
+ @K = 1
163
+ elsif @AJAHR < 2040
164
+ @K = @AJAHR - 2004
165
+ else
166
+ @K = 36
167
+ end
168
+ @BMG = @ZRE4J - @ZVBEZJ
169
+ @ALTE = (@BMG * @TAB4_K).ceil.to_f
170
+ @HBALTE = @TAB5_K
171
+ if @ALTE > @HBALTE
172
+ @ALTE = @HBALTE
173
+ end
174
+ end
175
+ end
176
+
177
+ def MRE4ABZ
178
+ @ZRE4 = @ZRE4J - @FVB - @ALTE - @JLFREIB + @JLHINZU
179
+ if @ZRE4 < 0
180
+ @ZRE4 = 0
181
+ end
182
+ @ZRE4VP = @ZRE4J
183
+ if @KENNVMT == 2
184
+ @ZRE4VP = @ZRE4VP - @ENTSCH / 100.0
185
+ end
186
+ @ZVBEZ = @ZVBEZJ - @FVB
187
+ if @ZVBEZ < 0
188
+ @ZVBEZ = 0
189
+ end
190
+ end
191
+
192
+ def MBERECH
193
+ if @SCHLEIFZ == 1
194
+ self.MZTABFBA
195
+ else
196
+ self.MZTABFBN
197
+ end
198
+ self.MLSTJAHR
199
+ @LSTJAHR = @ST * @F
200
+ self.UPLSTLZZ
201
+ self.UPVKVLZZ
202
+ if @ZKF > 0
203
+ @ZTABFB = @ZTABFB + @KFB
204
+ self.MRE4ABZ
205
+ self.MLSTJAHR
206
+ @JBMG = @ST * @F
207
+ else
208
+ @JBMG = @LSTJAHR
209
+ end
210
+ self.MSOLZ
211
+ end
212
+
213
+ def MZTABFBA
214
+ @ANP = 0
215
+ if @ZVBEZ >= 0
216
+ if @ZVBEZ < @FVBZ
217
+ @FVBZ = @ZVBEZ
218
+ end
219
+ end
220
+ if @STKL < 6
221
+ if @ZVBEZ > 0
222
+ if @ZVBEZ - @FVBZ < 102
223
+ @ANP = (@ZVBEZ - @FVBZ).ceil.to_f
224
+ else
225
+ @ANP = 102
226
+ end
227
+ end
228
+ else
229
+ @FVBZ = 0
230
+ @FVBZSO = 0
231
+ end
232
+ if @STKL < 6
233
+ if @ZRE4 > @ZVBEZ
234
+ if @ZRE4 - @ZVBEZ < 1000
235
+ @ANP = (@ANP + @ZRE4 - @ZVBEZ).ceil.to_f
236
+ else
237
+ @ANP = @ANP + 1000
238
+ end
239
+ end
240
+ end
241
+ @KZTAB = 1
242
+ if @STKL == 1
243
+ @SAP = 36.0
244
+ @KFB = @ZKF * 7008.0
245
+ elsif @STKL == 2
246
+ @EFA = 1308.0
247
+ @SAP = 36.0
248
+ @KFB = @ZKF * 7008.0
249
+ elsif @STKL == 3
250
+ @KZTAB = 2
251
+ @SAP = 36
252
+ @KFB = @ZKF * 7008.0
253
+ elsif @STKL == 4
254
+ @SAP = 36
255
+ @KFB = @ZKF * 3504.0
256
+ elsif @STKL == 5
257
+ @SAP = 36
258
+ @KFB = 0
259
+ else
260
+ @KFB = 0
261
+ end
262
+ @ZTABFB = @EFA.to_f + @ANP.to_f + @SAP.to_f + @FVBZ.to_f
263
+ end
264
+
265
+ def MZTABFBN
266
+ @ANP = 0
267
+ if @ZVBEZ >= 0
268
+ if @ZVBEZ < @FVBZ
269
+ @FVBZ = @ZVBEZ
270
+ end
271
+ end
272
+ if @STKL < 6
273
+ if @ZVBEZ > 0
274
+ if @ZVBEZ - @FVBZ < 102
275
+ @ANP = (@ZVBEZ - @FVBZ).ceil
276
+ else
277
+ @ANP = 102
278
+ end
279
+ end
280
+ else
281
+ @FVBZ = 0
282
+ @FVBZSO = 0
283
+ end
284
+ if @STKL < 6
285
+ if @ZRE4 > @ZVBEZ
286
+ if @ZRE4 - @ZVBEZ < 1000
287
+ @ANP = @ANP + @ZRE4 - @ZVBEZ
288
+ else
289
+ @ANP = @ANP + 1000
290
+ end
291
+ end
292
+ end
293
+ @KZTAB = 1
294
+ if @STKL == 1
295
+ @SAP = 36
296
+ @KFB = @ZKF * 7152.0
297
+ elsif @STKL == 2
298
+ @EFA = 1908
299
+ @SAP = 36
300
+ @KFB = @ZKF * 7152.0
301
+ elsif @STKL == 3
302
+ @KZTAB = 2
303
+ @SAP = 36
304
+ @KFB = @ZKF * 7152.0
305
+ elsif @STKL == 4
306
+ @SAP = 36
307
+ @KFB = @ZKF * 3576.0
308
+ elsif @STKL == 5
309
+ @SAP = 36
310
+ @KFB = 0
311
+ else
312
+ @KFB = 0
313
+ end
314
+ @ZTABFB = @EFA.to_f + @ANP.to_f + @SAP.to_f + @FVBZ.to_f
315
+ end
316
+
317
+ def MLSTJAHR
318
+ self.UPEVP
319
+ if @KENNVMT != 1
320
+ @ZVE = @ZRE4 - @ZTABFB - @VSP
321
+ self.UPMLST
322
+ else
323
+ @ZVE = @ZRE4 - @ZTABFB - @VSP - @VMT / 100.0 - @VKAPA / 100.0
324
+ if @ZVE < 0
325
+ @ZVE = (@ZVE + @VMT / 100.0 + @VKAPA / 100.0) / 5.0
326
+ self.UPMLST
327
+ @ST = @ST * 5
328
+ else
329
+ self.UPMLST
330
+ @STOVMT = @ST
331
+ @ZVE = @ZVE + (@VMT + @VKAPA) / 500
332
+ self.UPMLST
333
+ @ST = (@ST - @STOVMT) * 5 + @STOVMT
334
+ end
335
+ end
336
+ end
337
+
338
+ def UPVKVLZZ
339
+ self.UPVKV
340
+ @JW = @VKV
341
+ self.UPANTEIL
342
+ @VKLZZ = @ANTEIL1
343
+ end
344
+
345
+ def UPVKV
346
+ if @PKV > 0
347
+ if @VSP2 > @VSP3
348
+ @VKV = @VSP2 * 100.0
349
+ else
350
+ @VKV = @VSP3 * 100.0
351
+ end
352
+ else
353
+ @VKV = 0
354
+ end
355
+ end
356
+
357
+ def UPLSTLZZ
358
+ @JW = @LSTJAHR * 100.0
359
+ if @SCHLEIFZ == 1
360
+ @JWLSTA = @JW
361
+ else
362
+ @JWLSTN = @JW
363
+ end
364
+ self.UPANTEIL
365
+ @LSTLZZ = @ANTEIL1
366
+ end
367
+
368
+ def UPMLST
369
+ if @ZVE < 1
370
+ @ZVE = 0
371
+ @X = 0
372
+ else
373
+ @X = (@ZVE.to_f / @KZTAB.to_f).floor.to_f
374
+ end
375
+ if @STKL < 5
376
+ if @SCHLEIFZ == 1
377
+ self.UPTAB14
378
+ else
379
+ self.UPTAB15
380
+ end
381
+ else
382
+ self.MST5_6
383
+ end
384
+ end
385
+
386
+ def UPEVP
387
+ if @KRV > 1
388
+ @VSP1 = 0
389
+ else
390
+ if @ZRE4VP > @BBGRV
391
+ @ZRE4VP = @BBGRV
392
+ end
393
+ @VSP1 = @TBSVORV * @ZRE4VP
394
+ @VSP1 = @VSP1 * @RVSATZAN
395
+ end
396
+ @VSP2 = 0.12 * @ZRE4VP
397
+ if @STKL == 3
398
+ @VHB = 3000.0
399
+ else
400
+ @VHB = 1900.0
401
+ end
402
+ if @VSP2 > @VHB
403
+ @VSP2 = @VHB
404
+ end
405
+ @VSPN = (@VSP1 + @VSP2).ceil.to_f
406
+ self.MVSP
407
+ if @VSPN > @VSP
408
+ @VSP = @VSPN
409
+ end
410
+ end
411
+
412
+ def MVSP
413
+ if @ZRE4VP > @BBGKVPV
414
+ @ZRE4VP = @BBGKVPV
415
+ end
416
+ if @PKV > 0
417
+ if @STKL == 6
418
+ @VSP3 = 0
419
+ else
420
+ @VSP3 = @PKPV * 12.0 / 100.0
421
+ if @PKV == 2
422
+ @VSP3 = @VSP3 - @ZRE4VP * (@KVSATZAG + @PVSATZAG)
423
+ end
424
+ end
425
+ else
426
+ @VSP3 = @ZRE4VP * (@KVSATZAN + @PVSATZAN)
427
+ end
428
+ @VSP = (@VSP3 + @VSP1).ceil.to_f
429
+ end
430
+
431
+ def MST5_6
432
+ @ZZX = @X
433
+ if @ZZX > @W2STKL5
434
+ @ZX = @W2STKL5
435
+ self.UP5_6
436
+ if @ZZX > @W3STKL5
437
+ @ST = (@ST + (@W3STKL5 - @W2STKL5) * 0.42).floor.to_f
438
+ @ST = (@ST + (@ZZX - @W3STKL5) * 0.45).floor.to_f
439
+ else
440
+ @ST = (@ST + (@ZZX - @W2STKL5) * 0.42).floor.to_f
441
+ end
442
+ else
443
+ @ZX = @ZZX
444
+ self.UP5_6
445
+ if @ZZX > @W1STKL5
446
+ @VERGL = @ST
447
+ @ZX = @W1STKL5
448
+ self.UP5_6
449
+ @HOCH = (@ST + (@ZZX - @W1STKL5) * 0.42).floor.to_f
450
+ if @HOCH < @VERGL
451
+ @ST = @HOCH
452
+ else
453
+ @ST = @VERGL
454
+ end
455
+ end
456
+ end
457
+ end
458
+
459
+ def UP5_6
460
+ @X = @ZX * 1.25
461
+ if @SCHLEIFZ == 1
462
+ self.UPTAB14
463
+ else
464
+ self.UPTAB15
465
+ end
466
+ @ST1 = @ST
467
+ @X = @ZX * 0.75
468
+ if @SCHLEIFZ == 1
469
+ self.UPTAB14
470
+ else
471
+ self.UPTAB15
472
+ end
473
+ @ST2 = @ST
474
+ @DIFF = (@ST1 - @ST2) * 2
475
+ @MIST = (@ZX * 0.14).floor.to_f
476
+ if @MIST > @DIFF
477
+ @ST = @MIST
478
+ else
479
+ @ST = @DIFF
480
+ end
481
+ end
482
+
483
+ def MSOLZ
484
+ @SOLZFREI = 972.0 * @KZTAB
485
+ if @JBMG > @SOLZFREI
486
+ @SOLZJ = (@JBMG * 5.5).floor / 100.0
487
+ @SOLZMIN = (@JBMG - @SOLZFREI) * 20.0 / 100.0
488
+ if @SOLZMIN < @SOLZJ
489
+ @SOLZJ = @SOLZMIN
490
+ end
491
+ @JW = @SOLZJ * 100.0
492
+ if @SCHLEIFZ == 1
493
+ @JWSOLZA = @JW
494
+ else
495
+ @JWSOLZN = @JW
496
+ end
497
+ self.UPANTEIL
498
+ @SOLZLZZ = @ANTEIL1
499
+ else
500
+ @SOLZLZZ = 0
501
+ end
502
+ if @R > 0
503
+ @JW = @JBMG * 100.0
504
+ if @SCHLEIFZ == 1
505
+ @JWBKA = @JW
506
+ else
507
+ @JWBKN = @JW
508
+ end
509
+ self.UPANTEIL
510
+ @BK = @ANTEIL1
511
+ else
512
+ @BK = 0
513
+ end
514
+ end
515
+
516
+ def MLST1215
517
+ if @LZZ > 1
518
+ @JW = @JWLSTN - 11 * (@JWLSTA - @JWLSTN)
519
+ if @JW < 0
520
+ @ANTEIL1 = 0
521
+ else
522
+ self.UPANTEIL
523
+ end
524
+ @LSTLZZ = @ANTEIL1
525
+ @JW = @JWSOLZN - 11 * (@JWSOLZA - @JWSOLZN)
526
+ if @JW < 0
527
+ @ANTEIL1 = 0
528
+ else
529
+ self.UPANTEIL
530
+ end
531
+ @SOLZLZZ = @ANTEIL1
532
+ @JW = @JWBKN.to_f - 11 * (@JWBKA.to_f - @JWBKN.to_f)
533
+ if @JW < 0
534
+ @ANTEIL1 = 0
535
+ else
536
+ self.UPANTEIL
537
+ end
538
+ @BK = @ANTEIL1
539
+ end
540
+ end
541
+
542
+ def UPANTEIL
543
+ if @LZZ == 1
544
+ @ANTEIL1= @JW
545
+ elsif @LZZ == 2
546
+ @ANTEIL1 = (@JW / 12.0).floor.to_f
547
+ elsif @LZZ == 3
548
+ @ANTEIL1 = (@JW * 7.0 / 360).floor.to_f
549
+ else
550
+ @ANTEIL1 = (@JW / 360.0).floor.to_f
551
+ end
552
+ end
553
+
554
+ def MSONST
555
+ @LZZ = 1
556
+ if @ZMVB == 0
557
+ @ZMVB = 12
558
+ end
559
+ if @SONSTB == 0
560
+ @VKVSONST = 0
561
+ @LSTSO = 0
562
+ @STS = 0
563
+ @SOLZS = 0
564
+ @BKS = 0
565
+ else
566
+ self.MOSONST
567
+ self.UPVKV
568
+ @VKVSONST = @VKV
569
+ @ZRE4J = (@JRE4 + @SONSTB) / 100.0
570
+ @ZVBEZJ = (@JVBEZ + @VBS) / 100.0
571
+ @VBEZBSO = @STERBE
572
+ self.MRE4SONST
573
+ self.MLSTJAHR
574
+ @WVFRBM = (@ZVE - @GFB) * 100.0
575
+ if @WVFRBM < 0
576
+ @WVFRBM = 0
577
+ end
578
+ self.UPVKV
579
+ @VKVSONST = @VKV - @VKVSONST
580
+ @LSTSO = @ST * 100.0
581
+ @STS = ((@LSTSO - @LSTOSO) * @F).floor.to_f
582
+ if @STS < 0
583
+ @STS = 0
584
+ end
585
+ @SOLZS = (@STS * 5.5).floor / 100.0
586
+ if @R > 0
587
+ @BKS = @STS
588
+ else
589
+ @BKS = 0
590
+ end
591
+ end
592
+ end
593
+
594
+ def MVMT
595
+ if @VKAPA < 0
596
+ @VKAPA = 0
597
+ end
598
+ if @VMT + @VKAPA > 0
599
+ if @LSTSO == 0
600
+ self.MOSONST
601
+ @LST1 = @LSTOSO
602
+ else
603
+ @LST1 = @LSTSO
604
+ end
605
+ @VBEZBSO = @STERBE + @VKAPA
606
+ @ZRE4J = (@JRE4 + @SONSTB + @VMT + @VKAPA) / 100.0
607
+ @ZVBEZJ = (@JVBEZ + @VBS + @VKAPA) / 100.0
608
+ @KENNVMT = 2
609
+ self.MRE4SONST
610
+ self.MLSTJAHR
611
+ @LST3 = @ST * 100.0
612
+ self.MRE4ABZ
613
+ @ZRE4VP = @ZRE4VP - @JRE4ENT / 100.0 - @SONSTENT / 100.0
614
+ @KENNVMT = 1
615
+ self.MLSTJAHR
616
+ @LST2 = @ST * 100.0
617
+ @STV = @LST2 - @LST1
618
+ @LST3 = @LST3 - @LST1
619
+ if @LST3 < @STV
620
+ @STV = @LST3
621
+ end
622
+ if @STV < 0
623
+ @STV = 0
624
+ else
625
+ @STV = (@STV * @F).floor.to_f
626
+ end
627
+ @SOLZV = (@STV * 5.5).floor / 100.0
628
+ if @R > 0
629
+ @BKV = @STV
630
+ else
631
+ @BKV = 0
632
+ end
633
+ else
634
+ @STV = 0
635
+ @SOLZV = 0
636
+ @BKV = 0
637
+ end
638
+ end
639
+
640
+ def MOSONST
641
+ @ZRE4J = @JRE4 / 100.0
642
+ @ZVBEZJ = @JVBEZ / 100.0
643
+ @JLFREIB = @JFREIB / 100.0
644
+ @JLHINZU = @JHINZU / 100.0
645
+ self.MRE4
646
+ self.MRE4ABZ
647
+ @ZRE4VP = @ZRE4VP - @JRE4ENT / 100.0
648
+ self.MZTABFBN
649
+ self.MLSTJAHR
650
+ @LSTOSO = @ST * 100
651
+ end
652
+
653
+ def MRE4SONST
654
+ self.MRE4
655
+ @FVB = @FVBSO
656
+ self.MRE4ABZ
657
+ @ZRE4VP = @ZRE4VP - @JRE4ENT / 100.0 - @SONSTENT / 100.0
658
+ @FVBZ = @FVBZSO
659
+ self.MZTABFBN
660
+ end
661
+
662
+ def UPTAB14
663
+ if @X < 8355
664
+ @ST = 0
665
+ else
666
+ if @X < 13_470
667
+ @Y = (@X - 8354) / 10_000
668
+ @RW = @Y * 974.58
669
+ @RW = @RW + 1_400.0
670
+ @ST = (@RW * @Y).floor
671
+ elsif @X < 52_882
672
+ @Y = (@X - 13_469.0) / 10_000
673
+ @RW = (@Y * 228.74)
674
+ @RW = @RW + 2_397.0
675
+ @RW = @RW * @Y
676
+ @ST = (@RW + 971.0).floor
677
+ elsif @X < 250_731
678
+ @ST = (@X * 0.42 - 8239.0).floor
679
+ else
680
+ @ST = (@X * 0.45 - 15_761.0).floor
681
+ end
682
+ @ST = (@ST * @KZTAB).floor
683
+ end
684
+ end
685
+
686
+ def UPTAB15
687
+ if @X < 8473
688
+ @ST = 0
689
+ else
690
+ if @X < 13_470
691
+ @Y = (@X - 8472) / 10_000
692
+ @RW = @Y * 997.6
693
+ @RW = @RW + 1_400.0
694
+ @ST = (@RW * @Y).floor
695
+ elsif @X < 52_882
696
+ @Y = (@X - 13_469.0) / 10_000
697
+ @RW = @Y * 228.74
698
+ @RW = @RW + 2_397.0
699
+ @RW = @RW * @Y
700
+ @ST = (@RW + 948.68).floor
701
+ elsif @X < 250_731
702
+ @ST = (@X * 0.42 - 8261.29).floor
703
+ else
704
+ @ST = (@X * 0.45 - 15_783.19).floor
705
+ end
706
+ @ST = @ST * @KZTAB
707
+ end
708
+ end
709
+ # ---------- END TAX ALGORITHM ----------
710
+ end