Browse Source

Merge branch 'main' into CLDC-4043-redo-org-merge-marked-as-incomplete-if-validation-fail

pull/3098/head
Samuel Young 5 days ago committed by GitHub
parent
commit
6cb60f6482
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      .github/workflows/review_pipeline.yml
  2. 120
      Gemfile.lock
  3. 3
      app/controllers/form_controller.rb
  4. 1
      app/models/form/lettings/questions/brent_4_weekly.rb
  5. 1
      app/models/form/lettings/questions/brent_bi_weekly.rb
  6. 1
      app/models/form/lettings/questions/brent_monthly.rb
  7. 1
      app/models/form/lettings/questions/brent_weekly.rb
  8. 1
      app/models/form/lettings/questions/chcharge_4_weekly.rb
  9. 1
      app/models/form/lettings/questions/chcharge_bi_weekly.rb
  10. 1
      app/models/form/lettings/questions/chcharge_monthly.rb
  11. 1
      app/models/form/lettings/questions/chcharge_weekly.rb
  12. 1
      app/models/form/lettings/questions/earnings.rb
  13. 1
      app/models/form/lettings/questions/pscharge_4_weekly.rb
  14. 1
      app/models/form/lettings/questions/pscharge_bi_weekly.rb
  15. 1
      app/models/form/lettings/questions/pscharge_monthly.rb
  16. 1
      app/models/form/lettings/questions/pscharge_weekly.rb
  17. 1
      app/models/form/lettings/questions/scharge_4_weekly.rb
  18. 1
      app/models/form/lettings/questions/scharge_bi_weekly.rb
  19. 1
      app/models/form/lettings/questions/scharge_monthly.rb
  20. 1
      app/models/form/lettings/questions/scharge_weekly.rb
  21. 1
      app/models/form/lettings/questions/supcharg_4_weekly.rb
  22. 1
      app/models/form/lettings/questions/supcharg_bi_weekly.rb
  23. 1
      app/models/form/lettings/questions/supcharg_monthly.rb
  24. 1
      app/models/form/lettings/questions/supcharg_weekly.rb
  25. 1
      app/models/form/lettings/questions/tcharge_4_weekly.rb
  26. 1
      app/models/form/lettings/questions/tcharge_bi_weekly.rb
  27. 1
      app/models/form/lettings/questions/tcharge_monthly.rb
  28. 1
      app/models/form/lettings/questions/tcharge_weekly.rb
  29. 1
      app/models/form/lettings/questions/tshortfall.rb
  30. 3
      app/models/form/question.rb
  31. 1
      app/models/form/sales/questions/buyer1_income.rb
  32. 1
      app/models/form/sales/questions/buyer2_income.rb
  33. 1
      app/models/form/sales/questions/deposit_amount.rb
  34. 1
      app/models/form/sales/questions/deposit_discount.rb
  35. 1
      app/models/form/sales/questions/grant.rb
  36. 1
      app/models/form/sales/questions/leasehold_charges.rb
  37. 1
      app/models/form/sales/questions/management_fee.rb
  38. 1
      app/models/form/sales/questions/monthly_rent.rb
  39. 1
      app/models/form/sales/questions/monthly_rent_after_staircasing.rb
  40. 1
      app/models/form/sales/questions/monthly_rent_before_staircasing.rb
  41. 1
      app/models/form/sales/questions/mortgage_amount.rb
  42. 1
      app/models/form/sales/questions/purchase_price.rb
  43. 1
      app/models/form/sales/questions/savings.rb
  44. 1
      app/models/form/sales/questions/service_charge.rb
  45. 1
      app/models/form/sales/questions/value.rb
  46. 2
      app/models/validations/soft_validations.rb
  47. 6
      docs/Gemfile.lock
  48. 13
      docs/infrastructure.md
  49. 2
      spec/models/lettings_log_derived_fields_spec.rb
  50. 2
      spec/models/validations/financial_validations_spec.rb

2
.github/workflows/review_pipeline.yml

@ -52,6 +52,6 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
msg: "Created review app at https://review.submit-social-housing-data.communities.gov.uk/${{ github.event.pull_request.number }}"
msg: "Created review app at https://review.submit-social-housing-data.communities.gov.uk/${{ github.event.pull_request.number }}. Note that the review app will be automatically deprovisioned after 30 days and will need the review app pipeline running again."
check_for_duplicate_msg: true
duplicate_msg_pattern: Created review app at*

