mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
105 lines
2.9 KiB
Ruby
105 lines
2.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Checkout
|
|
class Params
|
|
def initialize(order, params, current_user)
|
|
@params = params
|
|
@order = order
|
|
@current_user = current_user
|
|
end
|
|
|
|
def call
|
|
return {} unless params[:order]
|
|
|
|
apply_strong_parameters
|
|
set_pickup_address
|
|
set_address_details
|
|
set_payment_amount
|
|
set_existing_card
|
|
|
|
@order_params
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :params, :order, :current_user
|
|
|
|
def apply_strong_parameters
|
|
@order_params = params.require(:order).permit(
|
|
:email, :shipping_method_id, :special_instructions,
|
|
:save_bill_address, :save_ship_address,
|
|
bill_address_attributes: ::PermittedAttributes::Address.attributes,
|
|
ship_address_attributes: ::PermittedAttributes::Address.attributes,
|
|
payments_attributes: [
|
|
:payment_method_id,
|
|
{ source_attributes: PermittedAttributes::PaymentSource.attributes }
|
|
]
|
|
)
|
|
end
|
|
|
|
def set_pickup_address
|
|
return unless shipping_method && !shipping_method.require_ship_address?
|
|
|
|
order.ship_address = order.distributor.address.clone
|
|
order.ship_address.firstname = @order_params[:bill_address_attributes][:firstname]
|
|
order.ship_address.lastname = @order_params[:bill_address_attributes][:lastname]
|
|
order.ship_address.phone = @order_params[:bill_address_attributes][:phone]
|
|
|
|
@order_params.delete(:ship_address_attributes)
|
|
end
|
|
|
|
def set_address_details
|
|
return unless addresses_present?
|
|
|
|
if params[:ship_address_same_as_billing]
|
|
set_ship_address_from_bill_address
|
|
else
|
|
set_basic_details
|
|
end
|
|
end
|
|
|
|
def set_payment_amount
|
|
return unless @order_params[:payments_attributes]
|
|
|
|
@order_params[:payments_attributes].first[:amount] = order.total
|
|
end
|
|
|
|
def set_existing_card
|
|
return unless existing_card_selected?
|
|
|
|
card = Spree::CreditCard.find(params[:existing_card_id])
|
|
|
|
if card.user_id.blank? || card.user_id != current_user&.id
|
|
raise Spree::Core::GatewayError, I18n.t(:invalid_credit_card)
|
|
end
|
|
|
|
@order_params[:payments_attributes].first[:source] = card
|
|
end
|
|
|
|
def shipping_method
|
|
return unless params[:shipping_method_id]
|
|
|
|
@shipping_method ||= Spree::ShippingMethod.find(params[:shipping_method_id])
|
|
end
|
|
|
|
def existing_card_selected?
|
|
@order_params[:payments_attributes] && params[:existing_card_id].present?
|
|
end
|
|
|
|
def addresses_present?
|
|
@order_params[:ship_address_attributes] && @order_params[:bill_address_attributes]
|
|
end
|
|
|
|
def set_ship_address_from_bill_address
|
|
@order_params[:ship_address_attributes] = @order_params[:bill_address_attributes]
|
|
end
|
|
|
|
def set_basic_details
|
|
[:firstname, :lastname, :phone].each do |attr|
|
|
@order_params[:ship_address_attributes][attr] =
|
|
@order_params[:bill_address_attributes][attr]
|
|
end
|
|
end
|
|
end
|
|
end
|