diff --git a/app/serializers/api/admin/order_cycle_serializer.rb b/app/serializers/api/admin/order_cycle_serializer.rb index bd8c6407f1..7e165cf547 100644 --- a/app/serializers/api/admin/order_cycle_serializer.rb +++ b/app/serializers/api/admin/order_cycle_serializer.rb @@ -33,14 +33,7 @@ class Api::Admin::OrderCycleSerializer < ActiveModel::Serializer end def editable_variants_for_incoming_exchanges - # For each enterprise that the current user is able to see in this order cycle, - # work out which variants should be editable within incoming exchanges from that enterprise - editable = {} - visible_enterprises.each do |enterprise| - variants = permissions.editable_variants_for_incoming_exchanges_from(enterprise).pluck(:id) - editable[enterprise.id] = variants if variants.any? - end - editable + sort_by_supplier_id(permissions.all_incoming_editable_variants.all) end def editable_variants_for_outgoing_exchanges @@ -85,4 +78,18 @@ class Api::Admin::OrderCycleSerializer < ActiveModel::Serializer def visible_enterprises @visible_enterprises ||= permissions.visible_enterprises end + + def sort_by_supplier_id(variants) + collection = {} + variants.map do |variant| + supplier_id = variant.product.supplier_id + + if collection.key? supplier_id + collection[supplier_id] << variant.id + else + collection[supplier_id] = [variant.id] + end + end + collection + end end diff --git a/lib/open_food_network/order_cycle_permissions.rb b/lib/open_food_network/order_cycle_permissions.rb index 78bdce432e..21c88a25eb 100644 --- a/lib/open_food_network/order_cycle_permissions.rb +++ b/lib/open_food_network/order_cycle_permissions.rb @@ -154,6 +154,15 @@ module OpenFoodNetwork end end + def all_incoming_editable_variants + valid_suppliers = visible_enterprises.map do |enterprise| + enterprise.id if user_manages_coordinator_or(enterprise) + end + + Spree::Variant.includes(product: :supplier). + joins(:product).where('spree_products.supplier_id IN (?)', valid_suppliers) + end + # Find the variants that a user is permitted see within outgoing exchanges # Note that this does not determine whether they actually appear in outgoing exchanges # as this requires first that the variant is included in an incoming exchange