Class: Spree::Stock::Coordinator

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(order, inventory_units = nil) ⇒ Coordinator

Returns a new instance of Coordinator.



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

def initialize(order, inventory_units = nil)
  @order = order
  @inventory_units = inventory_units || InventoryUnitBuilder.new(order).units
end

Instance Attribute Details

#inventory_unitsObject (readonly)

Returns the value of attribute inventory_units.



4
5
6
# File 'app/models/spree/stock/coordinator.rb', line 4

def inventory_units
  @inventory_units
end

#orderObject (readonly)

Returns the value of attribute order.



4
5
6
# File 'app/models/spree/stock/coordinator.rb', line 4

def order
  @order
end

Instance Method Details

#build_packages(packages = Array.new) ⇒ Object

Build packages as per stock location

It needs to check whether each stock location holds at least one stock item for the order. In case none is found it wouldn’t make any sense to build a package because it would be empty. Plus we avoid errors down the stack because it would assume the stock location has stock items for the given order

Returns an array of Package instances



32
33
34
35
36
37
38
39
40
# File 'app/models/spree/stock/coordinator.rb', line 32

def build_packages(packages = Array.new)
  StockLocation.active.each do |stock_location|
    next unless stock_location.stock_items.where(:variant_id => inventory_units.map(&:variant_id).uniq).exists?

    packer = build_packer(stock_location, inventory_units)
    packages += packer.packages
  end
  packages
end

#packagesObject



17
18
19
20
21
# File 'app/models/spree/stock/coordinator.rb', line 17

def packages
  packages = build_packages
  packages = prioritize_packages(packages)
  packages = estimate_packages(packages)
end

#shipmentsObject



11
12
13
14
15
# File 'app/models/spree/stock/coordinator.rb', line 11

def shipments
  packages.map do |package|
    package.to_shipment.tap { |s| s.address = order.ship_address }
  end
end