Class: Spree::Stock::Package

Inherits:
Object
  • Object
show all
Defined in:
app/models/spree/stock/package.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(stock_location, contents = []) ⇒ Package

Returns a new instance of Package

Parameters:



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

#contentsObject (readonly)

Returns the value of attribute contents



6
7
8
# File 'app/models/spree/stock/package.rb', line 6

def contents
  @contents
end

#shipmentObject

Returns the value of attribute shipment



7
8
9
# File 'app/models/spree/stock/package.rb', line 7

def shipment
  @shipment
end

#stock_locationObject (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.

Parameters:

  • inventory_unit (Spree::InventoryUnit)

    an inventory unit to be added to this package

  • state (:on_hand, :backordered) (defaults to: :on_hand)

    the state of the item to be added 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.

Parameters:

  • inventory_units (Array<Spree::InventoryUnit>)

    a collection of inventory units to be added to this package

  • state (:on_hand, :backordered) (defaults to: :on_hand)

    the state of the items to be added 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

#backorderedArray<Spree::Stock::ContentItem>

Returns the content items in this package which are backordered

Returns:



65
66
67
# File 'app/models/spree/stock/package.rb', line 65

def backordered
  contents.select(&:backordered?)
end

#currencyString

Returns the currency of the order this package belongs to

Returns:

  • (String)

    the currency of the order this package belongs to



99
100
101
# File 'app/models/spree/stock/package.rb', line 99

def currency
  order.currency
end

#empty?Boolean

Returns true if there are no inventory units in this package

Returns:

  • (Boolean)

    true if there are no inventory units in this package



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.

Parameters:

  • inventory_unit (Spree::InventoryUnit)

    the desired inventory unit

  • state (:backordered, :on_hand, nil) (defaults to: nil)

    the state of the desired content item, or nil for any 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_handArray<Spree::Stock::ContentItem>

Returns the content items in this package which are on hand

Returns:



59
60
61
# File 'app/models/spree/stock/package.rb', line 59

def on_hand
  contents.select(&:on_hand?)
end

#orderSpree::Order

Returns the order associated with this package

Returns:



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

Returns the number of inventory units in the package, counting only those in the given state if it was specified

Parameters:

  • state (:backordered, :on_hand, nil) (defaults to: nil)

    the state of the content items of which we want the quantity, or nil for the full quantity

Returns:

  • (Fixnum)

    the number of inventory units in the package, counting only those in the given state if it was specified



87
88
89
90
# File 'app/models/spree/stock/package.rb', line 87

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.

Parameters:



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_categoriesArray<Spree::ShippingCategory>

Returns the shipping categories of the variants in this package

Returns:



105
106
107
# File 'app/models/spree/stock/package.rb', line 105

def shipping_categories
  Spree::ShippingCategory.where(id: shipping_category_ids)
end

#shipping_methodsActiveRecord::Relation

Returns the [Spree::ShippingMethod]s available for this pacakge based on the stock location and shipping categories.

Returns:

  • (ActiveRecord::Relation)

    the [Spree::ShippingMethod]s available for this pacakge based on the stock location and shipping categories.



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_shipmentSpree::Shipment

Returns a new shipment containing this package's inventory units, with the appropriate shipping rates and associated with the correct stock location

Returns:

  • (Spree::Shipment)

    a new shipment containing this package's inventory units, with the appropriate shipping rates and associated with the correct stock location



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

#weightFloat

Returns the summed weight of the contents of this package

Returns:

  • (Float)

    the summed weight of the contents of this package



53
54
55
# File 'app/models/spree/stock/package.rb', line 53

def weight
  contents.sum(&:weight)
end