Class: IncomeTax::Models::Progressive::Levels

Inherits:
Object
  • Object
show all
Includes:
Helpers
Defined in:
lib/income_tax/models/progressive.rb

Instance Method Summary collapse

Constructor Details

#initialize(levels = [], remainder = nil) ⇒ Levels

Returns a new instance of Levels.



7
8
9
10
# File 'lib/income_tax/models/progressive.rb', line 7

def initialize(levels = [], remainder = nil)
  @levels    = levels
  @remainder = remainder
end

Instance Method Details

#+(rate) ⇒ Object



25
26
27
# File 'lib/income_tax/models/progressive.rb', line 25

def +(rate)
  self.class.new(@levels.map { |b,r| [b, r + rate] }, @remainder + rate)
end

#calculate(method, income) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/income_tax/models/progressive.rb', line 33

def calculate(method, income)
  remainder     = income
  already_taxed = 0
  taxes         = 0

  @levels.each do |boundary, rate|
    bracket       = boundary - already_taxed
    bracket       = yield rate, bracket if block_given?
    already_taxed = boundary

    if remainder > bracket
      taxes     += rate.public_send(method, bracket)
      remainder -= bracket
    else
      taxes     += rate.public_send(method, remainder)
      remainder  = 0
      break
    end
  end

  taxes + @remainder.public_send(method, remainder)
end

#calculate_gross(income) ⇒ Object



56
57
58
# File 'lib/income_tax/models/progressive.rb', line 56

def calculate_gross(income)
  calculate(:gross_taxes, income)
end

#calculate_net(income) ⇒ Object



60
61
62
# File 'lib/income_tax/models/progressive.rb', line 60

def calculate_net(income)
  calculate(:net_taxes, income) { |rate, input| rate.net(input) }
end

#level(start, rate) ⇒ Object



12
13
14
# File 'lib/income_tax/models/progressive.rb', line 12

def level(start, rate)
  @levels << [money(start), Rate(rate)]
end

#multiply_brackets(factor) ⇒ Object



29
30
31
# File 'lib/income_tax/models/progressive.rb', line 29

def multiply_brackets(factor)
  self.class.new(@levels.map { |b,r| [(b*factor).to_i, r] }, @remainder)
end

#offset(delta) ⇒ Object



16
17
18
19
# File 'lib/income_tax/models/progressive.rb', line 16

def offset(delta)
  return delta unless @levels.any?
  @levels.last.first + money(delta)
end

#remainder(rate) ⇒ Object



21
22
23
# File 'lib/income_tax/models/progressive.rb', line 21

def remainder(rate)
  @remainder = Rate(rate)
end