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_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,7 +122,7 @@ class Location < ApplicationRecord
end
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
def open_deactivation

5
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 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
required_attributes.any? do |attribute|
@ -262,7 +262,7 @@ class Scheme < ApplicationRecord
end
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
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

4
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, 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|
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
@merged_schemes[merging_organisation.name] << { name: new_scheme.service_name, code: new_scheme.id }
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.
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
enable_extension "plpgsql"
@ -355,7 +355,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_11_27_125729) do
t.datetime "startdate"
t.string "location_admin_district"
t.boolean "confirmed"
t.datetime "merge_date"
t.index ["old_id"], name: "index_locations_on_old_id", unique: true
t.index ["scheme_id"], name: "index_locations_on_scheme_id"
end
@ -660,7 +659,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_11_27_125729) do
t.string "old_visible_id"
t.integer "total_units"
t.boolean "confirmed"
t.datetime "merge_date"
t.datetime "startdate"
t.index ["owning_organisation_id"], name: "index_schemes_on_owning_organisation_id"
end

28
spec/helpers/locations_helper_spec.rb

@ -216,31 +216,11 @@ RSpec.describe LocationsHelper do
end
context "when location was merged" do
context "when there is no startdate" do
it "displays merge date as availability date" do
location.update!(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 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]
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 3 May 2022")
end
expect(availability_attribute).to eq("Active from 16 April 2022")
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
before do
FactoryBot.create(:location, scheme:)
scheme.merge_date = Time.zone.local(2023, 1, 5)
scheme.startdate = Time.zone.local(2023, 1, 5)
end
it "returns correct availability" do

Loading…
Cancel
Save