diff --git a/app/controllers/case_logs_controller.rb b/app/controllers/case_logs_controller.rb
index ca9804056..f9d760a3a 100644
--- a/app/controllers/case_logs_controller.rb
+++ b/app/controllers/case_logs_controller.rb
@@ -7,7 +7,7 @@ class CaseLogsController < ApplicationController
before_action :find_resource, except: %i[create index edit]
def index
- set_session_filters if params[:status].present?
+ set_session_filters
@pagy, @case_logs = pagy(filtered_case_logs)
@@ -122,13 +122,22 @@ private
def filtered_case_logs
user_case_logs = current_user.case_logs
- status_filter = JSON.parse(session[:case_logs_filters])["status"] if session[:case_logs_filters].present?
- return user_case_logs unless status_filter
+ if session[:case_logs_filters].present?
+ filters = JSON.parse(session[:case_logs_filters])
- user_case_logs.filter_by_status(status_filter)
+ %w[status year].each do |category|
+ if filters[category]
+ filtered_by_category = filters[category].select(&:present?).map { |filter| user_case_logs.public_send("filter_by_#{category}", filter) }.flatten
+ user_case_logs = CaseLog.where(id: filtered_by_category.map(&:id))
+ end
+ end
+ end
+ user_case_logs
end
def set_session_filters
- session[:case_logs_filters] = { status: params[:status] }.to_json
+ new_filters = session[:case_logs_filters].present? ? JSON.parse(session[:case_logs_filters]) : {}
+ %i[status year].each { |filter| new_filters[filter] = params[filter] if params[filter].present? }
+ session[:case_logs_filters] = new_filters.to_json
end
end
diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb
index aaee74fb6..ef03beb9a 100644
--- a/app/helpers/filters_helper.rb
+++ b/app/helpers/filters_helper.rb
@@ -1,9 +1,11 @@
module FiltersHelper
- def filter_selected?(filter)
+ def filter_selected?(filter, value)
return true unless session[:case_logs_filters]
selected_filters = JSON.parse(session[:case_logs_filters])
- selected_filters["status"].present? && selected_filters["status"].include?(filter.to_s)
+ return true if selected_filters[filter].blank?
+
+ selected_filters[filter].include?(value.to_s)
end
def status_filters
diff --git a/app/models/case_log.rb b/app/models/case_log.rb
index aa926d5b4..376ae410a 100644
--- a/app/models/case_log.rb
+++ b/app/models/case_log.rb
@@ -35,6 +35,7 @@ class CaseLog < ApplicationRecord
scope :for_organisation, ->(org) { where(owning_organisation: org).or(where(managing_organisation: org)) }
scope :filter_by_status, ->(status) { where status: status }
+ scope :filter_by_year, ->(year) { where(startdate: Time.zone.local(year, 4, 1)...Time.zone.local(year.to_i + 1, 4, 1)) }
AUTOGENERATED_FIELDS = %w[id status created_at updated_at discarded_at].freeze
OPTIONAL_FIELDS = %w[postcode_known la_known first_time_property_let_as_social_housing tenant_code propcode].freeze
@@ -51,6 +52,8 @@ class CaseLog < ApplicationRecord
end
def collection_start_year
+ return unless startdate
+
window_end_date = Time.zone.local(startdate.year, 4, 1)
startdate < window_end_date ? startdate.year - 1 : startdate.year
end
diff --git a/app/views/case_logs/_log_filters.erb b/app/views/case_logs/_log_filters.erb
index 4e5593a62..ed52227a4 100644
--- a/app/views/case_logs/_log_filters.erb
+++ b/app/views/case_logs/_log_filters.erb
@@ -19,7 +19,18 @@
<% statuses.map do |key, option| %>
<%= f.govuk_check_box "status", "#{key}",
label: { text: option },
- checked: filter_selected?(key),
+ checked: filter_selected?("status", key),
+ size: "s" %>
+ <% end %>
+
+ <% end %>
+ <%= f.govuk_check_boxes_fieldset :year, legend: { text: "Year", size: "s"} do %>
+
+ <% years = {"2021": "2021", "2022": "2022"} %>
+ <% years.map do |key, option| %>
+ <%= f.govuk_check_box "year", "#{key}",
+ label: { text: option },
+ checked: filter_selected?("year", key),
size: "s" %>
<% end %>
diff --git a/spec/helpers/filters_helper_spec.rb b/spec/helpers/filters_helper_spec.rb
index d79f8dfcd..4aad534cb 100644
--- a/spec/helpers/filters_helper_spec.rb
+++ b/spec/helpers/filters_helper_spec.rb
@@ -4,8 +4,8 @@ RSpec.describe FiltersHelper do
describe "#filter_selected?" do
context "when no filters are selected" do
it "returns true for all filters" do
- expect(filter_selected?("completed")).to be_truthy
- expect(filter_selected?("in_progress")).to be_truthy
+ expect(filter_selected?("status", "completed")).to be_truthy
+ expect(filter_selected?("status", "in_progress")).to be_truthy
end
end
@@ -15,11 +15,11 @@ RSpec.describe FiltersHelper do
end
it "returns false for non selected filters" do
- expect(filter_selected?("completed")).to be_falsey
+ expect(filter_selected?("status", "completed")).to be_falsey
end
it "returns true for selected filter" do
- expect(filter_selected?("in_progress")).to be_truthy
+ expect(filter_selected?("status", "in_progress")).to be_truthy
end
end
end
diff --git a/spec/requests/case_logs_controller_spec.rb b/spec/requests/case_logs_controller_spec.rb
index 88d2e7468..07385bfc7 100644
--- a/spec/requests/case_logs_controller_spec.rb
+++ b/spec/requests/case_logs_controller_spec.rb
@@ -174,37 +174,67 @@ RSpec.describe CaseLogsController, type: :request do
end
context "when filtering" do
- let!(:in_progress_case_log) do
- FactoryBot.create(:case_log, :in_progress,
- owning_organisation: organisation,
- managing_organisation: organisation)
- end
- let!(:completed_case_log) do
- FactoryBot.create(:case_log, :completed,
- owning_organisation: organisation,
- managing_organisation: organisation)
- end
+ context "with status fileter" do
+ let!(:in_progress_case_log) do
+ FactoryBot.create(:case_log, :in_progress,
+ owning_organisation: organisation,
+ managing_organisation: organisation)
+ end
+ let!(:completed_case_log) do
+ FactoryBot.create(:case_log, :completed,
+ owning_organisation: organisation,
+ managing_organisation: organisation)
+ end
- it "shows case logs for multiple selected statuses" do
- get "/logs?status[]=in_progress&status[]=completed", headers: headers, params: {}
- expect(page).to have_link(in_progress_case_log.id.to_s)
- expect(page).to have_link(completed_case_log.id.to_s)
- end
+ it "shows case logs for multiple selected statuses" do
+ get "/logs?status[]=in_progress&status[]=completed", headers: headers, params: {}
+ expect(page).to have_link(in_progress_case_log.id.to_s)
+ expect(page).to have_link(completed_case_log.id.to_s)
+ end
+
+ it "shows case logs for one selected status" do
+ get "/logs?status[]=in_progress", headers: headers, params: {}
+ expect(page).to have_link(in_progress_case_log.id.to_s)
+ expect(page).not_to have_link(completed_case_log.id.to_s)
+ end
+
+ it "does not reset the filters" do
+ get "/logs?status[]=in_progress", headers: headers, params: {}
+ expect(page).to have_link(in_progress_case_log.id.to_s)
+ expect(page).not_to have_link(completed_case_log.id.to_s)
- it "shows case logs for one selected status" do
- get "/logs?status[]=in_progress", headers: headers, params: {}
- expect(page).to have_link(in_progress_case_log.id.to_s)
- expect(page).not_to have_link(completed_case_log.id.to_s)
+ get "/logs", headers: headers, params: {}
+ expect(page).to have_link(in_progress_case_log.id.to_s)
+ expect(page).not_to have_link(completed_case_log.id.to_s)
+ end
end
- it "does not reset the filters" do
- get "/logs?status[]=in_progress", headers: headers, params: {}
- expect(page).to have_link(in_progress_case_log.id.to_s)
- expect(page).not_to have_link(completed_case_log.id.to_s)
+ context "with year fileter" do
+ let!(:case_log_2021) do
+ FactoryBot.create(:case_log, :in_progress,
+ owning_organisation: organisation,
+ startdate: Time.zone.local(2022, 3, 1),
+ managing_organisation: organisation)
+ end
+ let!(:case_log_2022) do
+ FactoryBot.create(:case_log, :completed,
+ owning_organisation: organisation,
+ mrcdate: Time.zone.local(2022, 2, 1),
+ startdate: Time.zone.local(2022, 12, 1),
+ managing_organisation: organisation)
+ end
+
+ it "shows case logs for multiple selected statuses" do
+ get "/logs?year[]=2021&year[]=2022", headers: headers, params: {}
+ expect(page).to have_link(case_log_2021.id.to_s)
+ expect(page).to have_link(case_log_2022.id.to_s)
+ end
- get "/logs", headers: headers, params: {}
- expect(page).to have_link(in_progress_case_log.id.to_s)
- expect(page).not_to have_link(completed_case_log.id.to_s)
+ it "shows case logs for one selected status" do
+ get "/logs?year[]=2021", headers: headers, params: {}
+ expect(page).to have_link(case_log_2021.id.to_s)
+ expect(page).not_to have_link(case_log_2022.id.to_s)
+ end
end
end
end