Browse Source

Merge branch 'main' into CLDC-4012-allow-lower-case-letters-for-codes-in-bu

pull/3181/head
samyou-softwire 5 months ago
parent
commit
c16c0e9e6c
  1. 0
      .erb_lint.yml
  2. 5
      .rubocop.yml
  3. 2
      .ruby-version
  4. 4
      Dockerfile
  5. 11
      Gemfile
  6. 111
      Gemfile.lock
  7. 20
      app/components/create_log_actions_component.html.erb
  8. 17
      app/components/create_log_actions_component.rb
  9. 2
      app/controllers/csv_downloads_controller.rb
  10. 2
      app/controllers/lettings_logs_controller.rb
  11. 2
      app/controllers/lettings_logs_filters_controller.rb
  12. 2
      app/controllers/merge_requests_controller.rb
  13. 2
      app/controllers/sales_logs_filters_controller.rb
  14. 28
      app/controllers/test_data_controller.rb
  15. 129
      app/helpers/bulk_upload/lettings_log_to_csv.rb
  16. 2
      app/helpers/bulk_upload/sales_log_to_csv.rb
  17. 9
      app/helpers/collection_time_helper.rb
  18. 2
      app/helpers/data_sharing_agreement_helper.rb
  19. 2
      app/helpers/form_page_error_helper.rb
  20. 9
      app/helpers/form_page_helper.rb
  21. 3
      app/helpers/locations_helper.rb
  22. 4
      app/helpers/merge_requests_helper.rb
  23. 4
      app/helpers/notifications_helper.rb
  24. 3
      app/helpers/question_view_helper.rb
  25. 3
      app/helpers/schemes_helper.rb
  26. 3
      app/mailers/devise_notify_mailer.rb
  27. 72
      app/models/derived_variables/lettings_log_variables.rb
  28. 2
      app/models/derived_variables/shared_logic.rb
  29. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_age_value_check.rb
  30. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check.rb
  31. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_value_check.rb
  32. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_age_value_check.rb
  33. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_value_check.rb
  34. 2
      app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_value_check.rb
  35. 24
      app/models/form/lettings/pages/no_household_member_likely_to_be_pregnant_check.rb
  36. 2
      app/models/form/lettings/pages/referral_direct.rb
  37. 1
      app/models/form/lettings/pages/referral_general_needs.rb
  38. 1
      app/models/form/lettings/pages/referral_general_needs_prp.rb
  39. 2
      app/models/form/lettings/pages/referral_hsc.rb
  40. 2
      app/models/form/lettings/pages/referral_justice.rb
  41. 2
      app/models/form/lettings/pages/referral_la.rb
  42. 15
      app/models/form/lettings/pages/referral_noms_hr.rb
  43. 15
      app/models/form/lettings/pages/referral_noms_la_hr.rb
  44. 15
      app/models/form/lettings/pages/referral_org_directly_referred.rb
  45. 15
      app/models/form/lettings/pages/referral_org_nominated.rb
  46. 2
      app/models/form/lettings/pages/referral_prp.rb
  47. 15
      app/models/form/lettings/pages/referral_register_la.rb
  48. 15
      app/models/form/lettings/pages/referral_register_prp.rb
  49. 1
      app/models/form/lettings/pages/referral_supported_housing.rb
  50. 1
      app/models/form/lettings/pages/referral_supported_housing_prp.rb
  51. 2
      app/models/form/lettings/pages/referral_type.rb
  52. 1
      app/models/form/lettings/pages/referral_value_check.rb
  53. 24
      app/models/form/lettings/pages/tenancyother_value_check.rb
  54. 4
      app/models/form/lettings/questions/address_line1.rb
  55. 4
      app/models/form/lettings/questions/address_search.rb
  56. 10
      app/models/form/lettings/questions/age.rb
  57. 4
      app/models/form/lettings/questions/age1.rb
  58. 4
      app/models/form/lettings/questions/age1_known.rb
  59. 10
      app/models/form/lettings/questions/age_known.rb
  60. 4
      app/models/form/lettings/questions/armedforces.rb
  61. 4
      app/models/form/lettings/questions/beds.rb
  62. 4
      app/models/form/lettings/questions/benefits.rb
  63. 4
      app/models/form/lettings/questions/brent_4_weekly.rb
  64. 4
      app/models/form/lettings/questions/brent_bi_weekly.rb
  65. 4
      app/models/form/lettings/questions/brent_monthly.rb
  66. 4
      app/models/form/lettings/questions/brent_weekly.rb
  67. 4
      app/models/form/lettings/questions/builtype.rb
  68. 4
      app/models/form/lettings/questions/chcharge_4_weekly.rb
  69. 4
      app/models/form/lettings/questions/chcharge_bi_weekly.rb
  70. 4
      app/models/form/lettings/questions/chcharge_monthly.rb
  71. 4
      app/models/form/lettings/questions/chcharge_weekly.rb
  72. 4
      app/models/form/lettings/questions/condition_effects.rb
  73. 4
      app/models/form/lettings/questions/county.rb
  74. 4
      app/models/form/lettings/questions/declaration.rb
  75. 4
      app/models/form/lettings/questions/earnings.rb
  76. 4
      app/models/form/lettings/questions/ethnic_arab.rb
  77. 4
      app/models/form/lettings/questions/ethnic_asian.rb
  78. 4
      app/models/form/lettings/questions/ethnic_black.rb
  79. 4
      app/models/form/lettings/questions/ethnic_group.rb
  80. 4
      app/models/form/lettings/questions/ethnic_mixed.rb
  81. 4
      app/models/form/lettings/questions/ethnic_white.rb
  82. 4
      app/models/form/lettings/questions/first_time_property_let_as_social_housing.rb
  83. 4
      app/models/form/lettings/questions/gender_identity1.rb
  84. 1
      app/models/form/lettings/questions/gender_same_as_sex.rb
  85. 4
      app/models/form/lettings/questions/hb.rb
  86. 4
      app/models/form/lettings/questions/hbrentshortfall.rb
  87. 4
      app/models/form/lettings/questions/hhmemb.rb
  88. 4
      app/models/form/lettings/questions/homeless.rb
  89. 4
      app/models/form/lettings/questions/household_charge.rb
  90. 4
      app/models/form/lettings/questions/housingneeds.rb
  91. 4
      app/models/form/lettings/questions/housingneeds_other.rb
  92. 4
      app/models/form/lettings/questions/housingneeds_type.rb
  93. 4
      app/models/form/lettings/questions/illness.rb
  94. 4
      app/models/form/lettings/questions/incfreq.rb
  95. 4
      app/models/form/lettings/questions/irproduct_other.rb
  96. 4
      app/models/form/lettings/questions/is_carehome.rb
  97. 4
      app/models/form/lettings/questions/joint.rb
  98. 4
      app/models/form/lettings/questions/la.rb
  99. 4
      app/models/form/lettings/questions/layear.rb
  100. 8
      app/models/form/lettings/questions/lead_tenant_sex_registered_at_birth.rb
  101. Some files were not shown because too many files have changed in this diff Show More

0
.erb-lint.yml → .erb_lint.yml

5
.rubocop.yml

@ -1,5 +1,7 @@
require: require:
- rubocop-performance - rubocop-performance
plugins:
- rubocop-rails - rubocop-rails
- rubocop-rspec - rubocop-rspec
@ -28,3 +30,6 @@ Rails/UnknownEnv:
- development - development
- test - test
- review - review
RSpec/IndexedLet:
Enabled: false

2
.ruby-version

@ -1 +1 @@
3.1.6 3.4.4

4
Dockerfile

@ -1,4 +1,4 @@
FROM ruby:3.1.6-alpine3.20 as base FROM ruby:3.4.4-alpine3.20 as base
WORKDIR /app WORKDIR /app
@ -10,7 +10,7 @@ RUN apk add --update --no-cache tzdata && \
# build-base: compilation tools for bundle # build-base: compilation tools for bundle
# yarn: node package manager # yarn: node package manager
# postgresql-dev: postgres driver and libraries # postgresql-dev: postgres driver and libraries
RUN apk add --no-cache build-base=0.5-r3 busybox=1.36.1-r29 nodejs=20.15.1-r0 yarn=1.22.22-r0 bash=5.2.26-r0 libpq-dev RUN apk add --no-cache build-base=0.5-r3 busybox=1.36.1-r29 nodejs=20.15.1-r0 yarn=1.22.22-r0 bash=5.2.26-r0 libpq-dev yaml-dev linux-headers
# Bundler version should be the same version as what the Gemfile.lock was bundled with # Bundler version should be the same version as what the Gemfile.lock was bundled with
RUN gem install bundler:2.6.4 --no-document RUN gem install bundler:2.6.4 --no-document

11
Gemfile

@ -3,7 +3,7 @@
source "https://rubygems.org" source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" } git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby "3.1.6" ruby "3.4.4"
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main'
gem "rails", "~> 7.2.2" gem "rails", "~> 7.2.2"
@ -51,7 +51,7 @@ gem "paper_trail-globalid"
gem "pundit" gem "pundit"
# Request rate limiting # Request rate limiting
gem "rack", ">= 2.2.6.3" gem "rack", "~> 3.1.20"
gem "rack-attack" gem "rack-attack"
gem "redis", "~> 4.8" gem "redis", "~> 4.8"
# Receive exceptions and configure alerts # Receive exceptions and configure alerts
@ -72,9 +72,12 @@ gem "sidekiq-cron"
gem "unread" gem "unread"
# Pinning versions to address vulnerabilities # Pinning versions to address vulnerabilities
gem "nokogiri", "~> 1.18.9" gem "nokogiri", "~> 1.19.1"
gem "thor", "~> 1.4.0" gem "thor", "~> 1.4.0"
# Pinning until activesupport is updated to v8.1.2
gem "connection_pool", "~> 2.5"
group :development, :test do group :development, :test do
# Check gems for known vulnerabilities # Check gems for known vulnerabilities
gem "bundler-audit" gem "bundler-audit"
@ -95,7 +98,7 @@ group :development do
# Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md # Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md
gem "erb_lint", require: false gem "erb_lint", require: false
gem "rack-mini-profiler", "~> 3.3.0" gem "rack-mini-profiler", "~> 3.3.0"
gem "rubocop-govuk", "4.3.0", require: false gem "rubocop-govuk", "5.2.0", require: false
gem "rubocop-performance", require: false gem "rubocop-performance", require: false
gem "rubocop-rails", require: false gem "rubocop-rails", require: false
end end

111
Gemfile.lock

