diff --git a/app/models/location.rb b/app/models/location.rb index 65e0466b3..64272d549 100644 --- a/app/models/location.rb +++ b/app/models/location.rb @@ -21,9 +21,9 @@ class Location < ApplicationRecord scope :search_by_postcode, ->(postcode) { where("REPLACE(postcode, ' ', '') ILIKE ?", "%#{postcode.delete(' ')}%") } scope :search_by_name, ->(name) { where("name ILIKE ?", "%#{name}%") } scope :search_by, ->(param) { search_by_name(param).or(search_by_postcode(param)) } - scope :started, -> { where("startdate <= ?", Time.zone.today).or(where(startdate: nil)) } + scope :started, -> { where("locations.startdate <= ?", Time.zone.today).or(where(startdate: nil)) } scope :active, -> { where(confirmed: true).and(started) } - scope :started_in_2_weeks, -> { where("startdate <= ?", Time.zone.today + 2.weeks).or(where(startdate: nil)) } + scope :started_in_2_weeks, -> { where("locations.startdate <= ?", Time.zone.today + 2.weeks).or(where(startdate: nil)) } scope :active_in_2_weeks, -> { where(confirmed: true).and(started_in_2_weeks) } scope :confirmed, -> { where(confirmed: true) } scope :unconfirmed, -> { where.not(confirmed: true) } @@ -122,9 +122,7 @@ class Location < ApplicationRecord end def available_from - return startdate if startdate.present? - - FormHandler.instance.earliest_open_collection_start_date(now: created_at) + startdate || FormHandler.instance.earliest_open_collection_start_date(now: created_at) end def open_deactivation diff --git a/app/models/scheme.rb b/app/models/scheme.rb index 9d760998d..a8a17ebdb 100644 --- a/app/models/scheme.rb +++ b/app/models/scheme.rb @@ -243,7 +243,7 @@ class Scheme < ApplicationRecord end def validate_confirmed - required_attributes = attribute_names - %w[id created_at updated_at old_id old_visible_id confirmed end_date sensitive secondary_client_group total_units deactivation_date deactivation_date_type] + required_attributes = attribute_names - %w[id created_at updated_at old_id old_visible_id confirmed end_date sensitive secondary_client_group total_units deactivation_date deactivation_date_type startdate] if confirmed == true required_attributes.any? do |attribute| @@ -262,7 +262,7 @@ class Scheme < ApplicationRecord end def available_from - FormHandler.instance.earliest_open_collection_start_date(now: created_at) + startdate || FormHandler.instance.earliest_open_collection_start_date(now: created_at) end def open_deactivation @@ -282,6 +282,7 @@ class Scheme < ApplicationRecord return :deactivated if open_deactivation&.deactivation_date.present? && date >= open_deactivation.deactivation_date return :deactivating_soon if open_deactivation&.deactivation_date.present? && date < open_deactivation.deactivation_date return :reactivating_soon if last_deactivation_before(date)&.reactivation_date.present? && date < last_deactivation_before(date).reactivation_date + return :activating_soon if startdate.present? && date < startdate :active end diff --git a/app/services/merge/merge_organisations_service.rb b/app/services/merge/merge_organisations_service.rb index 1599db5fa..a6a148b21 100644 --- a/app/services/merge/merge_organisations_service.rb +++ b/app/services/merge/merge_organisations_service.rb @@ -69,9 +69,9 @@ private merging_organisation.owned_schemes.each do |scheme| next if scheme.deactivated? - new_scheme = Scheme.create!(scheme.attributes.except("id", "owning_organisation_id", "old_id", "old_visible_id").merge(owning_organisation: @absorbing_organisation)) + new_scheme = Scheme.create!(scheme.attributes.except("id", "owning_organisation_id", "old_id", "old_visible_id").merge(owning_organisation: @absorbing_organisation, startdate: @merge_date)) scheme.locations.each do |location| - new_scheme.locations << Location.new(location.attributes.except("id", "scheme_id", "old_id", "old_visible_id")) unless location.deactivated? + new_scheme.locations << Location.new(location.attributes.except("id", "scheme_id", "old_id", "old_visible_id").merge(startdate: [location&.startdate, @merge_date].compact.max)) unless location.deactivated? end @merged_schemes[merging_organisation.name] << { name: new_scheme.service_name, code: new_scheme.id } SchemeDeactivationPeriod.create!(scheme:, deactivation_date: @merge_date) diff --git a/db/migrate/20231204101105_add_startdate_to_schemes.rb b/db/migrate/20231204101105_add_startdate_to_schemes.rb new file mode 100644 index 000000000..9299cb80a --- /dev/null +++ b/db/migrate/20231204101105_add_startdate_to_schemes.rb @@ -0,0 +1,5 @@ +class AddStartdateToSchemes < ActiveRecord::Migration[7.0] + def change + add_column :schemes, :startdate, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 7eda570d1..ba197acb6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_10_23_142854) do +ActiveRecord::Schema[7.0].define(version: 2023_12_04_101105) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -659,6 +659,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_23_142854) do t.string "old_visible_id" t.integer "total_units" t.boolean "confirmed" + t.datetime "startdate" t.index ["owning_organisation_id"], name: "index_schemes_on_owning_organisation_id" end diff --git a/spec/helpers/locations_helper_spec.rb b/spec/helpers/locations_helper_spec.rb index da4b17322..fec1ce53b 100644 --- a/spec/helpers/locations_helper_spec.rb +++ b/spec/helpers/locations_helper_spec.rb @@ -214,6 +214,15 @@ RSpec.describe LocationsHelper do expect(availability_attribute).to eq("Active from 1 April 2022") end + + context "when location was merged" do + it "displays merge date as availability date" do + location.update!(startdate: Time.zone.local(2022, 4, 16)) + availability_attribute = display_location_attributes(location).find { |x| x[:name] == "Availability" }[:value] + + expect(availability_attribute).to eq("Active from 16 April 2022") + end + end end context "with previous deactivations" do diff --git a/spec/helpers/schemes_helper_spec.rb b/spec/helpers/schemes_helper_spec.rb index 6aaa10260..ff3030932 100644 --- a/spec/helpers/schemes_helper_spec.rb +++ b/spec/helpers/schemes_helper_spec.rb @@ -303,6 +303,17 @@ RSpec.describe SchemesHelper do expect(display_scheme_attributes(scheme)).to eq(attributes) end end + + context "when scheme was merged from another organisation" do + before do + FactoryBot.create(:location, scheme:) + scheme.startdate = Time.zone.local(2023, 1, 5) + end + + it "returns correct availability" do + expect(display_scheme_attributes(scheme)).to include({ name: "Availability", value: "Active from 5 January 2023" }) + end + end end describe "edit_scheme_text" do diff --git a/spec/services/merge/merge_organisations_service_spec.rb b/spec/services/merge/merge_organisations_service_spec.rb index b6168d57a..1c82318e5 100644 --- a/spec/services/merge/merge_organisations_service_spec.rb +++ b/spec/services/merge/merge_organisations_service_spec.rb @@ -305,6 +305,9 @@ RSpec.describe Merge::MergeOrganisationsService do context "and merging organisation schemes and locations" do let!(:scheme) { create(:scheme, owning_organisation: merging_organisation) } let!(:location) { create(:location, scheme:) } + let!(:location_without_startdate) { create(:location, scheme:, startdate: nil) } + let!(:location_with_past_startdate) { create(:location, scheme:, startdate: Time.zone.today - 2.months) } + let!(:location_with_future_startdate) { create(:location, scheme:, startdate: Time.zone.today + 2.months) } let!(:deactivated_location) { create(:location, scheme:) } let!(:deactivated_scheme) { create(:scheme, owning_organisation: merging_organisation) } let!(:owned_lettings_log) { create(:lettings_log, :sh, scheme:, location:, startdate: Time.zone.tomorrow, owning_organisation: merging_organisation) } @@ -329,8 +332,12 @@ RSpec.describe Merge::MergeOrganisationsService do absorbing_organisation.reload expect(absorbing_organisation.owned_schemes.count).to eq(1) expect(absorbing_organisation.owned_schemes.first.service_name).to eq(scheme.service_name) - expect(absorbing_organisation.owned_schemes.first.locations.count).to eq(1) - expect(absorbing_organisation.owned_schemes.first.locations.first.postcode).to eq(location.postcode) + expect(absorbing_organisation.owned_schemes.first.startdate).to eq(Time.zone.yesterday) + expect(absorbing_organisation.owned_schemes.first.locations.count).to eq(4) + expect(absorbing_organisation.owned_schemes.first.locations.map(&:postcode)).to match_array([location, location_without_startdate, location_with_past_startdate, location_with_future_startdate].map(&:postcode)) + expect(absorbing_organisation.owned_schemes.first.locations.find_by(postcode: location_without_startdate.postcode).startdate).to eq(Time.zone.yesterday) + expect(absorbing_organisation.owned_schemes.first.locations.find_by(postcode: location_with_past_startdate.postcode).startdate).to eq(Time.zone.yesterday) + expect(absorbing_organisation.owned_schemes.first.locations.find_by(postcode: location_with_future_startdate.postcode).startdate).to eq(Time.zone.today + 2.months) expect(scheme.scheme_deactivation_periods.count).to eq(1) expect(scheme.scheme_deactivation_periods.first.deactivation_date.to_date).to eq(Time.zone.yesterday) end