From 0c8c4be2eecf4b6cbcc92a1e1a6c3bb9322a6ee8 Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 8 Mar 2019 12:27:21 +0000 Subject: [PATCH 1/4] Fix migrate tax categories to line items migration This is bringing https://github.com/spree/spree/commit/67186f8ca7eed72b20e696d53f3ceb4fa875524f from spree v2.2 --- ...26145669_migrate_tax_categories_to_line_items.spree.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/db/migrate/20180426145669_migrate_tax_categories_to_line_items.spree.rb b/db/migrate/20180426145669_migrate_tax_categories_to_line_items.spree.rb index 80a82ea1af..4ce74249b3 100644 --- a/db/migrate/20180426145669_migrate_tax_categories_to_line_items.spree.rb +++ b/db/migrate/20180426145669_migrate_tax_categories_to_line_items.spree.rb @@ -1,8 +1,12 @@ # This migration comes from spree (originally 20130802022321) class MigrateTaxCategoriesToLineItems < ActiveRecord::Migration def change - Spree::LineItem.includes(:variant => { :product => :tax_category }).find_in_batches do |line_items| - line_items.each do |line_item| + Spree::LineItem.includes(:variant => { :product => :tax_category }).find_in_batches do |line_items| + line_items.each do |line_item| + next if line_item.variant.nil? + next if line_item.variant.product.nil? + next if line_item.product.nil? + next unless line_item.product.tax_category.present? line_item.update_column(:tax_category_id, line_item.product.tax_category.id) end end From bd9eba9ef8c51e80ce3b3ebce7b0816f47b80dde Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Tue, 12 Mar 2019 18:00:06 +0000 Subject: [PATCH 2/4] Fix add_uniqueness_of_order_id_to_spree_shipments by first removing shipments from orders with more than one shipment --- ...uniqueness_of_order_id_to_spree_shipments.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb b/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb index 21ad966ad4..132b502817 100644 --- a/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb +++ b/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb @@ -1,6 +1,23 @@ +# This migration is an OFN specific migration that enforces an order to have a single shipment at all times class AddUniquenessOfOrderIdToSpreeShipments < ActiveRecord::Migration def change + destroy_all_but_latest_shipments + remove_index :spree_shipments, :order_id add_index :spree_shipments, :order_id, unique: true end + + private + + # Destroy all but the latest shipment in each order + def destroy_all_but_latest_shipments + latest_shipments = Spree::Shipment. + select("order_id, MAX(updated_at) updated_at"). + group(:order_id). + having("count(*) > 1") + + Spree::Shipment. + joins("INNER JOIN (#{latest_shipments.to_sql}) latest_shipments ON spree_shipments.order_id=latest_shipments.order_id AND spree_shipments.updated_at != latest_shipments.updated_at"). + destroy_all + end end From 3742c70910897c2069ae5afc35e1778c5ae879ee Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Thu, 28 Mar 2019 18:49:38 +0000 Subject: [PATCH 3/4] Add backup process to AddUniquenessOfOrderIdToSpreeShipments so that the deleted duplicated shipments can be recovered if something goes wrong --- ...iqueness_of_order_id_to_spree_shipments.rb | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb b/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb index 132b502817..ed53cf4887 100644 --- a/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb +++ b/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb @@ -16,8 +16,67 @@ class AddUniquenessOfOrderIdToSpreeShipments < ActiveRecord::Migration group(:order_id). having("count(*) > 1") + all_duplicated_shipments = Spree::Shipment. + joins("INNER JOIN (#{latest_shipments.to_sql}) latest_shipments ON spree_shipments.order_id = latest_shipments.order_id") + backup_to_csv(all_duplicated_shipments) + Spree::Shipment. joins("INNER JOIN (#{latest_shipments.to_sql}) latest_shipments ON spree_shipments.order_id=latest_shipments.order_id AND spree_shipments.updated_at != latest_shipments.updated_at"). destroy_all end + + def backup_to_csv(shipments) + CSV.open(csv_path, "w") do |csv| + csv << csv_header_row + + shipments.each do |shipment| + csv << shipment_csv_row(shipment) + end + end + end + + def csv_header_row + %w( + id + shipment.tracking + number + cost + shipped_at + order_id + shipping_method_id + address_id + created_at + updated_at + state + ) + end + + def shipment_csv_row(shipment) + [ + shipment.id, + shipment.tracking, + shipment.number, + shipment.cost, + shipment.shipped_at, + shipment.order_id, + shipment.shipping_method_id, + shipment.address_id, + shipment.created_at, + shipment.updated_at, + shipment.state + ] + end + + def csv_path + ensure_reports_path_exists + reports_path.join("duplicated_shipments_backup.csv") + end + + def reports_path + Rails.root.join("reports") + end + + def ensure_reports_path_exists + Dir.mkdir(reports_path) unless File.exist?(reports_path) + end end From 112a57d33018f69cb64ad23be9f7deaa0b3ddafe Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Fri, 29 Mar 2019 23:34:56 +0000 Subject: [PATCH 4/4] Remove association between adjustments and shipments that are going to be deleted in AddUniquenessOfOrderIdToSpreeShipments --- ...iqueness_of_order_id_to_spree_shipments.rb | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb b/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb index ed53cf4887..34d509111e 100644 --- a/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb +++ b/db/migrate/20180910155506_add_uniqueness_of_order_id_to_spree_shipments.rb @@ -20,9 +20,16 @@ class AddUniquenessOfOrderIdToSpreeShipments < ActiveRecord::Migration joins("INNER JOIN (#{latest_shipments.to_sql}) latest_shipments ON spree_shipments.order_id = latest_shipments.order_id") backup_to_csv(all_duplicated_shipments) - Spree::Shipment. - joins("INNER JOIN (#{latest_shipments.to_sql}) latest_shipments ON spree_shipments.order_id=latest_shipments.order_id AND spree_shipments.updated_at != latest_shipments.updated_at"). - destroy_all + shipments_to_delete = Spree::Shipment. + joins("INNER JOIN (#{latest_shipments.to_sql}) latest_shipments ON spree_shipments.order_id = latest_shipments.order_id AND spree_shipments.updated_at != latest_shipments.updated_at") + remove_association_to_adjustments(shipments_to_delete) + shipments_to_delete.destroy_all + end + + def remove_association_to_adjustments(shipments) + Spree::Adjustment. + joins("INNER JOIN (#{shipments.to_sql}) shipments_to_delete ON shipments_to_delete.id = spree_adjustments.source_id and spree_adjustments.source_type = 'Spree::Shipment'"). + update_all(source_id: nil, source_type: nil, originator_id: nil, originator_type: nil, mandatory: nil) end def backup_to_csv(shipments) @@ -38,16 +45,16 @@ class AddUniquenessOfOrderIdToSpreeShipments < ActiveRecord::Migration def csv_header_row %w( id - shipment.tracking + tracking number + order_number + shipping_method_name cost + state shipped_at - order_id - shipping_method_id - address_id created_at updated_at - state + address_json ) end @@ -56,14 +63,14 @@ class AddUniquenessOfOrderIdToSpreeShipments < ActiveRecord::Migration shipment.id, shipment.tracking, shipment.number, + shipment.order.number, + shipment.shipping_method.andand.name, shipment.cost, + shipment.state, shipment.shipped_at, - shipment.order_id, - shipment.shipping_method_id, - shipment.address_id, shipment.created_at, shipment.updated_at, - shipment.state + shipment.address.to_json ] end