Sha256: 768b73b7f49e75a89dccd2b75e4eaff6eae78a9473602de4c7cfe5b0e737a62b

Contents?: true

Size: 1.36 KB

Versions: 11

Compression:

Stored size: 1.36 KB

Contents

class GtinValidator < ActiveModel::EachValidator

  def validate_each(record, attribute, value)
    unless valid?(value, options)
      record.errors[attribute] << (options[:message] || I18n.t('flash_validators.errors.messages.gtin'))
    end
  end

  private

  def includes_key?(value, options)
    value.any? { |key| options.keys.include?(key) }
  end

  def valid_format?(value, options)
    if options[:strict]
      value =~ /^[0-9]+$/
    else
      value =~ /^[0-9 ]+$/
    end
  end

  def valid_length?(value, options)
    value_size = value.size

    case options[:format]
    when :ean_8, :gtin_8, :ucc_8
      value_size == 8
    when :gtin_12, :upc, :upc_a
      value_size == 12
    when :ean, :ean_13, :gtin_13, :ucc_13
      value_size == 13
    when :gtin_14, :ucc_14
      value_size == 14
    else
      [8, 12, 13, 14].include?(value_size)
    end
  end

  def valid_checksum?(value)
    reversed_values = value.reverse
    odd = even = 0

    (1..(reversed_values.length - 1)).each do |i|
      i.even? ? (even += reversed_values[i].chr.to_i) : (odd += reversed_values[i].chr.to_i)
    end

    reversed_values[0].chr.to_i == (10 - ((odd * 3) + even) % 10)
  end

  def valid?(value, options)
    striped_value = value.to_s.gsub(/\D/, '')

    valid_format?(value, options) &&
    valid_length?(striped_value, options) &&
    valid_checksum?(striped_value)
  end

end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
flash_validators-3.0.12 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.11 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.10 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.9 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.8 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.7 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.6 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.5 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.4 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.3 lib/flash_validators/validators/gtin_validator.rb
flash_validators-3.0.2 lib/flash_validators/validators/gtin_validator.rb