@ -78,7 +78,7 @@ GEM
tzinfo (~> 2.0, >= 2.0.5) tzinfo (~> 2.0, >= 2.0.5)
addressable (2.8.6) addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0) public_suffix (>= 2.0.2, < 6.0)
ast (2.4.2) ast (2.4.3)
auto_strip_attributes (2.6.0) auto_strip_attributes (2.6.0)
activerecord (>= 4.0) activerecord (>= 4.0)
aws-eventstream (1.4.0) aws-eventstream (1.4.0)
@ -113,15 +113,15 @@ GEM
thread_safe (~> 0.3, >= 0.3.1) thread_safe (~> 0.3, >= 0.3.1)
base64 (0.3.0) base64 (0.3.0)
bcrypt (3.1.20) bcrypt (3.1.20)
benchmark (0.4.1) benchmark (0.5.0)
better_html (2.0.2) better_html (2.2.0)
actionview (>= 6.0) actionview (>= 7.0)
activesupport (>= 6.0) activesupport (>= 7.0)
ast (~> 2.0) ast (~> 2.0)
erubi (~> 1.4) erubi (~> 1.4)
parser (>= 2.4) parser (>= 2.4)
smart_properties smart_properties
bigdecimal (3.2.2) bigdecimal (4.0.1)
bindex (0.8.1) bindex (0.8.1)
bootsnap (1.18.3) bootsnap (1.18.3)
msgpack (~> 1.2) msgpack (~> 1.2)
@ -151,7 +151,7 @@ GEM
coderay (1.1.3) coderay (1.1.3)
coercible (1.0.0) coercible (1.0.0)
descendants_tracker (~> 0.0.1) descendants_tracker (~> 0.0.1)
concurrent-ruby (1.3.5) concurrent-ruby (1.3.6)
connection_pool (2.5.3) connection_pool (2.5.3)
crack (1.0.0) crack (1.0.0)
bigdecimal bigdecimal
@ -184,12 +184,12 @@ GEM
drb (2.2.3) drb (2.2.3)
dumb_delegator (1.0.0) dumb_delegator (1.0.0)
encryptor (3.0.0) encryptor (3.0.0)
erb_lint (0.5.0) erb_lint (0.9.0)
activesupport activesupport
better_html (>= 2.0.1) better_html (>= 2.0.1)
parser (>= 2.7.1.4) parser (>= 2.7.1.4)
rainbow rainbow
rubocop rubocop (>= 1)
smart_properties smart_properties
erubi (1.13.1) erubi (1.13.1)
et-orbi (1.2.11) et-orbi (1.2.11)
@ -232,7 +232,7 @@ GEM
hashdiff (1.1.0) hashdiff (1.1.0)
html-attributes-utils (1.0.2) html-attributes-utils (1.0.2)
activesupport (>= 6.1.4.4) activesupport (>= 6.1.4.4)
i18n (1.14.7) i18n (1.14.8)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
ice_nine (0.11.2) ice_nine (0.11.2)
iniparse (1.5.0) iniparse (1.5.0)
@ -261,13 +261,15 @@ GEM
activerecord activerecord
kaminari-core (= 1.2.2) kaminari-core (= 1.2.2)
kaminari-core (1.2.2) kaminari-core (1.2.2)
language_server-protocol (3.17.0.5)
launchy (2.5.2) launchy (2.5.2)
addressable (~> 2.8) addressable (~> 2.8)
lint_roller (1.1.0)
listen (3.9.0) listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3) rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10) rb-inotify (~> 0.9, >= 0.9.10)
logger (1.7.0) logger (1.7.0)
loofah (2.24.0) loofah (2.25.0)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.12.0) nokogiri (>= 1.12.0)
mail (2.8.1) mail (2.8.1)
@ -279,7 +281,9 @@ GEM
matrix (0.4.2) matrix (0.4.2)
method_source (1.1.0) method_source (1.1.0)
mini_mime (1.1.5) mini_mime (1.1.5)
minitest (5.25.5) minitest (6.0.2)
drb (~> 2.0)
prism (~> 1.5)
msgpack (1.7.2) msgpack (1.7.2)
multipart-post (2.4.1) multipart-post (2.4.1)
nested_form (0.3.2) nested_form (0.3.2)
@ -295,13 +299,13 @@ GEM
net-smtp (0.5.1) net-smtp (0.5.1)
net-protocol net-protocol
nio4r (2.7.4) nio4r (2.7.4)
nokogiri (1.18.9-arm64-darwin) nokogiri (1.19.1-arm64-darwin)
racc (~> 1.4) racc (~> 1.4)
nokogiri (1.18.9-x86_64-darwin) nokogiri (1.19.1-x86_64-darwin)
racc (~> 1.4) racc (~> 1.4)
nokogiri (1.18.9-x86_64-linux-gnu) nokogiri (1.19.1-x86_64-linux-gnu)
racc (~> 1.4) racc (~> 1.4)
nokogiri (1.18.9-x86_64-linux-musl) nokogiri (1.19.1-x86_64-linux-musl)
racc (~> 1.4) racc (~> 1.4)
notifications-ruby-client (6.0.0) notifications-ruby-client (6.0.0)
jwt (>= 1.5, < 3) jwt (>= 1.5, < 3)
@ -317,10 +321,10 @@ GEM
paper_trail-globalid (0.2.0) paper_trail-globalid (0.2.0)
globalid globalid
paper_trail (>= 3.0.0) paper_trail (>= 3.0.0)
parallel (1.24.0) parallel (1.27.0)
parallel_tests (4.5.1) parallel_tests (4.5.1)
parallel parallel
parser (3.3.0.5) parser (3.3.10.2)
ast (~> 2.4.1) ast (~> 2.4.1)
racc racc
pg (1.5.5) pg (1.5.5)
@ -328,6 +332,7 @@ GEM
pp (0.6.2) pp (0.6.2)
prettyprint prettyprint
prettyprint (0.2.0) prettyprint (0.2.0)
prism (1.9.0)
propshaft (0.8.0) propshaft (0.8.0)
actionpack (>= 7.0.0) actionpack (>= 7.0.0)
activesupport (>= 7.0.0) activesupport (>= 7.0.0)
@ -349,7 +354,7 @@ GEM
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
raabro (1.4.0) raabro (1.4.0)
racc (1.8.1) racc (1.8.1)
rack (3.1.18) rack (3.1.20)
rack-attack (6.7.0) rack-attack (6.7.0)
rack (>= 1.0, < 4) rack (>= 1.0, < 4)
rack-mini-profiler (3.3.1) rack-mini-profiler (3.3.1)
@ -375,7 +380,7 @@ GEM
activesupport (= 7.2.2.2) activesupport (= 7.2.2.2)
bundler (>= 1.15.0) bundler (>= 1.15.0)
railties (= 7.2.2.2) railties (= 7.2.2.2)
rails-dom-testing (2.2.0) rails-dom-testing (2.3.0)
activesupport (>= 5.0.0) activesupport (>= 5.0.0)
minitest minitest
nokogiri (>= 1.6) nokogiri (>= 1.6)
@ -409,7 +414,7 @@ GEM
redis (4.8.1) redis (4.8.1)
redis-client (0.22.1) redis-client (0.22.1)
connection_pool connection_pool
regexp_parser (2.9.0) regexp_parser (2.11.3)
reline (0.6.0) reline (0.6.0)
io-console (~> 0.5) io-console (~> 0.5)
request_store (1.7.0) request_store (1.7.0)
@ -439,34 +444,45 @@ GEM
rspec-mocks (~> 3.12) rspec-mocks (~> 3.12)
rspec-support (~> 3.12) rspec-support (~> 3.12)
rspec-support (3.13.1) rspec-support (3.13.1)
rubocop (1.25.0) rubocop (1.82.1)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 3.1.0.0) parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0) regexp_parser (>= 2.9.3, < 3.0)
rexml rubocop-ast (>= 1.48.0, < 2.0)
rubocop-ast (>= 1.15.1, < 2.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0) unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.15.1) rubocop-ast (1.49.0)
parser (>= 3.0.1.1) parser (>= 3.3.7.2)
rubocop-govuk (4.3.0) prism (~> 1.7)
rubocop (= 1.25.0) rubocop-capybara (2.22.1)
rubocop-ast (= 1.15.1) lint_roller (~> 1.1)
rubocop-rails (= 2.13.2) rubocop (~> 1.72, >= 1.72.1)
rubocop-rake (= 0.6.0) rubocop-govuk (5.2.0)
rubocop-rspec (= 2.7.0) rubocop (= 1.82.1)
rubocop-ast (= 1.49.0)
rubocop-capybara (= 2.22.1)
rubocop-rails (= 2.34.3)
rubocop-rake (= 0.7.1)
rubocop-rspec (= 3.9.0)
rubocop-performance (1.19.1) rubocop-performance (1.19.1)
rubocop (>= 1.7.0, < 2.0) rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0) rubocop-ast (>= 0.4.0)
rubocop-rails (2.13.2) rubocop-rails (2.34.3)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
lint_roller (~> 1.1)
rack (>= 1.1) rack (>= 1.1)
rubocop (>= 1.7.0, < 2.0) rubocop (>= 1.75.0, < 2.0)
rubocop-rake (0.6.0) rubocop-ast (>= 1.44.0, < 2.0)
rubocop (~> 1.0) rubocop-rake (0.7.1)
rubocop-rspec (2.7.0) lint_roller (~> 1.1)
rubocop (~> 1.19) rubocop (>= 1.72.1)
rubocop-rspec (3.9.0)
lint_roller (~> 1.1)
rubocop (~> 1.81)
ruby-openai (7.0.1) ruby-openai (7.0.1)
event_stream_parser (>= 0.3.0, < 2.0.0) event_stream_parser (>= 0.3.0, < 2.0.0)
faraday (>= 1) faraday (>= 1)
@ -514,7 +530,9 @@ GEM
tzinfo (2.0.6) tzinfo (2.0.6)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
uk_postcode (2.1.8) uk_postcode (2.1.8)
unicode-display_width (2.5.0) unicode-display_width (3.2.0)
unicode-emoji (~> 4.1)
unicode-emoji (4.2.0)
unread (0.14.0) unread (0.14.0)
activerecord (>= 6.1) activerecord (>= 6.1)
uri (1.0.4) uri (1.0.4)
@ -563,6 +581,7 @@ DEPENDENCIES
capybara capybara
capybara-lockstep capybara-lockstep
capybara-screenshot capybara-screenshot
connection_pool (~> 2.5)
cssbundling-rails cssbundling-rails
devise devise
devise_two_factor_authentication devise_two_factor_authentication
@ -579,7 +598,7 @@ DEPENDENCIES
json-schema json-schema
listen (~> 3.3) listen (~> 3.3)
method_source (~> 1.1) method_source (~> 1.1)
nokogiri (~> 1.18.9) nokogiri (~> 1.19.1)
notifications-ruby-client notifications-ruby-client
overcommit (>= 0.37.0) overcommit (>= 0.37.0)
paper_trail (~> 15.2) paper_trail (~> 15.2)
@ -591,7 +610,7 @@ DEPENDENCIES
pry-byebug pry-byebug
puma (~> 6.4) puma (~> 6.4)
pundit pundit
rack (>= 2.2.6.3) rack (~> 3.1.20)
rack-attack rack-attack
rack-mini-profiler (~> 3.3.0) rack-mini-profiler (~> 3.3.0)
rails (~> 7.2.2) rails (~> 7.2.2)
@ -600,7 +619,7 @@ DEPENDENCIES
redis (~> 4.8) redis (~> 4.8)
roo roo
rspec-rails rspec-rails
rubocop-govuk (= 4.3.0) rubocop-govuk (= 5.2.0)
rubocop-performance rubocop-performance
rubocop-rails rubocop-rails
ruby-openai ruby-openai
@ -621,7 +640,7 @@ DEPENDENCIES
webmock webmock
RUBY VERSION RUBY VERSION
ruby 3.1.6p260 ruby 3.4.4p0
BUNDLED WITH BUNDLED WITH
2.6.4 2.6.4

