Sha256: b648f63267723ce3f8f3fac5199af7ecb4a2f99f3c16b525e6f8c1530bb7aa64

Contents?: true

Size: 1.67 KB

Versions: 2

Compression:

Stored size: 1.67 KB

Contents

require 'active_support/core_ext/object/try'

module BicValidation
  class Bic
    attr_accessor :code

    def initialize(code)
      @code = code.to_s.strip.upcase
    end

    def of_valid_length?
      [8, 11].include? @code.length
    end

    def of_valid_format?
      @code =~ format
    end

    def has_valid_country_code?
      country_codes.include? country
    end

    def has_valid_branch_code?
      # WTF? http://de.wikipedia.org/wiki/ISO_9362
      country[0] =~ /[^01]/ && country[1] =~ /[^O]/
    end

    def known?
      !known_bics.include?(country.to_sym) ||
        known_bics[country.to_sym].include?(@code.try(:gsub, /XXX$/, ''))
    end

    def valid?
      of_valid_length? &&
        of_valid_format? &&
        has_valid_country_code? &&
        has_valid_branch_code?
    end

    def invalid?
      !valid?
    end

    def bank
      match[1]
    end

    def country
      match[2]
    end

    def location
      match[3]
    end

    def branch
      match[4]
    end

    private

      def format
        /([A-Z]{4})([A-Z]{2})([0-9A-Z]{2})([0-9A-Z]{3})?/
      end

      def match
        format.match(@code)
      end

      def known_bics
        {
          DE: bics(:de),
          AT: bics(:at),
          CH: bics(:ch)
        }
      end

      def bics(country)
        BankingData::Bank.where(locale: country).only(:bic)
          .map { |bic| bic.first.gsub(/XXX$/, '') }
          .reject(&:blank?)
          .uniq
      end

      def country_codes
        # http://www.iso.org/iso/country_codes/iso_3166_code_lists/country_\
        # names_and_code_elements.htm
        YAML.load(File.read(File.dirname(__FILE__) + '/country_codes.yml'))
      end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
bic_validation-0.3.0 lib/bic_validation/bic.rb
bic_validation-0.2.1 lib/bic_validation/bic.rb