Module: Spree::NumberGenerator

Extended by:
ActiveSupport::Concern
Included in:
Order, Payment, Shipment, StockTransfer
Defined in:
app/models/concerns/spree/number_generator.rb

Constant Summary collapse

NUMBER_LENGTH =
9
NUMBER_LETTERS =
false
NUMBER_PREFIX =
'N'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.by_number(number) ⇒ Object



14
15
16
# File 'app/models/concerns/spree/number_generator.rb', line 14

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

Instance Method Details

#generate_number(options = {}) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'app/models/concerns/spree/number_generator.rb', line 18

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