20
app/components/create_log_actions_component.html.erb

@ -14,17 +14,33 @@
<span class="govuk-body govuk-body-s">These tools can only be seen and used in testing environments.</span> <span class="govuk-body govuk-body-s">These tools can only be seen and used in testing environments.</span>
<div> <div>
<%= govuk_button_link_to create_test_log_href, class: "govuk-button" do %> <%= govuk_button_link_to create_test_log_href, class: "govuk-button" do %>
New test log New <%= current_collection_year_label %> test log
<svg class="govuk-button__start-icon" xmlns="http://www.w3.org/2000/svg" width="17.5" height="19" viewBox="0 0 33 40" aria-hidden="true" focusable="false"> <svg class="govuk-button__start-icon" xmlns="http://www.w3.org/2000/svg" width="17.5" height="19" viewBox="0 0 33 40" aria-hidden="true" focusable="false">
<path fill="currentColor" d="M0 0h13l20 20-20 20H0l20-20z"></path> <path fill="currentColor" d="M0 0h13l20 20-20 20H0l20-20z"></path>
</svg> </svg>
<% end %> <% end %>
<% if FeatureToggle.allow_future_form_use? %>
<%= govuk_button_link_to create_next_year_test_log_href, class: "govuk-button" do %>
New <%= next_collection_year_label %> test log
<svg class="govuk-button__start-icon" xmlns="http://www.w3.org/2000/svg" width="17.5" height="19" viewBox="0 0 33 40" aria-hidden="true" focusable="false">
<path fill="currentColor" d="M0 0h13l20 20-20 20H0l20-20z"></path>
</svg>
<% end %>
<% end %>
<%= govuk_button_link_to create_setup_test_log_href, class: "govuk-button" do %> <%= govuk_button_link_to create_setup_test_log_href, class: "govuk-button" do %>
New test log (setup only) New <%= current_collection_year_label %> test log (setup only)
<svg class="govuk-button__start-icon" xmlns="http://www.w3.org/2000/svg" width="17.5" height="19" viewBox="0 0 33 40" aria-hidden="true" focusable="false"> <svg class="govuk-button__start-icon" xmlns="http://www.w3.org/2000/svg" width="17.5" height="19" viewBox="0 0 33 40" aria-hidden="true" focusable="false">
<path fill="currentColor" d="M0 0h13l20 20-20 20H0l20-20z"></path> <path fill="currentColor" d="M0 0h13l20 20-20 20H0l20-20z"></path>
</svg> </svg>
<% end %> <% end %>
<% if FeatureToggle.allow_future_form_use? %>
<%= govuk_button_link_to create_next_year_setup_test_log_href, class: "govuk-button" do %>
New <%= next_collection_year_label %> test log (setup only)
<svg class="govuk-button__start-icon" xmlns="http://www.w3.org/2000/svg" width="17.5" height="19" viewBox="0 0 33 40" aria-hidden="true" focusable="false">
<path fill="currentColor" d="M0 0h13l20 20-20 20H0l20-20z"></path>
</svg>
<% end %>
<% end %>
<%= govuk_button_link_to create_test_bulk_upload_href(2025), class: "govuk-button govuk-button--secondary" do %> <%= govuk_button_link_to create_test_bulk_upload_href(2025), class: "govuk-button govuk-button--secondary" do %>
25/26 BU test file 25/26 BU test file
<svg class="govuk-button__start-icon bi bi-download" xmlns="http://www.w3.org/2000/svg" width="18" height="19" fill="currentColor" viewBox="0 0 16 16" stroke="currentColor" stroke-width="1.4"> <svg class="govuk-button__start-icon bi bi-download" xmlns="http://www.w3.org/2000/svg" width="18" height="19" fill="currentColor" viewBox="0 0 16 16" stroke="currentColor" stroke-width="1.4">

17
app/components/create_log_actions_component.rb

@ -1,5 +1,6 @@
class CreateLogActionsComponent < ViewComponent::Base class CreateLogActionsComponent < ViewComponent::Base
include Rails.application.routes.url_helpers include Rails.application.routes.url_helpers
include CollectionTimeHelper
attr_reader :bulk_upload, :user, :log_type attr_reader :bulk_upload, :user, :log_type
@ -38,10 +39,26 @@ class CreateLogActionsComponent < ViewComponent::Base
send("create_test_#{log_type}_log_path") send("create_test_#{log_type}_log_path")
end end
def create_next_year_test_log_href
send("create_next_year_test_#{log_type}_log_path")
end
def create_setup_test_log_href def create_setup_test_log_href
send("create_setup_test_#{log_type}_log_path") send("create_setup_test_#{log_type}_log_path")
end end
def create_next_year_setup_test_log_href
send("create_next_year_setup_test_#{log_type}_log_path")
end
def current_collection_year_label
"#{current_collection_start_year - 2000}/#{current_collection_end_year - 2000}"
end
def next_collection_year_label
"#{next_collection_start_year - 2000}/#{next_collection_end_year - 2000}"
end
def create_test_bulk_upload_href(year) def create_test_bulk_upload_href(year)
send("create_#{year}_test_#{log_type}_bulk_upload_path") send("create_#{year}_test_#{log_type}_bulk_upload_path")
end end

2
app/controllers/csv_downloads_controller.rb

@ -5,7 +5,7 @@ class CsvDownloadsController < ApplicationController
@csv_download = CsvDownload.find(params[:id]) @csv_download = CsvDownload.find(params[:id])
authorize @csv_download authorize @csv_download
return render "errors/download_link_expired" if @csv_download.expired? render "errors/download_link_expired" if @csv_download.expired?
end end
def download def download

2
app/controllers/lettings_logs_controller.rb

@ -190,7 +190,7 @@ private
end end
def resolve_logs! def resolve_logs!
if @log&.unresolved && @log.location.present? && @log.scheme.present? && @log&.resolve! if @log&.unresolved && @log.location.present? && @log.scheme.present? && @log.resolve!
unresolved_logs_count_for_user = current_user.lettings_logs.unresolved.assigned_to(current_user).count unresolved_logs_count_for_user = current_user.lettings_logs.unresolved.assigned_to(current_user).count
flash.now[:notice] = helpers.flash_notice_for_resolved_logs(unresolved_logs_count_for_user) flash.now[:notice] = helpers.flash_notice_for_resolved_logs(unresolved_logs_count_for_user)
end end

2
app/controllers/lettings_logs_filters_controller.rb

@ -52,8 +52,6 @@ class LettingsLogsFiltersController < ApplicationController
end end
end end
private
def lettings_session_filters def lettings_session_filters
params["years"] = [params["years"]] if params["years"].present? params["years"] = [params["years"]] if params["years"].present?
lettings_filter_manager.session_filters lettings_filter_manager.session_filters

2
app/controllers/merge_requests_controller.rb

@ -105,7 +105,7 @@ private
answer_options = { "" => "Select an option" } answer_options = { "" => "Select an option" }
if current_user.support? if current_user.support?
Organisation.all.each do |organisation| Organisation.all.find_each do |organisation|
date = @merge_request.merge_date || Time.zone.today date = @merge_request.merge_date || Time.zone.today
answer_options[organisation.id] = organisation.name(date:) answer_options[organisation.id] = organisation.name(date:)
end end

2
app/controllers/sales_logs_filters_controller.rb

@ -53,8 +53,6 @@ class SalesLogsFiltersController < ApplicationController
end end
end end
private
def sales_session_filters def sales_session_filters
params["years"] = [params["years"]] if params["years"].present? params["years"] = [params["years"]] if params["years"].present?
sales_filter_manager.session_filters sales_filter_manager.session_filters

28
app/controllers/test_data_controller.rb

@ -10,6 +10,13 @@ class TestDataController < ApplicationController
redirect_to lettings_log_path(log) redirect_to lettings_log_path(log)
end end
def create_next_year_test_lettings_log
return render_not_found unless FeatureToggle.create_test_logs_enabled?
log = FactoryBot.create(:lettings_log, :completed, assigned_to: current_user, ppostcode_full: "SW1A 1AA", manual_address_entry_selected: false, startdate: generate_different_date_within_collection_year(Time.zone.local(next_collection_start_year, 4, 1)))
redirect_to lettings_log_path(log)
end
def create_setup_test_lettings_log def create_setup_test_lettings_log
return render_not_found unless FeatureToggle.create_test_logs_enabled? return render_not_found unless FeatureToggle.create_test_logs_enabled?
@ -17,6 +24,13 @@ class TestDataController < ApplicationController
redirect_to lettings_log_path(log) redirect_to lettings_log_path(log)
end end
def create_next_year_setup_test_lettings_log
return render_not_found unless FeatureToggle.create_test_logs_enabled?
log = FactoryBot.create(:lettings_log, :setup_completed, assigned_to: current_user, manual_address_entry_selected: false, startdate: generate_different_date_within_collection_year(Time.zone.local(next_collection_start_year, 4, 1)))
redirect_to lettings_log_path(log)
end
%w[2025 2026].each do |year| %w[2025 2026].each do |year|
define_method("create_#{year}_test_lettings_bulk_upload") do define_method("create_#{year}_test_lettings_bulk_upload") do
return render_not_found unless FeatureToggle.create_test_logs_enabled? return render_not_found unless FeatureToggle.create_test_logs_enabled?
@ -47,6 +61,13 @@ class TestDataController < ApplicationController
redirect_to sales_log_path(log) redirect_to sales_log_path(log)
end end
def create_next_year_test_sales_log
return render_not_found unless FeatureToggle.create_test_logs_enabled?
log = FactoryBot.create(:sales_log, :completed, assigned_to: current_user, manual_address_entry_selected: false, saledate: generate_different_date_within_collection_year(Time.zone.local(next_collection_start_year, 4, 1)))
redirect_to sales_log_path(log)
end
def create_setup_test_sales_log def create_setup_test_sales_log
return render_not_found unless FeatureToggle.create_test_logs_enabled? return render_not_found unless FeatureToggle.create_test_logs_enabled?
@ -54,6 +75,13 @@ class TestDataController < ApplicationController
redirect_to sales_log_path(log) redirect_to sales_log_path(log)
end end
def create_next_year_setup_test_sales_log
return render_not_found unless FeatureToggle.create_test_logs_enabled?
log = FactoryBot.create(:sales_log, :shared_ownership_setup_complete, assigned_to: current_user, manual_address_entry_selected: false, saledate: generate_different_date_within_collection_year(Time.zone.local(next_collection_start_year, 4, 1)))
redirect_to sales_log_path(log)
end
%w[2025 2026].each do |year| %w[2025 2026].each do |year|
define_method("create_#{year}_test_sales_bulk_upload") do define_method("create_#{year}_test_sales_bulk_upload") do
return render_not_found unless FeatureToggle.create_test_logs_enabled? return render_not_found unless FeatureToggle.create_test_logs_enabled?

129
app/helpers/bulk_upload/lettings_log_to_csv.rb

