diff --git a/app/helpers/tasklist_helper.rb b/app/helpers/tasklist_helper.rb index 12843a517..87ca8cbb7 100644 --- a/app/helpers/tasklist_helper.rb +++ b/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 diff --git a/app/models/form.rb b/app/models/form.rb index 3de2655ad..fdebf1aa3 100644 --- a/app/models/form.rb +++ b/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" diff --git a/app/views/case_logs/_tasklist.html.erb b/app/views/case_logs/_tasklist.html.erb index b82a11250..cca11866d 100644 --- a/app/views/case_logs/_tasklist.html.erb +++ b/app/views/case_logs/_tasklist.html.erb @@ -10,7 +10,7 @@ <% section_value["subsections"].map do |subsection_key, subsection_value| %>
  • > <% 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) %> <%= TasklistHelper::STATUSES[subsection_status] %> diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json index 45a31ddc1..24d3e367d 100644 --- a/config/forms/2021_2022.json +++ b/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": "", diff --git a/spec/helpers/tasklist_helper_spec.rb b/spec/helpers/tasklist_helper_spec.rb index 2acc82518..1c409fe9d 100644 --- a/spec/helpers/tasklist_helper_spec.rb +++ b/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") diff --git a/spec/models/form_spec.rb b/spec/models/form_spec.rb index 98a8114f4..4833e5c1c 100644 --- a/spec/models/form_spec.rb +++ b/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