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
- #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
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
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_numbers ⇒ Object
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_numbers ⇒ Object
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_numbers ⇒ Object
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
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
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 |
#link_serial_numbers ⇒ Object
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_numbers ⇒ Object
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
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_item ⇒ Object
21 22 23 |
# File 'app/concerns/models/reservable.rb', line 21 def reservable_item item end |
#reservable_store_item ⇒ Object
25 26 27 |
# File 'app/concerns/models/reservable.rb', line 25 def reservable_store_item store_item end |
#reserved_serial_numbers ⇒ ActiveRecord::Relation<ReservedSerialNumber>
10 |
# File 'app/concerns/models/reservable.rb', line 10 has_many :reserved_serial_numbers, dependent: :destroy |
#serial_numbers ⇒ ActiveRecord::Relation<SerialNumber>
11 |
# File 'app/concerns/models/reservable.rb', line 11 has_and_belongs_to_many :serial_numbers |
#show_serial_number_toggle? ⇒ 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
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_numbers ⇒ Object
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_numbers ⇒ Object
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_numbers ⇒ Object
63 64 65 |
# File 'app/concerns/models/reservable.rb', line 63 def uncommit_reserved_serial_numbers update_reserved_serial_numbers_committed(false) end |
#unlink_serial_numbers ⇒ Object
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_count ⇒ Object
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 |