@ -2,12 +2,10 @@ class BulkUpload::LettingsLogToCsv
attr_reader :log, :line_ending, :col_offset, :overrides attr_reader :log, :line_ending, :col_offset, :overrides
def initialize(log:, line_ending: "\n", col_offset: 1, overrides: {}) def initialize(log:, line_ending: "\n", col_offset: 1, overrides: {})
# rubocop:disable Rails/HelperInstanceVariable
@log = log @log = log
@line_ending = line_ending @line_ending = line_ending
@col_offset = col_offset @col_offset = col_offset
@overrides = overrides @overrides = overrides
# rubocop:enable Rails/HelperInstanceVariable
end end
def row_prefix def row_prefix
@ -107,8 +105,8 @@ class BulkUpload::LettingsLogToCsv
renewal, renewal,
log.startdate&.day, log.startdate&.day,
log.startdate&.month, log.startdate&.month,
log.startdate&.strftime("%y"), # 10
log.startdate&.strftime("%y"), # 10
rent_type, rent_type,
log.irproduct_other, log.irproduct_other,
log.tenancycode, log.tenancycode,
@ -118,20 +116,19 @@ class BulkUpload::LettingsLogToCsv
log.unitletas, log.unitletas,
log.uprn, log.uprn,
log.address_line1&.tr(",", " "), log.address_line1&.tr(",", " "),
log.address_line2&.tr(",", " "), # 20
log.address_line2&.tr(",", " "), # 20
log.town_or_city&.tr(",", " "), log.town_or_city&.tr(",", " "),
log.county&.tr(",", " "), log.county&.tr(",", " "),
((log.postcode_full || "").split(" ") || [""]).first, ((log.postcode_full || "").split(" ") || [""]).first,
((log.postcode_full || "").split(" ") || [""]).last, ((log.postcode_full || "").split(" ") || [""]).last,
log.la, log.la,
log.unittype_gn, log.unittype_gn,
log.builtype,
log.wchair, log.wchair,
log.beds, log.beds,
log.voiddate&.day, # 30 log.voiddate&.day,
log.voiddate&.month, log.voiddate&.month, # 30
log.voiddate&.strftime("%y"), log.voiddate&.strftime("%y"),
log.mrcdate&.day, log.mrcdate&.day,
log.mrcdate&.month, log.mrcdate&.month,
@ -140,98 +137,119 @@ class BulkUpload::LettingsLogToCsv
log.joint, log.joint,
log.startertenancy, log.startertenancy,
log.tenancy, log.tenancy,
log.tenancyother, # 40 log.tenancyother,
log.tenancylength, log.tenancylength, # 40
log.age1 || overrides[:age1], log.age1 || overrides[:age1],
log.sex1, log.sexrab1,
log.gender_same_as_sex1,
log.gender_description1,
log.ethnic, log.ethnic,
log.nationality_all_group, log.nationality_all_group,
log.ecstat1, log.ecstat1,
relat_number(log.relat2),
log.age2 || overrides[:age2], log.age2 || overrides[:age2],
log.sex2, relat_number(log.relat2),
log.ecstat2, # 50
relat_number(log.relat3), log.sexrab2, # 50
log.gender_same_as_sex2,
log.gender_description2,
log.ecstat2,
log.age3 || overrides[:age3], log.age3 || overrides[:age3],
log.sex3, relat_number(log.relat3),
log.sexrab3,
log.gender_same_as_sex3,
log.gender_description3,
log.ecstat3, log.ecstat3,
log.age4 || overrides[:age4], # 60
relat_number(log.relat4), relat_number(log.relat4),
log.age4 || overrides[:age4], log.sexrab4,
log.sex4, log.gender_same_as_sex4,
log.gender_description4,
log.ecstat4, log.ecstat4,
log.age5 || overrides[:age5],
relat_number(log.relat5), relat_number(log.relat5),
log.age5 || overrides[:age5], # 60 log.sexrab5,
log.gender_same_as_sex5,
log.sex5, log.gender_description5, # 70
log.ecstat5, log.ecstat5,
relat_number(log.relat6),
log.age6 || overrides[:age6], log.age6 || overrides[:age6],
log.sex6, relat_number(log.relat6),
log.sexrab6,
log.gender_same_as_sex6,
log.gender_description6,
log.ecstat6, log.ecstat6,
relat_number(log.relat7),
log.age7 || overrides[:age7], log.age7 || overrides[:age7],
log.sex7, relat_number(log.relat7),
log.ecstat7, # 70
relat_number(log.relat8), log.sexrab7, # 80
log.gender_same_as_sex7,
log.gender_description7,
log.ecstat7,
log.age8 || overrides[:age8], log.age8 || overrides[:age8],
log.sex8, relat_number(log.relat8),
log.sexrab8,
log.gender_same_as_sex8,
log.gender_description8,
log.ecstat8, log.ecstat8,
log.armedforces,
log.armedforces, # 90
log.leftreg, log.leftreg,
log.reservist, log.reservist,
log.preg_occ, log.preg_occ,
log.housingneeds_a, log.housingneeds_a,
log.housingneeds_b, # 80 log.housingneeds_b,
log.housingneeds_c, log.housingneeds_c,
log.housingneeds_f, log.housingneeds_f,
log.housingneeds_g, log.housingneeds_g,
log.housingneeds_h, log.housingneeds_h,
overrides[:illness] || log.illness,
overrides[:illness] || log.illness, # 100
log.illness_type_1, log.illness_type_1,
log.illness_type_2, log.illness_type_2,
log.illness_type_3, log.illness_type_3,
log.illness_type_4, log.illness_type_4,
log.illness_type_5, # 90 log.illness_type_5,
log.illness_type_6, log.illness_type_6,
log.illness_type_7, log.illness_type_7,
log.illness_type_8, log.illness_type_8,
log.illness_type_9, log.illness_type_9,
log.illness_type_10,
log.illness_type_10, # 110
log.layear, log.layear,
log.waityear, log.waityear,
log.reason, log.reason,
log.reasonother, log.reasonother,
log.prevten, # 100 log.prevten,
homeless, homeless,
previous_postcode_known, previous_postcode_known,
((log.ppostcode_full || "").split(" ") || [""]).first, ((log.ppostcode_full || "").split(" ") || [""]).first,
((log.ppostcode_full || "").split(" ") || [""]).last, ((log.ppostcode_full || "").split(" ") || [""]).last,
log.prevloc,
log.prevloc, # 120
log.reasonpref, log.reasonpref,
log.rp_homeless, log.rp_homeless,
log.rp_insan_unsat, log.rp_insan_unsat,
log.rp_medwel, log.rp_medwel,
log.rp_hardship, # 110 log.rp_hardship,
log.rp_dontknow, log.rp_dontknow,
cbl, cbl,
chr, chr,
cap, cap,
accessible_register,
log.referral, accessible_register, # 130
log.owning_organisation.la? ? log.referral_register : nil,
log.owning_organisation.prp? ? log.referral_register : nil,
log.referral_noms,
log.referral_org,
net_income_known, net_income_known,
log.incfreq, log.incfreq,
log.earnings, log.earnings,
log.hb, # 120 log.hb,
log.benefits, log.benefits,
log.household_charge,
log.household_charge, # 140
log.period, log.period,
log.brent, log.brent,
log.scharge, log.scharge,
@ -239,31 +257,6 @@ class BulkUpload::LettingsLogToCsv
log.supcharg, log.supcharg,
log.hbrentshortfall, log.hbrentshortfall,
log.tshortfall, log.tshortfall,
log.sexrab1, # 130
log.sexrab2,
log.sexrab3,
log.sexrab4,
log.sexrab5,
log.sexrab6,
log.sexrab7,
log.sexrab8,
log.gender_same_as_sex1,
log.gender_description1,
log.gender_same_as_sex2, # 140
log.gender_description2,
log.gender_same_as_sex3,
log.gender_description3,
log.gender_same_as_sex4,
log.gender_description4,
log.gender_same_as_sex5,
log.gender_description5,
log.gender_same_as_sex6,
log.gender_description6,
log.gender_same_as_sex7, # 150
log.gender_description7,
log.gender_same_as_sex8,
log.gender_description8, # 153
] ]
end end

2
app/helpers/bulk_upload/sales_log_to_csv.rb

@ -2,12 +2,10 @@ class BulkUpload::SalesLogToCsv
attr_reader :log, :line_ending, :col_offset, :overrides attr_reader :log, :line_ending, :col_offset, :overrides
def initialize(log:, line_ending: "\n", col_offset: 1, overrides: {}) def initialize(log:, line_ending: "\n", col_offset: 1, overrides: {})
# rubocop:disable Rails/HelperInstanceVariable
@log = log @log = log
@line_ending = line_ending @line_ending = line_ending
@col_offset = col_offset @col_offset = col_offset
@overrides = overrides @overrides = overrides
# rubocop:enable Rails/HelperInstanceVariable
end end
def row_prefix def row_prefix

9
app/helpers/collection_time_helper.rb

@ -16,10 +16,13 @@ module CollectionTimeHelper
Time.zone.local(collection_start_year_for_date(date), 4, 1) Time.zone.local(collection_start_year_for_date(date), 4, 1)
end end
def date_mid_collection_year_formatted(date) def date_mid_collection_year(date)
relevant_year = date.nil? ? current_collection_start_year : collection_start_year_for_date(date) relevant_year = date.nil? ? current_collection_start_year : collection_start_year_for_date(date)
example_date = Date.new(relevant_year, 9, 13) Date.new(relevant_year, 9, 13)
example_date.to_formatted_s(:govuk_date_number_month) end
def date_mid_collection_year_formatted(date)
date_mid_collection_year(date).to_formatted_s(:govuk_date_number_month)
end end
def current_collection_start_date def current_collection_start_date

2
app/helpers/data_sharing_agreement_helper.rb

@ -67,7 +67,7 @@ module DataSharingAgreementHelper
"12.2. For #{@org_name}: Name: #{@dpo_name}, Postal Address: #{@org_address}, E-mail address: #{@dpo_email}, Telephone number: #{@org_phone}" "12.2. For #{@org_name}: Name: #{@dpo_name}, Postal Address: #{@org_address}, E-mail address: #{@dpo_email}, Telephone number: #{@org_phone}"
end end
end end
# rubocop:enable Rails/HelperInstanceVariable # rubocop:enable Rails/HelperInstanceVariable
private private

2
app/helpers/form_page_error_helper.rb

@ -5,7 +5,7 @@ module FormPageErrorHelper
end end
def remove_duplicate_page_errors(lettings_log) def remove_duplicate_page_errors(lettings_log)
lettings_log.errors.group_by(&:message).each do |_, errors| lettings_log.errors.group_by(&:message).each_value do |errors|
next if errors.size == 1 next if errors.size == 1
errors.shift errors.shift

9
app/helpers/form_page_helper.rb

@ -1,4 +1,6 @@
module FormPageHelper module FormPageHelper
include CollectionTimeHelper
def action_href(log, page_id, referrer = "check_answers") def action_href(log, page_id, referrer = "check_answers")
send("#{log.log_type}_#{page_id}_path", log, referrer:) send("#{log.log_type}_#{page_id}_path", log, referrer:)
end end
@ -46,4 +48,11 @@ module FormPageHelper
page.skip_href(log) || send(log.form.next_page_redirect_path(page, log, current_user, ignore_answered: true), log) page.skip_href(log) || send(log.form.next_page_redirect_path(page, log, current_user, ignore_answered: true), log)
end end
end end
def date_hint(question, log)
[
question.hint_text.presence,
question.date_example_override(log) || "For example, #{date_mid_collection_year_formatted(log.startdate).tr(' ', '/')}",
].compact.join("<br><br>").html_safe
end
end end

