class DigitChecksum::BaseDocument

Constants

CLASS_METHODS
CLASS_METHODS_DELEGATES

Attributes

number[RW]

Public Class Methods

new(number) click to toggle source
# File lib/digit_checksum/base_document.rb, line 33
def initialize(number)
  @number = stripped(number)
end

Public Instance Methods

append_verify_digits!() click to toggle source
# File lib/digit_checksum/base_document.rb, line 97
def append_verify_digits!
  digits = calculate_verify_digits

  if (!valid_length? && digits != current_verify_digits)
    @number = normalize

    verify_digits_positions.each_with_index.flat_map {|position, index|
      # position + index
      @number.insert(position, digits.shift)
    }
  end

  @number = stripped(@number)
end
as_array()
Alias for: normalize
calculate_verify_digits() click to toggle source
# File lib/digit_checksum/base_document.rb, line 71
def calculate_verify_digits
  number = without_verify_digits(@number)
  digits = []
  digits_positions = verify_digits_positions.dup

  return [] unless number.size == root_digits_count

  get_verify_digits_weights.each_with_index do |data, index|
    position, weights = *data

    current_number = normalized(number, weights.size)
    verify_digit = calculate_verify_digit(current_number, weights)

    # just update ref to calculate next digit
    number.insert((digits_positions.shift + index), verify_digit)

    digits << verify_digit
  end

  digits
end
clear()
Alias for: strip
current_verify_digits() click to toggle source
# File lib/digit_checksum/base_document.rb, line 67
def current_verify_digits
  remove_verify_digits(@number.dup)
end
empty?() click to toggle source
# File lib/digit_checksum/base_document.rb, line 49
def empty?
  @number.nil? || @number.empty?
end
formatted()
Alias for: pretty
full_size() click to toggle source
# File lib/digit_checksum/base_document.rb, line 57
def full_size
  (root_digits_count + verify_digits_count)
end
invalid?() click to toggle source
# File lib/digit_checksum/base_document.rb, line 45
def invalid?
  !valid?
end
length()
Alias for: size
normalize() click to toggle source
# File lib/digit_checksum/base_document.rb, line 112
def normalize
  normalized(@number)
end
Also aliased as: as_array
pretty() click to toggle source
# File lib/digit_checksum/base_document.rb, line 116
def pretty
  numbers = @number.to_s.scan(get_format_regexp).flatten
  numbers.empty? ? '' : (get_pretty_format_mask % numbers)
end
Also aliased as: formatted
remove_verify_digits!() click to toggle source
# File lib/digit_checksum/base_document.rb, line 93
def remove_verify_digits!
  remove_verify_digits(@number)
end
root_digits_count() click to toggle source
# File lib/digit_checksum/base_document.rb, line 133
def root_digits_count
  self.class.root_digits_count
end
size() click to toggle source
# File lib/digit_checksum/base_document.rb, line 61
def size
  normalize.length
end
Also aliased as: length
strip() click to toggle source
# File lib/digit_checksum/base_document.rb, line 121
def strip
  stripped(@number)
end
Also aliased as: clear
to_s() click to toggle source
# File lib/digit_checksum/base_document.rb, line 125
def to_s
  @number
end
valid?() click to toggle source
# File lib/digit_checksum/base_document.rb, line 37
def valid?
  # if document is empty or dont match the exact size, it's invalid
  return false if (empty? || !valid_length?)

  # match current verify digits with calculate through modulo operation
  current_verify_digits == calculate_verify_digits
end
valid_length?() click to toggle source
# File lib/digit_checksum/base_document.rb, line 53
def valid_length?
  size == full_size
end
verify_digits_count() click to toggle source
# File lib/digit_checksum/base_document.rb, line 129
def verify_digits_count
  get_verify_digits_weights.size
end
verify_digits_positions() click to toggle source
# File lib/digit_checksum/base_document.rb, line 137
def verify_digits_positions
  begin
    get_verify_digits_positions
  # when value its not set
  rescue NameError => e
    default_verify_digits_position
  end
end

Private Instance Methods

calc_verify_digit(quotient_rest) click to toggle source
# File lib/digit_checksum/base_document.rb, line 207
def calc_verify_digit(quotient_rest)
  rest = (get_division_modulo - quotient_rest).to_i

  # if rest has two digits(checkdigit must be a single digit), force 0
  return 0 if rest >= 10

  rest
end
calculate_digits_data(number, weights) click to toggle source
# File lib/digit_checksum/base_document.rb, line 187
def calculate_digits_data(number, weights)
  sum = reduce_digits_weights(number, weights)
  quotient = (sum / get_division_modulo)
  rest = calculate_rest(sum, quotient)

  { sum: sum, quotient: quotient, rest: rest }
end
calculate_rest(sum, quotient) click to toggle source
# File lib/digit_checksum/base_document.rb, line 203
def calculate_rest(sum, quotient)
  (sum % get_division_modulo)
end
calculate_verify_digit(number, weights) click to toggle source
# File lib/digit_checksum/base_document.rb, line 181
def calculate_verify_digit(number, weights)
  data = calculate_digits_data(number, weights)

  calc_verify_digit(data[:rest])
end
default_verify_digits_position() click to toggle source
# File lib/digit_checksum/base_document.rb, line 177
def default_verify_digits_position
  verify_digits_count.times.map {|i| root_digits_count + i  }
end
normalized(number, length = nil) click to toggle source
# File lib/digit_checksum/base_document.rb, line 155
def normalized(number, length = nil)
  number = stripped(number).split(//).map(&:to_i)

  length.nil? ? number : number[0, length]
end
reduce_digits_weights(number, weights) click to toggle source
# File lib/digit_checksum/base_document.rb, line 195
def reduce_digits_weights(number, weights)
  number = normalized(number)

  number.each_with_index.map {|n,i|
    n.to_i * weights[i].to_i
  }.reduce(:+).to_f
end
remove_verify_digits(number) click to toggle source
# File lib/digit_checksum/base_document.rb, line 161
def remove_verify_digits(number)
  return [] unless number.size == full_size

  verify_digits_positions.each_with_index.flat_map {|position, index|
    number.slice!(position - index, 1)
  }.map(&:to_i)
end
stripped(number) click to toggle source
# File lib/digit_checksum/base_document.rb, line 151
def stripped(number)
  number.to_s.gsub(get_clear_number_regexp, '')
end
without_verify_digits(number) click to toggle source
# File lib/digit_checksum/base_document.rb, line 169
def without_verify_digits(number)
  number = normalized(number)

  return number unless number.size == full_size

  remove_verify_digits(number) and number
end