diff --git a/app/components/bulk_upload_error_row_component.html.erb b/app/components/bulk_upload_error_row_component.html.erb
index 65e38613f..4bd303957 100644
--- a/app/components/bulk_upload_error_row_component.html.erb
+++ b/app/components/bulk_upload_error_row_component.html.erb
@@ -13,7 +13,7 @@
<% if critical_errors.any? %>
Critical errors
These errors must be fixed to complete your logs.
- <%= govuk_table do |table| %>
+ <%= govuk_table(html_attributes: { class: potential_errors.any? ? "" : "no-bottom-border" }) do |table| %>
<%= table.with_head do |head| %>
<% head.with_row do |row| %>
<% row.with_cell(header: true, text: "Cell") %>
@@ -39,7 +39,7 @@
<% if potential_errors.any? %>
Potential errors
The following groups of cells might have conflicting data. Check the answers and fix any incorrect data.
If the answers are correct, fix the critical errors and reupload the file. You'll need to confirm that the following data is correct when the file only contains potential errors.
- <%= govuk_table do |table| %>
+ <%= govuk_table(html_attributes: { class: "no-bottom-border" }) do |table| %>
<%= table.with_head do |head| %>
<% head.with_row do |row| %>
<% row.with_cell(header: true, text: "Cell") %>
@@ -49,24 +49,24 @@
<% end %>
<% end %>
- <%= table.with_body do |body| %>
- <% potential_errors.group_by(&:error).each do |error_message, errors| %>
- <% errors.each_with_index do |error, index| %>
- <% row_class = "grouped-rows" %>
- <% row_class += " first-row" if index.zero? %>
- <% row_class += " last-row" if index == errors.size - 1 %>
- <% body.with_row(html_attributes: { class: row_class }) do |row| %>
- <% row.with_cell(text: error.cell) %>
- <% row.with_cell(text: question_for_field(error.field), html_attributes: { class: "govuk-!-width-one-half" }) %>
- <% if index == 0 %>
- <% row.with_cell(text: error_message.html_safe, rowspan: errors.size, html_attributes: { class: "govuk-!-font-weight-bold govuk-!-width-one-half grouped-multirow-cell" }) %>
- <% end %>
- <% row.with_cell(text: error.field.humanize) %>
+ <%= table.with_body do |body| %>
+ <% potential_errors.group_by(&:error).each_with_index do |(error_message, errors), group_index| %>
+ <% total_groups = potential_errors.group_by(&:error).size %>
+ <% errors.each_with_index do |error, index| %>
+ <% row_class = row_classes(index, errors.size) %>
+ <% body.with_row(html_attributes: { class: row_class }) do |row| %>
+ <% row.with_cell(text: error.cell) %>
+ <% row.with_cell(text: question_for_field(error.field), html_attributes: { class: "govuk-!-width-one-half" }) %>
+ <% if index == 0 %>
+ <% cell_class = cell_classes(group_index, total_groups) %>
+ <% row.with_cell(text: error_message.html_safe, rowspan: errors.size, html_attributes: { class: cell_class }) %>
<% end %>
+ <% row.with_cell(text: error.field.humanize) %>
<% end %>
<% end %>
<% end %>
<% end %>
+ <% end %>
<% end %>
diff --git a/app/components/bulk_upload_error_row_component.rb b/app/components/bulk_upload_error_row_component.rb
index 887eef10c..1cb4de9d8 100644
--- a/app/components/bulk_upload_error_row_component.rb
+++ b/app/components/bulk_upload_error_row_component.rb
@@ -62,4 +62,17 @@ class BulkUploadErrorRowComponent < ViewComponent::Base
def sales?
bulk_upload.log_type == "sales"
end
+
+ def row_classes(index, errors_size)
+ row_class = "grouped-rows"
+ row_class += " first-row" if index.zero?
+ row_class += " last-row" if index == errors_size - 1
+ row_class
+ end
+
+ def cell_classes(group_index, total_groups)
+ cell_class = "govuk-!-font-weight-bold govuk-!-width-one-half"
+ cell_class += " grouped-multirow-cell" unless group_index == total_groups - 1
+ cell_class
+ end
end
diff --git a/app/frontend/styles/_bulk-uploads.scss b/app/frontend/styles/_bulk-uploads.scss
index eceae6565..65213ee82 100644
--- a/app/frontend/styles/_bulk-uploads.scss
+++ b/app/frontend/styles/_bulk-uploads.scss
@@ -12,6 +12,11 @@
border-bottom: 1px solid #b1b4b6;
}
+.no-bottom-border,
+.no-bottom-border > tbody > tr:last-of-type td {
+ border-bottom: none;
+}
+
.text-normal-break {
white-space: normal;
word-break: break-all;
diff --git a/app/models/form/sales/pages/buyer1_income.rb b/app/models/form/sales/pages/buyer1_income.rb
index 943296d2b..657cf8807 100644
--- a/app/models/form/sales/pages/buyer1_income.rb
+++ b/app/models/form/sales/pages/buyer1_income.rb
@@ -2,6 +2,7 @@ class Form::Sales::Pages::Buyer1Income < ::Form::Page
def initialize(id, hsh, subsection)
super
@id = "buyer_1_income"
+ @copy_key = "sales.income_benefits_and_savings.buyer_1_income"
end
def questions
diff --git a/app/models/form/sales/pages/buyer1_income_max_value_check.rb b/app/models/form/sales/pages/buyer1_income_max_value_check.rb
index b093baa2a..55599ff26 100644
--- a/app/models/form/sales/pages/buyer1_income_max_value_check.rb
+++ b/app/models/form/sales/pages/buyer1_income_max_value_check.rb
@@ -6,8 +6,9 @@ class Form::Sales::Pages::Buyer1IncomeMaxValueCheck < ::Form::Page
"income1_over_soft_max?" => true,
},
]
+ @copy_key = "sales.soft_validations.income1_value_check.max"
@title_text = {
- "translation" => "soft_validations.income.over_soft_max_for_la_buyer_1",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [
{
"key" => "field_formatted_as_currency",
diff --git a/app/models/form/sales/pages/buyer1_income_min_value_check.rb b/app/models/form/sales/pages/buyer1_income_min_value_check.rb
index 2feb4f887..9fc85bb76 100644
--- a/app/models/form/sales/pages/buyer1_income_min_value_check.rb
+++ b/app/models/form/sales/pages/buyer1_income_min_value_check.rb
@@ -6,8 +6,9 @@ class Form::Sales::Pages::Buyer1IncomeMinValueCheck < ::Form::Page
"income1_under_soft_min?" => true,
},
]
+ @copy_key = "sales.soft_validations.income1_value_check.min"
@title_text = {
- "translation" => "soft_validations.income.under_soft_min_for_economic_status.title_text",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [
{
"key" => "field_formatted_as_currency",
@@ -22,7 +23,7 @@ class Form::Sales::Pages::Buyer1IncomeMinValueCheck < ::Form::Page
],
}
@informative_text = {
- "translation" => "soft_validations.income.under_soft_min_for_economic_status.hint_text",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.informative_text",
"arguments" => [],
}
end
diff --git a/app/models/form/sales/pages/buyer2_income.rb b/app/models/form/sales/pages/buyer2_income.rb
index f865418a7..fd35d52cc 100644
--- a/app/models/form/sales/pages/buyer2_income.rb
+++ b/app/models/form/sales/pages/buyer2_income.rb
@@ -2,6 +2,7 @@ class Form::Sales::Pages::Buyer2Income < ::Form::Page
def initialize(id, hsh, subsection)
super
@id = "buyer_2_income"
+ @copy_key = "sales.income_benefits_and_savings.buyer_2_income"
@depends_on = [{
"joint_purchase?" => true,
}]
diff --git a/app/models/form/sales/pages/buyer2_income_max_value_check.rb b/app/models/form/sales/pages/buyer2_income_max_value_check.rb
index 894da8799..deece885e 100644
--- a/app/models/form/sales/pages/buyer2_income_max_value_check.rb
+++ b/app/models/form/sales/pages/buyer2_income_max_value_check.rb
@@ -6,8 +6,9 @@ class Form::Sales::Pages::Buyer2IncomeMaxValueCheck < ::Form::Page
"income2_over_soft_max?" => true,
},
]
+ @copy_key = "sales.soft_validations.income2_value_check.max"
@title_text = {
- "translation" => "soft_validations.income.over_soft_max_for_la_buyer_2",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [
{
"key" => "field_formatted_as_currency",
diff --git a/app/models/form/sales/pages/buyer2_income_min_value_check.rb b/app/models/form/sales/pages/buyer2_income_min_value_check.rb
index adef17843..a7b68cd10 100644
--- a/app/models/form/sales/pages/buyer2_income_min_value_check.rb
+++ b/app/models/form/sales/pages/buyer2_income_min_value_check.rb
@@ -6,8 +6,9 @@ class Form::Sales::Pages::Buyer2IncomeMinValueCheck < ::Form::Page
"income2_under_soft_min?" => true,
},
]
+ @copy_key = "sales.soft_validations.income2_value_check.min"
@title_text = {
- "translation" => "soft_validations.income.under_soft_min_for_economic_status.title_text",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [
{
"key" => "field_formatted_as_currency",
@@ -22,7 +23,7 @@ class Form::Sales::Pages::Buyer2IncomeMinValueCheck < ::Form::Page
],
}
@informative_text = {
- "translation" => "soft_validations.income.under_soft_min_for_economic_status.hint_text",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.informative_text",
"arguments" => [],
}
end
diff --git a/app/models/form/sales/pages/combined_income_max_value_check.rb b/app/models/form/sales/pages/combined_income_max_value_check.rb
index 82f2e4469..1cd1fd851 100644
--- a/app/models/form/sales/pages/combined_income_max_value_check.rb
+++ b/app/models/form/sales/pages/combined_income_max_value_check.rb
@@ -6,8 +6,9 @@ class Form::Sales::Pages::CombinedIncomeMaxValueCheck < ::Form::Page
"combined_income_over_soft_max?" => true,
},
]
+ @copy_key = "sales.soft_validations.combined_income_value_check"
@title_text = {
- "translation" => "soft_validations.income.over_soft_max_for_la_combined",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [
{
"key" => "field_formatted_as_currency",
diff --git a/app/models/form/sales/pages/deposit_value_check.rb b/app/models/form/sales/pages/deposit_value_check.rb
index cca25a43b..cbec4b031 100644
--- a/app/models/form/sales/pages/deposit_value_check.rb
+++ b/app/models/form/sales/pages/deposit_value_check.rb
@@ -1,12 +1,13 @@
class Form::Sales::Pages::DepositValueCheck < ::Form::Page
def initialize(id, hsh, subsection, joint_purchase:)
super(id, hsh, subsection)
+ @copy_key = "sales.soft_validations.deposit_value_check.#{joint_purchase ? 'joint_purchase' : 'not_joint_purchase'}"
@informative_text = {
- "translation" => "soft_validations.deposit.hint_text",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.informative_text",
"arguments" => [],
}
@title_text = {
- "translation" => "soft_validations.deposit.title_text.#{joint_purchase ? 'two' : 'one'}",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [
{
"key" => "field_formatted_as_currency",
diff --git a/app/models/form/sales/pages/housing_benefits.rb b/app/models/form/sales/pages/housing_benefits.rb
index 90d721ad8..c40dff5f4 100644
--- a/app/models/form/sales/pages/housing_benefits.rb
+++ b/app/models/form/sales/pages/housing_benefits.rb
@@ -2,6 +2,7 @@ class Form::Sales::Pages::HousingBenefits < ::Form::Page
def initialize(id, hsh, subsection, joint_purchase:)
super(id, hsh, subsection)
@joint_purchase = joint_purchase
+ @copy_key = "sales.income_benefits_and_savings.housing_benefits.#{joint_purchase ? 'joint_purchase' : 'not_joint_purchase'}"
end
def questions
diff --git a/app/models/form/sales/pages/mortgage_value_check.rb b/app/models/form/sales/pages/mortgage_value_check.rb
index 949cea27f..bfab9a014 100644
--- a/app/models/form/sales/pages/mortgage_value_check.rb
+++ b/app/models/form/sales/pages/mortgage_value_check.rb
@@ -2,10 +2,10 @@ class Form::Sales::Pages::MortgageValueCheck < ::Form::Page
def initialize(id, hsh, subsection, person_index = nil)
super(id, hsh, subsection)
@depends_on = depends_on
- @informative_text = {}
@person_index = person_index
+ @copy_key = "sales.soft_validations.mortgage_value_check"
@title_text = {
- "translation" => "soft_validations.mortgage.title_text",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [
{
"key" => "field_formatted_as_currency",
@@ -15,7 +15,7 @@ class Form::Sales::Pages::MortgageValueCheck < ::Form::Page
],
}
@informative_text = {
- "translation" => "soft_validations.mortgage.hint_text",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.informative_text",
"arguments" => [],
}
end
diff --git a/app/models/form/sales/pages/previous_ownership.rb b/app/models/form/sales/pages/previous_ownership.rb
index 50711baf7..ac7a17787 100644
--- a/app/models/form/sales/pages/previous_ownership.rb
+++ b/app/models/form/sales/pages/previous_ownership.rb
@@ -3,6 +3,7 @@ class Form::Sales::Pages::PreviousOwnership < ::Form::Page
super(id, hsh, subsection)
@joint_purchase = joint_purchase
@depends_on = [{ "joint_purchase?" => @joint_purchase }]
+ @copy_key = "sales.income_benefits_and_savings.prevown.#{joint_purchase ? 'joint_purchase' : 'not_joint_purchase'}"
end
def questions
diff --git a/app/models/form/sales/pages/savings.rb b/app/models/form/sales/pages/savings.rb
index 7a13dbe34..64a2b1ecf 100644
--- a/app/models/form/sales/pages/savings.rb
+++ b/app/models/form/sales/pages/savings.rb
@@ -2,6 +2,7 @@ class Form::Sales::Pages::Savings < ::Form::Page
def initialize(id, hsh, subsection, joint_purchase:)
super(id, hsh, subsection)
@joint_purchase = joint_purchase
+ @copy_key = "sales.income_benefits_and_savings.savings.#{joint_purchase ? 'joint_purchase' : 'not_joint_purchase'}"
end
def questions
diff --git a/app/models/form/sales/pages/savings_value_check.rb b/app/models/form/sales/pages/savings_value_check.rb
index bcb95abc9..00be6decd 100644
--- a/app/models/form/sales/pages/savings_value_check.rb
+++ b/app/models/form/sales/pages/savings_value_check.rb
@@ -1,8 +1,9 @@
class Form::Sales::Pages::SavingsValueCheck < ::Form::Page
def initialize(id, hsh, subsection, joint_purchase:)
super(id, hsh, subsection)
+ @copy_key = "sales.soft_validations.savings_value_check.#{joint_purchase ? 'joint_purchase' : 'not_joint_purchase'}"
@title_text = {
- "translation" => "soft_validations.savings.title_text.#{joint_purchase ? 'two' : 'one'}",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.title_text",
"arguments" => [
{
"key" => "field_formatted_as_currency",
@@ -12,7 +13,7 @@ class Form::Sales::Pages::SavingsValueCheck < ::Form::Page
],
}
@informative_text = {
- "translation" => "soft_validations.savings.hint_text",
+ "translation" => "forms.#{form.start_date.year}.#{@copy_key}.informative_text",
"arguments" => [],
}
@joint_purchase = joint_purchase
diff --git a/app/models/form/sales/questions/buyer1_income.rb b/app/models/form/sales/questions/buyer1_income.rb
index 106f040f8..3f1159a8f 100644
--- a/app/models/form/sales/questions/buyer1_income.rb
+++ b/app/models/form/sales/questions/buyer1_income.rb
@@ -2,9 +2,7 @@ class Form::Sales::Questions::Buyer1Income < ::Form::Question
def initialize(id, hsh, page)
super
@id = "income1"
- @check_answer_label = "Buyer 1’s gross annual income"
- @header = "Buyer 1’s gross annual income"
- @hint_text = "Provide the gross annual income (i.e. salary before tax) plus the annual amount of benefits, Universal Credit or pensions, and income from investments."
+ @copy_key = "sales.income_benefits_and_savings.buyer_1_income.income1"
@type = "numeric"
@min = 0
@max = 999_999
diff --git a/app/models/form/sales/questions/buyer1_income_known.rb b/app/models/form/sales/questions/buyer1_income_known.rb
index b00b45475..46c1f4caa 100644
--- a/app/models/form/sales/questions/buyer1_income_known.rb
+++ b/app/models/form/sales/questions/buyer1_income_known.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::Buyer1IncomeKnown < ::Form::Question
def initialize(id, hsh, page)
super
@id = "income1nk"
- @check_answer_label = "Buyer 1’s gross annual income known?"
- @header = "Do you know buyer 1’s annual income?"
+ @copy_key = "sales.income_benefits_and_savings.buyer_1_income.income1nk"
@type = "radio"
@answer_options = ANSWER_OPTIONS
@conditional_for = {
diff --git a/app/models/form/sales/questions/buyer1_income_value_check.rb b/app/models/form/sales/questions/buyer1_income_value_check.rb
index 63e3b6478..410bd53d5 100644
--- a/app/models/form/sales/questions/buyer1_income_value_check.rb
+++ b/app/models/form/sales/questions/buyer1_income_value_check.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::Buyer1IncomeValueCheck < ::Form::Question
def initialize(id, hsh, page, check_answers_card_number:)
super(id, hsh, page)
@id = "income1_value_check"
- @check_answer_label = "Buyer 1 income confirmation"
- @header = "Are you sure this is correct?"
+ @copy_key = "sales.soft_validations.income1_value_check"
@type = "interruption_screen"
@answer_options = {
"0" => { "value" => "Yes" },
diff --git a/app/models/form/sales/questions/buyer1_mortgage.rb b/app/models/form/sales/questions/buyer1_mortgage.rb
index eaa2a07fa..d2a94f6b5 100644
--- a/app/models/form/sales/questions/buyer1_mortgage.rb
+++ b/app/models/form/sales/questions/buyer1_mortgage.rb
@@ -2,8 +2,6 @@ class Form::Sales::Questions::Buyer1Mortgage < ::Form::Question
def initialize(id, hsh, page)
super
@id = "inc1mort"
- @check_answer_label = "Buyer 1’s income used for mortgage application"
- @header = "Was buyer 1’s income used for a mortgage application?"
@type = "radio"
@answer_options = ANSWER_OPTIONS
@check_answers_card_number = 1
diff --git a/app/models/form/sales/questions/buyer2_income.rb b/app/models/form/sales/questions/buyer2_income.rb
index cff25b344..39777f870 100644
--- a/app/models/form/sales/questions/buyer2_income.rb
+++ b/app/models/form/sales/questions/buyer2_income.rb
@@ -2,10 +2,8 @@ class Form::Sales::Questions::Buyer2Income < ::Form::Question
def initialize(id, hsh, page)
super
@id = "income2"
- @check_answer_label = "Buyer 2’s gross annual income"
- @header = "Buyer 2’s gross annual income"
+ @copy_key = "sales.income_benefits_and_savings.buyer_2_income.income2"
@type = "numeric"
- @hint_text = "Provide the gross annual income (i.e. salary before tax) plus the annual amount of benefits, Universal Credit or pensions, and income from investments."
@min = 0
@max = 999_999
@step = 1
diff --git a/app/models/form/sales/questions/buyer2_income_known.rb b/app/models/form/sales/questions/buyer2_income_known.rb
index b3cc5f33a..0b125f2af 100644
--- a/app/models/form/sales/questions/buyer2_income_known.rb
+++ b/app/models/form/sales/questions/buyer2_income_known.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::Buyer2IncomeKnown < ::Form::Question
def initialize(id, hsh, page)
super
@id = "income2nk"
- @check_answer_label = "Buyer 2’s gross annual income known?"
- @header = "Do you know buyer 2’s annual income?"
+ @copy_key = "sales.income_benefits_and_savings.buyer_2_income.income2"
@type = "radio"
@answer_options = ANSWER_OPTIONS
@conditional_for = {
diff --git a/app/models/form/sales/questions/buyer2_income_value_check.rb b/app/models/form/sales/questions/buyer2_income_value_check.rb
index 37b6cb380..6b0bab5c2 100644
--- a/app/models/form/sales/questions/buyer2_income_value_check.rb
+++ b/app/models/form/sales/questions/buyer2_income_value_check.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::Buyer2IncomeValueCheck < ::Form::Question
def initialize(id, hsh, page, check_answers_card_number:)
super(id, hsh, page)
@id = "income2_value_check"
- @check_answer_label = "Buyer 2 income confirmation"
- @header = "Are you sure this is correct?"
+ @copy_key = "sales.soft_validations.income2_value_check"
@type = "interruption_screen"
@answer_options = {
"0" => { "value" => "Yes" },
diff --git a/app/models/form/sales/questions/buyer2_mortgage.rb b/app/models/form/sales/questions/buyer2_mortgage.rb
index 42b8cda06..415d5b714 100644
--- a/app/models/form/sales/questions/buyer2_mortgage.rb
+++ b/app/models/form/sales/questions/buyer2_mortgage.rb
@@ -2,8 +2,6 @@ class Form::Sales::Questions::Buyer2Mortgage < ::Form::Question
def initialize(id, hsh, page)
super
@id = "inc2mort"
- @check_answer_label = "Buyer 2’s income used for mortgage application"
- @header = "Was buyer 2’s income used for a mortgage application?"
@type = "radio"
@answer_options = ANSWER_OPTIONS
@check_answers_card_number = 2
diff --git a/app/models/form/sales/questions/combined_income_value_check.rb b/app/models/form/sales/questions/combined_income_value_check.rb
index 47cafeaa2..c2688ffe5 100644
--- a/app/models/form/sales/questions/combined_income_value_check.rb
+++ b/app/models/form/sales/questions/combined_income_value_check.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::CombinedIncomeValueCheck < ::Form::Question
def initialize(id, hsh, page, check_answers_card_number:)
super(id, hsh, page)
@id = "combined_income_value_check"
- @check_answer_label = "Combined income confirmation"
- @header = "Are you sure this is correct?"
+ @copy_key = "sales.soft_validations.combined_income_value_check"
@type = "interruption_screen"
@answer_options = {
"0" => { "value" => "Yes" },
diff --git a/app/models/form/sales/questions/deposit_value_check.rb b/app/models/form/sales/questions/deposit_value_check.rb
index f3cd27e3a..f8d403d9c 100644
--- a/app/models/form/sales/questions/deposit_value_check.rb
+++ b/app/models/form/sales/questions/deposit_value_check.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::DepositValueCheck < ::Form::Question
def initialize(id, hsh, page)
super
@id = "deposit_value_check"
- @check_answer_label = "Deposit confirmation"
- @header = "Are you sure that the deposit is this much higher than the buyer's savings?"
+ @copy_key = "sales.soft_validations.deposit_value_check"
@type = "interruption_screen"
@answer_options = {
"0" => { "value" => "Yes" },
diff --git a/app/models/form/sales/questions/housing_benefits.rb b/app/models/form/sales/questions/housing_benefits.rb
index 70bc4ba2e..d7a670f2e 100644
--- a/app/models/form/sales/questions/housing_benefits.rb
+++ b/app/models/form/sales/questions/housing_benefits.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::HousingBenefits < ::Form::Question
def initialize(id, hsh, page, joint_purchase:)
super(id, hsh, page)
@id = "hb"
- @check_answer_label = "Housing-related benefits #{joint_purchase ? 'buyers' : 'buyer'} received before buying this property"
- @header = "#{joint_purchase ? 'Were the buyers' : 'Was the buyer'} receiving any of these housing-related benefits immediately before buying this property?"
+ @copy_key = "sales.income_benefits_and_savings.housing_benefits.#{joint_purchase ? 'joint_purchase' : 'not_joint_purchase'}"
@type = "radio"
@answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
diff --git a/app/models/form/sales/questions/mortgage_value_check.rb b/app/models/form/sales/questions/mortgage_value_check.rb
index 39079d40e..99307ab38 100644
--- a/app/models/form/sales/questions/mortgage_value_check.rb
+++ b/app/models/form/sales/questions/mortgage_value_check.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::MortgageValueCheck < ::Form::Question
def initialize(id, hsh, page)
super
@id = "mortgage_value_check"
- @check_answer_label = "Mortgage confirmation"
- @header = "Are you sure that the mortgage is more than 5 times the income used for the mortgage application?"
+ @copy_key = "sales.soft_validations.mortgage_value_check"
@type = "interruption_screen"
@answer_options = {
"0" => { "value" => "Yes" },
diff --git a/app/models/form/sales/questions/prevown.rb b/app/models/form/sales/questions/prevown.rb
index f913f950b..ecd6c9071 100644
--- a/app/models/form/sales/questions/prevown.rb
+++ b/app/models/form/sales/questions/prevown.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::Prevown < ::Form::Question
def initialize(id, hsh, page, joint_purchase:)
super(id, hsh, page)
@id = "prevown"
- @check_answer_label = I18n.t("check_answer_labels.prevown", count: joint_purchase ? 2 : 1)
- @header = I18n.t("questions.prevown", count: joint_purchase ? 2 : 1)
+ @copy_key = "sales.income_benefits_and_savings.prevown.#{joint_purchase ? 'joint_purchase' : 'not_joint_purchase'}"
@type = "radio"
@answer_options = ANSWER_OPTIONS
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
diff --git a/app/models/form/sales/questions/prevshared.rb b/app/models/form/sales/questions/prevshared.rb
index 018f57faa..f4ced14b9 100644
--- a/app/models/form/sales/questions/prevshared.rb
+++ b/app/models/form/sales/questions/prevshared.rb
@@ -2,11 +2,8 @@ class Form::Sales::Questions::Prevshared < ::Form::Question
def initialize(id, hsh, page)
super
@id = "prevshared"
- @check_answer_label = "Previous property shared ownership?"
- @header = "Was the previous property under shared ownership?"
@type = "radio"
@answer_options = ANSWER_OPTIONS
- @hint_text = "For any buyer"
@question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max]
end
diff --git a/app/models/form/sales/questions/savings.rb b/app/models/form/sales/questions/savings.rb
index 82b8e0f87..bb1f939a5 100644
--- a/app/models/form/sales/questions/savings.rb
+++ b/app/models/form/sales/questions/savings.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::Savings < ::Form::Question
def initialize(id, hsh, page, joint_purchase:)
super(id, hsh, page)
@id = "savings"
- @check_answer_label = "#{joint_purchase ? 'Buyers’' : 'Buyer’s'} total savings before any deposit paid"
- @header = "Enter their total savings to the nearest £10"
+ @copy_key = "sales.income_benefits_and_savings.savings.#{joint_purchase ? 'joint_purchase' : 'not_joint_purchase'}.savings"
@type = "numeric"
@width = 5
@prefix = "£"
diff --git a/app/models/form/sales/questions/savings_nk.rb b/app/models/form/sales/questions/savings_nk.rb
index 931ba835a..3c7e115f4 100644
--- a/app/models/form/sales/questions/savings_nk.rb
+++ b/app/models/form/sales/questions/savings_nk.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::SavingsNk < ::Form::Question
def initialize(id, hsh, page, joint_purchase:)
super(id, hsh, page)
@id = "savingsnk"
- @check_answer_label = "#{joint_purchase ? 'Buyers’' : 'Buyer’s'} total savings known?"
- @header = "Do you know how much the #{joint_purchase ? 'buyers' : 'buyer'} had in savings before they paid any deposit for the property?"
+ @copy_key = "sales.income_benefits_and_savings.savings.#{joint_purchase ? 'joint_purchase' : 'not_joint_purchase'}.savingsnk"
@type = "radio"
@answer_options = ANSWER_OPTIONS
@conditional_for = {
diff --git a/app/models/form/sales/questions/savings_value_check.rb b/app/models/form/sales/questions/savings_value_check.rb
index bcd16827a..f547969bf 100644
--- a/app/models/form/sales/questions/savings_value_check.rb
+++ b/app/models/form/sales/questions/savings_value_check.rb
@@ -2,8 +2,7 @@ class Form::Sales::Questions::SavingsValueCheck < ::Form::Question
def initialize(id, hsh, page)
super
@id = "savings_value_check"
- @check_answer_label = "Savings confirmation"
- @header = "Are you sure the savings are higher than £100,000?"
+ @copy_key = "sales.soft_validations.savings_value_check"
@type = "interruption_screen"
@answer_options = {
"0" => { "value" => "Yes" },
diff --git a/app/models/forms/bulk_upload_lettings/guidance.rb b/app/models/forms/bulk_upload_lettings/guidance.rb
index dc0de3271..b2fcf947e 100644
--- a/app/models/forms/bulk_upload_lettings/guidance.rb
+++ b/app/models/forms/bulk_upload_lettings/guidance.rb
@@ -4,11 +4,18 @@ module Forms
include ActiveModel::Model
include ActiveModel::Attributes
include Rails.application.routes.url_helpers
+ include CollectionTimeHelper
attribute :year, :integer
attribute :referrer
attribute :organisation_id, :integer
+ def initialize(params)
+ super(params)
+
+ self.year = current_collection_start_year if year.nil?
+ end
+
def view_path
"bulk_upload_shared/guidance"
end
diff --git a/app/models/forms/bulk_upload_sales/guidance.rb b/app/models/forms/bulk_upload_sales/guidance.rb
index be61ef650..80cfc5143 100644
--- a/app/models/forms/bulk_upload_sales/guidance.rb
+++ b/app/models/forms/bulk_upload_sales/guidance.rb
@@ -4,11 +4,18 @@ module Forms
include ActiveModel::Model
include ActiveModel::Attributes
include Rails.application.routes.url_helpers
+ include CollectionTimeHelper
attribute :year, :integer
attribute :referrer
attribute :organisation_id, :integer
+ def initialize(params)
+ super(params)
+
+ self.year = current_collection_start_year if year.nil?
+ end
+
def view_path
"bulk_upload_shared/guidance"
end
diff --git a/app/services/bulk_upload/lettings/year2024/row_parser.rb b/app/services/bulk_upload/lettings/year2024/row_parser.rb
index a40094e26..a7eb96c61 100644
--- a/app/services/bulk_upload/lettings/year2024/row_parser.rb
+++ b/app/services/bulk_upload/lettings/year2024/row_parser.rb
@@ -618,7 +618,7 @@ private
end
def key_address_fields_provided?
- field_17.present? && field_19.present? && field_21.present? && field_22.present?
+ field_17.present? && field_19.present? && postcode_full.present?
end
def validate_address_fields
@@ -1355,7 +1355,7 @@ private
end
def postcode_full
- "#{field_21} #{field_22}" if field_21 && field_22
+ [field_21, field_22].compact_blank.join(" ") if field_21 || field_22
end
def owning_organisation
diff --git a/app/services/bulk_upload/sales/year2024/row_parser.rb b/app/services/bulk_upload/sales/year2024/row_parser.rb
index bbb9fad49..35984a045 100644
--- a/app/services/bulk_upload/sales/year2024/row_parser.rb
+++ b/app/services/bulk_upload/sales/year2024/row_parser.rb
@@ -616,7 +616,7 @@ private
end
def key_address_fields_provided?
- field_23.present? && field_25.present? && field_27.present? && field_28.present?
+ field_23.present? && field_25.present? && postcode_full.present?
end
def validate_address_fields
@@ -1074,7 +1074,7 @@ private
end
def postcode_full
- "#{field_27} #{field_28}" if field_27 && field_28
+ [field_27, field_28].compact_blank.join(" ") if field_27 || field_28
end
def ppostcode_full
diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc
index 9cd4bba71..8e0af1b34 100644
--- a/config/credentials.yml.enc
+++ b/config/credentials.yml.enc
@@ -1 +1 @@
-QGn9IiI91BaO4IGAtfy92FrNP46X9T2jJErRv+o/PRG9LrimEGeuOE+FwhArKZQ5cTipaDqo8u9Ajv45Kitv3c0GynOOvz0r3OjPRHO/p4hW8BFWQDv581cWWPsyZT2JO51zZ5LnwNFvWrjEB2q49YESgtfADPkJWmtx/By5Cg2/PVIRxvhGKOnheme5cih050wqg/43BdiF0PD9FDTZXJDLJg/QQ8nQYkvQe2jN4nM4mTVpkQkmzDKgGknmUWFfW3qWFzlsdMkdkPdeP9wLnJVbFTeyaaJT3wv6l19d2rKqo8iVvacdaQjRev+LVXqOsNAjVHwcPNQVq9s8pxG24HLk3aQ14Eyjf6tHAuZAV4jLnNqQtBQ0AIldWeOl6SKmlTom1P1tcLp9KpajEADplmWSwUktIGmaakFjk/ApYaUBiYTku2iLHMrT/xSc3jPj5W/ZggeJ0Ij6nuGYE1cmBxWGxda9PzOrDP8coEK9vPHiNeDDM1RoukVmf8gwDmshILi5EwIAsO2gJXM1wtPYMu41+H4/y3c0GIwgfv9QP11q+nqhG1MMcOrAUKGhypAS+M+uLwfGQudfQDKP9Zv3VCnOk3mkKlpIzMMD4UdJxQeE/8sfwIsEhWggEo3oa93ptbRdvJ7YYcVvmMmkVBxk0KWFprl4i/BkFHLWrKNl5LBOGA==--ziMOTnYBB5TDyXYU--3FJMs8e6R8lheqcqB8p8uQ==
\ No newline at end of file
+M2+y4Ll2PwjN9IiCvliQ5Ytiy+/9bSepV2siwg6hvttLc63q0W4hbNobseAZAYqWLajrnJ7lm9AfT8CuBreHtwFsdQ/HV8NPrvzLB/P+X15MKLtb1Sg7bNjtW24uoE3zYrWILecpNygLc1ZXxgjka3yjc7XdV7MA3NR2/2zvkGREJvjbJlEn7036CWnNfN7PD0S57O1z+LqilrrhecWAmGeJRU2Ve2UZNoUExz865ovpk1enGReiU5+0jlNTIK3SCc75HH3grET6HkAbzsZvC763OkEkEQGVJeaytQ2cGkyk8t98nqGRq6fK9uAwKyGh6KwHH8BT++OOF3Re4Uf2A9boFdJ5AOwuV7ZK+OonPu7x/bThRmb+Sl057+L1pSrpILvFUzA3K8k34G9ZMHMLIX0/rHLEav+ToFFwBxARleiUdSgEv9txP0wU+7fPyuJlHJb7CIrC9dRQIeyM9RAIvxZYhP2KrTqm9eEyCJNttAWpYnXfnoxgbQEoQw94KOal/i26bK09TZNwv10oTYZqxB6PqfsQQ9wVIesO9v6uK3HQ2jVXeCb4caj1HWFOjFLhcDoAEFe6DUmjSdxf2tDQ90pwQKQ7IWi9jPOOQSVQ7VoCc1uD3cImDjsY/04sGbCdSpGt53E3Rn9UCGHdVhzzOXRhU4wQLBFEFin79KJ7q0m71jesGEpVNKI2s8aC+Ux8btSBu92JLS4b9zZHT13D729CW2T8--EZ5GxuRKaFfGdzCE--OZ1EwaObJ4ZF59N0JcJ7Dg==
\ No newline at end of file
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 731099eba..7cff7aae7 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -692,13 +692,6 @@ en:
message: "Net income is lower than expected based on the household’s working situation. Are you sure this is correct?"
in_soft_max_range:
message: "Net income is higher than expected based on the household’s working situation. Are you sure this is correct?"
- income:
- under_soft_min_for_economic_status:
- title_text: "You told us income was %{income}."
- hint_text: "This is less than we would expect for someone in this working situation."
- over_soft_max_for_la_buyer_1: "You told us the income of buyer 1 is %{income}. This seems high. Are you sure this is correct?"
- over_soft_max_for_la_buyer_2: "You told us the income of buyer 2 is %{income}. This seems high. Are you sure this is correct?"
- over_soft_max_for_la_combined: "You told us the combined income of this household is %{combined_income}. This seems high. Are you sure this is correct?"
rent:
outside_range_title: "You told us the rent is %{brent}."
informative_text: "This is %{higher_or_lower} than we would expect."
@@ -761,24 +754,11 @@ Make sure these answers are correct."
percentage_discount_value:
title_text: "You told us that the percentage discount is %{discount}."
hint_text: "This is higher than we would expect."
- savings:
- title_text:
- one: "You told us the buyer’s savings were %{savings}."
- two: "You told us the buyers’ savings were %{savings}."
- hint_text: "This is higher than we would expect."
- deposit:
- title_text:
- one: "You told us the buyer’s deposit was %{deposit} and their savings were %{savings}."
- two: "You told us the buyers’ deposit was %{deposit} and their savings were %{savings}."
- hint_text: "The deposit amount is higher than we would expect for the amount of savings they have."
grant:
title_text: "You told us that the grant amount is %{grant}."
hint_text: "Loans, grants and subsidies are usually between £9,000 and £16,000."
wheelchair:
title_text: "You told us that someone in the household uses a wheelchair."
- mortgage:
- title_text: "You told us that the mortgage amount is %{mortgage}."
- hint_text: "This is more than 5 times the income, which is higher than we would expect."
referral:
title_text: "Are you sure?"
hint_text: "This is a general needs log, and this referral type is for supported housing."
@@ -848,9 +828,6 @@ Make sure these answers are correct."
soctenant:
one: "Was the buyer a private registered provider, housing association or local authority tenant immediately before this sale?"
other: "Were any of the buyers private registered providers, housing association or local authority tenants immediately before this sale?"
- prevown:
- one: "Has the buyer previously owned a property?"
- other: "Have any of the buyers previously owned a property?"
stairowned:
one: "What percentage of the property does the buyer now own in total?"
other: "What percentage of the property do the buyers now own in total?"
@@ -873,9 +850,6 @@ Make sure these answers are correct."
soctenant:
one: "Buyer was a registered provider, housing association or local authority tenant immediately before this sale?"
other: "Any buyers were registered providers, housing association or local authority tenants immediately before this sale?"
- prevown:
- one: "Buyer previously owned a property."
- other: "Buyers previously owned a property."
stairowned:
one: "Percentage the buyer now owns in total."
other: "Percentage the buyers now own in total."
diff --git a/config/locales/forms/2023/sales/income_benefits_and_savings.en.yml b/config/locales/forms/2023/sales/income_benefits_and_savings.en.yml
new file mode 100644
index 000000000..49262d7a1
--- /dev/null
+++ b/config/locales/forms/2023/sales/income_benefits_and_savings.en.yml
@@ -0,0 +1,90 @@
+en:
+ forms:
+ 2023:
+ sales:
+ income_benefits_and_savings:
+ buyer_1_income:
+ page_header: ""
+ income1nk:
+ check_answer_label: "Buyer 1’s gross annual income known?"
+ hint_text: ""
+ question_text: "Do you know buyer 1’s annual income?"
+ income1:
+ check_answer_label: "Buyer 1’s gross annual income"
+ hint_text: "Provide the gross annual income (i.e. salary before tax) plus the annual amount of benefits, Universal Credit or pensions, and income from investments."
+ question_text: "Buyer 1’s gross annual income"
+
+ inc1mort:
+ page_header: ""
+ check_answer_label: "Buyer 1’s income used for mortgage application"
+ hint_text: ""
+ question_text: "Was buyer 1’s income used for a mortgage application?"
+
+ buyer_2_income:
+ page_header: ""
+ income2nk:
+ check_answer_label: "Buyer 2’s gross annual income known?"
+ hint_text: ""
+ question_text: "Do you know buyer 2’s annual income?"
+ income2:
+ check_answer_label: "Buyer 2’s gross annual income"
+ hint_text: "Provide the gross annual income (i.e. salary before tax) plus the annual amount of benefits, Universal Credit or pensions, and income from investments."
+ question_text: "Buyer 2’s gross annual income"
+
+ inc2mort:
+ page_header: ""
+ check_answer_label: "Buyer 2’s income used for mortgage application"
+ hint_text: ""
+ question_text: "Was buyer 2’s income used for a mortgage application?"
+
+ housing_benefits:
+ joint_purchase:
+ page_header: ""
+ check_answer_label: "Housing-related benefits buyers received before buying this property"
+ hint_text: ""
+ question_text: "Were the buyers receiving any of these housing-related benefits immediately before buying this property?"
+ not_joint_purchase:
+ page_header: ""
+ check_answer_label: "Housing-related benefits buyer received before buying this property"
+ hint_text: ""
+ question_text: "Was the buyer receiving any of these housing-related benefits immediately before buying this property?"
+
+ savings:
+ joint_purchase:
+ page_header: ""
+ savingsnk:
+ check_answer_label: "Buyers’ total savings known?"
+ hint_text: ""
+ question_text: "Do you know how much the 'buyers' had in savings before they paid any deposit for the property?"
+ savings:
+ check_answer_label: "Buyers’ total savings before any deposit paid"
+ hint_text: "Include any savings, investments, ISAs, premium bonds, shares, or money held in a bank or building society account."
+ question_text: "Enter their total savings to the nearest £10"
+ not_joint_purchase:
+ page_header: ""
+ savingsnk:
+ check_answer_label: "Buyer’s total savings known?"
+ hint_text: ""
+ question_text: "Do you know how much the buyer had in savings before they paid any deposit for the property?"
+ savings:
+ check_answer_label: "Buyer’s total savings before any deposit paid"
+ hint_text: "Include any savings, investments, ISAs, premium bonds, shares, or money held in a bank or building society account."
+ question_text: "Enter their total savings to the nearest £10"
+
+ prevown:
+ joint_purchase:
+ page_header: ""
+ check_answer_label: "Buyers previously owned a property."
+ hint_text: ""
+ question_text: "Have any of the buyers previously owned a property?"
+ not_joint_purchase:
+ page_header: ""
+ check_answer_label: "Buyer previously owned a property."
+ hint_text: ""
+ question_text: "Has the buyer previously owned a property?"
+
+ prevshared:
+ page_header: ""
+ check_answer_label: "Previous property shared ownership?"
+ hint_text: "For any buyer"
+ question_text: "Was the previous property under shared ownership?"
\ No newline at end of file
diff --git a/config/locales/forms/2023/sales/soft_validations.en.yml b/config/locales/forms/2023/sales/soft_validations.en.yml
new file mode 100644
index 000000000..de5138208
--- /dev/null
+++ b/config/locales/forms/2023/sales/soft_validations.en.yml
@@ -0,0 +1,60 @@
+en:
+ forms:
+ 2023:
+ sales:
+ soft_validations:
+ income1_value_check:
+ page_header: ""
+ check_answer_label: "Buyer 1 income confirmation"
+ hint_text: ""
+ question_text: "Are you sure this is correct?"
+ min:
+ title_text: "You told us income was %{income}."
+ informative_text: "This is less than we would expect for someone in this working situation."
+ max:
+ title_text: "You told us the income of buyer 1 is %{income}. This seems high. Are you sure this is correct?"
+ income2_value_check:
+ page_header: ""
+ check_answer_label: "Buyer 2 income confirmation"
+ hint_text: ""
+ question_text: "Are you sure this is correct?"
+ min:
+ title_text: "You told us income was %{income}."
+ informative_text: "This is less than we would expect for someone in this working situation."
+ max:
+ title_text: "You told us the income of buyer 2 is %{income}. This seems high. Are you sure this is correct?"
+ combined_income_value_check:
+ page_header: ""
+ check_answer_label: "Combined income confirmation"
+ hint_text: ""
+ question_text: "Are you sure this is correct?"
+ title_text: "You told us the combined income of this household is %{combined_income}. This seems high. Are you sure this is correct?"
+ mortgage_value_check:
+ page_header: ""
+ check_answer_label: "Mortgage confirmation"
+ hint_text: ""
+ question_text: "Are you sure that the mortgage is more than 5 times the income used for the mortgage application?"
+ title_text: "You told us that the mortgage amount is %{mortgage}."
+ informative_text: "This is more than 5 times the income, which is higher than we would expect."
+ savings_value_check:
+ page_header: ""
+ check_answer_label: "Savings confirmation"
+ hint_text: ""
+ question_text: "Are you sure the savings are higher than £100,000?"
+ joint_purchase:
+ title_text: You told us the buyers’ savings were %{savings}."
+ informative_text: "This is higher than we would expect."
+ not_joint_purchase:
+ title_text: "You told us the buyer’s savings were %{savings}."
+ informative_text: "This is higher than we would expect."
+ deposit_value_check::
+ page_header: ""
+ check_answer_label: "Deposit confirmation"
+ hint_text: ""
+ question_text: "Are you sure that the deposit is this much higher than the buyer's savings?"
+ joint_purchase:
+ title_text: "You told us the buyers’ deposit was %{deposit} and their savings were %{savings}."
+ informative_text: "The deposit amount is higher than we would expect for the amount of savings they have."
+ not_joint_purchase:
+ title_text: "You told us the buyer’s deposit was %{deposit} and their savings were %{savings}."
+ informative_text: "The deposit amount is higher than we would expect for the amount of savings they have."
diff --git a/config/locales/forms/2024/sales/income_benefits_and_savings.en.yml b/config/locales/forms/2024/sales/income_benefits_and_savings.en.yml
new file mode 100644
index 000000000..0654c9e1f
--- /dev/null
+++ b/config/locales/forms/2024/sales/income_benefits_and_savings.en.yml
@@ -0,0 +1,90 @@
+en:
+ forms:
+ 2024:
+ sales:
+ income_benefits_and_savings:
+ buyer_1_income:
+ page_header: ""
+ income1nk:
+ check_answer_label: "Buyer 1’s gross annual income known?"
+ hint_text: ""
+ question_text: "Do you know buyer 1’s annual income?"
+ income1:
+ check_answer_label: "Buyer 1’s gross annual income"
+ hint_text: "Provide the gross annual income (i.e. salary before tax) plus the annual amount of benefits, Universal Credit or pensions, and income from investments."
+ question_text: "Buyer 1’s gross annual income"
+
+ inc1mort:
+ page_header: ""
+ check_answer_label: "Buyer 1’s income used for mortgage application"
+ hint_text: ""
+ question_text: "Was buyer 1’s income used for a mortgage application?"
+
+ buyer_2_income:
+ page_header: ""
+ income2nk:
+ check_answer_label: "Buyer 2’s gross annual income known?"
+ hint_text: ""
+ question_text: "Do you know buyer 2’s annual income?"
+ income2:
+ check_answer_label: "Buyer 2’s gross annual income"
+ hint_text: "Provide the gross annual income (i.e. salary before tax) plus the annual amount of benefits, Universal Credit or pensions, and income from investments."
+ question_text: "Buyer 2’s gross annual income"
+
+ inc2mort:
+ page_header: ""
+ check_answer_label: "Buyer 2’s income used for mortgage application"
+ hint_text: ""
+ question_text: "Was buyer 2’s income used for a mortgage application?"
+
+ housing_benefits:
+ joint_purchase:
+ page_header: ""
+ check_answer_label: "Housing-related benefits buyers received before buying this property"
+ hint_text: ""
+ question_text: "Were the buyers receiving any of these housing-related benefits immediately before buying this property?"
+ not_joint_purchase:
+ page_header: ""
+ check_answer_label: "Housing-related benefits buyer received before buying this property"
+ hint_text: ""
+ question_text: "Was the buyer receiving any of these housing-related benefits immediately before buying this property?"
+
+ savings:
+ joint_purchase:
+ page_header: ""
+ savingsnk:
+ check_answer_label: "Buyers’ total savings known?"
+ hint_text: ""
+ question_text: "Do you know how much the 'buyers' had in savings before they paid any deposit for the property?"
+ savings:
+ check_answer_label: "Buyers’ total savings before any deposit paid"
+ hint_text: "Include any savings, investments, ISAs, premium bonds, shares, or money held in a bank or building society account."
+ question_text: "Enter their total savings to the nearest £10"
+ not_joint_purchase:
+ page_header: ""
+ savingsnk:
+ check_answer_label: "Buyer’s total savings known?"
+ hint_text: ""
+ question_text: "Do you know how much the buyer had in savings before they paid any deposit for the property?"
+ savings:
+ check_answer_label: "Buyer’s total savings before any deposit paid"
+ hint_text: "Include any savings, investments, ISAs, premium bonds, shares, or money held in a bank or building society account."
+ question_text: "Enter their total savings to the nearest £10"
+
+ prevown:
+ joint_purchase:
+ page_header: ""
+ check_answer_label: "Buyers previously owned a property."
+ hint_text: ""
+ question_text: "Have any of the buyers previously owned a property?"
+ not_joint_purchase:
+ page_header: ""
+ check_answer_label: "Buyer previously owned a property."
+ hint_text: ""
+ question_text: "Has the buyer previously owned a property?"
+
+ prevshared:
+ page_header: ""
+ check_answer_label: "Previous property shared ownership?"
+ hint_text: "For any buyer"
+ question_text: "Was the previous property under shared ownership?"
\ No newline at end of file
diff --git a/config/locales/forms/2024/sales/soft_validations.en.yml b/config/locales/forms/2024/sales/soft_validations.en.yml
new file mode 100644
index 000000000..853d21ad2
--- /dev/null
+++ b/config/locales/forms/2024/sales/soft_validations.en.yml
@@ -0,0 +1,60 @@
+en:
+ forms:
+ 2024:
+ sales:
+ soft_validations:
+ income1_value_check:
+ page_header: ""
+ check_answer_label: "Buyer 1 income confirmation"
+ hint_text: ""
+ question_text: "Are you sure this is correct?"
+ min:
+ title_text: "You told us income was %{income}."
+ informative_text: "This is less than we would expect for someone in this working situation."
+ max:
+ title_text: "You told us the income of buyer 1 is %{income}. This seems high. Are you sure this is correct?"
+ income2_value_check:
+ page_header: ""
+ check_answer_label: "Buyer 2 income confirmation"
+ hint_text: ""
+ question_text: "Are you sure this is correct?"
+ min:
+ title_text: "You told us income was %{income}."
+ informative_text: "This is less than we would expect for someone in this working situation."
+ max:
+ title_text: "You told us the income of buyer 2 is %{income}. This seems high. Are you sure this is correct?"
+ combined_income_value_check:
+ page_header: ""
+ check_answer_label: "Combined income confirmation"
+ hint_text: ""
+ question_text: "Are you sure this is correct?"
+ title_text: "You told us the combined income of this household is %{combined_income}. This seems high. Are you sure this is correct?"
+ mortgage_value_check:
+ page_header: ""
+ check_answer_label: "Mortgage confirmation"
+ hint_text: ""
+ question_text: "Are you sure that the mortgage is more than 5 times the income used for the mortgage application?"
+ title_text: "You told us that the mortgage amount is %{mortgage}."
+ informative_text: "This is more than 5 times the income, which is higher than we would expect."
+ savings_value_check:
+ page_header: ""
+ check_answer_label: "Savings confirmation"
+ hint_text: ""
+ question_text: "Are you sure the savings are higher than £100,000?"
+ joint_purchase:
+ title_text: You told us the buyers’ savings were %{savings}."
+ informative_text: "This is higher than we would expect."
+ not_joint_purchase:
+ title_text: "You told us the buyer’s savings were %{savings}."
+ informative_text: "This is higher than we would expect."
+ deposit_value_check:
+ page_header: ""
+ check_answer_label: "Deposit confirmation"
+ hint_text: ""
+ question_text: "Are you sure that the deposit is this much higher than the buyer's savings?"
+ joint_purchase:
+ title_text: "You told us the buyers’ deposit was %{deposit} and their savings were %{savings}."
+ informative_text: "The deposit amount is higher than we would expect for the amount of savings they have."
+ not_joint_purchase:
+ title_text: "You told us the buyer’s deposit was %{deposit} and their savings were %{savings}."
+ informative_text: "The deposit amount is higher than we would expect for the amount of savings they have."
diff --git a/spec/models/form/sales/pages/buyer1_income_max_value_check_spec.rb b/spec/models/form/sales/pages/buyer1_income_max_value_check_spec.rb
index 48e921468..fa5cf1e7c 100644
--- a/spec/models/form/sales/pages/buyer1_income_max_value_check_spec.rb
+++ b/spec/models/form/sales/pages/buyer1_income_max_value_check_spec.rb
@@ -5,7 +5,8 @@ RSpec.describe Form::Sales::Pages::Buyer1IncomeMaxValueCheck, type: :model do
let(:page_id) { "prefix_buyer_1_income_max_value_check" }
let(:page_definition) { nil }
- let(:subsection) { instance_double(Form::Subsection) }
+ let(:form) { instance_double(Form, start_date: Time.zone.local(2024, 4, 1)) }
+ let(:subsection) { instance_double(Form::Subsection, form:) }
it "has correct subsection" do
expect(page.subsection).to eq(subsection)
diff --git a/spec/models/form/sales/pages/buyer1_income_min_value_check_spec.rb b/spec/models/form/sales/pages/buyer1_income_min_value_check_spec.rb
index 1736daef7..79d61ce06 100644
--- a/spec/models/form/sales/pages/buyer1_income_min_value_check_spec.rb
+++ b/spec/models/form/sales/pages/buyer1_income_min_value_check_spec.rb
@@ -5,7 +5,8 @@ RSpec.describe Form::Sales::Pages::Buyer1IncomeMinValueCheck, type: :model do
let(:page_id) { "prefix_buyer_1_income_min_value_check" }
let(:page_definition) { nil }
- let(:subsection) { instance_double(Form::Subsection) }
+ let(:form) { instance_double(Form, start_date: Time.zone.local(2024, 4, 1)) }
+ let(:subsection) { instance_double(Form::Subsection, form:) }
it "has correct subsection" do
expect(page.subsection).to eq(subsection)
diff --git a/spec/models/form/sales/pages/buyer2_income_max_value_check_spec.rb b/spec/models/form/sales/pages/buyer2_income_max_value_check_spec.rb
index 440a6bb13..f467db18d 100644
--- a/spec/models/form/sales/pages/buyer2_income_max_value_check_spec.rb
+++ b/spec/models/form/sales/pages/buyer2_income_max_value_check_spec.rb
@@ -5,7 +5,8 @@ RSpec.describe Form::Sales::Pages::Buyer2IncomeMaxValueCheck, type: :model do
let(:page_id) { "prefix_buyer_2_income_max_value_check" }
let(:page_definition) { nil }
- let(:subsection) { instance_double(Form::Subsection) }
+ let(:form) { instance_double(Form, start_date: Time.zone.local(2024, 4, 1)) }
+ let(:subsection) { instance_double(Form::Subsection, form:) }
it "has correct subsection" do
expect(page.subsection).to eq(subsection)
diff --git a/spec/models/form/sales/pages/buyer2_income_min_value_check_spec.rb b/spec/models/form/sales/pages/buyer2_income_min_value_check_spec.rb
index 887dcab29..44b85ef9e 100644
--- a/spec/models/form/sales/pages/buyer2_income_min_value_check_spec.rb
+++ b/spec/models/form/sales/pages/buyer2_income_min_value_check_spec.rb
@@ -5,7 +5,8 @@ RSpec.describe Form::Sales::Pages::Buyer2IncomeMinValueCheck, type: :model do
let(:page_id) { "prefix_buyer_2_income_min_value_check" }
let(:page_definition) { nil }
- let(:subsection) { instance_double(Form::Subsection) }
+ let(:form) { instance_double(Form, start_date: Time.zone.local(2024, 4, 1)) }
+ let(:subsection) { instance_double(Form::Subsection, form:) }
it "has correct subsection" do
expect(page.subsection).to eq(subsection)
diff --git a/spec/models/form/sales/pages/combined_income_max_value_check_spec.rb b/spec/models/form/sales/pages/combined_income_max_value_check_spec.rb
index c79cb38da..f9b9954d9 100644
--- a/spec/models/form/sales/pages/combined_income_max_value_check_spec.rb
+++ b/spec/models/form/sales/pages/combined_income_max_value_check_spec.rb
@@ -5,7 +5,8 @@ RSpec.describe Form::Sales::Pages::CombinedIncomeMaxValueCheck, type: :model do
let(:page_id) { "prefix_combined_income_max_value_check" }
let(:page_definition) { nil }
- let(:subsection) { instance_double(Form::Subsection) }
+ let(:form) { instance_double(Form, start_date: Time.zone.local(2024, 4, 1)) }
+ let(:subsection) { instance_double(Form::Subsection, form:) }
it "has correct subsection" do
expect(page.subsection).to eq(subsection)
diff --git a/spec/models/form/sales/pages/deposit_value_check_spec.rb b/spec/models/form/sales/pages/deposit_value_check_spec.rb
index 5c4cd3608..dcd12449c 100644
--- a/spec/models/form/sales/pages/deposit_value_check_spec.rb
+++ b/spec/models/form/sales/pages/deposit_value_check_spec.rb
@@ -5,7 +5,8 @@ RSpec.describe Form::Sales::Pages::DepositValueCheck, type: :model do
let(:page_id) { "deposit_value_check" }
let(:page_definition) { nil }
- let(:subsection) { instance_double(Form::Subsection) }
+ let(:form) { instance_double(Form, start_date: Time.zone.local(2024, 4, 1)) }
+ let(:subsection) { instance_double(Form::Subsection, form:) }
it "has correct subsection" do
expect(page.subsection).to eq(subsection)
diff --git a/spec/models/form/sales/pages/mortgage_value_check_spec.rb b/spec/models/form/sales/pages/mortgage_value_check_spec.rb
index e4dc11bbc..be5aa5a77 100644
--- a/spec/models/form/sales/pages/mortgage_value_check_spec.rb
+++ b/spec/models/form/sales/pages/mortgage_value_check_spec.rb
@@ -6,7 +6,8 @@ RSpec.describe Form::Sales::Pages::MortgageValueCheck, type: :model do
let(:page_id) { "buyer_1_income_mortgage_value_check" }
let(:page_definition) { nil }
let(:index) { 1 }
- let(:subsection) { instance_double(Form::Subsection) }
+ let(:form) { instance_double(Form, start_date: Time.zone.local(2024, 4, 1)) }
+ let(:subsection) { instance_double(Form::Subsection, form:) }
it "has correct subsection" do
expect(page.subsection).to eq(subsection)
diff --git a/spec/models/form/sales/pages/savings_value_check_spec.rb b/spec/models/form/sales/pages/savings_value_check_spec.rb
index 81672977d..e680ff5d1 100644
--- a/spec/models/form/sales/pages/savings_value_check_spec.rb
+++ b/spec/models/form/sales/pages/savings_value_check_spec.rb
@@ -5,7 +5,8 @@ RSpec.describe Form::Sales::Pages::SavingsValueCheck, type: :model do
let(:page_id) { "savings_value_check" }
let(:page_definition) { nil }
- let(:subsection) { instance_double(Form::Subsection) }
+ let(:form) { instance_double(Form, start_date: Time.zone.local(2024, 4, 1)) }
+ let(:subsection) { instance_double(Form::Subsection, form:) }
it "has correct subsection" do
expect(page.subsection).to eq(subsection)
diff --git a/spec/models/form/sales/subsections/discounted_ownership_scheme_spec.rb b/spec/models/form/sales/subsections/discounted_ownership_scheme_spec.rb
index e703e713a..bfd5313fb 100644
--- a/spec/models/form/sales/subsections/discounted_ownership_scheme_spec.rb
+++ b/spec/models/form/sales/subsections/discounted_ownership_scheme_spec.rb
@@ -5,7 +5,8 @@ RSpec.describe Form::Sales::Subsections::DiscountedOwnershipScheme, type: :model
let(:subsection_id) { nil }
let(:subsection_definition) { nil }
- let(:section) { instance_double(Form::Sales::Sections::SaleInformation) }
+ let(:form) { instance_double(Form, start_date: Time.zone.local(2024, 4, 1)) }
+ let(:section) { instance_double(Form::Sales::Sections::SaleInformation, form:) }
it "has correct section" do
expect(discounted_ownership_scheme.section).to eq(section)
diff --git a/spec/models/form/sales/subsections/shared_ownership_scheme_spec.rb b/spec/models/form/sales/subsections/shared_ownership_scheme_spec.rb
index ea3fcd40e..922281fd0 100644
--- a/spec/models/form/sales/subsections/shared_ownership_scheme_spec.rb
+++ b/spec/models/form/sales/subsections/shared_ownership_scheme_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Form::Sales::Subsections::SharedOwnershipScheme, type: :model do
let(:section) { instance_double(Form::Sales::Sections::SaleInformation) }
before do
- allow(section).to receive(:form).and_return(instance_double(Form, start_year_after_2024?: false))
+ allow(section).to receive(:form).and_return(instance_double(Form, start_year_after_2024?: false, start_date: Time.zone.local(2023, 4, 1)))
end
it "has correct section" do
diff --git a/spec/models/forms/bulk_upload_lettings/guidance_spec.rb b/spec/models/forms/bulk_upload_lettings/guidance_spec.rb
index 271ff8b27..41e74c50c 100644
--- a/spec/models/forms/bulk_upload_lettings/guidance_spec.rb
+++ b/spec/models/forms/bulk_upload_lettings/guidance_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Forms::BulkUploadLettings::Guidance do
subject(:bu_guidance) { described_class.new(year:, referrer:) }
let(:year) { 2024 }
+ let(:referrer) { nil }
describe "#back_path" do
context "when referrer is prepare-your-file" do
@@ -40,4 +41,20 @@ RSpec.describe Forms::BulkUploadLettings::Guidance do
end
end
end
+
+ describe "year" do
+ context "when year is not provided" do
+ let(:year) { nil }
+
+ before do
+ # rubocop:disable RSpec/AnyInstance
+ allow_any_instance_of(CollectionTimeHelper).to receive(:current_collection_start_year).and_return(2030)
+ # rubocop:enable RSpec/AnyInstance
+ end
+
+ it "is set to the current collection start year" do
+ expect(bu_guidance.year).to eq(2030)
+ end
+ end
+ end
end
diff --git a/spec/models/forms/bulk_upload_sales/guidance_spec.rb b/spec/models/forms/bulk_upload_sales/guidance_spec.rb
index 6eacf6d0c..f9c986cb2 100644
--- a/spec/models/forms/bulk_upload_sales/guidance_spec.rb
+++ b/spec/models/forms/bulk_upload_sales/guidance_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Forms::BulkUploadSales::Guidance do
subject(:bu_guidance) { described_class.new(year:, referrer:) }
let(:year) { 2024 }
+ let(:referrer) { nil }
describe "#back_path" do
context "when referrer is prepare-your-file" do
@@ -40,4 +41,20 @@ RSpec.describe Forms::BulkUploadSales::Guidance do
end
end
end
+
+ describe "year" do
+ context "when year is not provided" do
+ let(:year) { nil }
+
+ before do
+ # rubocop:disable RSpec/AnyInstance
+ allow_any_instance_of(CollectionTimeHelper).to receive(:current_collection_start_year).and_return(2030)
+ # rubocop:enable RSpec/AnyInstance
+ end
+
+ it "is set to the current collection start year" do
+ expect(bu_guidance.year).to eq(2030)
+ end
+ end
+ end
end
diff --git a/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb b/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb
index 596712162..2e4c82635 100644
--- a/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb
+++ b/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb
@@ -2718,6 +2718,14 @@ RSpec.describe BulkUpload::Lettings::Year2024::RowParser do
it "strips whitespace" do
expect(parser.log.postcode_full).to eql("EC1N 2TD")
end
+
+ context "when a partial postcode is provided" do
+ let(:attributes) { { bulk_upload:, field_4: 1, field_21: "EC1N", field_22: "" } }
+
+ it "is set to the partial value" do
+ expect(parser.log.postcode_full).to eql("EC1N")
+ end
+ end
end
describe "#la" do