Sha256: 0a6d134fcb77349e3abf9d2eef6a7bd21c940d765f6a8e291f75030152f75f15

Contents?: true

Size: 1.33 KB

Versions: 17

Compression:

Stored size: 1.33 KB

Contents

module Spree
  # Generates order numbers
  #
  # In order to change the way your order numbers get generated you can either
  # set your own instance of this class in your stores configuration with different options:
  #
  #     Spree::Config.order_number_generator = Spree::Order::NumberGenerator.new(
  #       prefix: 'B',
  #       lenght: 8,
  #       letters: false
  #     )
  #
  # or create your own class:
  #
  #     Spree::Config.order_number_generator = My::OrderNumberGenerator.new
  #
  class Order::NumberGenerator
    attr_reader :letters, :prefix

    def initialize(options = {})
      @length = options[:length] || Spree::Order::ORDER_NUMBER_LENGTH
      @letters = options[:letters] || Spree::Order::ORDER_NUMBER_LETTERS
      @prefix = options[:prefix] || Spree::Order::ORDER_NUMBER_PREFIX
    end

    def generate
      possible = (0..9).to_a
      possible += ('A'..'Z').to_a if letters

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

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
solidus_core-2.5.2 app/models/spree/order/number_generator.rb
solidus_core-2.5.1 app/models/spree/order/number_generator.rb
solidus_core-2.5.0 app/models/spree/order/number_generator.rb
solidus_core-2.5.0.rc1 app/models/spree/order/number_generator.rb
solidus_core-2.5.0.beta2 app/models/spree/order/number_generator.rb
solidus_core-2.5.0.beta1 app/models/spree/order/number_generator.rb
solidus_core-2.4.2 app/models/spree/order/number_generator.rb
solidus_core-2.3.1 app/models/spree/order/number_generator.rb
solidus_core-2.4.1 app/models/spree/order/number_generator.rb
solidus_core-2.4.0 app/models/spree/order/number_generator.rb
solidus_core-2.4.0.rc1 app/models/spree/order/number_generator.rb
solidus_core-2.4.0.beta1 app/models/spree/order/number_generator.rb
solidus_core-2.3.0 app/models/spree/order/number_generator.rb
solidus_core-2.3.0.rc3 app/models/spree/order/number_generator.rb
solidus_core-2.3.0.rc2 app/models/spree/order/number_generator.rb
solidus_core-2.3.0.rc1 app/models/spree/order/number_generator.rb
solidus_core-2.3.0.beta1 app/models/spree/order/number_generator.rb