Browse Source

Fix question counts for sections with conditional questions

pull/31/head
baarkerlounger 4 years ago
parent
commit
77face1e49
  1. 3
      app/controllers/case_logs_controller.rb
  2. 49
      app/helpers/check_answers_helper.rb
  3. 9
      app/models/form.rb
  4. 8
      app/views/form/check_answers.html.erb
  5. 8
      spec/helpers/check_answers_helper_spec.rb

3
app/controllers/case_logs_controller.rb

@ -40,8 +40,7 @@ class CaseLogsController < ApplicationController
form = Form.new(2021, 2022) form = Form.new(2021, 2022)
current_url = request.env["PATH_INFO"] current_url = request.env["PATH_INFO"]
subsection = current_url.split("/")[-2] subsection = current_url.split("/")[-2]
subsection_pages = form.pages_for_subsection(subsection) render "form/check_answers", locals: { case_log: @case_log, subsection: subsection }
render "form/check_answers", locals: { case_log: @case_log, subsection_pages: subsection_pages, subsection: subsection.humanize(capitalize: false) }
end end
form = Form.new(2021, 2022) form = Form.new(2021, 2022)

49
app/helpers/check_answers_helper.rb

@ -1,16 +1,36 @@
module CheckAnswersHelper module CheckAnswersHelper
def get_answered_questions_total(subsection_pages, case_log) def total_answered_questions(subsection, case_log)
questions = subsection_pages.values.flat_map do |page| total_questions(subsection, case_log).keys.count do |question_key|
page["questions"].keys case_log[question_key].present?
end end
questions.count { |question| case_log[question].present? }
end end
def get_total_number_of_questions(subsection_pages) def total_number_of_questions(subsection, case_log)
questions = subsection_pages.values.flat_map do |page| total_questions(subsection, case_log).count
page["questions"].keys
end end
questions.count
def total_questions(subsection, case_log)
form = Form.new(2021, 2022)
questions = form.questions_for_subsection(subsection)
question_keys = questions.keys
questions_not_applicable = []
questions.reject do |question_key, question|
question.fetch("conditional_for", []).map do |conditional_question_key, condition|
if condition_not_met(case_log, question_key, condition)
questions_not_applicable << conditional_question_key
end
end
questions_not_applicable.include?(question_key)
end
end
def condition_not_met(case_log, question_key, condition)
case_log[question_key].blank? || !(eval(case_log[question_key].to_s + condition))
end
def subsection_pages(subsection)
@form ||= Form.new(2021, 2022)
@subsection_pages ||= @form.pages_for_subsection(subsection)
end end
def create_update_answer_link(case_log_answer, case_log_id, page) def create_update_answer_link(case_log_answer, case_log_id, page)
@ -18,9 +38,9 @@ module CheckAnswersHelper
link_to(link_name, "/case_logs/#{case_log_id}/#{page}", class: "govuk-link").html_safe link_to(link_name, "/case_logs/#{case_log_id}/#{page}", class: "govuk-link").html_safe
end end
def create_next_missing_question_link(case_log_id, subsection_pages, case_log) def create_next_missing_question_link(case_log_id, subsection, case_log)
pages_to_fill_in = [] pages_to_fill_in = []
subsection_pages.each do |page_title, page_info| subsection_pages(subsection).each do |page_title, page_info|
page_info["questions"].any? { |question| case_log[question].blank? } page_info["questions"].any? { |question| case_log[question].blank? }
pages_to_fill_in << page_title pages_to_fill_in << page_title
end end
@ -28,12 +48,13 @@ module CheckAnswersHelper
link_to("Answer the missing questions", url, class: "govuk-link").html_safe link_to("Answer the missing questions", url, class: "govuk-link").html_safe
end end
def display_answered_questions_summary(subsection_pages, case_log) def display_answered_questions_summary(subsection, case_log)
if get_answered_questions_total(subsection_pages, case_log) == get_total_number_of_questions(subsection_pages) # binding.pry
if total_answered_questions(subsection, case_log) == total_number_of_questions(subsection, case_log)
'<p class="govuk-body govuk-!-margin-bottom-7">You answered all the questions</p>'.html_safe '<p class="govuk-body govuk-!-margin-bottom-7">You answered all the questions</p>'.html_safe
else else
"<p class=\"govuk-body govuk-!-margin-bottom-7\">You answered #{get_answered_questions_total(subsection_pages, case_log)} of #{get_total_number_of_questions(subsection_pages)} questions</p> "<p class=\"govuk-body govuk-!-margin-bottom-7\">You answered #{total_answered_questions(subsection, case_log)} of #{total_number_of_questions(subsection, case_log)} questions</p>
#{create_next_missing_question_link(case_log['id'], subsection_pages, case_log)}".html_safe #{create_next_missing_question_link(case_log['id'], subsection, case_log)}".html_safe
end end
end end
end end

