Skip to content

Commit

Permalink
Make code work with a single package per order even if the DB dtill s…
Browse files Browse the repository at this point in the history
…upports multiple shipments per order in OFN, one order only has one shipment
  • Loading branch information
luisramos0 committed Nov 30, 2020
1 parent cf8dada commit 3191700
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 37 deletions.
6 changes: 2 additions & 4 deletions app/models/spree/order.rb
Original file line number Diff line number Diff line change
Expand Up @@ -626,10 +626,8 @@ def create_proposed_shipments
adjustments.shipping.delete_all
shipments.destroy_all

packages = OrderManagement::Stock::Coordinator.new(self).packages
packages.each do |package|
shipments << package.to_shipment
end
package = OrderManagement::Stock::Coordinator.new(self).package
shipments << package.to_shipment

shipments
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,33 @@ def initialize(order)
@order = order
end

def packages
packages = build_packages
packages = prioritize_packages(packages)
estimate_packages(packages)
def package
package = build_package
package = prioritize_package(package)
estimate_package(package)
end

# Build package with default stock location
# No need to check items are in the stock location,
# there is only one stock location so the items will be on that stock location.
#
# Returns an array with a single Package for the default stock location
def build_packages
# Returns a single Package for the default stock location
def build_package
packer = build_packer(order)
[packer.package]
packer.package
end

private

def prioritize_packages(packages)
def prioritize_package(package)
prioritizer = OrderManagement::Stock::Prioritizer.new(order, packages)
prioritizer.prioritized_packages
prioritizer.prioritized_package
end

def estimate_packages(packages)
def estimate_package(package)
estimator = OrderManagement::Stock::Estimator.new(order)
packages.each do |package|
package.shipping_rates = estimator.shipping_rates(package)
end
packages
package.shipping_rates = estimator.shipping_rates(package)
package
end

def build_packer(order)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,40 +5,35 @@ module Stock
class Prioritizer
attr_reader :packages, :order

def initialize(order, packages, adjuster_class = OrderManagement::Stock::Adjuster)
def initialize(order, package, adjuster_class = OrderManagement::Stock::Adjuster)
@order = order
@packages = packages
@package = package
@adjuster_class = adjuster_class
end

def prioritized_packages
adjust_packages
prune_packages
packages
def prioritized_package
adjust_package
return if package.empty?

package
end

private

def adjust_packages
def adjust_package
order.line_items.each do |line_item|
adjuster = @adjuster_class.new(line_item.variant, line_item.quantity, :on_hand)

visit_packages(adjuster)
visit_package(adjuster)

adjuster.status = :backordered
visit_packages(adjuster)
end
end

def visit_packages(adjuster)
packages.each do |package|
item = package.find_item adjuster.variant, adjuster.status
adjuster.adjust(item) if item
visit_package(adjuster)
end
end

def prune_packages
packages.reject!(&:empty?)
def visit_package(adjuster)
item = package.find_item(adjuster.variant, adjuster.status)
adjuster.adjust(item) if item
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ module Stock

context "packages" do
it "builds, prioritizes and estimates" do
expect(subject).to receive(:build_packages).ordered
expect(subject).to receive(:build_package).ordered
expect(subject).to receive(:prioritize_packages).ordered
expect(subject).to receive(:estimate_packages).ordered
subject.packages
Expand Down

0 comments on commit 3191700

Please sign in to comment.