3
app/helpers/locations_helper.rb

@ -91,7 +91,8 @@ module LocationsHelper
def toggle_location_link(location) def toggle_location_link(location)
return govuk_button_link_to "Deactivate this location", scheme_location_new_deactivation_path(location.scheme, location), warning: true if location.active? || location.deactivates_in_a_long_time? return govuk_button_link_to "Deactivate this location", scheme_location_new_deactivation_path(location.scheme, location), warning: true if location.active? || location.deactivates_in_a_long_time?
return govuk_button_link_to "Reactivate this location", scheme_location_new_reactivation_path(location.scheme, location) if location.deactivated? && !location.deactivated_by_scheme?
govuk_button_link_to "Reactivate this location", scheme_location_new_reactivation_path(location.scheme, location) if location.deactivated? && !location.deactivated_by_scheme?
end end
def delete_location_link(location) def delete_location_link(location)

4
app/helpers/merge_requests_helper.rb

@ -101,13 +101,13 @@ module MergeRequestsHelper
attribute = page if attribute.nil? attribute = page if attribute.nil?
return nil unless value_exists?(merge_request, attribute) return nil unless value_exists?(merge_request, attribute)
unless merge_request.status == "request_merged" || merge_request.status == "processing" unless %w[request_merged processing].include?(merge_request.status)
{ text: merge_request_action_text(merge_request, attribute), href: send("#{page}_merge_request_path", merge_request, referrer: "check_answers"), visually_hidden_text: page.humanize } { text: merge_request_action_text(merge_request, attribute), href: send("#{page}_merge_request_path", merge_request, referrer: "check_answers"), visually_hidden_text: page.humanize }
end end
end end
def merge_outcome_action(merge_request, page) def merge_outcome_action(merge_request, page)
unless merge_request.status == "request_merged" || merge_request.status == "processing" unless %w[request_merged processing].include?(merge_request.status)
{ text: "View", href: send("#{page}_merge_request_path", merge_request), visually_hidden_text: page.humanize } { text: "View", href: send("#{page}_merge_request_path", merge_request), visually_hidden_text: page.humanize }
end end
end end

4
app/helpers/notifications_helper.rb

