module Taxger::Einkommensteuer

Constants

F
ZONES

Public Instance Methods

calculate(year, income, pay_taxes_on = nil) click to toggle source
# File lib/taxger/einkommensteuer.rb, line 88
def calculate(year, income, pay_taxes_on = nil)
  if !ZONES[year.to_s]
    raise Einkommensteuer::Error.new("No data available for year #{year}")
  end

  pay_taxes_on ||= income
  pay_taxes_on = pay_taxes_on * 0.01
  income = income * 0.01
  ZONES[year.to_s].reverse.each do |zone|
    (zone_start, a, b, c) = zone
    if income >= zone_start + 1
      taxable = income - zone_start
      tax = (a * (taxable ** 2) + b * taxable + c)#.to_i * 100
      tax = (((tax/income)*pay_taxes_on)).to_i * 100

      # Vereinfachte Berechnung des Solidaritätszuschlagsfreibetrags:
      # Nicht gültig für Steuerklasse III (162 EUR statt 81 EUR) und abweichend,
      # wenn Lohnsteuer in verschiedenen Monaten jeweils unter- und überhalb der
      # Grenze lag.
      solz = tax > 81_00 * 12 ? (tax * 0.055).to_i : 0
      return Result.new(tax, solz)
    end
  end
  Result.new(0, 0)
end