formulas 0.1.1 → 0.1.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7f8f146ead6fce0f64131ee26955ff1066d13300b3c73f81d7ea3cafb61c8be
4
- data.tar.gz: 1ac72a62a41f905d27c84cecd1da31ad434a632ba51110bc05242f0b3d8004c9
3
+ metadata.gz: 4f95bf8ae022a90b5073d2421bdcad92aa870cc53c0a9c99db8954389e9c832c
4
+ data.tar.gz: a2502bbb84087d04237173f139ed0edd13b6adb172016a747f3c093a1e249416
5
5
  SHA512:
6
- metadata.gz: a7d7ccbff597d9ca4b9fa5abac846235086e23d89b714e98cc85d7526cf54e42b6525158d8a294149b96403dc1e98ac6406ef0eecaa5800f8485d84bc92a7061
7
- data.tar.gz: 0c2e7a4e8a6ee19433ec5b337c38a90cf1f54e6112bebaf37ad5c34564c8d3509d313d8242e8b014bdfc9d50bde367c9beb63c5937ff3d10d7f29f667e0cdfe4
6
+ metadata.gz: f4382114d2679c7c9e622750bc24407441f70c689bffefb76293bf7de38077d62f34564e6c8d0dc845dccc19eba3d0836420aad03d5bab9a89de58ab2922a670
7
+ data.tar.gz: 6d687293ba712f2861b1a7dfd0f78da9a7ce0b0c40b9bd52923c35b17886b6aa9516549b3117497633c357fd8266b18628ec81b6d5a954d533c305f3260a9e77
data/formulas.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'formulas'
3
- s.version = '0.1.1'
3
+ s.version = '0.1.1.4'
4
4
  s.summary = "formulas"
5
5
  s.description = "Home loan formulas"
6
6
  s.authors = ["formulas"]
data/lib/formulas.rb CHANGED
@@ -25,6 +25,13 @@ module Formulas
25
25
  FREQUENCIES = [ANNUALLY, WEEKLY, FORTNIGHTLY, MONTHLY]
26
26
 
27
27
  module FrequencyConversions
28
+ def convert_annually_to_annually(number)
29
+ number
30
+ end
31
+ alias :convert_weekly_to_weekly convert_annually_to_annually
32
+ alias :convert_fortnightly_to_fortnightly convert_annually_to_annually
33
+ alias :convert_monthly_to_monthly convert_annually_to_annually
34
+
28
35
  def convert_annually_to_weekly(number)
29
36
  number.to_f / 52
30
37
  end
@@ -60,5 +67,17 @@ module Formulas
60
67
  def convert_monthly_to_fortnightly(number)
61
68
  number.to_f * 12 / 26
62
69
  end
70
+
71
+ def convert_fortnightly_to_annually(number)
72
+ number.to_f * 26
73
+ end
74
+
75
+ def convert_fortnightly_to_weekly(number)
76
+ number.to_f / 2
77
+ end
78
+
79
+ def convert_fortnightly_to_monthly(number)
80
+ (number.to_f * 26) / 12
81
+ end
63
82
  end
64
83
  end
data/lib/formulas/paye.rb CHANGED
@@ -19,6 +19,8 @@ module Formulas
19
19
  [[180_000], 39]
20
20
  ]
21
21
 
22
+ MAX_ACC_LEVY_PAYABLE = 130_911
23
+
22
24
  def initialize(gross_pay:, frequency: Formulas::MONTHLY)
23
25
  super(gross_pay, frequency, TAX_RATES)
24
26
  end
@@ -26,5 +28,13 @@ module Formulas
26
28
  def tax(request_frequency: Formulas::WEEKLY)
27
29
  calculate_tax(request_frequency)
28
30
  end
31
+
32
+ def levy
33
+ 0.0139
34
+ end
35
+
36
+ def acc_payable
37
+ annual_gross_pay > MAX_ACC_LEVY_PAYABLE ? MAX_ACC_LEVY_PAYABLE : annual_gross_pay
38
+ end
29
39
  end
30
40
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Formulas
4
4
  # Calculate basic salary in frequency
5
- # salary = Formulas::Salary.new(gross_pay: 52_000, Salary::ANNUAL)
5
+ # salary = Formulas::Salary.new(pay: 52_000, Salary::ANNUAL)
6
6
  #
7
7
  # salary.pay(:monthly)
8
8
  #
@@ -15,19 +15,19 @@ module Formulas
15
15
  include FrequencyConversions
16
16
  attr_reader :frequency
17
17
 
18
- def initialize(gross_pay:, frequency:)
19
- invalid_frequency unless FREQUENCIES.include?(frequency)
20
- raise ArgumentError, 'Gross pay must be numeric' unless Numeric === gross_pay
18
+ def initialize(pay:, frequency:)
19
+ @pay = pay
20
+ @frequency = frequency.to_sym
21
21
 
22
- @gross_pay = gross_pay
23
- @frequency = frequency
22
+ invalid_frequency unless FREQUENCIES.include?(@frequency)
23
+ raise ArgumentError, 'Gross pay must be numeric' unless Numeric === pay
24
24
  end
25
25
 
26
- def gross_pay(request_frequency: @frequency)
26
+ def pay(request_frequency: @frequency)
27
27
  invalid_frequency unless FREQUENCIES.include?(frequency)
28
- return @gross_pay if @frequency == request_frequency
28
+ return @pay if @frequency == request_frequency
29
29
 
30
- convert_gross_pay_to(request_frequency).round(2)
30
+ convert_pay_to(request_frequency).round(2)
31
31
  end
32
32
 
33
33
  private
@@ -36,8 +36,8 @@ module Formulas
36
36
  raise ArgumentError, "Invalid frequency, frequency are: #{FREQUENCIES.join(', ')}"