@ -57,7 +57,7 @@ class NotificationRenderer < Redcarpet::Render::HTML
def initialize(options = {}) def initialize(options = {})
link_class = "govuk-link" link_class = "govuk-link"
link_class += " govuk-link--inverse" if options[:invert_link_colour] link_class += " govuk-link--inverse" if options[:invert_link_colour]
@bold = options[:bold_all_text] # rubocop:disable Rails/HelperInstanceVariable @bold = options[:bold_all_text]
base_options = { escape_html: true, safe_links_only: true, link_attributes: { class: link_class } } base_options = { escape_html: true, safe_links_only: true, link_attributes: { class: link_class } }
super base_options super base_options
end end
@ -78,7 +78,7 @@ class NotificationRenderer < Redcarpet::Render::HTML
end end
def paragraph(text) def paragraph(text)
return %(<p class="govuk-!-font-weight-bold">#{text}</p>) if @bold # rubocop:disable Rails/HelperInstanceVariable return %(<p class="govuk-!-font-weight-bold">#{text}</p>) if @bold
%(<p class="govuk-body-m">#{text}</p>) %(<p class="govuk-body-m">#{text}</p>)
end end

3
app/helpers/question_view_helper.rb

@ -44,7 +44,8 @@ module QuestionViewHelper
def select_option_name(value) def select_option_name(value)
return value.service_name if value.respond_to?(:service_name) return value.service_name if value.respond_to?(:service_name)
return value["name"] if value.is_a?(Hash) && value["name"].present? return value["name"] if value.is_a?(Hash) && value["name"].present?
return value["postcode"] if value.is_a?(Location)
value["postcode"] if value.is_a?(Location)
end end
private private

3
app/helpers/schemes_helper.rb

@ -12,7 +12,8 @@ module SchemesHelper
def toggle_scheme_link(scheme) def toggle_scheme_link(scheme)
return govuk_button_link_to "Deactivate this scheme", scheme_new_deactivation_path(scheme), warning: true if scheme.active? || scheme.deactivates_in_a_long_time? return govuk_button_link_to "Deactivate this scheme", scheme_new_deactivation_path(scheme), warning: true if scheme.active? || scheme.deactivates_in_a_long_time?
return govuk_button_link_to "Reactivate this scheme", scheme_new_reactivation_path(scheme) if scheme.deactivated? || scheme.deactivating_soon?
govuk_button_link_to "Reactivate this scheme", scheme_new_reactivation_path(scheme) if scheme.deactivated? || scheme.deactivating_soon?
end end
def delete_scheme_link(scheme) def delete_scheme_link(scheme)

3
app/mailers/devise_notify_mailer.rb

@ -92,8 +92,7 @@ class DeviseNotifyMailer < Devise::Mailer
def email_changed?(record) def email_changed?(record)
( (
record.confirmable_template == User::CONFIRMABLE_TEMPLATE_ID && ( record.confirmable_template == User::CONFIRMABLE_TEMPLATE_ID && record.unconfirmed_email.present? && record.unconfirmed_email != record.email
record.unconfirmed_email.present? && record.unconfirmed_email != record.email)
) || ( ) || (
record.versions.last.changeset.key?("unconfirmed_email") && record.versions.last.changeset.key?("unconfirmed_email") &&
record.confirmed? record.confirmed?

72
app/models/derived_variables/lettings_log_variables.rb

@ -33,7 +33,7 @@ module DerivedVariables::LettingsLogVariables
def set_derived_fields! def set_derived_fields!
clear_inapplicable_derived_values! clear_inapplicable_derived_values!
set_encoded_derived_values!(DEPENDENCIES) set_encoded_derived_values!(dependencies)
if rsnvac.present? if rsnvac.present?
self.newprop = has_first_let_vacancy_reason? ? 1 : 2 self.newprop = has_first_let_vacancy_reason? ? 1 : 2
@ -184,20 +184,15 @@ module DerivedVariables::LettingsLogVariables
private private
DEPENDENCIES = [ def dependencies
{ if form.start_year_2026_or_later?
conditions: { DEPENDENCIES_2026
renewal: 1, else
}, DEPENDENCIES_2025_2024
derived_values: { end
referral: 1, end
referral_type: 3,
waityear: 2, COMMON_DEPENDENCIES = [
offered: 0,
rsnvac: 14,
first_time_property_let_as_social_housing: 0,
},
},
{ {
conditions: { conditions: {
net_income_known: 2, net_income_known: 2,
@ -224,9 +219,42 @@ private
}, },
].freeze ].freeze
DEPENDENCIES_2026 = [
{
conditions: {
renewal: 1,
},
derived_values: {
referral_register: 1,
waityear: 2,
offered: 0,
rsnvac: 14,
first_time_property_let_as_social_housing: 0,
},
},
*COMMON_DEPENDENCIES,
].freeze
DEPENDENCIES_2025_2024 = [
{
conditions: {
renewal: 1,
},
derived_values: {
referral: 1,
referral_type: 3,
waityear: 2,
offered: 0,
rsnvac: 14,
first_time_property_let_as_social_housing: 0,
},
},
*COMMON_DEPENDENCIES,
].freeze
def clear_inapplicable_derived_values! def clear_inapplicable_derived_values!
reset_invalidated_derived_values!(DEPENDENCIES) reset_invalidated_derived_values!(dependencies)
if (startdate_changed? || renewal_changed?) && (renewal_was == 1 && startdate_was&.between?(Time.zone.local(2021, 4, 1), Time.zone.local(2022, 3, 31))) if (startdate_changed? || renewal_changed?) && renewal_was == 1 && startdate_was&.between?(Time.zone.local(2021, 4, 1), Time.zone.local(2022, 3, 31))
self.underoccupation_benefitcap = nil self.underoccupation_benefitcap = nil
end end
if renewal_changed? && renewal_was == 1 if renewal_changed? && renewal_was == 1
@ -242,7 +270,7 @@ private
self.wchair = nil self.wchair = nil
self.location_id = nil self.location_id = nil
end end
if form.start_year_2024_or_later? && (unittype_gn_changed? && unittype_gn_was == 2) if form.start_year_2024_or_later? && unittype_gn_changed? && unittype_gn_was == 2
self.beds = nil self.beds = nil
end end
end end
@ -272,7 +300,7 @@ private
end end
def get_refused def get_refused
return 1 if details_unknown? || age_refused? || sex_refused? || relat_refused? || ecstat_refused? return 1 if details_unknown? || age_refused? || sex_refused? || sexrab_refused? || relat_refused? || ecstat_refused?
0 0
end end
@ -411,13 +439,15 @@ private
def get_lar def get_lar
return 1 if rent_type == 2 return 1 if rent_type == 2
return 2 if rent_type == 1
2 if rent_type == 1
end end
def get_irproduct def get_irproduct
return 1 if rent_type == 3 return 1 if rent_type == 3
return 2 if rent_type == 4 return 2 if rent_type == 4
return 3 if rent_type == 5
3 if rent_type == 5
end end
def clear_gender_description_unless_gender_not_same_as_sex! def clear_gender_description_unless_gender_not_same_as_sex!

2
app/models/derived_variables/shared_logic.rb

@ -9,7 +9,7 @@ private
previously_in_derived_state = dependency[:conditions].all? { |attribute, value| send("#{attribute}_was") == value } previously_in_derived_state = dependency[:conditions].all? { |attribute, value| send("#{attribute}_was") == value }
next unless previously_in_derived_state next unless previously_in_derived_state
dependency[:derived_values].each do |derived_attribute, _derived_value| dependency[:derived_values].each_key do |derived_attribute|
Rails.logger.debug("Cleared derived #{derived_attribute} value") Rails.logger.debug("Cleared derived #{derived_attribute} value")
send("#{derived_attribute}=", nil) send("#{derived_attribute}=", nil)
end end

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_age_value_check.rb

@ -3,7 +3,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadAgeValu
super(id, hsh, subsection) super(id, hsh, subsection)
@id = "females_in_soft_age_range_in_pregnant_household_lead_age_value_check" @id = "females_in_soft_age_range_in_pregnant_household_lead_age_value_check"
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [{ "female_in_pregnant_household_in_soft_validation_range?" => true }] @depends_on = [{ "non_males_in_pregnant_household_not_in_pregnancy_range?" => true }]
@title_text = { @title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text", "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [], "arguments" => [],

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check.rb

@ -3,7 +3,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadHhmembV
super(id, hsh, subsection) super(id, hsh, subsection)
@id = "females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check" @id = "females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check"
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [{ "female_in_pregnant_household_in_soft_validation_range?" => true }] @depends_on = [{ "non_males_in_pregnant_household_not_in_pregnancy_range?" => true }]
@title_text = { @title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text", "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [], "arguments" => [],

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_lead_value_check.rb

@ -3,7 +3,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadValueCh
super super
@id = "females_in_soft_age_range_in_pregnant_household_lead_value_check" @id = "females_in_soft_age_range_in_pregnant_household_lead_value_check"
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [{ "female_in_pregnant_household_in_soft_validation_range?" => true }] @depends_on = [{ "non_males_in_pregnant_household_not_in_pregnancy_range?" => true }]
@title_text = { @title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text", "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [], "arguments" => [],

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_age_value_check.rb

@ -5,7 +5,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonAgeVa
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [ @depends_on = [
{ {
"female_in_pregnant_household_in_soft_validation_range?" => true, "non_males_in_pregnant_household_not_in_pregnancy_range?" => true,
"age#{person_index}_known" => 0, "age#{person_index}_known" => 0,
}, },
] ]

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_person_value_check.rb

@ -6,7 +6,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonValue
@depends_on = [ @depends_on = [
{ {
"female_in_pregnant_household_in_soft_validation_range?" => true, "non_males_in_pregnant_household_not_in_pregnancy_range?" => true,
"details_known_#{person_index}" => 0, "details_known_#{person_index}" => 0,
}, },
] ]

2
app/models/form/lettings/pages/females_in_soft_age_range_in_pregnant_household_value_check.rb

@ -3,7 +3,7 @@ class Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdValueCheck
super super
@id = "females_in_soft_age_range_in_pregnant_household_value_check" @id = "females_in_soft_age_range_in_pregnant_household_value_check"
@copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check" @copy_key = "lettings.soft_validations.pregnancy_value_check.females_in_soft_age_range_in_pregnant_household_value_check"
@depends_on = [{ "female_in_pregnant_household_in_soft_validation_range?" => true }] @depends_on = [{ "non_males_in_pregnant_household_not_in_pregnancy_range?" => true }]
@title_text = { @title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text", "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [], "arguments" => [],

24
app/models/form/lettings/pages/no_household_member_likely_to_be_pregnant_check.rb

@ -0,0 +1,24 @@
class Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck < ::Form::Page
def initialize(id, hsh, subsection, person_index: 0)
super(id, hsh, subsection)
@copy_key = "lettings.soft_validations.pregnancy_value_check.no_household_member_likely_to_be_pregnant_check"
@depends_on = [{ "no_household_member_likely_to_be_pregnant?" => true }]
@title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [],
}
@informative_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.informative_text",
"arguments" => [],
}
@person_index = person_index
end
def questions
@questions ||= [Form::Lettings::Questions::PregnancyValueCheck.new(nil, nil, self, person_index: @person_index)]
end
def interruption_screen_question_ids
%w[preg_occ age1 sexrab1 gender_same_as_sex1 age2 sexrab2 gender_same_as_sex2 age3 sexrab3 gender_same_as_sex3 age4 sexrab4 gender_same_as_sex4 age5 sexrab5 gender_same_as_sex5 age6 sexrab6 gender_same_as_sex6 age7 sexrab7 gender_same_as_sex7 age8 sexrab8 gender_same_as_sex8]
end
end

2
app/models/form/lettings/pages/referral_direct.rb

@ -1,3 +1,5 @@
# added in 2025
# removed in 2026
class Form::Lettings::Pages::ReferralDirect < ::Form::Page class Form::Lettings::Pages::ReferralDirect < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

1
app/models/form/lettings/pages/referral_general_needs.rb

@ -1,3 +1,4 @@
# removed in 2025
class Form::Lettings::Pages::ReferralGeneralNeeds < ::Form::Page class Form::Lettings::Pages::ReferralGeneralNeeds < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

1
app/models/form/lettings/pages/referral_general_needs_prp.rb

@ -1,3 +1,4 @@
# removed in 2025
class Form::Lettings::Pages::ReferralGeneralNeedsPrp < ::Form::Page class Form::Lettings::Pages::ReferralGeneralNeedsPrp < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

2
app/models/form/lettings/pages/referral_hsc.rb

@ -1,3 +1,5 @@
# added in 2025
# removed in 2026
class Form::Lettings::Pages::ReferralHsc < ::Form::Page class Form::Lettings::Pages::ReferralHsc < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

2
app/models/form/lettings/pages/referral_justice.rb

@ -1,3 +1,5 @@
# added in 2025
# removed in 2026
class Form::Lettings::Pages::ReferralJustice < ::Form::Page class Form::Lettings::Pages::ReferralJustice < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

2
app/models/form/lettings/pages/referral_la.rb

@ -1,3 +1,5 @@
# added in 2025
# removed in 2026
class Form::Lettings::Pages::ReferralLa < ::Form::Page class Form::Lettings::Pages::ReferralLa < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

15
app/models/form/lettings/pages/referral_noms_hr.rb

@ -0,0 +1,15 @@
# added in 2026
class Form::Lettings::Pages::ReferralNomsHr < ::Form::Page
def initialize(id, hsh, subsection)
super
@id = "referral_noms_hr"
end
def questions
@questions ||= [Form::Lettings::Questions::ReferralNoms.new(nil, nil, self, 7)]
end
def routed_to?(log, _current_user)
log.owning_organisation&.prp? && !log.is_renewal? && log.referral_is_from_housing_register?
end
end

15
app/models/form/lettings/pages/referral_noms_la_hr.rb

@ -0,0 +1,15 @@
# added in 2026
class Form::Lettings::Pages::ReferralNomsLaHr < ::Form::Page
def initialize(id, hsh, subsection)
super
@id = "referral_noms_la_hr"
end
def questions
@questions ||= [Form::Lettings::Questions::ReferralNoms.new(nil, nil, self, 6)]
end
def routed_to?(log, _current_user)
log.owning_organisation&.prp? && !log.is_renewal? && log.referral_is_from_local_authority_housing_register?
end
end

15
app/models/form/lettings/pages/referral_org_directly_referred.rb

@ -0,0 +1,15 @@
# added in 2026
class Form::Lettings::Pages::ReferralOrgDirectlyReferred < ::Form::Page
def initialize(id, hsh, subsection)
super
@id = "referral_org_directly_referred"
end
def questions
@questions ||= [Form::Lettings::Questions::ReferralOrg.new(nil, nil, self, 7)]
end
def routed_to?(log, _current_user)
log.owning_organisation&.prp? && !log.is_renewal? && log.referral_is_directly_referred?
end
end

15
app/models/form/lettings/pages/referral_org_nominated.rb

@ -0,0 +1,15 @@
# added in 2026
class Form::Lettings::Pages::ReferralOrgNominated < ::Form::Page
def initialize(id, hsh, subsection)
super
@id = "referral_org_nominated"
end
def questions
@questions ||= [Form::Lettings::Questions::ReferralOrg.new(nil, nil, self, 1)]
end
def routed_to?(log, _current_user)
log.owning_organisation&.prp? && !log.is_renewal? && log.referral_is_nominated_by_local_authority?
end
end

2
app/models/form/lettings/pages/referral_prp.rb

@ -1,3 +1,5 @@
# added in 2025
# removed in 2026
class Form::Lettings::Pages::ReferralPrp < ::Form::Page class Form::Lettings::Pages::ReferralPrp < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

15
app/models/form/lettings/pages/referral_register_la.rb

@ -0,0 +1,15 @@
# added in 2026
class Form::Lettings::Pages::ReferralRegisterLa < ::Form::Page
def initialize(id, hsh, subsection)
super
@id = "referral_register_la"
end
def questions
@questions ||= [Form::Lettings::Questions::ReferralRegister.new(nil, nil, self, :la)]
end
def routed_to?(log, _current_user)
log.owning_organisation&.la? && !log.is_renewal?
end
end

15
app/models/form/lettings/pages/referral_register_prp.rb

@ -0,0 +1,15 @@
# added in 2026
class Form::Lettings::Pages::ReferralRegisterPrp < ::Form::Page
def initialize(id, hsh, subsection)
super
@id = "referral_register_prp"
end
def questions
@questions ||= [Form::Lettings::Questions::ReferralRegister.new(nil, nil, self, :prp)]
end
def routed_to?(log, _current_user)
log.owning_organisation&.prp? && !log.is_renewal?
end
end

1
app/models/form/lettings/pages/referral_supported_housing.rb

@ -1,3 +1,4 @@
# removed in 2025
class Form::Lettings::Pages::ReferralSupportedHousing < ::Form::Page class Form::Lettings::Pages::ReferralSupportedHousing < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

1
app/models/form/lettings/pages/referral_supported_housing_prp.rb

@ -1,3 +1,4 @@
# removed in 2025
class Form::Lettings::Pages::ReferralSupportedHousingPrp < ::Form::Page class Form::Lettings::Pages::ReferralSupportedHousingPrp < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

2
app/models/form/lettings/pages/referral_type.rb

@ -1,3 +1,5 @@
# added in 2025
# removed in 2026
class Form::Lettings::Pages::ReferralType < ::Form::Page class Form::Lettings::Pages::ReferralType < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

1
app/models/form/lettings/pages/referral_value_check.rb

@ -1,3 +1,4 @@
# removed in 2026
class Form::Lettings::Pages::ReferralValueCheck < ::Form::Page class Form::Lettings::Pages::ReferralValueCheck < ::Form::Page
def initialize(id, hsh, subsection) def initialize(id, hsh, subsection)
super super

24
app/models/form/lettings/pages/tenancyother_value_check.rb

@ -0,0 +1,24 @@
class Form::Lettings::Pages::TenancyotherValueCheck < ::Form::Page
def initialize(id, hsh, subsection)
super
@id = "tenancyother_value_check"
@copy_key = "lettings.soft_validations.tenancyother_value_check"
@depends_on = [{ "tenancyother_might_be_introductory_or_starter_period?" => true }]
@title_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [{ "key" => "tenancyother", "i18n_template" => "tenancyother" }],
}
@informative_text = {
"translation" => "forms.#{form.start_date.year}.#{@copy_key}.informative_text",
"arguments" => [],
}
end
def questions
@questions ||= [Form::Lettings::Questions::TenancyotherValueCheck.new(nil, nil, self)]
end
def interruption_screen_question_ids
%w[startertenancy tenancy tenancyother]
end
end

4
app/models/form/lettings/questions/address_line1.rb

@ -7,7 +7,7 @@ class Form::Lettings::Questions::AddressLine1 < ::Form::Question
@type = "text" @type = "text"
@plain_label = true @plain_label = true
@disable_clearing_if_not_routed_or_dynamic_answer_options = true @disable_clearing_if_not_routed_or_dynamic_answer_options = true
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@hide_question_number_on_page = true @hide_question_number_on_page = true
end end
@ -18,5 +18,5 @@ class Form::Lettings::Questions::AddressLine1 < ::Form::Question
].select(&:present?).join("\n") ].select(&:present?).join("\n")
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 12, 2024 => 13, 2025 => 17 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 12, 2024 => 13, 2025 => 17, 2026 => 17 }.freeze
end end

4
app/models/form/lettings/questions/address_search.rb

@ -6,7 +6,7 @@ class Form::Lettings::Questions::AddressSearch < ::Form::Question
@copy_key = "lettings.property_information.address_search" @copy_key = "lettings.property_information.address_search"
@plain_label = true @plain_label = true
@bottom_guidance_partial = "address_search" @bottom_guidance_partial = "address_search"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@hide_question_number_on_page = true @hide_question_number_on_page = true
end end
@ -38,5 +38,5 @@ class Form::Lettings::Questions::AddressSearch < ::Form::Question
answer_options(log, user).transform_values { |value| value["value"] } || {} answer_options(log, user).transform_values { |value| value["value"] } || {}
end end
QUESTION_NUMBER_FROM_YEAR = { 2024 => 12, 2025 => 16 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2024 => 12, 2025 => 16, 2026 => 16 }.freeze
end end

10
app/models/form/lettings/questions/age.rb

@ -19,11 +19,17 @@ class Form::Lettings::Questions::Age < ::Form::Question
base_question_number = case form.start_date.year base_question_number = case form.start_date.year
when 2023 when 2023
31 31
else when 2024
30
when 2025
30 30
when 2026
27
else
27
end end
base_question_number + (4 * @person_index) base_question_number + (form.person_question_count * @person_index)
end end
def hint_text def hint_text

4
app/models/form/lettings/questions/age1.rb

@ -10,8 +10,8 @@ class Form::Lettings::Questions::Age1 < ::Form::Question
@max = 120 @max = 120
@min = 16 @min = 16
@step = 1 @step = 1
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 32, 2024 => 31 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 32, 2024 => 31, 2025 => 31, 2026 => 30 }.freeze
end end

4
app/models/form/lettings/questions/age1_known.rb

@ -8,10 +8,10 @@ class Form::Lettings::Questions::Age1Known < ::Form::Question
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@conditional_for = { "age1" => [0] } @conditional_for = { "age1" => [0] }
@hidden_in_check_answers = { "depends_on" => [{ "age1_known" => 0 }, { "age1_known" => 1 }] } @hidden_in_check_answers = { "depends_on" => [{ "age1_known" => 0 }, { "age1_known" => 1 }] }
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { "0" => { "value" => "Yes" }, "1" => { "value" => "No" } }.freeze ANSWER_OPTIONS = { "0" => { "value" => "Yes" }, "1" => { "value" => "No" } }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 32, 2024 => 31 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 32, 2024 => 31, 2025 => 31, 2026 => 30 }.freeze
end end

10
app/models/form/lettings/questions/age_known.rb

@ -23,10 +23,16 @@ class Form::Lettings::Questions::AgeKnown < ::Form::Question
base_question_number = case form.start_date.year base_question_number = case form.start_date.year
when 2023 when 2023
31 31
else when 2024
30
when 2025
30 30
when 2026
27
else
27
end end
base_question_number + (4 * @person_index) base_question_number + (form.person_question_count * @person_index)
end end
end end

4
app/models/form/lettings/questions/armedforces.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::Armedforces < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -18,5 +18,5 @@ class Form::Lettings::Questions::Armedforces < ::Form::Question
"6" => { "value" => "Don’t know" }, "6" => { "value" => "Don’t know" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 66, 2024 => 65 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 66, 2024 => 65, 2025 => 65, 2026 => 72 }.freeze
end end

4
app/models/form/lettings/questions/beds.rb

@ -7,12 +7,12 @@ class Form::Lettings::Questions::Beds < ::Form::Question
@max = 12 @max = 12
@min = 1 @min = 1
@step = 1 @step = 1
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
def derived?(log) def derived?(log)
log.is_bedsit? log.is_bedsit?
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 22 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 22, 2024 => 22, 2025 => 22, 2026 => 21 }.freeze
end end

4
app/models/form/lettings/questions/benefits.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::Benefits < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -16,5 +16,5 @@ class Form::Lettings::Questions::Benefits < ::Form::Question
"4" => { "value" => "Don’t know" }, "4" => { "value" => "Don’t know" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 90, 2024 => 89 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 90, 2024 => 89, 2025 => 89, 2026 => 97 }.freeze
end end

4
app/models/form/lettings/questions/brent_4_weekly.rb

@ -12,9 +12,9 @@ class Form::Lettings::Questions::Brent4Weekly < ::Form::Question
@result_field = "tcharge" @result_field = "tcharge"
@prefix = "£" @prefix = "£"
@suffix = " every 4 weeks" @suffix = " every 4 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@strip_commas = true @strip_commas = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92, 2026 => 100 }.freeze
end end

4
app/models/form/lettings/questions/brent_bi_weekly.rb

@ -12,9 +12,9 @@ class Form::Lettings::Questions::BrentBiWeekly < ::Form::Question
@result_field = "tcharge" @result_field = "tcharge"
@prefix = "£" @prefix = "£"
@suffix = " every 2 weeks" @suffix = " every 2 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@strip_commas = true @strip_commas = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92, 2026 => 100 }.freeze
end end

4
app/models/form/lettings/questions/brent_monthly.rb

@ -12,9 +12,9 @@ class Form::Lettings::Questions::BrentMonthly < ::Form::Question
@result_field = "tcharge" @result_field = "tcharge"
@prefix = "£" @prefix = "£"
@suffix = " every month" @suffix = " every month"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@strip_commas = true @strip_commas = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92, 2026 => 100 }.freeze
end end

