mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-22 20:16:50 +00:00
107 lines
4.5 KiB
Ruby
107 lines
4.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
namespace :ofn do
|
|
namespace :data do
|
|
desc "Adding relationships based on recent order cycles"
|
|
task create_order_cycle_relationships: :environment do
|
|
input = request_months
|
|
|
|
# For each order cycle which was modified within the past 3 months
|
|
OrderCycle.where('updated_at > ?', Date.current - input.months).find_each do |order_cycle|
|
|
# Cycle through the incoming exchanges
|
|
order_cycle.exchanges.incoming.each do |exchange|
|
|
next if exchange.sender == exchange.receiver
|
|
|
|
# Ensure that an enterprise relationship from the producer to the coordinator exists
|
|
relationship = EnterpriseRelationship.where(parent_id: exchange.sender_id,
|
|
child_id: exchange.receiver_id).first
|
|
if relationship.blank?
|
|
puts "CREATING: #{exchange.sender.name} TO #{exchange.receiver.name}"
|
|
relationship = EnterpriseRelationship.create!(parent_id: exchange.sender_id,
|
|
child_id: exchange.receiver_id)
|
|
end
|
|
# And that P-OC is granted
|
|
unless relationship.has_permission?(:add_to_order_cycle)
|
|
puts "PERMITTING: #{exchange.sender.name} TO #{exchange.receiver.name}"
|
|
relationship.permissions.create!(name: :add_to_order_cycle)
|
|
end
|
|
end
|
|
|
|
# Cycle through the outgoing exchanges
|
|
order_cycle.exchanges.outgoing.each do |exchange|
|
|
unless exchange.sender == exchange.receiver
|
|
# Enure that an enterprise relationship from the hub to the coordinator exists
|
|
relationship = EnterpriseRelationship.where(parent_id: exchange.receiver_id,
|
|
child_id: exchange.sender_id).first
|
|
if relationship.blank?
|
|
puts "CREATING: #{exchange.receiver.name} TO #{exchange.sender.name}"
|
|
relationship = EnterpriseRelationship.create!(parent_id: exchange.receiver_id,
|
|
child_id: exchange.sender_id)
|
|
end
|
|
# And that P-OC is granted
|
|
unless relationship.has_permission?(:add_to_order_cycle)
|
|
puts "PERMITTING: #{exchange.receiver.name} TO #{exchange.sender.name}"
|
|
relationship.permissions.create!(name: :add_to_order_cycle)
|
|
end
|
|
end
|
|
|
|
# For each variant in the exchange
|
|
products = Spree::Product.joins(:variants)
|
|
.where(spree_variants: { id: exchange.variants })
|
|
.pluck(:id)
|
|
.uniq
|
|
producers = Enterprise.joins(:supplied_products)
|
|
.where(spree_products: { id: products })
|
|
.distinct
|
|
producers.each do |producer|
|
|
next if producer == exchange.receiver
|
|
|
|
# Ensure that an enterprise relationship from the producer to the hub exists
|
|
relationship = EnterpriseRelationship.where(parent_id: producer.id,
|
|
child_id: exchange.receiver_id).first
|
|
if relationship.blank?
|
|
puts "CREATING: #{producer.name} TO #{exchange.receiver.name}"
|
|
relationship = EnterpriseRelationship.create!(parent_id: producer.id,
|
|
child_id: exchange.receiver_id)
|
|
end
|
|
# And that P-OC is granted
|
|
unless relationship.has_permission?(:add_to_order_cycle)
|
|
puts "PERMITTING: #{producer.name} TO #{exchange.receiver.name}"
|
|
relationship.permissions.create!(name: :add_to_order_cycle)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def request_months
|
|
# Ask how many months back we want to search for
|
|
puts "This task will search order cycle edited within (n) months of today's date.\n" \
|
|
"Please enter a value for (n), or hit ENTER to use the default of three (3) months."
|
|
input = check_default($stdin.gets.chomp)
|
|
|
|
while !is_integer?(input)
|
|
puts "'#{input}' is not an integer. Please enter an integer."
|
|
input = check_default($stdin.gets.chomp)
|
|
end
|
|
|
|
Integer(input)
|
|
end
|
|
|
|
def check_default(input)
|
|
if input.blank?
|
|
puts "Using default value of three (3) months."
|
|
3
|
|
else
|
|
input
|
|
end
|
|
end
|
|
|
|
def is_integer?(value)
|
|
true if Integer(value)
|
|
rescue StandardError
|
|
false
|
|
end
|
|
end
|
|
end
|