mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-26 20:56:48 +00:00
This was being triggered by a callback in Spree::Adjustments before, but now that the adjustable is not the order, it does not get triggered by fees being added to line items...
67 lines
1.8 KiB
Ruby
67 lines
1.8 KiB
Ruby
# 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 recreate_all_fees!
|
|
# `with_lock` acquires an exclusive row lock on order so no other
|
|
# requests can update it until the transaction is commited.
|
|
# See https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/locking/pessimistic.rb#L69
|
|
# and https://www.postgresql.org/docs/current/static/sql-select.html#SQL-FOR-UPDATE-SHARE
|
|
order.with_lock do
|
|
EnterpriseFee.clear_all_adjustments order
|
|
|
|
create_line_item_fees!
|
|
create_order_fees!
|
|
|
|
order.updater.update_totals
|
|
order.updater.persist_totals
|
|
end
|
|
|
|
order.update!
|
|
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
|
|
|
|
def update_line_item_fees!(line_item)
|
|
line_item.adjustments.enterprise_fee.each do |fee|
|
|
fee.update!(line_item, force: true)
|
|
end
|
|
end
|
|
|
|
def update_order_fees!
|
|
order.adjustments.enterprise_fee.where(source_type: 'Spree::Order').each do |fee|
|
|
fee.update!(order, force: true)
|
|
end
|
|
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
|