class Valvat::Checksum::GB

Constants

GOV_NUMBER
HEALTH_NUMBER
NEW_FORMAT_FORBIDDEN_RANGES
OLD_FORMAT_FORBIDDEN_RANGES

Public Instance Methods

validate() click to toggle source
# File lib/valvat/checksum/gb.rb, line 11
def validate # rubocop:disable Metrics/CyclomaticComplexity
  # government departments and health authorities, so no checksum
  return true if gov_or_health?
  return false if all_zero?

  return false if old_format_remainder.zero? && fobidden_in_old_format?
  return false if new_format_remainder.zero? && fobidden_in_new_format?

  old_format_remainder.zero? || new_format_remainder.zero?
end

Private Instance Methods

all_zero?() click to toggle source
# File lib/valvat/checksum/gb.rb, line 36
def all_zero?
  str_wo_country =~ /\A0{9}\Z/ || str_wo_country =~ /\A0{12}\Z/
end
checksum() click to toggle source
# File lib/valvat/checksum/gb.rb, line 24
def checksum
  @checksum ||= str_wo_country[7..8].to_i
end
fobidden_in_new_format?() click to toggle source
# File lib/valvat/checksum/gb.rb, line 56
def fobidden_in_new_format?
  vat_base_int = vat_base.to_i
  NEW_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include?(vat_base_int) }
end
fobidden_in_old_format?() click to toggle source
# File lib/valvat/checksum/gb.rb, line 61
def fobidden_in_old_format?
  vat_base_int = vat_base.to_i
  OLD_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include?(vat_base_int) }
end
gov_or_health?() click to toggle source
# File lib/valvat/checksum/gb.rb, line 32
def gov_or_health?
  str_wo_country =~ GOV_NUMBER || str_wo_country =~ HEALTH_NUMBER
end
new_format_remainder() click to toggle source
# File lib/valvat/checksum/gb.rb, line 52
def new_format_remainder
  @new_format_remainder ||= (vat_base_sum + 55 + checksum).modulo(97)
end
old_format_remainder() click to toggle source
# File lib/valvat/checksum/gb.rb, line 48
def old_format_remainder
  @old_format_remainder ||= (vat_base_sum + checksum).modulo(97)
end
vat_base() click to toggle source
# File lib/valvat/checksum/gb.rb, line 28
def vat_base
  @vat_base ||= str_wo_country[0..6]
end
vat_base_sum() click to toggle source
# File lib/valvat/checksum/gb.rb, line 40
def vat_base_sum
  @vat_base_sum ||= vat_base.split('')
                            .map(&:to_i)
                            .zip([8, 7, 6, 5, 4, 3, 2])
                            .map { |vat_number_digit, multiplier| vat_number_digit * multiplier }
                            .inject(:+)
end