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
9 10 11 12 |
# File 'app/models/spree/stock/package.rb', line 9 def initialize(stock_location, contents = []) @stock_location = stock_location @contents = contents end |
Instance Attribute Details
#contents ⇒ Object (readonly)
Returns the value of attribute contents.
4 5 6 |
# File 'app/models/spree/stock/package.rb', line 4 def contents @contents end |
#shipment ⇒ Object
Returns the value of attribute shipment.
5 6 7 |
# File 'app/models/spree/stock/package.rb', line 5 def shipment @shipment end |
#stock_location ⇒ Object (readonly)
Returns the value of attribute stock_location.
4 5 6 |
# File 'app/models/spree/stock/package.rb', line 4 def stock_location @stock_location end |
Instance Method Details
#add(inventory_unit, state = :on_hand) ⇒ Object
Adds an inventory unit to this package.
20 21 22 |
# File 'app/models/spree/stock/package.rb', line 20 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.
30 31 32 |
# File 'app/models/spree/stock/package.rb', line 30 def add_multiple(inventory_units, state = :on_hand) inventory_units.each { |inventory_unit| add(inventory_unit, state) } end |
#backordered ⇒ Array<Spree::Stock::ContentItem>
63 64 65 |
# File 'app/models/spree/stock/package.rb', line 63 def backordered contents.select(&:backordered?) end |
#currency ⇒ String
97 98 99 |
# File 'app/models/spree/stock/package.rb', line 97 def currency order.currency end |
#empty? ⇒ Boolean
92 93 94 |
# File 'app/models/spree/stock/package.rb', line 92 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.
74 75 76 77 78 79 |
# File 'app/models/spree/stock/package.rb', line 74 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>
57 58 59 |
# File 'app/models/spree/stock/package.rb', line 57 def on_hand contents.select(&:on_hand?) end |
#order ⇒ Spree::Order
44 45 46 47 48 |
# File 'app/models/spree/stock/package.rb', line 44 def order # Fix regression that removed package.order. # Find it dynamically through an inventory_unit. contents.detect { |item| !!item.try(:inventory_unit).try(:order) }.try(:inventory_unit).try(:order) end |
#quantity(state = nil) ⇒ Fixnum
85 86 87 88 |
# File 'app/models/spree/stock/package.rb', line 85 def quantity(state = nil) matched_contents = state.nil? ? contents : contents.select { |c| c.state.to_s == state.to_s } matched_contents.map(&:quantity).sum end |
#remove(inventory_unit) ⇒ Object
Removes a given inventory unit from this package.
38 39 40 41 |
# File 'app/models/spree/stock/package.rb', line 38 def remove(inventory_unit) item = find_item(inventory_unit) @contents -= [item] if item end |
#shipping_categories ⇒ Array<Spree::ShippingCategory>
103 104 105 |
# File 'app/models/spree/stock/package.rb', line 103 def shipping_categories Spree::ShippingCategory.where(id: shipping_category_ids) end |
#shipping_methods ⇒ ActiveRecord::Relation
109 110 111 112 113 |
# File 'app/models/spree/stock/package.rb', line 109 def shipping_methods Spree::ShippingMethod. with_all_shipping_category_ids(shipping_category_ids). available_in_stock_location(stock_location) end |
#to_shipment ⇒ Spree::Shipment
118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'app/models/spree/stock/package.rb', line 118 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
51 52 53 |
# File 'app/models/spree/stock/package.rb', line 51 def weight contents.sum(&:weight) end |