From 8170665c04db0f6eb33e531b98bb9da037a05bc0 Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Wed, 28 Aug 2024 09:37:59 +0100 Subject: [PATCH] Update methods --- app/helpers/merge_requests_helper.rb | 76 ++++++++++++++-------------- app/models/merge_request.rb | 60 ++++++++++++++-------- 2 files changed, 78 insertions(+), 58 deletions(-) diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index b6bcc7ba7..78b97d989 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -104,17 +104,17 @@ module MergeRequestsHelper end def total_users_after_merge_text(merge_request) - count = merge_request.total_visible_users_after_merge || 0 + 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 = merge_request.total_stock_owners_after_merge "#{"#{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 = merge_request.total_managing_agents_after_merge "#{"#{count} managing agent".pluralize(count)} after merge" end @@ -126,50 +126,52 @@ module MergeRequestsHelper 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? } + def related_organisations(merge_request, relationship_type) + organisations = merge_request.absorbing_organisation.send(relationship_type.pluralize).visible + merge_request.merging_organisations.flat_map { |org| org.send(relationship_type.pluralize).visible } + organisations += [merge_request.absorbing_organisation] + merge_request.merging_organisations + organisations.group_by { |relationship| relationship }.select { |_, occurrences| occurrences.size > 1 }.keys + end - if duplicates.any? - html_content += "Some of the organisations merging have common #{relationship_type.humanize(capitalize: false).pluralize}.

" - end + def relationship_text(merge_request, relationship_type, organisation_path_helper) + text = "" + organisations_without_relationships = organisations_without_relationships(merge_request, relationship_type) - 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 + text += related_organisations_text(merge_request, relationship_type) + text += organisations_without_relationships_text(organisations_without_relationships, relationship_type) ([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')}

" + organisation_count = org.send(relationship_type.pluralize).visible.count + next if organisation_count.zero? + + link_text = generate_link_text(organisation_count, org, relationship_type) + text += "#{govuk_link_to(link_text, send(organisation_path_helper, org), target: '_blank')}

" end - html_content.html_safe + text.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 = [] + def organisations_without_relationships(merge_request, relationship_type) + ([merge_request.absorbing_organisation] + merge_request.merging_organisations).select { |org| org.send(relationship_type.pluralize).visible.empty? } + end - relationships.each do |relationship| - if seen.include?(relationship) - duplicates << relationship - else - seen.add(relationship) - end + def related_organisations_text(merge_request, relationship_type) + if related_organisations(merge_request, relationship_type).any? + "Some of the organisations merging have common #{relationship_type.humanize(capitalize: false).pluralize}.

" + else + "" end + end + + def organisations_without_relationships_text(organisations_without_relationships, relationship_type) + return "" unless organisations_without_relationships.any? + + org_names = organisations_without_relationships.map(&:name).to_sentence + verb = organisations_without_relationships.count > 1 ? "have" : "has" + "#{org_names} #{verb} no #{relationship_type.humanize(capitalize: false).pluralize}.

" + end - duplicates + def generate_link_text(organisation_count, org, relationship_type) + "View #{organisation_count == 1 ? 'the' : 'all'} #{organisation_count} #{org.name} #{relationship_type.humanize(capitalize: false).pluralize(organisation_count)} (opens in a new tab)" end def merging_organisations_without_schemes_text(organisations) @@ -188,7 +190,7 @@ module MergeRequestsHelper end def total_schemes_after_merge_text(merge_request) - count = merge_request.total_visible_schemes_after_merge || 0 + count = merge_request.total_visible_schemes_after_merge "#{"#{count} scheme".pluralize(count)} after merge" end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index c91d2f536..3560756e4 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -61,31 +61,10 @@ 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)}" 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 return [] unless absorbing_organisation.present? && merging_organisations.any? @@ -119,4 +98,43 @@ class MergeRequest < ApplicationRecord ([absorbing_organisation] + merging_organisations).reject(&:has_visible_schemes?) end + + def filter_relationships(absorbing_relationships, merging_relationships, absorbing_organisation, merging_organisations) + filtered_absorbing_relationships = absorbing_relationships.reject do |relationship| + merging_relationships.include?(relationship) || merging_organisations.include?(relationship) + end + + filtered_merging_relationships = merging_relationships.reject do |relationship| + absorbing_relationships.include?(relationship) || relationship == absorbing_organisation || merging_organisations.include?(relationship) + end + + (filtered_absorbing_relationships + filtered_merging_relationships).uniq + end + + def total_stock_owners_after_merge + return total_stock_owners if status == STATUS[:request_merged] || status == STATUS[:processing] + + absorbing_stock_owners = absorbing_organisation.stock_owners.visible + merging_stock_owners = merging_organisations.flat_map { |org| org.stock_owners.visible } + + total_filtered_stock_owners = filter_relationships(absorbing_stock_owners, merging_stock_owners, absorbing_organisation, merging_organisations) + total_filtered_stock_owners.count + end + + def total_managing_agents_after_merge + return total_managing_agents if status == STATUS[:request_merged] || status == STATUS[:processing] + + absorbing_managing_agents = absorbing_organisation.managing_agents.visible + merging_managing_agents = merging_organisations.flat_map { |org| org.managing_agents.visible } + + total_filtered_managing_agents = filter_relationships(absorbing_managing_agents, merging_managing_agents, absorbing_organisation, merging_organisations) + total_filtered_managing_agents.count + 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 end