Class: Spree::Stock::Package
- Inherits:
-
Object
- Object
- Spree::Stock::Package
- Defined in:
- app/models/spree/stock/package.rb
Instance Attribute Summary collapse
-
#contents ⇒ Object
readonly
Returns the value of attribute contents.
-
#shipment ⇒ Object
Returns the value of attribute shipment.
-
#stock_location ⇒ Object
readonly
Returns the value of attribute stock_location.
Instance Method Summary collapse
-
#add(inventory_unit, state = :on_hand) ⇒ Object
Adds an inventory unit to this package.
-
#add_multiple(inventory_units, state = :on_hand) ⇒ Object
Adds multiple inventory units to this package.
-
#backordered ⇒ Array<Spree::Stock::ContentItem>
The content items in this package which are backordered.
-
#currency ⇒ String
The currency of the order this package belongs to.
-
#empty? ⇒ Boolean
True if there are no inventory units in this package.
-
#find_item(inventory_unit, state = nil) ⇒ Object
Find a content item in this package by inventory unit and optionally state.
-
#initialize(stock_location, contents = []) ⇒ Package
constructor
A new instance of Package.
-
#on_hand ⇒ Array<Spree::Stock::ContentItem>
The content items in this package which are on hand.
-
#order ⇒ Spree::Order
The order associated with this package.
-
#quantity(state = nil) ⇒ Fixnum
The number of inventory units in the package, counting only those in the given state if it was specified.
-
#remove(inventory_unit) ⇒ Object
Removes a given inventory unit from this package.
-
#shipping_categories ⇒ Array<Spree::ShippingCategory>
The shipping categories of the variants in this package.
-
#shipping_methods ⇒ ActiveRecord::Relation
The [Spree::ShippingMethod]s available for this pacakge based on the stock location and shipping categories.
-
#to_shipment ⇒ Spree::Shipment
A new shipment containing this package’s inventory units, with the appropriate shipping rates and associated with the correct stock location.
-
#weight ⇒ Float
The summed weight of the contents of this package.
Constructor Details
#initialize(stock_location, contents = []) ⇒ Package
11 12 13 14 |
# File 'app/models/spree/stock/package.rb', line 11 def initialize(stock_location, contents = []) @stock_location = stock_location @contents = contents end |
Instance Attribute Details
#contents ⇒ Object (readonly)
Returns the value of attribute contents.
6 7 8 |
# File 'app/models/spree/stock/package.rb', line 6 def contents @contents end |
#shipment ⇒ Object
Returns the value of attribute shipment.
7 8 9 |
# File 'app/models/spree/stock/package.rb', line 7 def shipment @shipment end |
#stock_location ⇒ Object (readonly)
Returns the value of attribute stock_location.
6 7 8 |
# File 'app/models/spree/stock/package.rb', line 6 def stock_location @stock_location end |
Instance Method Details
#add(inventory_unit, state = :on_hand) ⇒ Object
Adds an inventory unit to this package.
22 23 24 |
# File 'app/models/spree/stock/package.rb', line 22 def add(inventory_unit, state = :on_hand) contents << ContentItem.new(inventory_unit, state) unless find_item(inventory_unit) end |
#add_multiple(inventory_units, state = :on_hand) ⇒ Object
Adds multiple inventory units to this package.
32 33 34 |
# File 'app/models/spree/stock/package.rb', line 32 def add_multiple(inventory_units, state = :on_hand) inventory_units.each { |inventory_unit| add(inventory_unit, state) } end |
#backordered ⇒ Array<Spree::Stock::ContentItem>
65 66 67 |
# File 'app/models/spree/stock/package.rb', line 65 def backordered contents.select(&:backordered?) end |
#currency ⇒ String
99 100 101 |
# File 'app/models/spree/stock/package.rb', line 99 def currency order.currency end |
#empty? ⇒ Boolean
94 95 96 |
# File 'app/models/spree/stock/package.rb', line 94 def empty? quantity == 0 end |
#find_item(inventory_unit, state = nil) ⇒ Object
Find a content item in this package by inventory unit and optionally state.
76 77 78 79 80 81 |
# File 'app/models/spree/stock/package.rb', line 76 def find_item(inventory_unit, state = nil) contents.detect do |item| item.inventory_unit == inventory_unit && (!state || item.state.to_s == state.to_s) end end |
#on_hand ⇒ Array<Spree::Stock::ContentItem>
59 60 61 |
# File 'app/models/spree/stock/package.rb', line 59 def on_hand contents.select(&:on_hand?) end |
#order ⇒ Spree::Order
46 47 48 49 50 |
# File 'app/models/spree/stock/package.rb', line 46 def order # Fix regression that removed package.order. # Find it dynamically through an inventory_unit. contents.detect { |item| !!item.try(:line_item).try(:order) }.try(:line_item).try(:order) end |
#quantity(state = nil) ⇒ Fixnum
87 88 89 90 |
# File 'app/models/spree/stock/package.rb', line 87 def quantity(state = nil) matched_contents = state.nil? ? contents : contents.select { |content| content.state.to_s == state.to_s } matched_contents.sum(&:quantity) end |
#remove(inventory_unit) ⇒ Object
Removes a given inventory unit from this package.
40 41 42 43 |
# File 'app/models/spree/stock/package.rb', line 40 def remove(inventory_unit) item = find_item(inventory_unit) @contents -= [item] if item end |
#shipping_categories ⇒ Array<Spree::ShippingCategory>
105 106 107 |
# File 'app/models/spree/stock/package.rb', line 105 def shipping_categories Spree::ShippingCategory.where(id: shipping_category_ids) end |
#shipping_methods ⇒ ActiveRecord::Relation
111 112 113 114 115 |
# File 'app/models/spree/stock/package.rb', line 111 def shipping_methods Spree::ShippingMethod. with_all_shipping_category_ids(shipping_category_ids). available_in_stock_location(stock_location) end |
#to_shipment ⇒ Spree::Shipment
120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'app/models/spree/stock/package.rb', line 120 def to_shipment # At this point we should only have one content item per inventory unit # across the entire set of inventory units to be shipped, which has # been taken care of by the Prioritizer contents.each { |content_item| content_item.inventory_unit.state = content_item.state.to_s } Spree::Shipment.new( order: order, stock_location: stock_location, inventory_units: contents.map(&:inventory_unit) ) end |
#weight ⇒ Float
53 54 55 |
# File 'app/models/spree/stock/package.rb', line 53 def weight contents.sum(&:weight) end |