Class: SequenceGenerator::Sequence

Inherits:
ApplicationRecord show all
Defined in:
app/models/sequence_generator/sequence.rb

Instance Method Summary collapse

Instance Method Details

#generate_next(options, model) ⇒ Object



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
# File 'app/models/sequence_generator/sequence.rb', line 6

def generate_next(options, model)
  date_to_consider = Time.now
  if options[:date_column] && model.send(options[:date_column])
    date_to_consider = model.send(options[:date_column])
  end

  prefix = name.gsub(/[\(\{][^(){}]*?[\)\}]/) do |x|
    fragment = x[1..-2] # strip () or {}
    resolve_fragment(fragment, model, date_to_consider)
  end

  # Build sequence-driving prefix (only () fields)
  sequence_prefix = name.gsub(/[\(\{][^(){}]*?[\)\}]/) do |x|
    fragment = x[1..-2]
    if x.start_with?("(")
      resolve_fragment(fragment, model, date_to_consider)
    else
      ""
    end
  end


  # Handle numeric padding
  prefix = !prefix[/#+/] ? prefix + "#####" : prefix
  digits = prefix[/#+/].length
  prefix_without_digits, suffix = prefix.split(/#+/)
  sequence_prefix_without_digits, sequence_suffix = sequence_prefix.split(/#+/)

  # Use only sequence-driving prefix for lookup
  next_number = options[:next_number] || CurrentSequence.get_next_number(sequence_prefix_without_digits, scope, purpose)
  sequence_number = "%0#{digits}d" % (next_number).to_s
  prefix_without_digits + sequence_number + (suffix || '')
end

#resolve_fragment(fragment, model, date_to_consider) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'app/models/sequence_generator/sequence.rb', line 40

def resolve_fragment(fragment, model, date_to_consider)
  case fragment
  when "YYYY"
    date_to_consider.strftime('%Y')
  when "YY"
    date_to_consider.strftime('%y')
  when "IFYY"
    fy_start = DateTime.new(date_to_consider.year, 4, 1, 0, 0, 0, Rational(5.5,24))
    if date_to_consider > fy_start
      "#{date_to_consider.strftime('%y')}-#{date_to_consider.next_year.strftime('%y')}"
    else
      "#{date_to_consider.prev_year.strftime('%y')}-#{date_to_consider.strftime('%y')}"
    end
  when "IFY"
    fy_start = DateTime.new(date_to_consider.year, 4, 1, 0, 0, 0, Rational(5.5,24))
    if date_to_consider > fy_start
      "#{date_to_consider.strftime('%y')}#{date_to_consider.next_year.strftime('%y')}"
    else
      "#{date_to_consider.prev_year.strftime('%y')}#{date_to_consider.strftime('%y')}"
    end
  when "MM"
    date_to_consider.strftime('%m')
  when "/"
    "/"
  else
    model.send(fragment)
  end
end