Browse Source

Merge branch 'main' into CLDC-3788-export-sales-logs

pull/2943/head
kosiakkatrina 1 month ago committed by GitHub
parent
commit
e3d600eac3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      Gemfile.lock
  2. 6
      app/controllers/address_search_controller.rb
  3. 2
      app/helpers/check_errors_helper.rb
  4. 1
      app/models/derived_variables/lettings_log_variables.rb
  5. 2
      app/models/derived_variables/sales_log_variables.rb
  6. 6
      app/models/form/lettings/questions/address_search.rb
  7. 2
      app/models/form/lettings/subsections/property_information.rb
  8. 6
      app/models/form/sales/questions/address_search.rb
  9. 36
      app/models/form/sales/subsections/household_characteristics.rb
  10. 55
      app/models/log.rb
  11. 8
      app/services/bulk_upload/sales/year2025/row_parser.rb
  12. 2
      app/views/form/check_errors.html.erb
  13. 9
      config/locales/forms/2025/sales/soft_validations.en.yml
  14. 33
      spec/models/form/lettings/questions/address_search_spec.rb
  15. 16
      spec/models/form/lettings/subsections/property_information_spec.rb
  16. 33
      spec/models/form/sales/questions/address_search_spec.rb
  17. 18
      spec/models/form/sales/subsections/household_characteristics_spec.rb
  18. 40
      spec/requests/address_search_controller_spec.rb
  19. 4
      spec/requests/check_errors_controller_spec.rb
  20. 7
      spec/services/bulk_upload/sales/year2024/row_parser_spec.rb
  21. 7
      spec/services/bulk_upload/sales/year2025/row_parser_spec.rb

2
Gemfile.lock

@ -343,7 +343,7 @@ GEM
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.8.1)
rack (3.1.11)
rack (3.1.12)
rack-attack (6.7.0)
rack (>= 1.0, < 4)
rack-mini-profiler (3.3.1)

6
app/controllers/address_search_controller.rb

@ -5,7 +5,9 @@ class AddressSearchController < ApplicationController
def index
query = params[:query]
if query.match?(/\A\d+\z/) && query.length > 5
if query.nil?
render json: { error: "Query cannot be blank." }, status: :bad_request
elsif query.match?(/\A\d+\z/) && query.length > 5
# Query is all numbers and greater than 5 digits, assume it's a UPRN
service = UprnClient.new(query)
service.call
@ -38,7 +40,7 @@ class AddressSearchController < ApplicationController
address_service.call
uprn_service.call
results = ([uprn_service.result] || []) + (address_service.result || [])
results = [uprn_service.result, *address_service.result].compact
if address_service.error.present? && uprn_service.error.present?
render json: { error: "Address and UPRN are not recognised." }, status: :not_found

2
app/helpers/check_errors_helper.rb

@ -2,7 +2,7 @@ module CheckErrorsHelper
include GovukLinkHelper
def check_errors_answer_text(question, log)
question.displayed_as_answered?(log) ? "Change" : "Answer"
question.displayed_as_answered?(log) ? "Change" : ""
end
def check_errors_answer_link(log, question, page, applicable_questions)

1
app/models/derived_variables/lettings_log_variables.rb

@ -375,6 +375,7 @@ private
self.address_line2 = nil
self.town_or_city = nil
self.county = nil
self.postcode_full = nil
end
def address_answered_without_uprn?

2
app/models/derived_variables/sales_log_variables.rb

@ -258,10 +258,10 @@ private
self.address_line2 = nil
self.town_or_city = nil
self.county = nil
self.postcode_full = nil
self.pcode1 = nil
self.pcode2 = nil
self.pcodenk = nil
self.postcode_full = nil
self.is_la_inferred = nil
self.la = nil
end

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

@ -12,11 +12,9 @@ class Form::Lettings::Questions::AddressSearch < ::Form::Question
def answer_options(log = nil, _user = nil)
return {} unless ActiveRecord::Base.connected?
return {} unless log&.address_options&.any?
return {} unless log&.address_search_options&.any?
log.address_options.each_with_object({}) do |option, hash|
hash[option[:uprn]] = { "value" => "#{option[:address]} (#{option[:uprn]})" }
end
{ log.address_search_options.first[:uprn] => { "value" => "#{log.address_search_options.first[:address]} (#{log.address_search_options.first[:uprn]})" } }
end
def get_extra_check_answer_value(log)