4
app/models/form/lettings/questions/brent_weekly.rb

@ -12,9 +12,9 @@ class Form::Lettings::Questions::BrentWeekly < ::Form::Question
@result_field = "tcharge" @result_field = "tcharge"
@prefix = "£" @prefix = "£"
@suffix = " every week" @suffix = " every week"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@strip_commas = true @strip_commas = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92, 2026 => 100 }.freeze
end end

4
app/models/form/lettings/questions/builtype.rb

@ -4,7 +4,7 @@ class Form::Lettings::Questions::Builtype < ::Form::Question
@id = "builtype" @id = "builtype"
@type = "radio" @type = "radio"
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -12,5 +12,5 @@ class Form::Lettings::Questions::Builtype < ::Form::Question
"1" => { "value" => "Purpose built" }, "1" => { "value" => "Purpose built" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 20 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 20, 2024 => 20, 2025 => 20 }.freeze
end end

4
app/models/form/lettings/questions/chcharge_4_weekly.rb

@ -9,9 +9,9 @@ class Form::Lettings::Questions::Chcharge4Weekly < ::Form::Question
@step = 0.01 @step = 0.01
@prefix = "£" @prefix = "£"
@suffix = " every 4 weeks" @suffix = " every 4 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@strip_commas = true @strip_commas = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93, 2025 => 93, 2026 => 101 }.freeze
end end

4
app/models/form/lettings/questions/chcharge_bi_weekly.rb

@ -9,9 +9,9 @@ class Form::Lettings::Questions::ChchargeBiWeekly < ::Form::Question
@step = 0.01 @step = 0.01
@prefix = "£" @prefix = "£"
@suffix = " every 2 weeks" @suffix = " every 2 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@strip_commas = true @strip_commas = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93, 2025 => 93, 2026 => 101 }.freeze
end end

4
app/models/form/lettings/questions/chcharge_monthly.rb

@ -9,9 +9,9 @@ class Form::Lettings::Questions::ChchargeMonthly < ::Form::Question
@step = 0.01 @step = 0.01
@prefix = "£" @prefix = "£"
@suffix = " every month" @suffix = " every month"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@strip_commas = true @strip_commas = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93, 2025 => 93, 2026 => 101 }.freeze
end end

4
app/models/form/lettings/questions/chcharge_weekly.rb

@ -9,9 +9,9 @@ class Form::Lettings::Questions::ChchargeWeekly < ::Form::Question
@step = 0.01 @step = 0.01
@prefix = "£" @prefix = "£"
@suffix = " every week" @suffix = " every week"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@strip_commas = true @strip_commas = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93, 2025 => 93, 2026 => 101 }.freeze
end end

4
app/models/form/lettings/questions/condition_effects.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::ConditionEffects < ::Form::Question
@type = "checkbox" @type = "checkbox"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -27,5 +27,5 @@ class Form::Lettings::Questions::ConditionEffects < ::Form::Question
"illness_type_10" => { "value" => "Other" }, "illness_type_10" => { "value" => "Other" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 74, 2024 => 73 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 74, 2024 => 73, 2025 => 73, 2026 => 80 }.freeze
end end

4
app/models/form/lettings/questions/county.rb

@ -6,9 +6,9 @@ class Form::Lettings::Questions::County < ::Form::Question
@type = "text" @type = "text"
@plain_label = true @plain_label = true
@disable_clearing_if_not_routed_or_dynamic_answer_options = true @disable_clearing_if_not_routed_or_dynamic_answer_options = true
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@hide_question_number_on_page = true @hide_question_number_on_page = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 12, 2024 => 13, 2025 => 17 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 12, 2024 => 13, 2025 => 17, 2026 => 17 }.freeze
end end

4
app/models/form/lettings/questions/declaration.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::Declaration < ::Form::Question
@type = "checkbox" @type = "checkbox"
@check_answers_card_number = 0 unless form.start_year_2024_or_later? @check_answers_card_number = 0 unless form.start_year_2024_or_later?
@top_guidance_partial = "privacy_notice_tenant" @top_guidance_partial = "privacy_notice_tenant"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
def answer_options def answer_options
@ -26,5 +26,5 @@ class Form::Lettings::Questions::Declaration < ::Form::Question
end end
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 30, 2024 => 11 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 30, 2024 => 11, 2025 => 11, 2026 => 11 }.freeze
end end

4
app/models/form/lettings/questions/earnings.rb

@ -15,9 +15,9 @@ class Form::Lettings::Questions::Earnings < ::Form::Question
{ "label" => " every month", "depends_on" => { "incfreq" => 2 } }, { "label" => " every month", "depends_on" => { "incfreq" => 2 } },
{ "label" => " every year", "depends_on" => { "incfreq" => 3 } }, { "label" => " every year", "depends_on" => { "incfreq" => 3 } },
] ]
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@strip_commas = true @strip_commas = true
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 88, 2024 => 87 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 88, 2024 => 87, 2025 => 87, 2026 => 95 }.freeze
end end

4
app/models/form/lettings/questions/ethnic_arab.rb

@ -6,7 +6,7 @@ class Form::Lettings::Questions::EthnicArab < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 1 @check_answers_card_number = 1
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -18,5 +18,5 @@ class Form::Lettings::Questions::EthnicArab < ::Form::Question
}, },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34, 2025 => 34, 2026 => 34 }.freeze
end end

4
app/models/form/lettings/questions/ethnic_asian.rb

@ -6,7 +6,7 @@ class Form::Lettings::Questions::EthnicAsian < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 1 @check_answers_card_number = 1
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -27,5 +27,5 @@ class Form::Lettings::Questions::EthnicAsian < ::Form::Question
}, },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34, 2025 => 34, 2026 => 34 }.freeze
end end

4
app/models/form/lettings/questions/ethnic_black.rb

@ -6,7 +6,7 @@ class Form::Lettings::Questions::EthnicBlack < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 1 @check_answers_card_number = 1
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -21,5 +21,5 @@ class Form::Lettings::Questions::EthnicBlack < ::Form::Question
}, },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34, 2025 => 34, 2026 => 34 }.freeze
end end

4
app/models/form/lettings/questions/ethnic_group.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::EthnicGroup < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 1 @check_answers_card_number = 1
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -18,5 +18,5 @@ class Form::Lettings::Questions::EthnicGroup < ::Form::Question
"17" => { "value" => "Tenant prefers not to say" }, "17" => { "value" => "Tenant prefers not to say" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 34, 2024 => 33 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 34, 2024 => 33, 2025 => 33, 2026 => 33 }.freeze
end end

