Extract order fees logic to service

This commit is contained in:
Matt-Yorkley
2021-01-28 00:25:30 +00:00
parent e7866db7b1
commit 785cdf9bdc
4 changed files with 93 additions and 22 deletions

View File

@@ -669,20 +669,9 @@ module Spree
with_lock do
EnterpriseFee.clear_all_adjustments_on_order self
fee_calculator = OpenFoodNetwork::EnterpriseFeeCalculator.new(distributor, order_cycle)
loaded_line_items =
line_items.includes(variant: :product).all
loaded_line_items.each do |line_item|
if provided_by_order_cycle? line_item
fee_calculator.create_line_item_adjustments_for line_item
end
end
if order_cycle
fee_calculator.create_order_adjustments_for self
end
fee_handler = OrderFeesHandler.new(self)
fee_handler.create_line_item_fees!
fee_handler.create_order_fees!
end
end
@@ -832,11 +821,6 @@ module Spree
subscription.present? && order_cycle.orders_close_at.andand > Time.zone.now
end
def provided_by_order_cycle?(line_item)
@order_cycle_variant_ids ||= order_cycle&.variants&.map(&:id) || []
@order_cycle_variant_ids.include? line_item.variant_id
end
def require_customer?
return true unless new_record? || state == 'cart'
end

View File

@@ -0,0 +1,36 @@
# frozen_string_literal: true
class OrderFeesHandler
attr_reader :order, :distributor, :order_cycle
def initialize(order)
@order = order
@distributor = order.distributor
@order_cycle = order.order_cycle
end
def create_line_item_fees!
order.line_items.includes(variant: :product).each do |line_item|
if provided_by_order_cycle? line_item
calculator.create_line_item_adjustments_for line_item
end
end
end
def create_order_fees!
return unless order_cycle
calculator.create_order_adjustments_for order
end
private
def calculator
@calculator ||= OpenFoodNetwork::EnterpriseFeeCalculator.new(distributor, order_cycle)
end
def provided_by_order_cycle?(line_item)
@order_cycle_variant_ids ||= order_cycle&.variants&.map(&:id) || []
@order_cycle_variant_ids.include? line_item.variant_id
end
end

View File

@@ -533,14 +533,24 @@ describe Spree::Order do
end
end
describe "updating the distribution charge" do
let(:order) { build(:order) }
describe "applying enterprise fees" do
let(:fee_handler) { ::OrderFeesHandler.new(subject) }
before do
allow(subject).to receive(:fee_handler) { fee_handler }
end
it "clears all enterprise fee adjustments on the order" do
expect(EnterpriseFee).to receive(:clear_all_adjustments_on_order).with(subject)
subject.update_distribution_charge!
end
it "creates line item and order fee adjustments via OrderFeesHandler" do
expect(fee_handler).to receive(:create_line_item_fees!)
expect(fee_handler).to receive(:create_order_fees!)
subject.recreate_all_fees!
end
it "skips order cycle per-order adjustments for orders that don't have an order cycle" do
allow(EnterpriseFee).to receive(:clear_all_adjustments_on_order)
@@ -552,7 +562,7 @@ describe Spree::Order do
it "ensures the correct adjustment(s) are created for order cycles" do
allow(EnterpriseFee).to receive(:clear_all_adjustments_on_order)
line_item = create(:line_item, order: subject)
allow(subject).to receive(:provided_by_order_cycle?) { true }
allow(fee_handler).to receive(:provided_by_order_cycle?) { true }
order_cycle = double(:order_cycle)
expect_any_instance_of(OpenFoodNetwork::EnterpriseFeeCalculator).

View File

@@ -0,0 +1,41 @@
# frozen_string_literal: true
require 'spec_helper'
describe OrderFeesHandler do
let(:order_cycle) { create(:order_cycle) }
let(:order) { create(:order_with_line_items, line_items_count: 1, order_cycle: order_cycle) }
let(:line_item) { order.line_items.first }
let(:service) { OrderFeesHandler.new(order) }
let(:calculator) {
double(OpenFoodNetwork::EnterpriseFeeCalculator, create_order_adjustments_for: true)
}
before do
allow(service).to receive(:calculator) { calculator }
end
describe "#create_line_item_fees!" do
it "creates per-line-item fee adjustments for line items in the order cycle" do
allow(service).to receive(:provided_by_order_cycle?) { true }
expect(calculator).to receive(:create_line_item_adjustments_for).with(line_item)
service.create_line_item_fees!
end
end
describe "#create_order_fees!" do
it "creates per-order adjustment for the order cycle" do
expect(calculator).to receive(:create_order_adjustments_for).with(order)
service.create_order_fees!
end
it "skips per-order fee adjustments for orders that don't have an order cycle" do
allow(service).to receive(:order_cycle) { nil }
expect(calculator).to_not receive(:create_order_adjustments_for)
service.create_order_fees!
end
end
end