Module: Models::Reservable

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

Has many collapse

Has and belongs to many collapse

Instance Method Summary collapse

Instance Method Details

#all_reserved_serial_numbersObject



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

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)


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

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

#auto_reserve_serial_numbersObject



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

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
    if matching_serial_number.present?
      reserved_serial_numbers.create(serial_number: matching_serial_number, qty: qty_to_reserve)
    end
  end
  true
end

#available_serial_numbersObject



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

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

#commit_reserved_serial_numbersObject



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

def commit_reserved_serial_numbers
  update_reserved_serial_numbers_committed(true)
end

#fully_reserved?Boolean

Returns:

  • (Boolean)


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

def fully_reserved?
  total_reserved_serial_numbers == quantity
end

#kit_components_requires_reservation?Boolean

Returns:

  • (Boolean)


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

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


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

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



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

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)


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

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

#reservable_itemObject



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

def reservable_item
  item
end

#reservable_store_itemObject



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

def reservable_store_item
  store_item
end

#reserved_serial_numbersActiveRecord::Relation<ReservedSerialNumber>

Returns:

See Also:



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

has_many :reserved_serial_numbers, dependent: :destroy

#serial_numbersActiveRecord::Relation<SerialNumber>

Returns:

See Also:



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

has_and_belongs_to_many :serial_numbers

#show_serial_number_toggle?Boolean

Returns:

  • (Boolean)


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

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

#skip_reservation_screen?Boolean

Returns:

  • (Boolean)


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

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

#split_serial_numbersObject



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

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

#total_reserved_serial_numbersObject



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

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

#uncommit_reserved_serial_numbersObject



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

def uncommit_reserved_serial_numbers
  update_reserved_serial_numbers_committed(false)
end


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

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

#update_serial_numbers_shipped_countObject



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

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