2
app/models/form/lettings/subsections/property_information.rb

@ -56,6 +56,8 @@ class Form::Lettings::Subsections::PropertyInformation < ::Form::Subsection
end
def displayed_in_tasklist?(log)
return true if form.start_year_2025_or_later?
!(log.is_supported_housing? && log.is_renewal?)
end
end

6
app/models/form/sales/questions/address_search.rb

@ -12,11 +12,9 @@ class Form::Sales::Questions::AddressSearch < ::Form::Question
def answer_options(log = nil, _user = nil)
return {} unless ActiveRecord::Base.connected?
return {} unless log&.address_options&.any?
return {} unless log&.address_search_options&.any?
log.address_options.each_with_object({}) do |option, hash|
hash[option[:uprn]] = { "value" => "#{option[:address]} (#{option[:uprn]})" }
end
{ log.address_search_options.first[:uprn] => { "value" => "#{log.address_search_options.first[:address]} (#{log.address_search_options.first[:uprn]})" } }
end
def get_extra_check_answer_value(log)

36
app/models/form/sales/subsections/household_characteristics.rb

@ -39,20 +39,20 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection
Form::Sales::Pages::Buyer1LiveInProperty.new(nil, nil, self),
Form::Sales::Pages::BuyerLiveInValueCheck.new("buyer_1_live_in_property_value_check", nil, self, person_index: 1),
(form.start_year_2025_or_later? ? Form::Sales::Pages::Buyer2RelationshipToBuyer1YesNo.new(nil, nil, self) : Form::Sales::Pages::Buyer2RelationshipToBuyer1.new(nil, nil, self)),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_relationship_student_not_child_value_check", nil, self, person_index: 2),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_relationship_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?),
Form::Sales::Pages::Age2.new(nil, nil, self),
Form::Sales::Pages::OldPersonsSharedOwnershipValueCheck.new("age_2_old_persons_shared_ownership_joint_purchase_value_check", nil, self, joint_purchase: true),
Form::Sales::Pages::OldPersonsSharedOwnershipValueCheck.new("age_2_old_persons_shared_ownership_value_check", nil, self, joint_purchase: false),
Form::Sales::Pages::RetirementValueCheck.new("age_2_buyer_retirement_value_check", nil, self, person_index: 2),
(Form::Sales::Pages::NotRetiredValueCheck.new("age_2_buyer_not_retired_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_age_student_not_child_value_check", nil, self, person_index: 2),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_age_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?),
Form::Sales::Pages::GenderIdentity2.new(nil, nil, self),
buyer_2_ethnicity_nationality_pages,
Form::Sales::Pages::Buyer2WorkingSituation.new(nil, nil, self),
Form::Sales::Pages::RetirementValueCheck.new("working_situation_2_retirement_value_check_joint_purchase", nil, self, person_index: 2),
(Form::Sales::Pages::NotRetiredValueCheck.new("working_situation_2_not_retired_value_check_joint_purchase", nil, self, person_index: 2) if form.start_year_2024_or_later?),
Form::Sales::Pages::Buyer2IncomeEcstatValueCheck.new("working_situation_buyer_2_income_value_check", nil, self),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_working_situation_student_not_child_value_check", nil, self, person_index: 2),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_working_situation_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?),
Form::Sales::Pages::Buyer2LiveInProperty.new(nil, nil, self),
Form::Sales::Pages::BuyerLiveInValueCheck.new("buyer_2_live_in_property_value_check", nil, self, person_index: 2),
Form::Sales::Pages::NumberOfOthersInProperty.new("number_of_others_in_property", nil, self, joint_purchase: false),
@ -61,77 +61,77 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection
(form.start_year_2025_or_later? ? Form::Sales::Pages::PersonRelationshipToBuyer1YesNo.new("person_2_relationship_to_buyer_1", nil, self, person_index: 2) : Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_2_relationship_to_buyer_1", nil, self, person_index: 2)),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("relationship_2_partner_under_16_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?),
(Form::Sales::Pages::MultiplePartnersValueCheck.new("relationship_2_multiple_partners_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_2_student_not_child_value_check", nil, self, person_index: 2),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_2_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?),
Form::Sales::Pages::PersonAge.new("person_2_age", nil, self, person_index: 2),
Form::Sales::Pages::RetirementValueCheck.new("age_2_retirement_value_check", nil, self, person_index: 2),
(Form::Sales::Pages::NotRetiredValueCheck.new("age_2_not_retired_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_2_student_not_child_value_check", nil, self, person_index: 2),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_2_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_2_partner_under_16_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonGenderIdentity.new("person_2_gender_identity", nil, self, person_index: 2),
Form::Sales::Pages::PersonWorkingSituation.new("person_2_working_situation", nil, self, person_index: 2),
Form::Sales::Pages::RetirementValueCheck.new("working_situation_2_retirement_value_check", nil, self, person_index: 2),
(Form::Sales::Pages::NotRetiredValueCheck.new("working_situation_2_not_retired_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_2_student_not_child_value_check", nil, self, person_index: 2),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_2_student_not_child_value_check", nil, self, person_index: 2) unless form.start_year_2025_or_later?),
Form::Sales::Pages::PersonKnown.new("person_3_known", nil, self, person_index: 3),
(form.start_year_2025_or_later? ? Form::Sales::Pages::PersonRelationshipToBuyer1YesNo.new("person_3_relationship_to_buyer_1", nil, self, person_index: 3) : Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_3_relationship_to_buyer_1", nil, self, person_index: 3)),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("relationship_3_partner_under_16_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?),
(Form::Sales::Pages::MultiplePartnersValueCheck.new("relationship_3_multiple_partners_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_3_student_not_child_value_check", nil, self, person_index: 3),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_3_student_not_child_value_check", nil, self, person_index: 3) unless form.start_year_2025_or_later?),
Form::Sales::Pages::PersonAge.new("person_3_age", nil, self, person_index: 3),
Form::Sales::Pages::RetirementValueCheck.new("age_3_retirement_value_check", nil, self, person_index: 3),
(Form::Sales::Pages::NotRetiredValueCheck.new("age_3_not_retired_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_3_student_not_child_value_check", nil, self, person_index: 3),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_3_student_not_child_value_check", nil, self, person_index: 3) unless form.start_year_2025_or_later?),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_3_partner_under_16_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonGenderIdentity.new("person_3_gender_identity", nil, self, person_index: 3),
Form::Sales::Pages::PersonWorkingSituation.new("person_3_working_situation", nil, self, person_index: 3),
Form::Sales::Pages::RetirementValueCheck.new("working_situation_3_retirement_value_check", nil, self, person_index: 3),
(Form::Sales::Pages::NotRetiredValueCheck.new("working_situation_3_not_retired_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_3_student_not_child_value_check", nil, self, person_index: 3),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_3_student_not_child_value_check", nil, self, person_index: 3) unless form.start_year_2025_or_later?),
Form::Sales::Pages::PersonKnown.new("person_4_known", nil, self, person_index: 4),
(form.start_year_2025_or_later? ? Form::Sales::Pages::PersonRelationshipToBuyer1YesNo.new("person_4_relationship_to_buyer_1", nil, self, person_index: 4) : Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_4_relationship_to_buyer_1", nil, self, person_index: 4)),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("relationship_4_partner_under_16_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?),
(Form::Sales::Pages::MultiplePartnersValueCheck.new("relationship_4_multiple_partners_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_4_student_not_child_value_check", nil, self, person_index: 4),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_4_student_not_child_value_check", nil, self, person_index: 4) unless form.start_year_2025_or_later?),
Form::Sales::Pages::PersonAge.new("person_4_age", nil, self, person_index: 4),
Form::Sales::Pages::RetirementValueCheck.new("age_4_retirement_value_check", nil, self, person_index: 4),
(Form::Sales::Pages::NotRetiredValueCheck.new("age_4_not_retired_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_4_student_not_child_value_check", nil, self, person_index: 4),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_4_student_not_child_value_check", nil, self, person_index: 4) unless form.start_year_2025_or_later?),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_4_partner_under_16_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonGenderIdentity.new("person_4_gender_identity", nil, self, person_index: 4),
Form::Sales::Pages::PersonWorkingSituation.new("person_4_working_situation", nil, self, person_index: 4),
Form::Sales::Pages::RetirementValueCheck.new("working_situation_4_retirement_value_check", nil, self, person_index: 4),
(Form::Sales::Pages::NotRetiredValueCheck.new("working_situation_4_not_retired_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_4_student_not_child_value_check", nil, self, person_index: 4),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_4_student_not_child_value_check", nil, self, person_index: 4) unless form.start_year_2025_or_later?),
Form::Sales::Pages::PersonKnown.new("person_5_known", nil, self, person_index: 5),
(form.start_year_2025_or_later? ? Form::Sales::Pages::PersonRelationshipToBuyer1YesNo.new("person_5_relationship_to_buyer_1", nil, self, person_index: 5) : Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_5_relationship_to_buyer_1", nil, self, person_index: 5)),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("relationship_5_partner_under_16_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?),
(Form::Sales::Pages::MultiplePartnersValueCheck.new("relationship_5_multiple_partners_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_5_student_not_child_value_check", nil, self, person_index: 5),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_5_student_not_child_value_check", nil, self, person_index: 5) unless form.start_year_2025_or_later?),
Form::Sales::Pages::PersonAge.new("person_5_age", nil, self, person_index: 5),
Form::Sales::Pages::RetirementValueCheck.new("age_5_retirement_value_check", nil, self, person_index: 5),
(Form::Sales::Pages::NotRetiredValueCheck.new("age_5_not_retired_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_5_student_not_child_value_check", nil, self, person_index: 5),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_5_student_not_child_value_check", nil, self, person_index: 5) unless form.start_year_2025_or_later?),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_5_partner_under_16_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonGenderIdentity.new("person_5_gender_identity", nil, self, person_index: 5),
Form::Sales::Pages::PersonWorkingSituation.new("person_5_working_situation", nil, self, person_index: 5),
Form::Sales::Pages::RetirementValueCheck.new("working_situation_5_retirement_value_check", nil, self, person_index: 5),
(Form::Sales::Pages::NotRetiredValueCheck.new("working_situation_5_not_retired_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_5_student_not_child_value_check", nil, self, person_index: 5),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_5_student_not_child_value_check", nil, self, person_index: 5) unless form.start_year_2025_or_later?),
Form::Sales::Pages::PersonKnown.new("person_6_known", nil, self, person_index: 6),
(form.start_year_2025_or_later? ? Form::Sales::Pages::PersonRelationshipToBuyer1YesNo.new("person_6_relationship_to_buyer_1", nil, self, person_index: 6) : Form::Sales::Pages::PersonRelationshipToBuyer1.new("person_6_relationship_to_buyer_1", nil, self, person_index: 6)),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("relationship_6_partner_under_16_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?),
(Form::Sales::Pages::MultiplePartnersValueCheck.new("relationship_6_multiple_partners_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_6_student_not_child_value_check", nil, self, person_index: 6),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("relationship_6_student_not_child_value_check", nil, self, person_index: 6) unless form.start_year_2025_or_later?),
Form::Sales::Pages::PersonAge.new("person_6_age", nil, self, person_index: 6),
Form::Sales::Pages::RetirementValueCheck.new("age_6_retirement_value_check", nil, self, person_index: 6),
(Form::Sales::Pages::NotRetiredValueCheck.new("age_6_not_retired_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_6_student_not_child_value_check", nil, self, person_index: 6),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("age_6_student_not_child_value_check", nil, self, person_index: 6) unless form.start_year_2025_or_later?),
(Form::Sales::Pages::PartnerUnder16ValueCheck.new("age_6_partner_under_16_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonGenderIdentity.new("person_6_gender_identity", nil, self, person_index: 6),
Form::Sales::Pages::PersonWorkingSituation.new("person_6_working_situation", nil, self, person_index: 6),
Form::Sales::Pages::RetirementValueCheck.new("working_situation_6_retirement_value_check", nil, self, person_index: 6),
(Form::Sales::Pages::NotRetiredValueCheck.new("working_situation_6_not_retired_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?),
Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_6_student_not_child_value_check", nil, self, person_index: 6),
(Form::Sales::Pages::PersonStudentNotChildValueCheck.new("working_situation_6_student_not_child_value_check", nil, self, person_index: 6) unless form.start_year_2025_or_later?),
].flatten.compact
end

55
app/models/log.rb

@ -128,38 +128,40 @@ class Log < ApplicationRecord
"#{address_line1_input}, #{postcode_full_input}"
end
def address_options
if uprn.present?
service = UprnClient.new(uprn)
service.call
if service.result.blank? || service.error.present?
@address_options = []
return @address_options
end
def address_search_options
return if uprn.blank?
service = UprnClient.new(uprn)
service.call
if service.result.blank? || service.error.present?
@address_options = []
return @address_options
end
presenter = UprnDataPresenter.new(service.result)
@address_options = [{ address: presenter.address, uprn: presenter.uprn }]
else
return @address_options if @address_options && @last_searched_address_string == address_string
return if address_string.blank?
presenter = UprnDataPresenter.new(service.result)
@address_options = [{ address: presenter.address, uprn: presenter.uprn }]
end
@last_searched_address_string = address_string
def address_options
return @address_options if @address_options && @last_searched_address_string == address_string
return if address_string.blank?
service = AddressClient.new(address_string)
service.call
if service.result.blank? || service.error.present?
@address_options = []
return @address_options
end
@last_searched_address_string = address_string
address_opts = []
service.result.first(10).each do |result|
presenter = AddressDataPresenter.new(result)
address_opts.append({ address: presenter.address, uprn: presenter.uprn })
end
service = AddressClient.new(address_string)
service.call
if service.result.blank? || service.error.present?
@address_options = []
return @address_options
end
@address_options = address_opts
address_opts = []
service.result.first(10).each do |result|
presenter = AddressDataPresenter.new(result)
address_opts.append({ address: presenter.address, uprn: presenter.uprn })
end
@address_options = address_opts
end
def collection_start_year
@ -415,6 +417,7 @@ private
self.address_line2 = address_line2_as_entered
self.county = county_as_entered
self.town_or_city = town_or_city_as_entered
self.la = la_as_entered
self.manual_address_entry_selected = true
end
end

8
app/services/bulk_upload/sales/year2025/row_parser.rb

@ -662,7 +662,7 @@ private
relat2: %i[field_34],
relat3: %i[field_42],
relat4: %i[field_46],
relat5: %i[field_49],
relat5: %i[field_50],
relat6: %i[field_54],
ecstat1: %i[field_32],
@ -821,10 +821,10 @@ private
else
(field_46 == 2 ? "X" : "R")
end
attributes["relat5"] = if field_49 == 1
attributes["relat5"] = if field_50 == 1
"P"
else
(field_49 == 2 ? "X" : "R")
(field_50 == 2 ? "X" : "R")
end
attributes["relat6"] = if field_54 == 1
"P"
@ -1036,7 +1036,7 @@ private
end
def person_5_present?
field_51.present? || field_52.present? || field_49.present?
field_51.present? || field_52.present? || field_50.present?
end
def person_6_present?

2
app/views/form/check_errors.html.erb

@ -50,7 +50,7 @@
</dd>
<dd class="govuk-summary-list__actions">
<% if !question.displayed_as_answered?(@log) || question.subsection.id == "setup" %>
<%= govuk_link_to check_errors_answer_text(question, @log), check_errors_answer_link(@log, question, @page, applicable_questions) %>
<%= govuk_link_to check_errors_answer_text(question, @log), check_errors_answer_link(@log, question, @page, applicable_questions) unless question.unanswered?(@log) %>
<% else %>
<input type="submit" value="Clear" class="govuk-body govuk-link submit-button-link" name="<%= question.id %>">
<% end %>

9
config/locales/forms/2025/sales/soft_validations.en.yml

@ -191,15 +191,6 @@ en:
title_text: "You told us that buyer 2 will not live in the property."
informative_text: "For %{ownership_scheme} types, the buyer usually lives in the property."
student_not_child_value_check:
page_header: ""
check_answer_label: "Student not a child confirmation"
check_answer_prompt: "Confirm student not a child"
hint_text: ""
question_text: "Are you sure this person is not a child?"
title_text: "You told us this person is a student aged between 16 and 19."
informative_text: "Are you sure this person is not a child?"
partner_under_16_value_check:
page_header: ""
check_answer_label: "Partner under 16 confirmation"

33
spec/models/form/lettings/questions/address_search_spec.rb

@ -32,6 +32,39 @@ RSpec.describe Form::Lettings::Questions::AddressSearch, type: :model do
end
end
describe "#answer_options" do
before do
body = {
results: [
{
DPA: {
"POSTCODE": "AA1 1AA",
"POST_TOWN": "Test Town",
"ORGANISATION_NAME": "1, Test Road",
"ADDRESS": "1 Test Street, Test City, AA1 1AA",
"UPRN": "123",
},
},
],
}.to_json
WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/uprn?dataset=DPA,LPI&key=OS_DATA_KEY&uprn=123")
.to_return(status: 200, body:, headers: {})
end
let(:log_with_uprn) { build(:lettings_log, :completed, uprn: 123, manual_address_entry_selected: false, address_line1_input: "1, Test Road", postcode_full_input: "Test Town") }
let(:log_without_uprn) { build(:lettings_log, :completed, uprn: nil, manual_address_entry_selected: false, address_line1_input: "1, Test Road", postcode_full_input: "Test Town") }
it "returns an answer option when uprn is present" do
expect(question.answer_options(log_with_uprn)).to eq({ "123" => { "value" => "1 Test Street, Test City, AA1 1AA (123)" } })
end
it "does not return an answer option when uprn is not present" do
expect(question.answer_options(log_without_uprn)).to eq({ nil => { "value" => " ()" } })
end
end
describe "get_extra_check_answer_value" do
context "when address is not present" do
let(:log) { build(:lettings_log, manual_address_entry_selected: false) }

16
spec/models/form/lettings/subsections/property_information_spec.rb

@ -84,6 +84,14 @@ RSpec.describe Form::Lettings::Subsections::PropertyInformation, type: :model do
],
)
end
context "when it is supported housing and a renewal" do
let(:log) { FactoryBot.build(:lettings_log, needstype: 2, renewal: 1) }
it "is not displayed in tasklist" do
expect(property_information.displayed_in_tasklist?(log)).to eq(false)
end
end
end
context "when 2025" do
@ -118,6 +126,14 @@ RSpec.describe Form::Lettings::Subsections::PropertyInformation, type: :model do
],
)
end
context "when it is supported housing and a renewal" do
let(:log) { FactoryBot.build(:lettings_log, needstype: 2, renewal: 1) }
it "is displayed in tasklist" do
expect(property_information.displayed_in_tasklist?(log)).to eq(true)
end
end
end
end

33
spec/models/form/sales/questions/address_search_spec.rb

@ -32,6 +32,39 @@ RSpec.describe Form::Sales::Questions::AddressSearch, type: :model do
end
end
describe "#answer_options" do
before do
body = {
results: [
{
DPA: {
"POSTCODE": "AA1 1AA",
"POST_TOWN": "Test Town",
"ORGANISATION_NAME": "1, Test Road",
"ADDRESS": "1 Test Street, Test City, AA1 1AA",
"UPRN": "123",
},
},
],
}.to_json
WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/uprn?dataset=DPA,LPI&key=OS_DATA_KEY&uprn=123")
.to_return(status: 200, body:, headers: {})
end
let(:log_with_uprn) { build(:sales_log, :completed, uprn: 123, manual_address_entry_selected: false, address_line1_input: "1, Test Road", postcode_full_input: "Test Town") }
let(:log_without_uprn) { build(:sales_log, :completed, uprn: nil, manual_address_entry_selected: false, address_line1_input: "1, Test Road", postcode_full_input: "Test Town") }
it "returns an answer option when uprn is present" do
expect(question.answer_options(log_with_uprn)).to eq({ "123" => { "value" => "1 Test Street, Test City, AA1 1AA (123)" } })
end
it "does not return an answer option when uprn is not present" do
expect(question.answer_options(log_without_uprn)).to eq({ nil => { "value" => " ()" } })
end
end
describe "get_extra_check_answer_value" do
context "when address is not present" do
let(:log) { build(:sales_log, manual_address_entry_selected: false) }

18
spec/models/form/sales/subsections/household_characteristics_spec.rb

@ -309,13 +309,11 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model
buyer_1_live_in_property
buyer_1_live_in_property_value_check
buyer_2_relationship_to_buyer_1
buyer_2_relationship_student_not_child_value_check
buyer_2_age
age_2_old_persons_shared_ownership_joint_purchase_value_check
age_2_old_persons_shared_ownership_value_check
age_2_buyer_retirement_value_check
age_2_buyer_not_retired_value_check
buyer_2_age_student_not_child_value_check
buyer_2_gender_identity
buyer_2_ethnic_group
buyer_2_ethnic_background_black
@ -328,7 +326,6 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model
working_situation_2_retirement_value_check_joint_purchase
working_situation_2_not_retired_value_check_joint_purchase
working_situation_buyer_2_income_value_check
buyer_2_working_situation_student_not_child_value_check
buyer_2_live_in_property
buyer_2_live_in_property_value_check
number_of_others_in_property
@ -337,77 +334,62 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model
person_2_relationship_to_buyer_1
relationship_2_partner_under_16_value_check
relationship_2_multiple_partners_value_check
relationship_2_student_not_child_value_check
person_2_age
age_2_retirement_value_check
age_2_not_retired_value_check
age_2_student_not_child_value_check
age_2_partner_under_16_value_check
person_2_gender_identity
person_2_working_situation
working_situation_2_retirement_value_check
working_situation_2_not_retired_value_check
working_situation_2_student_not_child_value_check
person_3_known
person_3_relationship_to_buyer_1
relationship_3_partner_under_16_value_check
relationship_3_multiple_partners_value_check
relationship_3_student_not_child_value_check
person_3_age
age_3_retirement_value_check
age_3_not_retired_value_check
age_3_student_not_child_value_check
age_3_partner_under_16_value_check
person_3_gender_identity
person_3_working_situation
working_situation_3_retirement_value_check
working_situation_3_not_retired_value_check
working_situation_3_student_not_child_value_check
person_4_known
person_4_relationship_to_buyer_1
relationship_4_partner_under_16_value_check
relationship_4_multiple_partners_value_check
relationship_4_student_not_child_value_check
person_4_age
age_4_retirement_value_check
age_4_not_retired_value_check
age_4_student_not_child_value_check
age_4_partner_under_16_value_check
person_4_gender_identity
person_4_working_situation
working_situation_4_retirement_value_check
working_situation_4_not_retired_value_check
working_situation_4_student_not_child_value_check
person_5_known
person_5_relationship_to_buyer_1
relationship_5_partner_under_16_value_check
relationship_5_multiple_partners_value_check
relationship_5_student_not_child_value_check
person_5_age
age_5_retirement_value_check
age_5_not_retired_value_check
age_5_student_not_child_value_check
age_5_partner_under_16_value_check
person_5_gender_identity
person_5_working_situation
working_situation_5_retirement_value_check
working_situation_5_not_retired_value_check
working_situation_5_student_not_child_value_check
person_6_known
person_6_relationship_to_buyer_1
relationship_6_partner_under_16_value_check
relationship_6_multiple_partners_value_check
relationship_6_student_not_child_value_check
person_6_age
age_6_retirement_value_check
age_6_not_retired_value_check
age_6_student_not_child_value_check
age_6_partner_under_16_value_check
person_6_gender_identity
person_6_working_situation
working_situation_6_retirement_value_check
working_situation_6_not_retired_value_check
working_situation_6_student_not_child_value_check
],
)
end

40
spec/requests/address_search_controller_spec.rb

@ -144,5 +144,45 @@ RSpec.describe AddressSearchController, type: :request do
expect(sales_log.la).to eq(nil)
end
end
context "when searching by address and UPRN" do
let(:sales_log) { create(:sales_log, :completed, manual_address_entry_selected: false, assigned_to: user) }
context "and theres no uprn returned" do
before do
body = { results: [{ DPA: { "ADDRESS": "1, Test Street", "UPRN": "123" } }] }.to_json
uprn_body = { results: [{ DPA: nil }] }.to_json
WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/find?key=OS_DATA_KEY&maxresults=10&minmatch=0.2&query=100")
.to_return(status: 200, body:, headers: {})
WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/uprn?dataset=DPA,LPI&key=OS_DATA_KEY&uprn=100")
.to_return(status: 200, body: uprn_body, headers: {})
end
it "returns the address results" do
get "/address-search?query=100"
expect(response).to have_http_status(:ok)
expect(response.body).to eq([{ text: "1, Test Street", value: "123" }].to_json)
end
end
context "and theres no address returned" do
before do
body = { results: [{ DPA: nil }] }.to_json
uprn_body = { results: [{ DPA: { "ADDRESS": "2, Test Street", UPRN: "321" } }] }.to_json
WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/find?key=OS_DATA_KEY&maxresults=10&minmatch=0.2&query=100")
.to_return(status: 200, body:, headers: {})
WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/uprn?dataset=DPA,LPI&key=OS_DATA_KEY&uprn=100")
.to_return(status: 200, body: uprn_body, headers: {})
end
it "returns the address results" do
get "/address-search?query=100"
expect(response).to have_http_status(:ok)
expect(response.body).to eq([{ text: "2, Test Street", value: "321" }].to_json)
end
end
end
end
end

4
spec/requests/check_errors_controller_spec.rb

@ -295,7 +295,7 @@ RSpec.describe CheckErrorsController, type: :request do
it "displays correct clear links" do
expect(page).to have_content("Make sure these answers are correct")
expect(page).to have_link(lettings_log.form.get_question("hhmemb", lettings_log).check_answer_prompt, href: "/lettings-logs/#{lettings_log.id}/household-members?referrer=check_answers_new_answer", class: "govuk-link govuk-link--no-visited-state")
expect(page).to have_link("Answer")
expect(page).to have_link("Enter total number of household members")
expect(lettings_log.reload.earnings).to eq(nil)
end
end
@ -350,7 +350,7 @@ RSpec.describe CheckErrorsController, type: :request do
it "displays correct clear links" do
expect(page).to have_content("Make sure these answers are correct")
expect(page).to have_link(sales_log.form.get_question("income1", sales_log).check_answer_prompt, href: "/sales-logs/#{sales_log.id}/buyer-1-income?referrer=check_answers_new_answer", class: "govuk-link govuk-link--no-visited-state")
expect(page).to have_link("Answer")
expect(page).to have_link("Enter buyer 1’s gross annual income")
expect(sales_log.reload.income1).to eq(nil)
end
end

7
spec/services/bulk_upload/sales/year2024/row_parser_spec.rb

@ -1063,7 +1063,7 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do
end
context "and all key address fields are present" do
let(:attributes) { setup_section_params.merge({ field_22: nil, field_23: "address line 1", field_25: "town or city", field_27: "AA1", field_28: "1AA" }) }
let(:attributes) { setup_section_params.merge({ field_22: nil, field_23: "address line 1", field_25: "town or city", field_27: "AA1", field_28: "1AA", field_29: "E06000023" }) }
context "and an address can be found with a high enough match rating" do
before do
@ -1073,7 +1073,7 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do
it "does not add errors" do
parser.valid?
%i[field_22 field_23 field_24 field_25 field_26 field_27 field_28].each do |field|
%i[field_22 field_23 field_24 field_25 field_26 field_27 field_28 field_29].each do |field|
expect(parser.errors[field]).to be_empty
end
end
@ -1092,7 +1092,7 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do
it "does not add errors" do
parser.valid?
%i[field_22 field_23 field_24 field_25 field_26 field_27 field_28].each do |field|
%i[field_22 field_23 field_24 field_25 field_26 field_27 field_28 field_29].each do |field|
expect(parser.errors[field]).to be_empty
end
end
@ -1103,6 +1103,7 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
expect(parser.log.la).to eq("E06000023")
end
end

7
spec/services/bulk_upload/sales/year2025/row_parser_spec.rb

@ -978,7 +978,7 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do
end
context "and all key address fields are present" do
let(:attributes) { setup_section_params.merge({ field_16: nil, field_17: "address line 1", field_19: "town or city", field_21: "AA1", field_22: "1AA" }) }
let(:attributes) { setup_section_params.merge({ field_16: nil, field_17: "address line 1", field_19: "town or city", field_21: "AA1", field_22: "1AA", field_23: "E06000023" }) }
context "and an address can be found with a high enough match rating" do
before do
@ -988,7 +988,7 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do
it "does not add errors" do
parser.valid?
%i[field_16 field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
%i[field_16 field_17 field_18 field_19 field_20 field_21 field_22 field_23].each do |field|
expect(parser.errors[field]).to be_empty
end
end
@ -1007,7 +1007,7 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do
it "does not add errors" do
parser.valid?
%i[field_16 field_17 field_18 field_19 field_20 field_21 field_22].each do |field|
%i[field_16 field_17 field_18 field_19 field_20 field_21 field_22 field_23].each do |field|
expect(parser.errors[field]).to be_empty
end
end
@ -1018,6 +1018,7 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do
expect(parser.log.address_line1).to eq("address line 1")
expect(parser.log.town_or_city).to eq("town or city")
expect(parser.log.postcode_full).to eq("AA1 1AA")
expect(parser.log.la).to eq("E06000023")
end
end

Loading…
Cancel
Save