From 040e09414bf8546fbd6c23b90ccd74e8f551590f Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Wed, 24 Apr 2024 15:34:33 +1000 Subject: [PATCH] Add ofn:data:check_invalid_address_used task It checks for invalid addresses, ie address with address1, city, phone or country_id set to null. It will return: - a list of invalid address in use (associated to another model) - a list of invalid address not in use, ie that we can delete --- lib/tasks/check_invalid_address_used.rake | 106 ++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 lib/tasks/check_invalid_address_used.rake diff --git a/lib/tasks/check_invalid_address_used.rake b/lib/tasks/check_invalid_address_used.rake new file mode 100644 index 0000000000..7ec96e6c65 --- /dev/null +++ b/lib/tasks/check_invalid_address_used.rake @@ -0,0 +1,106 @@ +# 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| + next e.address_id if check_correct_address_id(e.address_id, invalid_addresses) + + e.business_address_id if check_correct_address_id(e.business_address_id, invalid_addresses) + end + 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 + + p "#{address_to_be_deleted.length} addresses can be deleted:" + p address_to_be_deleted + + p "#{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| + next o.ship_address_id if check_correct_address_id(o.ship_address_id, addresses) + + o.bill_address_id if check_correct_address_id(o.bill_address_id, addresses) + end + 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