120
Gemfile.lock

@ -1,29 +1,29 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (7.2.2.1)
actionpack (= 7.2.2.1)
activesupport (= 7.2.2.1)
actioncable (7.2.2.2)
actionpack (= 7.2.2.2)
activesupport (= 7.2.2.2)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (7.2.2.1)
actionpack (= 7.2.2.1)
activejob (= 7.2.2.1)
activerecord (= 7.2.2.1)
activestorage (= 7.2.2.1)
activesupport (= 7.2.2.1)
actionmailbox (7.2.2.2)
actionpack (= 7.2.2.2)
activejob (= 7.2.2.2)
activerecord (= 7.2.2.2)
activestorage (= 7.2.2.2)
activesupport (= 7.2.2.2)
mail (>= 2.8.0)
actionmailer (7.2.2.1)
actionpack (= 7.2.2.1)
actionview (= 7.2.2.1)
activejob (= 7.2.2.1)
activesupport (= 7.2.2.1)
actionmailer (7.2.2.2)
actionpack (= 7.2.2.2)
actionview (= 7.2.2.2)
activejob (= 7.2.2.2)
activesupport (= 7.2.2.2)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
actionpack (7.2.2.1)
actionview (= 7.2.2.1)
activesupport (= 7.2.2.1)
actionpack (7.2.2.2)
actionview (= 7.2.2.2)
activesupport (= 7.2.2.2)
nokogiri (>= 1.8.5)
racc
rack (>= 2.2.4, < 3.2)
@ -32,39 +32,39 @@ GEM
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
useragent (~> 0.16)
actiontext (7.2.2.1)
actionpack (= 7.2.2.1)
activerecord (= 7.2.2.1)
activestorage (= 7.2.2.1)
activesupport (= 7.2.2.1)
actiontext (7.2.2.2)
actionpack (= 7.2.2.2)
activerecord (= 7.2.2.2)
activestorage (= 7.2.2.2)
activesupport (= 7.2.2.2)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.2.2.1)
activesupport (= 7.2.2.1)
actionview (7.2.2.2)
activesupport (= 7.2.2.2)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activejob (7.2.2.1)
activesupport (= 7.2.2.1)
activejob (7.2.2.2)
activesupport (= 7.2.2.2)
globalid (>= 0.3.6)
activemodel (7.2.2.1)
activesupport (= 7.2.2.1)
activemodel (7.2.2.2)
activesupport (= 7.2.2.2)
activemodel-serializers-xml (1.0.3)
activemodel (>= 5.0.0.a)
activesupport (>= 5.0.0.a)
builder (~> 3.1)
activerecord (7.2.2.1)
activemodel (= 7.2.2.1)
activesupport (= 7.2.2.1)
activerecord (7.2.2.2)
activemodel (= 7.2.2.2)
activesupport (= 7.2.2.2)
timeout (>= 0.4.0)
activestorage (7.2.2.1)
actionpack (= 7.2.2.1)
activejob (= 7.2.2.1)
activerecord (= 7.2.2.1)
activesupport (= 7.2.2.1)
activestorage (7.2.2.2)
actionpack (= 7.2.2.2)
activejob (= 7.2.2.2)
activerecord (= 7.2.2.2)
activesupport (= 7.2.2.2)
marcel (~> 1.0)
activesupport (7.2.2.1)
activesupport (7.2.2.2)
base64
benchmark (>= 0.3)
bigdecimal
@ -108,9 +108,9 @@ GEM
descendants_tracker (~> 0.0.4)
ice_nine (~> 0.11.0)
thread_safe (~> 0.3, >= 0.3.1)
base64 (0.2.0)
base64 (0.3.0)
bcrypt (3.1.20)
benchmark (0.4.0)
benchmark (0.4.1)
better_html (2.0.2)
actionview (>= 6.0)
activesupport (>= 6.0)
@ -118,7 +118,7 @@ GEM
erubi (~> 1.4)
parser (>= 2.4)
smart_properties
bigdecimal (3.1.9)
bigdecimal (3.2.2)
bindex (0.8.1)
bootsnap (1.18.3)
msgpack (~> 1.2)
@ -149,7 +149,7 @@ GEM
coercible (1.0.0)
descendants_tracker (~> 0.0.1)
concurrent-ruby (1.3.5)
connection_pool (2.5.0)
connection_pool (2.5.3)
crack (1.0.0)
bigdecimal
rexml
@ -178,7 +178,7 @@ GEM
dotenv-rails (3.0.2)
dotenv (= 3.0.2)
railties (>= 6.1)
drb (2.2.1)
drb (2.2.3)
dumb_delegator (1.0.0)
encryptor (3.0.0)
erb_lint (0.5.0)
@ -260,7 +260,7 @@ GEM
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
logger (1.6.6)
logger (1.7.0)
loofah (2.24.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
@ -273,7 +273,7 @@ GEM
matrix (0.4.2)
method_source (1.1.0)
mini_mime (1.1.5)
minitest (5.25.4)
minitest (5.25.5)
msgpack (1.7.2)
multipart-post (2.4.1)
nested_form (0.3.2)
@ -355,20 +355,20 @@ GEM
rack (>= 1.3)
rackup (2.2.1)
rack (>= 3)
rails (7.2.2.1)
actioncable (= 7.2.2.1)
actionmailbox (= 7.2.2.1)
actionmailer (= 7.2.2.1)
actionpack (= 7.2.2.1)
actiontext (= 7.2.2.1)
actionview (= 7.2.2.1)
activejob (= 7.2.2.1)
activemodel (= 7.2.2.1)
activerecord (= 7.2.2.1)
activestorage (= 7.2.2.1)
activesupport (= 7.2.2.1)
rails (7.2.2.2)
actioncable (= 7.2.2.2)
actionmailbox (= 7.2.2.2)
actionmailer (= 7.2.2.2)
actionpack (= 7.2.2.2)
actiontext (= 7.2.2.2)
actionview (= 7.2.2.2)
activejob (= 7.2.2.2)
activemodel (= 7.2.2.2)
activerecord (= 7.2.2.2)
activestorage (= 7.2.2.2)
activesupport (= 7.2.2.2)
bundler (>= 1.15.0)
railties (= 7.2.2.1)
railties (= 7.2.2.2)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
@ -383,9 +383,9 @@ GEM
nested_form (~> 0.3)
rails (>= 6.0, < 9)
turbo-rails (>= 1.0, < 3)
railties (7.2.2.1)
actionpack (= 7.2.2.1)
activesupport (= 7.2.2.1)
railties (7.2.2.2)
actionpack (= 7.2.2.2)
activesupport (= 7.2.2.2)
irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)

