module Clabe

Constants

BANKS
CITIES
CLABE_WEIGHT_FACTOR_MAP
ClabeValidation
VERSION

Public Class Methods

validate(clabe) click to toggle source
# File lib/clabe.rb, line 550
def self.validate(clabe)
  clabe_params = get_params(clabe)
  clabe_validation = ClabeValidation.new(false)
  clabe_validation[:errors] = []

  unless clabe.length == 18
    clabe_validation[:errors] << 'invalid length'
  end

  unless (clabe =~ /[^0-9]/).nil?
    clabe_validation[:errors] << 'invalid characters'
  end

  if clabe_params[:bank].nil?
    clabe_validation[:errors] << 'invalid bank'
  end

  if clabe_params[:city].nil?
    clabe_validation[:errors] << 'invalid city'
  end

  unless clabe_params[:checksum] == clabe_params[:real_checksum]
    clabe_validation[:errors] << 'must have a valid control digit'
  end

  unless clabe_validation.errors.empty?
    return clabe_validation
  end

  clabe_validation[:is_valid?] = true
  clabe_validation[:bank_code] = clabe_params[:bank_code]
  clabe_validation[:bank_tag] = clabe_params[:bank][:tag]
  clabe_validation[:bank_name] = clabe_params[:bank][:name]
  clabe_validation[:city] = clabe_params[:city]
  return clabe_validation
end

Private Class Methods

compute_checksum(clabe) click to toggle source
# File lib/clabe.rb, line 518
                     def self.compute_checksum(clabe)
  result = 0

  clabe.split('')[0...17].each_with_index do |val, index|
    result += (val.to_i * CLABE_WEIGHT_FACTOR_MAP[index % 3]) % 10
  end

  return ((10 - result % 10) % 10).to_s
end
get_params(clabe) click to toggle source
# File lib/clabe.rb, line 528
                     def self.get_params(clabe)
  bank_code = clabe[0...3]
  city_code = clabe[3...6]
  account = clabe[6...17]
  checksum = clabe[17...18]

  bank = BANKS[bank_code]
  city = CITIES[city_code]

  real_checksum = compute_checksum(clabe)

  return {
    bank_code: bank_code,
    city_code: city_code,
    account: account,
    checksum: checksum,
    bank: bank,
    city: city,
    real_checksum: real_checksum
  }
end