Files
openfoodnetwork/app/services/paypal_items_builder.rb
2021-02-24 12:39:10 +00:00

56 lines
1.2 KiB
Ruby

# frozen_string_literal: true
class PaypalItemsBuilder
def initialize(order)
@order = order
end
def call
items = order.line_items.map(&method(:line_item_data))
relevant_adjustments.each do |adjustment|
items << adjustment_data(adjustment)
end
# Because PayPal doesn't accept $0 items at all.
# See https://github.com/spree-contrib/better_spree_paypal_express/issues/10
# "It can be a positive or negative value but not zero."
items.reject do |item|
item[:Amount][:value].zero?
end
end
private
attr_reader :order
def relevant_adjustments
# Tax total and shipping costs are added separately, so they're not included here.
order.all_adjustments.eligible - order.all_adjustments.tax - order.all_adjustments.shipping
end
def line_item_data(item)
{
Name: item.product.name,
Number: item.variant.sku,
Quantity: item.quantity,
Amount: {
currencyID: item.order.currency,
value: item.price
},
ItemCategory: "Physical"
}
end
def adjustment_data(adjustment)
{
Name: adjustment.label,
Quantity: 1,
Amount: {
currencyID: order.currency,
value: adjustment.amount
}
}
end
end