module SaVatValidation

Constants

VERSION

Public Class Methods

first_digit(a) click to toggle source
# File lib/sa_vat_validation.rb, line 36
def self.first_digit(a)
  a.to_s.chars.first.to_i
end
last_digit(a) click to toggle source
# File lib/sa_vat_validation.rb, line 32
def self.last_digit(a)
  a.to_s.chars.last.to_i
end
valid?(vat_number) click to toggle source
# File lib/sa_vat_validation.rb, line 5
def self.valid?(vat_number)
  digits = vat_number.to_s.split(//).map(&:to_i)

  # As per SARS
  # A VAT Number is a unique number, which comprises of 10 digits and starts with the number 4
  return false unless digits.first == 4
  return false unless digits.size  == 10 && vat_number.to_s.is_numeric?

  check_digit = digits.pop
  sum         = 0

  digits.each_with_index do |digit, i|
    if i.even?
      result = digit * 2
      result = first_digit(result) + last_digit(result) if result >= 10

      sum += result
    else
      sum += digit
    end
  end

  calculated_digit = last_digit(sum).zero? ? last_digit(sum) : 10 - last_digit(sum)

  check_digit == calculated_digit
end