4
app/models/form/lettings/questions/ethnic_mixed.rb

@ -6,7 +6,7 @@ class Form::Lettings::Questions::EthnicMixed < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 1 @check_answers_card_number = 1
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -24,5 +24,5 @@ class Form::Lettings::Questions::EthnicMixed < ::Form::Question
}, },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34, 2025 => 34, 2026 => 34 }.freeze
end end

4
app/models/form/lettings/questions/ethnic_white.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::EthnicWhite < ::Form::Question
@copy_key = "lettings.household_characteristics.ethnic.ethnic_background_white" @copy_key = "lettings.household_characteristics.ethnic.ethnic_background_white"
@type = "radio" @type = "radio"
@check_answers_card_number = 1 @check_answers_card_number = 1
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
def answer_options def answer_options
@ -27,5 +27,5 @@ class Form::Lettings::Questions::EthnicWhite < ::Form::Question
end end
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 35, 2024 => 34, 2025 => 34, 2026 => 34 }.freeze
end end

4
app/models/form/lettings/questions/first_time_property_let_as_social_housing.rb

@ -3,7 +3,7 @@ class Form::Lettings::Questions::FirstTimePropertyLetAsSocialHousing < ::Form::Q
super super
@id = "first_time_property_let_as_social_housing" @id = "first_time_property_let_as_social_housing"
@type = "radio" @type = "radio"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
def answer_options def answer_options
@ -21,5 +21,5 @@ class Form::Lettings::Questions::FirstTimePropertyLetAsSocialHousing < ::Form::Q
form.start_year_2024_or_later? ? "This is a re-let of existing social housing stock." : "This is a re-let of existing social housing." form.start_year_2024_or_later? ? "This is a re-let of existing social housing stock." : "This is a re-let of existing social housing."
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 14, 2024 => 15, 2025 => 12 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 14, 2024 => 15, 2025 => 12, 2026 => 12 }.freeze
end end

4
app/models/form/lettings/questions/gender_identity1.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::GenderIdentity1 < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 1 @check_answers_card_number = 1
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -16,5 +16,5 @@ class Form::Lettings::Questions::GenderIdentity1 < ::Form::Question
"R" => { "value" => "Tenant prefers not to say" }, "R" => { "value" => "Tenant prefers not to say" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 33, 2024 => 32 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 33, 2024 => 32, 2025 => 32 }.freeze
end end

1
app/models/form/lettings/questions/gender_same_as_sex.rb

@ -7,6 +7,7 @@ class Form::Lettings::Questions::GenderSameAsSex < ::Form::Question
@conditional_for = { "gender_description#{person_index}" => [2] } @conditional_for = { "gender_description#{person_index}" => [2] }
@person_index = person_index @person_index = person_index
@question_number = question_number @question_number = question_number
@inferred_check_answers_value = [{ "condition" => { "gender_same_as_sex#{person_index}" => 2 }, "value" => "No" }]
end end
def answer_options def answer_options

4
app/models/form/lettings/questions/hb.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::Hb < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -17,5 +17,5 @@ class Form::Lettings::Questions::Hb < ::Form::Question
"3" => { "value" => "Don’t know" }, "3" => { "value" => "Don’t know" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 89, 2024 => 88 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 89, 2024 => 88, 2025 => 88, 2026 => 96 }.freeze
end end

4
app/models/form/lettings/questions/hbrentshortfall.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::Hbrentshortfall < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -15,5 +15,5 @@ class Form::Lettings::Questions::Hbrentshortfall < ::Form::Question
"3" => { "value" => "Don’t know" }, "3" => { "value" => "Don’t know" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 99, 2024 => 98, 2025 => 96 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 99, 2024 => 98, 2025 => 96, 2026 => 104 }.freeze
end end

4
app/models/form/lettings/questions/hhmemb.rb

@ -8,9 +8,9 @@ class Form::Lettings::Questions::Hhmemb < ::Form::Question
@max = 8 @max = 8
@min = 1 @min = 1
@step = 1 @step = 1
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@check_answers_card_title = "Household" if form.start_year_2026_or_later? @check_answers_card_title = "Household" if form.start_year_2026_or_later?
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 31, 2024 => 30 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 31, 2024 => 30, 2025 => 30, 2026 => 29 }.freeze
end end

4
app/models/form/lettings/questions/homeless.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::Homeless < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -13,5 +13,5 @@ class Form::Lettings::Questions::Homeless < ::Form::Question
"1" => { "value" => "No" }, "1" => { "value" => "No" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 79, 2024 => 78 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 79, 2024 => 78, 2025 => 78, 2026 => 85 }.freeze
end end

4
app/models/form/lettings/questions/household_charge.rb

@ -5,10 +5,10 @@ class Form::Lettings::Questions::HouseholdCharge < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { "0" => { "value" => "Yes" }, "1" => { "value" => "No" } }.freeze ANSWER_OPTIONS = { "0" => { "value" => "Yes" }, "1" => { "value" => "No" } }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 91, 2024 => 90 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 91, 2024 => 90, 2025 => 90, 2026 => 98 }.freeze
end end

4
app/models/form/lettings/questions/housingneeds.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::Housingneeds < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -15,5 +15,5 @@ class Form::Lettings::Questions::Housingneeds < ::Form::Question
"3" => { "value" => "Don’t know" }, "3" => { "value" => "Don’t know" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 70, 2024 => 69 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 70, 2024 => 69, 2025 => 69, 2026 => 76 }.freeze
end end

4
app/models/form/lettings/questions/housingneeds_other.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::HousingneedsOther < ::Form::Question
@copy_key = "lettings.household_needs.housingneeds_type.housingneeds_other" @copy_key = "lettings.household_needs.housingneeds_type.housingneeds_other"
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
def answer_options def answer_options
@ -24,5 +24,5 @@ class Form::Lettings::Questions::HousingneedsOther < ::Form::Question
end end
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 72, 2024 => 71 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 72, 2024 => 71, 2025 => 71, 2026 => 78 }.freeze
end end

4
app/models/form/lettings/questions/housingneeds_type.rb

@ -6,7 +6,7 @@ class Form::Lettings::Questions::HousingneedsType < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -17,5 +17,5 @@ class Form::Lettings::Questions::HousingneedsType < ::Form::Question
"3" => { "value" => "None of the listed options" }, "3" => { "value" => "None of the listed options" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 71, 2024 => 70 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 71, 2024 => 70, 2025 => 70, 2026 => 77 }.freeze
end end

4
app/models/form/lettings/questions/illness.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::Illness < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -15,5 +15,5 @@ class Form::Lettings::Questions::Illness < ::Form::Question
"3" => { "value" => "Tenant prefers not to say" }, "3" => { "value" => "Tenant prefers not to say" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 73, 2024 => 72 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 73, 2024 => 72, 2025 => 72, 2026 => 79 }.freeze
end end

4
app/models/form/lettings/questions/incfreq.rb

@ -7,7 +7,7 @@ class Form::Lettings::Questions::Incfreq < ::Form::Question
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@hidden_in_check_answers = true @hidden_in_check_answers = true
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -16,5 +16,5 @@ class Form::Lettings::Questions::Incfreq < ::Form::Question
"3" => { "value" => "Yearly" }, "3" => { "value" => "Yearly" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 87, 2024 => 86 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 87, 2024 => 86, 2025 => 86, 2026 => 94 }.freeze
end end

4
app/models/form/lettings/questions/irproduct_other.rb

@ -4,8 +4,8 @@ class Form::Lettings::Questions::IrproductOther < ::Form::Question
@id = "irproduct_other" @id = "irproduct_other"
@copy_key = "lettings.setup.rent_type.irproduct_other" @copy_key = "lettings.setup.rent_type.irproduct_other"
@type = "text" @type = "text"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] if form.start_date.present? @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR) if form.start_date.present?
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 6, 2024 => 8 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 6, 2024 => 8, 2025 => 8, 2026 => 8 }.freeze
end end

4
app/models/form/lettings/questions/is_carehome.rb

@ -6,7 +6,7 @@ class Form::Lettings::Questions::IsCarehome < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@conditional_for = { "chcharge" => [1] } @conditional_for = { "chcharge" => [1] }
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
def answer_options def answer_options
@ -23,5 +23,5 @@ class Form::Lettings::Questions::IsCarehome < ::Form::Question
end end
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 93, 2024 => 92 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 93, 2024 => 92, 2025 => 92, 2026 => 100 }.freeze
end end

4
app/models/form/lettings/questions/joint.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::Joint < ::Form::Question
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@answer_options = ANSWER_OPTIONS @answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
ANSWER_OPTIONS = { ANSWER_OPTIONS = {
@ -15,5 +15,5 @@ class Form::Lettings::Questions::Joint < ::Form::Question
"3" => { "value" => "Don’t know" }, "3" => { "value" => "Don’t know" },
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2023 => 25, 2024 => 25, 2025 => 26 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 25, 2024 => 25, 2025 => 26, 2026 => 25 }.freeze
end end

4
app/models/form/lettings/questions/la.rb

@ -5,7 +5,7 @@ class Form::Lettings::Questions::La < ::Form::Question
@type = "select" @type = "select"
@check_answers_card_number = nil @check_answers_card_number = nil
@hint_text = "" @hint_text = ""
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
@disable_clearing_if_not_routed_or_dynamic_answer_options = true @disable_clearing_if_not_routed_or_dynamic_answer_options = true
end end
@ -13,5 +13,5 @@ class Form::Lettings::Questions::La < ::Form::Question
{ "" => "Select an option" }.merge(LocalAuthority.active(form.start_date).england.map { |la| [la.code, la.name] }.to_h) { "" => "Select an option" }.merge(LocalAuthority.active(form.start_date).england.map { |la| [la.code, la.name] }.to_h)
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 13, 2024 => 14, 2025 => 18 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 13, 2024 => 14, 2025 => 18, 2026 => 18 }.freeze
end end

4
app/models/form/lettings/questions/layear.rb

@ -4,7 +4,7 @@ class Form::Lettings::Questions::Layear < ::Form::Question
@id = "layear" @id = "layear"
@type = "radio" @type = "radio"
@check_answers_card_number = 0 @check_answers_card_number = 0
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] @question_number = get_question_number_from_hash(QUESTION_NUMBER_FROM_YEAR)
end end
def answer_options def answer_options
@ -36,5 +36,5 @@ class Form::Lettings::Questions::Layear < ::Form::Question
end end
end end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 75, 2024 => 74 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2023 => 75, 2024 => 74, 2025 => 74, 2026 => 81 }.freeze
end end

8
app/models/form/lettings/questions/lead_tenant_sex_registered_at_birth.rb

@ -16,4 +16,12 @@ class Form::Lettings::Questions::LeadTenantSexRegisteredAtBirth < ::Form::Questi
}.freeze }.freeze
QUESTION_NUMBER_FROM_YEAR = { 2026 => 31 }.freeze QUESTION_NUMBER_FROM_YEAR = { 2026 => 31 }.freeze
def label_from_value(value, _log = nil, _user = nil)
return unless value
return "Prefers not to say" if value == "R"
super
end
end end

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save