-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
number_generator.rb
51 lines (45 loc) 路 1.44 KB
/
number_generator.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# frozen_string_literal: true
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 order_count > (10**@length / 2)
else
break random
end
end
end
private
def order_count
@order_count ||= Spree::Order.count
end
end
end