Sha256: 839ca416b3e930cc25976264f812a16b05e70c1a1d836fa2c0f6221974cdb537

Contents?: true

Size: 1.13 KB

Versions: 12

Compression:

Stored size: 1.13 KB

Contents

module Spree
  module NumberGenerator
    extend ActiveSupport::Concern

    NUMBER_LENGTH  = 9
    NUMBER_LETTERS = false
    NUMBER_PREFIX  = 'N'

    included do
      before_validation :generate_number, on: :create # generate number before make_permalink
      validates :number, presence: true, uniqueness: true
    end

    def self.by_number(number)
      where(number: number)
    end

    def generate_number(options = {})
      options[:length]  ||= NUMBER_LENGTH
      options[:letters] ||= NUMBER_LETTERS
      options[:prefix]  ||= NUMBER_PREFIX

      possible = (0..9).to_a
      possible += ('A'..'Z').to_a if options[:letters]

      self.number ||= loop do
        # Make a random number.
        random = "#{options[:prefix]}#{(0...options[:length]).map { possible.shuffle.first }.join}"
        # Use the random  number if no other order exists with it.
        if self.class.exists?(number: random)
          # If over half of all possible options are taken add another digit.
          options[:length] += 1 if self.class.count > (10 ** options[:length] / 2)
        else
          break random
        end
      end
    end
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
spree_core-3.0.10 app/models/concerns/spree/number_generator.rb
spree_core-3.0.9 app/models/concerns/spree/number_generator.rb
spree_core-3.0.8 app/models/concerns/spree/number_generator.rb
spree_core-3.0.7 app/models/concerns/spree/number_generator.rb
spree_core-3.0.6.1 app/models/concerns/spree/number_generator.rb
spree_core-3.0.6 app/models/concerns/spree/number_generator.rb
spree_core-3.0.5 app/models/concerns/spree/number_generator.rb
spree_core-3.0.4 app/models/concerns/spree/number_generator.rb
spree_core-3.0.3 app/models/concerns/spree/number_generator.rb
spree_core-3.0.2 app/models/concerns/spree/number_generator.rb
spree_core-3.0.1 app/models/concerns/spree/number_generator.rb
spree_core-3.0.0 app/models/concerns/spree/number_generator.rb