mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-29 21:17:17 +00:00
59 lines
1.6 KiB
Ruby
59 lines
1.6 KiB
Ruby
require 'open_food_network/proxy_order_syncer'
|
|
|
|
class SubscriptionForm
|
|
attr_accessor :subscription, :params, :fee_calculator, :order_update_issues, :validator, :order_syncer
|
|
|
|
delegate :json_errors, :valid?, to: :validator
|
|
delegate :order_update_issues, to: :order_syncer
|
|
|
|
def initialize(subscription, params = {}, fee_calculator = nil)
|
|
@subscription = subscription
|
|
@params = params
|
|
@fee_calculator = fee_calculator
|
|
@validator = SubscriptionValidator.new(subscription)
|
|
@order_syncer = OrderSyncer.new(subscription)
|
|
end
|
|
|
|
def save
|
|
validate_price_estimates
|
|
subscription.assign_attributes(params)
|
|
return false unless valid?
|
|
subscription.transaction do
|
|
proxy_order_syncer.sync!
|
|
order_syncer.sync!
|
|
subscription.save!
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def proxy_order_syncer
|
|
OpenFoodNetwork::ProxyOrderSyncer.new(subscription)
|
|
end
|
|
|
|
def validate_price_estimates
|
|
return unless params[:subscription_line_items_attributes]
|
|
return clear_price_estimates unless fee_calculator
|
|
calculate_prices_from_variant_ids
|
|
end
|
|
|
|
def clear_price_estimates
|
|
params[:subscription_line_items_attributes].each do |item_attrs|
|
|
item_attrs.delete(:price_estimate)
|
|
end
|
|
end
|
|
|
|
def calculate_prices_from_variant_ids
|
|
params[:subscription_line_items_attributes].each do |item_attrs|
|
|
variant = Spree::Variant.find_by_id(item_attrs[:variant_id])
|
|
next item_attrs.delete(:price_estimate) unless variant
|
|
item_attrs[:price_estimate] = price_estimate_for(variant)
|
|
end
|
|
end
|
|
|
|
def price_estimate_for(variant)
|
|
fees = fee_calculator.indexed_fees_for(variant)
|
|
(variant.price + fees).to_d
|
|
end
|
|
end
|