mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
50 lines
1.4 KiB
Ruby
50 lines
1.4 KiB
Ruby
# Report the stock levels of:
|
|
# - all variants in the order
|
|
# - all requested variant ids
|
|
require 'open_food_network/scope_variant_to_hub'
|
|
|
|
class VariantsStockLevels
|
|
def call(order, requested_variant_ids)
|
|
variant_stock_levels = variant_stock_levels(order.line_items.includes(variant: :stock_items))
|
|
|
|
order_variant_ids = variant_stock_levels.keys
|
|
missing_variants = Spree::Variant.with_deleted.includes(:stock_items).
|
|
where(id: (requested_variant_ids - order_variant_ids))
|
|
|
|
missing_variants.each do |missing_variant|
|
|
variant = scoped_variant(order.distributor, missing_variant)
|
|
variant_stock_levels[variant.id] =
|
|
{ quantity: 0, max_quantity: 0, on_hand: variant.on_hand, on_demand: variant.on_demand }
|
|
end
|
|
|
|
variant_stock_levels
|
|
end
|
|
|
|
private
|
|
|
|
def variant_stock_levels(line_items)
|
|
Hash[
|
|
line_items.map do |line_item|
|
|
variant = scoped_variant(line_item.order.distributor, line_item.variant)
|
|
|
|
[variant.id,
|
|
{ quantity: line_item.quantity,
|
|
max_quantity: line_item.max_quantity,
|
|
on_hand: variant.on_hand,
|
|
on_demand: variant.on_demand }]
|
|
end
|
|
]
|
|
end
|
|
|
|
def scoped_variant(distributor, variant)
|
|
return variant if distributor.blank?
|
|
|
|
scoper(distributor).scope(variant)
|
|
variant
|
|
end
|
|
|
|
def scoper(distributor)
|
|
@scoper ||= OpenFoodNetwork::ScopeVariantToHub.new(distributor)
|
|
end
|
|
end
|