diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index 51317bcfd..055316b81 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -9,6 +9,7 @@ class MergeRequestsController < ApplicationController def helpdesk_ticket; end def merge_start_confirmation; end def user_outcomes; end + def relationship_outcomes; end def create ActiveRecord::Base.transaction do @@ -63,7 +64,13 @@ class MergeRequestsController < ApplicationController def start_merge if @merge_request.status == "ready_to_merge" - @merge_request.update!(processing: true, last_failed_attempt: nil, total_users: @merge_request.total_visible_users_after_merge) + @merge_request.update!( + processing: true, + last_failed_attempt: nil, + total_users: @merge_request.total_visible_users_after_merge, + total_stock_owners: @merge_request.total_stock_owners_after_merge, + total_managing_agents: @merge_request.total_managing_agents_after_merge, + ) ProcessMergeRequestJob.perform_later(merge_request: @merge_request) end diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 6fd078553..ba454e150 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -27,7 +27,7 @@ module MergeRequestsHelper { label: "Total users after merge", value: display_value_or_placeholder(merge_request.total_users_label), action: merge_outcome_action(merge_request, "user_outcomes") }, { label: "Total schemes after merge", value: display_value_or_placeholder(merge_request.total_schemes), action: { text: "View", href: "#", visually_hidden_text: "total schemes after merge" } }, { label: "Total logs after merge", value: merge_request.total_lettings_logs.present? || merge_request.total_sales_logs.present? ? "#{merge_request.total_lettings_logs} lettings logs
#{merge_request.total_sales_logs} sales logs".html_safe : display_value_or_placeholder(nil), action: { text: "View", href: "#", visually_hidden_text: "total logs after merge" } }, - { label: "Total stock owners & managing agents after merge", value: merge_request.total_stock_owners.present? || merge_request.total_managing_agents.present? ? "#{merge_request.total_stock_owners} stock owners
#{merge_request.total_managing_agents} managing agents".html_safe : display_value_or_placeholder(nil), action: { text: "View", href: "#", visually_hidden_text: "total stock owners & managing agents after merge" } }, + { label: "Total stock owners & managing agents after merge", value: display_value_or_placeholder(merge_request.total_stock_owners_managing_agents_label), action: merge_outcome_action(merge_request, "relationship_outcomes") }, ] end @@ -107,4 +107,68 @@ module MergeRequestsHelper count = merge_request.total_visible_users_after_merge "#{"#{count} user".pluralize(count)} after merge" end + + def total_stock_owners_after_merge_text(merge_request) + count = merge_request.total_stock_owners_after_merge || 0 + "#{"#{count} stock owner".pluralize(count)} after merge" + end + + def total_managing_agents_after_merge_text(merge_request) + count = merge_request.total_managing_agents_after_merge || 0 + "#{"#{count} managing agent".pluralize(count)} after merge" + end + + def stock_owners_text(merge_request) + relationship_text(merge_request, "stock_owner", :stock_owners_organisation_path) + end + + def managing_agent_text(merge_request) + relationship_text(merge_request, "managing_agent", :managing_agents_organisation_path) + end + + def relationship_text(merge_request, relationship_type, relationship_path_helper) + html_content = "" + duplicates = duplicate_relationships(merge_request, relationship_type) + organisations_without_relationships = ([merge_request.absorbing_organisation] + merge_request.merging_organisations).select { |org| org.send(relationship_type.pluralize).visible.empty? } + + if duplicates.any? + html_content += "Some of the organisations merging have common #{relationship_type.humanize(capitalize: false).pluralize}.

" + end + + if organisations_without_relationships.any? + org_names = organisations_without_relationships.map(&:name).to_sentence + verb = organisations_without_relationships.count > 1 ? "have" : "has" + html_content += "#{org_names} #{verb} no #{relationship_type.humanize(capitalize: false).pluralize}.

" + end + + ([merge_request.absorbing_organisation] + merge_request.merging_organisations).each do |org| + relationship_count = org.send(relationship_type.pluralize).visible.count + next if relationship_count.zero? + + link_text = if relationship_count == 1 + "View the #{relationship_count} #{org.name} #{relationship_type.humanize(capitalize: false)} (opens in a new tab)" + else + "View all #{relationship_count} #{org.name} #{relationship_type.humanize(capitalize: false).pluralize} (opens in a new tab)" + end + html_content += "#{govuk_link_to(link_text, send(relationship_path_helper, org), target: '_blank')}

" + end + + html_content.html_safe + end + + def duplicate_relationships(merge_request, relationship_type) + relationships = merge_request.absorbing_organisation.send(relationship_type.pluralize) + merge_request.merging_organisations.flat_map { |org| org.send(relationship_type.pluralize) } + seen = Set.new + duplicates = [] + + relationships.each do |relationship| + if seen.include?(relationship) + duplicates << relationship + else + seen.add(relationship) + end + end + + duplicates + end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index aae36195d..04c909fab 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -61,8 +61,29 @@ class MergeRequest < ApplicationRecord absorbing_organisation.users.visible.count + merging_organisations.sum { |org| org.users.visible.count } end + def total_stock_owners_after_merge + return total_stock_owners if status == STATUS[:request_merged] || status == STATUS[:processing] + + stock_owners = absorbing_organisation.stock_owners.visible + merging_organisations.flat_map { |org| org.stock_owners.visible } + stock_owners.uniq.count + end + + def total_managing_agents_after_merge + return total_managing_agents if status == STATUS[:request_merged] || status == STATUS[:processing] + + managing_agents = absorbing_organisation.managing_agents.visible + merging_organisations.flat_map { |org| org.managing_agents.visible } + managing_agents.uniq.count + end + def total_users_label - "#{total_visible_users_after_merge} #{'User'.pluralize(total_visible_users_after_merge)}" + "#{total_visible_users_after_merge} #{'user'.pluralize(total_visible_users_after_merge)}" + end + + def total_stock_owners_managing_agents_label + stock_owners_count = total_stock_owners_after_merge + managing_agents_count = total_managing_agents_after_merge + + "#{stock_owners_count} #{'stock owner'.pluralize(stock_owners_count)}\n#{managing_agents_count} #{'managing agent'.pluralize(managing_agents_count)}" end def organisations_with_users diff --git a/app/views/merge_requests/relationship_outcomes.html.erb b/app/views/merge_requests/relationship_outcomes.html.erb new file mode 100644 index 000000000..4f1a81a7c --- /dev/null +++ b/app/views/merge_requests/relationship_outcomes.html.erb @@ -0,0 +1,26 @@ +<% content_for :before_content do %> + <% title = "Stock owners & managing agents" %> + <% content_for :title, title %> + <%= govuk_back_link href: merge_request_path(@merge_request) %> +<% end %> + +

+ <%= @merge_request.absorbing_organisation_name %> + Stock owners & managing agents +

+ +<% unless @merge_request.status == "request_merged" || @merge_request.status == "processing" %> +

<%= total_stock_owners_after_merge_text(@merge_request) %>

+

+ <%= stock_owners_text(@merge_request) %> +

+
+
+

<%= total_managing_agents_after_merge_text(@merge_request) %>

+

+ <%= managing_agent_text(@merge_request) %> +

+<% end %> + + + diff --git a/config/routes.rb b/config/routes.rb index 63bafbd51..360771bf3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -211,6 +211,7 @@ Rails.application.routes.draw do get "helpdesk-ticket" get "merge-start-confirmation" get "user-outcomes" + get "relationship-outcomes" get "delete-confirmation", to: "merge_requests#delete_confirmation" delete "delete", to: "merge_requests#delete" patch "start-merge", to: "merge_requests#start_merge"