9
app/models/form.rb

@ -37,6 +37,11 @@ class Form
all_pages[page]["questions"] all_pages[page]["questions"]
end end
# Returns a hash with the questions as keys
def questions_for_subsection(subsection)
pages_for_subsection(subsection).map { |title, _value| questions_for_page(title) }.reduce(:merge)
end
def first_page_for_subsection(subsection) def first_page_for_subsection(subsection)
pages_for_subsection(subsection).keys.first pages_for_subsection(subsection).keys.first
end end
@ -70,8 +75,4 @@ class Form
pages_for_subsection(subsection).keys[current_page_idx - 1] pages_for_subsection(subsection).keys[current_page_idx - 1]
end end
def questions_for_subsection(subsection)
pages_for_subsection(subsection).map { |title, _value| questions_for_page(title) }.reduce(:merge)
end
end end

8
app/views/form/check_answers.html.erb

@ -1,12 +1,14 @@
<%= turbo_frame_tag "case_log_form", target: "_top" do %> <%= turbo_frame_tag "case_log_form", target: "_top" do %>
<div class="govuk-grid-row"> <div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds-from-desktop"> <div class="govuk-grid-column-two-thirds-from-desktop">
<h1 class="govuk-heading-l">Check the answers you gave for <%= subsection %></h1> <h1 class="govuk-heading-l">Check the answers you gave for <%= subsection.humanize(capitalize: false) %></h1>
<%= display_answered_questions_summary(subsection_pages, case_log) %> <%= display_answered_questions_summary(subsection, case_log) %>
<% subsection_pages.each do |page, page_info| %> <% subsection_pages(subsection).each do |page, page_info| %>
<% page_info["questions"].each do |question_title, question_info| %> <% page_info["questions"].each do |question_title, question_info| %>
<% if total_questions(subsection, case_log).include?(question_title) %>
<%= render partial: 'form/check_answers_table', locals: { question_title: question_title, question_info: question_info, case_log: case_log, page: page } %> <%= render partial: 'form/check_answers_table', locals: { question_title: question_title, question_info: question_info, case_log: case_log, page: page } %>
<%end %> <%end %>
<%end %>
<% end %> <% end %>
<%= form_with action: '/case_logs', method: "next_page", builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %> <%= form_with action: '/case_logs', method: "next_page", builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %>
<%= f.govuk_submit "Save and continue" %> <%= f.govuk_submit "Save and continue" %>

8
spec/helpers/check_answers_helper_spec.rb

@ -3,22 +3,22 @@ require "rails_helper"
RSpec.describe CheckAnswersHelper do RSpec.describe CheckAnswersHelper do
let(:case_log) { FactoryBot.create(:case_log) } let(:case_log) { FactoryBot.create(:case_log) }
let(:form) { Form.new(2021, 2022) } let(:form) { Form.new(2021, 2022) }
let(:subsection_pages) { form.pages_for_subsection("income_and_benefits") } let(:subsection) { "income_and_benefits" }
describe "Get answered questions total" do describe "Get answered questions total" do
it "returns 0 if no questions are answered" do it "returns 0 if no questions are answered" do
expect(get_answered_questions_total(subsection_pages, case_log)).to equal(0) expect(total_answered_questions(subsection, case_log)).to equal(0)
end end
it "returns 1 if 1 question gets answered" do it "returns 1 if 1 question gets answered" do
case_log["net_income"] = "123" case_log["net_income"] = "123"
expect(get_answered_questions_total(subsection_pages, case_log)).to equal(1) expect(total_answered_questions(subsection, case_log)).to equal(1)
end end
end end
describe "Get total number of questions" do describe "Get total number of questions" do
it "returns the total number of questions for a subsection" do it "returns the total number of questions for a subsection" do
expect(get_total_number_of_questions(subsection_pages)).to eq(4) expect(total_number_of_questions(subsection, case_log)).to eq(4)
end end
end end
end end

Loading…
Cancel
Save