class PortugueseValidators::PortugueseNibValidator

Validates Portuguese bank numbers (NIB).

The number is always composed by 21 where the last two form the control number.

Public Instance Methods

is_valid?(number) click to toggle source
# File lib/portuguese_validators/nib.rb, line 11
def is_valid?(number)
  return false unless number

  number = sprintf("%021o", number) if number.kind_of?(Integer)
  looks_like_nib?(number) && valid_nib?(number)
end
validate_each(record, attribute, value) click to toggle source
# File lib/portuguese_validators/nib.rb, line 6
def validate_each(record, attribute, value)
  return if value.blank?
  record.errors.add(attribute, options[:message] || :invalid) unless is_valid?(value)
end

Private Instance Methods

looks_like_nib?(number) click to toggle source
# File lib/portuguese_validators/nib.rb, line 33
def looks_like_nib?(number)
  return false unless number
  number.match(/^\d{21}$/) ? true : false
end
valid_nib?(number) click to toggle source
# File lib/portuguese_validators/nib.rb, line 20
def valid_nib?(number)
  nib = number.slice(0..18).split('').map { |digit| digit.to_i }
  control = number.slice(19..20).to_i

  sum = 0
  nib.each do |num|
    sum = ((sum + num) * 10) % 97
  end

  expected = 98 - ((sum * 10) % 97)
  expected == control
end