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,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