Sha256: 735461a3f53af88e0ae042fd970c098b1290963bb0820cb012761a28fad6a3e5

Contents?: true

Size: 1.41 KB

Versions: 1

Compression:

Stored size: 1.41 KB

Contents

module Train::Tax::Calculator
  module WithholdingTax

    LOOKUP_TABLE = [
      { lowest:       0.00, highest:  20_833.00, base:       0.00, excess: 0.00 },
      { lowest:  20_833.00, highest:  33_333.00, base:       0.00, excess: 0.20 },
      { lowest:  33_333.00, highest:  66_667.00, base:   2_500.00, excess: 0.25 },
      { lowest: 66_667.00, highest: 166_667.00, base:  10_833.33, excess: 0.30 },
      { lowest: 166_667.00, highest: 666_667.00, base:  40_833.33, excess: 0.32 },
      { lowest: 666_667.00, highest: Float::INFINITY, base: 200_833.33, excess: 0.35 },
    ]

    def self.compute(basic_salary)
      taxable_income = compute_taxable_income_for(basic_salary)
      tax_bracket = get_tax_bracket_for(taxable_income)
      withholding_tax = ((taxable_income - tax_bracket[:lowest]) * tax_bracket[:excess]) + tax_bracket[:base]

      withholding_tax.round(2)
    end

    private

      def self.compute_taxable_income_for(basic_salary)
        initial_net = basic_salary - Deductions.compute(basic_salary)

        if basic_salary > 90_000
          additional_tax = ((basic_salary - 90_000) / 12.00)
          return initial_net + additional_tax
        end

        initial_net
      end

      def self.get_tax_bracket_for(taxable_income)
        LOOKUP_TABLE.select do |bracket|
          taxable_income >= bracket[:lowest] &&
          taxable_income < bracket[:highest]
        end.first
      end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
train-tax-calculator-2.3.2 lib/train/tax/calculator/withholding_tax.rb