Class: ValidateNzBankAcc

Inherits:
Object
  • Object
show all
Defined in:
lib/validate_nz_bank_acc.rb,
lib/validate_nz_bank_acc/version.rb

Constant Summary collapse

BANKS =
{ 1 => {:ranges => [1..999, 1100..1199, 1800..1899]},
  2 => {:ranges => [1..999, 1200..1299]},
  3 => {:ranges => [1..999, 1300..1399, 1500..1599, 1700..1799, 1900..1999]},
  6 => {:ranges => [1..999, 1400..1499]},
  8 => {:ranges => [6500..6599], :algo => :d},
  9 => {:ranges => [], :algo => :e}, # range was 0000
  11 => {:ranges => [5000..6499, 6600..8999]},
  12 => {:ranges => [3000..3299, 3400..3499,3600..3699]},
  13 => {:ranges => [4900..4999]},
  14 => {:ranges => [4700..4799]},
  15 => {:ranges => [3900..3999]},
  16 => {:ranges => [4400..4499]},
  17 => {:ranges => [3300..3399]},
  18 => {:ranges => [3500..3599]},
  19 => {:ranges => [4600..4649]},
  20 => {:ranges => [4100..4199]},
  22 => {:ranges => [4000..4049]},
  23 => {:ranges => [3700..3799]},
  24 => {:ranges => [4300..4349]},
  25 => {:ranges => [2500..2599], :algo => :f},
  26 => {:ranges => [2600..2699], :algo => :g},
  27 => {:ranges => [3800..3849]},
  28 => {:ranges => [2100..2149], :algo => :g},
  29 => {:ranges => [2150..2299], :algo => :g},
  30 => {:ranges => [2900..2949]},
  31 => {:ranges => [2800..2849], :algo => :x},
  33 => {:ranges => [6700..6799], :algo => :f},
  35 => {:ranges => [2400..2499]},
  38 => {:ranges => [9000..9499]}
}
ALGOS =
{
 :a =>[0, 0, 6, 3, 7, 9, 0, 0, 10, 5, 8, 4, 2, 1, 0, 0, 0, 0, 11],
 :b => [0, 0, 0, 0, 0, 0, 0, 0, 10, 5, 8, 4, 2, 1, 0, 0, 0, 0, 11],
 :c => [3, 7, 0, 0, 0, 0, 9, 1, 10, 5, 3, 4, 2, 1, 0, 0, 0, 0, 11],
 :d => [0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 11],
 :e => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 3, 2, 0, 0, 0, 1, 11],
 :f => [ 0, 0, 0, 0, 0, 0, 0, 1, 7, 3, 1, 7, 3, 1, 0, 0, 0, 0, 10],
 :g => [0, 0, 0, 0, 0, 0, 0, 1, 3, 7, 1, 3, 7, 1, 0, 3, 7, 1, 10],
 :x => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
}
VERSION =
"0.0.4"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(bank_id, branch_id, account_number, suffix) ⇒ ValidateNzBankAcc

Returns a new instance of ValidateNzBankAcc.



47
48
49
50
51
52
# File 'lib/validate_nz_bank_acc.rb', line 47

def initialize(bank_id, branch_id, , suffix)
  @bank_id = process_input(bank_id)
  @branch_id = process_input(branch_id)
  @account_number = process_input()
  @suffix = process_input(suffix)
end

Instance Attribute Details

#account_numberObject

Returns the value of attribute account_number.



46
47
48
# File 'lib/validate_nz_bank_acc.rb', line 46

def 
  @account_number
end

#bank_idObject

Returns the value of attribute bank_id.



46
47
48
# File 'lib/validate_nz_bank_acc.rb', line 46

def bank_id
  @bank_id
end

#branch_idObject

Returns the value of attribute branch_id.



46
47
48
# File 'lib/validate_nz_bank_acc.rb', line 46

def branch_id
  @branch_id
end

#suffixObject

Returns the value of attribute suffix.



46
47
48
# File 'lib/validate_nz_bank_acc.rb', line 46

def suffix
  @suffix
end

Instance Method Details

#algoObject



79
80
81
# File 'lib/validate_nz_bank_acc.rb', line 79

def algo
  ALGOS[algo_code]
end

#algo_codeObject



74
75
76
77
# File 'lib/validate_nz_bank_acc.rb', line 74

def algo_code
  # If the account base number is below 00990000 then apply algorithm A, otherwise apply algorithm B.
  BANKS[bank_id][:algo] || ( < 990000 ? :a : :b)
end

#checksum_sumObject



83
84
85
86
87
88
89
90
91
92
93
# File 'lib/validate_nz_bank_acc.rb', line 83

def checksum_sum
  if [:e, :g].include? algo_code
    (0..17).inject(0) do |sum, index|
      s = number[index].to_i * algo[index]
      2.times { s = s.to_s.chars.map(&:to_i).inject(:+) }
      sum += s
    end
  else
    (0..17).inject(0) {|sum, index| sum += number[index].to_i * algo[index]; sum }
  end
end

#numberObject

account number padded to 8 chars



99
100
101
# File 'lib/validate_nz_bank_acc.rb', line 99

def number # account number padded to 8 chars
  bank_code + branch_code +  + suffix_code
end

#valid?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/validate_nz_bank_acc.rb', line 54

def valid?
  valid_branch_code? && valid_modulo?
end

#valid_bank_code?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/validate_nz_bank_acc.rb', line 58

def valid_bank_code?
  BANKS.has_key? bank_id
end

#valid_branch_code?Boolean

Returns:

  • (Boolean)


62
63
64
65
66
67
68
69
70
71
72
# File 'lib/validate_nz_bank_acc.rb', line 62

def valid_branch_code?
  return false unless valid_bank_code?
  if BANKS[bank_id][:ranges].empty?
    # Bank 9. Anything is valid? # DOUBLE CHECK
    true
  else
    BANKS[bank_id][:ranges].any? do |range|
      range.include? branch_id
    end
  end
end

#valid_modulo?Boolean

Returns:

  • (Boolean)


95
96
97
# File 'lib/validate_nz_bank_acc.rb', line 95

def valid_modulo?
  checksum_sum % algo[18] == 0
end