diff --git a/lib/solidus_friendly_promotions/migrate_adjustments.rb b/lib/solidus_friendly_promotions/migrate_adjustments.rb new file mode 100644 index 00000000..c27c4916 --- /dev/null +++ b/lib/solidus_friendly_promotions/migrate_adjustments.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module SolidusFriendlyPromotions + class MigrateAdjustments + class << self + def up + sql = if ActiveRecord::Base.connection_db_config.adapter == "mysql2" + <<~SQL + UPDATE spree_adjustments + INNER JOIN spree_promotion_actions ON spree_adjustments.source_id = spree_promotion_actions.id and spree_adjustments.source_type = 'Spree::PromotionAction' + INNER JOIN friendly_promotion_actions ON friendly_promotion_actions.original_promotion_action_id = spree_promotion_actions.id + SET source_id = friendly_promotion_actions.id, + source_type = 'SolidusFriendlyPromotions::PromotionAction' + SQL + else + <<~SQL + UPDATE spree_adjustments + SET source_id = friendly_promotion_actions.id, + source_type = 'SolidusFriendlyPromotions::PromotionAction' + FROM spree_promotion_actions + INNER JOIN friendly_promotion_actions ON friendly_promotion_actions.original_promotion_action_id = spree_promotion_actions.id + WHERE spree_adjustments.source_id = spree_promotion_actions.id and spree_adjustments.source_type = 'Spree::PromotionAction' + SQL + end + + execute(sql) + end + + def down + sql = if ActiveRecord::Base.connection_db_config.adapter == "mysql2" + <<~SQL + UPDATE spree_adjustments + INNER JOIN friendly_promotion_actions + INNER JOIN spree_promotion_actions ON spree_adjustments.source_id = friendly_promotion_actions.id and spree_adjustments.source_type = 'SolidusFriendlyPromotions::PromotionAction' + SET source_id = spree_promotion_actions.id, + source_type = 'Spree::PromotionAction' + WHERE friendly_promotion_actions.original_promotion_action_id = spree_promotion_actions.id + SQL + else + <<~SQL + UPDATE spree_adjustments + SET source_id = spree_promotion_actions.id, + source_type = 'Spree::PromotionAction' + FROM spree_promotion_actions + INNER JOIN friendly_promotion_actions ON friendly_promotion_actions.original_promotion_action_id = spree_promotion_actions.id + WHERE spree_adjustments.source_id = friendly_promotion_actions.id and spree_adjustments.source_type = 'SolidusFriendlyPromotions::PromotionAction' + SQL + end + + execute(sql) + end + + private + + def execute(sql) + Spree::Adjustment.transaction do + ActiveRecord::Base.connection.execute(sql) + end + end + end + end +end diff --git a/lib/tasks/solidus_friendly_promotions/migrate_adjustments.rake b/lib/tasks/solidus_friendly_promotions/migrate_adjustments.rake new file mode 100644 index 00000000..d98a9ffd --- /dev/null +++ b/lib/tasks/solidus_friendly_promotions/migrate_adjustments.rake @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +namespace :solidus_friendly_promotions do + namespace :migrate_adjustments do + desc "Migrate adjustments with Spree::PromotionAction sources to SolidusFriendlyPromotions::PromotionAction sources" + task up: :environment do + require "solidus_friendly_promotions/migrate_adjustments" + SolidusFriendlyPromotions::MigrateAdjustments.up + end + + desc "Migrate adjustments with SolidusFriendlyPromotions::PromotionAction sources to Spree::PromotionAction sources" + task down: :environment do + require "solidus_friendly_promotions/migrate_adjustments" + SolidusFriendlyPromotions::MigrateAdjustments.down + end + end +end diff --git a/spec/lib/solidus_friendly_promotions/migrate_adjustments_spec.rb b/spec/lib/solidus_friendly_promotions/migrate_adjustments_spec.rb new file mode 100644 index 00000000..69e45c15 --- /dev/null +++ b/spec/lib/solidus_friendly_promotions/migrate_adjustments_spec.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +require "spec_helper" +require "solidus_friendly_promotions/promotion_migrator" +require "solidus_friendly_promotions/promotion_map" +require "solidus_friendly_promotions/migrate_adjustments" + +RSpec.describe SolidusFriendlyPromotions::MigrateAdjustments do + let(:promotion) { create(:promotion, :with_adjustable_action) } + let(:order) { create(:order_with_line_items) } + let(:line_item) { order.line_items.first } + let(:tax_rate) { create(:tax_rate) } + + before do + line_item.adjustments.create!( + source: tax_rate, + amount: -3, + label: "Business tax", + eligible: true, + included: true, + order: order + ) + line_item.adjustments.create!( + source: promotion.actions.first, + amount: -2, + label: "Promotion (Because we like you)", + eligible: true, + order: order + ) + SolidusFriendlyPromotions::PromotionMigrator.new( + SolidusFriendlyPromotions::PROMOTION_MAP + ).call + end + + describe ".up" do + subject { described_class.up } + + it "migrates our adjustment" do + spree_promotion_action = Spree::PromotionAction.first + friendly_promotion_action = SolidusFriendlyPromotions::PromotionAction.first + expect { subject }.to change { + Spree::Adjustment.promotion.first.source + }.from(spree_promotion_action).to(friendly_promotion_action) + end + + it "will not touch tax adjustments" do + expect { subject }.not_to change { + Spree::Adjustment.tax.first.attributes + } + end + end + + describe ".down" do + subject { described_class.down } + + before do + described_class.up + end + + it "migrates our adjustment" do + spree_promotion_action = Spree::PromotionAction.first + friendly_promotion_action = SolidusFriendlyPromotions::PromotionAction.first + expect { subject }.to change { + Spree::Adjustment.promotion.first.source + }.from(friendly_promotion_action).to(spree_promotion_action) + end + + it "will not touch tax adjustments" do + expect { subject }.not_to change { + Spree::Adjustment.tax.first.attributes + } + end + end +end