3
app/controllers/form_controller.rb

@ -160,6 +160,9 @@ private
result[option] = 1 if question_params.include?(option)
end
elsif question.type != "date"
if question.strip_commas
question_params = question_params.delete(",")
end
result[question.id] = question_params
end

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::Brent4Weekly < ::Form::Question
@prefix = "£"
@suffix = " every 4 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::BrentBiWeekly < ::Form::Question
@prefix = "£"
@suffix = " every 2 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::BrentMonthly < ::Form::Question
@prefix = "£"
@suffix = " every month"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::BrentWeekly < ::Form::Question
@prefix = "£"
@suffix = " every week"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 95, 2024 => 94, 2025 => 92 }.freeze

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

@ -10,6 +10,7 @@ class Form::Lettings::Questions::Chcharge4Weekly < ::Form::Question
@prefix = "£"
@suffix = " every 4 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93 }.freeze

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

@ -10,6 +10,7 @@ class Form::Lettings::Questions::ChchargeBiWeekly < ::Form::Question
@prefix = "£"
@suffix = " every 2 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93 }.freeze

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

@ -10,6 +10,7 @@ class Form::Lettings::Questions::ChchargeMonthly < ::Form::Question
@prefix = "£"
@suffix = " every month"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93 }.freeze

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

@ -10,6 +10,7 @@ class Form::Lettings::Questions::ChchargeWeekly < ::Form::Question
@prefix = "£"
@suffix = " every week"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 94, 2024 => 93 }.freeze

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

