Browse Source

Display banner when org holds no stock

pull/2273/head
Kat 2 years ago
parent
commit
a89c1ce42f
  1. 10
      app/components/create_log_actions_component.rb
  2. 17
      app/components/data_protection_confirmation_banner_component.rb
  3. 8
      app/models/organisation.rb
  4. 34
      spec/components/data_protection_confirmation_banner_component_spec.rb

10
app/components/create_log_actions_component.rb

@ -15,7 +15,7 @@ class CreateLogActionsComponent < ViewComponent::Base
return false if bulk_upload.present? return false if bulk_upload.present?
return true if user.support? return true if user.support?
organisation_or_stock_owner_signed_dsa_and_holds_own_stock?(user.organisation) user.organisation.organisation_or_stock_owner_signed_dsa_and_holds_own_stock?
end end
def create_button_href def create_button_href
@ -53,12 +53,4 @@ class CreateLogActionsComponent < ViewComponent::Base
bulk_upload_sales_log_path(id: "start") bulk_upload_sales_log_path(id: "start")
end end
end end
def organisation_or_stock_owner_signed_dsa_and_holds_own_stock?(organisation)
return true if organisation.data_protection_confirmed? && organisation.holds_own_stock?
return true if organisation.stock_owners.any? { |stock_owner| stock_owner.data_protection_confirmed? && stock_owner.holds_own_stock? }
return true if organisation.absorbed_organisations.any? { |stock_owner| stock_owner.data_protection_confirmed? && stock_owner.holds_own_stock? }
false
end
end end

17
app/components/data_protection_confirmation_banner_component.rb

@ -13,13 +13,16 @@ class DataProtectionConfirmationBannerComponent < ViewComponent::Base
def display_banner? def display_banner?
return false if user.support? && organisation.blank? return false if user.support? && organisation.blank?
return true if org_without_dpo? return true if org_without_dpo?
return false if !org_or_user_org.holds_own_stock? && org_or_user_org.stock_owners.empty? && org_or_user_org.absorbed_organisations.empty?
!org_or_user_org.data_protection_confirmed? !org_or_user_org.organisation_or_stock_owner_signed_dsa_and_holds_own_stock?
end end
def header_text def header_text
if org_without_dpo? if org_without_dpo?
"To create logs your organisation must state a data protection officer. They must sign the Data Sharing Agreement." "To create logs your organisation must state a data protection officer. They must sign the Data Sharing Agreement."
elsif !org_or_user_org.holds_own_stock?
"Your organisation does not own stock. To create logs your stock owner(s) must accept the Data Sharing Agreement on CORE."
elsif user.is_dpo? elsif user.is_dpo?
"Your organisation must accept the Data Sharing Agreement before you can create any logs." "Your organisation must accept the Data Sharing Agreement before you can create any logs."
else else
@ -28,7 +31,7 @@ class DataProtectionConfirmationBannerComponent < ViewComponent::Base
end end
def banner_text def banner_text
if org_without_dpo? || user.is_dpo? if org_without_dpo? || user.is_dpo? || !org_or_user_org.holds_own_stock?
govuk_link_to( govuk_link_to(
link_text, link_text,
link_href, link_href,
@ -50,13 +53,21 @@ private
def link_text def link_text
if dpo_required? if dpo_required?
"Contact helpdesk to assign a data protection officer" "Contact helpdesk to assign a data protection officer"
elsif !org_or_user_org.holds_own_stock?
"View or add stock owners"
else else
"Read the Data Sharing Agreement" "Read the Data Sharing Agreement"
end end
end end
def link_href def link_href
dpo_required? ? GlobalConstants::HELPDESK_URL : data_sharing_agreement_organisation_path(org_or_user_org) if dpo_required?
GlobalConstants::HELPDESK_URL
elsif !org_or_user_org.holds_own_stock?
stock_owners_organisation_path(org_or_user_org)
else
data_sharing_agreement_organisation_path(org_or_user_org)
end
end end
def dpo_required? def dpo_required?

8
app/models/organisation.rb

@ -159,4 +159,12 @@ class Organisation < ApplicationRecord
def has_recent_absorbed_organisations? def has_recent_absorbed_organisations?
absorbed_organisations&.merged_during_open_collection_period.present? absorbed_organisations&.merged_during_open_collection_period.present?
end end
def organisation_or_stock_owner_signed_dsa_and_holds_own_stock?
return true if data_protection_confirmed? && holds_own_stock?
return true if stock_owners.any? { |stock_owner| stock_owner.data_protection_confirmed? && stock_owner.holds_own_stock? }
return true if absorbed_organisations.any? { |stock_owner| stock_owner.data_protection_confirmed? && stock_owner.holds_own_stock? }
false
end
end end

34
spec/components/data_protection_confirmation_banner_component_spec.rb

@ -68,6 +68,40 @@ RSpec.describe DataProtectionConfirmationBannerComponent, type: :component do
expect(component.display_banner?).to eq(false) expect(component.display_banner?).to eq(false)
expect(render.content).to be_empty expect(render.content).to be_empty
end end
context "and doesn't own stock" do
before do
organisation.update!(holds_own_stock: false)
end
context "and has a parent organisation that owns stock and has signed DSA" do
before do
parent_organisation = create(:organisation, holds_own_stock: true)
create(:organisation_relationship, child_organisation: organisation, parent_organisation:)
end
it "does not display banner" do
expect(component.display_banner?).to eq(false)
expect(render.content).to be_empty
end
end
context "and has a parent organisation that hasn't signed DSA" do
before do
parent_organisation = create(:organisation, :without_dpc, holds_own_stock: true)
create(:organisation_relationship, child_organisation: organisation, parent_organisation:)
end
it "displays the banner and asks to create stock owners" do
expect(component.display_banner?).to eq(true)
expect(render).to have_link(
"View or add stock owners",
href: "/organisations/#{organisation.id}/stock-owners",
)
expect(render).to have_selector("p", text: "Your organisation does not own stock. To create logs your stock owner(s) must accept the Data Sharing Agreement on CORE.")
end
end
end
end end
context "when org does not have a DPO" do context "when org does not have a DPO" do

Loading…
Cancel
Save