Browse Source

feat: use startdate instead to track merges on schemes and locations

pull/2061/head
natdeanlewissoftwire 1 year ago
parent
commit
bde6f35254
  1. 6
      app/models/location.rb
  2. 5
      app/models/scheme.rb
  3. 4
      app/services/merge/merge_organisations_service.rb
  4. 5
      db/migrate/20231127120659_add_merge_date_to_schemes.rb
  5. 5
      db/migrate/20231127125729_add_merge_date_to_locations.rb
  6. 5
      db/schema.rb
  7. 28
      spec/helpers/locations_helper_spec.rb
  8. 2
      spec/helpers/schemes_helper_spec.rb

6
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_postcode, ->(postcode) { where("REPLACE(postcode, ' ', '') ILIKE ?", "%#{postcode.delete(' ')}%") }
scope :search_by_name, ->(name) { where("name ILIKE ?", "%#{name}%") } scope :search_by_name, ->(name) { where("name ILIKE ?", "%#{name}%") }
scope :search_by, ->(param) { search_by_name(param).or(search_by_postcode(param)) } 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 :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 :active_in_2_weeks, -> { where(confirmed: true).and(started_in_2_weeks) }
scope :confirmed, -> { where(confirmed: true) } scope :confirmed, -> { where(confirmed: true) }
scope :unconfirmed, -> { where.not(confirmed: true) } scope :unconfirmed, -> { where.not(confirmed: true) }
@ -122,7 +122,7 @@ class Location < ApplicationRecord
end end
def available_from def available_from
[merge_date, startdate].compact.max || FormHandler.instance.earliest_open_collection_start_date(now: created_at) startdate || FormHandler.instance.earliest_open_collection_start_date(now: created_at)
end end
def open_deactivation def open_deactivation

5
app/models/scheme.rb

@ -243,7 +243,7 @@ class Scheme < ApplicationRecord
end end
def validate_confirmed 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 merge_date] 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 if confirmed == true
required_attributes.any? do |attribute| required_attributes.any? do |attribute|
@ -262,7 +262,7 @@ class Scheme < ApplicationRecord
end end
def available_from def available_from
merge_date || FormHandler.instance.earliest_open_collection_start_date(now: created_at) startdate || FormHandler.instance.earliest_open_collection_start_date(now: created_at)
end end
def open_deactivation def open_deactivation
@ -282,6 +282,7 @@ class Scheme < ApplicationRecord
return :deactivated if open_deactivation&.deactivation_date.present? && date >= open_deactivation.deactivation_date 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 :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 :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 :active
end end

4
app/services/merge/merge_organisations_service.rb

@ -69,9 +69,9 @@ private
merging_organisation.owned_schemes.each do |scheme| merging_organisation.owned_schemes.each do |scheme|
next if scheme.deactivated? 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, merge_date: @merge_date)) 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| scheme.locations.each do |location|
new_scheme.locations << Location.new(location.attributes.except("id", "scheme_id", "old_id", "old_visible_id").merge(merge_date: @merge_date)) 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 end
@merged_schemes[merging_organisation.name] << { name: new_scheme.service_name, code: new_scheme.id } @merged_schemes[merging_organisation.name] << { name: new_scheme.service_name, code: new_scheme.id }
SchemeDeactivationPeriod.create!(scheme:, deactivation_date: @merge_date) SchemeDeactivationPeriod.create!(scheme:, deactivation_date: @merge_date)

5
db/migrate/20231127120659_add_merge_date_to_schemes.rb

@ -1,5 +0,0 @@
class AddMergeDateToSchemes < ActiveRecord::Migration[7.0]
def change
add_column :schemes, :merge_date, :datetime
end
end

5
db/migrate/20231127125729_add_merge_date_to_locations.rb

@ -1,5 +0,0 @@
class AddMergeDateToLocations < ActiveRecord::Migration[7.0]
def change
add_column :locations, :merge_date, :datetime
end
end

5
db/schema.rb

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.0].define(version: 2023_11_27_125729) 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 # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -355,7 +355,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_11_27_125729) do
t.datetime "startdate" t.datetime "startdate"
t.string "location_admin_district" t.string "location_admin_district"
t.boolean "confirmed" t.boolean "confirmed"
t.datetime "merge_date"
t.index ["old_id"], name: "index_locations_on_old_id", unique: true t.index ["old_id"], name: "index_locations_on_old_id", unique: true
t.index ["scheme_id"], name: "index_locations_on_scheme_id" t.index ["scheme_id"], name: "index_locations_on_scheme_id"
end end
@ -660,7 +659,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_11_27_125729) do
t.string "old_visible_id" t.string "old_visible_id"
t.integer "total_units" t.integer "total_units"
t.boolean "confirmed" t.boolean "confirmed"
t.datetime "merge_date" t.datetime "startdate"
t.index ["owning_organisation_id"], name: "index_schemes_on_owning_organisation_id" t.index ["owning_organisation_id"], name: "index_schemes_on_owning_organisation_id"
end end

28
spec/helpers/locations_helper_spec.rb

@ -216,31 +216,11 @@ RSpec.describe LocationsHelper do
end end
context "when location was merged" do context "when location was merged" do
context "when there is no startdate" do it "displays merge date as availability date" do
it "displays merge date as availability date" do location.update!(startdate: Time.zone.local(2022, 4, 16))
location.update!(merge_date: Time.zone.local(2022, 4, 16)) availability_attribute = display_location_attributes(location).find { |x| x[:name] == "Availability" }[:value]
availability_attribute = display_location_attributes(location).find { |x| x[:name] == "Availability" }[:value]
expect(availability_attribute).to eq("Active from 16 April 2022")
end
end
context "when the startdate is before the merge date" do
it "displays merge date as availability date" do
location.update!(startdate: Time.zone.local(2022, 4, 3), merge_date: 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
context "when the startdate is after the merge date" do
it "displays startdate as availability date" do
location.update!(startdate: Time.zone.local(2022, 5, 3), merge_date: 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 3 May 2022") expect(availability_attribute).to eq("Active from 16 April 2022")
end
end end
end end
end end

2
spec/helpers/schemes_helper_spec.rb

@ -307,7 +307,7 @@ RSpec.describe SchemesHelper do
context "when scheme was merged from another organisation" do context "when scheme was merged from another organisation" do
before do before do
FactoryBot.create(:location, scheme:) FactoryBot.create(:location, scheme:)
scheme.merge_date = Time.zone.local(2023, 1, 5) scheme.startdate = Time.zone.local(2023, 1, 5)
end end
it "returns correct availability" do it "returns correct availability" do

Loading…
Cancel
Save