mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-01 21:47:16 +00:00
59 lines
1.4 KiB
Ruby
59 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class OfferBuilder < DfcBuilder
|
|
def self.build(variant)
|
|
id = urls.enterprise_offer_url(
|
|
enterprise_id: variant.supplier_id,
|
|
id: variant.id,
|
|
)
|
|
|
|
price = DataFoodConsortium::Connector::Price.new(
|
|
value: variant.price.to_f,
|
|
unit: price_measure(variant)&.semanticId,
|
|
)
|
|
DataFoodConsortium::Connector::Offer.new(
|
|
id, price:, stockLimitation: stock_limitation(variant),
|
|
)
|
|
end
|
|
|
|
def self.apply(offer, variant)
|
|
return if offer.nil?
|
|
|
|
CatalogItemBuilder.apply_stock(offer, variant)
|
|
|
|
return if offer.price.nil?
|
|
|
|
variant.price = price(offer)
|
|
end
|
|
|
|
def self.price(offer)
|
|
# We assume same currency here:
|
|
if offer.price.respond_to?(:value)
|
|
offer.price.value
|
|
else
|
|
offer.price
|
|
end
|
|
end
|
|
|
|
# The DFC measures define only five currencies at the moment.
|
|
# And they are not standardised enough to align with our ISO 4217
|
|
# currency codes. So I propose to just use those currency codes instead.
|
|
# https://github.com/datafoodconsortium/taxonomies/issues/48
|
|
def self.price_measure(variant)
|
|
measures = DfcLoader.vocabulary("measures")
|
|
|
|
case variant.currency
|
|
when "AUD"
|
|
measures.AUSTRALIANDOLLAR
|
|
when "CAD"
|
|
measures.CANADIANDOLLAR
|
|
when "EUR"
|
|
measures.EURO
|
|
when "GBP"
|
|
measures.POUNDSTERLING
|
|
when "USD"
|
|
measures.USDOLLAR
|
|
end
|
|
end
|
|
end
|