Sha256: fd304478f19227a404a7a6ea3890f2e70d6ebda5d8850397af27d42892d9c7e4

Contents?: true

Size: 1.32 KB

Versions: 8

Compression:

Stored size: 1.32 KB

Contents

class Valvat
  module Checksum
    class GB < Base
      OLD_FORMAT_FORBIDDEN_RANGES = [(100_000..999_999), (9_490_001..9_700_000), (9_990_001..9_999_999)]
      NEW_FORMAT_FORBIDDEN_RANGES = [(1..100_000), (100_001..1_000_000)]

      def validate
        vat_number = vat.to_s_wo_country
        check_sum  = vat.to_s_wo_country[7..8].to_i
        vat_base = vat_number[0..6]

        # government departments and health authorities, so no checksum
        return true if vat_number =~ /\A(GD[0-4]{1}\d{2})\Z/ || vat_number =~ /\A(HA[5-9]{1}\d{2})\Z/
        return false if vat_number =~ /\A0{9}\Z/ || vat_number =~ /\A0{12}\Z/

        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(:+)

        old_format_remainder = (vat_base_sum + check_sum).modulo(97)
        new_format_remainder = (vat_base_sum + 55 + check_sum).modulo(97)

        return false if old_format_remainder == 0 &&
          OLD_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include? vat_base.to_i }

        return false if new_format_remainder == 0 &&
          NEW_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include? vat_base.to_i }

        old_format_remainder == 0 || new_format_remainder == 0
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
valvat-0.9.1 lib/valvat/checksum/gb.rb
valvat-0.9.0 lib/valvat/checksum/gb.rb
valvat-0.8.2 lib/valvat/checksum/gb.rb
valvat-0.8.1 lib/valvat/checksum/gb.rb
valvat-0.8.0 lib/valvat/checksum/gb.rb
valvat-0.7.4 lib/valvat/checksum/gb.rb
valvat-0.7.3 lib/valvat/checksum/gb.rb
valvat-0.7.2 lib/valvat/checksum/gb.rb