Browse Source

Add dependent sections

pull/103/head
baarkerlounger 4 years ago
parent
commit
5e40a333b4
  1. 26
      app/helpers/tasklist_helper.rb
  2. 22
      app/models/form.rb
  3. 2
      app/views/case_logs/_tasklist.html.erb
  4. 19
      config/forms/2021_2022.json
  5. 46
      spec/helpers/tasklist_helper_spec.rb
  6. 40
      spec/models/form_spec.rb

26
app/helpers/tasklist_helper.rb

@ -13,26 +13,6 @@ module TasklistHelper
in_progress: "govuk-tag--blue",
}.freeze
def get_subsection_status(subsection_name, case_log, form, questions)
if subsection_name == "declaration"
return case_log.completed? ? :not_started : :cannot_start_yet
elsif subsection_name != "about_this_log"
return :cannot_start_yet unless about_this_log_completed?(form, case_log)
end
applicable_questions = form.filter_conditional_questions(questions, case_log).keys
return :not_started if applicable_questions.all? { |question| case_log[question].blank? }
return :completed if applicable_questions.all? { |question| case_log[question].present? }
:in_progress
end
def about_this_log_completed?(form, case_log)
questions = form.questions_for_subsection("about_this_log")
applicable_questions = form.filter_conditional_questions(questions, case_log).keys
applicable_questions.all? { |question| case_log[question].present? }
end
def get_next_incomplete_section(form, case_log)
subsections = form.all_subsections.keys
subsections.find { |subsection| is_incomplete?(subsection, case_log, form, form.questions_for_subsection(subsection)) }
@ -42,7 +22,7 @@ module TasklistHelper
subsections = form.all_subsections.keys
return subsections.count if status == :all
subsections.count { |subsection| get_subsection_status(subsection, case_log, form, form.questions_for_subsection(subsection)) == status }
subsections.count { |subsection| form.subsection_status(subsection, case_log) == status }
end
def get_first_page_or_check_answers(subsection, case_log, form, questions)
@ -67,12 +47,12 @@ module TasklistHelper
private
def is_incomplete?(subsection, case_log, form, questions)
status = get_subsection_status(subsection, case_log, form, questions)
status = form.subsection_status(subsection, case_log)
%i[not_started in_progress].include?(status)
end
def is_started?(subsection, case_log, form, questions)
status = get_subsection_status(subsection, case_log, form, questions)
status = form.subsection_status(subsection, case_log)
%i[in_progress completed].include?(status)
end
end

22
app/models/form.rb

@ -119,6 +119,28 @@ class Form
all_pages[page]["depends_on"]
end
def subsection_dependencies_met?(subsection_name, case_log)
conditions = all_subsections[subsection_name]["depends_on"]
return true unless conditions
conditions.all? do |subsection, status|
subsection_status(subsection, case_log) == status
end
end
def subsection_status(subsection_name, case_log)
unless subsection_dependencies_met?(subsection_name, case_log)
return :cannot_start_yet
end
questions = questions_for_subsection(subsection_name)
applicable_questions = filter_conditional_questions(questions, case_log).keys
return :not_started if applicable_questions.all? { |question| case_log[question].blank? }
return :completed if applicable_questions.all? { |question| case_log[question].present? }
:in_progress
end
def condition_not_met(case_log, question_key, question, condition)
case question["type"]
when "numeric"

2
app/views/case_logs/_tasklist.html.erb

@ -10,7 +10,7 @@
<% section_value["subsections"].map do |subsection_key, subsection_value| %>
<li class="app-task-list__item" id=<%= subsection_key %>>
<% questions_for_subsection = @form.questions_for_subsection(subsection_key) %>
<% subsection_status = get_subsection_status(subsection_key, @case_log, @form, questions_for_subsection) %>
<% subsection_status = @form.subsection_status(subsection_key, @case_log) %>
<%= subsection_link(subsection_key, subsection_value, subsection_status) %>
<strong class="govuk-tag app-task-list__tag <%= TasklistHelper::STYLES[subsection_status] %>">
<%= TasklistHelper::STATUSES[subsection_status] %>

19
config/forms/2021_2022.json