@ -16,6 +16,7 @@ class Form::Lettings::Questions::Earnings < ::Form::Question
{ "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]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 88, 2024 => 87 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::Pscharge4Weekly < ::Form::Question
@prefix = "£"
@suffix = " every 4 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 97, 2024 => 96, 2025 => 94 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::PschargeBiWeekly < ::Form::Question
@prefix = "£"
@suffix = " every 2 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 97, 2024 => 96, 2025 => 94 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::PschargeMonthly < ::Form::Question
@prefix = "£"
@suffix = " every month"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 97, 2024 => 96, 2025 => 94 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::PschargeWeekly < ::Form::Question
@prefix = "£"
@suffix = " every week"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 97, 2024 => 96, 2025 => 94 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::Scharge4Weekly < ::Form::Question
@prefix = "£"
@suffix = " every 4 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 96, 2024 => 95, 2025 => 93 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::SchargeBiWeekly < ::Form::Question
@prefix = "£"
@suffix = " every 2 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 96, 2024 => 95, 2025 => 93 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::SchargeMonthly < ::Form::Question
@prefix = "£"
@suffix = " every month"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 96, 2024 => 95, 2025 => 93 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::SchargeWeekly < ::Form::Question
@prefix = "£"
@suffix = " every week"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 96, 2024 => 95, 2025 => 93 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::Supcharg4Weekly < ::Form::Question
@prefix = "£"
@suffix = " every 4 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 98, 2024 => 97, 2025 => 95 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::SupchargBiWeekly < ::Form::Question
@prefix = "£"
@suffix = " every 2 weeks"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 98, 2024 => 97, 2025 => 95 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::SupchargMonthly < ::Form::Question
@prefix = "£"
@suffix = " every month"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 98, 2024 => 97, 2025 => 95 }.freeze

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

@ -13,6 +13,7 @@ class Form::Lettings::Questions::SupchargWeekly < ::Form::Question
@prefix = "£"
@suffix = " every week"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 98, 2024 => 97, 2025 => 95 }.freeze

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

@ -14,5 +14,6 @@ class Form::Lettings::Questions::Tcharge4Weekly < ::Form::Question
@requires_js = true
@fields_added = %w[brent scharge pscharge supcharg]
@hidden_in_check_answers = true
@strip_commas = true
end
end

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

@ -14,5 +14,6 @@ class Form::Lettings::Questions::TchargeBiWeekly < ::Form::Question
@requires_js = true
@fields_added = %w[brent scharge pscharge supcharg]
@hidden_in_check_answers = true
@strip_commas = true
end
end

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

@ -14,5 +14,6 @@ class Form::Lettings::Questions::TchargeMonthly < ::Form::Question
@requires_js = true
@fields_added = %w[brent scharge pscharge supcharg]
@hidden_in_check_answers = true
@strip_commas = true
end
end

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

@ -14,5 +14,6 @@ class Form::Lettings::Questions::TchargeWeekly < ::Form::Question
@requires_js = true
@fields_added = %w[brent scharge pscharge supcharg]
@hidden_in_check_answers = true
@strip_commas = true
end
end

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

@ -22,6 +22,7 @@ class Form::Lettings::Questions::Tshortfall < ::Form::Question
{ "label" => " every week for 53 weeks", "depends_on" => { "period" => 10 } },
]
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 100, 2024 => 99, 2025 => 97 }.freeze

3
app/models/form/question.rb

@ -8,7 +8,7 @@ class Form::Question
:top_guidance_partial, :bottom_guidance_partial, :prefix, :suffix,
:requires_js, :fields_added, :derived, :check_answers_card_number,
:unresolved_hint_text, :question_number, :hide_question_number_on_page,
:plain_label, :error_label
:plain_label, :error_label, :strip_commas
def initialize(id, hsh, page)
@id = id
@ -45,6 +45,7 @@ class Form::Question
@plain_label = hsh["plain_label"]
@error_label = hsh["error_label"]
@disable_clearing_if_not_routed_or_dynamic_answer_options = hsh["disable_clearing_if_not_routed_or_dynamic_answer_options"]
@strip_commas = hsh["strip_commas"] || false
end
end

1
app/models/form/sales/questions/buyer1_income.rb

@ -11,6 +11,7 @@ class Form::Sales::Questions::Buyer1Income < ::Form::Question
@prefix = "£"
@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]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 67, 2024 => 69, 2025 => 66 }.freeze

1
app/models/form/sales/questions/buyer2_income.rb

@ -11,6 +11,7 @@ class Form::Sales::Questions::Buyer2Income < ::Form::Question
@prefix = "£"
@check_answers_card_number = 2
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 69, 2024 => 71, 2025 => 68 }.freeze

1
app/models/form/sales/questions/deposit_amount.rb

@ -13,6 +13,7 @@ class Form::Sales::Questions::DepositAmount < ::Form::Question
@optional = optional
@top_guidance_partial = top_guidance_partial
@copy_key = copy_key
@strip_commas = true
end
def derived?(log)

