Browse Source

Add a rake task for merging into a new organinsation

pull/2003/head
Kat 3 years ago
parent
commit
b7477547c3
  1. 4
      app/services/merge/merge_organisations_service.rb
  2. 20
      lib/tasks/merge_organisations.rake
  3. 47
      spec/lib/tasks/merge_organisations_spec.rb
  4. 35
      spec/services/merge/merge_organisations_service_spec.rb

4
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

20
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

47
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

35
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

Loading…
Cancel
Save