Sha256: f9facf86126173858d08239c6e76fc6b9b1bc24e0af4ae504c6cc850e4a72cb9

Contents?: true

Size: 922 Bytes

Versions: 7

Compression:

Stored size: 922 Bytes

Contents

module RussianPost
  class BarcodeValidator
    attr_reader :barcode, :digits

    INTERNATIONAL_FORMAT = /\A([A-Z]{2}\d{9}[A-Z]{2})\Z/
    DOMESTIC_FORMAT      = /\A(\d{14})\Z/
    WEIGHT_FACTORS       = [8, 6, 4, 2, 3, 5, 9, 7, 0]

    def self.validate(barcode)
      new(barcode).valid?
    end

    def initialize(barcode)
      @barcode = barcode
      @digits  = barcode.digits
    end

    def valid?
      valid_international? || valid_domestic?
    end


    private

    def valid_international?
      barcode =~ INTERNATIONAL_FORMAT && digits.last == checkdigit
    end

    def valid_domestic?
      barcode =~ DOMESTIC_FORMAT
    end

    def checkdigit
      if (1..9).include? checksum
        checksum
      else 
        checksum == 10 ? 0 : 5
      end
    end
    
    def checksum
      product = digits.zip(WEIGHT_FACTORS)
      (11 - product.map{|i| i.reduce(:*)}.reduce(:+)) % 11
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
russianpost-0.4.5 lib/russianpost/barcode_validator.rb
russianpost-0.4.4 lib/russianpost/barcode_validator.rb
russianpost-0.4.3 lib/russianpost/barcode_validator.rb
russianpost-0.4.2 lib/russianpost/barcode_validator.rb
russianpost-0.4.1 lib/russianpost/barcode_validator.rb
russianpost-0.4.0 lib/russianpost/barcode_validator.rb
russianpost-0.3.1 lib/russianpost/barcode_validator.rb