1
app/models/form/sales/questions/deposit_discount.rb

@ -10,6 +10,7 @@ class Form::Sales::Questions::DepositDiscount < ::Form::Question
@prefix = "£"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@top_guidance_partial = "financial_calculations_shared_ownership"
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 96, 2024 => 97, 2025 => 86 }.freeze

1
app/models/form/sales/questions/grant.rb

@ -10,6 +10,7 @@ class Form::Sales::Questions::Grant < ::Form::Question
@prefix = "£"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@top_guidance_partial = "financial_calculations_discounted_ownership"
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 101, 2024 => 102, 2025 => 104 }.freeze

1
app/models/form/sales/questions/leasehold_charges.rb

@ -10,6 +10,7 @@ class Form::Sales::Questions::LeaseholdCharges < ::Form::Question
@copy_key = "sales.sale_information.leaseholdcharges.mscharge"
@ownershipsch = ownershipsch
@question_number = QUESTION_NUMBER_FROM_YEAR_AND_OWNERSHIP.fetch(form.start_date.year, QUESTION_NUMBER_FROM_YEAR_AND_OWNERSHIP.max_by { |k, _v| k }.last)[ownershipsch]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR_AND_OWNERSHIP = {

1
app/models/form/sales/questions/management_fee.rb

@ -9,6 +9,7 @@ class Form::Sales::Questions::ManagementFee < ::Form::Question
@width = 5
@prefix = "£"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2025 => 89 }.freeze

1
app/models/form/sales/questions/monthly_rent.rb

@ -8,6 +8,7 @@ class Form::Sales::Questions::MonthlyRent < ::Form::Question
@width = 5
@prefix = "£"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 97, 2024 => 98, 2025 => 87 }.freeze

1
app/models/form/sales/questions/monthly_rent_after_staircasing.rb

@ -9,6 +9,7 @@ class Form::Sales::Questions::MonthlyRentAfterStaircasing < ::Form::Question
@width = 5
@prefix = "£"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2025 => 101 }.freeze

1
app/models/form/sales/questions/monthly_rent_before_staircasing.rb

@ -9,6 +9,7 @@ class Form::Sales::Questions::MonthlyRentBeforeStaircasing < ::Form::Question
@width = 5
@prefix = "£"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2025 => 100 }.freeze

1
app/models/form/sales/questions/mortgage_amount.rb

