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
- #all_reserved_serial_numbers ⇒ Object
- #all_reserved_serial_numbers_available? ⇒ Boolean
- #auto_reserve_serial_numbers ⇒ Object
- #available_serial_numbers ⇒ Object
- #commit_reserved_serial_numbers ⇒ Object
- #fully_reserved? ⇒ Boolean
- #kit_components_requires_reservation? ⇒ Boolean
- #link_serial_numbers ⇒ Object
- #rejoin_serial_numbers ⇒ Object
- #require_reservation? ⇒ Boolean
- #reservable_item ⇒ Object
- #reservable_store_item ⇒ Object
- #show_serial_number_toggle? ⇒ Boolean
- #skip_reservation_screen? ⇒ Boolean
- #split_serial_numbers ⇒ Object
- #total_reserved_serial_numbers ⇒ Object
- #uncommit_reserved_serial_numbers ⇒ Object
- #unlink_serial_numbers ⇒ Object
- #update_serial_numbers_shipped_count ⇒ Object
Instance Method Details
#all_reserved_serial_numbers ⇒ Object
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
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_numbers ⇒ Object
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_numbers ⇒ Object
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_numbers ⇒ Object
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
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
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 |
#link_serial_numbers ⇒ Object
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_numbers ⇒ Object
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
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_item ⇒ Object
20 21 22 |
# File 'app/concerns/models/reservable.rb', line 20 def reservable_item item end |
#reservable_store_item ⇒ Object
24 25 26 |
# File 'app/concerns/models/reservable.rb', line 24 def reservable_store_item store_item end |
#reserved_serial_numbers ⇒ ActiveRecord::Relation<ReservedSerialNumber>
9 |
# File 'app/concerns/models/reservable.rb', line 9 has_many :reserved_serial_numbers, dependent: :destroy |
#serial_numbers ⇒ ActiveRecord::Relation<SerialNumber>
10 |
# File 'app/concerns/models/reservable.rb', line 10 has_and_belongs_to_many :serial_numbers |
#show_serial_number_toggle? ⇒ 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
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_numbers ⇒ Object
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_numbers ⇒ Object
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_numbers ⇒ Object
62 63 64 |
# File 'app/concerns/models/reservable.rb', line 62 def uncommit_reserved_serial_numbers update_reserved_serial_numbers_committed(false) end |
#unlink_serial_numbers ⇒ Object
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_count ⇒ Object
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 |