class TrackingNumberValidator::DHLValidator

Constants

VALID_LENGTHS
WEIGHTINGS

Attributes

tracking_number[R]

Public Class Methods

new(tracking_number) click to toggle source
# File lib/tracking_number_validator/dhl_validator.rb, line 8
def initialize(tracking_number)
  @tracking_number = tracking_number
end

Public Instance Methods

name() click to toggle source
# File lib/tracking_number_validator/dhl_validator.rb, line 21
def name
  :dhl
end
valid?() click to toggle source
# File lib/tracking_number_validator/dhl_validator.rb, line 12
def valid?
  return false unless valid_length?
  if tracking_number.length == 10
    calculate_modulo_7
  else
    calculate_modulo_10
  end
end

Private Instance Methods

calculate_modulo_10() click to toggle source
# File lib/tracking_number_validator/dhl_validator.rb, line 34
def calculate_modulo_10
  characters = tracking_number.chars

  sum = 0
  (characters.size - 1).times do |i|
    sum += WEIGHTINGS[i % WEIGHTINGS.size] * characters[i].to_i
  end

  check_digit = ((sum / 10.0).ceil * 10) - sum
  characters.last.to_i == check_digit
end
calculate_modulo_7() click to toggle source
# File lib/tracking_number_validator/dhl_validator.rb, line 27
def calculate_modulo_7
  characters = tracking_number.chars
  without_checksum = characters[0..-2]
  remainder = without_checksum.join.to_i % 7
  characters.last.to_i == remainder
end
valid_length?() click to toggle source
# File lib/tracking_number_validator/dhl_validator.rb, line 46
def valid_length?
  VALID_LENGTHS.include? tracking_number.size
end