@ -10,6 +10,7 @@ class Form::Sales::Questions::MortgageAmount < ::Form::Question
@ownershipsch = ownershipsch
@question_number = QUESTION_NUMBER_FROM_YEAR_AND_OWNERSHIP.fetch(form.start_date.year, QUESTION_NUMBER_FROM_YEAR_AND_OWNERSHIP.max_by { |k, _v| k }.last)[ownershipsch]
@top_guidance_partial = top_guidance_partial
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR_AND_OWNERSHIP = {

1
app/models/form/sales/questions/purchase_price.rb

@ -10,6 +10,7 @@ class Form::Sales::Questions::PurchasePrice < ::Form::Question
@ownership_sch = ownershipsch
@question_number = QUESTION_NUMBER_FROM_YEAR_AND_OWNERSHIP.fetch(form.start_date.year, QUESTION_NUMBER_FROM_YEAR_AND_OWNERSHIP.max_by { |k, _v| k }.last)[ownershipsch]
@top_guidance_partial = top_guidance_partial
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR_AND_OWNERSHIP = {

1
app/models/form/sales/questions/savings.rb

@ -9,6 +9,7 @@ class Form::Sales::Questions::Savings < ::Form::Question
@step = 10
@min = 0
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2023 => 72, 2024 => 74, 2025 => 71 }.freeze

1
app/models/form/sales/questions/service_charge.rb

@ -9,6 +9,7 @@ class Form::Sales::Questions::ServiceCharge < ::Form::Question
@prefix = "£"
@copy_key = "sales.sale_information.servicecharges.servicecharge"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
@strip_commas = true
end
QUESTION_NUMBER_FROM_YEAR = { 2025 => 88 }.freeze

1
app/models/form/sales/questions/value.rb

@ -10,6 +10,7 @@ class Form::Sales::Questions::Value < ::Form::Question
@prefix = "£"
@question_number = question_number_from_year[form.start_date.year] || question_number_from_year[question_number_from_year.keys.max]
@top_guidance_partial = "financial_calculations_shared_ownership"
@strip_commas = true
end
def question_number_from_year

2
app/models/validations/soft_validations.rb

@ -6,7 +6,7 @@ module Validations::SoftValidations
2 => OpenStruct.new(soft_min: 67, soft_max: 620, hard_min: 50, hard_max: 950),
3 => OpenStruct.new(soft_min: 80, soft_max: 480, hard_min: 40, hard_max: 990),
4 => OpenStruct.new(soft_min: 50, soft_max: 370, hard_min: 10, hard_max: 450),
5 => OpenStruct.new(soft_min: 50, soft_max: 380, hard_min: 10, hard_max: 690),
5 => OpenStruct.new(soft_min: 50, soft_max: 380, hard_min: 10, hard_max: 1000),
6 => OpenStruct.new(soft_min: 53, soft_max: 540, hard_min: 10, hard_max: 890),
7 => OpenStruct.new(soft_min: 47, soft_max: 460, hard_min: 10, hard_max: 1300),
8 => OpenStruct.new(soft_min: 54, soft_max: 460, hard_min: 10, hard_max: 2000),

6
docs/Gemfile.lock

@ -210,11 +210,11 @@ GEM
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
minitest (5.19.0)
nokogiri (1.18.8-arm64-darwin)
nokogiri (1.18.9-arm64-darwin)
racc (~> 1.4)
nokogiri (1.18.8-x86_64-darwin)
nokogiri (1.18.9-x86_64-darwin)
racc (~> 1.4)
nokogiri (1.18.8-x86_64-linux-gnu)
nokogiri (1.18.9-x86_64-linux-gnu)
racc (~> 1.4)
octokit (4.25.1)
faraday (>= 1, < 3)

13
docs/infrastructure.md

@ -57,7 +57,7 @@ Where to find the Infrastructure?
The infrastructure is managed as code.
In the terraform folder of the codebase, there will be dedicated sub-folders for each of the aforementioned environments, where all the infrastructure for them is defined.
## Deployment (Pipeline — Recommended)
## Production Deployment
The application is set up so that it can be deployed via GitHub actions. We use Git tags to mark releases. The only pre-requisite is that your GitHub account is added to our team.
@ -66,12 +66,13 @@ To deploy you need to:
1. Determine [previous version](https://github.com/communitiesuk/submit-social-housing-lettings-and-sales-data/tags), such as `v0.1.1`.
2. Create a [new release](https://github.com/communitiesuk/submit-social-housing-lettings-and-sales-data/releases/new) with subsequent version (e.g., `v0.1.2`). On this page, create a new tag with that version and generate release notes. Save as draft.
3. Post release notes on Slack.
4. Publish release.
5. Monitor alerting, logging and Sentry.
6. Post success message on Slack.
7. Tag tickets as ‘Released’ and move tickets to done on JIRA.
4. Ensure that there are no other pipelines running on the repo right now. If a staging deployment is running, it must complete before you can deploy to production.
5. Publish release. This will trigger the deployment pipeline.
6. Monitor alerting, logging and Sentry.
7. Post success message on Slack.
8. Tag tickets as ‘Released’ and move tickets to done on JIRA.
## CI/CD
## Staging Deployment
When a commit is made to `main` the following GitHub action jobs are triggered:

2
spec/models/lettings_log_derived_fields_spec.rb

@ -385,7 +385,7 @@ RSpec.describe LettingsLog, type: :model do
{
test_title: "correctly derives floats and weekly total charge",
fields_to_set: { supcharg: 100.12, pscharge: 100.13, scharge: 100.98, brent: 100.97 },
expected_values: { wsupchrg: 25.03, wpschrge: 25.03, wscharge: 25.24, wrent: 25.24, wtcharge: 100.55 },
expected_values: { wsupchrg: 25.03, wpschrge: 25.03, wscharge: 25.25, wrent: 25.24, wtcharge: 100.55 },
},
{
test_title: "correctly derives weekly care home charge when the letting is supported housing",

2
spec/models/validations/financial_validations_spec.rb

@ -877,7 +877,7 @@ RSpec.describe Validations::FinancialValidations do
context "when period is every 2 weeks" do
it "validates that total charge is at least 10 per week" do
record.period = 2
record.tcharge = 19.99
record.tcharge = 19.98
financial_validator.validate_rent_amount(record)
expect(record.errors["tcharge"])
.to include(match I18n.t("validations.lettings.financial.tcharge.under_10"))

Loading…
Cancel
Save