Module: Models::Reservable

Extended by:
ActiveSupport::Concern
Included in:
LineItem
Defined in:
app/concerns/models/reservable.rb

Overview

ActiveSupport::Concern mixin: reservable.

Has many collapse

Has and belongs to many collapse

Instance Method Summary collapse

Instance Method Details

#all_reserved_serial_numbersObject



76
77
78
79
80
# File 'app/concerns/models/reservable.rb', line 76

def all_reserved_serial_numbers
  res = reserved_serial_numbers.to_a
  children.each { |c| res = res.concat(c.reserved_serial_numbers) }
  res
end

#all_reserved_serial_numbers_available?Boolean

Returns:

  • (Boolean)


55
56
57
# File 'app/concerns/models/reservable.rb', line 55

def all_reserved_serial_numbers_available?
  reserved_serial_numbers.all? { |rsn| rsn.serial_number.qty_available >= rsn.qty }
end

#auto_reserve_serial_numbersObject



98
99
100
101
102
103
104
105
# File 'app/concerns/models/reservable.rb', line 98

def auto_reserve_serial_numbers
  qty_to_reserve = quantity - total_reserved_serial_numbers
  if qty_to_reserve > 0
    matching_serial_number = available_serial_numbers.select { |sn| sn.qty_available >= qty_to_reserve }.min_by { |sn| [sn.qty_available, -sn.qty_unreserved, sn.shipped_count || 0] } # make this into some clever SQL
    reserved_serial_numbers.create(serial_number: matching_serial_number, qty: qty_to_reserve) if matching_serial_number.present?
  end
  true
end

#available_serial_numbersObject



43
44
45
# File 'app/concerns/models/reservable.rb', line 43

def available_serial_numbers
  reservable_store_item.serial_numbers.available.sort_by { |sn| [sn.qty_available, sn.number] }
end

#commit_reserved_serial_numbersObject



59
60
61
# File 'app/concerns/models/reservable.rb', line 59

def commit_reserved_serial_numbers
  update_reserved_serial_numbers_committed(true)
end

#fully_reserved?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'app/concerns/models/reservable.rb', line 51

def fully_reserved?
  total_reserved_serial_numbers == quantity
end

#kit_components_requires_reservation?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'app/concerns/models/reservable.rb', line 33

def kit_components_requires_reservation?
  reservable_item.is_kit? && reservable_item.kit_components.any?(&:require_reservation?)
end


82
83
84
85
86
87
# File 'app/concerns/models/reservable.rb', line 82

def link_serial_numbers
  reserved_serial_numbers.each do |rsn|
    serial_numbers << rsn.serial_number
    rsn.serial_number.trigger_shipped
  end
end

#rejoin_serial_numbersObject



71
72
73
74
# File 'app/concerns/models/reservable.rb', line 71

def rejoin_serial_numbers
  # reload here after each one or else the total on the original gets messed up
  reserved_serial_numbers.each { |rsn| rsn.reload.rejoin_serial_number }
end

#require_reservation?Boolean

Returns:

  • (Boolean)


37
38
39
40
41
# File 'app/concerns/models/reservable.rb', line 37

def require_reservation?
  resource.respond_to?(:can_auto_reserve_serial_numbers?) &&
    resource.can_auto_reserve_serial_numbers? &&
    reservable_item&.require_reservation?
end

#reservable_itemObject



21
22
23
# File 'app/concerns/models/reservable.rb', line 21

def reservable_item
  item
end

#reservable_store_itemObject



25
26
27
# File 'app/concerns/models/reservable.rb', line 25

def reservable_store_item
  store_item
end

#reserved_serial_numbersActiveRecord::Relation<ReservedSerialNumber>

Returns:

See Also:



10
# File 'app/concerns/models/reservable.rb', line 10

has_many :reserved_serial_numbers, dependent: :destroy

#serial_numbersActiveRecord::Relation<SerialNumber>

Returns:

See Also:



11
# File 'app/concerns/models/reservable.rb', line 11

has_and_belongs_to_many :serial_numbers

#show_serial_number_toggle?Boolean

Returns:

  • (Boolean)


107
108
109
# File 'app/concerns/models/reservable.rb', line 107

def show_serial_number_toggle?
  require_reservation? or serial_numbers.present? or reserved_serial_numbers.present?
end

#skip_reservation_screen?Boolean

Returns:

  • (Boolean)


29
30
31
# File 'app/concerns/models/reservable.rb', line 29

def skip_reservation_screen?
  fully_reserved? && reservable_item.skip_serial_number_reservation_screen?
end

#split_serial_numbersObject



67
68
69
# File 'app/concerns/models/reservable.rb', line 67

def split_serial_numbers
  reserved_serial_numbers.each { |rsn| rsn.reload.split_serial_number }
end

#total_reserved_serial_numbersObject



47
48
49
# File 'app/concerns/models/reservable.rb', line 47

def total_reserved_serial_numbers
  reserved_serial_numbers.reject(&:marked_for_destruction?).sum { |rsn| rsn.qty || 0 }
end

#uncommit_reserved_serial_numbersObject



63
64
65
# File 'app/concerns/models/reservable.rb', line 63

def uncommit_reserved_serial_numbers
  update_reserved_serial_numbers_committed(false)
end


89
90
91
92
# File 'app/concerns/models/reservable.rb', line 89

def unlink_serial_numbers
  serial_numbers.each(&:trigger_available)
  serial_numbers.clear
end

#update_serial_numbers_shipped_countObject



94
95
96
# File 'app/concerns/models/reservable.rb', line 94

def update_serial_numbers_shipped_count
  serial_numbers.each { |sn| sn.update_attribute!(:shipped_count, (sn.shipped_count || 0) + quantity) }
end