mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
56 lines
1.2 KiB
Ruby
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
|