@ -194,6 +194,7 @@
"subsections": {
"household_characteristics": {
"label": "Household characteristics",
"depends_on": {"about_this_log": "completed"},
"pages": {
"person_1_age": {
"header": "",
@ -740,6 +741,7 @@
},
"household_situation": {
"label": "Household situation",
"depends_on": {"about_this_log": "completed"},
"pages": {
"previous_housing_situation": {
"header": "",
@ -865,6 +867,7 @@
},
"household_needs": {
"label": "Household needs",
"depends_on": {"about_this_log": "completed"},
"pages": {
"armed_forces": {
"header": "Experience of the UK Armed Forces",
@ -1002,6 +1005,7 @@
"subsections": {
"tenancy_information": {
"label": "Tenancy information",
"depends_on": {"about_this_log": "completed"},
"pages": {
"starter_tenancy": {
"header": "",
@ -1101,6 +1105,7 @@
},
"property_information": {
"label": "Property information",
"depends_on": { "about_this_log": "completed" },
"pages": {
"property_location": {
"header": "",
@ -1599,6 +1604,7 @@
"subsections": {
"income_and_benefits": {
"label": "Income and benefits",
"depends_on": {"about_this_log": "completed"},
"pages": {
"net_income": {
"header": "",
@ -1692,6 +1698,7 @@
},
"rent": {
"label": "Rent",
"depends_on": {"about_this_log": "completed"},
"pages": {
"rent": {
"header": "",
@ -1817,6 +1824,7 @@
"subsections": {
"local_authority": {
"label": "Local authority",
"depends_on": {"about_this_log": "completed"},
"pages": {
"time_lived_in_la": {
"header": "",
@ -2280,6 +2288,17 @@
"subsections": {
"declaration": {
"label": "Declaration",
"depends_on": {
"about_this_log": "completed",
"household_characteristics": "completed",
"household_situation": "completed",
"household_needs": "completed",
"tenancy_information": "completed",
"property_information": "completed",
"income_and_benefits": "completed",
"rent": "completed",
"local_authority": "completed"
},
"pages": {
"declaration": {
"header": "",

46
spec/helpers/tasklist_helper_spec.rb

@ -8,52 +8,6 @@ RSpec.describe TasklistHelper do
let(:form) { form_handler.get_form("test_form") }
let(:household_characteristics_questions) { form.questions_for_subsection("household_characteristics") }
describe "get subsection status" do
let(:section) { "income_and_benefits" }
let(:income_and_benefits_questions) { form.questions_for_subsection("income_and_benefits") }
let(:declaration_questions) { form.questions_for_subsection("declaration") }
let(:local_authority_questions) { form.questions_for_subsection("local_authority") }
it "returns not started if none of the questions in the subsection are answered" do
status = get_subsection_status("income_and_benefits", case_log, form, income_and_benefits_questions)
expect(status).to eq(:not_started)
end
it "returns cannot start yet if the subsection is declaration" do
status = get_subsection_status("declaration", case_log, form, declaration_questions)
expect(status).to eq(:cannot_start_yet)
end
it "returns in progress if some of the questions have been answered" do
case_log["previous_postcode"] = "P0 5TT"
status = get_subsection_status("local_authority", case_log, form, local_authority_questions)
expect(status).to eq(:in_progress)
end
it "returns completed if all the questions in the subsection have been answered" do
case_log["earnings"] = "value"
case_log["incfreq"] = "Weekly"
case_log["benefits"] = "All"
case_log["hb"] = "Do not know"
status = get_subsection_status("income_and_benefits", case_log, form, income_and_benefits_questions)
expect(status).to eq(:completed)
end
it "returns not started if the subsection is declaration and all the questions are completed" do
status = get_subsection_status("declaration", completed_case_log, form, declaration_questions)
expect(status).to eq(:not_started)
end
let(:conditional_section_complete_case_log) { FactoryBot.build(:case_log, :conditional_section_complete) }
it "sets the correct status for sections with conditional questions" do
status = get_subsection_status(
"household_characteristics", conditional_section_complete_case_log, form, household_characteristics_questions
)
expect(status).to eq(:completed)
end
end
describe "get next incomplete section" do
it "returns the first subsection name if it is not completed" do
expect(get_next_incomplete_section(form, case_log)).to eq("household_characteristics")

40
spec/models/form_spec.rb

@ -12,6 +12,46 @@ RSpec.describe Form, type: :model do
end
end
describe "get subsection status" do
let(:section) { "income_and_benefits" }
it "returns not started if none of the questions in the subsection are answered" do
status = form.subsection_status("income_and_benefits", case_log)
expect(status).to eq(:not_started)
end
it "returns cannot start yet if the subsection is declaration" do
status = form.subsection_status("declaration", case_log)
expect(status).to eq(:cannot_start_yet)
end
it "returns in progress if some of the questions have been answered" do
case_log["previous_postcode"] = "P0 5TT"
status = form.subsection_status("local_authority", case_log)
expect(status).to eq(:in_progress)
end
it "returns completed if all the questions in the subsection have been answered" do
case_log["earnings"] = "value"
case_log["incfreq"] = "Weekly"
case_log["benefits"] = "All"
case_log["hb"] = "Do not know"
status = form.subsection_status("income_and_benefits", case_log)
expect(status).to eq(:completed)
end
it "returns not started if the subsection is declaration and all the questions are completed" do
status = form.subsection_status("declaration", completed_case_log)
expect(status).to eq(:not_started)
end
it "sets the correct status for sections with conditional questions" do
status = form.subsection_status("household_characteristics", conditional_section_complete_case_log)
expect(status).to eq(:completed)
end
end
describe ".first_page_for_subsection" do
let(:subsection) { "household_characteristics" }
it "returns the first page given a subsection" do

Loading…
Cancel
Save