From b7477547c378c878a15365e16d0f636272552aca Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 25 Oct 2023 08:08:29 +0100 Subject: [PATCH] Add a rake task for merging into a new organinsation --- .../merge/merge_organisations_service.rb | 4 +- lib/tasks/merge_organisations.rake | 20 +++++++- spec/lib/tasks/merge_organisations_spec.rb | 47 +++++++++++++++++++ .../merge/merge_organisations_service_spec.rb | 35 ++++++++++++-- 4 files changed, 101 insertions(+), 5 deletions(-) diff --git a/app/services/merge/merge_organisations_service.rb b/app/services/merge/merge_organisations_service.rb index 30e3b0995..c7aa8b97c 100644 --- a/app/services/merge/merge_organisations_service.rb +++ b/app/services/merge/merge_organisations_service.rb @@ -1,8 +1,9 @@ class Merge::MergeOrganisationsService - def initialize(absorbing_organisation_id:, merging_organisation_ids:, merge_date: Time.zone.today) + def initialize(absorbing_organisation_id:, merging_organisation_ids:, merge_date: Time.zone.today, absorbing_organisation_active_from_merge_date: false) @absorbing_organisation = Organisation.find(absorbing_organisation_id) @merging_organisations = Organisation.find(merging_organisation_ids) @merge_date = merge_date || Time.zone.today + @absorbing_organisation_active_from_merge_date = absorbing_organisation_active_from_merge_date end def call @@ -19,6 +20,7 @@ class Merge::MergeOrganisationsService merge_sales_logs(merging_organisation) mark_organisation_as_merged(merging_organisation) end + @absorbing_organisation.available_from = @merge_date if @absorbing_organisation_active_from_merge_date @absorbing_organisation.save! log_success_message rescue ActiveRecord::RecordInvalid => e diff --git a/lib/tasks/merge_organisations.rake b/lib/tasks/merge_organisations.rake index 17dfe1c4f..07b17dffd 100644 --- a/lib/tasks/merge_organisations.rake +++ b/lib/tasks/merge_organisations.rake @@ -1,5 +1,5 @@ namespace :merge do - desc "Merge organisations into one" + desc "Merge organisations into an existing organisation" task :merge_organisations, %i[absorbing_organisation_id merging_organisation_ids merge_date] => :environment do |_task, args| absorbing_organisation_id = args[:absorbing_organisation_id] merging_organisation_ids = args[:merging_organisation_ids]&.split(" ")&.map(&:to_i) @@ -16,4 +16,22 @@ namespace :merge do service = Merge::MergeOrganisationsService.new(absorbing_organisation_id:, merging_organisation_ids:, merge_date:) service.call end + + desc "Merge organisations into an existing organisation, make the absorbing organisation active from merge date only" + task :merge_organisations_into_new_organisation, %i[absorbing_organisation_id merging_organisation_ids merge_date] => :environment do |_task, args| + absorbing_organisation_id = args[:absorbing_organisation_id] + merging_organisation_ids = args[:merging_organisation_ids]&.split(" ")&.map(&:to_i) + begin + merge_date = args[:merge_date].present? ? Date.parse(args[:merge_date]) : nil + rescue StandardError + raise "Usage: rake merge:merge_organisations_into_new_organisation[absorbing_organisation_id, merging_organisation_ids, merge_date]. Merge date must be in format YYYY-MM-DD" + end + + if merging_organisation_ids.blank? || absorbing_organisation_id.blank? + raise "Usage: rake merge:merge_organisations_into_new_organisation[absorbing_organisation_id, merging_organisation_ids, merge_date]" + end + + service = Merge::MergeOrganisationsService.new(absorbing_organisation_id:, merging_organisation_ids:, merge_date:, absorbing_organisation_active_from_merge_date: true) + service.call + end end diff --git a/spec/lib/tasks/merge_organisations_spec.rb b/spec/lib/tasks/merge_organisations_spec.rb index 20be80de4..d78b3d32e 100644 --- a/spec/lib/tasks/merge_organisations_spec.rb +++ b/spec/lib/tasks/merge_organisations_spec.rb @@ -48,4 +48,51 @@ RSpec.describe "emails" do end end end + + describe ":merge_organisations_into_new_organisation", type: :task do + subject(:task) { Rake::Task["merge:merge_organisations_into_new_organisation"] } + + let(:organisation) { create(:organisation) } + let(:merging_organisation) { create(:organisation) } + + let(:merge_organisations_service) { Merge::MergeOrganisationsService.new(absorbing_organisation_id: organisation.id, merging_organisation_ids: [merging_organisation.id]) } + + before do + allow(Merge::MergeOrganisationsService).to receive(:new).and_return(merge_organisations_service) + allow(merge_organisations_service).to receive(:call).and_return(nil) + Rake.application.rake_require("tasks/merge_organisations") + Rake::Task.define_task(:environment) + task.reenable + end + + context "when the rake task is run" do + it "raises an error when no parameters are given" do + expect { task.invoke(nil) }.to raise_error(RuntimeError, "Usage: rake merge:merge_organisations_into_new_organisation[absorbing_organisation_id, merging_organisation_ids, merge_date]") + end + + it "raises an error when only absorbing organisation is given" do + expect { task.invoke(1, nil) }.to raise_error(RuntimeError, "Usage: rake merge:merge_organisations_into_new_organisation[absorbing_organisation_id, merging_organisation_ids, merge_date]") + end + + it "raises an error when only merging organisations are given" do + expect { task.invoke(nil, "1 2") }.to raise_error(RuntimeError, "Usage: rake merge:merge_organisations_into_new_organisation[absorbing_organisation_id, merging_organisation_ids, merge_date]") + end + + it "raises an error when the merge date given is not valid" do + expect { task.invoke("3", "1 2", "invalid_date") }.to raise_error(RuntimeError, "Usage: rake merge:merge_organisations_into_new_organisation[absorbing_organisation_id, merging_organisation_ids, merge_date]. Merge date must be in format YYYY-MM-DD") + end + + it "runs the service with correct organisation IDs" do + expect(Merge::MergeOrganisationsService).to receive(:new).with(absorbing_organisation_id: 1, merging_organisation_ids: [2, 3], merge_date: nil, absorbing_organisation_active_from_merge_date: true).once + expect(merge_organisations_service).to receive(:call).once + task.invoke(1, "2 3") + end + + it "runs the service with correct date when date is given" do + expect(Merge::MergeOrganisationsService).to receive(:new).with(absorbing_organisation_id: 1, merging_organisation_ids: [2, 3], merge_date: Time.zone.local(2021, 1, 13), absorbing_organisation_active_from_merge_date: true).once + expect(merge_organisations_service).to receive(:call).once + task.invoke(1, "2 3", "2021-01-13") + end + end + end end diff --git a/spec/services/merge/merge_organisations_service_spec.rb b/spec/services/merge/merge_organisations_service_spec.rb index 071812dd1..79bf45c2d 100644 --- a/spec/services/merge/merge_organisations_service_spec.rb +++ b/spec/services/merge/merge_organisations_service_spec.rb @@ -54,6 +54,13 @@ RSpec.describe Merge::MergeOrganisationsService do expect(merging_organisation_user.organisation).to eq(merging_organisation) end + it "does not set available_from for absorbing organisation" do + merge_organisations_service.call + + absorbing_organisation.reload + expect(absorbing_organisation.available_from).to be_nil + end + context "and merging organisation rent periods" do before do OrganisationRentPeriod.create!(organisation: absorbing_organisation, rent_period: 1) @@ -228,7 +235,7 @@ RSpec.describe Merge::MergeOrganisationsService do end context "and merging sales logs" do - let!(:sales_log) { create(:sales_log, saledate: Time.zone.yesterday, owning_organisation: merging_organisation) } + let!(:sales_log) { create(:sales_log, saledate: Time.zone.today, owning_organisation: merging_organisation) } before do create(:sales_log, saledate: Time.zone.today - 2.days, owning_organisation: merging_organisation) @@ -257,8 +264,8 @@ RSpec.describe Merge::MergeOrganisationsService do context "and merging lettings logs" do let(:owning_organisation) { create(:organisation, holds_own_stock: true) } - let!(:owned_lettings_log) { create(:lettings_log, startdate: Time.zone.yesterday, owning_organisation: merging_organisation, created_by: merging_organisation_user) } - let!(:managed_lettings_log) { create(:lettings_log, startdate: Time.zone.yesterday) } + let!(:owned_lettings_log) { create(:lettings_log, startdate: Time.zone.today, owning_organisation: merging_organisation, created_by: merging_organisation_user) } + let!(:managed_lettings_log) { create(:lettings_log, startdate: Time.zone.today) } before do create(:organisation_relationship) { create(:organisation_relationship, parent_organisation: owning_organisation, child_organisation: merging_organisation) } @@ -354,6 +361,28 @@ RSpec.describe Merge::MergeOrganisationsService do expect(owned_lettings_log_no_location.owning_organisation).to eq(merging_organisation) end end + + context "and absorbing_organisation_active_from_merge_date is true" do + subject(:merge_organisations_service) { described_class.new(absorbing_organisation_id: absorbing_organisation.id, merging_organisation_ids: [merging_organisation_ids], merge_date: Time.zone.yesterday, absorbing_organisation_active_from_merge_date: true) } + + it "sets available from to merge_date for absorbing organisation" do + merge_organisations_service.call + + absorbing_organisation.reload + expect(absorbing_organisation.available_from.to_date).to eq(Time.zone.yesterday) + end + end + end + + context "and absorbing_organisation_active_from_merge_date is true" do + subject(:merge_organisations_service) { described_class.new(absorbing_organisation_id: absorbing_organisation.id, merging_organisation_ids: [merging_organisation_ids], absorbing_organisation_active_from_merge_date: true) } + + it "sets available from to merge_date (today) for absorbing organisation" do + merge_organisations_service.call + + absorbing_organisation.reload + expect(absorbing_organisation.available_from.to_date).to eq(Time.zone.today) + end end end