37
37
  end
38
38
 
39
- def convert_gross_pay_to(request_frequency)
40
- send("convert_#{@frequency}_to_#{request_frequency}", @gross_pay)
39
+ def convert_pay_to(request_frequency)
40
+ send("convert_#{@frequency}_to_#{request_frequency}", @pay)
41
41
  end
42
42
  end
43
43
  end
@@ -15,9 +15,9 @@ module Formulas
15
15
  #
16
16
  #
17
17
  module StudentLoanRepayment
18
- autoload :RepaymentBase, './lib/formulas/student_loan_repayment/repayment_base'
19
- autoload :FixRepaymentPerPeriod, './lib/formulas/student_loan_repayment/fix_repayment_per_period'
20
- autoload :PercentRepaymentPerThreshold, './lib/formulas/student_loan_repayment/percent_repayment_per_threshold'
18
+ autoload :RepaymentBase, 'formulas/student_loan_repayment/repayment_base'
19
+ autoload :FixRepaymentPerPeriod, 'formulas/student_loan_repayment/fix_repayment_per_period'
20
+ autoload :PercentRepaymentPerThreshold, 'formulas/student_loan_repayment/percent_repayment_per_threshold'
21
21
  attr_reader :repayment
22
22
 
23
23
  def initialize(income_strategy: , repayment_strategy:, rates:)
@@ -12,16 +12,16 @@ module Formulas
12
12
  FIX_RATE = 0.12
13
13
 
14
14
  DEFAULT_THRESHOLD = {
15
- weekly: [390, 52],
16
- fortnightly: [780, 26],
17
- four_weeks: [1560, 13],
18
- monthly: [1690, 12],
19
- annually: [20280, 1],
15
+ weekly: [390, 52],
16
+ fortnightly: [780, 26],
17
+ four_weeks: [1560, 13],
18
+ monthly: [1690, 12],
19
+ annually: [20280, 1],
20
20
  }
21
21
 
22
22
  def repayment
23
23
  selected_base = @repayment_threshold[@salary.frequency]
24
- less_base_cost = @salary.gross_pay - selected_base[0]
24
+ less_base_cost = @salary.pay - selected_base[0]
25
25
  ((FIX_RATE * less_base_cost * selected_base[1]) / 12).round(2)
26
26
  end
27
27
  end
@@ -24,7 +24,7 @@ module Formulas
24
24
  end
25
25
 
26
26
  def calculate(request_frequency: Formulas::ANNUALLY)
27
- result = @salary.gross_pay(request_frequency: request_frequency) * (@super.to_f / 100)
27
+ result = @salary.pay(request_frequency: request_frequency) * (@super.to_f / 100)
28
28
  result.round(2)
29
29
  end
30
30
  end
@@ -4,10 +4,25 @@ module Formulas
4
4
  class WithholdingTax
5
5
  include FrequencyConversions
6
6
 
7
- def initialize(gross_pay, origin_frequency, tax_rate)
7
+ attr_reader :origin_frequency
8
+
9
+ def initialize(gross_pay, origin_frequency, tax_rate, options: {})
8
10
  @gross_pay = gross_pay
9
11
  @origin_frequency = origin_frequency
10
12
  @tax_rate = tax_rate
13
+ @options = options
14
+ end
15
+
16
+ def net_pay(request_frequency:)
17
+ annual_pay_after_tax = annual_gross_pay - calculate_tax(Formulas::ANNUALLY)
18
+
19
+ if respond_to?(:levy)
20
+ net_pay = annual_pay_after_tax - (acc_payable * send(:levy))
21
+ end
22
+
23
+ return net_pay if request_frequency.to_s == Formulas::ANNUALLY.to_s
24
+
25
+ send("convert_annually_to_#{request_frequency}", net_pay).round(2)
11
26
  end
12
27
 
13
28
  protected
@@ -15,7 +30,7 @@ module Formulas
15
30
  def calculate_tax(request_frequency)
16
31
  @request_frequency = request_frequency
17
32
 
18
- return annual_tax if request_frequency == Formulas::ANNUALLY
33
+ return annual_tax if request_frequency.to_s == Formulas::ANNUALLY.to_s
19
34
 
20
35
  send("convert_annually_to_#{request_frequency}", annual_tax).round(2)
21
36
  end
@@ -27,7 +42,7 @@ module Formulas
27
42
 
28
43
  if gross_pay_tax_index > 0
29
44
  @tax_rate[0..gross_pay_tax_index].each_with_index do |current, index|
30
- l = (index == gross_pay_tax_index) ? @gross_pay : current[0][1]
45
+ l = (index == gross_pay_tax_index) ? annual_gross_pay : current[0][1]
31
46
  annual_result += ((l - current[0][0]) * (current[1].to_f / 100))
32
47
  end
33
48
  end
@@ -35,12 +50,15 @@ module Formulas
35
50
  end
36
51
 
37
52
  def annual_gross_pay
38
- return @gross_pay if @origin_frequency == Formulas::ANNUALLY
53
+ return @gross_pay if @origin_frequency.to_s == Formulas::ANNUALLY.to_s
39
54
  send("convert_#{@origin_frequency}_to_annually", @gross_pay)
40
55
  end
41
56
 
42
57
  def gross_pay_tax_index
43
- @tax_rate.index { |current| current[0][0] <= annual_gross_pay && current[0][1] >= annual_gross_pay }
58
+ @tax_rate.index do |current|
59
+ (current[0][0] <= annual_gross_pay && current[0][1].nil?) ||
60
+ (current[0][0] <= annual_gross_pay && current[0][1] >= annual_gross_pay)
61
+ end
44
62
  end
45
63
  end
46
64
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formulas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - formulas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-28 00:00:00.000000000 Z
11
+ date: 2021-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest