Skip to content

Commit 10f0309

Browse files
committed
Add feature report for copy of answers
Show the number of forms that allow users to ask for a copy of their answers, with a link to the report that lists forms with this feature enabled.
1 parent 828d357 commit 10f0309

9 files changed

Lines changed: 120 additions & 14 deletions

File tree

app/controllers/reports_controller.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@ def forms_with_welsh_translation
123123
forms_feature_report(tag, params[:action], forms)
124124
end
125125

126+
def forms_with_copy_of_answers_enabled
127+
tag = params[:tag]
128+
forms = Reports::FormDocumentsService.form_documents(tag:)
129+
forms = Reports::FeatureReportService.new(forms).forms_with_copy_of_answers_enabled
130+
131+
forms_feature_report(tag, params[:action], forms)
132+
end
133+
126134
def users
127135
data = Reports::UsersReportService.new.user_data
128136

app/services/reports/feature_report_service.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def report
2222
steps_with_answer_type: HashWithIndifferentAccess.new,
2323
forms_with_exit_pages: 0,
2424
forms_with_welsh_translation: 0,
25+
forms_with_copy_of_answers_enabled: 0,
2526
}
2627

2728
form_documents.each do |form|
@@ -38,6 +39,7 @@ def report
3839
report[:forms_with_s3_submissions] += 1 if Reports::FormDocumentsService.has_s3_submissions(form)
3940
report[:forms_with_exit_pages] += 1 if Reports::FormDocumentsService.has_exit_pages?(form)
4041
report[:forms_with_welsh_translation] += 1 if Reports::FormDocumentsService.has_welsh_translation(form)
42+
report[:forms_with_copy_of_answers_enabled] += 1 if Reports::FormDocumentsService.copy_of_answers_enabled?(form)
4143

4244
answer_types_in_form = form["content"]["steps"].map { |step| step["data"]["answer_type"] }
4345

@@ -180,6 +182,11 @@ def forms_with_welsh_translation
180182
.select { |form| Reports::FormDocumentsService.has_welsh_translation(form) }
181183
end
182184

185+
def forms_with_copy_of_answers_enabled
186+
form_documents
187+
.select { |form| Reports::FormDocumentsService.copy_of_answers_enabled?(form) }
188+
end
189+
183190
private
184191

185192
def questions_details(form, step)

app/services/reports/form_documents_service.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ class << self
33
def form_documents(tag:)
44
form_document_tags = tag == "live-or-archived" ? %w[live archived] : tag
55
form_documents = FormDocument.joins(form: { group_form: { group: :organisation } })
6-
.where(tag: form_document_tags, language: "en")
7-
.where.not(organisation: { "internal": true })
8-
.select("form_documents.*", "organisation.name AS organisation_name", "organisation.id AS organisation_id", "groups.external_id AS group_external_id", "groups.name AS group_name", "welsh_completed AS welsh_completed")
6+
.where(tag: form_document_tags, language: "en")
7+
.where.not(organisation: { "internal": true })
8+
.select("form_documents.*", "organisation.name AS organisation_name", "organisation.id AS organisation_id", "groups.external_id AS group_external_id", "groups.name AS group_name", "welsh_completed AS welsh_completed")
99

1010
if tag == "draft"
1111
form_documents = form_documents.where(form: { "state": %w[draft live_with_draft archived_with_draft] })
@@ -76,6 +76,10 @@ def has_welsh_translation(form_document)
7676
form_document["welsh_completed"].present?
7777
end
7878

79+
def copy_of_answers_enabled?(form_document)
80+
form_document.dig("content", "send_copy_of_answers") == "enabled"
81+
end
82+
7983
private
8084

8185
def secondary_skip_conditions(form_document)

app/views/reports/features.html.erb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@
5858
<%= row.with_key(text: t(".features.forms_with_welsh_translation", tag: tag_label(tag)).upcase_first) %>
5959
<%= row.with_value(text: govuk_link_to(data[:forms_with_welsh_translation], report_forms_with_welsh_translation_path, no_visited_state: true)) %>
6060
<% end %>
61+
<%= summary_list.with_row do |row| %>
62+
<%= row.with_key(text: t(".features.forms_with_copy_of_answers_enabled", tag: tag_label(tag)).upcase_first) %>
63+
<%= row.with_value(text: govuk_link_to(data[:forms_with_copy_of_answers_enabled], report_forms_with_copy_of_answers_enabled_path, no_visited_state: true)) %>
64+
<% end %>
6165
<% end %>
6266

6367
<h2 class="govuk-heading-m govuk-visually-hidden"><%= t(".answer_types.heading") %></h2>

config/locales/en.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1833,6 +1833,7 @@ en:
18331833
copied_forms: "%{tag} forms that are copies"
18341834
forms_with_add_another_answer: "%{tag} forms with add another answer"
18351835
forms_with_branch_routes: "%{tag} forms with branch routes"
1836+
forms_with_copy_of_answers_enabled: "%{tag} forms that allow people to ask for a copy of their answers"
18361837
forms_with_csv_submission_email_attachments: "%{tag} forms with CSV email attachments"
18371838
forms_with_daily_submission_csv: "%{tag} forms getting a daily CSV of completed forms"
18381839
forms_with_exit_pages: "%{tag} forms with exit pages"
@@ -1867,6 +1868,10 @@ en:
18671868
download_csv: Download data about all %{tag} forms with branch routes as a CSV file
18681869
empty: There are no %{tag} forms with branch routes
18691870
heading: "%{tag} forms with branch routes"
1871+
forms_with_copy_of_answers_enabled:
1872+
download_csv: Download data about all %{tag} forms that allow people to ask for a copy of their answers (as a CSV)
1873+
empty: There are no %{tag} forms that allow people to ask for a copy of their answers
1874+
heading: "%{tag} forms that allow people to ask for a copy of their answers"
18701875
forms_with_csv_submission_email_attachments:
18711876
download_csv: Download data about all %{tag} forms with CSV submission email attachments enabled (as a CSV)
18721877
empty: There are no %{tag} forms with CSV submission email attachments enabled

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@
265265
get "forms-with-s3-submissions", to: "reports#forms_with_s3_submissions", as: :report_forms_with_s3_submissions
266266
get "forms-with-exit-pages", to: "reports#forms_with_exit_pages", as: :report_forms_with_exit_pages
267267
get "forms-with-welsh-translation", to: "reports#forms_with_welsh_translation", as: :report_forms_with_welsh_translation
268+
get "forms-with-copy-of-answers-enabled", to: "reports#forms_with_copy_of_answers_enabled", as: :report_forms_with_copy_of_answers_enabled
268269
get "selection-questions-summary", to: "reports#selection_questions_summary", as: :report_selection_questions_summary
269270
get "selection-questions-with-autocomplete", to: "reports#selection_questions_with_autocomplete", as: :report_selection_questions_with_autocomplete
270271
get "selection-questions-with-radios", to: "reports#selection_questions_with_radios", as: :report_selection_questions_with_radios

spec/requests/reports_controller_spec.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,31 @@
403403
end
404404
end
405405

406+
describe "#forms_with_copy_of_answers_enabled" do
407+
let(:path) { report_forms_with_copy_of_answers_enabled_path(tag: :live) }
408+
let(:form) { create(:form, :live, send_copy_of_answers: "enabled") }
409+
let(:forms) { [form] }
410+
411+
include_examples "unauthorized user is forbidden"
412+
413+
context "when the user is a super admin" do
414+
before do
415+
login_as_super_admin_user
416+
417+
get path
418+
end
419+
420+
it "returns http code 200 with the expected report data" do
421+
expect(response).to have_http_status(:ok)
422+
expect(response).to render_template("reports/feature_report")
423+
424+
node = Capybara.string(response.body)
425+
expect(node).to have_xpath "//thead/tr/th[1]", text: "Form name"
426+
expect(node).to have_xpath "//tbody/tr[1]/td[1]", text: form.name
427+
end
428+
end
429+
end
430+
406431
describe "#users" do
407432
let(:path) { report_users_path }
408433

@@ -686,6 +711,31 @@
686711
end
687712
end
688713

714+
describe "#forms_with_copy_of_answers_enabled as csv" do
715+
let(:form) { create(:form, :live, send_copy_of_answers: "enabled") }
716+
let(:forms) { [form, *create_list(:form, 2, :live)] }
717+
let(:expected_csv_filename) { "live_forms_with_copy_of_answers_enabled_report-2025-05-15 15:31:57 UTC.csv" }
718+
719+
before do
720+
login_as_super_admin_user
721+
722+
travel_to Time.utc(2025, 5, 15, 15, 31, 57)
723+
724+
get report_forms_with_copy_of_answers_enabled_path(tag: :live, format: :csv)
725+
end
726+
727+
it_behaves_like "csv response"
728+
729+
it "has expected response body" do
730+
csv = CSV.parse(response.body, headers: true)
731+
expect(csv.headers).to eq Reports::FormsCsvReportService::FORM_CSV_HEADERS
732+
expect(csv.length).to eq 1
733+
expect(csv.by_col["Form name"]).to eq [
734+
form.name,
735+
]
736+
end
737+
end
738+
689739
describe "#live_questions_csv" do
690740
let(:forms) do
691741
live_forms = create_list(:form, 2, :live, pages_count: 3)

spec/services/reports/feature_report_service_spec.rb

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,23 @@
2323
let(:group) { create(:group) }
2424

2525
let(:form_with_all_answer_types) do
26-
create(:form, :live, :with_support, submission_type: "email", submission_format: %w[csv], payment_url: "https://www.gov.uk/payments/organisation/service", pages: [
27-
create(:page, :with_address_settings, is_repeatable: true),
28-
create(:page, :with_date_settings),
29-
create(:page, answer_type: "email"),
30-
create(:page, :with_full_name_settings),
31-
create(:page, answer_type: "national_insurance_number"),
32-
create(:page, answer_type: "number"),
33-
create(:page, answer_type: "phone_number"),
34-
create(:page, :with_selection_settings, is_optional: true),
35-
create(:page, :with_single_line_text_settings, is_repeatable: true),
36-
])
26+
create(:form, :live,
27+
:with_support,
28+
submission_type: "email",
29+
submission_format: %w[csv],
30+
payment_url: "https://www.gov.uk/payments/organisation/service",
31+
send_copy_of_answers: "enabled",
32+
pages: [
33+
create(:page, :with_address_settings, is_repeatable: true),
34+
create(:page, :with_date_settings),
35+
create(:page, answer_type: "email"),
36+
create(:page, :with_full_name_settings),
37+
create(:page, answer_type: "national_insurance_number"),
38+
create(:page, answer_type: "number"),
39+
create(:page, answer_type: "phone_number"),
40+
create(:page, :with_selection_settings, is_optional: true),
41+
create(:page, :with_single_line_text_settings, is_repeatable: true),
42+
])
3743
end
3844
let(:form_with_a_few_answer_types) do
3945
create(:form,
@@ -116,6 +122,7 @@
116122
},
117123
forms_with_exit_pages: 1,
118124
forms_with_welsh_translation: 1,
125+
forms_with_copy_of_answers_enabled: 1,
119126
})
120127
end
121128
end
@@ -512,4 +519,19 @@
512519
]
513520
end
514521
end
522+
523+
describe "#forms_with_copy_of_answers_enabled" do
524+
it "returns live forms with copy of answers enabled" do
525+
forms = described_class.new(form_documents).forms_with_copy_of_answers_enabled
526+
expect(forms.length).to eq 1
527+
expect(forms).to match [
528+
a_hash_including(
529+
"form_id" => form_with_all_answer_types.id,
530+
"content" => a_hash_including(
531+
"name" => form_with_all_answer_types.name,
532+
),
533+
),
534+
]
535+
end
536+
end
515537
end

spec/views/reports/features.html.erb_spec.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
forms_with_s3_submissions: 5,
3838
forms_with_exit_pages: 1,
3939
forms_with_welsh_translation: 1,
40+
forms_with_copy_of_answers_enabled: 2,
4041
}
4142
end
4243
let(:tag) { "live" }
@@ -148,6 +149,10 @@
148149
expect(rendered).to have_css(".govuk-summary-list__row", text: "Live forms with Welsh translation#{report[:forms_with_welsh_translation]}")
149150
end
150151

152+
it "includes the number of live forms that allow people to ask for a copy of their answers" do
153+
expect(rendered).to have_css(".govuk-summary-list__row", text: "Live forms that allow people to ask for a copy of their answers#{report[:forms_with_copy_of_answers]}")
154+
end
155+
151156
it "has a link to the selection questions summary report" do
152157
expect(rendered).to have_link href: report_selection_questions_summary_path
153158
end

0 commit comments

Comments
 (0)