mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
119 lines
3.8 KiB
Ruby
119 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'csv'
|
|
|
|
namespace :ofn do
|
|
namespace :data do
|
|
# Invalid address are define by having: address1, city, phone, or country_id set to null
|
|
desc 'Check if any invalid address are in use'
|
|
task check_invalid_address_used: :environment do # rubocop:disable Metrics/BlockLength
|
|
puts "Checking for invalid address"
|
|
invalid_addresses = Spree::Address
|
|
.where("address1 IS NULL OR city IS NULL OR phone IS NULL OR country_id IS NULL")
|
|
.pluck(:id)
|
|
|
|
if invalid_addresses.empty?
|
|
puts "No invalid address found"
|
|
next
|
|
end
|
|
|
|
puts "Checking if any of #{invalid_addresses.length} invalid addresses are in use"
|
|
|
|
# Customer :
|
|
# - bill_address
|
|
# - ship_address
|
|
customer_used_address = check_bill_ship_address(Customer, invalid_addresses)
|
|
p "Customers #{customer_used_address}"
|
|
|
|
# Subscription :
|
|
# - bill_address
|
|
# - ship_address
|
|
subscriptions_used_address = check_bill_ship_address(Subscription, invalid_addresses)
|
|
p "Subscriptions #{subscriptions_used_address}"
|
|
|
|
# EnterpriseGroup :
|
|
# - enterprise_group address
|
|
enterprise_group_used_address = check_address(EnterpriseGroup, invalid_addresses)
|
|
p "EnterpriseGroup #{enterprise_group_used_address}"
|
|
|
|
# User :
|
|
# - bill_address
|
|
# - ship_address
|
|
users_used_address = check_bill_ship_address(Spree::User, invalid_addresses)
|
|
p "User #{users_used_address}"
|
|
|
|
# Order :
|
|
# - bill_address
|
|
# - ship_address
|
|
orders_used_address = check_bill_ship_address(Spree::Order, invalid_addresses)
|
|
p "Order #{orders_used_address}"
|
|
|
|
# Shipment :
|
|
# - address
|
|
shipments_used_address = check_address(Spree::Shipment, invalid_addresses)
|
|
p "Shipments #{shipments_used_address}"
|
|
|
|
# Enterprise :
|
|
# - address
|
|
# - business_address
|
|
enterprises = Enterprise
|
|
.left_joins(:address, :business_address)
|
|
.where(
|
|
"address_id IN(?) OR business_address_id IN(?)", invalid_addresses, invalid_addresses
|
|
)
|
|
enterprise_used_address = enterprises.map do |e|
|
|
res = []
|
|
res << e.address_id if check_correct_address_id(e.address_id, invalid_addresses)
|
|
res << e.business_address_id if check_correct_address_id(
|
|
e.business_address_id, invalid_addresses
|
|
)
|
|
res
|
|
end.flatten
|
|
p "Enterprises #{enterprise_used_address}"
|
|
|
|
address_to_be_fixed = customer_used_address.union(
|
|
subscriptions_used_address, users_used_address, orders_used_address, shipments_used_address,
|
|
enterprise_used_address
|
|
)
|
|
address_to_be_deleted = invalid_addresses - address_to_be_fixed
|
|
|
|
puts "\n\n"
|
|
puts "#{address_to_be_deleted.length} addresses can be deleted:"
|
|
p address_to_be_deleted
|
|
|
|
if address_to_be_deleted.present?
|
|
puts "\n\n"
|
|
puts "Run the following code to delete the addresses:"
|
|
puts "Spree::Address.where(id: #{address_to_be_deleted}).delete_all"
|
|
end
|
|
|
|
puts "\n\n"
|
|
puts "#{address_to_be_fixed.length} addresses need to be fixed:"
|
|
p address_to_be_fixed
|
|
end
|
|
|
|
private
|
|
|
|
def check_bill_ship_address(klass, addresses)
|
|
objects = klass
|
|
.left_joins(:bill_address, :ship_address)
|
|
.where("bill_address_id in(?) OR ship_address_id in(?)", addresses, addresses)
|
|
|
|
objects.map do |o|
|
|
res = []
|
|
res << o.ship_address_id if check_correct_address_id(o.ship_address_id, addresses)
|
|
res << o.bill_address_id if check_correct_address_id(o.bill_address_id, addresses)
|
|
res
|
|
end.flatten
|
|
end
|
|
|
|
def check_address(klass, addresses)
|
|
klass.joins(:address).where(address: addresses).pluck(:address_id)
|
|
end
|
|
|
|
def check_correct_address_id(id, missing_ids)
|
|
!id.nil? && missing_ids.include?(id)
|
|
end
|
|
end
|
|
end
|