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", in_progress: "govuk-tag--blue",
}.freeze }.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) def get_next_incomplete_section(form, case_log)
subsections = form.all_subsections.keys subsections = form.all_subsections.keys
subsections.find { |subsection| is_incomplete?(subsection, case_log, form, form.questions_for_subsection(subsection)) } 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 subsections = form.all_subsections.keys
return subsections.count if status == :all 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 end
def get_first_page_or_check_answers(subsection, case_log, form, questions) def get_first_page_or_check_answers(subsection, case_log, form, questions)
@ -67,12 +47,12 @@ module TasklistHelper
private private
def is_incomplete?(subsection, case_log, form, questions) 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) %i[not_started in_progress].include?(status)
end end
def is_started?(subsection, case_log, form, questions) 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) %i[in_progress completed].include?(status)
end end
end end

22
app/models/form.rb

@ -119,6 +119,28 @@ class Form
all_pages[page]["depends_on"] all_pages[page]["depends_on"]
end 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) def condition_not_met(case_log, question_key, question, condition)
case question["type"] case question["type"]
when "numeric" when "numeric"

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

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

19
config/forms/2021_2022.json

@ -194,6 +194,7 @@
"subsections": { "subsections": {
"household_characteristics": { "household_characteristics": {
"label": "Household characteristics", "label": "Household characteristics",
"depends_on": {"about_this_log": "completed"},
"pages": { "pages": {
"person_1_age": { "person_1_age": {
"header": "", "header": "",
@ -740,6 +741,7 @@
}, },
"household_situation": { "household_situation": {
"label": "Household situation", "label": "Household situation",
"depends_on": {"about_this_log": "completed"},
"pages": { "pages": {
"previous_housing_situation": { "previous_housing_situation": {
"header": "", "header": "",
@ -865,6 +867,7 @@
}, },
"household_needs": { "household_needs": {
"label": "Household needs", "label": "Household needs",
"depends_on": {"about_this_log": "completed"},
"pages": { "pages": {
"armed_forces": { "armed_forces": {
"header": "Experience of the UK Armed Forces", "header": "Experience of the UK Armed Forces",
@ -1002,6 +1005,7 @@
"subsections": { "subsections": {
"tenancy_information": { "tenancy_information": {
"label": "Tenancy information", "label": "Tenancy information",
"depends_on": {"about_this_log": "completed"},
"pages": { "pages": {
"starter_tenancy": { "starter_tenancy": {
"header": "", "header": "",
@ -1101,6 +1105,7 @@
}, },
"property_information": { "property_information": {
"label": "Property information", "label": "Property information",
"depends_on": { "about_this_log": "completed" },
"pages": { "pages": {
"property_location": { "property_location": {
"header": "", "header": "",
@ -1599,6 +1604,7 @@
"subsections": { "subsections": {
"income_and_benefits": { "income_and_benefits": {
"label": "Income and benefits", "label": "Income and benefits",
"depends_on": {"about_this_log": "completed"},
"pages": { "pages": {
"net_income": { "net_income": {
"header": "", "header": "",
@ -1692,6 +1698,7 @@
}, },
"rent": { "rent": {
"label": "Rent", "label": "Rent",
"depends_on": {"about_this_log": "completed"},
"pages": { "pages": {
"rent": { "rent": {
"header": "", "header": "",
@ -1817,6 +1824,7 @@
"subsections": { "subsections": {
"local_authority": { "local_authority": {
"label": "Local authority", "label": "Local authority",
"depends_on": {"about_this_log": "completed"},
"pages": { "pages": {
"time_lived_in_la": { "time_lived_in_la": {
"header": "", "header": "",
@ -2280,6 +2288,17 @@
"subsections": { "subsections": {
"declaration": { "declaration": {
"label": "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": { "pages": {
"declaration": { "declaration": {
"header": "", "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(:form) { form_handler.get_form("test_form") }
let(:household_characteristics_questions) { form.questions_for_subsection("household_characteristics") } 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 describe "get next incomplete section" do
it "returns the first subsection name if it is not completed" 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") 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
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 describe ".first_page_for_subsection" do
let(:subsection) { "household_characteristics" } let(:subsection) { "household_characteristics" }
it "returns the first page given a subsection" do it "returns the first page given a subsection" do

Loading…
Cancel
Save