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