From 0636e8b80dc9c1bd8aab7d034c271be9ec5c9bae Mon Sep 17 00:00:00 2001 From: Kat Date: Fri, 4 Aug 2023 10:21:49 +0100 Subject: [PATCH] Display absorbed orgs/absorbed org stock owners --- .../sales/questions/owning_organisation_id.rb | 36 ++++++++++----- .../questions/owning_organisation_id_spec.rb | 45 +++++++++++++++++++ 2 files changed, 71 insertions(+), 10 deletions(-) diff --git a/app/models/form/sales/questions/owning_organisation_id.rb b/app/models/form/sales/questions/owning_organisation_id.rb index 0db5ec1a0..11b48dc2d 100644 --- a/app/models/form/sales/questions/owning_organisation_id.rb +++ b/app/models/form/sales/questions/owning_organisation_id.rb @@ -10,23 +10,27 @@ class Form::Sales::Questions::OwningOrganisationId < ::Form::Question def answer_options(log = nil, user = nil) answer_opts = { "" => "Select an option" } - return answer_opts unless ActiveRecord::Base.connected? - return answer_opts unless user - return answer_opts unless log + return answer_opts unless ActiveRecord::Base.connected? && user && log if log.owning_organisation_id.present? - answer_opts = answer_opts.merge({ log.owning_organisation.id => log.owning_organisation.name }) + answer_opts[log.owning_organisation.id] = log.owning_organisation.name end if !user.support? && user.organisation.holds_own_stock? - answer_opts[user.organisation.id] = "#{user.organisation.name} (Your organisation)" + answer_opts[user.organisation.id] = organisation_label(user.organisation) end - user_answer_options = if user.support? - Organisation.where(holds_own_stock: true) - else - user.organisation.stock_owners + user.organisation.absorbed_organisations.where(holds_own_stock: true) - end.pluck(:id, :name).to_h + user_organisation_options = user.support? ? Organisation.where(holds_own_stock: true) : user.organisation.stock_owners + user_answer_options = user_organisation_options.pluck(:id, :name).to_h + + unless user.support? + user.organisation.absorbed_organisations.where(holds_own_stock: true).find_each do |absorbed_org| + answer_opts[absorbed_org.id] = merged_organisation_label(absorbed_org.name, absorbed_org.merge_date) + absorbed_org.stock_owners.each do |stock_owner| + user_answer_options[stock_owner.id] = merged_organisation_label(stock_owner.name, absorbed_org.merge_date) + end + end + end answer_opts.merge(user_answer_options) end @@ -66,4 +70,16 @@ private def selected_answer_option_is_derived?(_log) true end + + def organisation_label(organisation) + if organisation.absorbed_organisations.exists? + "#{organisation.name} (Your organisation, active as of #{organisation.created_at.to_fs(:govuk_date)})" + else + "#{organisation.name} (Your organisation)" + end + end + + def merged_organisation_label(name, merge_date) + "#{name} (inactive as of #{merge_date.to_fs(:govuk_date)})" + end end diff --git a/spec/models/form/sales/questions/owning_organisation_id_spec.rb b/spec/models/form/sales/questions/owning_organisation_id_spec.rb index 815a42319..300dcd6b4 100644 --- a/spec/models/form/sales/questions/owning_organisation_id_spec.rb +++ b/spec/models/form/sales/questions/owning_organisation_id_spec.rb @@ -111,6 +111,51 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do expect(question.displayed_answer_options(log, user)).to eq(options) end end + + context "when user's org has recently absorbed other orgs" do + let(:merged_organisation) { create(:organisation, name: "Merged org") } + let(:options) do + { + "" => "Select an option", + user.organisation.id => "User org (Your organisation, active as of 2 February 2021)", + owning_org_1.id => "Owning org 1", + merged_organisation.id => "Merged org (inactive as of 2 February 2023)", + owning_org_2.id => "Owning org 2", + } + end + + before do + merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation) + user.organisation.update!(created_at: Time.zone.local(2021, 2, 2)) + end + + it "shows merged organisation as an option" do + expect(question.displayed_answer_options(log, user)).to eq(options) + end + end + + context "when user's org has recently absorbed other orgs with parent organisations" do + let(:merged_organisation) { create(:organisation, name: "Merged org") } + let(:options) do + { + "" => "Select an option", + user.organisation.id => "User org (Your organisation, active as of 2 February 2021)", + owning_org_1.id => "Owning org 1", + merged_organisation.id => "Merged org (inactive as of 2 February 2023)", + owning_org_2.id => "Owning org 2 (inactive as of 2 February 2023)", + } + end + + before do + org_rel.update!(child_organisation: merged_organisation) + merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation) + user.organisation.update!(created_at: Time.zone.local(2021, 2, 2)) + end + + it "shows merged organisation as an option" do + expect(question.displayed_answer_options(log, user)).to eq(options) + end + end end context "when user is support" do