From 2e1e52b8620ca8e7938a819adbc15815aef5a755 Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Wed, 16 Apr 2025 10:03:54 +0100 Subject: [PATCH] Refactor name_changes_with_dates method to streamline fetching and status assignment --- app/models/organisation.rb | 58 +++++++++----------------- app/models/organisation_name_change.rb | 25 +++++++---- 2 files changed, 36 insertions(+), 47 deletions(-) diff --git a/app/models/organisation.rb b/app/models/organisation.rb index bb78ae7a7..cfbced8e2 100644 --- a/app/models/organisation.rb +++ b/app/models/organisation.rb @@ -77,44 +77,6 @@ class Organisation < ApplicationRecord name_change&.name || read_attribute(:name) end - def name_changes_with_dates - changes = fetch_name_changes_with_dates - - if changes.any? - changes.unshift({ - name: self[:name], - start_date: created_at, - end_date: changes.first[:start_date]&.yesterday, - status: Time.zone.now.to_date < changes.first[:start_date].to_date ? "scheduled" : "inactive", - }) - else - changes << { name: self[:name], start_date: created_at, end_date: nil, status: "active" } - end - - changes.each do |change| - change[:status] ||= if change[:start_date].to_date > Time.zone.now.to_date - "scheduled" - elsif change[:end_date].nil? || change[:end_date].to_date >= Time.zone.now.to_date - "active" - else - "inactive" - end - end - - changes - end - - def fetch_name_changes_with_dates - organisation_name_changes.visible.order(:startdate).map.with_index do |change, index| - next_change = organisation_name_changes.visible.order(:startdate)[index + 1] - { - name: change.name, - start_date: change.startdate, - end_date: next_change&.startdate&.yesterday, - } - end - end - def can_be_managed_by?(organisation:) organisation == self || managing_agents.include?(organisation) end @@ -240,6 +202,26 @@ class Organisation < ApplicationRecord status == :deleted ? "#{name(date:)} (deleted)" : name(date:) end + def name_changes_with_dates + changes = organisation_name_changes.visible.order(:startdate).map do |change| + { + name: change.name, + start_date: change.startdate, + end_date: change.end_date, + status: change.status, + } + end + + changes.unshift( + name: self[:name], + start_date: created_at, + end_date: changes.first&.dig(:start_date)&.yesterday, + status: Time.zone.now.to_date < changes.first&.dig(:start_date) ? "scheduled" : "inactive", + ) + + changes + end + def has_visible_users? users.visible.count.positive? end diff --git a/app/models/organisation_name_change.rb b/app/models/organisation_name_change.rb index daa5bfab3..77ec74536 100644 --- a/app/models/organisation_name_change.rb +++ b/app/models/organisation_name_change.rb @@ -2,6 +2,8 @@ class OrganisationNameChange < ApplicationRecord belongs_to :organisation scope :visible, -> { where(discarded_at: nil) } + scope :before_date, ->(date) { where("startdate < ?", date) } + scope :after_date, ->(date) { where("startdate > ?", date) } validates :name, presence: true validates :startdate, presence: true, unless: -> { immediate_change } @@ -22,22 +24,28 @@ class OrganisationNameChange < ApplicationRecord has_paper_trail - def includes_date?(date) - startdate <= date && (next_change&.startdate.nil? || next_change&.startdate > date) - end - - def before_date?(date) - startdate < date + def status + if startdate > Time.zone.now.to_date + "scheduled" + elsif end_date.nil? || end_date >= Time.zone.now.to_date + "active" + else + "inactive" + end end - def after_date?(date) - startdate > date + def includes_date?(date) + startdate <= date && (next_change&.startdate.nil? || next_change&.startdate > date) end def next_change organisation.organisation_name_changes.where("startdate > ?", startdate).order(startdate: :asc).first end + def end_date + next_change&.startdate&.yesterday + end + def previous_change organisation.organisation_name_changes.where("startdate < ?", startdate).order(startdate: :desc).first end @@ -87,4 +95,3 @@ private end end end -