Class: IncomeTax::Models::Progressive::Levels
- Inherits:
-
Object
- Object
- IncomeTax::Models::Progressive::Levels
- Includes:
- Helpers
- Defined in:
- lib/income_tax/models/progressive.rb
Instance Method Summary collapse
- #+(rate) ⇒ Object
- #calculate(method, income) ⇒ Object
- #calculate_gross(income) ⇒ Object
- #calculate_net(income) ⇒ Object
-
#initialize(levels = [], remainder = nil) ⇒ Levels
constructor
A new instance of Levels.
- #level(start, rate) ⇒ Object
- #multiply_brackets(factor) ⇒ Object
- #offset(delta) ⇒ Object
- #remainder(rate) ⇒ Object
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 |